From aa0da02c7b9eb2e2453d53a7df67aaaed7bdb884 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Thu, 30 May 2024 19:02:02 +0530 Subject: [PATCH 01/18] Add key management module --- .gitignore | 7 + .yarnrc.yml | 1 + packages/auto-id/examples/eg_1.ts | 15 + packages/auto-id/package.json | 4 +- packages/auto-id/src/keyManagement.ts | 94 ++ packages/auto-id/tsconfig.json | 19 +- yarn.lock | 1638 +++++++++++++++---------- 7 files changed, 1093 insertions(+), 685 deletions(-) create mode 100644 .yarnrc.yml create mode 100644 packages/auto-id/examples/eg_1.ts create mode 100644 packages/auto-id/src/keyManagement.ts diff --git a/.gitignore b/.gitignore index dac3ccfb..d8e5015f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ Thumbs.db *.temp # IDE/editor files +.vscode/ .idea/ *.swp *.swo @@ -33,3 +34,9 @@ tsconfig.tsbuildinfo # Environment variables .env + +# ignore private key certs +*.pem + +# ignore .yarn +.yarn/ \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 00000000..3186f3f0 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/packages/auto-id/examples/eg_1.ts b/packages/auto-id/examples/eg_1.ts new file mode 100644 index 00000000..85bb86d9 --- /dev/null +++ b/packages/auto-id/examples/eg_1.ts @@ -0,0 +1,15 @@ +import { + generateRsaKeyPair, + saveKey, + loadPrivateKey, +} from "../src/keyManagement"; + +// Example usage: +const [privateKey, publicKey] = generateRsaKeyPair(); +saveKey(Buffer.from(privateKey), "./privateKey.pem"); +const loadedPrivateKey = loadPrivateKey("./privateKey.pem"); +console.log( + `Private keys match: ${ + loadedPrivateKey.toString() === privateKey.toString() + }` +); diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index e95f33c4..94b23e88 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -3,9 +3,11 @@ "version": "0.1.0", "main": "dist/index.js", "scripts": { - "build": "tsc" + "build": "tsc", + "eg-1": "node dist/examples/eg_1.js" }, "devDependencies": { + "@types/node": "^20.12.12", "typescript": "^5.4.5" } } diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts new file mode 100644 index 00000000..51f009a9 --- /dev/null +++ b/packages/auto-id/src/keyManagement.ts @@ -0,0 +1,94 @@ +import { + createCipheriv, + createDecipheriv, + generateKeyPairSync, + privateDecrypt, + publicEncrypt, + randomBytes, +} from 'crypto' +import { readFileSync, writeFileSync } from 'fs' + +/** + * Generates an RSA key pair. + * @param keySize The size of the key in bits. Default is 2048. + * @returns A tuple containing the the RSA private key and public key. + */ +export function generateRsaKeyPair(keySize: number = 2048): [String, String] { + const { publicKey, privateKey } = generateKeyPairSync('rsa', { + modulusLength: keySize, + publicKeyEncoding: { type: 'spki', format: 'pem' }, + privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, + }) + + console.log(privateKey) + console.log(publicKey) + + return [privateKey, publicKey] +} + +/** + * Generates an Ed25519 key pair. + * @returns A tuple containing the private and public keys as buffers. + */ +export function generateEd25519KeyPair(): [Buffer, Buffer] { + const { publicKey, privateKey } = generateKeyPairSync('ed25519', { + publicKeyEncoding: { type: 'spki', format: 'pem' }, + privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, + }) + + return [Buffer.from(privateKey), Buffer.from(publicKey)] +} + +/** + * Saves a key to a file. + * @param key The key to save as a buffer. + * @param filePath The path of the file to save the key to. + * @param password Optional password to encrypt the key. If provided, the key will be encrypted using AES-256-CBC. + */ +export function saveKey(key: Buffer, filePath: string, password?: string): void { + if (password) { + const cipher = createCipheriv('aes-256-cbc', Buffer.from(password.padEnd(32)), randomBytes(16)) + const encrypted = Buffer.concat([cipher.update(key), cipher.final()]) + writeFileSync(filePath, encrypted) + } else { + writeFileSync(filePath, key) + } +} + +/** + * Loads a private key from a file. + * @param filePath The path of the file to load the private key from. + * @param password Optional password to decrypt the key. If provided, the key will be decrypted using AES-256-CBC. + * @returns The loaded private key as a buffer. + */ +export function loadPrivateKey(filePath: string, password?: string): Buffer { + const key = readFileSync(filePath) + if (password) { + const decipher = createDecipheriv( + 'aes-256-cbc', + Buffer.from(password.padEnd(32)), + randomBytes(16), + ) + return Buffer.concat([decipher.update(key), decipher.final()]) + } + return key +} + +/** + * Loads a public key from a file. + * @param filePath The path of the file to load the public key from. + * @returns The loaded public key as a buffer. + */ +export function loadPublicKey(filePath: string): Buffer { + return readFileSync(filePath) +} + +/** + * Checks if two public keys match. + * @param publicKey1 The first public key as a buffer. + * @param publicKey2 The second public key as a buffer. + * @returns True if the public keys match, false otherwise. + */ +export function doPublicKeysMatch(publicKey1: Buffer, publicKey2: Buffer): boolean { + return publicKey1.toString() === publicKey2.toString() +} diff --git a/packages/auto-id/tsconfig.json b/packages/auto-id/tsconfig.json index 1a123464..244cf59b 100644 --- a/packages/auto-id/tsconfig.json +++ b/packages/auto-id/tsconfig.json @@ -1,10 +1,11 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - - } - \ No newline at end of file + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./" + }, + "include": [ + "src/**/*", + "examples/**/*" + ], +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 69d969bb..b19fd8c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,675 +1,963 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.1, debug@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@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.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@^5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@autonomys/auto-consensus@workspace:packages/auto-consensus": + version: 0.0.0-use.local + resolution: "@autonomys/auto-consensus@workspace:packages/auto-consensus" + dependencies: + typescript: "npm:^5.4.5" + languageName: unknown + linkType: soft + +"@autonomys/auto-id@workspace:packages/auto-id": + version: 0.0.0-use.local + resolution: "@autonomys/auto-id@workspace:packages/auto-id" + dependencies: + "@types/node": "npm:^20.12.12" + typescript: "npm:^5.4.5" + languageName: unknown + linkType: soft + +"@autonomys/auto-sdk@workspace:.": + version: 0.0.0-use.local + resolution: "@autonomys/auto-sdk@workspace:." + dependencies: + eslint: "npm:^8.57.0" + prettier: "npm:^3.2.5" + typescript: "npm:^5.4.5" + languageName: unknown + linkType: soft + +"@autonomys/auto-utils@workspace:packages/auto-utils": + version: 0.0.0-use.local + resolution: "@autonomys/auto-utils@workspace:packages/auto-utils" + dependencies: + typescript: "npm:^5.4.5" + languageName: unknown + linkType: soft + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.14": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@types/node@npm:^20.12.12": + version: 20.12.13 + resolution: "@types/node@npm:20.12.13" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/2ac92bb631dbddfb560eb3ba4eedbb1c688044a0130bc1ef032f5c0f20148ac7c9aa3c5aaa5a9787b6c4c6299847d754b96ee8c9def951481ba6628c46b683f5 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"debug@npm:^4.3.1, debug@npm:^4.3.2": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier@npm:^3.2.5": + version: 3.2.5 + resolution: "prettier@npm:3.2.5" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/ea327f37a7d46f2324a34ad35292af2ad4c4c3c3355da07313339d7e554320f66f65f91e856add8530157a733c6c4a897dc41b577056be5c24c40f739f5ee8c6 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.4.5#optional!builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From 5e0641d19ef4bb7379754f7743a14f552eb0f862 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Sat, 1 Jun 2024 01:01:59 +0530 Subject: [PATCH 02/18] Add tests along with keyToPem function with examples --- package.json | 3 +- packages/auto-id/examples/eg1.ts | 14 + packages/auto-id/examples/eg2.ts | 14 + packages/auto-id/examples/eg3.ts | 23 + packages/auto-id/examples/eg4.ts | 23 + packages/auto-id/examples/eg_1.ts | 15 - packages/auto-id/jest.config.ts | 3 + packages/auto-id/package.json | 13 +- packages/auto-id/src/keyManagement.ts | 78 +- packages/auto-id/tests/keyManagement.test.ts | 14 + packages/auto-id/tsconfig.json | 3 +- yarn.lock | 4081 ++++++++++++++++-- 12 files changed, 3900 insertions(+), 384 deletions(-) create mode 100644 packages/auto-id/examples/eg1.ts create mode 100644 packages/auto-id/examples/eg2.ts create mode 100644 packages/auto-id/examples/eg3.ts create mode 100644 packages/auto-id/examples/eg4.ts delete mode 100644 packages/auto-id/examples/eg_1.ts create mode 100644 packages/auto-id/jest.config.ts create mode 100644 packages/auto-id/tests/keyManagement.test.ts diff --git a/package.json b/package.json index 87830f7c..4d8b32dd 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ ], "scripts": { "build": "yarn workspaces run build", + "clean": "rm -rf dist", "test": "yarn workspaces run test" }, "devDependencies": { @@ -15,4 +16,4 @@ "prettier": "^3.2.5", "typescript": "^5.4.5" } -} +} \ No newline at end of file diff --git a/packages/auto-id/examples/eg1.ts b/packages/auto-id/examples/eg1.ts new file mode 100644 index 00000000..d40d3b20 --- /dev/null +++ b/packages/auto-id/examples/eg1.ts @@ -0,0 +1,14 @@ +/* + RSA key pair generation and saving/loading example +*/ + +import { generateRsaKeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' + +// Example usage: +const [privateKey, publicKey] = generateRsaKeyPair() +console.log(`Private key: ${privateKey}`) +console.log(`Public key: ${publicKey}`) + +saveKey(Buffer.from(privateKey), './privateKey.pem') +const loadedPrivateKey = loadPrivateKey('./privateKey.pem') +console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) diff --git a/packages/auto-id/examples/eg2.ts b/packages/auto-id/examples/eg2.ts new file mode 100644 index 00000000..8920b6cc --- /dev/null +++ b/packages/auto-id/examples/eg2.ts @@ -0,0 +1,14 @@ +/* + Ed25519 key pair generation and saving/loading example +*/ + +import { generateEd25519KeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' + +// Example usage: +const [privateKey, publicKey] = generateEd25519KeyPair() +console.log(`Private key: ${privateKey}`) +console.log(`Public key: ${publicKey}`) + +saveKey(Buffer.from(privateKey), './privateKey.pem') +const loadedPrivateKey = loadPrivateKey('./privateKey.pem') +console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) diff --git a/packages/auto-id/examples/eg3.ts b/packages/auto-id/examples/eg3.ts new file mode 100644 index 00000000..39ccad80 --- /dev/null +++ b/packages/auto-id/examples/eg3.ts @@ -0,0 +1,23 @@ +/* + This example demonstrates how to generate a RSA key pair and export it as PEM format. + The private key can be exported with or without password. +*/ + +import { createPrivateKey, createPublicKey } from 'crypto' +import { generateRsaKeyPair, keyToPem } from '../src/keyManagement' + +const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() +console.log(`Private key: ${privateKeyRsa}`) +console.log(`Public key: ${publicKeyRsa}`) +console.log(`========================`) + +const privateKey2 = createPrivateKey({ + key: privateKeyRsa, + format: 'pem', // Input can still be PEM +}) + +const publicKey2 = createPublicKey(privateKeyRsa) + +console.log(keyToPem(privateKey2)) // Export without password +console.log(keyToPem(privateKey2, 'subspace')) // Export with password +console.log(keyToPem(publicKey2)) // Export public key diff --git a/packages/auto-id/examples/eg4.ts b/packages/auto-id/examples/eg4.ts new file mode 100644 index 00000000..ce1d142e --- /dev/null +++ b/packages/auto-id/examples/eg4.ts @@ -0,0 +1,23 @@ +/* + This example demonstrates how to generate a Ed25519 key pair and export it as PEM format. + The private key can be exported with or without password. +*/ + +import { createPrivateKey, createPublicKey } from 'crypto' +import { generateEd25519KeyPair, keyToPem } from '../src/keyManagement' + +const [privateKeyEd25519, publicKeyEd25519] = generateEd25519KeyPair() +console.log(`Private key: ${privateKeyEd25519}`) +console.log(`Public key: ${publicKeyEd25519}`) +console.log(`========================`) + +const privateKey2 = createPrivateKey({ + key: privateKeyEd25519, + format: 'pem', // Input can still be PEM +}) + +const publicKey2 = createPublicKey(privateKeyEd25519) + +console.log(keyToPem(privateKey2)) // Export without password +console.log(keyToPem(privateKey2, 'subspace')) // Export with password +console.log(keyToPem(publicKey2)) // Export public key diff --git a/packages/auto-id/examples/eg_1.ts b/packages/auto-id/examples/eg_1.ts deleted file mode 100644 index 85bb86d9..00000000 --- a/packages/auto-id/examples/eg_1.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - generateRsaKeyPair, - saveKey, - loadPrivateKey, -} from "../src/keyManagement"; - -// Example usage: -const [privateKey, publicKey] = generateRsaKeyPair(); -saveKey(Buffer.from(privateKey), "./privateKey.pem"); -const loadedPrivateKey = loadPrivateKey("./privateKey.pem"); -console.log( - `Private keys match: ${ - loadedPrivateKey.toString() === privateKey.toString() - }` -); diff --git a/packages/auto-id/jest.config.ts b/packages/auto-id/jest.config.ts new file mode 100644 index 00000000..650c513d --- /dev/null +++ b/packages/auto-id/jest.config.ts @@ -0,0 +1,3 @@ +module.exports = { + preset: 'ts-jest', +} diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index 94b23e88..9deb9760 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -4,10 +4,19 @@ "main": "dist/index.js", "scripts": { "build": "tsc", - "eg-1": "node dist/examples/eg_1.js" + "clean": "rm -rf dist", + "eg-1": "tsc && node dist/examples/eg1.js", + "eg-2": "tsc && node dist/examples/eg2.js", + "eg-3": "tsc && node dist/examples/eg3.js", + "eg-4": "tsc && node dist/examples/eg4.js", + "format": "prettier --write \"src/**/*.ts\"", + "test": "jest" }, "devDependencies": { "@types/node": "^20.12.12", + "jest": "^29.7.0", + "ts-jest": "^29.1.4", + "ts-node": "^10.9.2", "typescript": "^5.4.5" } -} +} \ No newline at end of file diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index 51f009a9..ff4e2ee9 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,9 +1,8 @@ import { + KeyObject, createCipheriv, createDecipheriv, generateKeyPairSync, - privateDecrypt, - publicEncrypt, randomBytes, } from 'crypto' import { readFileSync, writeFileSync } from 'fs' @@ -13,30 +12,91 @@ import { readFileSync, writeFileSync } from 'fs' * @param keySize The size of the key in bits. Default is 2048. * @returns A tuple containing the the RSA private key and public key. */ -export function generateRsaKeyPair(keySize: number = 2048): [String, String] { +export function generateRsaKeyPair(keySize: number = 2048): [string, string] { const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: keySize, + publicExponent: 65537, + // TODO: Need to select the correct type - `"pkcs1" | "spki"` publicKeyEncoding: { type: 'spki', format: 'pem' }, + // TODO: Need to select the correct type - `"pkcs1" | "pkcs8"` privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, }) - console.log(privateKey) - console.log(publicKey) - return [privateKey, publicKey] } /** * Generates an Ed25519 key pair. - * @returns A tuple containing the private and public keys as buffers. + * @returns A tuple containing the Ed25519 private key and public key. */ -export function generateEd25519KeyPair(): [Buffer, Buffer] { +export function generateEd25519KeyPair(): [string, string] { const { publicKey, privateKey } = generateKeyPairSync('ed25519', { publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, }) - return [Buffer.from(privateKey), Buffer.from(publicKey)] + return [privateKey, publicKey] +} + +/** + * Converts a cryptographic key object into a PEM formatted string. + * This function can handle both private and public key objects. + * For private keys, it supports optional encryption using a passphrase. + * + * @param key The cryptographic key object to be exported. It must be either a private or public key object. + * @param password Optional passphrase for encrypting the private key. If provided, the private key + * will be exported in an encrypted form using AES-256-CBC cipher. This parameter is ignored + * for public keys. + * + * @returns Returns the PEM formatted string of the key. If a private key is provided with a passphrase, + * it returns the key in an encrypted format. Otherwise, it returns an unencrypted PEM. + * + * @throws Will throw an error if the provided `key` is neither a private nor a public key object. + * + * @example + * // Create a private key object (assuming you have the appropriate private key data) + * const privateKey = createPrivateKey({ + * key: '-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANB ...', + * format: 'pem' + * }); + * + * // Create a public key object from the private key + * const publicKey = createPublicKey(privateKey); + * + * // Export the private key without encryption + * console.log(keyToPem(privateKey)); + * + * // Export the private key with encryption + * console.log(keyToPem(privateKey, 'your-secure-password')); + * + * // Export the public key + * console.log(keyToPem(publicKey)); + */ +export function keyToPem(key: KeyObject, password?: string): string { + if (key.asymmetricKeyType) { + // Handle private key + if (key.type === 'private') { + const options: any = { + type: 'pkcs8' as 'pkcs8', // type for private keys + format: 'pem' as 'pem', // Output format set to 'pem' + } + // If a password is provided, apply encryption + if (password) { + options.cipher = 'aes-256-cbc' // Cipher type + options.passphrase = password // Passphrase as a string + } + return key.export(options) as string + } + // Handle public key + else if (key.type === 'public') { + const options = { + type: 'spki' as 'spki', // type for public keys + format: 'pem' as 'pem', // Output format set to 'pem' + } + return key.export(options) as string + } + } + throw new Error('Invalid key type. Key must be a private or public key object.') } /** diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts new file mode 100644 index 00000000..9299b7c7 --- /dev/null +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -0,0 +1,14 @@ +import { expect, test } from '@jest/globals' +import { generateEd25519KeyPair, generateRsaKeyPair } from '../src/keyManagement' + +test('generate RSA key pair', () => { + const [privateKey, publicKey] = generateRsaKeyPair() + expect(privateKey).toStrictEqual(expect.any(String)) + expect(publicKey).toStrictEqual(expect.any(String)) +}) + +test('generate Ed25519 key pair', () => { + const [privateKey, publicKey] = generateEd25519KeyPair() + expect(privateKey).toStrictEqual(expect.any(String)) + expect(publicKey).toStrictEqual(expect.any(String)) +}) diff --git a/packages/auto-id/tsconfig.json b/packages/auto-id/tsconfig.json index 244cf59b..fbc0d094 100644 --- a/packages/auto-id/tsconfig.json +++ b/packages/auto-id/tsconfig.json @@ -6,6 +6,7 @@ }, "include": [ "src/**/*", - "examples/**/*" + "examples/**/*", + "tests/**/*", ], } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b19fd8c7..ee7a87ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,16 @@ __metadata: version: 8 cacheKey: 10c0 +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + "@autonomys/auto-consensus@workspace:packages/auto-consensus": version: 0.0.0-use.local resolution: "@autonomys/auto-consensus@workspace:packages/auto-consensus" @@ -18,6 +28,9 @@ __metadata: resolution: "@autonomys/auto-id@workspace:packages/auto-id" dependencies: "@types/node": "npm:^20.12.12" + jest: "npm:^29.7.0" + ts-jest: "npm:^29.1.4" + ts-node: "npm:^10.9.2" typescript: "npm:^5.4.5" languageName: unknown linkType: soft @@ -40,568 +53,2878 @@ __metadata: languageName: unknown linkType: soft -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/code-frame@npm:7.24.6" dependencies: - eslint-visitor-keys: "npm:^3.3.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + "@babel/highlight": "npm:^7.24.6" + picocolors: "npm:^1.0.0" + checksum: 10c0/c93c6d1763530f415218c31d07359364397f19b70026abdff766164c21ed352a931cf07f3102c5fb9e04792de319e332d68bcb1f7debef601a02197f90f9ba24 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 +"@babel/compat-data@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/compat-data@npm:7.24.6" + checksum: 10c0/f50abbd4008eb2a5d12139c578809cebbeaeb8e660fb12d546eb2e7c2108ae1836ab8339184a5f5ce0e95bf81bb91e18edce86b387c59db937b01693ec0bc774 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.24.6 + resolution: "@babel/core@npm:7.24.6" dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.6" + "@babel/generator": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helpers": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" + "@babel/traverse": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/e0762a8daef7f417494d555929418cfacd6848c7fc3310ec00e6dd8cecac20b7f590e760bfc9365d2af07874a3f5599832f9c9ff7f1a9d126a168f77ba67945a languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 +"@babel/generator@npm:^7.24.6, @babel/generator@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/generator@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/8d71a17b386536582354afba53cc784396458a88cc9f05f0c6de0ec99475f6f539943b3566b2e733820c4928236952473831765e483c25d68cc007a6e604d782 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@babel/helper-compilation-targets@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-compilation-targets@npm:7.24.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + "@babel/compat-data": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + browserslist: "npm:^4.22.2" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/4d41150086959f5f4d72d27bae29204192e943537ecb71df1711d1f5d8791358a44f3a5882ed3c8238ba0c874b0b55213af43767e14771765f13b8d15b262432 languageName: node linkType: hard -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 +"@babel/helper-environment-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-environment-visitor@npm:7.24.6" + checksum: 10c0/fdcd18ac505ed71f40c05cc992b648a4495b0aa5310a774492a0f74d8dcf3579691102f516561a651d3de6c3a44fe64bfb3049d11c14c5857634ef1823ea409a languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c +"@babel/helper-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-function-name@npm:7.24.6" + dependencies: + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/5ba2f8db789b3f5a2b2239300a217aa212e303cd7bfad9c8b90563807f49215e8c679e8f8f177b6aaca2038038e29bc702b83839e1f7b4896d79c44a75cac97a languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@babel/helper-hoist-variables@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-hoist-variables@npm:7.24.6" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e10ec6b864aaa419ec4934f5fcb5d0cfcc9d0657584a1b6c3c42ada949d44ca6bffcdab433a90ada4396c747e551cca31ba0e565ea005ab3f50964e3817bf6cf languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d +"@babel/helper-module-imports@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-imports@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e0db3fbfcd963d138f0792ff626f940a576fcf212d02b8fe6478dccf3421bd1c2a76f8e69c7450c049985e7b63b30be309a24eeeb6ad7c2137a31b676a095a84 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@babel/helper-module-transforms@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-transforms@npm:7.24.6" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-simple-access": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9e2e3d0ddb397b36b9e8c7d94e175a36be8cb888ef370cefef2cdfd53ae1f87d567b268bd90ed9a6c706485a8de3da19cac577657613e9cd17210b91cbdfb00b languageName: node linkType: hard -"@types/node@npm:^20.12.12": - version: 20.12.13 - resolution: "@types/node@npm:20.12.13" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/2ac92bb631dbddfb560eb3ba4eedbb1c688044a0130bc1ef032f5c0f20148ac7c9aa3c5aaa5a9787b6c4c6299847d754b96ee8c9def951481ba6628c46b683f5 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.24.6 + resolution: "@babel/helper-plugin-utils@npm:7.24.6" + checksum: 10c0/636d3ce8cabc0621c1f78187e1d95f1087209921fa452f76aad06224ef5dffb3d934946f5183109920f32a4b94dd75ac91c63bc52813fee639d10cd54d49ba1f languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d +"@babel/helper-simple-access@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-simple-access@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10c0/b17e404dd6c9787fc7d558aea5222471a77e29596705f0d10b4c2a58b9d71ff7eae915094204848cc1af99b771553caa69337a768b9abdd82b54a0050ba83eb9 languageName: node linkType: hard -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 +"@babel/helper-split-export-declaration@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-split-export-declaration@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10c0/53a5dd8691fdffc89cc7fcf5aed0ad1d8bc39796a5782a3d170dcbf249eb5c15cc8a290e8d09615711d18798ad04a7d0694ab5195d35fa651abbc1b9c885d6a8 languageName: node linkType: hard -"acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" - bin: - acorn: bin/acorn - checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 +"@babel/helper-string-parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-string-parser@npm:7.24.6" + checksum: 10c0/95115bf676e92c4e99166395649108d97447e6cabef1fabaec8cdbc53a43f27b5df2268ff6534439d405bc1bd06685b163eb3b470455bd49f69159dada414145 languageName: node linkType: hard -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 +"@babel/helper-validator-identifier@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-identifier@npm:7.24.6" + checksum: 10c0/d29d2e3fca66c31867a009014169b93f7bc21c8fc1dd7d0b9d85d7a4000670526ff2222d966febb75a6e12f9859a31d1e75b558984e28ecb69651314dd0a6fd1 languageName: node linkType: hard -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 +"@babel/helper-validator-option@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-option@npm:7.24.6" + checksum: 10c0/787268dff5cf77f3b704454b96ab7b58aa4f43b2808247e51859a103a1c28a9c252100f830433f4b37a73f4a61ba745bbeef4cdccbab48c1e9adf037f4ca3491 languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" +"@babel/helpers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helpers@npm:7.24.6" dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e5b5c0919fd6fa56ae11c15a72962d8de0ac19db524849554af28cf08ac32f9ae5aee49a43146eb150f54418cefb8e890fa2b2f33d029434dc7777dbcdfd5bac languageName: node linkType: hard -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e +"@babel/highlight@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/highlight@npm:7.24.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.6" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/5bbc31695e5d44e97feb267f7aaf4c52908560d184ffeb2e2e57aae058d40125592931883889413e19def3326895ddb41ff45e090fa90b459d8c294b4ffc238c languageName: node linkType: hard -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/parser@npm:7.24.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/cbef70923078a20fe163b03f4a6482be65ed99d409a57f3091a23ce3a575ee75716c30e7ea9f40b692ac5660f34055f4cbeb66a354fad15a6cf1fca35c3496c5 languageName: node linkType: hard -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 languageName: node linkType: hard -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde languageName: node linkType: hard -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 languageName: node linkType: hard -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee languageName: node linkType: hard -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f00d783a9e2d52f0a8797823a3cbdbe2d0dc09c7235fe8c88e6dce3a02f234f52fb5e976a001cc30b0e2b330590b5680f54436e56d67f9ab05d1e4bdeb3992cd languageName: node linkType: hard -"cross-spawn@npm:^7.0.2": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b languageName: node linkType: hard -"debug@npm:^4.3.1, debug@npm:^4.3.2": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce languageName: node linkType: hard -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 languageName: node linkType: hard -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f languageName: node linkType: hard -"eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.6" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - bin: - eslint: bin/eslint.js - checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b1eeabf8bebfa78cea559c0a0d55e480fe2ebd799472d1f6bd5afbd2759d02b362d29ad30009c81d5b112797beb987e58a3000d2331adaa4bf03862e1ed18cef languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"@babel/template@npm:^7.24.6, @babel/template@npm:^7.3.3": + version: 7.24.6 + resolution: "@babel/template@npm:7.24.6" dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + "@babel/code-frame": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/a4d5805770de908b445f7cdcebfcb6eaa07b1ec9c7b78fd3f375a911b1522c249bddae6b96bc4aac24247cc603e3e6cffcf2fe50b4c929dfeb22de289b517525 languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"@babel/traverse@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/traverse@npm:7.24.6" + dependencies: + "@babel/code-frame": "npm:^7.24.6" + "@babel/generator": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-hoist-variables": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/39027d5fc7a241c6b71bb5872c2bdcec53743cd7ef3c151bbe6fd7cf874d15f4bc09e5d7e19e2f534b0eb2c115f5368553885fa4253aa1bc9441c6e5bf9efdaf + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/types@npm:7.24.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/1d94d92d97ef49030ad7f9e14cfccfeb70b1706dabcaa69037e659ec9d2c3178fb005d2088cce40d88dfc1306153d9157fe038a79ea2be92e5e6b99a59ef80cc + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.14": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^20.12.12": + version: 20.12.13 + resolution: "@types/node@npm:20.12.13" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/2ac92bb631dbddfb560eb3ba4eedbb1c688044a0130bc1ef032f5c0f20148ac7c9aa3c5aaa5a9787b6c4c6299847d754b96ee8c9def951481ba6628c46b683f5 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.8.3" + "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.22.2": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" + dependencies: + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.0.13" + bin: + browserslist: cli.js + checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10c0/80e89aaaed4b68e3374ce936f2eb097456a0dddbf11f75238dbd53140b1e39259f0d248a5089ed456f1158984f22191c3658d54a713982f676709fbe1a6fa5a0 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.3 + resolution: "cacache@npm:18.0.3" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001625 + resolution: "caniuse-lite@npm:1.0.30001625" + checksum: 10c0/26752c65c775ce24b8cfd39a241a4ce33accf2d2e2982f37827c2f94caac3520a3493419e096c42578d372073a2e9f4359f0122ca4c00e51cb02463c512fc6b3 + languageName: node + linkType: hard + +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 10c0/cd98fbf3c7f4272fb0ebf71d08d0c54bc75ce0e30b9d186114e15b4ba791f3d310af65a339eea2a0318599af2818cdd8886d353b43dfab94468f72987397ad16 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": + version: 4.3.5 + resolution: "debug@npm:4.3.5" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc + languageName: node + linkType: hard + +"debug@npm:^4.3.1, debug@npm:^4.3.2": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.668": + version: 1.4.787 + resolution: "electron-to-chromium@npm:1.4.787" + checksum: 10c0/fa509ca710186461dd53e31773a7b06af3a958ab9b06b2e3d1d64de35204df2ff6f2050c94186adf4b850583666a50d30a6912103a0e3f5bcfc97864712ff424 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" dependencies: estraverse: "npm:^5.1.0" checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 languageName: node linkType: hard -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.1 + resolution: "glob@npm:10.4.1" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/77f2900ed98b9cc2a0e1901ee5e476d664dae3cd0f1b662b8bfd4ccf00d0edc31a11595807706a274ca10e1e251411bbf2e8e976c82bed0d879a9b89343ed379 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": +"is-generator-fn@npm:^2.0.0": version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a languageName: node linkType: hard -"fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.2 + resolution: "istanbul-lib-instrument@npm:6.0.2" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/405c6ac037bf8c7ee7495980b0cd5544b2c53078c10534d0c9ceeb92a9ea7dcf8510f58ccfce31336458a8fa6ccef27b570bbb602abaa8c1650f5496a807477c languageName: node linkType: hard -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 languageName: node linkType: hard -"flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 +"jackspeak@npm:^3.1.2": + version: 3.1.2 + resolution: "jackspeak@npm:3.1.2" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/5f1922a1ca0f19869e23f0dc4374c60d36e922f7926c76fecf8080cc6f7f798d6a9caac1b9428327d14c67731fd551bb3454cb270a5e13a0718f3b3660ec3d5d languageName: node linkType: hard -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b languageName: node linkType: hard -"glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a languageName: node linkType: hard -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 languageName: node linkType: hard -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 languageName: node linkType: hard -"ignore@npm:^5.2.0": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 languageName: node linkType: hard -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 languageName: node linkType: hard -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 languageName: node linkType: hard -"inherits@npm:2": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b languageName: node linkType: hard @@ -616,6 +2939,22 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -623,6 +2962,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -637,6 +2983,15 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + "keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -646,6 +3001,20 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -656,6 +3025,22 @@ __metadata: languageName: node linkType: hard +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -665,6 +3050,13 @@ __metadata: languageName: node linkType: hard +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -672,7 +3064,92 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -681,6 +3158,108 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -695,6 +3274,74 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -704,6 +3351,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -718,7 +3374,16 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -727,6 +3392,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -736,6 +3410,22 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -745,6 +3435,18 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -759,13 +3461,60 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.1.0": +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c languageName: node linkType: hard +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -782,6 +3531,51 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -789,6 +3583,13 @@ __metadata: languageName: node linkType: hard +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -796,6 +3597,29 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^18.0.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -803,6 +3627,53 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 + languageName: node + linkType: hard + +"resolve@npm:^1.20.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -830,6 +3701,31 @@ __metadata: languageName: node linkType: hard +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.6.2 + resolution: "semver@npm:7.6.2" + bin: + semver: bin/semver.js + checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -846,7 +3742,144 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.3 + resolution: "socks-proxy-agent@npm:8.0.3" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -855,6 +3888,29 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -862,6 +3918,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -871,6 +3936,47 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -878,6 +3984,103 @@ __metadata: languageName: node linkType: hard +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-jest@npm:^29.1.4": + version: 29.1.4 + resolution: "ts-jest@npm:29.1.4" + dependencies: + bs-logger: "npm:0.x" + fast-json-stable-stringify: "npm:2.x" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:4.x" + make-error: "npm:1.x" + semver: "npm:^7.5.3" + yargs-parser: "npm:^21.0.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/transform": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 10c0/97def10be26a553e529dfacafe264fa9833d638052bc2b1ebe6301262ae2d3e43954f4d91f2d2d07cf92352cdd4fa163a86f8116a1f6bb8cef7060cddfec794b + languageName: node + linkType: hard + +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -887,6 +4090,13 @@ __metadata: languageName: node linkType: hard +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -894,6 +4104,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + "typescript@npm:^5.4.5": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -921,6 +4138,38 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.16 + resolution: "update-browserslist-db@npm:1.0.16" + dependencies: + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/5995399fc202adbb51567e4810e146cdf7af630a92cc969365a099150cb00597e425cc14987ca7080b09a4d0cfd2a3de53fbe72eebff171aed7f9bb81f9bf405 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -930,6 +4179,33 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/e691ba4dd0dea4a884e52c37dbda30cce6f9eeafe9b26721e449429c6bb0f4b6d1e33fabe7711d0f67f7a34c3bfd56c873f7375bba0b1534e6a2843ce99550e5 + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -941,6 +4217,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -948,6 +4235,28 @@ __metadata: languageName: node linkType: hard +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -955,6 +4264,66 @@ __metadata: languageName: node linkType: hard +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From b87753ee8d8b78333a4100159c57e078aa990a62 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Mon, 3 Jun 2024 18:19:52 +0530 Subject: [PATCH 03/18] Add more functions to auto-id & its arch diagram --- .../auto-id/img/subspace-auto-id-ts-arch.png | Bin 0 -> 133126 bytes packages/auto-id/package.json | 5 +- packages/auto-id/src/index.ts | 4 +- packages/auto-id/src/keyManagement.ts | 58 +++++++-- packages/auto-id/tests/keyManagement.test.ts | 111 ++++++++++++++++-- yarn.lock | 15 ++- 6 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 packages/auto-id/img/subspace-auto-id-ts-arch.png diff --git a/packages/auto-id/img/subspace-auto-id-ts-arch.png b/packages/auto-id/img/subspace-auto-id-ts-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..7b67a55a143559c12c59f5c6ca06910bc9bf890e GIT binary patch literal 133126 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

m!W>p>L-tb``y5kyc%E&!zj$$f4&FxiE_OPDn-j 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 Pzz2f{@2NTU { +// TODO: Complete once all the modules are ready +/* export const helloWorld = () => { console.log('Hello World'); }; + */ diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index ff4e2ee9..b8a50c69 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,11 +1,12 @@ import { KeyObject, - createCipheriv, createDecipheriv, + createPrivateKey, generateKeyPairSync, randomBytes, } from 'crypto' import { readFileSync, writeFileSync } from 'fs' +import { writeFile } from 'fs/promises' /** * Generates an RSA key pair. @@ -54,6 +55,7 @@ export function generateEd25519KeyPair(): [string, string] { * @throws Will throw an error if the provided `key` is neither a private nor a public key object. * * @example + * Follow "../examples/eg3.ts" & "../examples/eg4.ts" for a complete example. * // Create a private key object (assuming you have the appropriate private key data) * const privateKey = createPrivateKey({ * key: '-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANB ...', @@ -100,19 +102,53 @@ export function keyToPem(key: KeyObject, password?: string): string { } /** - * Saves a key to a file. - * @param key The key to save as a buffer. - * @param filePath The path of the file to save the key to. - * @param password Optional password to encrypt the key. If provided, the key will be encrypted using AES-256-CBC. + * Saves a cryptographic key object to a file in PEM format. If it's a private key and a password is provided, + * the key will be encrypted before being written to the file. + * + * @param key The cryptographic key object to be saved. It must be either a private or public key object. + * @param filePath The file system path where the key should be saved. + * @param password Optional password for encrypting the private key. + * + * @example + * // Assuming privateKey is a valid KeyObject + * saveKey(privateKey, './myPrivateKey.pem', 'strongpassword') + * .then(() => console.log('Key saved successfully')) + * .catch(err => console.error('Error saving key:', err)); + */ +export async function saveKey(key: KeyObject, filePath: string, password?: string): Promise { + try { + const pem = keyToPem(key, password) + await writeFile(filePath, pem, 'utf8') // Ensure the encoding is correct for PEM format + } catch (e: any) { + throw new Error(`Failed to save key: ${e.message}`) + } +} + +/** + * Converts a PEM-encoded string to a private key object. If the PEM string is encrypted, + * a password must be provided to decrypt it. + * + * @param pemData The PEM string to convert to a private key. + * @param password Optional password used to decrypt the encrypted PEM string. + * @returns The private key object. + * + * @example + * const pemString = '-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIFDjBABgkqhk ...'; + * const privateKey = pemToPrivateKey(pemString, 'mypassword'); + * console.log(privateKey); */ -export function saveKey(key: Buffer, filePath: string, password?: string): void { +export function pemToPrivateKey(pemData: string, password?: string): KeyObject { + const options: any = { + key: pemData, + format: 'pem' as 'pem', + } + + // Add password to options if it is provided if (password) { - const cipher = createCipheriv('aes-256-cbc', Buffer.from(password.padEnd(32)), randomBytes(16)) - const encrypted = Buffer.concat([cipher.update(key), cipher.final()]) - writeFileSync(filePath, encrypted) - } else { - writeFileSync(filePath, key) + options.passphrase = password } + + return createPrivateKey(options) } /** diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index 9299b7c7..a55beefa 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -1,14 +1,107 @@ import { expect, test } from '@jest/globals' -import { generateEd25519KeyPair, generateRsaKeyPair } from '../src/keyManagement' +import { KeyObject, createPrivateKey, createPublicKey } from 'crypto' +import { + generateEd25519KeyPair, + generateRsaKeyPair, + keyToPem, + pemToPrivateKey, +} from '../src/keyManagement' -test('generate RSA key pair', () => { - const [privateKey, publicKey] = generateRsaKeyPair() - expect(privateKey).toStrictEqual(expect.any(String)) - expect(publicKey).toStrictEqual(expect.any(String)) +describe('Generate keypair for', () => { + test('RSA', () => { + const [privateKey, publicKey] = generateRsaKeyPair() + expect(privateKey).toStrictEqual(expect.any(String)) + expect(publicKey).toStrictEqual(expect.any(String)) + }) + + test('Ed25519', () => { + const [privateKey, publicKey] = generateEd25519KeyPair() + expect(privateKey).toStrictEqual(expect.any(String)) + expect(publicKey).toStrictEqual(expect.any(String)) + }) +}) + +describe('Private/Public key to PEM with/without password for', () => { + let privateKey: string, publicKey: string + + test('RSA', () => { + ;[privateKey, publicKey] = generateRsaKeyPair() + }) + + test('Ed25519', () => { + ;[privateKey, publicKey] = generateEd25519KeyPair() + }) + + afterEach(() => { + const privateKeyObject = createPrivateKey({ + key: privateKey, + format: 'pem', // Input can still be PEM + }) + const publicKeyKeyObject = createPublicKey(privateKeyObject) + + expect(keyToPem(privateKeyObject)).toStrictEqual(privateKey) + expect(keyToPem(privateKeyObject, 'subspace')).not.toEqual(privateKey) // unequal because of password encryption + expect(keyToPem(publicKeyKeyObject)).toStrictEqual(publicKey) + }) }) -test('generate Ed25519 key pair', () => { - const [privateKey, publicKey] = generateEd25519KeyPair() - expect(privateKey).toStrictEqual(expect.any(String)) - expect(publicKey).toStrictEqual(expect.any(String)) +describe('PEM to Private/Public key for RSA', () => { + let privateKeyObject: KeyObject + let originalPem: string + + beforeEach(() => { + const [privateKey, publicKey] = generateRsaKeyPair() + expect(privateKey).toStrictEqual(expect.any(String)) + expect(publicKey).toStrictEqual(expect.any(String)) + + privateKeyObject = createPrivateKey({ + key: privateKey, + format: 'pem', // Input can still be PEM + }) + + const publicKeyObject = createPublicKey(privateKeyObject) + // Export both original and derived keys back to PEM and compare those + originalPem = privateKeyObject.export({ type: 'pkcs8', format: 'pem' }) as string + }) + + test('without any password', () => { + // Convert the privateKeyObject back to PEM ensure consistent serialization + // And then convert it back to a private key object + const privateKeyFromPem = pemToPrivateKey(keyToPem(privateKeyObject)) + + const derivedPem = privateKeyFromPem.export({ type: 'pkcs8', format: 'pem' }) as string + + expect(derivedPem).toStrictEqual(originalPem) + }) + + test('with password in 1/2 function', () => { + // Convert the privateKeyObject back to PEM ensure consistent serialization + // And then convert it back to a private key object with password + const privateKeyFromPemPassword1 = pemToPrivateKey(keyToPem(privateKeyObject), 'subspace') + + // Export both original and derived keys back to PEM and compare those + const derivedPemPassword = privateKeyFromPemPassword1.export({ + type: 'pkcs8', + format: 'pem', + }) as string + + expect(derivedPemPassword).toStrictEqual(originalPem) + }) + + test('with password in 2/2 functions', () => { + // Convert the privateKeyObject back to PEM with password ensure consistent serialization + // And then convert it back to a private key object with password + const privateKeyFromPemPassword2 = pemToPrivateKey( + keyToPem(privateKeyObject, 'subspace'), + 'subspace', + ) + + // Export both original and derived keys back to PEM and compare those + const derivedPemPassword = privateKeyFromPemPassword2.export({ + type: 'pkcs8', + format: 'pem', + }) as string + + expect(derivedPemPassword).toStrictEqual(originalPem) + }) }) diff --git a/yarn.lock b/yarn.lock index ee7a87ba..b3b3a33b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,6 +27,7 @@ __metadata: version: 0.0.0-use.local resolution: "@autonomys/auto-id@workspace:packages/auto-id" dependencies: + "@types/jest": "npm:^29.5.12" "@types/node": "npm:^20.12.12" jest: "npm:^29.7.0" ts-jest: "npm:^29.1.4" @@ -1022,6 +1023,16 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:^29.5.12": + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10c0/25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:^20.12.12": version: 20.12.13 resolution: "@types/node@npm:20.12.13" @@ -1889,7 +1900,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.7.0": +"expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -3531,7 +3542,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.7.0": +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: From c6282db865dbdd8e42507a2e97987ae50a516ea7 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Mon, 3 Jun 2024 20:28:09 +0530 Subject: [PATCH 04/18] Add new functions & organize tests removing redundant code snippets --- packages/auto-id/src/keyManagement.ts | 162 +++++++++++++++---- packages/auto-id/tests/keyManagement.test.ts | 126 ++++++++------- 2 files changed, 199 insertions(+), 89 deletions(-) diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index b8a50c69..e33464de 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,11 +1,5 @@ -import { - KeyObject, - createDecipheriv, - createPrivateKey, - generateKeyPairSync, - randomBytes, -} from 'crypto' -import { readFileSync, writeFileSync } from 'fs' +import { KeyObject, createPrivateKey, createPublicKey, generateKeyPairSync } from 'crypto' +import { promises as fs } from 'fs' import { writeFile } from 'fs/promises' /** @@ -152,39 +146,145 @@ export function pemToPrivateKey(pemData: string, password?: string): KeyObject { } /** - * Loads a private key from a file. - * @param filePath The path of the file to load the private key from. - * @param password Optional password to decrypt the key. If provided, the key will be decrypted using AES-256-CBC. - * @returns The loaded private key as a buffer. + * Loads a private key from a file. If the file is encrypted, a password must be provided. + * + * @param filePath Path to the private key file. + * @param password Optional password used to decrypt the encrypted key file. + * @returns The private key object. + * + * @example + * async function main() { + * try { + * const privateKey = await loadPrivateKey('./path/to/private/key.pem', 'optional-password'); + * console.log('Private Key:', privateKey); + * } catch (error) { + * console.error('Error loading private key:', error); + * } + * } + * + * main(); */ -export function loadPrivateKey(filePath: string, password?: string): Buffer { - const key = readFileSync(filePath) - if (password) { - const decipher = createDecipheriv( - 'aes-256-cbc', - Buffer.from(password.padEnd(32)), - randomBytes(16), - ) - return Buffer.concat([decipher.update(key), decipher.final()]) +async function loadPrivateKey(filePath: string, password?: string): Promise { + try { + const keyData = await fs.readFile(filePath) + const privateKey = pemToPrivateKey(keyData.toString(), password) + return privateKey + } catch (error: any) { + throw new Error(`Failed to load private key: ${error.message}`) } - return key +} + +/** + * Converts a PEM-encoded string to a public key object. + * + * @param pemData The PEM string to convert to a public key. + * @returns The public key object. + * + * @example + * const pemString = '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...'; + * const publicKey = pemToPublicKey(pemString); + * console.log('Public Key:', publicKey); + */ +function pemToPublicKey(pemData: string): KeyObject { + return createPublicKey({ + key: pemData, + format: 'pem' as 'pem', + }) } /** * Loads a public key from a file. - * @param filePath The path of the file to load the public key from. - * @returns The loaded public key as a buffer. + * + * @param filePath Path to the public key file. + * @returns The public key object. + * + * @example + * async function main() { + * try { + * const publicKey = await loadPublicKey('./path/to/public/key.pem'); + * console.log('Public Key:', publicKey); + * } catch (error) { + * console.error('Error loading public key:', error); + * } + * } + * + * main(); */ -export function loadPublicKey(filePath: string): Buffer { - return readFileSync(filePath) +async function loadPublicKey(filePath: string): Promise { + try { + const keyData = await fs.readFile(filePath) + const publicKey = pemToPublicKey(keyData.toString()) + return publicKey + } catch (error: any) { + throw new Error(`Failed to load public key: ${error.message}`) + } +} + +/** + * Converts a private or public key to a hex string representation. + * + * @param key The key to convert (either a private or public key). + * @returns The hex string representation of the key. + * + * @example + * const keyHex = keyToHex(privateKeyObject); // privateKeyObject should be a valid KeyObject + * console.log('Key Hex:', keyHex); + */ +function keyToHex(key: KeyObject): string { + let keyData: Buffer + + // Check the type of the key to determine how to handle it + if (key.type === 'private') { + // Convert private key to DER format + keyData = key.export({ + type: 'pkcs8', + format: 'der', + }) + } else if (key.type === 'public') { + // Convert public key to DER format + keyData = key.export({ + type: 'spki', + format: 'der', + }) + } else { + throw new Error('Unsupported key type') + } + + // Convert the binary data to a hexadecimal string + return keyData.toString('hex') } /** * Checks if two public keys match. - * @param publicKey1 The first public key as a buffer. - * @param publicKey2 The second public key as a buffer. - * @returns True if the public keys match, false otherwise. + * + * @param publicKey1 The first public key as a KeyObject. + * @param publicKey2 The second public key as a KeyObject. + * @returns True if the keys match, False otherwise. + * + * @example + * const key1 = createPublicKey({ + * key: publicKeyPem1, + * format: 'pem' + * }); + * const key2 = createPublicKey({ + * key: publicKeyPem2, + * format: 'pem' + * }); + * const match = doPublicKeysMatch(key1, key2); + * console.log('Keys match:', match); */ -export function doPublicKeysMatch(publicKey1: Buffer, publicKey2: Buffer): boolean { - return publicKey1.toString() === publicKey2.toString() +function doPublicKeysMatch(publicKey1: KeyObject, publicKey2: KeyObject): boolean { + // Serialize both public keys to DER format for comparison + const publicKey1Der = publicKey1.export({ + type: 'spki', + format: 'der', + }) + + const publicKey2Der = publicKey2.export({ + type: 'spki', + format: 'der', + }) + + // Compare the serialized public key data + return publicKey1Der.equals(publicKey2Der) } diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index a55beefa..7fe3399b 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -45,63 +45,73 @@ describe('Private/Public key to PEM with/without password for', () => { }) }) -describe('PEM to Private/Public key for RSA', () => { - let privateKeyObject: KeyObject - let originalPem: string - - beforeEach(() => { - const [privateKey, publicKey] = generateRsaKeyPair() - expect(privateKey).toStrictEqual(expect.any(String)) - expect(publicKey).toStrictEqual(expect.any(String)) - - privateKeyObject = createPrivateKey({ - key: privateKey, - format: 'pem', // Input can still be PEM +// TODO: Add code snippet for public key as well intermittently +describe('PEM to Private/Public key for', () => { + const keyGenerators = [ + { name: 'RSA', generator: generateRsaKeyPair }, + { name: 'Ed25519', generator: generateEd25519KeyPair }, + ] + + for (const { name, generator } of keyGenerators) { + describe(`${name}`, () => { + let privateKeyObject: KeyObject + let originalPem: string + + beforeEach(() => { + const [privateKey, publicKey] = generator() + + privateKeyObject = createPrivateKey({ + key: privateKey, + format: 'pem', // Input format is PEM + }) + + const publicKeyObject = createPublicKey(privateKeyObject) + + // Export original key back to PEM for comparison + originalPem = privateKeyObject.export({ type: 'pkcs8', format: 'pem' }) as string + }) + + test('without any password', () => { + // Convert the privateKeyObject back to PEM ensure consistent serialization + // And then convert it back to a private key object + const privateKeyFromPem = pemToPrivateKey(keyToPem(privateKeyObject)) + + // Export derived key back to PEM for comparison + const derivedPem = privateKeyFromPem.export({ type: 'pkcs8', format: 'pem' }) as string + + expect(derivedPem).toStrictEqual(originalPem) + }) + + test('with password in 1/2 function', () => { + // Convert the privateKeyObject back to PEM ensure consistent serialization + // And then convert it back to a private key object with password + const privateKeyFromPemPassword = pemToPrivateKey(keyToPem(privateKeyObject), 'subspace') + + // Export both original and derived keys back to PEM and compare those + const derivedPemPassword = privateKeyFromPemPassword.export({ + type: 'pkcs8', + format: 'pem', + }) as string + + expect(derivedPemPassword).toStrictEqual(originalPem) + }) + + test('with password in 2/2 functions', () => { + // Convert the privateKeyObject back to PEM with password ensure consistent serialization + // And then convert it back to a private key object with password + const privateKeyFromPemPassword = pemToPrivateKey( + keyToPem(privateKeyObject, 'subspace'), + 'subspace', + ) + + // Export both original and derived keys back to PEM and compare those + const derivedPemPassword = privateKeyFromPemPassword.export({ + type: 'pkcs8', + format: 'pem', + }) as string + + expect(derivedPemPassword).toStrictEqual(originalPem) + }) }) - - const publicKeyObject = createPublicKey(privateKeyObject) - // Export both original and derived keys back to PEM and compare those - originalPem = privateKeyObject.export({ type: 'pkcs8', format: 'pem' }) as string - }) - - test('without any password', () => { - // Convert the privateKeyObject back to PEM ensure consistent serialization - // And then convert it back to a private key object - const privateKeyFromPem = pemToPrivateKey(keyToPem(privateKeyObject)) - - const derivedPem = privateKeyFromPem.export({ type: 'pkcs8', format: 'pem' }) as string - - expect(derivedPem).toStrictEqual(originalPem) - }) - - test('with password in 1/2 function', () => { - // Convert the privateKeyObject back to PEM ensure consistent serialization - // And then convert it back to a private key object with password - const privateKeyFromPemPassword1 = pemToPrivateKey(keyToPem(privateKeyObject), 'subspace') - - // Export both original and derived keys back to PEM and compare those - const derivedPemPassword = privateKeyFromPemPassword1.export({ - type: 'pkcs8', - format: 'pem', - }) as string - - expect(derivedPemPassword).toStrictEqual(originalPem) - }) - - test('with password in 2/2 functions', () => { - // Convert the privateKeyObject back to PEM with password ensure consistent serialization - // And then convert it back to a private key object with password - const privateKeyFromPemPassword2 = pemToPrivateKey( - keyToPem(privateKeyObject, 'subspace'), - 'subspace', - ) - - // Export both original and derived keys back to PEM and compare those - const derivedPemPassword = privateKeyFromPemPassword2.export({ - type: 'pkcs8', - format: 'pem', - }) as string - - expect(derivedPemPassword).toStrictEqual(originalPem) - }) + } }) From 8ac9d7b797eb7cd35a560cb227b3f1b52504f25d Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 01:40:42 +0530 Subject: [PATCH 05/18] Add all the functions of key module & also added a few tests --- packages/auto-id/src/keyManagement.ts | 10 +- packages/auto-id/tests/keyManagement.test.ts | 110 ++++++++++++++++--- 2 files changed, 102 insertions(+), 18 deletions(-) diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index e33464de..069c02b5 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -164,7 +164,7 @@ export function pemToPrivateKey(pemData: string, password?: string): KeyObject { * * main(); */ -async function loadPrivateKey(filePath: string, password?: string): Promise { +export async function loadPrivateKey(filePath: string, password?: string): Promise { try { const keyData = await fs.readFile(filePath) const privateKey = pemToPrivateKey(keyData.toString(), password) @@ -185,7 +185,7 @@ async function loadPrivateKey(filePath: string, password?: string): Promise { +export async function loadPublicKey(filePath: string): Promise { try { const keyData = await fs.readFile(filePath) const publicKey = pemToPublicKey(keyData.toString()) @@ -230,7 +230,7 @@ async function loadPublicKey(filePath: string): Promise { * const keyHex = keyToHex(privateKeyObject); // privateKeyObject should be a valid KeyObject * console.log('Key Hex:', keyHex); */ -function keyToHex(key: KeyObject): string { +export function keyToHex(key: KeyObject): string { let keyData: Buffer // Check the type of the key to determine how to handle it @@ -273,7 +273,7 @@ function keyToHex(key: KeyObject): string { * const match = doPublicKeysMatch(key1, key2); * console.log('Keys match:', match); */ -function doPublicKeysMatch(publicKey1: KeyObject, publicKey2: KeyObject): boolean { +export function doPublicKeysMatch(publicKey1: KeyObject, publicKey2: KeyObject): boolean { // Serialize both public keys to DER format for comparison const publicKey1Der = publicKey1.export({ type: 'spki', diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index 7fe3399b..9860147f 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -1,10 +1,13 @@ import { expect, test } from '@jest/globals' import { KeyObject, createPrivateKey, createPublicKey } from 'crypto' import { + doPublicKeysMatch, generateEd25519KeyPair, generateRsaKeyPair, + keyToHex, keyToPem, pemToPrivateKey, + pemToPublicKey, } from '../src/keyManagement' describe('Generate keypair for', () => { @@ -37,15 +40,14 @@ describe('Private/Public key to PEM with/without password for', () => { key: privateKey, format: 'pem', // Input can still be PEM }) - const publicKeyKeyObject = createPublicKey(privateKeyObject) + const publicKeyObject = createPublicKey(privateKeyObject) expect(keyToPem(privateKeyObject)).toStrictEqual(privateKey) expect(keyToPem(privateKeyObject, 'subspace')).not.toEqual(privateKey) // unequal because of password encryption - expect(keyToPem(publicKeyKeyObject)).toStrictEqual(publicKey) + expect(keyToPem(publicKeyObject)).toStrictEqual(publicKey) }) }) -// TODO: Add code snippet for public key as well intermittently describe('PEM to Private/Public key for', () => { const keyGenerators = [ { name: 'RSA', generator: generateRsaKeyPair }, @@ -54,8 +56,8 @@ describe('PEM to Private/Public key for', () => { for (const { name, generator } of keyGenerators) { describe(`${name}`, () => { - let privateKeyObject: KeyObject - let originalPem: string + let privateKeyObject: KeyObject, publicKeyObject: KeyObject + let originalPemPrivKey: string, originalPemPubKey: string beforeEach(() => { const [privateKey, publicKey] = generator() @@ -65,10 +67,11 @@ describe('PEM to Private/Public key for', () => { format: 'pem', // Input format is PEM }) - const publicKeyObject = createPublicKey(privateKeyObject) + publicKeyObject = createPublicKey(privateKeyObject) - // Export original key back to PEM for comparison - originalPem = privateKeyObject.export({ type: 'pkcs8', format: 'pem' }) as string + // Export original private/public keys back to PEM for comparison + originalPemPrivKey = privateKeyObject.export({ type: 'pkcs8', format: 'pem' }) as string + originalPemPubKey = publicKeyObject.export({ type: 'spki', format: 'pem' }) as string }) test('without any password', () => { @@ -77,9 +80,24 @@ describe('PEM to Private/Public key for', () => { const privateKeyFromPem = pemToPrivateKey(keyToPem(privateKeyObject)) // Export derived key back to PEM for comparison - const derivedPem = privateKeyFromPem.export({ type: 'pkcs8', format: 'pem' }) as string + const derivedPemPrivKey = privateKeyFromPem.export({ + type: 'pkcs8', + format: 'pem', + }) as string + + expect(derivedPemPrivKey).toStrictEqual(originalPemPrivKey) + + // Convert the publicKeyObject back to PEM ensure consistent serialization + // And then convert it back to a public key object + const publicKeyFromPem = pemToPublicKey(keyToPem(publicKeyObject)) + + // Export derived key back to PEM for comparison + const derivedPemPubKey = publicKeyFromPem.export({ + type: 'spki', + format: 'pem', + }) as string - expect(derivedPem).toStrictEqual(originalPem) + expect(derivedPemPubKey).toStrictEqual(originalPemPubKey) }) test('with password in 1/2 function', () => { @@ -88,12 +106,12 @@ describe('PEM to Private/Public key for', () => { const privateKeyFromPemPassword = pemToPrivateKey(keyToPem(privateKeyObject), 'subspace') // Export both original and derived keys back to PEM and compare those - const derivedPemPassword = privateKeyFromPemPassword.export({ + const derivedPemPasswordPrivKey = privateKeyFromPemPassword.export({ type: 'pkcs8', format: 'pem', }) as string - expect(derivedPemPassword).toStrictEqual(originalPem) + expect(derivedPemPasswordPrivKey).toStrictEqual(originalPemPrivKey) }) test('with password in 2/2 functions', () => { @@ -110,8 +128,74 @@ describe('PEM to Private/Public key for', () => { format: 'pem', }) as string - expect(derivedPemPassword).toStrictEqual(originalPem) + expect(derivedPemPassword).toStrictEqual(originalPemPrivKey) }) }) } }) + +describe('Private/Public key to hex for', () => { + let privateKey: string, publicKey: string + + test('RSA', () => { + ;[privateKey, publicKey] = generateRsaKeyPair() + }) + + test('Ed25519', () => { + ;[privateKey, publicKey] = generateEd25519KeyPair() + }) + + afterEach(() => { + const privateKeyObject = createPrivateKey({ + key: privateKey, + format: 'pem', // Input can still be PEM + }) + const publicKeyObject = createPublicKey(privateKeyObject) + + expect(keyToHex(privateKeyObject)).toStrictEqual(expect.any(String)) + expect(keyToHex(publicKeyObject)).toStrictEqual(expect.any(String)) + }) +}) + +describe('Do public keys match for', () => { + const keyTypes = [ + { label: 'RSA', keyGenerator: generateRsaKeyPair }, + { label: 'Ed25519', keyGenerator: generateEd25519KeyPair }, + ] + + keyTypes.forEach(({ label, keyGenerator }) => { + describe(`${label}`, () => { + let privateKeyPem1: string, + publicKeyPem1: string, + publicKeyPem2: string, + privateKeyPem3: string, + publicKeyPem3: string + let publicKey1: KeyObject, publicKey2: KeyObject, publicKey3: KeyObject + + beforeEach(() => { + ;[privateKeyPem1, publicKeyPem1] = keyGenerator() + publicKeyPem2 = publicKeyPem1 // The same key to ensure a match + ;[privateKeyPem3, publicKeyPem3] = keyGenerator() + + publicKey1 = createPublicKey({ key: publicKeyPem1, format: 'pem' }) + publicKey2 = createPublicKey({ key: publicKeyPem2, format: 'pem' }) + publicKey3 = createPublicKey({ key: publicKeyPem3, format: 'pem' }) + }) + + test('should return true if two public keys match', () => { + const match = doPublicKeysMatch(publicKey1, publicKey2) + expect(match).toBe(true) + }) + + test('should return false if two public keys do not match', () => { + const noMatch = doPublicKeysMatch(publicKey1, publicKey3) + expect(noMatch).toBe(false) + }) + + test('should handle comparison of the same key object', () => { + const selfMatch = doPublicKeysMatch(publicKey1, publicKey1) + expect(selfMatch).toBe(true) + }) + }) + }) +}) From ff5d538c215ae91766a059dc6cd2b9e8f78514e3 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 18:36:08 +0530 Subject: [PATCH 06/18] Add tests for saveKey function --- packages/auto-id/package.json | 2 +- packages/auto-id/tests/keyManagement.test.ts | 60 ++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index 189a1ac2..25b4c02e 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -22,4 +22,4 @@ "ts-node": "^10.9.2", "typescript": "^5.4.5" } -} +} \ No newline at end of file diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index 9860147f..713d55d9 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -1,5 +1,7 @@ import { expect, test } from '@jest/globals' import { KeyObject, createPrivateKey, createPublicKey } from 'crypto' +import { promises as fs } from 'fs' +import * as path from 'path' import { doPublicKeysMatch, generateEd25519KeyPair, @@ -8,6 +10,7 @@ import { keyToPem, pemToPrivateKey, pemToPublicKey, + saveKey, } from '../src/keyManagement' describe('Generate keypair for', () => { @@ -134,6 +137,63 @@ describe('PEM to Private/Public key for', () => { } }) +describe('saveKey function', () => { + const keyGenerators = [ + { name: 'RSA', generator: generateRsaKeyPair }, + { name: 'Ed25519', generator: generateEd25519KeyPair }, + ] + + for (const { name, generator } of keyGenerators) { + describe(`${name}`, () => { + // Directory for test output + const testDir = path.join(__dirname, 'test_keys') + let privateKey: string + + // Create a directory for test outputs before any tests run + beforeAll(async () => { + await fs.mkdir(testDir, { recursive: true }) + }) + + beforeEach(() => { + ;[privateKey] = generator() + }) + + // Cleanup: remove test directory after all tests + afterAll(async () => { + await fs.rm(testDir, { recursive: true, force: true }) + }) + + test('should save a private key to a file', async () => { + const filePath = path.join(testDir, 'testPrivateKey.pem') + + const privateKeyObject = pemToPrivateKey(privateKey) + + await saveKey(privateKeyObject, filePath) + const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) + + expect(fileContents).toBe(keyToPem(privateKeyObject)) + }) + + test('should save an encrypted private key to a file', async () => { + const filePath = path.join(testDir, 'testEncryptedPrivateKey.pem') + const password = 'testpassword' + + await saveKey(pemToPrivateKey(privateKey), filePath, password) + const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) + + // Check if the file content starts and ends with the expected encrypted private key headers + expect(fileContents.startsWith('-----BEGIN ENCRYPTED PRIVATE KEY-----')).toBe(true) + expect(fileContents.endsWith('-----END ENCRYPTED PRIVATE KEY-----\n')).toBe(true) + }) + test('should throw an error when trying to save to an invalid path', async () => { + const filePath = path.join(testDir, 'non_existent_directory', 'testPrivateKey.pem') + + await expect(saveKey(pemToPrivateKey(privateKey), filePath)).rejects.toThrow() + }) + }) + } +}) + describe('Private/Public key to hex for', () => { let privateKey: string, publicKey: string From 40cd6539a460899368ab484413f8e1c9e37c3a34 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 19:10:07 +0530 Subject: [PATCH 07/18] Add tests for loading private/public keys --- packages/auto-id/tests/keyManagement.test.ts | 73 ++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index 713d55d9..eac07f60 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -8,6 +8,8 @@ import { generateRsaKeyPair, keyToHex, keyToPem, + loadPrivateKey, + loadPublicKey, pemToPrivateKey, pemToPublicKey, saveKey, @@ -194,6 +196,77 @@ describe('saveKey function', () => { } }) +describe('Key loading functions', () => { + const keyGenerators = [ + { name: 'RSA', generator: generateRsaKeyPair }, + { name: 'Ed25519', generator: generateEd25519KeyPair }, + ] + + for (const { name, generator } of keyGenerators) { + describe(`${name}`, () => { + const testDir = path.join(__dirname, 'test_keys') + + // Directory setup for test keys + beforeAll(async () => { + await fs.mkdir(testDir, { recursive: true }) + }) + + afterAll(async () => { + await fs.rm(testDir, { recursive: true, force: true }) + }) + + // Load Private Key Tests + describe('loadPrivateKey', () => { + const [privateKey] = generator() + const filePath = path.join(testDir, 'testPrivateKey.pem') + const password = 'testpassword' + + beforeAll(async () => { + // Saving a regular and an encrypted private key for tests + await saveKey(pemToPrivateKey(privateKey), filePath) + await saveKey(pemToPrivateKey(privateKey), `${filePath}.enc`, password) + }) + + test('should load a private key from a file', async () => { + const loadedPrivateKey = await loadPrivateKey(filePath) + expect(loadedPrivateKey.export({ type: 'pkcs8', format: 'pem' })).toBe(privateKey) + }) + + test('should load an encrypted private key from a file using a password', async () => { + const loadedPrivateKey = await loadPrivateKey(`${filePath}.enc`, password) + expect(loadedPrivateKey.export({ type: 'pkcs8', format: 'pem' })).toBe(privateKey) + }) + + test('should throw an error when the password for encrypted key is wrong', async () => { + await expect(loadPrivateKey(`${filePath}.enc`, 'wrongpassword')).rejects.toThrow() + }) + }) + + // Load Public Key Tests + describe('loadPublicKey', () => { + const [_, publicKey] = generator() + const filePath = path.join(testDir, 'testPublicKey.pem') + + beforeAll(async () => { + // Saving a public key for test + await saveKey(pemToPublicKey(publicKey), filePath) + }) + + test('should load a public key from a file', async () => { + const loadedPublicKey = await loadPublicKey(filePath) + expect(loadedPublicKey.export({ type: 'spki', format: 'pem' })).toBe(publicKey) + }) + + test('should throw an error when file does not exist', async () => { + await expect( + loadPublicKey(path.join(testDir, 'nonexistentPublicKey.pem')), + ).rejects.toThrow() + }) + }) + }) + } +}) + describe('Private/Public key to hex for', () => { let privateKey: string, publicKey: string From c2a154e0349e43f86f1b2c5f586dc0353b83d075 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 19:18:04 +0530 Subject: [PATCH 08/18] Add some examples for showing usage of functions of key management modules --- packages/auto-id/examples/eg1.ts | 12 ++++------ packages/auto-id/examples/eg2.ts | 6 +---- packages/auto-id/examples/eg3.ts | 8 +++---- packages/auto-id/examples/eg5.ts | 38 ++++++++++++++++++++++++++++++++ packages/auto-id/examples/eg6.ts | 35 +++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 17 deletions(-) create mode 100644 packages/auto-id/examples/eg5.ts create mode 100644 packages/auto-id/examples/eg6.ts diff --git a/packages/auto-id/examples/eg1.ts b/packages/auto-id/examples/eg1.ts index d40d3b20..c31bd84d 100644 --- a/packages/auto-id/examples/eg1.ts +++ b/packages/auto-id/examples/eg1.ts @@ -1,14 +1,10 @@ /* - RSA key pair generation and saving/loading example + Simple RSA key pair generation */ import { generateRsaKeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' // Example usage: -const [privateKey, publicKey] = generateRsaKeyPair() -console.log(`Private key: ${privateKey}`) -console.log(`Public key: ${publicKey}`) - -saveKey(Buffer.from(privateKey), './privateKey.pem') -const loadedPrivateKey = loadPrivateKey('./privateKey.pem') -console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) +const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() +console.log(`Private key: ${privateKeyRsa}`) +console.log(`Public key: ${publicKeyRsa}`) diff --git a/packages/auto-id/examples/eg2.ts b/packages/auto-id/examples/eg2.ts index 8920b6cc..71cd5f81 100644 --- a/packages/auto-id/examples/eg2.ts +++ b/packages/auto-id/examples/eg2.ts @@ -1,5 +1,5 @@ /* - Ed25519 key pair generation and saving/loading example + Simple Ed25519 key pair generation */ import { generateEd25519KeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' @@ -8,7 +8,3 @@ import { generateEd25519KeyPair, loadPrivateKey, saveKey } from '../src/keyManag const [privateKey, publicKey] = generateEd25519KeyPair() console.log(`Private key: ${privateKey}`) console.log(`Public key: ${publicKey}`) - -saveKey(Buffer.from(privateKey), './privateKey.pem') -const loadedPrivateKey = loadPrivateKey('./privateKey.pem') -console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) diff --git a/packages/auto-id/examples/eg3.ts b/packages/auto-id/examples/eg3.ts index 39ccad80..59ef2433 100644 --- a/packages/auto-id/examples/eg3.ts +++ b/packages/auto-id/examples/eg3.ts @@ -11,13 +11,13 @@ console.log(`Private key: ${privateKeyRsa}`) console.log(`Public key: ${publicKeyRsa}`) console.log(`========================`) -const privateKey2 = createPrivateKey({ +const privateKeyObjectRsa = createPrivateKey({ key: privateKeyRsa, format: 'pem', // Input can still be PEM }) -const publicKey2 = createPublicKey(privateKeyRsa) +const publicKey2 = createPublicKey(privateKeyObjectRsa) -console.log(keyToPem(privateKey2)) // Export without password -console.log(keyToPem(privateKey2, 'subspace')) // Export with password +console.log(keyToPem(privateKeyObjectRsa)) // Export without password +console.log(keyToPem(privateKeyObjectRsa, 'subspace')) // Export with password console.log(keyToPem(publicKey2)) // Export public key diff --git a/packages/auto-id/examples/eg5.ts b/packages/auto-id/examples/eg5.ts new file mode 100644 index 00000000..ae921d07 --- /dev/null +++ b/packages/auto-id/examples/eg5.ts @@ -0,0 +1,38 @@ +/* + This example demonstrates how to generate a RSA key pair and export it as PEM format. + The private key can be exported with or without password. +*/ + +import { createPrivateKey, createPublicKey } from 'crypto' +import { generateRsaKeyPair, keyToPem, loadPrivateKey, saveKey } from '../src/keyManagement' + +const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() +console.log(`Private key: ${privateKeyRsa}`) +console.log(`Public key: ${publicKeyRsa}`) +console.log(`========================`) + +const privateKeyObject = createPrivateKey({ + key: privateKeyRsa, + format: 'pem', // Input can still be PEM +}) + +const publicKeyKeyObject = createPublicKey(privateKeyObject) + +console.log(keyToPem(privateKeyObject)) // Export without password +console.log(keyToPem(privateKeyObject, 'subspace')) // Export with password +console.log(keyToPem(publicKeyKeyObject)) // Export public key + +// w/o password +saveKey(privateKeyObject, './privateKey.pem') + .then(() => console.log('Key saved successfully')) + .catch((err) => console.error('Error saving key:', err)) +// with password i.e. encrypted key +saveKey(privateKeyObject, './privateKeyPassword.pem', 'subspace') + .then(() => console.log('Encrypted Key (with password) saved successfully')) + .catch((err) => console.error('Error saving key:', err)) + +loadPrivateKey('./privateKey.pem') + .then((key) => { + console.log(`Private keys match: ${key.toString() === privateKeyObject.toString()}`) + }) + .catch((err) => console.error('Error loading key:', err)) diff --git a/packages/auto-id/examples/eg6.ts b/packages/auto-id/examples/eg6.ts new file mode 100644 index 00000000..4eb44583 --- /dev/null +++ b/packages/auto-id/examples/eg6.ts @@ -0,0 +1,35 @@ +/* + This example demonstrates how to generate a Ed25519 key pair and export it as PEM format. + The private key can be exported with or without password. +*/ + +import { createPrivateKey, createPublicKey } from 'crypto' +import { generateEd25519KeyPair, keyToPem, saveKey } from '../src/keyManagement' + +const [privateKeyEd25519, publicKeyEd25519] = generateEd25519KeyPair() +console.log(`Private key: ${privateKeyEd25519}`) +console.log(`Public key: ${publicKeyEd25519}`) +console.log(`========================`) + +const privateKeyObject = createPrivateKey({ + key: privateKeyEd25519, + format: 'pem', // Input can still be PEM +}) + +const publicKeyObject = createPublicKey(privateKeyEd25519) + +console.log(keyToPem(privateKeyObject)) // Export without password +console.log(keyToPem(privateKeyObject, 'subspace')) // Export with password +console.log(keyToPem(publicKeyObject)) // Export public key + +// w/o password +saveKey(privateKeyObject, './privateKey.pem') + .then(() => console.log('Key saved successfully')) + .catch((err) => console.error('Error saving key:', err)) +// with password i.e. encrypted key +saveKey(privateKeyObject, './privateKeyPassword.pem', 'subspace') + .then(() => console.log('Key (with password) saved successfully')) + .catch((err) => console.error('Error saving key:', err)) + +// const loadedPrivateKey = loadPrivateKey('./privateKey.pem') +// console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) From 2ad656cafb84d5ea2822e39c5deb0ebabc93465f Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 19:21:49 +0530 Subject: [PATCH 09/18] Add a README for Auto ID package --- packages/auto-id/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/auto-id/README.md diff --git a/packages/auto-id/README.md b/packages/auto-id/README.md new file mode 100644 index 00000000..7aff35ad --- /dev/null +++ b/packages/auto-id/README.md @@ -0,0 +1,25 @@ +# Auto ID + +## Build + +```sh +yarn +yarn build +``` + +## Test + +```sh +yarn test +``` + +## Examples + +```sh +yarn eg-1 +yarn eg-2 +yarn eg-3 +yarn eg-4 +yarn eg-5 +yarn eg-6 +``` From 2b4ef3e7c7b428fa85029113c9a26fe538a4a87f Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 20:12:53 +0530 Subject: [PATCH 10/18] Removed .vscode from ignoring & Add index.ts --- .gitignore | 1 - packages/auto-id/src/index.ts | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d8e5015f..590142dd 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ Thumbs.db *.temp # IDE/editor files -.vscode/ .idea/ *.swp *.swo diff --git a/packages/auto-id/src/index.ts b/packages/auto-id/src/index.ts index 8fe76a1b..310afd44 100644 --- a/packages/auto-id/src/index.ts +++ b/packages/auto-id/src/index.ts @@ -1,5 +1 @@ -// TODO: Complete once all the modules are ready -/* export const helloWorld = () => { - console.log('Hello World'); -}; - */ +export * from './keyManagement' From 76130792fef5c8b1b03c2a0963a6f79179d93685 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 20:16:42 +0530 Subject: [PATCH 11/18] shift the relevant package to dependencies --- packages/auto-id/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index 25b4c02e..fc07173d 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -14,9 +14,11 @@ "format": "prettier --write \"src/**/*.ts\"", "test": "jest" }, + "dependencies": { + "@types/node": "^20.12.12" + }, "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "^20.12.12", "jest": "^29.7.0", "ts-jest": "^29.1.4", "ts-node": "^10.9.2", From 80ab436991db8512fe42d3a058edab74f49e5208 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 22:40:46 +0530 Subject: [PATCH 12/18] Removed the examples as it's already included in tests --- packages/auto-id/examples/eg1.ts | 10 --------- packages/auto-id/examples/eg2.ts | 10 --------- packages/auto-id/examples/eg3.ts | 23 ------------------- packages/auto-id/examples/eg4.ts | 23 ------------------- packages/auto-id/examples/eg5.ts | 38 -------------------------------- packages/auto-id/examples/eg6.ts | 35 ----------------------------- packages/auto-id/tsconfig.json | 4 +++- 7 files changed, 3 insertions(+), 140 deletions(-) delete mode 100644 packages/auto-id/examples/eg1.ts delete mode 100644 packages/auto-id/examples/eg2.ts delete mode 100644 packages/auto-id/examples/eg3.ts delete mode 100644 packages/auto-id/examples/eg4.ts delete mode 100644 packages/auto-id/examples/eg5.ts delete mode 100644 packages/auto-id/examples/eg6.ts diff --git a/packages/auto-id/examples/eg1.ts b/packages/auto-id/examples/eg1.ts deleted file mode 100644 index c31bd84d..00000000 --- a/packages/auto-id/examples/eg1.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - Simple RSA key pair generation -*/ - -import { generateRsaKeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' - -// Example usage: -const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() -console.log(`Private key: ${privateKeyRsa}`) -console.log(`Public key: ${publicKeyRsa}`) diff --git a/packages/auto-id/examples/eg2.ts b/packages/auto-id/examples/eg2.ts deleted file mode 100644 index 71cd5f81..00000000 --- a/packages/auto-id/examples/eg2.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - Simple Ed25519 key pair generation -*/ - -import { generateEd25519KeyPair, loadPrivateKey, saveKey } from '../src/keyManagement' - -// Example usage: -const [privateKey, publicKey] = generateEd25519KeyPair() -console.log(`Private key: ${privateKey}`) -console.log(`Public key: ${publicKey}`) diff --git a/packages/auto-id/examples/eg3.ts b/packages/auto-id/examples/eg3.ts deleted file mode 100644 index 59ef2433..00000000 --- a/packages/auto-id/examples/eg3.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - This example demonstrates how to generate a RSA key pair and export it as PEM format. - The private key can be exported with or without password. -*/ - -import { createPrivateKey, createPublicKey } from 'crypto' -import { generateRsaKeyPair, keyToPem } from '../src/keyManagement' - -const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() -console.log(`Private key: ${privateKeyRsa}`) -console.log(`Public key: ${publicKeyRsa}`) -console.log(`========================`) - -const privateKeyObjectRsa = createPrivateKey({ - key: privateKeyRsa, - format: 'pem', // Input can still be PEM -}) - -const publicKey2 = createPublicKey(privateKeyObjectRsa) - -console.log(keyToPem(privateKeyObjectRsa)) // Export without password -console.log(keyToPem(privateKeyObjectRsa, 'subspace')) // Export with password -console.log(keyToPem(publicKey2)) // Export public key diff --git a/packages/auto-id/examples/eg4.ts b/packages/auto-id/examples/eg4.ts deleted file mode 100644 index ce1d142e..00000000 --- a/packages/auto-id/examples/eg4.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - This example demonstrates how to generate a Ed25519 key pair and export it as PEM format. - The private key can be exported with or without password. -*/ - -import { createPrivateKey, createPublicKey } from 'crypto' -import { generateEd25519KeyPair, keyToPem } from '../src/keyManagement' - -const [privateKeyEd25519, publicKeyEd25519] = generateEd25519KeyPair() -console.log(`Private key: ${privateKeyEd25519}`) -console.log(`Public key: ${publicKeyEd25519}`) -console.log(`========================`) - -const privateKey2 = createPrivateKey({ - key: privateKeyEd25519, - format: 'pem', // Input can still be PEM -}) - -const publicKey2 = createPublicKey(privateKeyEd25519) - -console.log(keyToPem(privateKey2)) // Export without password -console.log(keyToPem(privateKey2, 'subspace')) // Export with password -console.log(keyToPem(publicKey2)) // Export public key diff --git a/packages/auto-id/examples/eg5.ts b/packages/auto-id/examples/eg5.ts deleted file mode 100644 index ae921d07..00000000 --- a/packages/auto-id/examples/eg5.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - This example demonstrates how to generate a RSA key pair and export it as PEM format. - The private key can be exported with or without password. -*/ - -import { createPrivateKey, createPublicKey } from 'crypto' -import { generateRsaKeyPair, keyToPem, loadPrivateKey, saveKey } from '../src/keyManagement' - -const [privateKeyRsa, publicKeyRsa] = generateRsaKeyPair() -console.log(`Private key: ${privateKeyRsa}`) -console.log(`Public key: ${publicKeyRsa}`) -console.log(`========================`) - -const privateKeyObject = createPrivateKey({ - key: privateKeyRsa, - format: 'pem', // Input can still be PEM -}) - -const publicKeyKeyObject = createPublicKey(privateKeyObject) - -console.log(keyToPem(privateKeyObject)) // Export without password -console.log(keyToPem(privateKeyObject, 'subspace')) // Export with password -console.log(keyToPem(publicKeyKeyObject)) // Export public key - -// w/o password -saveKey(privateKeyObject, './privateKey.pem') - .then(() => console.log('Key saved successfully')) - .catch((err) => console.error('Error saving key:', err)) -// with password i.e. encrypted key -saveKey(privateKeyObject, './privateKeyPassword.pem', 'subspace') - .then(() => console.log('Encrypted Key (with password) saved successfully')) - .catch((err) => console.error('Error saving key:', err)) - -loadPrivateKey('./privateKey.pem') - .then((key) => { - console.log(`Private keys match: ${key.toString() === privateKeyObject.toString()}`) - }) - .catch((err) => console.error('Error loading key:', err)) diff --git a/packages/auto-id/examples/eg6.ts b/packages/auto-id/examples/eg6.ts deleted file mode 100644 index 4eb44583..00000000 --- a/packages/auto-id/examples/eg6.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - This example demonstrates how to generate a Ed25519 key pair and export it as PEM format. - The private key can be exported with or without password. -*/ - -import { createPrivateKey, createPublicKey } from 'crypto' -import { generateEd25519KeyPair, keyToPem, saveKey } from '../src/keyManagement' - -const [privateKeyEd25519, publicKeyEd25519] = generateEd25519KeyPair() -console.log(`Private key: ${privateKeyEd25519}`) -console.log(`Public key: ${publicKeyEd25519}`) -console.log(`========================`) - -const privateKeyObject = createPrivateKey({ - key: privateKeyEd25519, - format: 'pem', // Input can still be PEM -}) - -const publicKeyObject = createPublicKey(privateKeyEd25519) - -console.log(keyToPem(privateKeyObject)) // Export without password -console.log(keyToPem(privateKeyObject, 'subspace')) // Export with password -console.log(keyToPem(publicKeyObject)) // Export public key - -// w/o password -saveKey(privateKeyObject, './privateKey.pem') - .then(() => console.log('Key saved successfully')) - .catch((err) => console.error('Error saving key:', err)) -// with password i.e. encrypted key -saveKey(privateKeyObject, './privateKeyPassword.pem', 'subspace') - .then(() => console.log('Key (with password) saved successfully')) - .catch((err) => console.error('Error saving key:', err)) - -// const loadedPrivateKey = loadPrivateKey('./privateKey.pem') -// console.log(`Private keys match: ${loadedPrivateKey.toString() === privateKey.toString()}`) diff --git a/packages/auto-id/tsconfig.json b/packages/auto-id/tsconfig.json index fbc0d094..622739fd 100644 --- a/packages/auto-id/tsconfig.json +++ b/packages/auto-id/tsconfig.json @@ -6,7 +6,9 @@ }, "include": [ "src/**/*", - "examples/**/*", "tests/**/*", ], + "exclude": [ + "examples/**/*" + ] } \ No newline at end of file From 53733ed509587dc89dd0a4a4e951eed1c2982396 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 22:41:46 +0530 Subject: [PATCH 13/18] Remove examples' scripts from package.json --- packages/auto-id/package.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index fc07173d..2c7a78f0 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -5,12 +5,6 @@ "scripts": { "build": "tsc", "clean": "rm -rf dist", - "eg-1": "tsc && node dist/examples/eg1.js", - "eg-2": "tsc && node dist/examples/eg2.js", - "eg-3": "tsc && node dist/examples/eg3.js", - "eg-4": "tsc && node dist/examples/eg4.js", - "eg-5": "tsc && node dist/examples/eg5.js", - "eg-6": "tsc && node dist/examples/eg6.js", "format": "prettier --write \"src/**/*.ts\"", "test": "jest" }, From fdbe0acdc99ae7e0aef632cf5bc4b8dc840ec8be Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Tue, 4 Jun 2024 22:45:54 +0530 Subject: [PATCH 14/18] Remove unncessary inclusion of tests/ folder --- packages/auto-id/tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/auto-id/tsconfig.json b/packages/auto-id/tsconfig.json index 622739fd..aa702d83 100644 --- a/packages/auto-id/tsconfig.json +++ b/packages/auto-id/tsconfig.json @@ -6,7 +6,6 @@ }, "include": [ "src/**/*", - "tests/**/*", ], "exclude": [ "examples/**/*" From d6794609db8ebeb324624f5ab2df016f361ca98b Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Wed, 5 Jun 2024 15:13:33 +0530 Subject: [PATCH 15/18] Modify saveKey function & its tests of auto-id package - In `saveOnFileSystem` function, check if value is already a string to avoid unnecessary JSON string conversion - Use the generic `save` function instead of directly using `fs.writeFile` - Modify the corresponding tests for `saveKey` function. --- packages/auto-id/package.json | 3 +- packages/auto-id/src/keyManagement.ts | 3 +- packages/auto-id/tests/keyManagement.test.ts | 10 +- packages/auto-utils/src/save.ts | 4 +- yarn.lock | 147 ++++++++++++++++++- 5 files changed, 158 insertions(+), 9 deletions(-) diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index 2c735d91..6f4eee60 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -9,7 +9,8 @@ "test": "jest" }, "dependencies": { - "@types/node": "^20.12.12" + "@types/node": "^20.12.12", + "@autonomys/auto-utils": "workspace:*" }, "files": [ "dist", diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index 069c02b5..7b7fa5b3 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,3 +1,4 @@ +import { save } from '@autonomys/auto-utils' import { KeyObject, createPrivateKey, createPublicKey, generateKeyPairSync } from 'crypto' import { promises as fs } from 'fs' import { writeFile } from 'fs/promises' @@ -112,7 +113,7 @@ export function keyToPem(key: KeyObject, password?: string): string { export async function saveKey(key: KeyObject, filePath: string, password?: string): Promise { try { const pem = keyToPem(key, password) - await writeFile(filePath, pem, 'utf8') // Ensure the encoding is correct for PEM format + await save(filePath, pem); } catch (e: any) { throw new Error(`Failed to save key: ${e.message}`) } diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index eac07f60..72fd2bc2 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -173,7 +173,8 @@ describe('saveKey function', () => { await saveKey(privateKeyObject, filePath) const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) - expect(fileContents).toBe(keyToPem(privateKeyObject)) + // Check if the PEM string matches expected, considering JSON.stringify use + expect(fileContents).toBe(JSON.stringify(keyToPem(privateKeyObject))); }) test('should save an encrypted private key to a file', async () => { @@ -183,9 +184,12 @@ describe('saveKey function', () => { await saveKey(pemToPrivateKey(privateKey), filePath, password) const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) + // Parse it back to normal string + const actualPemContent = JSON.parse(fileContents); + // Check if the file content starts and ends with the expected encrypted private key headers - expect(fileContents.startsWith('-----BEGIN ENCRYPTED PRIVATE KEY-----')).toBe(true) - expect(fileContents.endsWith('-----END ENCRYPTED PRIVATE KEY-----\n')).toBe(true) + expect(actualPemContent.startsWith('-----BEGIN ENCRYPTED PRIVATE KEY-----')).toBe(true) + expect(actualPemContent.endsWith('-----END ENCRYPTED PRIVATE KEY-----\n')).toBe(true) }) test('should throw an error when trying to save to an invalid path', async () => { const filePath = path.join(testDir, 'non_existent_directory', 'testPrivateKey.pem') diff --git a/packages/auto-utils/src/save.ts b/packages/auto-utils/src/save.ts index a83c084f..48b454cc 100644 --- a/packages/auto-utils/src/save.ts +++ b/packages/auto-utils/src/save.ts @@ -15,6 +15,8 @@ export const saveOnFileSystem = async (key: string, value: any) => { if (typeof window === 'undefined') { // save on file system const fs = await import('fs/promises') - await fs.writeFile(key, JSON.stringify(value)) + // Check if value is already a string to avoid unnecessary JSON string conversion + const data = typeof value === 'string' ? value : JSON.stringify(value); + await fs.writeFile(key, JSON.stringify(data)) } else throw new Error('This function can only be used in node') } diff --git a/yarn.lock b/yarn.lock index 8eb0a262..2eba8cf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,11 @@ __metadata: version: 0.0.0-use.local resolution: "@autonomys/auto-id@workspace:packages/auto-id" dependencies: + "@types/jest": "npm:^29.5.12" + "@types/node": "npm:^20.12.12" + jest: "npm:^29.7.0" + ts-jest: "npm:^29.1.4" + ts-node: "npm:^10.9.2" typescript: "npm:^5.4.5" languageName: unknown linkType: soft @@ -451,6 +456,15 @@ __metadata: languageName: node linkType: hard +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -793,7 +807,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e @@ -814,6 +828,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" @@ -1452,6 +1476,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -1555,6 +1607,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.12.12": + version: 20.14.1 + resolution: "@types/node@npm:20.14.1" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/12b7879047f50cc217bbea3add7c45e542070f6e9fb2092be97542152b7022512bcb2bf848d04f77e295c4c8699acd484e79a4a4dbe9bcfa4e89dd543d530611 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -1601,7 +1662,14 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.9.0": +"acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -1706,6 +1774,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -2071,6 +2146,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -2153,6 +2235,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -3639,7 +3728,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x": +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f @@ -4661,6 +4750,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "tslib@npm:^2.1.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -4766,6 +4893,13 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.1": version: 9.2.0 resolution: "v8-to-istanbul@npm:9.2.0" @@ -4919,6 +5053,13 @@ __metadata: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From 1d9cf2fcaafecdff518a0ef016d793f1641fdc91 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Wed, 5 Jun 2024 15:31:21 +0530 Subject: [PATCH 16/18] Incorporate save function from auto-utils into Load key function & tests --- packages/auto-id/src/helper.ts | 8 ++++++++ packages/auto-id/src/keyManagement.ts | 20 ++++++++++++-------- packages/auto-id/tests/keyManagement.test.ts | 8 ++++---- 3 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 packages/auto-id/src/helper.ts diff --git a/packages/auto-id/src/helper.ts b/packages/auto-id/src/helper.ts new file mode 100644 index 00000000..73df1873 --- /dev/null +++ b/packages/auto-id/src/helper.ts @@ -0,0 +1,8 @@ +// Helper function to safely parse JSON with a fallback +export function tryParseJson(jsonString: string, fallback: string): string { + try { + return JSON.parse(jsonString); + } catch (e) { + return fallback; // Return the original string if it's not JSON + } +} \ No newline at end of file diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index 7b7fa5b3..8e394d9c 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,7 +1,7 @@ import { save } from '@autonomys/auto-utils' import { KeyObject, createPrivateKey, createPublicKey, generateKeyPairSync } from 'crypto' import { promises as fs } from 'fs' -import { writeFile } from 'fs/promises' +import { tryParseJson } from './helper' /** * Generates an RSA key pair. @@ -113,7 +113,7 @@ export function keyToPem(key: KeyObject, password?: string): string { export async function saveKey(key: KeyObject, filePath: string, password?: string): Promise { try { const pem = keyToPem(key, password) - await save(filePath, pem); + await save(filePath, pem) } catch (e: any) { throw new Error(`Failed to save key: ${e.message}`) } @@ -167,9 +167,11 @@ export function pemToPrivateKey(pemData: string, password?: string): KeyObject { */ export async function loadPrivateKey(filePath: string, password?: string): Promise { try { - const keyData = await fs.readFile(filePath) - const privateKey = pemToPrivateKey(keyData.toString(), password) - return privateKey + let keyData = await fs.readFile(filePath, {encoding: 'utf-8'}) + // Check if keyData is JSON-encoded and parse it + keyData = tryParseJson(keyData, keyData) // Fallback to original data if not JSON + const privateKey = pemToPrivateKey(keyData, password) + return privateKey; } catch (error: any) { throw new Error(`Failed to load private key: ${error.message}`) } @@ -213,8 +215,10 @@ export function pemToPublicKey(pemData: string): KeyObject { */ export async function loadPublicKey(filePath: string): Promise { try { - const keyData = await fs.readFile(filePath) - const publicKey = pemToPublicKey(keyData.toString()) + let keyData = await fs.readFile(filePath, { encoding: 'utf8' }) + // Check if keyData is JSON-encoded and parse it + keyData = tryParseJson(keyData, keyData); // Fallback to original data if not JSON + const publicKey = pemToPublicKey(keyData); return publicKey } catch (error: any) { throw new Error(`Failed to load public key: ${error.message}`) @@ -288,4 +292,4 @@ export function doPublicKeysMatch(publicKey1: KeyObject, publicKey2: KeyObject): // Compare the serialized public key data return publicKey1Der.equals(publicKey2Der) -} +} \ No newline at end of file diff --git a/packages/auto-id/tests/keyManagement.test.ts b/packages/auto-id/tests/keyManagement.test.ts index 72fd2bc2..c343c0c3 100644 --- a/packages/auto-id/tests/keyManagement.test.ts +++ b/packages/auto-id/tests/keyManagement.test.ts @@ -139,7 +139,7 @@ describe('PEM to Private/Public key for', () => { } }) -describe('saveKey function', () => { +describe('Save Key', () => { const keyGenerators = [ { name: 'RSA', generator: generateRsaKeyPair }, { name: 'Ed25519', generator: generateEd25519KeyPair }, @@ -174,7 +174,7 @@ describe('saveKey function', () => { const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) // Check if the PEM string matches expected, considering JSON.stringify use - expect(fileContents).toBe(JSON.stringify(keyToPem(privateKeyObject))); + expect(fileContents).toBe(JSON.stringify(keyToPem(privateKeyObject))) }) test('should save an encrypted private key to a file', async () => { @@ -185,7 +185,7 @@ describe('saveKey function', () => { const fileContents = await fs.readFile(filePath, { encoding: 'utf8' }) // Parse it back to normal string - const actualPemContent = JSON.parse(fileContents); + const actualPemContent = JSON.parse(fileContents) // Check if the file content starts and ends with the expected encrypted private key headers expect(actualPemContent.startsWith('-----BEGIN ENCRYPTED PRIVATE KEY-----')).toBe(true) @@ -200,7 +200,7 @@ describe('saveKey function', () => { } }) -describe('Key loading functions', () => { +describe('Load Key', () => { const keyGenerators = [ { name: 'RSA', generator: generateRsaKeyPair }, { name: 'Ed25519', generator: generateEd25519KeyPair }, From f7c1adc908286b3bbddf23ab7792be0b9c84d705 Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Wed, 5 Jun 2024 16:52:33 +0530 Subject: [PATCH 17/18] Modify load key functions considering the dynamic read function added in auto-utils --- packages/auto-id/src/helper.ts | 8 ------- packages/auto-id/src/keyManagement.ts | 14 ++++--------- packages/auto-utils/src/index.ts | 1 + packages/auto-utils/src/read.ts | 30 +++++++++++++++++++++++++++ packages/auto-utils/src/save.ts | 2 +- 5 files changed, 36 insertions(+), 19 deletions(-) delete mode 100644 packages/auto-id/src/helper.ts create mode 100644 packages/auto-utils/src/read.ts diff --git a/packages/auto-id/src/helper.ts b/packages/auto-id/src/helper.ts deleted file mode 100644 index 73df1873..00000000 --- a/packages/auto-id/src/helper.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Helper function to safely parse JSON with a fallback -export function tryParseJson(jsonString: string, fallback: string): string { - try { - return JSON.parse(jsonString); - } catch (e) { - return fallback; // Return the original string if it's not JSON - } -} \ No newline at end of file diff --git a/packages/auto-id/src/keyManagement.ts b/packages/auto-id/src/keyManagement.ts index 8e394d9c..391f2618 100644 --- a/packages/auto-id/src/keyManagement.ts +++ b/packages/auto-id/src/keyManagement.ts @@ -1,7 +1,5 @@ -import { save } from '@autonomys/auto-utils' +import { read, save } from '@autonomys/auto-utils' import { KeyObject, createPrivateKey, createPublicKey, generateKeyPairSync } from 'crypto' -import { promises as fs } from 'fs' -import { tryParseJson } from './helper' /** * Generates an RSA key pair. @@ -167,9 +165,7 @@ export function pemToPrivateKey(pemData: string, password?: string): KeyObject { */ export async function loadPrivateKey(filePath: string, password?: string): Promise { try { - let keyData = await fs.readFile(filePath, {encoding: 'utf-8'}) - // Check if keyData is JSON-encoded and parse it - keyData = tryParseJson(keyData, keyData) // Fallback to original data if not JSON + const keyData = await read(filePath) const privateKey = pemToPrivateKey(keyData, password) return privateKey; } catch (error: any) { @@ -215,10 +211,8 @@ export function pemToPublicKey(pemData: string): KeyObject { */ export async function loadPublicKey(filePath: string): Promise { try { - let keyData = await fs.readFile(filePath, { encoding: 'utf8' }) - // Check if keyData is JSON-encoded and parse it - keyData = tryParseJson(keyData, keyData); // Fallback to original data if not JSON - const publicKey = pemToPublicKey(keyData); + const keyData = await read(filePath) + const publicKey = pemToPublicKey(keyData) return publicKey } catch (error: any) { throw new Error(`Failed to load public key: ${error.message}`) diff --git a/packages/auto-utils/src/index.ts b/packages/auto-utils/src/index.ts index 5f9ea5e0..d38eecfc 100644 --- a/packages/auto-utils/src/index.ts +++ b/packages/auto-utils/src/index.ts @@ -1,3 +1,4 @@ export * from './api' export * from './network' +export * from './read' export * from './save' diff --git a/packages/auto-utils/src/read.ts b/packages/auto-utils/src/read.ts new file mode 100644 index 00000000..fd5a7e1e --- /dev/null +++ b/packages/auto-utils/src/read.ts @@ -0,0 +1,30 @@ +export const read = async (key: string) => { + // detect if we are in the browser or in node + if (typeof window !== 'undefined') return readFromLocalStorage(key) + else return readFromFileSystem(key) +} + +export const readFromLocalStorage = async (key: string) => { + if (typeof window !== 'undefined') { + // read from local storage + const value = localStorage.getItem(key) + try { + return value ? JSON.parse(value) : null + } catch (error) { + throw new Error('Failed to parse data from localStorage: ' + error) + } + } else throw new Error('This function can only be used in the browser') +} + +export const readFromFileSystem = async (key: string) => { + if (typeof window === 'undefined') { + // read from file system + const fs = await import('fs/promises') + try { + const data = await fs.readFile(key, { encoding: 'utf-8' }) + return JSON.parse(data); + } catch (error) { + throw new Error('Failed to read or parse file: ' + error) + } + } else throw new Error('This function can only be used in node') +} \ No newline at end of file diff --git a/packages/auto-utils/src/save.ts b/packages/auto-utils/src/save.ts index 48b454cc..5fa575a6 100644 --- a/packages/auto-utils/src/save.ts +++ b/packages/auto-utils/src/save.ts @@ -19,4 +19,4 @@ export const saveOnFileSystem = async (key: string, value: any) => { const data = typeof value === 'string' ? value : JSON.stringify(value); await fs.writeFile(key, JSON.stringify(data)) } else throw new Error('This function can only be used in node') -} +} \ No newline at end of file From d825e21de96ce9aa757f5a9d8d1d5e46942adcbf Mon Sep 17 00:00:00 2001 From: Abhijit Roy Date: Thu, 6 Jun 2024 00:18:51 +0530 Subject: [PATCH 18/18] Update lock file --- packages/auto-id/package.json | 6 +++--- yarn.lock | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/auto-id/package.json b/packages/auto-id/package.json index 6f4eee60..558810bc 100644 --- a/packages/auto-id/package.json +++ b/packages/auto-id/package.json @@ -9,8 +9,8 @@ "test": "jest" }, "dependencies": { - "@types/node": "^20.12.12", - "@autonomys/auto-utils": "workspace:*" + "@autonomys/auto-utils": "workspace:*", + "@types/node": "^20.12.12" }, "files": [ "dist", @@ -23,4 +23,4 @@ "ts-node": "^10.9.2", "typescript": "^5.4.5" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 2eba8cf6..85701739 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,7 @@ __metadata: version: 0.0.0-use.local resolution: "@autonomys/auto-id@workspace:packages/auto-id" dependencies: + "@autonomys/auto-utils": "workspace:*" "@types/jest": "npm:^29.5.12" "@types/node": "npm:^20.12.12" jest: "npm:^29.7.0"