From 02d3e476b69c84d598f288573ec923d42a329e54 Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Mon, 13 Oct 2025 09:06:33 +0300 Subject: [PATCH 01/16] initial --- .prettierignore | 15 + eslint.config.mjs | 7 + package.json | 93 + pnpm-lock.yaml | 6066 ++++++++++++++++++++++++++ src/fragments/accountPage.ts | 188 + src/fragments/errorPage.ts | 54 + src/fragments/index.ts | 6 + src/fragments/instructionData.ts | 128 + src/fragments/instructionFunction.ts | 285 ++ src/fragments/instructionPage.ts | 39 + src/fragments/structType.ts | 110 + src/index.ts | 4 + src/utils/builtinPrograms.ts | 37 + src/utils/fragment.ts | 117 + src/utils/importMap.ts | 104 + src/utils/index.ts | 6 + src/utils/nameTransformers.ts | 77 + src/utils/options.ts | 61 + src/utils/pda.ts | 107 + src/utils/pubspec.ts | 69 + src/utils/types.ts | 544 +++ src/visitors/getRenderMapVisitor.ts | 146 + src/visitors/index.ts | 2 + src/visitors/renderVisitor.ts | 23 + tsconfig.json | 24 + 25 files changed, 8312 insertions(+) create mode 100644 .prettierignore create mode 100644 eslint.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/fragments/accountPage.ts create mode 100644 src/fragments/errorPage.ts create mode 100644 src/fragments/index.ts create mode 100644 src/fragments/instructionData.ts create mode 100644 src/fragments/instructionFunction.ts create mode 100644 src/fragments/instructionPage.ts create mode 100644 src/fragments/structType.ts create mode 100644 src/index.ts create mode 100644 src/utils/builtinPrograms.ts create mode 100644 src/utils/fragment.ts create mode 100644 src/utils/importMap.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/nameTransformers.ts create mode 100644 src/utils/options.ts create mode 100644 src/utils/pda.ts create mode 100644 src/utils/pubspec.ts create mode 100644 src/utils/types.ts create mode 100644 src/visitors/getRenderMapVisitor.ts create mode 100644 src/visitors/index.ts create mode 100644 src/visitors/renderVisitor.ts create mode 100644 tsconfig.json diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..8b37ac4 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,15 @@ +test/e2e/ + +.changeset/ +.github/workflows/PULL_REQUEST_TEMPLATE.md + +declarations/ +dist/ +doc/ +lib/ +test-ledger/ +target/ +CHANGELOG.md + +pnpm-lock.yaml +pnpm-workspace.yaml diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..1579185 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,7 @@ +import solanaConfig from '@solana/eslint-config-solana'; +import { defineConfig } from 'eslint/config'; + +export default defineConfig([ + { ignores: ['**/dist/**', '**/e2e/**'] }, + { files: ['**/*.ts', '**/*.(c|m)?js'], extends: [solanaConfig] }, +]); diff --git a/package.json b/package.json new file mode 100644 index 0000000..49a159a --- /dev/null +++ b/package.json @@ -0,0 +1,93 @@ +{ + "name": "@codama/renderers-dart", + "version": "1.4.2", + "description": "Dart", + "exports": { + "types": "./dist/types/index.d.ts", + "react-native": "./dist/index.react-native.mjs", + "browser": { + "import": "./dist/index.browser.mjs", + "require": "./dist/index.browser.cjs" + }, + "node": { + "import": "./dist/index.node.mjs", + "require": "./dist/index.node.cjs" + } + }, + "browser": { + "./dist/index.node.cjs": "./dist/index.browser.cjs", + "./dist/index.node.mjs": "./dist/index.browser.mjs" + }, + "main": "./dist/index.node.cjs", + "module": "./dist/index.node.mjs", + "react-native": "./dist/index.react-native.mjs", + "types": "./dist/types/index.d.ts", + "type": "commonjs", + "files": [ + "./dist/types", + "./dist/index.*" + ], + "sideEffects": false, + "keywords": [ + "solana", + "framework", + "standard", + "renderers", + "js", + "client" + ], + "scripts": { + "build": "rimraf dist && tsup && tsc -p ./tsconfig.declarations.json", + "dev": "vitest --project node", + "lint": "eslint . && prettier --check .", + "lint:fix": "eslint --fix . && prettier --write .", + "publish-package": "pnpm build && changeset publish", + "test": "pnpm test:types && pnpm test:treeshakability && pnpm test:unit && pnpm test:e2e && pnpm test:exports", + "test:e2e": "./test/e2e/test.sh", + "test:exports": "node ./test/exports/module.mjs && node ./test/exports/commonjs.cjs", + "test:treeshakability": "for file in dist/index.*.mjs; do agadoo $file; done", + "test:types": "tsc --noEmit", + "test:unit": "vitest run" + }, + "dependencies": { + "@codama/errors": "^1.3.7", + "@codama/nodes": "^1.3.7", + "@codama/renderers-core": "^1.2.2", + "@codama/visitors-core": "^1.3.7", + "@solana/codecs-strings": "^3.0.3", + "prettier": "^3.6.2" + }, + "devDependencies": { + "@codama/nodes-from-anchor": "^1.2.9", + "@changesets/changelog-github": "^0.5.1", + "@changesets/cli": "^2.29.7", + "@solana/eslint-config-solana": "^5.0.0", + "@solana/prettier-config-solana": "0.0.5", + "@types/node": "^24", + "agadoo": "^3.0.0", + "eslint": "^9.35.0", + "happy-dom": "^18.0.1", + "prettier": "^3.6.2", + "rimraf": "6.0.1", + "tsup": "^8.5.0", + "typescript": "^5.9.2", + "vitest": "^3.2.4" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/codama-idl/renderers-js" + }, + "bugs": { + "url": "http://github.com/codama-idl/renderers-js/issues" + }, + "browserslist": [ + "supports bigint and not dead", + "maintained node versions" + ], + "engines": { + "node": ">=20.18.0" + }, + "packageManager": "pnpm@10.15.1", + "prettier": "@solana/prettier-config-solana" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c0d654c --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6066 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@codama/errors': + specifier: ^1.3.7 + version: 1.3.7 + '@codama/nodes': + specifier: ^1.3.7 + version: 1.3.7 + '@codama/renderers-core': + specifier: ^1.2.2 + version: 1.2.2 + '@codama/visitors-core': + specifier: ^1.3.7 + version: 1.3.7 + '@solana/codecs-strings': + specifier: ^3.0.3 + version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + prettier: + specifier: ^3.6.2 + version: 3.6.2 + devDependencies: + '@changesets/changelog-github': + specifier: ^0.5.1 + version: 0.5.1 + '@changesets/cli': + specifier: ^2.29.7 + version: 2.29.7(@types/node@24.7.2) + '@codama/nodes-from-anchor': + specifier: ^1.2.9 + version: 1.2.9(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/eslint-config-solana': + specifier: ^5.0.0 + version: 5.0.0(@eslint/js@9.37.0)(@types/eslint__js@8.42.3)(eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.37.0))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0))(eslint-plugin-sort-keys-fix@1.1.2)(eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(globals@14.0.0)(jest@30.2.0(@types/node@24.7.2))(typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3))(typescript@5.9.3) + '@solana/prettier-config-solana': + specifier: 0.0.5 + version: 0.0.5(prettier@3.6.2) + '@types/node': + specifier: ^24 + version: 24.7.2 + agadoo: + specifier: ^3.0.0 + version: 3.0.0 + eslint: + specifier: ^9.35.0 + version: 9.37.0 + happy-dom: + specifier: ^18.0.1 + version: 18.0.1 + rimraf: + specifier: 6.0.1 + version: 6.0.1 + tsup: + specifier: ^8.5.0 + version: 8.5.0(postcss@8.5.6)(typescript@5.9.3) + typescript: + specifier: ^5.9.2 + version: 5.9.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.7.2)(happy-dom@18.0.1) + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/changelog-github@0.5.1': + resolution: {integrity: sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ==} + + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@codama/errors@1.3.7': + resolution: {integrity: sha512-96BF8agDVc2vAgL4qw1lZZfuJ7XBefdzTBk2VOUnOhdMQiLb0QhJCC4BH88OcL+rZXQdet4pk7Qwarj1I1GFKg==} + hasBin: true + + '@codama/node-types@1.3.7': + resolution: {integrity: sha512-L9UTFfoeki5t+BYJAa4OMsqBPpbMbx8YJQar+55mYcjwGlJsKJW7mRfLYvwEFkCUYyLdNva40OVmTf88jccZCA==} + + '@codama/nodes-from-anchor@1.2.9': + resolution: {integrity: sha512-n+53VumtguLeSzGWZLpJqWRqs+r8NkWb1w8Ci0AuWQ6Qwfbbk9LknUg1XkqpgZZuq2Hh/Xoy28yHBl2JeIXi3w==} + + '@codama/nodes@1.3.7': + resolution: {integrity: sha512-3OV6SIBcqsIDARyzZVGdfnffNlnKSYcb0aGp/9Liz5/EID0oBTIyuh/Cmj5Ww6RX4WPb+GNAxABAGW94zbcfQg==} + + '@codama/renderers-core@1.2.2': + resolution: {integrity: sha512-dPyHgn5L45G+tWP17ITvOlpX3+s2FcJHMjAhFZlmUHAJpH/wl+UsUwuWg698iSb56Er2jUwqX7srw5iZf7XHjQ==} + + '@codama/visitors-core@1.3.7': + resolution: {integrity: sha512-B1JnzhRDJiLxewha/F3YzeEp8Zrtd7eKiGNJFJHSPufAnIVm2lQUDaKS+OrAOHnSRmRKIAVdzfpFpdz6EM0N6Q==} + + '@codama/visitors@1.3.7': + resolution: {integrity: sha512-pIVK84G4dquvDXmr0q9GACcwDROw7DOBz0Kk/qt837FsKYr37xc6nU2LIguXu8QVIFOHBZk1HVAb7/S0eo/dqg==} + + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/plugin-virtual@3.0.2': + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@solana/codecs-core@3.0.3': + resolution: {integrity: sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@3.0.3': + resolution: {integrity: sha512-R15cLp8riJvToXziW8lP6AMSwsztGhEnwgyGmll32Mo0Yjq+hduW2/fJrA/TJs6tA/OgTzMQjlxgk009EqZHCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@3.0.3': + resolution: {integrity: sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-strings@3.0.3': + resolution: {integrity: sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/codecs@3.0.3': + resolution: {integrity: sha512-GOHwTlIQsCoJx9Ryr6cEf0FHKAQ7pY4aO4xgncAftrv0lveTQ1rPP2inQ1QT0gJllsIa8nwbfXAADs9nNJxQDA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@3.0.3': + resolution: {integrity: sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/eslint-config-solana@5.0.0': + resolution: {integrity: sha512-DPsoloOpVf/4JD7m3j394BvJX8mCKTSQ1xJrP0tyyeLEZN7x09OL9uj2bo2Ma4UTYZsyV97p2eiuiHmJVA0Kfw==} + peerDependencies: + '@eslint/js': ^9.13.0 + '@types/eslint__js': ^8.42.3 + eslint: ^9.13.0 + eslint-plugin-jest: ^29.0.0 + eslint-plugin-react-hooks: ^5.0.0 + eslint-plugin-simple-import-sort: ^12.1.1 + eslint-plugin-sort-keys-fix: ^1.1.2 + eslint-plugin-typescript-sort-keys: ^3.3.0 + globals: ^15.11.0 + jest: ^30.0.0 + typescript: ^5.6 + typescript-eslint: ^8.11.0 + + '@solana/options@3.0.3': + resolution: {integrity: sha512-jarsmnQ63RN0JPC5j9sgUat07NrL9PC71XU7pUItd6LOHtu4+wJMio3l5mT0DHVfkfbFLL6iI6+QmXSVhTNF3g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/prettier-config-solana@0.0.5': + resolution: {integrity: sha512-igtLH1QaX5xzSLlqteexRIg9X1QKA03xKYQc2qY1TrMDDhxKXoRZOStQPWdita2FVJzxTGz/tdMGC1vS0biRcg==} + peerDependencies: + prettier: ^3.2.0 + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.19.21': + resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} + + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@8.46.0': + resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/parser@8.46.0': + resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.46.0': + resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@8.46.0': + resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.46.0': + resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.46.0': + resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@8.46.0': + resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.46.0': + resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@8.46.0': + resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@8.46.0': + resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agadoo@3.0.0: + resolution: {integrity: sha512-gq+fjT3Ilrhb88Jf+vYMjdO/+3znYfa7vJ4IMLPFsBPUxglnr40Ed3yCLrW6IABdJAedB94b2BkqR6I04lh3dg==} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} + hasBin: true + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} + + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.234: + resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-jest@29.0.1: + resolution: {integrity: sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==} + engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-simple-import-sort@12.1.1: + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + peerDependencies: + eslint: '>=5.0.0' + + eslint-plugin-sort-keys-fix@1.1.2: + resolution: {integrity: sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==} + engines: {node: '>=0.10.0'} + + eslint-plugin-typescript-sort-keys@3.3.0: + resolution: {integrity: sha512-bRW3Rc/VNdrSP9OoY5wgjjaXCOOkZKpzvl/Mk6l8Sg8CMehVIcg9K4y33l+ZcZiknpl0aR6rKusxuCJNGZWmVw==} + engines: {node: '>= 16'} + peerDependencies: + '@typescript-eslint/parser': '>=6' + eslint: ^7 || ^8 + typescript: ^3 || ^4 || ^5 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + happy-dom@18.0.1: + resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + engines: {node: '>=20.0.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + hasBin: true + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript-eslint@8.46.0: + resolution: {integrity: sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/changelog-github@0.5.1': + dependencies: + '@changesets/get-github-info': 0.6.0 + '@changesets/types': 6.1.0 + dotenv: 8.6.0 + transitivePeerDependencies: + - encoding + + '@changesets/cli@2.29.7(@types/node@24.7.2)': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@24.7.2) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-github-info@0.6.0': + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 + + '@codama/errors@1.3.7': + dependencies: + '@codama/node-types': 1.3.7 + commander: 14.0.1 + picocolors: 1.1.1 + + '@codama/node-types@1.3.7': {} + + '@codama/nodes-from-anchor@1.2.9(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@codama/errors': 1.3.7 + '@codama/nodes': 1.3.7 + '@codama/visitors': 1.3.7 + '@noble/hashes': 1.8.0 + '@solana/codecs': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@codama/nodes@1.3.7': + dependencies: + '@codama/errors': 1.3.7 + '@codama/node-types': 1.3.7 + + '@codama/renderers-core@1.2.2': + dependencies: + '@codama/errors': 1.3.7 + '@codama/nodes': 1.3.7 + '@codama/visitors-core': 1.3.7 + + '@codama/visitors-core@1.3.7': + dependencies: + '@codama/errors': 1.3.7 + '@codama/nodes': 1.3.7 + json-stable-stringify: 1.3.0 + + '@codama/visitors@1.3.7': + dependencies: + '@codama/errors': 1.3.7 + '@codama/nodes': 1.3.7 + '@codama/visitors-core': 1.3.7 + + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': + dependencies: + eslint: 9.37.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.37.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/external-editor@1.0.2(@types/node@24.7.2)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.7.2 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + + '@jest/core@30.2.0': + dependencies: + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@24.7.2) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.2.0': + dependencies: + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-mock: 30.2.0 + + '@jest/expect-utils@30.2.0': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/expect@30.2.0': + dependencies: + expect: 30.2.0 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 24.7.2 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.2.0': + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 24.7.2 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.2.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 24.7.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.41 + + '@jest/snapshot-utils@30.2.0': + dependencies: + '@jest/types': 30.2.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.2.0': + dependencies: + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.2.0': + dependencies: + '@jest/test-result': 30.2.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + slash: 3.0.0 + + '@jest/transform@30.2.0': + dependencies: + '@babel/core': 7.28.4 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.7.2 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@rollup/plugin-virtual@3.0.2(rollup@3.29.5)': + optionalDependencies: + rollup: 3.29.5 + + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-x64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + + '@sinclair/typebox@0.34.41': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@solana/codecs-core@3.0.3(typescript@5.9.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@3.0.3(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) + '@solana/errors': 3.0.3(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@3.0.3(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.3) + '@solana/errors': 3.0.3(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-strings@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) + '@solana/errors': 3.0.3(typescript@5.9.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.3) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@3.0.3(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.0 + typescript: 5.9.3 + + '@solana/eslint-config-solana@5.0.0(@eslint/js@9.37.0)(@types/eslint__js@8.42.3)(eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.37.0))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0))(eslint-plugin-sort-keys-fix@1.1.2)(eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(globals@14.0.0)(jest@30.2.0(@types/node@24.7.2))(typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@eslint/js': 9.37.0 + '@types/eslint__js': 8.42.3 + eslint: 9.37.0 + eslint-plugin-jest: 29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.37.0) + eslint-plugin-sort-keys-fix: 1.1.2 + eslint-plugin-typescript-sort-keys: 3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3) + globals: 14.0.0 + jest: 30.2.0(@types/node@24.7.2) + typescript: 5.9.3 + typescript-eslint: 8.46.0(eslint@9.37.0)(typescript@5.9.3) + + '@solana/options@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.3) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 3.0.3(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/prettier-config-solana@0.0.5(prettier@3.6.2)': + dependencies: + prettier: 3.6.2 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 + + '@types/estree@1.0.8': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/node@12.20.55': {} + + '@types/node@20.19.21': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.7.2': + dependencies: + undici-types: 7.14.0 + + '@types/semver@7.7.1': {} + + '@types/stack-utils@2.0.3': {} + + '@types/whatwg-mimetype@3.0.2': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 + eslint: 9.37.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@5.62.0(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.37.0)(typescript@5.9.3) + eslint: 9.37.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.3 + eslint: 9.37.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@8.46.0': + dependencies: + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 + + '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.37.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@8.46.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.3 + tsutils: 3.21.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + eslint: 9.37.0 + eslint-scope: 5.1.1 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + eslint: 9.37.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.46.0': + dependencies: + '@typescript-eslint/types': 8.46.0 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.2))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 7.1.9(@types/node@24.7.2) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.19 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@7.4.1: {} + + acorn@8.15.0: {} + + agadoo@3.0.0: + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@3.29.5) + acorn: 8.15.0 + rollup: 3.29.5 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + babel-jest@30.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@jest/transform': 30.2.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.2.0: + dependencies: + '@types/babel__core': 7.20.5 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + + babel-preset-jest@30.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.8.16: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.26.3: + dependencies: + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.234 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + bundle-require@5.1.0(esbuild@0.25.10): + dependencies: + esbuild: 0.25.10 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001750: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + + chardet@2.1.0: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@3.9.0: {} + + ci-info@4.3.1: {} + + cjs-module-lexer@2.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@14.0.0: {} + + commander@14.0.1: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dataloader@1.4.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dedent@1.7.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + detect-indent@6.1.0: {} + + detect-newline@3.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dotenv@8.6.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.234: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3): + dependencies: + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + eslint: 9.37.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3) + jest: 30.2.0(@types/node@24.7.2) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-react-hooks@5.2.0(eslint@9.37.0): + dependencies: + eslint: 9.37.0 + + eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0): + dependencies: + eslint: 9.37.0 + + eslint-plugin-sort-keys-fix@1.1.2: + dependencies: + espree: 6.2.1 + esutils: 2.0.3 + natural-compare: 1.4.0 + requireindex: 1.2.0 + + eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + eslint: 9.37.0 + json-schema: 0.4.0 + natural-compare-lite: 1.4.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.37.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@6.2.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-x@0.2.2: {} + + expect-type@1.2.2: {} + + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + extendable-error@0.1.7: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.19 + mlly: 1.8.0 + rollup: 4.52.4 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@14.0.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + happy-dom@18.0.1: + dependencies: + '@types/node': 20.19.21 + '@types/whatwg-mimetype': 3.0.2 + whatwg-mimetype: 3.0.0 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + human-id@4.1.2: {} + + human-signals@2.1.0: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jest-changed-files@30.2.0: + dependencies: + execa: 5.1.1 + jest-util: 30.2.0 + p-limit: 3.1.0 + + jest-circus@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.0 + is-generator-fn: 2.1.0 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + p-limit: 3.1.0 + pretty-format: 30.2.0 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.2.0(@types/node@24.7.2): + dependencies: + '@jest/core': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.2.0(@types/node@24.7.2) + jest-util: 30.2.0 + jest-validate: 30.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.2.0(@types/node@24.7.2): + dependencies: + '@babel/core': 7.28.4 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 4.3.1 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.2.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.7.2 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + + jest-docblock@30.2.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + jest-util: 30.2.0 + pretty-format: 30.2.0 + + jest-environment-node@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + + jest-haste-map@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + jest-worker: 30.2.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + pretty-format: 30.2.0 + + jest-matcher-utils@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 + + jest-message-util@30.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-util: 30.2.0 + + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): + optionalDependencies: + jest-resolve: 30.2.0 + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.2.0: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.2.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 + slash: 3.0.0 + unrs-resolver: 1.11.1 + + jest-runner@30.2.0: + dependencies: + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.2.0: + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + expect: 30.2.0 + graceful-fs: 4.2.11 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 + synckit: 0.11.11 + transitivePeerDependencies: + - supports-color + + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + ci-info: 4.3.1 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-validate@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.2.0 + + jest-watcher@30.2.0: + dependencies: + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.2.0 + string-length: 4.0.2 + + jest-worker@30.2.0: + dependencies: + '@types/node': 24.7.2 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.2.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.2.0(@types/node@24.7.2): + dependencies: + '@jest/core': 30.2.0 + '@jest/types': 30.2.0 + import-local: 3.2.0 + jest-cli: 30.2.0(@types/node@24.7.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonify@0.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + + loupe@3.2.1: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + math-intrinsics@1.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mri@1.2.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + napi-postinstall@0.3.4: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-int64@0.4.0: {} + + node-releases@2.0.23: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-keys@1.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@4.0.1: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + punycode@2.3.1: {} + + pure-rand@7.0.1: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + react-is@18.3.1: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readdirp@4.1.2: {} + + require-directory@2.1.1: {} + + requireindex@1.2.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + rimraf@6.0.1: + dependencies: + glob: 11.0.3 + package-json-from-dist: 1.0.1 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.52.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackback@0.0.2: {} + + std-env@3.9.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + term-size@2.2.1: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-interface-checker@0.1.13: {} + + tslib@1.14.1: {} + + tslib@2.8.1: + optional: true + + tsup@8.5.0(postcss@8.5.6)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.10) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.25.10 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.6) + resolve-from: 5.0.0 + rollup: 4.52.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsutils@3.21.0(typescript@5.9.3): + dependencies: + tslib: 1.14.1 + typescript: 5.9.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + eslint: 9.37.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + ufo@1.6.1: {} + + undici-types@6.21.0: {} + + undici-types@7.14.0: {} + + universalify@0.1.2: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.1.3(browserslist@4.26.3): + dependencies: + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + vite-node@3.2.4(@types/node@24.7.2): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.9(@types/node@24.7.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.1.9(@types/node@24.7.2): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.7.2 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@24.7.2)(happy-dom@18.0.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.2)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.9(@types/node@24.7.2) + vite-node: 3.2.4(@types/node@24.7.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.7.2 + happy-dom: 18.0.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + webidl-conversions@3.0.1: {} + + webidl-conversions@4.0.2: {} + + whatwg-mimetype@3.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/src/fragments/accountPage.ts b/src/fragments/accountPage.ts new file mode 100644 index 0000000..7aa1747 --- /dev/null +++ b/src/fragments/accountPage.ts @@ -0,0 +1,188 @@ +import { AccountNode, isNode, resolveNestedTypeNode } from '@codama/nodes'; +import { findProgramNodeFromPath,getLastNodeFromPath, NodePath } from '@codama/visitors-core'; + +import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; + +export function getAccountPageFragment( + scope: Pick & { + accountPath: NodePath; + size: number | null; + }, +): Fragment { + const node = getLastNodeFromPath(scope.accountPath); + const className = scope.nameApi.accountType(node.name); + const size = scope.size; + const programNode = findProgramNodeFromPath(scope.accountPath); + + // Get the account data structure + const dataTypeNode = resolveNestedTypeNode(node.data); + + // Check if this is a struct type with fields + if (dataTypeNode.kind === 'structTypeNode') { + return getStructAccountFragment(node, scope, className, size, programNode); + } + + // For simple types, create a basic account class + const typeInfo = getTypeInfo(dataTypeNode, scope.nameApi); + const borshAnnotation = getBorshAnnotation(dataTypeNode, scope.nameApi); + const allImports = ['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart', ...typeInfo.imports.filter(imp => imp !== 'dart:typed_data')]; + + // Generate PDA derivation method + const pdaMethod = generatePdaMethodForAccount(node.name, programNode); + + const content = `part '${node.name}.g.dart'; + +@BorshSerializable() +class ${className} with _$${className} { + factory ${className}({ + ${borshAnnotation} required ${typeInfo.dartType} data, + }) = _${className}; + + const ${className}._(); + + static ${className} fromBorsh(Uint8List data) { + return _$${className}FromBorsh(data); + } + +${pdaMethod} + + String _indent(String text, int level) { + final indent = ' ' * level; + return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); + } + + @override + String toString([int indent = 0]) { + final buffer = StringBuffer(); + buffer.writeln('${className}('); + buffer.writeln(_indent('data: $data', indent + 1)); + buffer.write(_indent(')', indent)); + return buffer.toString(); + } +}`; + + return createFragment(content, allImports); +} + +function getStructAccountFragment( + node: AccountNode, + scope: Pick & { + accountPath: NodePath; + size: number | null; + }, + className: string, + _size: number | null, + programNode: any, +): Fragment { + const dataTypeNode = resolveNestedTypeNode(node.data); + const fields = isNode(dataTypeNode, 'structTypeNode') ? dataTypeNode.fields : []; + + // Generate factory constructor parameters with Borsh annotations + const factoryParams = fields + .map(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + const borshAnnotation = getBorshAnnotation(field.type, scope.nameApi); + const fieldName = scope.nameApi.accountField(field.name); + return ` ${borshAnnotation} required ${typeInfo.dartType} ${fieldName},`; + }) + .join('\n'); + + // Collect all imports (filter out dart:typed_data) + const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart']); + fields.forEach(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + typeInfo.imports.filter(imp => imp !== 'dart:typed_data').forEach(imp => allImports.add(imp)); + }); + + // Generate PDA derivation method + const pdaMethod = generatePdaMethodForAccount(node.name, programNode); + + const content = `part '${node.name}.g.dart'; + +@BorshSerializable() +class ${className} with _$${className} { + factory ${className}({ +${factoryParams} + }) = _${className}; + + const ${className}._(); + + static ${className} fromBorsh(Uint8List data) { + return _$${className}FromBorsh(data); + } + +${pdaMethod} + + String _indent(String text, int level) { + final indent = ' ' * level; + return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); + } + + @override + String toString([int indent = 0]) { + final buffer = StringBuffer(); + buffer.writeln('${className}('); + ${fields.map(field => { + const fieldName = scope.nameApi.accountField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }).join('\n ')} + buffer.write(_indent(')', indent)); + return buffer.toString(); + } +}`; + + return createFragment(content, Array.from(allImports)); +} + +function generatePdaMethodForAccount(accountName: string, programNode: any): string { + const programId = programNode?.publicKey || 'Ca2XuYJBdeC4SzhNFH4sUeBxrcE5ko4Gv4VgZb917dir'; + + // PDA patterns based on analysis of the solana_music.json IDL + switch (accountName.toLowerCase()) { + case 'programconfig': + return ` /// Derives the PDA address for ProgramConfig + static Future derivePDA() { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [Uint8List.fromList([112, 114, 111, 103, 114, 97, 109, 95, 99, 111, 110, 102, 105, 103])], // "program_config" + programId: Ed25519HDPublicKey.fromBase58('${programId}'), + ); + }`; + + case 'token': + return ` /// Derives the PDA address for Token + static Future derivePDA(Ed25519HDPublicKey mint) { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [Uint8List.fromList([116, 111, 107, 101, 110]), mint.toByteArray()], // "token" + mint + programId: Ed25519HDPublicKey.fromBase58('${programId}'), + ); + }`; + + case 'user': + return ` /// Derives the PDA address for User + static Future derivePDA(Ed25519HDPublicKey user, Ed25519HDPublicKey token) { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [Uint8List.fromList([117, 115, 101, 114]), user.toByteArray(), token.toByteArray()], // "user" + user + token + programId: Ed25519HDPublicKey.fromBase58('${programId}'), + ); + }`; + + case 'tokenpricing': + return ` /// Derives the PDA address for TokenPricing + static Future derivePDA(Ed25519HDPublicKey mint) { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [Uint8List.fromList([116, 111, 107, 101, 110, 95, 112, 114, 105, 99, 105, 110, 103]), mint.toByteArray()], // "token_pricing" + mint + programId: Ed25519HDPublicKey.fromBase58('${programId}'), + ); + }`; + + default: + return ` /// Derives the PDA address for ${accountName} + /// Note: Add the correct seeds based on your account's PDA pattern + static Future derivePDA({required List seeds}) { + return Ed25519HDPublicKey.findProgramAddress( + seeds: seeds, + programId: Ed25519HDPublicKey.fromBase58('${programId}'), + ); + }`; + } +} diff --git a/src/fragments/errorPage.ts b/src/fragments/errorPage.ts new file mode 100644 index 0000000..f720ba2 --- /dev/null +++ b/src/fragments/errorPage.ts @@ -0,0 +1,54 @@ +import { ProgramNode } from '@codama/nodes'; + +import { createFragment, Fragment, RenderScope } from '../utils'; + +export function getErrorPageFragment( + scope: Pick & { + programNode: ProgramNode; + }, +): Fragment { + const { programNode, nameApi } = scope; + const className = nameApi.programErrorClass(programNode.name); + const errors = [...programNode.errors].sort((a, b) => a.code - b.code); + + // Generate error constants with individual docs + const errorConstants = errors.map(error => { + const constantName = nameApi.errorConstant(error.name); + const docs = error.docs && error.docs.length > 0 ? error.docs.join(' ') : ''; + const docComment = docs ? ` /// ${docs}\n` : ''; + return `${docComment} static const int ${constantName} = ${error.code};`; + }).join('\n'); + + // Generate error messages map + const errorMessages = errors.map(error => { + const constantName = nameApi.errorConstant(error.name); + const escapedMessage = error.message.replace(/'/g, "\\'"); + return ` ${constantName}: '${escapedMessage}',`; + }).join('\n'); + + const content = `/// Program errors for ${programNode.name} +class ${className} { +${errorConstants} + + static const Map _errorMessages = { +${errorMessages} + }; + + /// Get error message for a given error code + static String getMessage(int code) { + return _errorMessages[code] ?? 'Unknown error code: $code'; + } + + /// Check if the given code is a valid error code for this program + static bool isValidErrorCode(int code) { + return _errorMessages.containsKey(code); + } + + /// Get all error codes + static List getAllErrorCodes() { + return _errorMessages.keys.toList(); + } +}`; + + return createFragment(content, []); +} \ No newline at end of file diff --git a/src/fragments/index.ts b/src/fragments/index.ts new file mode 100644 index 0000000..5de3726 --- /dev/null +++ b/src/fragments/index.ts @@ -0,0 +1,6 @@ +export * from './accountPage'; +export * from './structType'; +export * from './instructionPage'; +export * from './instructionData'; +export * from './instructionFunction'; +export * from './errorPage'; \ No newline at end of file diff --git a/src/fragments/instructionData.ts b/src/fragments/instructionData.ts new file mode 100644 index 0000000..4fe371c --- /dev/null +++ b/src/fragments/instructionData.ts @@ -0,0 +1,128 @@ +import { InstructionNode, isNode, structTypeNodeFromInstructionArgumentNodes } from '@codama/nodes'; +import { getLastNodeFromPath, NodePath } from '@codama/visitors-core'; + +import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; + +export function getInstructionDataFragment( + scope: Pick & { + instructionPath: NodePath; + size: number | null; + }, +): Fragment | undefined { + const { instructionPath, nameApi } = scope; + const instructionNode = getLastNodeFromPath(instructionPath); + + // Skip if no arguments + if (instructionNode.arguments.length === 0) return; + + const instructionDataName = nameApi.instructionDataType(instructionNode.name); + const structNode = structTypeNodeFromInstructionArgumentNodes(instructionNode.arguments); + + // Generate factory constructor parameters with Borsh annotations (excluding discriminator) + const factoryParams = structNode.fields + .filter(field => field.name !== 'discriminator') // Exclude discriminator field + .map(field => { + const typeInfo = getTypeInfo(field.type, nameApi); + const borshAnnotation = getBorshAnnotation(field.type, nameApi); + const fieldName = nameApi.instructionField(field.name); + return ` ${borshAnnotation} required ${typeInfo.dartType} ${fieldName},`; + }) + .join('\n'); + + // Generate validation for fixed-size fields (excluding discriminator to avoid duplication) + const validations = structNode.fields + .filter(field => field.name !== 'discriminator') + .map(field => { + const fieldName = nameApi.instructionField(field.name); + + // Handle fixedSizeTypeNode + if (field.type.kind === 'fixedSizeTypeNode') { + const size = field.type.size; + if (field.type.type.kind === 'bytesTypeNode') { + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must be exactly ${size} bytes, got \${${fieldName}.length}');`; + } else if (field.type.type.kind === 'arrayTypeNode') { + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; + } + } + + // Handle arrayTypeNode with fixed count + if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { + const size = field.type.count.value; + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; + } + + return ''; + }) + .filter(v => v) + .join('\n'); + + // Add validation for discriminator (always 8 bytes) + other validations + const allValidations = validations + ? ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');\n${validations}` + : ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');`; + + // Collect all imports + const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart']); + structNode.fields.forEach(field => { + const typeInfo = getTypeInfo(field.type, nameApi); + typeInfo.imports.forEach(imp => allImports.add(imp)); + }); + + const discriminatorBytes = (() => { + const data = instructionNode.arguments.find(arg => arg.name === 'discriminator')?.defaultValue; + return data && isNode(data, 'bytesValueNode') + ? Array.from(Buffer.from(data.data, 'hex')).join(', ') + : '0, 0, 0, 0, 0, 0, 0, 0'; + })(); + + const discriminatorParam = ` @BFixedBytes(8) required Uint8List discriminator`; + const allParams = factoryParams ? `${discriminatorParam},\n${factoryParams}` : discriminatorParam; + + const content = `part '${instructionNode.name}.g.dart'; + +@BorshSerializable() +class ${instructionDataName} with _$${instructionDataName} { + static final DISCRIMINATOR = Uint8List.fromList([${discriminatorBytes}]); + factory ${instructionDataName}({ +${allParams} + }) { + // Validate fixed-size fields +${allValidations} + return _${instructionDataName}( + discriminator: discriminator, +${structNode.fields + .filter(field => field.name !== 'discriminator') + .map(field => { + const fieldName = nameApi.instructionField(field.name); + return ` ${fieldName}: ${fieldName},`; + }) + .join('\n')} + ); + } + + ${instructionDataName}._(); + + static ${instructionDataName} fromBorsh(Uint8List data) { + return _$${instructionDataName}FromBorsh(data); + } + + String _indent(String text, int level) { + final indent = ' ' * level; + return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); + } + + @override + String toString([int indent = 0]) { + final buffer = StringBuffer(); + buffer.writeln('${instructionDataName}('); + ${structNode.fields.map(field => { + const fieldName = nameApi.instructionField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }).join('\n ')} + buffer.write(_indent(')', indent)); + return buffer.toString(); + } +}`; + + return createFragment(content, Array.from(allImports)); +} diff --git a/src/fragments/instructionFunction.ts b/src/fragments/instructionFunction.ts new file mode 100644 index 0000000..c0a3c82 --- /dev/null +++ b/src/fragments/instructionFunction.ts @@ -0,0 +1,285 @@ +import { InstructionNode, isNode, PdaSeedValueNode, StandaloneValueNode } from '@codama/nodes'; +import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; + +import { createFragment, Fragment, RenderScope } from '../utils'; +import { getBuiltinProgramAddress } from '../utils/builtinPrograms'; + +export function getInstructionFunctionFragment( + scope: Pick & { + instructionPath: NodePath; + size: number | null; + }, +): Fragment | undefined { + const { instructionPath, nameApi } = scope; + const instructionNode = getLastNodeFromPath(instructionPath); + const programNode = findProgramNodeFromPath(instructionPath)!; + + const functionName = nameApi.instructionFunction(instructionNode.name); + const instructionDataName = nameApi.instructionDataType(instructionNode.name); + + const hasAccounts = instructionNode.accounts.length > 0; + const hasArguments = instructionNode.arguments.length > 0; + + // Generate function parameters + const params: string[] = []; + + // Add account parameters + if (hasAccounts) { + instructionNode.accounts.forEach(account => { + const accountName = nameApi.instructionField(account.name); + + // Check if this account has a default PDA value + const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); + + // Check if this account has a builtin program default + const builtinAddress = getBuiltinProgramAddress(account.name); + + // Check if PDA can be auto-derived (doesn't reference instruction arguments) + let canAutoderivePda = false; + if (hasDefaultPda) { + const pdaValue = account.defaultValue; + if (isNode(pdaValue.pda, 'pdaNode')) { + canAutoderivePda = true; + // Check all seeds to see if any reference instruction arguments + for (const seed of pdaValue.pda.seeds) { + if (isNode(seed, 'variablePdaSeedNode')) { + const valueSeed = pdaValue.seeds?.find( + (s: PdaSeedValueNode) => s.name === seed.name, + )?.value; + + // If seed references an instruction argument (not an account), can't auto-derive + if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { + canAutoderivePda = false; + break; + } + } + } + } + } + + if ((hasDefaultPda && canAutoderivePda) || builtinAddress) { + // Make the parameter optional if it has a derivable PDA default or builtin program default + const accountParam = `Ed25519HDPublicKey? ${accountName}`; + params.push(accountParam); + } else { + const accountParam = `required Ed25519HDPublicKey ${accountName}`; + params.push(accountParam); + } + }); + } + + // Add instruction data parameter + if (hasArguments) { + params.push(`required ${instructionDataName} data`); + } + + // Add program ID parameter (optional, with default) + params.push('Ed25519HDPublicKey? programId'); + + const parameterList = params.length > 0 ? `{\n ${params.join(',\n ')}\n}` : ''; + + // Generate PDA resolution and account metas + let pdaResolutionCode = ''; + let accountMetas = ''; + + if (hasAccounts) { + // Generate PDA resolution and builtin program defaults for accounts with default values + const pdaResolutions: string[] = []; + + instructionNode.accounts.forEach(account => { + const accountName = nameApi.instructionField(account.name); + const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); + const builtinAddress = getBuiltinProgramAddress(account.name); + + // Check if PDA can be auto-derived (doesn't reference instruction arguments) + let canAutoderivePda = false; + if (hasDefaultPda) { + const pdaValue = account.defaultValue; + if (isNode(pdaValue.pda, 'pdaNode')) { + canAutoderivePda = true; + // Check all seeds to see if any reference instruction arguments + for (const seed of pdaValue.pda.seeds) { + if (isNode(seed, 'variablePdaSeedNode')) { + const valueSeed = pdaValue.seeds?.find( + (s: PdaSeedValueNode) => s.name === seed.name, + )?.value; + + // If seed references an instruction argument (not an account), can't auto-derive + if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { + canAutoderivePda = false; + break; + } + } + } + } + } + + if (hasDefaultPda && canAutoderivePda) { + // Generate PDA derivation code only for derivable PDAs + const pdaValue = account.defaultValue; + if (isNode(pdaValue.pda, 'pdaNode')) { + const seeds = pdaValue.pda.seeds.map(seed => { + if (isNode(seed, 'constantPdaSeedNode')) { + if (isNode(seed.value, 'stringValueNode')) { + return `utf8.encode("${seed.value.string}")`; + } + if (isNode(seed.value, 'programIdValueNode')) { + return `programId.bytes`; + } + if (isNode(seed.value, 'bytesValueNode')) { + // Convert byte array to Uint8List + const byteArray = Array.from(Buffer.from(seed.value.data, 'hex')); + return `Uint8List.fromList([${byteArray.join(', ')}])`; + } + if (seed.value.kind === 'arrayValueNode' && seed.value.items) { + // Handle array of bytes like [108, 101, 32, 115, 101, 101, 100] + const bytes = seed.value.items.map((item: StandaloneValueNode) => + isNode(item, 'numberValueNode') ? item.number : 0, + ); + return `Uint8List.fromList([${bytes.join(', ')}])`; + } + } + if (isNode(seed, 'variablePdaSeedNode')) { + // For variable PDA seeds, look for the value in defaultValue.seeds + const valueSeed = pdaValue.seeds?.find( + (s: PdaSeedValueNode) => s.name === seed.name, + )?.value; + if (valueSeed && isNode(valueSeed, 'accountValueNode')) { + // This is an account seed - use the account name + const accountName = valueSeed.name; + return `${accountName}.toByteArray()`; + } + // Handle other variable seeds (would need to be provided when calling the function) + const seedName = nameApi.instructionField(seed.name); + return `${seedName}.toByteArray()`; + } + return 'utf8.encode("fallback")'; // fallback + }); + + pdaResolutions.push( + ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? ` + + `await Ed25519HDPublicKey.findProgramAddress(\n seeds: [${seeds.join(', ')}],\n programId: programId ?? Ed25519HDPublicKey.fromBase58('${programNode.publicKey ?? 'PROGRAM_ID_HERE'}'),\n );`, + ); + } + } else if (builtinAddress) { + // Generate builtin program default + pdaResolutions.push( + ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? Ed25519HDPublicKey.fromBase58('${builtinAddress}');` + ); + } + }); + + if (pdaResolutions.length > 0) { + pdaResolutionCode = pdaResolutions.join('\n') + '\n\n'; + } + + // Generate account meta list with resolved PDAs and builtin programs + const accountMetaList = instructionNode.accounts + .map(account => { + const accountName = nameApi.instructionField(account.name); + const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); + const builtinAddress = getBuiltinProgramAddress(account.name); + + // Check if PDA can be auto-derived (doesn't reference instruction arguments) + let canAutoderivePda = false; + if (hasDefaultPda) { + const pdaValue = account.defaultValue; + if (isNode(pdaValue.pda, 'pdaNode')) { + canAutoderivePda = true; + // Check all seeds to see if any reference instruction arguments + for (const seed of pdaValue.pda.seeds) { + if (isNode(seed, 'variablePdaSeedNode')) { + const valueSeed = pdaValue.seeds?.find( + (s: PdaSeedValueNode) => s.name === seed.name, + )?.value; + + // If seed references an instruction argument (not an account), can't auto-derive + if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { + canAutoderivePda = false; + break; + } + } + } + } + } + + const resolvedAccountName = ((hasDefaultPda && canAutoderivePda) || builtinAddress) + ? `resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)}` + : accountName; + + const isWriteable = account.isWritable ? 'true' : 'false'; + const isSigner = account.isSigner === true ? 'true' : 'false'; + + return ` AccountMeta(\n pubKey: ${resolvedAccountName},\n isSigner: ${isSigner},\n isWriteable: ${isWriteable},\n )`; + }) + .join(',\n'); + + accountMetas = ` final accounts = [\n${accountMetaList}\n ];\n`; + } else { + accountMetas = ' final accounts = [];\n'; + } + + // Generate instruction data serialization + let dataSerializationCode = ''; + if (hasArguments) { + dataSerializationCode = ` final instructionData = ByteArray(data.toBorsh());\n`; + } else { + dataSerializationCode = ` final instructionData = ByteArray.empty();\n`; + } + + // Determine if function needs to be async (if any derivable PDAs need to be resolved) + const needsAsync = instructionNode.accounts.some(account => { + const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); + if (!hasDefaultPda) return false; + + // Check if PDA can be auto-derived (doesn't reference instruction arguments) + const pdaValue = account.defaultValue; + if (isNode(pdaValue.pda, 'pdaNode')) { + let canAutoderive = true; + for (const seed of pdaValue.pda.seeds) { + if (isNode(seed, 'variablePdaSeedNode')) { + const valueSeed = pdaValue.seeds?.find( + (s: PdaSeedValueNode) => s.name === seed.name, + )?.value; + + // If seed references an instruction argument (not an account), can't auto-derive + if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { + canAutoderive = false; + break; + } + } + } + return canAutoderive; + } + return false; + }); + + // Generate the function body + const functionBody = `${pdaResolutionCode}${accountMetas}${dataSerializationCode} + return Instruction( + programId: programId ?? Ed25519HDPublicKey.fromBase58('${programNode.publicKey ?? 'PROGRAM_ID_HERE'}'), + accounts: accounts, + data: instructionData, + );`; + + const asyncModifier = needsAsync ? 'Future<' : ''; + const asyncSuffix = needsAsync ? '>' : ''; + const asyncKeyword = needsAsync ? 'async ' : ''; + + const content = `/// Creates a ${instructionNode.name} instruction +${asyncModifier}Instruction${asyncSuffix} ${functionName}(${parameterList}) ${asyncKeyword}{ +${functionBody} +}`; + + // Collect imports + const imports = new Set(['package:solana/solana.dart']); + + // // Add dart:convert import if we're using utf8.encode + // if (needsAsync) { + // imports.add('dart:convert'); + // } + + // Note: instruction data class is generated in the same file, no import needed + + return createFragment(content, Array.from(imports)); +} diff --git a/src/fragments/instructionPage.ts b/src/fragments/instructionPage.ts new file mode 100644 index 0000000..3b8544f --- /dev/null +++ b/src/fragments/instructionPage.ts @@ -0,0 +1,39 @@ +import { InstructionNode } from '@codama/nodes'; +import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; + +import { createFragment, Fragment, RenderScope } from '../utils'; +import { getInstructionDataFragment } from './instructionData'; +import { getInstructionFunctionFragment } from './instructionFunction'; + +export function getInstructionPageFragment( + scope: Pick & { + instructionPath: NodePath; + size: number | null; + }, +): Fragment { + const node = getLastNodeFromPath(scope.instructionPath); + if (!findProgramNodeFromPath(scope.instructionPath)) { + throw new Error('Instruction must be visited inside a program.'); + } + + const fragments: Fragment[] = []; + + // Generate instruction data type (arguments) + const dataFragment = getInstructionDataFragment(scope); + if (dataFragment) { + fragments.push(dataFragment); + } + + // Generate instruction function + const functionFragment = getInstructionFunctionFragment(scope); + if (functionFragment) { + fragments.push(functionFragment); + } + + // Combine all fragments + const content = fragments.map(f => f.content).join('\n\n'); + const imports = new Set(); + fragments.forEach(f => f.imports.forEach(imp => imports.add(imp))); + + return createFragment(content, Array.from(imports)); +} \ No newline at end of file diff --git a/src/fragments/structType.ts b/src/fragments/structType.ts new file mode 100644 index 0000000..4a68b73 --- /dev/null +++ b/src/fragments/structType.ts @@ -0,0 +1,110 @@ +import { StructTypeNode } from '@codama/nodes'; + +import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; + +export function getStructTypeFragment( + scope: Pick & { + name: string; + node: StructTypeNode; + size: number | null; + }, +): Fragment { + const { name, node, nameApi } = scope; + const className = nameApi.definedType(name); + const fields = node.fields || []; + + // Generate field declarations + const fieldDeclarations = fields.map(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + return ` ${typeInfo.dartType} ${nameApi.accountField(field.name)};`; + }).join('\n'); + + // Generate constructor parameters + const constructorParams = fields.map(field => { + return `required this.${nameApi.accountField(field.name)}`; + }).join(', '); + + // Generate validation for fixed-size fields + const validations = fields + .map(field => { + const fieldName = nameApi.accountField(field.name); + + // Handle fixedSizeTypeNode + if (field.type.kind === 'fixedSizeTypeNode') { + const size = field.type.size; + if (field.type.type.kind === 'bytesTypeNode') { + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must be exactly ${size} bytes, got \${${fieldName}.length}');`; + } else if (field.type.type.kind === 'arrayTypeNode') { + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; + } + } + + // Handle arrayTypeNode with fixed count + if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { + const size = field.type.count.value; + return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; + } + + return ''; + }) + .filter(v => v) + .join('\n'); + + // Collect all imports + const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart']); + fields.forEach(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + typeInfo.imports.forEach(imp => allImports.add(imp)); + }); + + const hasValidations = validations.length > 0; + const factoryParams = fields.map(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + const borshAnnotation = getBorshAnnotation(field.type, scope.nameApi); + const fieldName = nameApi.accountField(field.name); + return ` ${borshAnnotation} required ${typeInfo.dartType} ${fieldName},`; + }).join('\n'); + + const content = `part '${name}.g.dart'; + +@BorshSerializable() +class ${className} with _$${className} { + factory ${className}({ +${factoryParams} + })${hasValidations ? ` { + // Validate fixed-size fields +${validations} + return _${className}( +${fields.map(field => { + const fieldName = nameApi.accountField(field.name); + return ` ${fieldName}: ${fieldName},`; + }).join('\n')} + ); + }` : ` = _${className};`} + + const ${className}._(); + + static ${className} fromBorsh(Uint8List data) { + return _$${className}FromBorsh(data); + } + + String _indent(String text, int level) { + final indent = ' ' * level; + return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); + } + + @override + String toString([int indent = 0]) { + final buffer = StringBuffer(); + buffer.writeln('${className}('); + ${fields.map(field => { + const fieldName = nameApi.accountField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }).join('\n ')} + buffer.write(_indent(')', indent)); + return buffer.toString(); + } +}`; + + return createFragment(content, Array.from(allImports)); +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..0653894 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +export * from './utils'; +export * from './visitors'; + +export { renderVisitor as default } from './visitors'; \ No newline at end of file diff --git a/src/utils/builtinPrograms.ts b/src/utils/builtinPrograms.ts new file mode 100644 index 0000000..e37810a --- /dev/null +++ b/src/utils/builtinPrograms.ts @@ -0,0 +1,37 @@ +// Builtin Solana program mappings +export const BUILTIN_PROGRAMS: Record = { + clockSysvar: 'SysvarC1ock11111111111111111111111111111111', + instructionsSysvar: 'Sysvar1nstructions1111111111111111111111111', + recentBlockhashesSysvar: 'SysvarRecentB1ockHashes11111111111111111111', + rentSysvar: 'SysvarRent111111111111111111111111111111111', + systemProgram: '11111111111111111111111111111111', + tokenProgram: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', +}; + +export function getBuiltinProgramAddress(accountName: string): string | null { + const lowerName = accountName.toLowerCase(); + + // Direct mapping + if (BUILTIN_PROGRAMS[lowerName]) { + return BUILTIN_PROGRAMS[lowerName]; + } + + // Pattern matching for common variations + if (lowerName.includes('system')) { + return BUILTIN_PROGRAMS['systemProgram']; + } + if (lowerName.includes('token') && !lowerName.includes('associated')) { + return BUILTIN_PROGRAMS['tokenProgram']; + } + if (lowerName.includes('rent')) { + return BUILTIN_PROGRAMS['rentSysvar']; + } + if (lowerName.includes('clock')) { + return BUILTIN_PROGRAMS['clockSysvar']; + } + if (lowerName.includes('instruction')) { + return BUILTIN_PROGRAMS['instructionsSysvar']; + } + + return null; +} diff --git a/src/utils/fragment.ts b/src/utils/fragment.ts new file mode 100644 index 0000000..7cf4337 --- /dev/null +++ b/src/utils/fragment.ts @@ -0,0 +1,117 @@ +import { BaseFragment, createFragmentTemplate } from '@codama/renderers-core'; + +export type Fragment = BaseFragment & { + imports: Set; + libraryName?: string; +}; + +export function createFragment(content: string, imports: string[] = []): Fragment { + return { + content, + imports: new Set(imports), + libraryName: undefined, + }; +} +export function fragment(template: TemplateStringsArray, ...items: unknown[]): Fragment { + return createFragmentTemplate(template, items, isFragment, mergeFragments); +} + +export function mergeFragments(fragments: Fragment[]): Fragment { + const allImports = new Set(); + const contents: string[] = []; + + fragments.forEach(fragment => { + fragment.imports.forEach(imp => allImports.add(imp)); + if (fragment.content.trim()) { + contents.push(fragment.content); + } + }); + + return { + content: contents.join('\n\n'), + imports: allImports, + }; +} + +export function getDocblockFragment(lines: string[]): Fragment | undefined { + if (lines.length === 0) return; + if (lines.length === 1) return createFragment(`/// ${lines[0]}`); + const prefixedLines = lines.map(line => (line ? `/// ${line}` : '///')); + return createFragment(prefixedLines.join('\n')); +} + +export function getPageFragment( + page: Fragment, + options: { + addHeader?: boolean; + libraryName?: string; + } = {}, +): Fragment { + const { addHeader = true, libraryName } = options; + + // Create header fragment + const header = addHeader + ? getDocblockFragment([ + 'This code was AUTOGENERATED using the Codama library.', + 'Please DO NOT EDIT THIS FILE, instead use visitors', + 'to add features, then rerun Codama to update it.', + '', + 'See: https://github.com/codama-idl/codama', + ]) + : undefined; + + // Create library fragment + const library = libraryName ? createFragment(`library ${libraryName};`) : undefined; + + // Create imports fragment + let imports: Fragment | undefined = undefined; + if (page.imports.size > 0) { + const dartImports = Array.from(page.imports) + .filter(imp => imp.startsWith('dart:')) + .sort(); + const packageImports = Array.from(page.imports) + .filter(imp => imp.startsWith('package:')) + .sort(); + const relativeImports = Array.from(page.imports) + .filter(imp => !imp.startsWith('dart:') && !imp.startsWith('package:')) + .sort(); + + const allImports = [ + ...dartImports.map(imp => `import '${imp}';`), + ...packageImports.map(imp => `import '${imp}';`), + ...relativeImports.map(imp => `import '${imp}';`), + ]; + + if (allImports.length > 0) { + imports = createFragment(allImports.join('\n')); + } + } + + // Merge all fragments + const fragments = [header, library, imports, page].filter((f): f is Fragment => f !== undefined); + const merged = mergeFragments(fragments); + + return merged; +} + +// Helper function to add common imports +export function addImport(fragment: Fragment, importPath: string): Fragment { + const newImports = new Set(fragment.imports); + newImports.add(importPath); + + return { + ...fragment, + imports: newImports, + }; +} + +// Helper function to add multiple imports +export function addImports(fragment: Fragment, imports: string[]): Fragment { + const newImports = new Set(fragment.imports); + imports.forEach(imp => newImports.add(imp)); + + return { + ...fragment, + imports: newImports, + }; +} diff --git a/src/utils/importMap.ts b/src/utils/importMap.ts new file mode 100644 index 0000000..514cf4b --- /dev/null +++ b/src/utils/importMap.ts @@ -0,0 +1,104 @@ +export type ImportMap = Map>; + +export function createImportMap(): ImportMap { + return new Map(); +} + +export function addToImportMap(importMap: ImportMap, modulePath: string, imports: string[]): ImportMap { + const newMap = new Map(importMap); + const existing = newMap.get(modulePath) || new Set(); + imports.forEach(imp => existing.add(imp)); + newMap.set(modulePath, existing); + return newMap; +} + +export function mergeImportMaps(maps: ImportMap[]): ImportMap { + const result = createImportMap(); + maps.forEach(map => { + map.forEach((imports, modulePath) => { + const existing = result.get(modulePath) || new Set(); + imports.forEach(imp => existing.add(imp)); + result.set(modulePath, existing); + }); + }); + return result; +} + +export function importMapToString(importMap: ImportMap): string { + if (importMap.size === 0) return ''; + + const imports: string[] = []; + + // Sort import groups: dart:, package:, relative + const dartImports: [string, Set][] = []; + const packageImports: [string, Set][] = []; + const relativeImports: [string, Set][] = []; + + importMap.forEach((importSet, modulePath) => { + const entry: [string, Set] = [modulePath, importSet]; + if (modulePath.startsWith('dart:')) { + dartImports.push(entry); + } else if (modulePath.startsWith('package:')) { + packageImports.push(entry); + } else { + relativeImports.push(entry); + } + }); + + // Sort within each group + dartImports.sort(([a], [b]) => a.localeCompare(b)); + packageImports.sort(([a], [b]) => a.localeCompare(b)); + relativeImports.sort(([a], [b]) => a.localeCompare(b)); + + // Generate import statements + [...dartImports, ...packageImports, ...relativeImports].forEach(([modulePath, importSet]) => { + if (importSet.size === 0) { + imports.push(`import '${modulePath}';`); + } else { + const sortedImports = Array.from(importSet).sort(); + if (sortedImports.length === 1) { + imports.push(`import '${modulePath}' show ${sortedImports[0]};`); + } else { + imports.push(`import '${modulePath}' show ${sortedImports.join(', ')};`); + } + } + }); + + return imports.join('\n'); +} + +export type GetImportFromFunction = ( + importedName: string, + currentFilePath: string +) => string; + +export function getImportFromFactory(): GetImportFromFunction { + return (importedName: string, currentFilePath: string): string => { + // Simple relative import logic + // In a real implementation, this would be more sophisticated + const parts = currentFilePath.split('/'); + const depth = parts.length - 1; + const prefix = depth > 1 ? '../'.repeat(depth - 1) : './'; + + // Determine the import path based on naming conventions + if (importedName.endsWith('Account')) { + return `${prefix}accounts/${camelCase(importedName.replace('Account', ''))}.dart`; + } + if (importedName.endsWith('Instruction')) { + return `${prefix}instructions/${camelCase(importedName.replace('Instruction', ''))}.dart`; + } + if (importedName.endsWith('Program')) { + return `${prefix}programs/${camelCase(importedName.replace('Program', ''))}.dart`; + } + if (importedName.endsWith('Error')) { + return `${prefix}errors/${camelCase(importedName.replace('Error', ''))}.dart`; + } + + // Default to types directory + return `${prefix}types/${camelCase(importedName)}.dart`; + }; +} + +function camelCase(str: string): string { + return str.charAt(0).toLowerCase() + str.slice(1); +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..a53819d --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,6 @@ +export * from './types'; +export * from './fragment'; +export * from './importMap'; +export * from './nameTransformers'; +export * from './options'; +export * from './pubspec'; \ No newline at end of file diff --git a/src/utils/nameTransformers.ts b/src/utils/nameTransformers.ts new file mode 100644 index 0000000..a756100 --- /dev/null +++ b/src/utils/nameTransformers.ts @@ -0,0 +1,77 @@ +import { camelCase, CamelCaseString } from '@codama/nodes'; + +export type NameTransformers = { + // Variable/field names + accountField: (name: CamelCaseString) => string; + // Function names + accountFunction: (name: CamelCaseString) => string; + // Class and type names + accountType: (name: CamelCaseString) => string; + definedType: (name: CamelCaseString) => string; + errorConstant: (name: CamelCaseString) => string; + errorType: (name: CamelCaseString) => string; + + instructionDataType: (name: CamelCaseString) => string; + instructionField: (name: CamelCaseString) => string; + instructionFunction: (name: CamelCaseString) => string; + + instructionType: (name: CamelCaseString) => string; + pdaFunction: (name: CamelCaseString) => string; + + // Constants + programConstant: (name: CamelCaseString) => string; + // Error-specific names + programErrorClass: (name: CamelCaseString) => string; + + programType: (name: CamelCaseString) => string; +}; + +export const DEFAULT_NAME_TRANSFORMERS: NameTransformers = { + // Fields use camelCase + accountField: name => camelCase(name), + + // Functions use camelCase + accountFunction: name => `${camelCase(name)}Account`, + + // Classes use PascalCase + accountType: name => pascalCase(name), + + definedType: name => pascalCase(name), + + errorConstant: name => constantCase(name), + + errorType: name => `${pascalCase(name)}Error`, + + instructionDataType: name => `${pascalCase(name)}InstructionData`, + + instructionField: name => camelCase(name), + + instructionFunction: name => `${camelCase(name)}Instruction`, + + instructionType: name => `${pascalCase(name)}Instruction`, + pdaFunction: name => `derive${pascalCase(name)}Pda`, + + // Constants use UPPER_CASE + programConstant: name => constantCase(name), + + // Error-specific names + programErrorClass: name => `${pascalCase(name)}Errors`, + + programType: name => `${pascalCase(name)}Program`, +}; + +export type NameApi = NameTransformers; + +export function getNameApi(transformers: Partial = {}): NameApi { + return { ...DEFAULT_NAME_TRANSFORMERS, ...transformers }; +} + +function pascalCase(str: string): string { + return str.charAt(0).toUpperCase() + camelCase(str).slice(1); +} + +function constantCase(str: string): string { + return camelCase(str) + .replace(/([A-Z])/g, '_$1') + .toUpperCase(); +} diff --git a/src/utils/options.ts b/src/utils/options.ts new file mode 100644 index 0000000..1fadd55 --- /dev/null +++ b/src/utils/options.ts @@ -0,0 +1,61 @@ +import { CamelCaseString } from '@codama/nodes'; +import { LinkableDictionary } from '@codama/visitors-core'; + +import { GetImportFromFunction, ImportMap } from './importMap'; +import { NameApi } from './nameTransformers'; + +export type RenderOptions = GetRenderMapOptions & { + deleteFolderBeforeRendering?: boolean; + formatCode?: boolean; +}; + +export type GetRenderMapOptions = { + customAccountData?: CustomDataOptions[]; + customInstructionData?: CustomDataOptions[]; + libraryName?: string; + nameTransformers?: Partial; + outputDirectory?: string; + pubspecName?: string; + renderParentInstructions?: boolean; +}; + +export type CustomDataOptions = { + extractType: boolean; + name: CamelCaseString; +}; + +export type ParsedCustomDataOptions = Map; + +export type RenderScope = { + // Custom data handling + customAccountData: ParsedCustomDataOptions; + customInstructionData: ParsedCustomDataOptions; + + getImportFrom: GetImportFromFunction; + + // Import management + imports: ImportMap; + // Core configuration + libraryName: string; + + // Cross-reference systems + linkables: LinkableDictionary; + // Naming and transformations + nameApi: NameApi; + + outputDirectory: string; + + // Rendering options + renderParentInstructions: boolean; +}; + +export function parseCustomDataOptions( + options: CustomDataOptions[], + _prefix: string +): ParsedCustomDataOptions { + const map = new Map(); + options.forEach(option => { + map.set(option.name, option); + }); + return map; +} \ No newline at end of file diff --git a/src/utils/pda.ts b/src/utils/pda.ts new file mode 100644 index 0000000..56ade9d --- /dev/null +++ b/src/utils/pda.ts @@ -0,0 +1,107 @@ +import { camelCase, isNode, PdaNode, TypeNode } from '@codama/nodes'; + +import { Fragment, fragment, RenderScope } from './fragment'; + +export interface PdaSeedInfo { + dartType?: string; + encoding: string; + name?: string; + type: 'constant' | 'programId' | 'variable'; + value?: string; +} + +export function parsePdaSeeds(pdaNode: PdaNode): PdaSeedInfo[] { + return pdaNode.seeds.map(seed => { + if (isNode(seed, 'constantPdaSeedNode')) { + if (isNode(seed.value, 'programIdValueNode')) { + return { + encoding: 'programId.bytes', + type: 'programId', + }; + } + + // Handle different constant types + const value = isNode(seed.value, 'stringValueNode') + ? `"${seed.value.string}"` + : isNode(seed.value, 'numberValueNode') + ? seed.value.number.toString() + : 'null'; + + return { + encoding: getEncodingForType(seed.type, value), + type: 'constant', + value, + }; + } + + if (isNode(seed, 'variablePdaSeedNode')) { + const name = camelCase(seed.name); + const dartType = getDartTypeForSeed(seed.type); + + return { + dartType, + encoding: getEncodingForType(seed.type, name), + name, + type: 'variable', + }; + } + + throw new Error(`Unsupported seed type: ${(seed as TypeNode).kind}`); + }); +} + +function getDartTypeForSeed(typeNode: TypeNode): string { + // This would need to integrate with the existing type system + // For now, return basic types + if (typeNode.kind === 'stringTypeNode') return 'String'; + if (typeNode.kind === 'publicKeyTypeNode') return 'Ed25519HDPublicKey'; + if (typeNode.kind === 'numberTypeNode') return 'int'; + return 'dynamic'; +} + +function getEncodingForType(typeNode: TypeNode, value: string): string { + if (typeNode.kind === 'stringTypeNode') { + return `utf8.encode(${value})`; + } + if (typeNode.kind === 'publicKeyTypeNode') { + return `${value}.bytes`; + } + if (typeNode.kind === 'numberTypeNode') { + // Handle different number formats + return `Uint8List.fromList([${value}])`; + } + return value; +} + +export function generatePdaFunction(pdaNode: PdaNode, scope: Pick): Fragment { + const seeds = parsePdaSeeds(pdaNode); + const functionName = scope.nameApi.pdaFindFunction(pdaNode.name); + const variableSeeds = seeds.filter(s => s.type === 'variable'); + + const hasVariableSeeds = variableSeeds.length > 0; + const parameters = hasVariableSeeds ? variableSeeds.map(s => `required ${s.dartType} ${s.name}`).join(', ') : ''; + + const seedExpressions = seeds.map(seed => { + switch (seed.type) { + case 'constant': + return seed.encoding; + case 'variable': + return seed.encoding; + case 'programId': + return 'programId.bytes'; + default: + throw new Error(`Unknown seed type: ${(seed).type}`); + } + }); + + // const programAddress = pdaNode.programId || 'programId'; + + return fragment` +/// Finds the PDA address for ${pdaNode.name} +static Future ${functionName}(${parameters}${hasVariableSeeds ? ', ' : ''}Ed25519HDPublicKey programId) async { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [${seedExpressions.join(', ')}], + programId: programId, + ); +}`; +} diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts new file mode 100644 index 0000000..9ca74c5 --- /dev/null +++ b/src/utils/pubspec.ts @@ -0,0 +1,69 @@ +export function generatePubspec(packageName: string, options: { + author?: string; + dependencies?: Record; + description?: string; + devDependencies?: Record; + homepage?: string; + version?: string; +} = {}): string { + const { + description = 'Generated Dart package for Solana program interaction', + version = '1.0.0', + author, + homepage, + dependencies = {}, + devDependencies = {} + } = options; + + // Default dependencies for Solana/blockchain development with Borsh serialization + const defaultDependencies = { + 'borsh': '^0.3.2', + 'borsh_annotation': '^0.3.1', + 'solana': '^1.0.0', + ...dependencies + }; + + const defaultDevDependencies = { + 'build_runner': '^2.4.7', + 'lints': '^3.0.0', + 'test': '^1.24.0', + ...devDependencies + }; + + const sections = [ + `name: ${packageName}`, + `description: ${description}`, + `version: ${version}`, + `publish_to: none` + ]; + + if (author) { + sections.push(`author: ${author}`); + } + + if (homepage) { + sections.push(`homepage: ${homepage}`); + } + + sections.push( + '', + 'environment:', + " sdk: '>=3.0.0 <4.0.0'" + ); + + if (Object.keys(defaultDependencies).length > 0) { + sections.push('', 'dependencies:'); + Object.entries(defaultDependencies).forEach(([name, version]) => { + sections.push(` ${name}: ${version}`); + }); + } + + if (Object.keys(defaultDevDependencies).length > 0) { + sections.push('', 'dev_dependencies:'); + Object.entries(defaultDevDependencies).forEach(([name, version]) => { + sections.push(` ${name}: ${version}`); + }); + } + + return sections.join('\n') + '\n'; +} \ No newline at end of file diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..76a75f3 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,544 @@ +import { + ArrayTypeNode, + DefinedTypeLinkNode, + FixedSizeTypeNode, + NumberTypeNode, + OptionTypeNode, + resolveNestedTypeNode, + SizePrefixTypeNode, + StringTypeNode, + TypeNode, +} from '@codama/nodes'; + +import { NameApi } from './nameTransformers'; + +export interface TypeInfo { + dartType: string; + defaultValue: string; + imports: string[]; + serializationSize?: number; +} + +// We need RenderScope for name transformers when handling defined type links +export type TypeInfoScope = { + nameApi: { + definedType: (name: string) => string; + }; +}; + +export function getTypeInfo(typeNode: TypeNode, nameApi: NameApi): TypeInfo { + switch (typeNode.kind) { + case 'numberTypeNode': + return getNumberTypeInfo(typeNode as NumberTypeNode); + case 'booleanTypeNode': + return getBooleanTypeInfo(); + case 'stringTypeNode': + return getStringTypeInfo(typeNode as StringTypeNode); + case 'bytesTypeNode': + return getBytesTypeInfo(); + case 'arrayTypeNode': + return getArrayTypeInfo(typeNode as ArrayTypeNode, nameApi); + case 'optionTypeNode': + return getOptionTypeInfo(typeNode as OptionTypeNode, nameApi); + // case 'tupleTypeNode': + // return getTupleTypeInfo(typeNode as TupleTypeNode); + case 'setTypeNode': + return getSetTypeInfo(); + case 'mapTypeNode': + return getMapTypeInfo(); + case 'dateTimeTypeNode': + return getDateTimeTypeInfo(); + case 'publicKeyTypeNode': + return getPublicKeyTypeInfo(); + // case 'structTypeNode': + // return getStructTypeInfo(typeNode as StructTypeNode); + case 'fixedSizeTypeNode': + return getFixedSizeTypeInfo(typeNode as FixedSizeTypeNode, nameApi); + case 'solAmountTypeNode': + return getAmountTypeInfo(); + case 'definedTypeLinkNode': + return getDefinedTypeLinkTypeInfo(typeNode as DefinedTypeLinkNode, nameApi.definedType(typeNode.name)); + case 'sizePrefixTypeNode': + return getSizePrefixTypeInfo(typeNode as SizePrefixTypeNode); + default: + // For unsupported types, return a generic object type + console.log(`DEBUG: Unsupported type node kind: ${typeNode.kind}`, typeNode); + return { + dartType: 'Object', + defaultValue: 'Object()', + imports: [], + }; + } +} + +function getNumberTypeInfo(node: NumberTypeNode): TypeInfo { + const { format } = node; + + // Map Codama number formats to Dart types + switch (format) { + case 'u8': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 1, + }; + case 'u16': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 2, + }; + case 'u32': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 4, + }; + case 'u64': + return { + dartType: 'BigInt', + defaultValue: 'BigInt.zero', + imports: [], + serializationSize: 8, + }; + case 'u128': + return { + dartType: 'BigInt', + defaultValue: 'BigInt.zero', + imports: [], + serializationSize: 16, + }; + case 'i8': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 1, + }; + case 'i16': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 2, + }; + case 'i32': + return { + dartType: 'int', + defaultValue: '0', + imports: [], + serializationSize: 4, + }; + case 'i64': + return { + dartType: 'BigInt', + defaultValue: 'BigInt.zero', + imports: [], + serializationSize: 8, + }; + case 'i128': + return { + dartType: 'BigInt', + defaultValue: 'BigInt.zero', + imports: [], + serializationSize: 16, + }; + case 'f32': + return { + dartType: 'double', + defaultValue: '0.0', + imports: [], + serializationSize: 4, + }; + case 'f64': + return { + dartType: 'double', + defaultValue: '0.0', + imports: [], + serializationSize: 8, + }; + default: + return { + dartType: 'num', + defaultValue: '0', + imports: [], + }; + } +} + +function getBooleanTypeInfo(): TypeInfo { + return { + dartType: 'bool', + defaultValue: 'false', + imports: [], + serializationSize: 1, + }; +} + +function getStringTypeInfo(_node: StringTypeNode): TypeInfo { + return { + dartType: 'String', + defaultValue: "''", + imports: [], + // Variable size - will need length prefix + }; +} + +function getBytesTypeInfo(): TypeInfo { + return { + dartType: 'Uint8List', + defaultValue: 'Uint8List(0)', + imports: [], + // Variable size - will need length prefix + }; +} + +function getArrayTypeInfo(node: ArrayTypeNode, nameApi: NameApi): TypeInfo { + // Resolve the nested type to get the actual item type + const resolvedType = resolveNestedTypeNode(node.item); + const innerTypeInfo = getTypeInfo(resolvedType, nameApi); + + // Check if this is a fixed-size array + if (node.count && node.count.kind === 'fixedCountNode') { + const size = node.count.value; + return { + dartType: `List<${innerTypeInfo.dartType}>`, + defaultValue: `List.filled(${size}, ${innerTypeInfo.defaultValue})`, + imports: innerTypeInfo.imports, + serializationSize: size, // Mark as fixed size + }; + } + + return { + dartType: `List<${innerTypeInfo.dartType}>`, + defaultValue: 'const []', + imports: innerTypeInfo.imports, + // Variable size + }; +} + +function getOptionTypeInfo(node: OptionTypeNode, nameApi: NameApi): TypeInfo { + // Resolve the nested type to get the actual inner type + const resolvedType = resolveNestedTypeNode(node.item); + const innerTypeInfo = getTypeInfo(resolvedType, nameApi); + + // Dart doesn't have built-in Option, we'll use nullable types + return { + dartType: `${innerTypeInfo.dartType}?`, + defaultValue: 'null', + imports: innerTypeInfo.imports, + // Variable size depending on content + }; +} + +// function getTupleTypeInfo(_node: TupleTypeNode): TypeInfo { +// // Dart doesn't have built-in tuples, we'll use List + +// return { +// dartType: 'List', +// defaultValue: 'const []', +// imports: [], +// }; +// } + +function getSetTypeInfo(): TypeInfo { + return { + dartType: 'Set', + defaultValue: 'const {}', + imports: [], + }; +} + +function getMapTypeInfo(): TypeInfo { + return { + dartType: 'Map', + defaultValue: 'const {}', + imports: [], + }; +} + +function getDateTimeTypeInfo(): TypeInfo { + return { + dartType: 'DateTime', + defaultValue: 'DateTime.now()', + imports: [], + serializationSize: 8, // Usually stored as timestamp + }; +} + +function getPublicKeyTypeInfo(): TypeInfo { + return { + dartType: 'Ed25519HDPublicKey', + defaultValue: 'Ed25519HDPublicKey.fromBase58("11111111111111111111111111111111")', + imports: ['package:solana/solana.dart'], + serializationSize: 32, // Solana public keys are 32 bytes + }; +} + +function getFixedSizeTypeInfo(node: FixedSizeTypeNode, nameApi: NameApi): TypeInfo { + // Resolve the nested type to get the actual inner type + const resolvedType = resolveNestedTypeNode(node.type); + + // Special case: fixed-size byte arrays should be Uint8List + if (resolvedType.kind === 'bytesTypeNode') { + return { + dartType: 'Uint8List', + defaultValue: `Uint8List(${node.size})`, + imports: [], + serializationSize: node.size, + }; + } + + const innerTypeInfo = getTypeInfo(resolvedType, nameApi); + + // For other fixed-size arrays, create List + return { + dartType: `List<${innerTypeInfo.dartType}>`, + defaultValue: `List.filled(${node.size}, ${innerTypeInfo.defaultValue})`, + imports: innerTypeInfo.imports, + serializationSize: node.size, + }; +} + +// function getStructTypeInfo(node: StructTypeNode): TypeInfo { +// // For struct types, we need to generate a custom class +// // This is a placeholder - the actual class generation happens in fragments +// // We return a generic name that will be replaced with the actual class name +// return { +// dartType: 'Object', // Will be replaced with actual struct class name +// defaultValue: 'Object()', // Will be replaced with actual constructor +// imports: [], +// // Size depends on the fields - calculated elsewhere +// }; +// } + +function getAmountTypeInfo(): TypeInfo { + return { + dartType: 'BigInt', + defaultValue: 'BigInt.zero', + imports: [], + serializationSize: 8, + }; +} + +export function generateDartSerialization(typeInfo: TypeInfo, fieldName: string): string { + const { dartType, serializationSize } = typeInfo; + + if (dartType === 'bool') { + return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType === 'int' && serializationSize) { + return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType === 'double' && serializationSize) { + return `// TODO: Handle ${serializationSize}-byte float serialization for ${fieldName}`; + } + + if (dartType === 'BigInt' && serializationSize) { + return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType === 'String' && serializationSize === 32) { + return `// TODO: Handle PublicKey serialization for ${fieldName} (32 bytes)`; + } + + if (dartType === 'String') { + return `// TODO: Handle String serialization for ${fieldName}`; + } + + if (dartType === 'Uint8List') { + return `// TODO: Handle Uint8List serialization for ${fieldName}`; + } + + if (dartType === 'List' && serializationSize) { + return `// TODO: Handle fixed-size byte array serialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType.startsWith('List<') || dartType.startsWith('Set<') || dartType.startsWith('Map<')) { + return `// TODO: Handle collection serialization for ${fieldName}`; + } + + return `// TODO: Handle serialization for ${fieldName} of type ${dartType}`; +} + +export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string { + switch (typeNode.kind) { + case 'numberTypeNode': { + const numberFormat = (typeNode as NumberTypeNode).format; + switch (numberFormat) { + case 'u8': + case 'i8': + return '@BU8()'; + case 'u16': + case 'i16': + return '@BU16()'; + case 'u32': + case 'i32': + return '@BU32()'; + case 'u64': + case 'i64': + return '@BU64()'; + case 'u128': + case 'i128': + return '@BU128()'; + case 'f32': + return '@BF32()'; + case 'f64': + return '@BF64()'; + default: + return '@BU8()'; // fallback + } + } + case 'booleanTypeNode': + return '@BBool()'; + case 'stringTypeNode': + return '@BString()'; + case 'bytesTypeNode': + return '@BBytes()'; + case 'publicKeyTypeNode': + return '@BPublicKey()'; // Use custom BPublicKey annotation + case 'fixedSizeTypeNode': { + const fixedNode = typeNode as FixedSizeTypeNode; + const resolvedType = resolveNestedTypeNode(fixedNode.type); + if (resolvedType.kind === 'bytesTypeNode') { + return `@BFixedBytes(${fixedNode.size})`; + } + const innerAnnotation = getBorshAnnotation(resolvedType, nameApi); + return `@BFixedArray(${fixedNode.size}, ${innerAnnotation.replace('@', '')})`; + } + case 'arrayTypeNode': { + const arrayNode = typeNode as ArrayTypeNode; + // Don't resolve nested types here - pass the original item type to getBorshAnnotation + const arrayInnerAnnotation = getBorshAnnotation(arrayNode.item, nameApi); + + // Check if this is a fixed-size array + if (arrayNode.count && arrayNode.count.kind === 'fixedCountNode') { + const size = arrayNode.count.value; + return `@BFixedArray(${size}, ${arrayInnerAnnotation.replace('@', '')})`; + } + + return `@BArray(${arrayInnerAnnotation.replace('@', '')})`; + } + case 'optionTypeNode': { + const optionNode = typeNode as OptionTypeNode; + const optionResolvedType = resolveNestedTypeNode(optionNode.item); + const optionInnerAnnotation = getBorshAnnotation(optionResolvedType, nameApi); + return `@BOption(${optionInnerAnnotation.replace('@', '')})`; + } + case 'definedTypeLinkNode': { + const definedTypeNode = typeNode as DefinedTypeLinkNode; + const className = nameApi.definedType(definedTypeNode.name); + return `@BCustom(B${className}())`; + } + case 'sizePrefixTypeNode': { + const sizePrefixNode = typeNode as SizePrefixTypeNode; + const resolvedType = resolveNestedTypeNode(sizePrefixNode.type); + + // If it's bytes with size prefix, use BBytes (variable length bytes with u32 prefix) + if (resolvedType.kind === 'bytesTypeNode') { + return '@BBytes()'; + } + + // For other size-prefixed types (like strings), use BString + return '@BString()'; + } + default: + return '@BArray(BU8())'; // fallback for unsupported types + } +} + +export function generateDartDeserialization(typeInfo: TypeInfo, fieldName: string): string { + const { dartType, serializationSize } = typeInfo; + + if (dartType === 'bool') { + return `${fieldName} = data.getUint8(offset) != 0; offset += 1;`; + } + + if (dartType === 'int' && serializationSize) { + switch (serializationSize) { + case 1: + return `${fieldName} = data.getUint8(offset); offset += 1;`; + case 2: + return `${fieldName} = data.getUint16(offset, Endian.little); offset += 2;`; + case 4: + return `${fieldName} = data.getUint32(offset, Endian.little); offset += 4;`; + default: + return `// TODO: Handle ${serializationSize}-byte integer deserialization for ${fieldName}`; + } + } + + if (dartType === 'double' && serializationSize) { + switch (serializationSize) { + case 4: + return `${fieldName} = data.getFloat32(offset, Endian.little); offset += 4;`; + case 8: + return `${fieldName} = data.getFloat64(offset, Endian.little); offset += 8;`; + default: + return `// TODO: Handle ${serializationSize}-byte float deserialization for ${fieldName}`; + } + } + + if (dartType === 'BigInt' && serializationSize) { + return `// TODO: Handle BigInt deserialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType === 'String' && serializationSize === 32) { + return `// TODO: Handle PublicKey deserialization for ${fieldName} (32 bytes)`; + } + + if (dartType === 'String') { + return `// TODO: Handle String deserialization for ${fieldName}`; + } + + if (dartType === 'Uint8List') { + return `// TODO: Handle Uint8List deserialization for ${fieldName}`; + } + + if (dartType === 'List' && serializationSize) { + return `// TODO: Handle fixed-size byte array deserialization for ${fieldName} (${serializationSize} bytes)`; + } + + if (dartType.startsWith('List<')) { + return `// TODO: Handle List deserialization for ${fieldName}`; + } + + return `// TODO: Handle deserialization for ${fieldName} of type ${dartType}`; +} + +function getDefinedTypeLinkTypeInfo(node: DefinedTypeLinkNode, className: string): TypeInfo { + // Generate import path for the custom type + // Assuming types are in '../types/' directory relative to accounts + const importPath = `../types/${node.name}.dart`; + + return { + dartType: className, + defaultValue: `${className}()`, // Assumes a default constructor + imports: [importPath], + }; +} + +function getSizePrefixTypeInfo(node: SizePrefixTypeNode): TypeInfo { + // Resolve the nested type to see what we're prefixing + const resolvedType = resolveNestedTypeNode(node.type); + + // If it's bytes, return Uint8List + if (resolvedType.kind === 'bytesTypeNode') { + return { + dartType: 'Uint8List', + defaultValue: 'Uint8List(0)', + imports: [], + }; + } + + // For other size-prefixed types, default to String (like prefixed strings) + return { + dartType: 'String', + defaultValue: "''", + imports: [], + }; +} diff --git a/src/visitors/getRenderMapVisitor.ts b/src/visitors/getRenderMapVisitor.ts new file mode 100644 index 0000000..d310cec --- /dev/null +++ b/src/visitors/getRenderMapVisitor.ts @@ -0,0 +1,146 @@ +import { camelCase, getAllInstructionsWithSubs, getAllPrograms } from '@codama/nodes'; +import { createRenderMap, mergeRenderMaps } from '@codama/renderers-core'; +import { + extendVisitor, + getByteSizeVisitor, + LinkableDictionary, + NodeStack, + pipe, + recordLinkablesOnFirstVisitVisitor, + recordNodeStackVisitor, + staticVisitor, + visit, +} from '@codama/visitors-core'; + +import { getAccountPageFragment, getErrorPageFragment, getInstructionPageFragment, getStructTypeFragment } from '../fragments'; +import { + createImportMap, + Fragment, + generatePubspec, + getImportFromFactory, + getNameApi, + getPageFragment, + GetRenderMapOptions, + parseCustomDataOptions, + RenderScope, +} from '../utils'; + +export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { + const linkables = new LinkableDictionary(); + const stack = new NodeStack(); + + const byteSizeVisitor = getByteSizeVisitor(linkables, { stack }); + const libraryName = options.libraryName ?? 'generated'; + const outputDirectory = options.outputDirectory ?? 'lib'; + + // Create the complete render scope + const renderScope: RenderScope = { + customAccountData: parseCustomDataOptions(options.customAccountData ?? [], 'AccountData'), + customInstructionData: parseCustomDataOptions(options.customInstructionData ?? [], 'InstructionData'), + getImportFrom: getImportFromFactory(), + imports: createImportMap(), + libraryName, + linkables, + nameApi: getNameApi(options.nameTransformers), + outputDirectory, + renderParentInstructions: options.renderParentInstructions ?? false, + }; + + const asPage = ( + fragment: TFragment, + pageOptions: { libraryName?: string } = {}, + ): TFragment => { + if (!fragment) return undefined as TFragment; + return getPageFragment(fragment, pageOptions) as TFragment; + }; + + return pipe( + staticVisitor(() => createRenderMap(), { + keys: ['rootNode', 'programNode', 'pdaNode', 'accountNode', 'definedTypeNode', 'instructionNode'], + }), + v => + extendVisitor(v, { + visitAccount(node) { + const size = visit(node, byteSizeVisitor); + return createRenderMap( + `${outputDirectory}/accounts/${camelCase(node.name)}.dart`, + asPage( + getAccountPageFragment({ + ...renderScope, + accountPath: stack.getPath('accountNode'), + size, + }), + ), + ); + }, + + visitDefinedType(node) { + // Check if this is a struct type + if (node.type.kind === 'structTypeNode') { + return createRenderMap( + `${outputDirectory}/types/${camelCase(node.name)}.dart`, + asPage( + getStructTypeFragment({ + ...renderScope, + name: node.name, + node: node.type, + size: visit(node, byteSizeVisitor), + }), + ), + ); + } + // TODO: Implement other defined type fragments + return createRenderMap(); + }, + + visitInstruction(node) { + return createRenderMap( + `${outputDirectory}/instructions/${camelCase(node.name)}.dart`, + asPage( + getInstructionPageFragment({ + ...renderScope, + instructionPath: stack.getPath('instructionNode'), + size: visit(node, byteSizeVisitor), + }), + ), + ); + }, + + visitPda(_node) { + // PDA functionality is handled via existing pda.ts utilities in instruction generation + return createRenderMap(); + }, + + visitProgram(node, { self }) { + return mergeRenderMaps([ + createRenderMap({ + [`${outputDirectory}/programs/${camelCase(node.name)}.dart`]: undefined, // TODO: Implement program fragment + [`${outputDirectory}/errors/${camelCase(node.name)}.dart`]: node.errors.length > 0 ? + asPage(getErrorPageFragment({ ...renderScope, programNode: node })) : undefined, + }), + ...node.pdas.map(p => visit(p, self)), + ...node.accounts.map(a => visit(a, self)), + ...node.definedTypes.map(t => visit(t, self)), + ...getAllInstructionsWithSubs(node, { leavesOnly: true }).map(i => visit(i, self)), + ]); + }, + + visitRoot(node, { self }) { + const pubspecContent = generatePubspec(libraryName, { + description: `Generated Dart package for ${libraryName} Solana program interaction`, + version: '1.0.0', + }); + + return mergeRenderMaps([ + createRenderMap({ + [`${outputDirectory}/${libraryName}.dart`]: undefined, // TODO: Implement library index fragment + [`pubspec.yaml`]: pubspecContent, + }), + ...getAllPrograms(node).map(p => visit(p, self)), + ]); + }, + }), + v => recordNodeStackVisitor(v, stack), + v => recordLinkablesOnFirstVisitVisitor(v, linkables), + ); +} diff --git a/src/visitors/index.ts b/src/visitors/index.ts new file mode 100644 index 0000000..5daccd5 --- /dev/null +++ b/src/visitors/index.ts @@ -0,0 +1,2 @@ +export * from './getRenderMapVisitor'; +export * from './renderVisitor'; \ No newline at end of file diff --git a/src/visitors/renderVisitor.ts b/src/visitors/renderVisitor.ts new file mode 100644 index 0000000..b3eeaee --- /dev/null +++ b/src/visitors/renderVisitor.ts @@ -0,0 +1,23 @@ +import { deleteDirectory, writeRenderMap } from '@codama/renderers-core'; +import { rootNodeVisitor, visit } from '@codama/visitors-core'; + +import { RenderOptions } from '../utils'; +import { getRenderMapVisitor } from './getRenderMapVisitor'; + +export function renderVisitor(path: string, options: RenderOptions = {}) { + return rootNodeVisitor(root => { + // Delete existing generated folder. + if (options.deleteFolderBeforeRendering ?? true) { + deleteDirectory(path); + } + + // Render the new files. + const renderMap = visit(root, getRenderMapVisitor(options)); + + // Format the code using dart format if requested. + // For Dart code, we could use `dart format` command here in the future + // For now, we'll skip formatting and rely on the user's IDE/toolchain + + writeRenderMap(renderMap, path); + }); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1b0281f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "composite": false, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "inlineSources": false, + "isolatedModules": true, + "lib": [], + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "preserveWatchOutput": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext" + }, + "display": "@codama/renderers-js", + "include": ["src", "test", "tsup.config.ts"], + "exclude": ["node_modules", "test/e2e"] +} From 3f66b3151f960b441938751ef9e891fe43f57f72 Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Tue, 14 Oct 2025 09:17:06 +0300 Subject: [PATCH 02/16] fix: pda derrivation --- README.md | 138 +++- package.json | 59 +- pnpm-lock.yaml | 1098 +------------------------- src/fragments/accountPage.ts | 93 +-- src/fragments/errorPage.ts | 28 +- src/fragments/index.ts | 4 +- src/fragments/instructionData.ts | 18 +- src/fragments/instructionFunction.ts | 70 +- src/fragments/instructionPage.ts | 7 +- src/fragments/libraryIndex.ts | 65 ++ src/fragments/programPage.ts | 32 + src/fragments/structType.ts | 64 +- src/index.ts | 2 +- src/utils/builtinPrograms.ts | 47 +- src/utils/fragment.ts | 12 + src/utils/importMap.ts | 23 +- src/utils/index.ts | 2 +- src/utils/options.ts | 19 +- src/utils/pda.ts | 162 ++-- src/utils/pubspec.ts | 101 ++- src/visitors/getRenderMapVisitor.ts | 87 +- src/visitors/index.ts | 2 +- src/visitors/renderVisitor.ts | 27 +- tsconfig.declarations.json | 9 + tsconfig.json | 2 +- tsup.config.ts | 28 + 26 files changed, 671 insertions(+), 1528 deletions(-) create mode 100644 src/fragments/libraryIndex.ts create mode 100644 src/fragments/programPage.ts create mode 100644 tsconfig.declarations.json create mode 100644 tsup.config.ts diff --git a/README.md b/README.md index 4efca17..2d6e9ee 100644 --- a/README.md +++ b/README.md @@ -1 +1,137 @@ -# codama-dart \ No newline at end of file +# Codama ➤ Renderers ➤ Dart + +[![npm][npm-image]][npm-url] +[![npm-downloads][npm-downloads-image]][npm-url] + +[npm-downloads-image]: https://img.shields.io/npm/dm/@limechain/renderers-dart.svg?style=flat +[npm-image]: https://img.shields.io/npm/v/@limechain/renderers-dart.svg?style=flat&label=%40codama%2Frenderers-dart +[npm-url]: https://www.npmjs.com/package/@limechain/renderers-dart + +This package generates Dart clients from your Codama IDLs. The generated clients are compatible with the [`solana` Dart package](https://pub.dev/packages/solana). + +## Installation + +```sh +pnpm install @limechain/renderers-dart +``` + +## Usage + +Add the following script to your Codama configuration file. + +```json +{ + "idl": "path/to/idl", + "before": [], + "scripts": { + "dart": [ + { + "from": "@limechain/renderers-dart", + "args": ["generated"] + } + ] + } +} +``` + +An object can be passed as a second argument to further configure the renderer. See the [Options](#options) section below for more details. + +## Generated Output + +The renderer generates a complete Dart package with the following structure: + +``` +lib/ +├── lib.dart # Main library export file +├── accounts/ # Account data classes +│ +├── instructions/ # Instruction functions +│ +├── types/ # Custom type definitions +│ +├── errors/ # Program error classes +│ +├── pdas/ # PDA derivation functions +│ +└── programs/ # Program constants and metadata +``` + +## Features + +- **Account Serialization/Deserialization**: Automatic Borsh serialization for all account types +- **Instruction Builders**: Type-safe instruction creation with automatic PDA resolution +- **PDA Derivation**: Automatic generation of PDA derivation functions +- **Error Handling**: Strongly-typed program error definitions +- **Type Safety**: Full Dart type safety with null safety support + +## Options + +The `renderVisitor` accepts the following options. + +| Name | Type | Default | Description | +| ----------------------- | --------------------------- | ------- | -------------------------------------------------------------------------------------------- | +| `libraryName` | `string` | `'lib'` | The name of the generated Dart library. | +| `outputDirectory` | `string` | `'lib'` | The directory where generated files will be placed. | +| `customAccountData` | `string[]` | `[]` | The names of all `AccountNodes` whose data should be manually written in Dart. | +| `customInstructionData` | `string[]` | `[]` | The names of all `InstructionNodes` whose data should be manually written in Dart. | +| `nameTransformers` | `Partial` | `{}` | An object that enables us to override the names of any generated type, constant or function. | + +## Example + +Here's an example of using a generated Dart client: + +```dart +import 'package:solana/solana.dart'; +import 'lib/generated.dart'; + +void main() async { + // Create a connection to Solana + final connection = SolanaClient.mainnet(); + + // Create instruction with automatic PDA resolution + final instruction = await initializeInstruction( + admin: adminPublicKey, + initialBonus: 10, + ); + + // Build and send transaction + final transaction = Transaction( + instructions: [instruction], + recentBlockhash: await connection.getLatestBlockhash(), + ); + + await connection.sendTransaction(transaction, [adminKeypair]); +} +``` + +## Generated PDA Functions + +The renderer automatically generates PDA derivation functions: + +```dart +// Generated PDA function +Future findConfigPda() async { + return Ed25519HDPublicKey.findProgramAddress( + seeds: [utf8.encode("program_config")], + programId: Ed25519HDPublicKey.fromBase58('PROGRAM_ID_HERE'), + ); +} + +// Usage +final configPda = await findConfigPda(); +``` + +## Dependencies + +Generated Dart code depends on: + +- `solana`: For Solana blockchain interaction +- `dart:convert`: For UTF-8 encoding +- `dart:typed_data`: For byte array handling + +Make sure to add these to your `pubspec.yaml`: + +```yaml +dependencies: + solana: ^0.30.0 +``` diff --git a/package.json b/package.json index 49a159a..2f43460 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,14 @@ { - "name": "@codama/renderers-dart", - "version": "1.4.2", - "description": "Dart", + "name": "@limechain/renderers-dart", + "version": "1.0.0", + "description": "Dart renderer for Codama IDLs", "exports": { "types": "./dist/types/index.d.ts", - "react-native": "./dist/index.react-native.mjs", - "browser": { - "import": "./dist/index.browser.mjs", - "require": "./dist/index.browser.cjs" - }, - "node": { - "import": "./dist/index.node.mjs", - "require": "./dist/index.node.cjs" - } - }, - "browser": { - "./dist/index.node.cjs": "./dist/index.browser.cjs", - "./dist/index.node.mjs": "./dist/index.browser.mjs" + "import": "./dist/index.node.mjs", + "require": "./dist/index.node.cjs" }, "main": "./dist/index.node.cjs", "module": "./dist/index.node.mjs", - "react-native": "./dist/index.react-native.mjs", "types": "./dist/types/index.d.ts", "type": "commonjs", "files": [ @@ -28,66 +16,39 @@ "./dist/index.*" ], "sideEffects": false, - "keywords": [ - "solana", - "framework", - "standard", - "renderers", - "js", - "client" - ], "scripts": { "build": "rimraf dist && tsup && tsc -p ./tsconfig.declarations.json", - "dev": "vitest --project node", "lint": "eslint . && prettier --check .", "lint:fix": "eslint --fix . && prettier --write .", - "publish-package": "pnpm build && changeset publish", - "test": "pnpm test:types && pnpm test:treeshakability && pnpm test:unit && pnpm test:e2e && pnpm test:exports", - "test:e2e": "./test/e2e/test.sh", - "test:exports": "node ./test/exports/module.mjs && node ./test/exports/commonjs.cjs", - "test:treeshakability": "for file in dist/index.*.mjs; do agadoo $file; done", - "test:types": "tsc --noEmit", - "test:unit": "vitest run" + "test:types": "tsc --noEmit" }, "dependencies": { - "@codama/errors": "^1.3.7", "@codama/nodes": "^1.3.7", "@codama/renderers-core": "^1.2.2", "@codama/visitors-core": "^1.3.7", - "@solana/codecs-strings": "^3.0.3", "prettier": "^3.6.2" }, "devDependencies": { - "@codama/nodes-from-anchor": "^1.2.9", - "@changesets/changelog-github": "^0.5.1", - "@changesets/cli": "^2.29.7", "@solana/eslint-config-solana": "^5.0.0", "@solana/prettier-config-solana": "0.0.5", "@types/node": "^24", - "agadoo": "^3.0.0", "eslint": "^9.35.0", - "happy-dom": "^18.0.1", "prettier": "^3.6.2", - "rimraf": "6.0.1", "tsup": "^8.5.0", "typescript": "^5.9.2", - "vitest": "^3.2.4" + "rimraf": "6.0.1" }, "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/codama-idl/renderers-js" + "url": "https://github.com/limechain/renderers-dart" }, "bugs": { - "url": "http://github.com/codama-idl/renderers-js/issues" + "url": "https://github.com/limechain/renderers-dart/issues" }, - "browserslist": [ - "supports bigint and not dead", - "maintained node versions" - ], "engines": { "node": ">=20.18.0" }, "packageManager": "pnpm@10.15.1", "prettier": "@solana/prettier-config-solana" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0d654c..4c48405 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@codama/errors': - specifier: ^1.3.7 - version: 1.3.7 '@codama/nodes': specifier: ^1.3.7 version: 1.3.7 @@ -20,22 +17,10 @@ importers: '@codama/visitors-core': specifier: ^1.3.7 version: 1.3.7 - '@solana/codecs-strings': - specifier: ^3.0.3 - version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) prettier: specifier: ^3.6.2 version: 3.6.2 devDependencies: - '@changesets/changelog-github': - specifier: ^0.5.1 - version: 0.5.1 - '@changesets/cli': - specifier: ^2.29.7 - version: 2.29.7(@types/node@24.7.2) - '@codama/nodes-from-anchor': - specifier: ^1.2.9 - version: 1.2.9(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/eslint-config-solana': specifier: ^5.0.0 version: 5.0.0(@eslint/js@9.37.0)(@types/eslint__js@8.42.3)(eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.37.0))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0))(eslint-plugin-sort-keys-fix@1.1.2)(eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(globals@14.0.0)(jest@30.2.0(@types/node@24.7.2))(typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3))(typescript@5.9.3) @@ -45,15 +30,9 @@ importers: '@types/node': specifier: ^24 version: 24.7.2 - agadoo: - specifier: ^3.0.0 - version: 3.0.0 eslint: specifier: ^9.35.0 version: 9.37.0 - happy-dom: - specifier: ^18.0.1 - version: 18.0.1 rimraf: specifier: 6.0.1 version: 6.0.1 @@ -63,9 +42,6 @@ importers: typescript: specifier: ^5.9.2 version: 5.9.3 - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@24.7.2)(happy-dom@18.0.1) packages: @@ -219,10 +195,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -238,67 +210,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@changesets/apply-release-plan@7.0.13': - resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} - - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - - '@changesets/changelog-github@0.5.1': - resolution: {integrity: sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ==} - - '@changesets/cli@2.29.7': - resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} - hasBin: true - - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - - '@changesets/get-github-info@0.6.0': - resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - - '@changesets/get-release-plan@4.0.13': - resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@codama/errors@1.3.7': resolution: {integrity: sha512-96BF8agDVc2vAgL4qw1lZZfuJ7XBefdzTBk2VOUnOhdMQiLb0QhJCC4BH88OcL+rZXQdet4pk7Qwarj1I1GFKg==} hasBin: true @@ -306,9 +217,6 @@ packages: '@codama/node-types@1.3.7': resolution: {integrity: sha512-L9UTFfoeki5t+BYJAa4OMsqBPpbMbx8YJQar+55mYcjwGlJsKJW7mRfLYvwEFkCUYyLdNva40OVmTf88jccZCA==} - '@codama/nodes-from-anchor@1.2.9': - resolution: {integrity: sha512-n+53VumtguLeSzGWZLpJqWRqs+r8NkWb1w8Ci0AuWQ6Qwfbbk9LknUg1XkqpgZZuq2Hh/Xoy28yHBl2JeIXi3w==} - '@codama/nodes@1.3.7': resolution: {integrity: sha512-3OV6SIBcqsIDARyzZVGdfnffNlnKSYcb0aGp/9Liz5/EID0oBTIyuh/Cmj5Ww6RX4WPb+GNAxABAGW94zbcfQg==} @@ -318,9 +226,6 @@ packages: '@codama/visitors-core@1.3.7': resolution: {integrity: sha512-B1JnzhRDJiLxewha/F3YzeEp8Zrtd7eKiGNJFJHSPufAnIVm2lQUDaKS+OrAOHnSRmRKIAVdzfpFpdz6EM0N6Q==} - '@codama/visitors@1.3.7': - resolution: {integrity: sha512-pIVK84G4dquvDXmr0q9GACcwDROw7DOBz0Kk/qt837FsKYr37xc6nU2LIguXu8QVIFOHBZk1HVAb7/S0eo/dqg==} - '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} @@ -540,15 +445,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/external-editor@1.0.2': - resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -667,19 +563,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -700,15 +586,6 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/plugin-virtual@3.0.2': - resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/rollup-android-arm-eabi@4.52.4': resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] @@ -828,44 +705,6 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@solana/codecs-core@3.0.3': - resolution: {integrity: sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@3.0.3': - resolution: {integrity: sha512-R15cLp8riJvToXziW8lP6AMSwsztGhEnwgyGmll32Mo0Yjq+hduW2/fJrA/TJs6tA/OgTzMQjlxgk009EqZHCw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@3.0.3': - resolution: {integrity: sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@3.0.3': - resolution: {integrity: sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==} - engines: {node: '>=20.18.0'} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.3.3' - - '@solana/codecs@3.0.3': - resolution: {integrity: sha512-GOHwTlIQsCoJx9Ryr6cEf0FHKAQ7pY4aO4xgncAftrv0lveTQ1rPP2inQ1QT0gJllsIa8nwbfXAADs9nNJxQDA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@3.0.3': - resolution: {integrity: sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - '@solana/eslint-config-solana@5.0.0': resolution: {integrity: sha512-DPsoloOpVf/4JD7m3j394BvJX8mCKTSQ1xJrP0tyyeLEZN7x09OL9uj2bo2Ma4UTYZsyV97p2eiuiHmJVA0Kfw==} peerDependencies: @@ -882,12 +721,6 @@ packages: typescript: ^5.6 typescript-eslint: ^8.11.0 - '@solana/options@3.0.3': - resolution: {integrity: sha512-jarsmnQ63RN0JPC5j9sgUat07NrL9PC71XU7pUItd6LOHtu4+wJMio3l5mT0DHVfkfbFLL6iI6+QmXSVhTNF3g==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/prettier-config-solana@0.0.5': resolution: {integrity: sha512-igtLH1QaX5xzSLlqteexRIg9X1QKA03xKYQc2qY1TrMDDhxKXoRZOStQPWdita2FVJzxTGz/tdMGC1vS0biRcg==} peerDependencies: @@ -908,12 +741,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -935,12 +762,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.19.21': - resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} - '@types/node@24.7.2': resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} @@ -950,9 +771,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/whatwg-mimetype@3.0.2': - resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1149,35 +967,6 @@ packages: cpu: [x64] os: [win32] - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1193,17 +982,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agadoo@3.0.0: - resolution: {integrity: sha512-gq+fjT3Ilrhb88Jf+vYMjdO/+3znYfa7vJ4IMLPFsBPUxglnr40Ed3yCLrW6IABdJAedB94b2BkqR6I04lh3dg==} - hasBin: true - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1245,10 +1026,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - babel-jest@30.2.0: resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1281,10 +1058,6 @@ packages: resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} hasBin: true - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1343,37 +1116,18 @@ packages: caniuse-lite@1.0.30001750: resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} - - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - ci-info@4.3.1: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} @@ -1399,10 +1153,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} - engines: {node: '>=20'} - commander@14.0.1: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} @@ -1428,9 +1178,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - dataloader@1.4.0: - resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1448,10 +1195,6 @@ packages: babel-plugin-macros: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1463,10 +1206,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1475,10 +1214,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1499,10 +1234,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -1514,9 +1245,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -1633,9 +1361,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1648,17 +1373,10 @@ packages: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} - engines: {node: '>=12.0.0'} - expect@30.2.0: resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1672,9 +1390,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1720,14 +1435,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1802,10 +1509,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - happy-dom@18.0.1: - resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} - engines: {node: '>=20.0.0'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1824,18 +1527,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - human-id@4.1.2: - resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} - hasBin: true - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1891,14 +1586,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2067,9 +1754,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -2107,9 +1791,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} @@ -2149,12 +1830,6 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2212,10 +1887,6 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2238,15 +1909,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2280,13 +1942,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2303,10 +1958,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -2314,9 +1965,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2352,10 +2000,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2367,10 +2011,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -2408,11 +2048,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -2429,19 +2064,12 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2475,11 +2103,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.52.4: resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2488,9 +2111,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2512,9 +2132,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2542,9 +2159,6 @@ packages: engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -2552,12 +2166,6 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -2578,10 +2186,6 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -2594,9 +2198,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2614,10 +2215,6 @@ packages: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -2629,9 +2226,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -2639,18 +2233,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -2658,9 +2240,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -2735,16 +2314,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.14.0: resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -2761,95 +2333,12 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -2858,11 +2347,6 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3067,8 +2551,6 @@ snapshots: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.28.4': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -3094,165 +2576,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@changesets/apply-release-plan@7.0.13': - dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.3 - - '@changesets/assemble-release-plan@6.0.9': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.3 - - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/changelog-github@0.5.1': - dependencies: - '@changesets/get-github-info': 0.6.0 - '@changesets/types': 6.1.0 - dotenv: 8.6.0 - transitivePeerDependencies: - - encoding - - '@changesets/cli@2.29.7(@types/node@24.7.2)': - dependencies: - '@changesets/apply-release-plan': 7.0.13 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.13 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@24.7.2) - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.3 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' - - '@changesets/config@3.1.1': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 - - '@changesets/errors@0.2.0': - dependencies: - extendable-error: 0.1.7 - - '@changesets/get-dependents-graph@2.1.3': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.3 - - '@changesets/get-github-info@0.6.0': - dependencies: - dataloader: 1.4.0 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - '@changesets/get-release-plan@4.0.13': - dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@3.0.4': - dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 - - '@changesets/logger@0.1.1': - dependencies: - picocolors: 1.1.1 - - '@changesets/parse@0.4.1': - dependencies: - '@changesets/types': 6.1.0 - js-yaml: 3.14.1 - - '@changesets/pre@2.0.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - - '@changesets/read@0.6.5': - dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 - - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/types@4.1.0': {} - - '@changesets/types@6.1.0': {} - - '@changesets/write@0.4.0': - dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.2 - prettier: 2.8.8 - '@codama/errors@1.3.7': dependencies: '@codama/node-types': 1.3.7 @@ -3261,17 +2584,6 @@ snapshots: '@codama/node-types@1.3.7': {} - '@codama/nodes-from-anchor@1.2.9(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@codama/errors': 1.3.7 - '@codama/nodes': 1.3.7 - '@codama/visitors': 1.3.7 - '@noble/hashes': 1.8.0 - '@solana/codecs': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - '@codama/nodes@1.3.7': dependencies: '@codama/errors': 1.3.7 @@ -3289,12 +2601,6 @@ snapshots: '@codama/nodes': 1.3.7 json-stable-stringify: 1.3.0 - '@codama/visitors@1.3.7': - dependencies: - '@codama/errors': 1.3.7 - '@codama/nodes': 1.3.7 - '@codama/visitors-core': 1.3.7 - '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -3446,13 +2752,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/external-editor@1.0.2(@types/node@24.7.2)': - dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.7.2 - '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -3676,22 +2975,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.28.4 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.28.4 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 @@ -3699,8 +2982,6 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@noble/hashes@1.8.0': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3718,10 +2999,6 @@ snapshots: '@pkgr/core@0.2.9': {} - '@rollup/plugin-virtual@3.0.2(rollup@3.29.5)': - optionalDependencies: - rollup: 3.29.5 - '@rollup/rollup-android-arm-eabi@4.52.4': optional: true @@ -3798,49 +3075,6 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@solana/codecs-core@3.0.3(typescript@5.9.3)': - dependencies: - '@solana/errors': 3.0.3(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@3.0.3(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 3.0.3(typescript@5.9.3) - '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) - '@solana/errors': 3.0.3(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@3.0.3(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 3.0.3(typescript@5.9.3) - '@solana/errors': 3.0.3(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 3.0.3(typescript@5.9.3) - '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) - '@solana/errors': 3.0.3(typescript@5.9.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.9.3 - - '@solana/codecs@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 3.0.3(typescript@5.9.3) - '@solana/codecs-data-structures': 3.0.3(typescript@5.9.3) - '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) - '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@3.0.3(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.0 - typescript: 5.9.3 - '@solana/eslint-config-solana@5.0.0(@eslint/js@9.37.0)(@types/eslint__js@8.42.3)(eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(jest@30.2.0(@types/node@24.7.2))(typescript@5.9.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.37.0))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0))(eslint-plugin-sort-keys-fix@1.1.2)(eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(globals@14.0.0)(jest@30.2.0(@types/node@24.7.2))(typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@eslint/js': 9.37.0 @@ -3856,17 +3090,6 @@ snapshots: typescript: 5.9.3 typescript-eslint: 8.46.0(eslint@9.37.0)(typescript@5.9.3) - '@solana/options@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 3.0.3(typescript@5.9.3) - '@solana/codecs-data-structures': 3.0.3(typescript@5.9.3) - '@solana/codecs-numbers': 3.0.3(typescript@5.9.3) - '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 3.0.3(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/prettier-config-solana@0.0.5(prettier@3.6.2)': dependencies: prettier: 3.6.2 @@ -3897,12 +3120,6 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@types/chai@5.2.2': - dependencies: - '@types/deep-eql': 4.0.2 - - '@types/deep-eql@4.0.2': {} - '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.8 @@ -3926,12 +3143,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@12.20.55': {} - - '@types/node@20.19.21': - dependencies: - undici-types: 6.21.0 - '@types/node@24.7.2': dependencies: undici-types: 7.14.0 @@ -3940,8 +3151,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/whatwg-mimetype@3.0.2': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -4151,48 +3360,6 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/expect@3.2.4': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 - - '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.2))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.19 - optionalDependencies: - vite: 7.1.9(@types/node@24.7.2) - - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.2.4': - dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.1.0 - - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.19 - pathe: 2.0.3 - - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 - - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 @@ -4205,12 +3372,6 @@ snapshots: acorn@8.15.0: {} - agadoo@3.0.0: - dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@3.29.5) - acorn: 8.15.0 - rollup: 3.29.5 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4218,8 +3379,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -4251,8 +3410,6 @@ snapshots: array-union@2.1.0: {} - assertion-error@2.0.1: {} - babel-jest@30.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 @@ -4309,10 +3466,6 @@ snapshots: baseline-browser-mapping@2.8.16: {} - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -4372,33 +3525,17 @@ snapshots: caniuse-lite@1.0.30001750: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} - char-regex@1.0.2: {} - chardet@2.1.0: {} - - check-error@2.1.1: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 - ci-info@3.9.0: {} - ci-info@4.3.1: {} cjs-module-lexer@2.1.0: {} @@ -4419,8 +3556,6 @@ snapshots: color-name@1.1.4: {} - commander@14.0.0: {} - commander@14.0.1: {} commander@4.1.1: {} @@ -4439,16 +3574,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - dataloader@1.4.0: {} - debug@4.4.3: dependencies: ms: 2.1.3 dedent@1.7.0: {} - deep-eql@5.0.2: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -4459,16 +3590,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - detect-indent@6.1.0: {} - detect-newline@3.1.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dotenv@8.6.0: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4485,11 +3612,6 @@ snapshots: emoji-regex@9.2.2: {} - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -4498,8 +3620,6 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -4658,10 +3778,6 @@ snapshots: estraverse@5.3.0: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - esutils@2.0.3: {} execa@5.1.1: @@ -4678,8 +3794,6 @@ snapshots: exit-x@0.2.2: {} - expect-type@1.2.2: {} - expect@30.2.0: dependencies: '@jest/expect-utils': 30.2.0 @@ -4689,8 +3803,6 @@ snapshots: jest-mock: 30.2.0 jest-util: 30.2.0 - extendable-error@0.1.7: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -4705,8 +3817,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fastestsmallesttextencoderdecoder@1.0.22: {} - fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -4755,18 +3865,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -4852,12 +3950,6 @@ snapshots: graphemer@1.4.0: {} - happy-dom@18.0.1: - dependencies: - '@types/node': 20.19.21 - '@types/whatwg-mimetype': 3.0.2 - whatwg-mimetype: 3.0.0 - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -4872,14 +3964,8 @@ snapshots: html-escaper@2.0.2: {} - human-id@4.1.2: {} - human-signals@2.1.0: {} - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} ignore@7.0.5: {} @@ -4919,12 +4005,6 @@ snapshots: is-stream@2.0.1: {} - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - - is-windows@1.0.2: {} - isarray@2.0.5: {} isexe@2.0.0: {} @@ -5285,8 +4365,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -5318,10 +4396,6 @@ snapshots: json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonify@0.0.1: {} keyv@4.5.4: @@ -5353,10 +4427,6 @@ snapshots: lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} - - loupe@3.2.1: {} - lru-cache@10.4.3: {} lru-cache@11.2.2: {} @@ -5411,8 +4481,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - mri@1.2.0: {} - ms@2.1.3: {} mz@2.7.0: @@ -5421,7 +4489,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.11: + optional: true napi-postinstall@0.3.4: {} @@ -5429,10 +4498,6 @@ snapshots: natural-compare@1.4.0: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-int64@0.4.0: {} node-releases@2.0.23: {} @@ -5464,12 +4529,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - outdent@0.5.0: {} - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -5486,16 +4545,10 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.11 - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5527,16 +4580,12 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.3: {} - pify@4.0.1: {} - pirates@4.0.7: {} pkg-dir@4.2.0: @@ -5560,11 +4609,10 @@ snapshots: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + optional: true prelude-ls@1.2.1: {} - prettier@2.8.8: {} - prettier@3.6.2: {} pretty-format@30.2.0: @@ -5577,19 +4625,10 @@ snapshots: pure-rand@7.0.1: {} - quansync@0.2.11: {} - queue-microtask@1.2.3: {} react-is@18.3.1: {} - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - readdirp@4.1.2: {} require-directory@2.1.1: {} @@ -5611,10 +4650,6 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup@3.29.5: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.52.4: dependencies: '@types/estree': 1.0.8 @@ -5647,8 +4682,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - semver@6.3.1: {} semver@7.7.3: {} @@ -5668,15 +4701,14 @@ snapshots: shebang-regex@3.0.0: {} - siginfo@2.0.0: {} - signal-exit@3.0.7: {} signal-exit@4.1.0: {} slash@3.0.0: {} - source-map-js@1.2.1: {} + source-map-js@1.2.1: + optional: true source-map-support@0.5.13: dependencies: @@ -5689,21 +4721,12 @@ snapshots: dependencies: whatwg-url: 7.1.0 - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - sprintf-js@1.0.3: {} stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - stackback@0.0.2: {} - - std-env@3.9.0: {} - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -5729,18 +4752,12 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom@3.0.0: {} - strip-bom@4.0.0: {} strip-final-newline@2.0.0: {} strip-json-comments@3.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -5763,8 +4780,6 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - term-size@2.2.1: {} - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -5779,8 +4794,6 @@ snapshots: dependencies: any-promise: 1.3.0 - tinybench@2.9.0: {} - tinyexec@0.3.2: {} tinyglobby@0.2.15: @@ -5788,20 +4801,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} - tmpl@1.0.5: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -5875,12 +4880,8 @@ snapshots: ufo@1.6.1: {} - undici-types@6.21.0: {} - undici-types@7.14.0: {} - universalify@0.1.2: {} - unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.4 @@ -5921,96 +4922,12 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite-node@3.2.4(@types/node@24.7.2): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.9(@types/node@24.7.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.1.9(@types/node@24.7.2): - dependencies: - esbuild: 0.25.10 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.4 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.7.2 - fsevents: 2.3.3 - - vitest@3.2.4(@types/node@24.7.2)(happy-dom@18.0.1): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 - expect-type: 1.2.2 - magic-string: 0.30.19 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@24.7.2) - vite-node: 3.2.4(@types/node@24.7.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.7.2 - happy-dom: 18.0.1 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - walker@1.0.8: dependencies: makeerror: 1.0.12 - webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - whatwg-mimetype@3.0.0: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -6021,11 +4938,6 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - word-wrap@1.2.5: {} wrap-ansi@7.0.0: diff --git a/src/fragments/accountPage.ts b/src/fragments/accountPage.ts index 7aa1747..e4e8583 100644 --- a/src/fragments/accountPage.ts +++ b/src/fragments/accountPage.ts @@ -1,5 +1,5 @@ -import { AccountNode, isNode, resolveNestedTypeNode } from '@codama/nodes'; -import { findProgramNodeFromPath,getLastNodeFromPath, NodePath } from '@codama/visitors-core'; +import { AccountNode, isNode, ProgramNode, resolveNestedTypeNode } from '@codama/nodes'; +import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; @@ -13,22 +13,22 @@ export function getAccountPageFragment( const className = scope.nameApi.accountType(node.name); const size = scope.size; const programNode = findProgramNodeFromPath(scope.accountPath); + if (!programNode) { + throw new Error(`Could not find program node for account: ${node.name}`); + } - // Get the account data structure const dataTypeNode = resolveNestedTypeNode(node.data); - // Check if this is a struct type with fields if (dataTypeNode.kind === 'structTypeNode') { return getStructAccountFragment(node, scope, className, size, programNode); } - // For simple types, create a basic account class const typeInfo = getTypeInfo(dataTypeNode, scope.nameApi); const borshAnnotation = getBorshAnnotation(dataTypeNode, scope.nameApi); - const allImports = ['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart', ...typeInfo.imports.filter(imp => imp !== 'dart:typed_data')]; - - // Generate PDA derivation method - const pdaMethod = generatePdaMethodForAccount(node.name, programNode); + const allImports = [ + 'package:borsh_annotation/borsh_annotation.dart', + ...typeInfo.imports.filter(imp => imp !== 'dart:typed_data'), + ]; const content = `part '${node.name}.g.dart'; @@ -44,8 +44,6 @@ class ${className} with _$${className} { return _$${className}FromBorsh(data); } -${pdaMethod} - String _indent(String text, int level) { final indent = ' ' * level; return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); @@ -72,7 +70,7 @@ function getStructAccountFragment( }, className: string, _size: number | null, - programNode: any, + _programNode: ProgramNode, ): Fragment { const dataTypeNode = resolveNestedTypeNode(node.data); const fields = isNode(dataTypeNode, 'structTypeNode') ? dataTypeNode.fields : []; @@ -87,16 +85,12 @@ function getStructAccountFragment( }) .join('\n'); - // Collect all imports (filter out dart:typed_data) - const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart']); + const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart']); fields.forEach(field => { const typeInfo = getTypeInfo(field.type, scope.nameApi); typeInfo.imports.filter(imp => imp !== 'dart:typed_data').forEach(imp => allImports.add(imp)); }); - // Generate PDA derivation method - const pdaMethod = generatePdaMethodForAccount(node.name, programNode); - const content = `part '${node.name}.g.dart'; @BorshSerializable() @@ -111,8 +105,6 @@ ${factoryParams} return _$${className}FromBorsh(data); } -${pdaMethod} - String _indent(String text, int level) { final indent = ' ' * level; return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); @@ -122,10 +114,12 @@ ${pdaMethod} String toString([int indent = 0]) { final buffer = StringBuffer(); buffer.writeln('${className}('); - ${fields.map(field => { - const fieldName = scope.nameApi.accountField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; - }).join('\n ')} + ${fields + .map(field => { + const fieldName = scope.nameApi.accountField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }) + .join('\n ')} buffer.write(_indent(')', indent)); return buffer.toString(); } @@ -133,56 +127,3 @@ ${pdaMethod} return createFragment(content, Array.from(allImports)); } - -function generatePdaMethodForAccount(accountName: string, programNode: any): string { - const programId = programNode?.publicKey || 'Ca2XuYJBdeC4SzhNFH4sUeBxrcE5ko4Gv4VgZb917dir'; - - // PDA patterns based on analysis of the solana_music.json IDL - switch (accountName.toLowerCase()) { - case 'programconfig': - return ` /// Derives the PDA address for ProgramConfig - static Future derivePDA() { - return Ed25519HDPublicKey.findProgramAddress( - seeds: [Uint8List.fromList([112, 114, 111, 103, 114, 97, 109, 95, 99, 111, 110, 102, 105, 103])], // "program_config" - programId: Ed25519HDPublicKey.fromBase58('${programId}'), - ); - }`; - - case 'token': - return ` /// Derives the PDA address for Token - static Future derivePDA(Ed25519HDPublicKey mint) { - return Ed25519HDPublicKey.findProgramAddress( - seeds: [Uint8List.fromList([116, 111, 107, 101, 110]), mint.toByteArray()], // "token" + mint - programId: Ed25519HDPublicKey.fromBase58('${programId}'), - ); - }`; - - case 'user': - return ` /// Derives the PDA address for User - static Future derivePDA(Ed25519HDPublicKey user, Ed25519HDPublicKey token) { - return Ed25519HDPublicKey.findProgramAddress( - seeds: [Uint8List.fromList([117, 115, 101, 114]), user.toByteArray(), token.toByteArray()], // "user" + user + token - programId: Ed25519HDPublicKey.fromBase58('${programId}'), - ); - }`; - - case 'tokenpricing': - return ` /// Derives the PDA address for TokenPricing - static Future derivePDA(Ed25519HDPublicKey mint) { - return Ed25519HDPublicKey.findProgramAddress( - seeds: [Uint8List.fromList([116, 111, 107, 101, 110, 95, 112, 114, 105, 99, 105, 110, 103]), mint.toByteArray()], // "token_pricing" + mint - programId: Ed25519HDPublicKey.fromBase58('${programId}'), - ); - }`; - - default: - return ` /// Derives the PDA address for ${accountName} - /// Note: Add the correct seeds based on your account's PDA pattern - static Future derivePDA({required List seeds}) { - return Ed25519HDPublicKey.findProgramAddress( - seeds: seeds, - programId: Ed25519HDPublicKey.fromBase58('${programId}'), - ); - }`; - } -} diff --git a/src/fragments/errorPage.ts b/src/fragments/errorPage.ts index f720ba2..ecf2163 100644 --- a/src/fragments/errorPage.ts +++ b/src/fragments/errorPage.ts @@ -12,19 +12,23 @@ export function getErrorPageFragment( const errors = [...programNode.errors].sort((a, b) => a.code - b.code); // Generate error constants with individual docs - const errorConstants = errors.map(error => { - const constantName = nameApi.errorConstant(error.name); - const docs = error.docs && error.docs.length > 0 ? error.docs.join(' ') : ''; - const docComment = docs ? ` /// ${docs}\n` : ''; - return `${docComment} static const int ${constantName} = ${error.code};`; - }).join('\n'); + const errorConstants = errors + .map(error => { + const constantName = nameApi.errorConstant(error.name); + const docs = error.docs && error.docs.length > 0 ? error.docs.join(' ') : ''; + const docComment = docs ? ` /// ${docs}\n` : ''; + return `${docComment} static const int ${constantName} = ${error.code};`; + }) + .join('\n'); // Generate error messages map - const errorMessages = errors.map(error => { - const constantName = nameApi.errorConstant(error.name); - const escapedMessage = error.message.replace(/'/g, "\\'"); - return ` ${constantName}: '${escapedMessage}',`; - }).join('\n'); + const errorMessages = errors + .map(error => { + const constantName = nameApi.errorConstant(error.name); + const escapedMessage = error.message.replace(/'/g, "\\'"); + return ` ${constantName}: '${escapedMessage}',`; + }) + .join('\n'); const content = `/// Program errors for ${programNode.name} class ${className} { @@ -51,4 +55,4 @@ ${errorMessages} }`; return createFragment(content, []); -} \ No newline at end of file +} diff --git a/src/fragments/index.ts b/src/fragments/index.ts index 5de3726..98c0a18 100644 --- a/src/fragments/index.ts +++ b/src/fragments/index.ts @@ -3,4 +3,6 @@ export * from './structType'; export * from './instructionPage'; export * from './instructionData'; export * from './instructionFunction'; -export * from './errorPage'; \ No newline at end of file +export * from './errorPage'; +export * from './libraryIndex'; +export * from './programPage'; diff --git a/src/fragments/instructionData.ts b/src/fragments/instructionData.ts index 4fe371c..20a5400 100644 --- a/src/fragments/instructionData.ts +++ b/src/fragments/instructionData.ts @@ -34,7 +34,7 @@ export function getInstructionDataFragment( .filter(field => field.name !== 'discriminator') .map(field => { const fieldName = nameApi.instructionField(field.name); - + // Handle fixedSizeTypeNode if (field.type.kind === 'fixedSizeTypeNode') { const size = field.type.size; @@ -44,20 +44,20 @@ export function getInstructionDataFragment( return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; } } - + // Handle arrayTypeNode with fixed count if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { const size = field.type.count.value; return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; } - + return ''; }) .filter(v => v) .join('\n'); // Add validation for discriminator (always 8 bytes) + other validations - const allValidations = validations + const allValidations = validations ? ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');\n${validations}` : ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');`; @@ -115,10 +115,12 @@ ${structNode.fields String toString([int indent = 0]) { final buffer = StringBuffer(); buffer.writeln('${instructionDataName}('); - ${structNode.fields.map(field => { - const fieldName = nameApi.instructionField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; - }).join('\n ')} + ${structNode.fields + .map(field => { + const fieldName = nameApi.instructionField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }) + .join('\n ')} buffer.write(_indent(')', indent)); return buffer.toString(); } diff --git a/src/fragments/instructionFunction.ts b/src/fragments/instructionFunction.ts index c0a3c82..7f17ad0 100644 --- a/src/fragments/instructionFunction.ts +++ b/src/fragments/instructionFunction.ts @@ -1,8 +1,9 @@ -import { InstructionNode, isNode, PdaSeedValueNode, StandaloneValueNode } from '@codama/nodes'; +import { InstructionNode, isNode, PdaSeedValueNode } from '@codama/nodes'; import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; import { createFragment, Fragment, RenderScope } from '../utils'; import { getBuiltinProgramAddress } from '../utils/builtinPrograms'; +import { generatePdaSeeds } from '../utils/pda'; export function getInstructionFunctionFragment( scope: Pick & { @@ -30,7 +31,7 @@ export function getInstructionFunctionFragment( // Check if this account has a default PDA value const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); - + // Check if this account has a builtin program default const builtinAddress = getBuiltinProgramAddress(account.name); @@ -46,7 +47,7 @@ export function getInstructionFunctionFragment( const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - + // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; @@ -103,7 +104,7 @@ export function getInstructionFunctionFragment( const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - + // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; @@ -118,43 +119,7 @@ export function getInstructionFunctionFragment( // Generate PDA derivation code only for derivable PDAs const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { - const seeds = pdaValue.pda.seeds.map(seed => { - if (isNode(seed, 'constantPdaSeedNode')) { - if (isNode(seed.value, 'stringValueNode')) { - return `utf8.encode("${seed.value.string}")`; - } - if (isNode(seed.value, 'programIdValueNode')) { - return `programId.bytes`; - } - if (isNode(seed.value, 'bytesValueNode')) { - // Convert byte array to Uint8List - const byteArray = Array.from(Buffer.from(seed.value.data, 'hex')); - return `Uint8List.fromList([${byteArray.join(', ')}])`; - } - if (seed.value.kind === 'arrayValueNode' && seed.value.items) { - // Handle array of bytes like [108, 101, 32, 115, 101, 101, 100] - const bytes = seed.value.items.map((item: StandaloneValueNode) => - isNode(item, 'numberValueNode') ? item.number : 0, - ); - return `Uint8List.fromList([${bytes.join(', ')}])`; - } - } - if (isNode(seed, 'variablePdaSeedNode')) { - // For variable PDA seeds, look for the value in defaultValue.seeds - const valueSeed = pdaValue.seeds?.find( - (s: PdaSeedValueNode) => s.name === seed.name, - )?.value; - if (valueSeed && isNode(valueSeed, 'accountValueNode')) { - // This is an account seed - use the account name - const accountName = valueSeed.name; - return `${accountName}.toByteArray()`; - } - // Handle other variable seeds (would need to be provided when calling the function) - const seedName = nameApi.instructionField(seed.name); - return `${seedName}.toByteArray()`; - } - return 'utf8.encode("fallback")'; // fallback - }); + const seeds = generatePdaSeeds(pdaValue.pda, pdaValue.seeds, nameApi); pdaResolutions.push( ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? ` + @@ -164,7 +129,7 @@ export function getInstructionFunctionFragment( } else if (builtinAddress) { // Generate builtin program default pdaResolutions.push( - ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? Ed25519HDPublicKey.fromBase58('${builtinAddress}');` + ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? Ed25519HDPublicKey.fromBase58('${builtinAddress}');`, ); } }); @@ -179,7 +144,7 @@ export function getInstructionFunctionFragment( const accountName = nameApi.instructionField(account.name); const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); const builtinAddress = getBuiltinProgramAddress(account.name); - + // Check if PDA can be auto-derived (doesn't reference instruction arguments) let canAutoderivePda = false; if (hasDefaultPda) { @@ -192,7 +157,7 @@ export function getInstructionFunctionFragment( const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - + // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; @@ -202,10 +167,11 @@ export function getInstructionFunctionFragment( } } } - - const resolvedAccountName = ((hasDefaultPda && canAutoderivePda) || builtinAddress) - ? `resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)}` - : accountName; + + const resolvedAccountName = + (hasDefaultPda && canAutoderivePda) || builtinAddress + ? `resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)}` + : accountName; const isWriteable = account.isWritable ? 'true' : 'false'; const isSigner = account.isSigner === true ? 'true' : 'false'; @@ -231,17 +197,15 @@ export function getInstructionFunctionFragment( const needsAsync = instructionNode.accounts.some(account => { const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); if (!hasDefaultPda) return false; - + // Check if PDA can be auto-derived (doesn't reference instruction arguments) const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { let canAutoderive = true; for (const seed of pdaValue.pda.seeds) { if (isNode(seed, 'variablePdaSeedNode')) { - const valueSeed = pdaValue.seeds?.find( - (s: PdaSeedValueNode) => s.name === seed.name, - )?.value; - + const valueSeed = pdaValue.seeds?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; + // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderive = false; diff --git a/src/fragments/instructionPage.ts b/src/fragments/instructionPage.ts index 3b8544f..359b92a 100644 --- a/src/fragments/instructionPage.ts +++ b/src/fragments/instructionPage.ts @@ -1,5 +1,5 @@ import { InstructionNode } from '@codama/nodes'; -import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; +import { findProgramNodeFromPath, NodePath } from '@codama/visitors-core'; import { createFragment, Fragment, RenderScope } from '../utils'; import { getInstructionDataFragment } from './instructionData'; @@ -11,13 +11,12 @@ export function getInstructionPageFragment( size: number | null; }, ): Fragment { - const node = getLastNodeFromPath(scope.instructionPath); if (!findProgramNodeFromPath(scope.instructionPath)) { throw new Error('Instruction must be visited inside a program.'); } const fragments: Fragment[] = []; - + // Generate instruction data type (arguments) const dataFragment = getInstructionDataFragment(scope); if (dataFragment) { @@ -36,4 +35,4 @@ export function getInstructionPageFragment( fragments.forEach(f => f.imports.forEach(imp => imports.add(imp))); return createFragment(content, Array.from(imports)); -} \ No newline at end of file +} diff --git a/src/fragments/libraryIndex.ts b/src/fragments/libraryIndex.ts new file mode 100644 index 0000000..2134142 --- /dev/null +++ b/src/fragments/libraryIndex.ts @@ -0,0 +1,65 @@ +import { getAllInstructionsWithSubs, getAllPrograms } from '@codama/nodes'; +import { RootNode } from '@codama/nodes'; + +import { Fragment } from '../utils'; + +export function getLibraryIndexFragment(scope: { rootNode: RootNode }): Fragment { + const { rootNode } = scope; + + const programs = getAllPrograms(rootNode); + const exports: string[] = []; + + programs.forEach(program => { + program.accounts.forEach(account => { + exports.push(`export 'accounts/${account.name}.dart';`); + }); + }); + + programs.forEach(program => { + getAllInstructionsWithSubs(program, { leavesOnly: true }).forEach(instruction => { + exports.push(`export 'instructions/${instruction.name}.dart';`); + }); + }); + + programs.forEach(program => { + program.definedTypes.forEach(type => { + if (type.type.kind === 'structTypeNode') { + exports.push(`export 'types/${type.name}.dart';`); + } + }); + }); + + programs.forEach(program => { + if (program.errors.length > 0) { + exports.push(`export 'errors/${program.name}.dart';`); + } + }); + + programs.forEach(program => { + getAllInstructionsWithSubs(program, { leavesOnly: true }).forEach(instruction => { + instruction.accounts.forEach(account => { + if (account.defaultValue?.kind === 'pdaValueNode') { + exports.push(`export 'pdas/${account.name}.dart';`); + } + }); + }); + }); + + exports.sort(); + const uniqueExports = Array.from(new Set(exports)); + + const exportsContent = + uniqueExports.length > 0 ? uniqueExports.join('\n') : '// No exports found - check your program structure'; + + const contentString = `/// Generated Dart library for Solana program interaction; + +${exportsContent} +`; + + const content: Fragment = { + content: contentString, + imports: new Set(), + }; + + return content; +} diff --git a/src/fragments/programPage.ts b/src/fragments/programPage.ts new file mode 100644 index 0000000..a9e48fc --- /dev/null +++ b/src/fragments/programPage.ts @@ -0,0 +1,32 @@ +import { ProgramNode } from '@codama/nodes'; + +import { createFragment, Fragment, RenderScope } from '../utils'; + +export function getProgramPageFragment( + scope: Pick & { + programNode: ProgramNode; + }, +): Fragment { + const { programNode, nameApi } = scope; + const className = nameApi.programType(programNode.name); + const programId = programNode.publicKey || 'Ca2XuYJBdeC4SzhNFH4sUeBxrcE5ko4Gv4VgZb917dir'; + + const content = `/// Program constants and utilities for ${programNode.name} +class ${className} { + /// The program ID + static const String programId = '${programId}'; + + /// Get the program's Ed25519HDPublicKey + static Ed25519HDPublicKey get publicKey { + return Ed25519HDPublicKey.fromBase58(programId); + } + + /// Program name + static const String name = '${programNode.name}'; + + /// Program version (if available) + static const String version = '${programNode.version || '1.0.0'}'; +}`; + + return createFragment(content, ['package:solana/solana.dart']); +} diff --git a/src/fragments/structType.ts b/src/fragments/structType.ts index 4a68b73..ec3a02c 100644 --- a/src/fragments/structType.ts +++ b/src/fragments/structType.ts @@ -1,4 +1,4 @@ -import { StructTypeNode } from '@codama/nodes'; +import { camelCase, StructTypeNode } from '@codama/nodes'; import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; @@ -10,26 +10,13 @@ export function getStructTypeFragment( }, ): Fragment { const { name, node, nameApi } = scope; - const className = nameApi.definedType(name); + const className = nameApi.definedType(camelCase(name)); const fields = node.fields || []; - // Generate field declarations - const fieldDeclarations = fields.map(field => { - const typeInfo = getTypeInfo(field.type, scope.nameApi); - return ` ${typeInfo.dartType} ${nameApi.accountField(field.name)};`; - }).join('\n'); - - // Generate constructor parameters - const constructorParams = fields.map(field => { - return `required this.${nameApi.accountField(field.name)}`; - }).join(', '); - - // Generate validation for fixed-size fields const validations = fields .map(field => { const fieldName = nameApi.accountField(field.name); - - // Handle fixedSizeTypeNode + if (field.type.kind === 'fixedSizeTypeNode') { const size = field.type.size; if (field.type.type.kind === 'bytesTypeNode') { @@ -38,13 +25,12 @@ export function getStructTypeFragment( return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; } } - - // Handle arrayTypeNode with fixed count + if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { const size = field.type.count.value; return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; } - + return ''; }) .filter(v => v) @@ -58,12 +44,14 @@ export function getStructTypeFragment( }); const hasValidations = validations.length > 0; - const factoryParams = fields.map(field => { - const typeInfo = getTypeInfo(field.type, scope.nameApi); - const borshAnnotation = getBorshAnnotation(field.type, scope.nameApi); - const fieldName = nameApi.accountField(field.name); - return ` ${borshAnnotation} required ${typeInfo.dartType} ${fieldName},`; - }).join('\n'); + const factoryParams = fields + .map(field => { + const typeInfo = getTypeInfo(field.type, scope.nameApi); + const borshAnnotation = getBorshAnnotation(field.type, scope.nameApi); + const fieldName = nameApi.accountField(field.name); + return ` ${borshAnnotation} required ${typeInfo.dartType} ${fieldName},`; + }) + .join('\n'); const content = `part '${name}.g.dart'; @@ -71,16 +59,22 @@ export function getStructTypeFragment( class ${className} with _$${className} { factory ${className}({ ${factoryParams} - })${hasValidations ? ` { + })${ + hasValidations + ? ` { // Validate fixed-size fields ${validations} return _${className}( -${fields.map(field => { +${fields + .map(field => { const fieldName = nameApi.accountField(field.name); return ` ${fieldName}: ${fieldName},`; - }).join('\n')} + }) + .join('\n')} ); - }` : ` = _${className};`} + }` + : ` = _${className};` + } const ${className}._(); @@ -97,14 +91,16 @@ ${fields.map(field => { String toString([int indent = 0]) { final buffer = StringBuffer(); buffer.writeln('${className}('); - ${fields.map(field => { - const fieldName = nameApi.accountField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; - }).join('\n ')} + ${fields + .map(field => { + const fieldName = nameApi.accountField(field.name); + return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + }) + .join('\n ')} buffer.write(_indent(')', indent)); return buffer.toString(); } }`; return createFragment(content, Array.from(allImports)); -} \ No newline at end of file +} diff --git a/src/index.ts b/src/index.ts index 0653894..4bacef3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ export * from './utils'; export * from './visitors'; -export { renderVisitor as default } from './visitors'; \ No newline at end of file +export { renderVisitor as default } from './visitors'; diff --git a/src/utils/builtinPrograms.ts b/src/utils/builtinPrograms.ts index e37810a..9bc5a0b 100644 --- a/src/utils/builtinPrograms.ts +++ b/src/utils/builtinPrograms.ts @@ -1,37 +1,36 @@ // Builtin Solana program mappings export const BUILTIN_PROGRAMS: Record = { - clockSysvar: 'SysvarC1ock11111111111111111111111111111111', - instructionsSysvar: 'Sysvar1nstructions1111111111111111111111111', - recentBlockhashesSysvar: 'SysvarRecentB1ockHashes11111111111111111111', - rentSysvar: 'SysvarRent111111111111111111111111111111111', + // clockSysvar: 'SysvarC1ock11111111111111111111111111111111', + // instructionsSysvar: 'Sysvar1nstructions1111111111111111111111111', + // recentBlockhashesSysvar: 'SysvarRecentB1ockHashes11111111111111111111', + // rentSysvar: 'SysvarRent111111111111111111111111111111111', + // tokenProgram: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', systemProgram: '11111111111111111111111111111111', - tokenProgram: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', }; export function getBuiltinProgramAddress(accountName: string): string | null { - const lowerName = accountName.toLowerCase(); // Direct mapping - if (BUILTIN_PROGRAMS[lowerName]) { - return BUILTIN_PROGRAMS[lowerName]; + if (BUILTIN_PROGRAMS[accountName]) { + return BUILTIN_PROGRAMS[accountName]; } - // Pattern matching for common variations - if (lowerName.includes('system')) { - return BUILTIN_PROGRAMS['systemProgram']; - } - if (lowerName.includes('token') && !lowerName.includes('associated')) { - return BUILTIN_PROGRAMS['tokenProgram']; - } - if (lowerName.includes('rent')) { - return BUILTIN_PROGRAMS['rentSysvar']; - } - if (lowerName.includes('clock')) { - return BUILTIN_PROGRAMS['clockSysvar']; - } - if (lowerName.includes('instruction')) { - return BUILTIN_PROGRAMS['instructionsSysvar']; - } + // // Pattern matching for common variations + // if (accountName === 'systemProgram') { + // return BUILTIN_PROGRAMS['systemProgram']; + // } + // if (lowerName.includes('token') && !lowerName.includes('associated')) { + // return BUILTIN_PROGRAMS['tokenProgram']; + // } + // if (lowerName.includes('rent')) { + // return BUILTIN_PROGRAMS['rentSysvar']; + // } + // if (lowerName.includes('clock')) { + // return BUILTIN_PROGRAMS['clockSysvar']; + // } + // if (lowerName.includes('instruction')) { + // return BUILTIN_PROGRAMS['instructionsSysvar']; + // } return null; } diff --git a/src/utils/fragment.ts b/src/utils/fragment.ts index 7cf4337..367ca37 100644 --- a/src/utils/fragment.ts +++ b/src/utils/fragment.ts @@ -12,6 +12,18 @@ export function createFragment(content: string, imports: string[] = []): Fragmen libraryName: undefined, }; } + +export function isFragment(value: unknown): value is Fragment { + return ( + typeof value === 'object' && + value !== null && + 'content' in value && + 'imports' in value && + typeof (value as Record).content === 'string' && + (value as Record).imports instanceof Set + ); +} + export function fragment(template: TemplateStringsArray, ...items: unknown[]): Fragment { return createFragmentTemplate(template, items, isFragment, mergeFragments); } diff --git a/src/utils/importMap.ts b/src/utils/importMap.ts index 514cf4b..3c1e41a 100644 --- a/src/utils/importMap.ts +++ b/src/utils/importMap.ts @@ -26,14 +26,14 @@ export function mergeImportMaps(maps: ImportMap[]): ImportMap { export function importMapToString(importMap: ImportMap): string { if (importMap.size === 0) return ''; - + const imports: string[] = []; - + // Sort import groups: dart:, package:, relative const dartImports: [string, Set][] = []; const packageImports: [string, Set][] = []; const relativeImports: [string, Set][] = []; - + importMap.forEach((importSet, modulePath) => { const entry: [string, Set] = [modulePath, importSet]; if (modulePath.startsWith('dart:')) { @@ -44,12 +44,12 @@ export function importMapToString(importMap: ImportMap): string { relativeImports.push(entry); } }); - + // Sort within each group dartImports.sort(([a], [b]) => a.localeCompare(b)); packageImports.sort(([a], [b]) => a.localeCompare(b)); relativeImports.sort(([a], [b]) => a.localeCompare(b)); - + // Generate import statements [...dartImports, ...packageImports, ...relativeImports].forEach(([modulePath, importSet]) => { if (importSet.size === 0) { @@ -63,14 +63,11 @@ export function importMapToString(importMap: ImportMap): string { } } }); - + return imports.join('\n'); } -export type GetImportFromFunction = ( - importedName: string, - currentFilePath: string -) => string; +export type GetImportFromFunction = (importedName: string, currentFilePath: string) => string; export function getImportFromFactory(): GetImportFromFunction { return (importedName: string, currentFilePath: string): string => { @@ -79,7 +76,7 @@ export function getImportFromFactory(): GetImportFromFunction { const parts = currentFilePath.split('/'); const depth = parts.length - 1; const prefix = depth > 1 ? '../'.repeat(depth - 1) : './'; - + // Determine the import path based on naming conventions if (importedName.endsWith('Account')) { return `${prefix}accounts/${camelCase(importedName.replace('Account', ''))}.dart`; @@ -93,7 +90,7 @@ export function getImportFromFactory(): GetImportFromFunction { if (importedName.endsWith('Error')) { return `${prefix}errors/${camelCase(importedName.replace('Error', ''))}.dart`; } - + // Default to types directory return `${prefix}types/${camelCase(importedName)}.dart`; }; @@ -101,4 +98,4 @@ export function getImportFromFactory(): GetImportFromFunction { function camelCase(str: string): string { return str.charAt(0).toLowerCase() + str.slice(1); -} \ No newline at end of file +} diff --git a/src/utils/index.ts b/src/utils/index.ts index a53819d..33367d8 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -3,4 +3,4 @@ export * from './fragment'; export * from './importMap'; export * from './nameTransformers'; export * from './options'; -export * from './pubspec'; \ No newline at end of file +export * from './pubspec'; diff --git a/src/utils/options.ts b/src/utils/options.ts index 1fadd55..659305d 100644 --- a/src/utils/options.ts +++ b/src/utils/options.ts @@ -16,7 +16,6 @@ export type GetRenderMapOptions = { nameTransformers?: Partial; outputDirectory?: string; pubspecName?: string; - renderParentInstructions?: boolean; }; export type CustomDataOptions = { @@ -30,32 +29,26 @@ export type RenderScope = { // Custom data handling customAccountData: ParsedCustomDataOptions; customInstructionData: ParsedCustomDataOptions; - + getImportFrom: GetImportFromFunction; - + // Import management imports: ImportMap; // Core configuration libraryName: string; - + // Cross-reference systems linkables: LinkableDictionary; // Naming and transformations nameApi: NameApi; - + outputDirectory: string; - - // Rendering options - renderParentInstructions: boolean; }; -export function parseCustomDataOptions( - options: CustomDataOptions[], - _prefix: string -): ParsedCustomDataOptions { +export function parseCustomDataOptions(options: CustomDataOptions[]): ParsedCustomDataOptions { const map = new Map(); options.forEach(option => { map.set(option.name, option); }); return map; -} \ No newline at end of file +} diff --git a/src/utils/pda.ts b/src/utils/pda.ts index 56ade9d..cf68bb6 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -1,107 +1,101 @@ -import { camelCase, isNode, PdaNode, TypeNode } from '@codama/nodes'; +import { isNode, PdaNode, PdaSeedValueNode, StandaloneValueNode } from '@codama/nodes'; -import { Fragment, fragment, RenderScope } from './fragment'; +import { Fragment } from './fragment'; +import { RenderScope } from './options'; -export interface PdaSeedInfo { - dartType?: string; - encoding: string; - name?: string; - type: 'constant' | 'programId' | 'variable'; - value?: string; -} - -export function parsePdaSeeds(pdaNode: PdaNode): PdaSeedInfo[] { +/** + * Generates Dart code for PDA seeds based on a PDA node and its seed values + */ +export function generatePdaSeeds( + pdaNode: PdaNode, + pdaSeedValues: PdaSeedValueNode[] | undefined, + nameApi: RenderScope['nameApi'], +): string[] { return pdaNode.seeds.map(seed => { if (isNode(seed, 'constantPdaSeedNode')) { + if (isNode(seed.value, 'stringValueNode')) { + return `utf8.encode("${seed.value.string}")`; + } if (isNode(seed.value, 'programIdValueNode')) { - return { - encoding: 'programId.bytes', - type: 'programId', - }; + return `programId.bytes`; + } + if (isNode(seed.value, 'bytesValueNode')) { + // Convert byte array to Uint8List + const byteArray = Array.from(Buffer.from(seed.value.data, 'hex')); + return `Uint8List.fromList([${byteArray.join(', ')}])`; + } + if (seed.value.kind === 'arrayValueNode' && seed.value.items) { + // Handle array of bytes like [108, 101, 32, 115, 101, 101, 100] + const bytes = seed.value.items.map((item: StandaloneValueNode) => + isNode(item, 'numberValueNode') ? item.number : 0, + ); + return `Uint8List.fromList([${bytes.join(', ')}])`; } - - // Handle different constant types - const value = isNode(seed.value, 'stringValueNode') - ? `"${seed.value.string}"` - : isNode(seed.value, 'numberValueNode') - ? seed.value.number.toString() - : 'null'; - - return { - encoding: getEncodingForType(seed.type, value), - type: 'constant', - value, - }; } - if (isNode(seed, 'variablePdaSeedNode')) { - const name = camelCase(seed.name); - const dartType = getDartTypeForSeed(seed.type); + const valueSeed = pdaSeedValues?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; - return { - dartType, - encoding: getEncodingForType(seed.type, name), - name, - type: 'variable', - }; - } + if (valueSeed && (isNode(valueSeed, 'accountValueNode') || isNode(valueSeed, 'argumentValueNode'))) { + const paramName = valueSeed.name; + return `${paramName}.toByteArray()`; + } - throw new Error(`Unsupported seed type: ${(seed as TypeNode).kind}`); + const seedName = nameApi.instructionField(seed.name); + return `${seedName}.toByteArray()`; + } + return 'utf8.encode("fallback")'; }); } -function getDartTypeForSeed(typeNode: TypeNode): string { - // This would need to integrate with the existing type system - // For now, return basic types - if (typeNode.kind === 'stringTypeNode') return 'String'; - if (typeNode.kind === 'publicKeyTypeNode') return 'Ed25519HDPublicKey'; - if (typeNode.kind === 'numberTypeNode') return 'int'; - return 'dynamic'; -} - -function getEncodingForType(typeNode: TypeNode, value: string): string { - if (typeNode.kind === 'stringTypeNode') { - return `utf8.encode(${value})`; - } - if (typeNode.kind === 'publicKeyTypeNode') { - return `${value}.bytes`; - } - if (typeNode.kind === 'numberTypeNode') { - // Handle different number formats - return `Uint8List.fromList([${value}])`; - } - return value; -} - -export function generatePdaFunction(pdaNode: PdaNode, scope: Pick): Fragment { - const seeds = parsePdaSeeds(pdaNode); - const functionName = scope.nameApi.pdaFindFunction(pdaNode.name); - const variableSeeds = seeds.filter(s => s.type === 'variable'); +/** + * Creates a PDA derivation function fragment for a given account + */ +export function createInlinePdaFile( + accountName: string, + pdaNode: PdaNode, + pdaSeedValues: PdaSeedValueNode[] | undefined, + nameApi: RenderScope['nameApi'], + programPublicKey: string | undefined, + asPage: ( + fragment: TFragment, + pageOptions?: { libraryName?: string }, + ) => TFragment, +): Fragment | undefined { + const functionName = `find${accountName.charAt(0).toUpperCase() + accountName.slice(1)}Pda`; + const seeds = generatePdaSeeds(pdaNode, pdaSeedValues, nameApi); - const hasVariableSeeds = variableSeeds.length > 0; - const parameters = hasVariableSeeds ? variableSeeds.map(s => `required ${s.dartType} ${s.name}`).join(', ') : ''; + const parameters: string[] = []; - const seedExpressions = seeds.map(seed => { - switch (seed.type) { - case 'constant': - return seed.encoding; - case 'variable': - return seed.encoding; - case 'programId': - return 'programId.bytes'; - default: - throw new Error(`Unknown seed type: ${(seed).type}`); + pdaNode.seeds.forEach(seed => { + if (isNode(seed, 'variablePdaSeedNode')) { + const valueSeed = pdaSeedValues?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; + if (valueSeed && (isNode(valueSeed, 'accountValueNode') || isNode(valueSeed, 'argumentValueNode'))) { + // This is either an account or argument parameter + const paramName = valueSeed.name; + parameters.push(`Ed25519HDPublicKey ${paramName}`); + } } }); - // const programAddress = pdaNode.programId || 'programId'; + const parameterList = parameters.length > 0 ? parameters.join(', ') : ''; + const programIdValue = programPublicKey + ? `Ed25519HDPublicKey.fromBase58('${programPublicKey}')` + : 'PROGRAM_ID_HERE'; - return fragment` -/// Finds the PDA address for ${pdaNode.name} -static Future ${functionName}(${parameters}${hasVariableSeeds ? ', ' : ''}Ed25519HDPublicKey programId) async { + const content = `/// Returns the PDA address for ${accountName} +Future ${functionName}(${parameterList}) async { return Ed25519HDPublicKey.findProgramAddress( - seeds: [${seedExpressions.join(', ')}], - programId: programId, + seeds: [${seeds.join(', ')}], + programId: ${programIdValue}, ); }`; + + const imports = new Set(['package:solana/solana.dart', 'dart:typed_data']); + + const fragment: Fragment = { + content, + imports, + }; + + return asPage(fragment); } diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts index 9ca74c5..5415b9a 100644 --- a/src/utils/pubspec.ts +++ b/src/utils/pubspec.ts @@ -1,41 +1,31 @@ -export function generatePubspec(packageName: string, options: { - author?: string; - dependencies?: Record; - description?: string; - devDependencies?: Record; - homepage?: string; - version?: string; -} = {}): string { +export function generatePubspec( + packageName: string, + options: { + author?: string; + dependencies?: Record; + description?: string; + devDependencies?: Record; + homepage?: string; + version?: string; + } = {}, +): string { const { - description = 'Generated Dart package for Solana program interaction', + description = 'Generated Dart package for generated Solana program interaction', version = '1.0.0', author, homepage, dependencies = {}, - devDependencies = {} + devDependencies = {}, } = options; - // Default dependencies for Solana/blockchain development with Borsh serialization - const defaultDependencies = { - 'borsh': '^0.3.2', - 'borsh_annotation': '^0.3.1', - 'solana': '^1.0.0', - ...dependencies - }; - const defaultDevDependencies = { - 'build_runner': '^2.4.7', - 'lints': '^3.0.0', - 'test': '^1.24.0', - ...devDependencies + build_runner: '^2.4.7', + lints: '^3.0.0', + test: '^1.24.0', + ...devDependencies, }; - const sections = [ - `name: ${packageName}`, - `description: ${description}`, - `version: ${version}`, - `publish_to: none` - ]; + const sections = [`name: ${packageName}`, `description: ${description}`, `version: ${version}`, `publish_to: none`]; if (author) { sections.push(`author: ${author}`); @@ -45,18 +35,42 @@ export function generatePubspec(packageName: string, options: { sections.push(`homepage: ${homepage}`); } + sections.push('', 'environment:', ' sdk: ">=3.0.0 <4.0.0"'); + + // Add git-based dependencies + sections.push('', 'dependencies:'); + + // Borsh dependency sections.push( - '', - 'environment:', - " sdk: '>=3.0.0 <4.0.0'" + ' borsh:', + ' git:', + ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', + ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ' path: packages/borsh', ); - if (Object.keys(defaultDependencies).length > 0) { - sections.push('', 'dependencies:'); - Object.entries(defaultDependencies).forEach(([name, version]) => { - sections.push(` ${name}: ${version}`); - }); - } + // Borsh annotation dependency + sections.push( + ' borsh_annotation:', + ' git:', + ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', + ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ' path: packages/borsh_annotation', + ); + + // Solana dependency + sections.push( + ' solana:', + ' git:', + ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', + ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ' path: packages/solana', + ); + + // Add any additional dependencies + Object.entries(dependencies).forEach(([name, version]) => { + sections.push(` ${name}: ${version}`); + }); if (Object.keys(defaultDevDependencies).length > 0) { sections.push('', 'dev_dependencies:'); @@ -65,5 +79,16 @@ export function generatePubspec(packageName: string, options: { }); } + // Add dependency overrides + sections.push( + '', + 'dependency_overrides:', + ' borsh_annotation:', + ' git:', + ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', + ' path: packages/borsh_annotation', + ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ); + return sections.join('\n') + '\n'; -} \ No newline at end of file +} diff --git a/src/visitors/getRenderMapVisitor.ts b/src/visitors/getRenderMapVisitor.ts index d310cec..6b60260 100644 --- a/src/visitors/getRenderMapVisitor.ts +++ b/src/visitors/getRenderMapVisitor.ts @@ -1,7 +1,8 @@ -import { camelCase, getAllInstructionsWithSubs, getAllPrograms } from '@codama/nodes'; +import { camelCase, getAllInstructionsWithSubs, getAllPrograms, isNode } from '@codama/nodes'; import { createRenderMap, mergeRenderMaps } from '@codama/renderers-core'; import { extendVisitor, + findProgramNodeFromPath, getByteSizeVisitor, LinkableDictionary, NodeStack, @@ -12,7 +13,14 @@ import { visit, } from '@codama/visitors-core'; -import { getAccountPageFragment, getErrorPageFragment, getInstructionPageFragment, getStructTypeFragment } from '../fragments'; +import { + getAccountPageFragment, + getErrorPageFragment, + getInstructionPageFragment, + getLibraryIndexFragment, + getProgramPageFragment, + getStructTypeFragment, +} from '../fragments'; import { createImportMap, Fragment, @@ -24,13 +32,14 @@ import { parseCustomDataOptions, RenderScope, } from '../utils'; +import { createInlinePdaFile } from '../utils/pda'; export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { const linkables = new LinkableDictionary(); const stack = new NodeStack(); const byteSizeVisitor = getByteSizeVisitor(linkables, { stack }); - const libraryName = options.libraryName ?? 'generated'; + const libraryName = options.libraryName ?? 'lib'; const outputDirectory = options.outputDirectory ?? 'lib'; // Create the complete render scope @@ -43,7 +52,6 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { linkables, nameApi: getNameApi(options.nameTransformers), outputDirectory, - renderParentInstructions: options.renderParentInstructions ?? false, }; const asPage = ( @@ -75,7 +83,6 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { }, visitDefinedType(node) { - // Check if this is a struct type if (node.type.kind === 'structTypeNode') { return createRenderMap( `${outputDirectory}/types/${camelCase(node.name)}.dart`, @@ -94,7 +101,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { }, visitInstruction(node) { - return createRenderMap( + const instructionRenderMap = createRenderMap( `${outputDirectory}/instructions/${camelCase(node.name)}.dart`, asPage( getInstructionPageFragment({ @@ -104,19 +111,64 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { }), ), ); - }, - visitPda(_node) { - // PDA functionality is handled via existing pda.ts utilities in instruction generation - return createRenderMap(); + const pdaRenderMaps = new Map>(); + + node.accounts.forEach(account => { + if (account.defaultValue?.kind !== 'pdaValueNode') { + return; + } + if (!isNode(account.defaultValue.pda, 'pdaNode')) { + return; + } + + const pdaName = camelCase(account.name); + + // Avoid duplicate PDA files for the same account name + if (!pdaRenderMaps.has(pdaName)) { + const pdaFile = createInlinePdaFile( + account.name, + account.defaultValue.pda, + account.defaultValue.seeds, + renderScope.nameApi, + findProgramNodeFromPath(stack.getPath('instructionNode'))?.publicKey, + asPage, + ); + if (pdaFile) { + pdaRenderMaps.set( + pdaName, + createRenderMap(`${outputDirectory}/pdas/${pdaName}.dart`, pdaFile), + ); + } + } + }); + + const pdaRenderMapArray = Array.from(pdaRenderMaps.values()); + return mergeRenderMaps([instructionRenderMap, ...pdaRenderMapArray]); }, + // visitPda(node) { + // return createRenderMap( + // `${outputDirectory}/pdas/${camelCase(node.name)}.dart`, + // asPage( + // getPdaPageFragment({ + // ...renderScope, + // pdaPath: stack.getPath('pdaNode'), + // }), + // ), + // ); + // }, + visitProgram(node, { self }) { return mergeRenderMaps([ createRenderMap({ - [`${outputDirectory}/programs/${camelCase(node.name)}.dart`]: undefined, // TODO: Implement program fragment - [`${outputDirectory}/errors/${camelCase(node.name)}.dart`]: node.errors.length > 0 ? - asPage(getErrorPageFragment({ ...renderScope, programNode: node })) : undefined, + [`${outputDirectory}/programs/${camelCase(node.name)}.dart`]: asPage( + getProgramPageFragment({ ...renderScope, programNode: node }), + ), + [`${outputDirectory}/errors/${camelCase(node.name)}.dart`]: + node.errors.length > 0 + ? asPage(getErrorPageFragment({ ...renderScope, programNode: node })) + : undefined, }), ...node.pdas.map(p => visit(p, self)), ...node.accounts.map(a => visit(a, self)), @@ -127,13 +179,18 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { visitRoot(node, { self }) { const pubspecContent = generatePubspec(libraryName, { - description: `Generated Dart package for ${libraryName} Solana program interaction`, + description: `Generated Dart package for Solana program interaction`, version: '1.0.0', }); return mergeRenderMaps([ createRenderMap({ - [`${outputDirectory}/${libraryName}.dart`]: undefined, // TODO: Implement library index fragment + [`${outputDirectory}/${libraryName}.dart`]: asPage( + getLibraryIndexFragment({ + ...renderScope, + rootNode: node, + }), + ), [`pubspec.yaml`]: pubspecContent, }), ...getAllPrograms(node).map(p => visit(p, self)), diff --git a/src/visitors/index.ts b/src/visitors/index.ts index 5daccd5..8130e0e 100644 --- a/src/visitors/index.ts +++ b/src/visitors/index.ts @@ -1,2 +1,2 @@ export * from './getRenderMapVisitor'; -export * from './renderVisitor'; \ No newline at end of file +export * from './renderVisitor'; diff --git a/src/visitors/renderVisitor.ts b/src/visitors/renderVisitor.ts index b3eeaee..3f458cf 100644 --- a/src/visitors/renderVisitor.ts +++ b/src/visitors/renderVisitor.ts @@ -1,23 +1,38 @@ import { deleteDirectory, writeRenderMap } from '@codama/renderers-core'; import { rootNodeVisitor, visit } from '@codama/visitors-core'; +import { execSync } from 'child_process'; import { RenderOptions } from '../utils'; import { getRenderMapVisitor } from './getRenderMapVisitor'; -export function renderVisitor(path: string, options: RenderOptions = {}) { +export function renderVisitor( + path: string, + options: RenderOptions = { deleteFolderBeforeRendering: true, formatCode: true, libraryName: 'lib' }, +) { return rootNodeVisitor(root => { // Delete existing generated folder. if (options.deleteFolderBeforeRendering ?? true) { deleteDirectory(path); } - // Render the new files. const renderMap = visit(root, getRenderMapVisitor(options)); + writeRenderMap(renderMap, path); // Format the code using dart format if requested. - // For Dart code, we could use `dart format` command here in the future - // For now, we'll skip formatting and rely on the user's IDE/toolchain - - writeRenderMap(renderMap, path); + if (options.formatCode ?? true) { + try { + console.log('Formatting Dart code...'); + execSync(`dart format "${path}"`, { + cwd: process.cwd(), + stdio: 'ignore', + }); + console.log('Dart formatting completed successfully.'); + } catch (error) { + console.warn( + `Warning: Failed to format Dart code. Make sure Dart SDK is installed and accessible.: ${error instanceof Error ? error.message : String(error)}`, + ); + console.warn('You can manually format the code by running: dart format "' + path + '"'); + } + } }); } diff --git a/tsconfig.declarations.json b/tsconfig.declarations.json new file mode 100644 index 0000000..92a0313 --- /dev/null +++ b/tsconfig.declarations.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "emitDeclarationOnly": true, + "outDir": "./dist/types" + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json index 1b0281f..e1e276e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,7 @@ "strict": true, "target": "ESNext" }, - "display": "@codama/renderers-js", + "display": "@limechain/renderers-dart", "include": ["src", "test", "tsup.config.ts"], "exclude": ["node_modules", "test/e2e"] } diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..24697f2 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,28 @@ +import { env } from 'node:process'; + +import { defineConfig, Format, Options as TsupConfig } from 'tsup'; + +export default defineConfig([getBuildConfig('cjs'), getBuildConfig('esm')]); + +function getBuildConfig(format: Format): TsupConfig { + return { + define: { + __ESM__: `${format === 'esm'}`, + __NODEJS__: 'true', + __TEST__: 'false', + __VERSION__: `"${env.npm_package_version}"`, + }, + entry: ['./src/index.ts'], + esbuildOptions(options) { + options.define = { ...options.define, 'process.env.NODE_ENV': 'process.env.NODE_ENV' }; + }, + format, + outExtension({ format }) { + return { js: `.node.${format === 'cjs' ? 'cjs' : 'mjs'}` }; + }, + platform: 'node', + publicDir: true, + pure: ['process'], + sourcemap: true, + }; +} From b2c965e223ead4de5671e00fa31090302809ba3e Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Tue, 14 Oct 2025 13:47:37 +0300 Subject: [PATCH 03/16] fix: remove redundant code --- README.md | 123 +++++------- package.json | 5 +- src/fragments/accountPage.ts | 28 +-- src/fragments/errorPage.ts | 2 - src/fragments/instructionData.ts | 15 +- src/fragments/instructionFunction.ts | 38 +--- src/fragments/instructionPage.ts | 3 - src/fragments/libraryIndex.ts | 33 ++-- src/fragments/structType.ts | 8 +- src/utils/builtinPrograms.ts | 31 +-- src/utils/fragment.ts | 58 +----- src/utils/importMap.ts | 101 ---------- src/utils/index.ts | 3 +- src/utils/options.ts | 38 +--- src/utils/pda.ts | 2 +- src/utils/pubspec.ts | 20 +- src/utils/types.ts | 280 ++++----------------------- src/visitors/getRenderMapVisitor.ts | 48 +---- src/visitors/renderVisitor.ts | 8 +- 19 files changed, 159 insertions(+), 685 deletions(-) delete mode 100644 src/utils/importMap.ts diff --git a/README.md b/README.md index 2d6e9ee..31b3100 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,32 @@ [![npm-downloads][npm-downloads-image]][npm-url] [npm-downloads-image]: https://img.shields.io/npm/dm/@limechain/renderers-dart.svg?style=flat -[npm-image]: https://img.shields.io/npm/v/@limechain/renderers-dart.svg?style=flat&label=%40codama%2Frenderers-dart +[npm-image]: https://img.shields.io/npm/v/@limechain/renderers-dart.svg?style=flat&label=%40limechain%2Frenderers-dart [npm-url]: https://www.npmjs.com/package/@limechain/renderers-dart This package generates Dart clients from your Codama IDLs. The generated clients are compatible with the [`solana` Dart package](https://pub.dev/packages/solana). -## Installation +## 1. Pre-requisites + +### 1.1 Install Codama + +``` +pnpm install -g codama +``` + +### 1.2. Install Dart + +https://dart.dev/get-dart + +## 2. Renderer Installation ```sh pnpm install @limechain/renderers-dart ``` -## Usage +## 3. Usage -Add the following script to your Codama configuration file. +### 3.1. Add the following script into `codama.json`. ```json { @@ -27,7 +39,14 @@ Add the following script to your Codama configuration file. "dart": [ { "from": "@limechain/renderers-dart", - "args": ["generated"] + "args": [ + "generated", + { + "libraryName": "myProject", + "deleteFolderBeforeRendering": true, + "formatCode": true + } + ] } ] } @@ -36,13 +55,28 @@ Add the following script to your Codama configuration file. An object can be passed as a second argument to further configure the renderer. See the [Options](#options) section below for more details. -## Generated Output +### 3.2. Run code generation + +```sh +pnpm codama run dart +``` + +### 3.3. Run Dart Borsh code generation + +```sh + cd generated + dart pub get + dart run build_runner build +``` + +## 4. Generated Output The renderer generates a complete Dart package with the following structure: ``` lib/ ├── lib.dart # Main library export file +| ├── accounts/ # Account data classes │ ├── instructions/ # Instruction functions @@ -56,7 +90,7 @@ lib/ └── programs/ # Program constants and metadata ``` -## Features +## 5. Features - **Account Serialization/Deserialization**: Automatic Borsh serialization for all account types - **Instruction Builders**: Type-safe instruction creation with automatic PDA resolution @@ -64,74 +98,15 @@ lib/ - **Error Handling**: Strongly-typed program error definitions - **Type Safety**: Full Dart type safety with null safety support -## Options +## 6. Options The `renderVisitor` accepts the following options. -| Name | Type | Default | Description | -| ----------------------- | --------------------------- | ------- | -------------------------------------------------------------------------------------------- | -| `libraryName` | `string` | `'lib'` | The name of the generated Dart library. | -| `outputDirectory` | `string` | `'lib'` | The directory where generated files will be placed. | -| `customAccountData` | `string[]` | `[]` | The names of all `AccountNodes` whose data should be manually written in Dart. | -| `customInstructionData` | `string[]` | `[]` | The names of all `InstructionNodes` whose data should be manually written in Dart. | -| `nameTransformers` | `Partial` | `{}` | An object that enables us to override the names of any generated type, constant or function. | - -## Example - -Here's an example of using a generated Dart client: - -```dart -import 'package:solana/solana.dart'; -import 'lib/generated.dart'; +| Name | Type | Default | Description | +| ----------------------------- | -------- | ------- | --------------------------------------------------------------- | +| `libraryName` | `string` | `'lib'` | The name of the generated Dart library. | +| `outputDirectory` | `string` | `'lib'` | The directory where generated files will be placed. | +| `deleteFolderBeforeRendering` | `bool` | `true` | Flag for deleting the output folder before generating it again. | +| `formatCode` | `bool` | `true` | Flag for formatting the Dart code after generation | -void main() async { - // Create a connection to Solana - final connection = SolanaClient.mainnet(); - - // Create instruction with automatic PDA resolution - final instruction = await initializeInstruction( - admin: adminPublicKey, - initialBonus: 10, - ); - - // Build and send transaction - final transaction = Transaction( - instructions: [instruction], - recentBlockhash: await connection.getLatestBlockhash(), - ); - - await connection.sendTransaction(transaction, [adminKeypair]); -} -``` - -## Generated PDA Functions - -The renderer automatically generates PDA derivation functions: - -```dart -// Generated PDA function -Future findConfigPda() async { - return Ed25519HDPublicKey.findProgramAddress( - seeds: [utf8.encode("program_config")], - programId: Ed25519HDPublicKey.fromBase58('PROGRAM_ID_HERE'), - ); -} - -// Usage -final configPda = await findConfigPda(); -``` - -## Dependencies - -Generated Dart code depends on: - -- `solana`: For Solana blockchain interaction -- `dart:convert`: For UTF-8 encoding -- `dart:typed_data`: For byte array handling - -Make sure to add these to your `pubspec.yaml`: - -```yaml -dependencies: - solana: ^0.30.0 -``` +
diff --git a/package.json b/package.json index 2f43460..36c324d 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,7 @@ "dependencies": { "@codama/nodes": "^1.3.7", "@codama/renderers-core": "^1.2.2", - "@codama/visitors-core": "^1.3.7", - "prettier": "^3.6.2" + "@codama/visitors-core": "^1.3.7" }, "devDependencies": { "@solana/eslint-config-solana": "^5.0.0", @@ -51,4 +50,4 @@ }, "packageManager": "pnpm@10.15.1", "prettier": "@solana/prettier-config-solana" -} \ No newline at end of file +} diff --git a/src/fragments/accountPage.ts b/src/fragments/accountPage.ts index e4e8583..bd43397 100644 --- a/src/fragments/accountPage.ts +++ b/src/fragments/accountPage.ts @@ -1,17 +1,16 @@ -import { AccountNode, isNode, ProgramNode, resolveNestedTypeNode } from '@codama/nodes'; +import { AccountNode, isNode, resolveNestedTypeNode } from '@codama/nodes'; import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; import { createFragment, Fragment, getBorshAnnotation, getTypeInfo, RenderScope } from '../utils'; export function getAccountPageFragment( - scope: Pick & { + scope: Pick & { accountPath: NodePath; size: number | null; }, ): Fragment { const node = getLastNodeFromPath(scope.accountPath); const className = scope.nameApi.accountType(node.name); - const size = scope.size; const programNode = findProgramNodeFromPath(scope.accountPath); if (!programNode) { throw new Error(`Could not find program node for account: ${node.name}`); @@ -20,7 +19,7 @@ export function getAccountPageFragment( const dataTypeNode = resolveNestedTypeNode(node.data); if (dataTypeNode.kind === 'structTypeNode') { - return getStructAccountFragment(node, scope, className, size, programNode); + return getStructAccountFragment(node, scope, className); } const typeInfo = getTypeInfo(dataTypeNode, scope.nameApi); @@ -44,17 +43,13 @@ class ${className} with _$${className} { return _$${className}FromBorsh(data); } - String _indent(String text, int level) { - final indent = ' ' * level; - return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); - } @override String toString([int indent = 0]) { final buffer = StringBuffer(); buffer.writeln('${className}('); - buffer.writeln(_indent('data: $data', indent + 1)); - buffer.write(_indent(')', indent)); + buffer.writeln(' data: $data'); + buffer.write(')'); return buffer.toString(); } }`; @@ -64,18 +59,15 @@ class ${className} with _$${className} { function getStructAccountFragment( node: AccountNode, - scope: Pick & { + scope: Pick & { accountPath: NodePath; size: number | null; }, className: string, - _size: number | null, - _programNode: ProgramNode, ): Fragment { const dataTypeNode = resolveNestedTypeNode(node.data); const fields = isNode(dataTypeNode, 'structTypeNode') ? dataTypeNode.fields : []; - // Generate factory constructor parameters with Borsh annotations const factoryParams = fields .map(field => { const typeInfo = getTypeInfo(field.type, scope.nameApi); @@ -105,10 +97,6 @@ ${factoryParams} return _$${className}FromBorsh(data); } - String _indent(String text, int level) { - final indent = ' ' * level; - return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); - } @override String toString([int indent = 0]) { @@ -117,10 +105,10 @@ ${factoryParams} ${fields .map(field => { const fieldName = scope.nameApi.accountField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + return `buffer.writeln(' ${fieldName}: $${fieldName}');`; }) .join('\n ')} - buffer.write(_indent(')', indent)); + buffer.write(')'); return buffer.toString(); } }`; diff --git a/src/fragments/errorPage.ts b/src/fragments/errorPage.ts index ecf2163..7395b83 100644 --- a/src/fragments/errorPage.ts +++ b/src/fragments/errorPage.ts @@ -11,7 +11,6 @@ export function getErrorPageFragment( const className = nameApi.programErrorClass(programNode.name); const errors = [...programNode.errors].sort((a, b) => a.code - b.code); - // Generate error constants with individual docs const errorConstants = errors .map(error => { const constantName = nameApi.errorConstant(error.name); @@ -21,7 +20,6 @@ export function getErrorPageFragment( }) .join('\n'); - // Generate error messages map const errorMessages = errors .map(error => { const constantName = nameApi.errorConstant(error.name); diff --git a/src/fragments/instructionData.ts b/src/fragments/instructionData.ts index 20a5400..e4ca36a 100644 --- a/src/fragments/instructionData.ts +++ b/src/fragments/instructionData.ts @@ -12,13 +12,11 @@ export function getInstructionDataFragment( const { instructionPath, nameApi } = scope; const instructionNode = getLastNodeFromPath(instructionPath); - // Skip if no arguments if (instructionNode.arguments.length === 0) return; const instructionDataName = nameApi.instructionDataType(instructionNode.name); const structNode = structTypeNodeFromInstructionArgumentNodes(instructionNode.arguments); - // Generate factory constructor parameters with Borsh annotations (excluding discriminator) const factoryParams = structNode.fields .filter(field => field.name !== 'discriminator') // Exclude discriminator field .map(field => { @@ -29,13 +27,11 @@ export function getInstructionDataFragment( }) .join('\n'); - // Generate validation for fixed-size fields (excluding discriminator to avoid duplication) const validations = structNode.fields .filter(field => field.name !== 'discriminator') .map(field => { const fieldName = nameApi.instructionField(field.name); - // Handle fixedSizeTypeNode if (field.type.kind === 'fixedSizeTypeNode') { const size = field.type.size; if (field.type.type.kind === 'bytesTypeNode') { @@ -45,7 +41,6 @@ export function getInstructionDataFragment( } } - // Handle arrayTypeNode with fixed count if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { const size = field.type.count.value; return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; @@ -56,12 +51,10 @@ export function getInstructionDataFragment( .filter(v => v) .join('\n'); - // Add validation for discriminator (always 8 bytes) + other validations const allValidations = validations ? ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');\n${validations}` : ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');`; - // Collect all imports const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart']); structNode.fields.forEach(field => { const typeInfo = getTypeInfo(field.type, nameApi); @@ -106,10 +99,6 @@ ${structNode.fields return _$${instructionDataName}FromBorsh(data); } - String _indent(String text, int level) { - final indent = ' ' * level; - return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); - } @override String toString([int indent = 0]) { @@ -118,10 +107,10 @@ ${structNode.fields ${structNode.fields .map(field => { const fieldName = nameApi.instructionField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + return `buffer.writeln(' ${fieldName}: $${fieldName}');`; }) .join('\n ')} - buffer.write(_indent(')', indent)); + buffer.write(')'); return buffer.toString(); } }`; diff --git a/src/fragments/instructionFunction.ts b/src/fragments/instructionFunction.ts index 7f17ad0..3c5383b 100644 --- a/src/fragments/instructionFunction.ts +++ b/src/fragments/instructionFunction.ts @@ -21,34 +21,27 @@ export function getInstructionFunctionFragment( const hasAccounts = instructionNode.accounts.length > 0; const hasArguments = instructionNode.arguments.length > 0; - // Generate function parameters const params: string[] = []; - // Add account parameters if (hasAccounts) { instructionNode.accounts.forEach(account => { const accountName = nameApi.instructionField(account.name); - // Check if this account has a default PDA value const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); - // Check if this account has a builtin program default const builtinAddress = getBuiltinProgramAddress(account.name); - // Check if PDA can be auto-derived (doesn't reference instruction arguments) let canAutoderivePda = false; if (hasDefaultPda) { const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { canAutoderivePda = true; - // Check all seeds to see if any reference instruction arguments for (const seed of pdaValue.pda.seeds) { if (isNode(seed, 'variablePdaSeedNode')) { const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; break; @@ -59,7 +52,6 @@ export function getInstructionFunctionFragment( } if ((hasDefaultPda && canAutoderivePda) || builtinAddress) { - // Make the parameter optional if it has a derivable PDA default or builtin program default const accountParam = `Ed25519HDPublicKey? ${accountName}`; params.push(accountParam); } else { @@ -69,22 +61,18 @@ export function getInstructionFunctionFragment( }); } - // Add instruction data parameter if (hasArguments) { params.push(`required ${instructionDataName} data`); } - // Add program ID parameter (optional, with default) params.push('Ed25519HDPublicKey? programId'); const parameterList = params.length > 0 ? `{\n ${params.join(',\n ')}\n}` : ''; - // Generate PDA resolution and account metas let pdaResolutionCode = ''; let accountMetas = ''; if (hasAccounts) { - // Generate PDA resolution and builtin program defaults for accounts with default values const pdaResolutions: string[] = []; instructionNode.accounts.forEach(account => { @@ -92,20 +80,17 @@ export function getInstructionFunctionFragment( const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); const builtinAddress = getBuiltinProgramAddress(account.name); - // Check if PDA can be auto-derived (doesn't reference instruction arguments) let canAutoderivePda = false; if (hasDefaultPda) { const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { canAutoderivePda = true; - // Check all seeds to see if any reference instruction arguments for (const seed of pdaValue.pda.seeds) { if (isNode(seed, 'variablePdaSeedNode')) { const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; break; @@ -116,7 +101,6 @@ export function getInstructionFunctionFragment( } if (hasDefaultPda && canAutoderivePda) { - // Generate PDA derivation code only for derivable PDAs const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { const seeds = generatePdaSeeds(pdaValue.pda, pdaValue.seeds, nameApi); @@ -127,7 +111,6 @@ export function getInstructionFunctionFragment( ); } } else if (builtinAddress) { - // Generate builtin program default pdaResolutions.push( ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? Ed25519HDPublicKey.fromBase58('${builtinAddress}');`, ); @@ -138,27 +121,23 @@ export function getInstructionFunctionFragment( pdaResolutionCode = pdaResolutions.join('\n') + '\n\n'; } - // Generate account meta list with resolved PDAs and builtin programs const accountMetaList = instructionNode.accounts .map(account => { const accountName = nameApi.instructionField(account.name); const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); const builtinAddress = getBuiltinProgramAddress(account.name); - // Check if PDA can be auto-derived (doesn't reference instruction arguments) let canAutoderivePda = false; if (hasDefaultPda) { const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { canAutoderivePda = true; - // Check all seeds to see if any reference instruction arguments for (const seed of pdaValue.pda.seeds) { if (isNode(seed, 'variablePdaSeedNode')) { const valueSeed = pdaValue.seeds?.find( (s: PdaSeedValueNode) => s.name === seed.name, )?.value; - // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderivePda = false; break; @@ -173,8 +152,8 @@ export function getInstructionFunctionFragment( ? `resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)}` : accountName; - const isWriteable = account.isWritable ? 'true' : 'false'; - const isSigner = account.isSigner === true ? 'true' : 'false'; + const isWriteable = String(account.isWritable); + const isSigner = String(account.isSigner === true); return ` AccountMeta(\n pubKey: ${resolvedAccountName},\n isSigner: ${isSigner},\n isWriteable: ${isWriteable},\n )`; }) @@ -185,7 +164,6 @@ export function getInstructionFunctionFragment( accountMetas = ' final accounts = [];\n'; } - // Generate instruction data serialization let dataSerializationCode = ''; if (hasArguments) { dataSerializationCode = ` final instructionData = ByteArray(data.toBorsh());\n`; @@ -193,12 +171,10 @@ export function getInstructionFunctionFragment( dataSerializationCode = ` final instructionData = ByteArray.empty();\n`; } - // Determine if function needs to be async (if any derivable PDAs need to be resolved) const needsAsync = instructionNode.accounts.some(account => { const hasDefaultPda = account.defaultValue && isNode(account.defaultValue, 'pdaValueNode'); if (!hasDefaultPda) return false; - // Check if PDA can be auto-derived (doesn't reference instruction arguments) const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { let canAutoderive = true; @@ -206,7 +182,6 @@ export function getInstructionFunctionFragment( if (isNode(seed, 'variablePdaSeedNode')) { const valueSeed = pdaValue.seeds?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; - // If seed references an instruction argument (not an account), can't auto-derive if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { canAutoderive = false; break; @@ -218,7 +193,6 @@ export function getInstructionFunctionFragment( return false; }); - // Generate the function body const functionBody = `${pdaResolutionCode}${accountMetas}${dataSerializationCode} return Instruction( programId: programId ?? Ed25519HDPublicKey.fromBase58('${programNode.publicKey ?? 'PROGRAM_ID_HERE'}'), @@ -235,15 +209,7 @@ ${asyncModifier}Instruction${asyncSuffix} ${functionName}(${parameterList}) ${as ${functionBody} }`; - // Collect imports const imports = new Set(['package:solana/solana.dart']); - // // Add dart:convert import if we're using utf8.encode - // if (needsAsync) { - // imports.add('dart:convert'); - // } - - // Note: instruction data class is generated in the same file, no import needed - return createFragment(content, Array.from(imports)); } diff --git a/src/fragments/instructionPage.ts b/src/fragments/instructionPage.ts index 359b92a..86f9d7a 100644 --- a/src/fragments/instructionPage.ts +++ b/src/fragments/instructionPage.ts @@ -17,19 +17,16 @@ export function getInstructionPageFragment( const fragments: Fragment[] = []; - // Generate instruction data type (arguments) const dataFragment = getInstructionDataFragment(scope); if (dataFragment) { fragments.push(dataFragment); } - // Generate instruction function const functionFragment = getInstructionFunctionFragment(scope); if (functionFragment) { fragments.push(functionFragment); } - // Combine all fragments const content = fragments.map(f => f.content).join('\n\n'); const imports = new Set(); fragments.forEach(f => f.imports.forEach(imp => imports.add(imp))); diff --git a/src/fragments/libraryIndex.ts b/src/fragments/libraryIndex.ts index 2134142..38e08f6 100644 --- a/src/fragments/libraryIndex.ts +++ b/src/fragments/libraryIndex.ts @@ -1,5 +1,4 @@ -import { getAllInstructionsWithSubs, getAllPrograms } from '@codama/nodes'; -import { RootNode } from '@codama/nodes'; +import { getAllInstructionsWithSubs, getAllPrograms, RootNode } from '@codama/nodes'; import { Fragment } from '../utils'; @@ -10,41 +9,37 @@ export function getLibraryIndexFragment(scope: { rootNode: RootNode }): Fragment const exports: string[] = []; programs.forEach(program => { + // Export accounts program.accounts.forEach(account => { exports.push(`export 'accounts/${account.name}.dart';`); }); - }); - programs.forEach(program => { - getAllInstructionsWithSubs(program, { leavesOnly: true }).forEach(instruction => { + // Export instructions + const instructions = getAllInstructionsWithSubs(program, { leavesOnly: true }); + instructions.forEach(instruction => { exports.push(`export 'instructions/${instruction.name}.dart';`); + + // Export PDAs from instruction accounts + instruction.accounts.forEach(account => { + if (account.defaultValue?.kind === 'pdaValueNode') { + exports.push(`export 'pdas/${account.name}.dart';`); + } + }); }); - }); - programs.forEach(program => { + // Export defined types program.definedTypes.forEach(type => { if (type.type.kind === 'structTypeNode') { exports.push(`export 'types/${type.name}.dart';`); } }); - }); - programs.forEach(program => { + // Export errors if (program.errors.length > 0) { exports.push(`export 'errors/${program.name}.dart';`); } }); - programs.forEach(program => { - getAllInstructionsWithSubs(program, { leavesOnly: true }).forEach(instruction => { - instruction.accounts.forEach(account => { - if (account.defaultValue?.kind === 'pdaValueNode') { - exports.push(`export 'pdas/${account.name}.dart';`); - } - }); - }); - }); - exports.sort(); const uniqueExports = Array.from(new Set(exports)); diff --git a/src/fragments/structType.ts b/src/fragments/structType.ts index ec3a02c..565994b 100644 --- a/src/fragments/structType.ts +++ b/src/fragments/structType.ts @@ -82,10 +82,6 @@ ${fields return _$${className}FromBorsh(data); } - String _indent(String text, int level) { - final indent = ' ' * level; - return text.split('\\n').map((line) => line.isEmpty ? line : '$indent$line').join('\\n'); - } @override String toString([int indent = 0]) { @@ -94,10 +90,10 @@ ${fields ${fields .map(field => { const fieldName = nameApi.accountField(field.name); - return `buffer.writeln(_indent('${fieldName}: $${fieldName}', indent + 1));`; + return `buffer.writeln(' ${fieldName}: $${fieldName}');`; }) .join('\n ')} - buffer.write(_indent(')', indent)); + buffer.write(')'); return buffer.toString(); } }`; diff --git a/src/utils/builtinPrograms.ts b/src/utils/builtinPrograms.ts index 9bc5a0b..10964b7 100644 --- a/src/utils/builtinPrograms.ts +++ b/src/utils/builtinPrograms.ts @@ -1,36 +1,7 @@ -// Builtin Solana program mappings export const BUILTIN_PROGRAMS: Record = { - // clockSysvar: 'SysvarC1ock11111111111111111111111111111111', - // instructionsSysvar: 'Sysvar1nstructions1111111111111111111111111', - // recentBlockhashesSysvar: 'SysvarRecentB1ockHashes11111111111111111111', - // rentSysvar: 'SysvarRent111111111111111111111111111111111', - // tokenProgram: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', systemProgram: '11111111111111111111111111111111', }; export function getBuiltinProgramAddress(accountName: string): string | null { - - // Direct mapping - if (BUILTIN_PROGRAMS[accountName]) { - return BUILTIN_PROGRAMS[accountName]; - } - - // // Pattern matching for common variations - // if (accountName === 'systemProgram') { - // return BUILTIN_PROGRAMS['systemProgram']; - // } - // if (lowerName.includes('token') && !lowerName.includes('associated')) { - // return BUILTIN_PROGRAMS['tokenProgram']; - // } - // if (lowerName.includes('rent')) { - // return BUILTIN_PROGRAMS['rentSysvar']; - // } - // if (lowerName.includes('clock')) { - // return BUILTIN_PROGRAMS['clockSysvar']; - // } - // if (lowerName.includes('instruction')) { - // return BUILTIN_PROGRAMS['instructionsSysvar']; - // } - - return null; + return BUILTIN_PROGRAMS[accountName] || null; } diff --git a/src/utils/fragment.ts b/src/utils/fragment.ts index 367ca37..bb16e09 100644 --- a/src/utils/fragment.ts +++ b/src/utils/fragment.ts @@ -1,4 +1,4 @@ -import { BaseFragment, createFragmentTemplate } from '@codama/renderers-core'; +import { BaseFragment } from '@codama/renderers-core'; export type Fragment = BaseFragment & { imports: Set; @@ -13,21 +13,6 @@ export function createFragment(content: string, imports: string[] = []): Fragmen }; } -export function isFragment(value: unknown): value is Fragment { - return ( - typeof value === 'object' && - value !== null && - 'content' in value && - 'imports' in value && - typeof (value as Record).content === 'string' && - (value as Record).imports instanceof Set - ); -} - -export function fragment(template: TemplateStringsArray, ...items: unknown[]): Fragment { - return createFragmentTemplate(template, items, isFragment, mergeFragments); -} - export function mergeFragments(fragments: Fragment[]): Fragment { const allImports = new Set(); const contents: string[] = []; @@ -55,22 +40,19 @@ export function getDocblockFragment(lines: string[]): Fragment | undefined { export function getPageFragment( page: Fragment, options: { - addHeader?: boolean; libraryName?: string; } = {}, ): Fragment { - const { addHeader = true, libraryName } = options; + const { libraryName } = options; // Create header fragment - const header = addHeader - ? getDocblockFragment([ - 'This code was AUTOGENERATED using the Codama library.', - 'Please DO NOT EDIT THIS FILE, instead use visitors', - 'to add features, then rerun Codama to update it.', - '', - 'See: https://github.com/codama-idl/codama', - ]) - : undefined; + const header = getDocblockFragment([ + 'This code was AUTOGENERATED using the Codama library.', + 'Please DO NOT EDIT THIS FILE, instead use visitors', + 'to add features, then rerun Codama to update it.', + '', + 'See: https://github.com/codama-idl/codama', + ]); // Create library fragment const library = libraryName ? createFragment(`library ${libraryName};`) : undefined; @@ -105,25 +87,3 @@ export function getPageFragment( return merged; } - -// Helper function to add common imports -export function addImport(fragment: Fragment, importPath: string): Fragment { - const newImports = new Set(fragment.imports); - newImports.add(importPath); - - return { - ...fragment, - imports: newImports, - }; -} - -// Helper function to add multiple imports -export function addImports(fragment: Fragment, imports: string[]): Fragment { - const newImports = new Set(fragment.imports); - imports.forEach(imp => newImports.add(imp)); - - return { - ...fragment, - imports: newImports, - }; -} diff --git a/src/utils/importMap.ts b/src/utils/importMap.ts deleted file mode 100644 index 3c1e41a..0000000 --- a/src/utils/importMap.ts +++ /dev/null @@ -1,101 +0,0 @@ -export type ImportMap = Map>; - -export function createImportMap(): ImportMap { - return new Map(); -} - -export function addToImportMap(importMap: ImportMap, modulePath: string, imports: string[]): ImportMap { - const newMap = new Map(importMap); - const existing = newMap.get(modulePath) || new Set(); - imports.forEach(imp => existing.add(imp)); - newMap.set(modulePath, existing); - return newMap; -} - -export function mergeImportMaps(maps: ImportMap[]): ImportMap { - const result = createImportMap(); - maps.forEach(map => { - map.forEach((imports, modulePath) => { - const existing = result.get(modulePath) || new Set(); - imports.forEach(imp => existing.add(imp)); - result.set(modulePath, existing); - }); - }); - return result; -} - -export function importMapToString(importMap: ImportMap): string { - if (importMap.size === 0) return ''; - - const imports: string[] = []; - - // Sort import groups: dart:, package:, relative - const dartImports: [string, Set][] = []; - const packageImports: [string, Set][] = []; - const relativeImports: [string, Set][] = []; - - importMap.forEach((importSet, modulePath) => { - const entry: [string, Set] = [modulePath, importSet]; - if (modulePath.startsWith('dart:')) { - dartImports.push(entry); - } else if (modulePath.startsWith('package:')) { - packageImports.push(entry); - } else { - relativeImports.push(entry); - } - }); - - // Sort within each group - dartImports.sort(([a], [b]) => a.localeCompare(b)); - packageImports.sort(([a], [b]) => a.localeCompare(b)); - relativeImports.sort(([a], [b]) => a.localeCompare(b)); - - // Generate import statements - [...dartImports, ...packageImports, ...relativeImports].forEach(([modulePath, importSet]) => { - if (importSet.size === 0) { - imports.push(`import '${modulePath}';`); - } else { - const sortedImports = Array.from(importSet).sort(); - if (sortedImports.length === 1) { - imports.push(`import '${modulePath}' show ${sortedImports[0]};`); - } else { - imports.push(`import '${modulePath}' show ${sortedImports.join(', ')};`); - } - } - }); - - return imports.join('\n'); -} - -export type GetImportFromFunction = (importedName: string, currentFilePath: string) => string; - -export function getImportFromFactory(): GetImportFromFunction { - return (importedName: string, currentFilePath: string): string => { - // Simple relative import logic - // In a real implementation, this would be more sophisticated - const parts = currentFilePath.split('/'); - const depth = parts.length - 1; - const prefix = depth > 1 ? '../'.repeat(depth - 1) : './'; - - // Determine the import path based on naming conventions - if (importedName.endsWith('Account')) { - return `${prefix}accounts/${camelCase(importedName.replace('Account', ''))}.dart`; - } - if (importedName.endsWith('Instruction')) { - return `${prefix}instructions/${camelCase(importedName.replace('Instruction', ''))}.dart`; - } - if (importedName.endsWith('Program')) { - return `${prefix}programs/${camelCase(importedName.replace('Program', ''))}.dart`; - } - if (importedName.endsWith('Error')) { - return `${prefix}errors/${camelCase(importedName.replace('Error', ''))}.dart`; - } - - // Default to types directory - return `${prefix}types/${camelCase(importedName)}.dart`; - }; -} - -function camelCase(str: string): string { - return str.charAt(0).toLowerCase() + str.slice(1); -} diff --git a/src/utils/index.ts b/src/utils/index.ts index 33367d8..b118607 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,7 @@ export * from './types'; export * from './fragment'; -export * from './importMap'; export * from './nameTransformers'; export * from './options'; export * from './pubspec'; +export * from './builtinPrograms'; +export * from './pda'; diff --git a/src/utils/options.ts b/src/utils/options.ts index 659305d..72b3735 100644 --- a/src/utils/options.ts +++ b/src/utils/options.ts @@ -1,7 +1,3 @@ -import { CamelCaseString } from '@codama/nodes'; -import { LinkableDictionary } from '@codama/visitors-core'; - -import { GetImportFromFunction, ImportMap } from './importMap'; import { NameApi } from './nameTransformers'; export type RenderOptions = GetRenderMapOptions & { @@ -10,45 +6,13 @@ export type RenderOptions = GetRenderMapOptions & { }; export type GetRenderMapOptions = { - customAccountData?: CustomDataOptions[]; - customInstructionData?: CustomDataOptions[]; libraryName?: string; nameTransformers?: Partial; - outputDirectory?: string; - pubspecName?: string; -}; - -export type CustomDataOptions = { - extractType: boolean; - name: CamelCaseString; + outputDirectory: string; }; -export type ParsedCustomDataOptions = Map; - export type RenderScope = { - // Custom data handling - customAccountData: ParsedCustomDataOptions; - customInstructionData: ParsedCustomDataOptions; - - getImportFrom: GetImportFromFunction; - - // Import management - imports: ImportMap; - // Core configuration libraryName: string; - - // Cross-reference systems - linkables: LinkableDictionary; - // Naming and transformations nameApi: NameApi; - outputDirectory: string; }; - -export function parseCustomDataOptions(options: CustomDataOptions[]): ParsedCustomDataOptions { - const map = new Map(); - options.forEach(option => { - map.set(option.name, option); - }); - return map; -} diff --git a/src/utils/pda.ts b/src/utils/pda.ts index cf68bb6..4d314f9 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -61,7 +61,7 @@ export function createInlinePdaFile( pageOptions?: { libraryName?: string }, ) => TFragment, ): Fragment | undefined { - const functionName = `find${accountName.charAt(0).toUpperCase() + accountName.slice(1)}Pda`; + const functionName = `derive${accountName.charAt(0).toUpperCase() + accountName.slice(1)}Pda`; const seeds = generatePdaSeeds(pdaNode, pdaSeedValues, nameApi); const parameters: string[] = []; diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts index 5415b9a..6e4428d 100644 --- a/src/utils/pubspec.ts +++ b/src/utils/pubspec.ts @@ -1,3 +1,7 @@ +// Constants for Git-based dependencies +const REPO_URL = 'https://github.com/vlady-kotsev/espresso-cash-public.git'; +const REPO_REF = '88f5db7cb883a8e81ed4932fee4933f1a97e5b79'; + export function generatePubspec( packageName: string, options: { @@ -44,8 +48,8 @@ export function generatePubspec( sections.push( ' borsh:', ' git:', - ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', - ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ` url: ${REPO_URL}`, + ` ref: ${REPO_REF}`, ' path: packages/borsh', ); @@ -53,8 +57,8 @@ export function generatePubspec( sections.push( ' borsh_annotation:', ' git:', - ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', - ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ` url: ${REPO_URL}`, + ` ref: ${REPO_REF}`, ' path: packages/borsh_annotation', ); @@ -62,8 +66,8 @@ export function generatePubspec( sections.push( ' solana:', ' git:', - ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', - ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ` url: ${REPO_URL}`, + ` ref: ${REPO_REF}`, ' path: packages/solana', ); @@ -85,9 +89,9 @@ export function generatePubspec( 'dependency_overrides:', ' borsh_annotation:', ' git:', - ' url: https://github.com/vlady-kotsev/espresso-cash-public.git', + ` url: ${REPO_URL}`, ' path: packages/borsh_annotation', - ' ref: 88f5db7cb883a8e81ed4932fee4933f1a97e5b79', + ` ref: ${REPO_REF}`, ); return sections.join('\n') + '\n'; diff --git a/src/utils/types.ts b/src/utils/types.ts index 76a75f3..9df6b05 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -6,12 +6,16 @@ import { OptionTypeNode, resolveNestedTypeNode, SizePrefixTypeNode, - StringTypeNode, TypeNode, } from '@codama/nodes'; import { NameApi } from './nameTransformers'; +// Constants for hardcoded values +const DEFAULT_PUBLIC_KEY = '11111111111111111111111111111111'; +const TYPES_IMPORT_PREFIX = '../types/'; +const SOLANA_PUBLIC_KEY_SIZE = 32; + export interface TypeInfo { dartType: string; defaultValue: string; @@ -19,29 +23,20 @@ export interface TypeInfo { serializationSize?: number; } -// We need RenderScope for name transformers when handling defined type links -export type TypeInfoScope = { - nameApi: { - definedType: (name: string) => string; - }; -}; - export function getTypeInfo(typeNode: TypeNode, nameApi: NameApi): TypeInfo { switch (typeNode.kind) { case 'numberTypeNode': - return getNumberTypeInfo(typeNode as NumberTypeNode); + return getNumberTypeInfo(typeNode); case 'booleanTypeNode': return getBooleanTypeInfo(); case 'stringTypeNode': - return getStringTypeInfo(typeNode as StringTypeNode); + return getStringTypeInfo(); case 'bytesTypeNode': return getBytesTypeInfo(); case 'arrayTypeNode': - return getArrayTypeInfo(typeNode as ArrayTypeNode, nameApi); + return getArrayTypeInfo(typeNode, nameApi); case 'optionTypeNode': - return getOptionTypeInfo(typeNode as OptionTypeNode, nameApi); - // case 'tupleTypeNode': - // return getTupleTypeInfo(typeNode as TupleTypeNode); + return getOptionTypeInfo(typeNode, nameApi); case 'setTypeNode': return getSetTypeInfo(); case 'mapTypeNode': @@ -50,19 +45,16 @@ export function getTypeInfo(typeNode: TypeNode, nameApi: NameApi): TypeInfo { return getDateTimeTypeInfo(); case 'publicKeyTypeNode': return getPublicKeyTypeInfo(); - // case 'structTypeNode': - // return getStructTypeInfo(typeNode as StructTypeNode); case 'fixedSizeTypeNode': - return getFixedSizeTypeInfo(typeNode as FixedSizeTypeNode, nameApi); + return getFixedSizeTypeInfo(typeNode, nameApi); case 'solAmountTypeNode': return getAmountTypeInfo(); case 'definedTypeLinkNode': - return getDefinedTypeLinkTypeInfo(typeNode as DefinedTypeLinkNode, nameApi.definedType(typeNode.name)); + return getDefinedTypeLinkTypeInfo(typeNode, nameApi.definedType(typeNode.name)); case 'sizePrefixTypeNode': - return getSizePrefixTypeInfo(typeNode as SizePrefixTypeNode); + return getSizePrefixTypeInfo(typeNode); default: // For unsupported types, return a generic object type - console.log(`DEBUG: Unsupported type node kind: ${typeNode.kind}`, typeNode); return { dartType: 'Object', defaultValue: 'Object()', @@ -74,99 +66,34 @@ export function getTypeInfo(typeNode: TypeNode, nameApi: NameApi): TypeInfo { function getNumberTypeInfo(node: NumberTypeNode): TypeInfo { const { format } = node; - // Map Codama number formats to Dart types - switch (format) { - case 'u8': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 1, - }; - case 'u16': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 2, - }; - case 'u32': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 4, - }; - case 'u64': - return { - dartType: 'BigInt', - defaultValue: 'BigInt.zero', - imports: [], - serializationSize: 8, - }; - case 'u128': - return { - dartType: 'BigInt', - defaultValue: 'BigInt.zero', - imports: [], - serializationSize: 16, - }; - case 'i8': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 1, - }; - case 'i16': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 2, - }; - case 'i32': - return { - dartType: 'int', - defaultValue: '0', - imports: [], - serializationSize: 4, - }; - case 'i64': - return { - dartType: 'BigInt', - defaultValue: 'BigInt.zero', - imports: [], - serializationSize: 8, - }; - case 'i128': - return { - dartType: 'BigInt', - defaultValue: 'BigInt.zero', - imports: [], - serializationSize: 16, - }; - case 'f32': - return { - dartType: 'double', - defaultValue: '0.0', - imports: [], - serializationSize: 4, - }; - case 'f64': - return { - dartType: 'double', - defaultValue: '0.0', - imports: [], - serializationSize: 8, - }; - default: - return { - dartType: 'num', - defaultValue: '0', - imports: [], - }; + const numberTypeMap: Record = { + f32: { dartType: 'double', defaultValue: '0.0', serializationSize: 4 }, + f64: { dartType: 'double', defaultValue: '0.0', serializationSize: 8 }, + i128: { dartType: 'BigInt', defaultValue: 'BigInt.zero', serializationSize: 16 }, + i16: { dartType: 'int', defaultValue: '0', serializationSize: 2 }, + i32: { dartType: 'int', defaultValue: '0', serializationSize: 4 }, + i64: { dartType: 'BigInt', defaultValue: 'BigInt.zero', serializationSize: 8 }, + i8: { dartType: 'int', defaultValue: '0', serializationSize: 1 }, + u128: { dartType: 'BigInt', defaultValue: 'BigInt.zero', serializationSize: 16 }, + u16: { dartType: 'int', defaultValue: '0', serializationSize: 2 }, + u32: { dartType: 'int', defaultValue: '0', serializationSize: 4 }, + u64: { dartType: 'BigInt', defaultValue: 'BigInt.zero', serializationSize: 8 }, + u8: { dartType: 'int', defaultValue: '0', serializationSize: 1 }, + }; + + const typeInfo = numberTypeMap[format]; + if (typeInfo) { + return { + ...typeInfo, + imports: [], + }; } + + return { + dartType: 'num', + defaultValue: '0', + imports: [], + }; } function getBooleanTypeInfo(): TypeInfo { @@ -178,7 +105,7 @@ function getBooleanTypeInfo(): TypeInfo { }; } -function getStringTypeInfo(_node: StringTypeNode): TypeInfo { +function getStringTypeInfo(): TypeInfo { return { dartType: 'String', defaultValue: "''", @@ -234,16 +161,6 @@ function getOptionTypeInfo(node: OptionTypeNode, nameApi: NameApi): TypeInfo { }; } -// function getTupleTypeInfo(_node: TupleTypeNode): TypeInfo { -// // Dart doesn't have built-in tuples, we'll use List - -// return { -// dartType: 'List', -// defaultValue: 'const []', -// imports: [], -// }; -// } - function getSetTypeInfo(): TypeInfo { return { dartType: 'Set', @@ -272,9 +189,9 @@ function getDateTimeTypeInfo(): TypeInfo { function getPublicKeyTypeInfo(): TypeInfo { return { dartType: 'Ed25519HDPublicKey', - defaultValue: 'Ed25519HDPublicKey.fromBase58("11111111111111111111111111111111")', + defaultValue: `Ed25519HDPublicKey.fromBase58("${DEFAULT_PUBLIC_KEY}")`, imports: ['package:solana/solana.dart'], - serializationSize: 32, // Solana public keys are 32 bytes + serializationSize: SOLANA_PUBLIC_KEY_SIZE, }; } @@ -303,18 +220,6 @@ function getFixedSizeTypeInfo(node: FixedSizeTypeNode, nameApi: NameApi): TypeIn }; } -// function getStructTypeInfo(node: StructTypeNode): TypeInfo { -// // For struct types, we need to generate a custom class -// // This is a placeholder - the actual class generation happens in fragments -// // We return a generic name that will be replaced with the actual class name -// return { -// dartType: 'Object', // Will be replaced with actual struct class name -// defaultValue: 'Object()', // Will be replaced with actual constructor -// imports: [], -// // Size depends on the fields - calculated elsewhere -// }; -// } - function getAmountTypeInfo(): TypeInfo { return { dartType: 'BigInt', @@ -324,47 +229,6 @@ function getAmountTypeInfo(): TypeInfo { }; } -export function generateDartSerialization(typeInfo: TypeInfo, fieldName: string): string { - const { dartType, serializationSize } = typeInfo; - - if (dartType === 'bool') { - return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType === 'int' && serializationSize) { - return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType === 'double' && serializationSize) { - return `// TODO: Handle ${serializationSize}-byte float serialization for ${fieldName}`; - } - - if (dartType === 'BigInt' && serializationSize) { - return `// TODO: Handle BigInt serialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType === 'String' && serializationSize === 32) { - return `// TODO: Handle PublicKey serialization for ${fieldName} (32 bytes)`; - } - - if (dartType === 'String') { - return `// TODO: Handle String serialization for ${fieldName}`; - } - - if (dartType === 'Uint8List') { - return `// TODO: Handle Uint8List serialization for ${fieldName}`; - } - - if (dartType === 'List' && serializationSize) { - return `// TODO: Handle fixed-size byte array serialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType.startsWith('List<') || dartType.startsWith('Set<') || dartType.startsWith('Map<')) { - return `// TODO: Handle collection serialization for ${fieldName}`; - } - - return `// TODO: Handle serialization for ${fieldName} of type ${dartType}`; -} export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string { switch (typeNode.kind) { @@ -452,68 +316,10 @@ export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string } } -export function generateDartDeserialization(typeInfo: TypeInfo, fieldName: string): string { - const { dartType, serializationSize } = typeInfo; - - if (dartType === 'bool') { - return `${fieldName} = data.getUint8(offset) != 0; offset += 1;`; - } - - if (dartType === 'int' && serializationSize) { - switch (serializationSize) { - case 1: - return `${fieldName} = data.getUint8(offset); offset += 1;`; - case 2: - return `${fieldName} = data.getUint16(offset, Endian.little); offset += 2;`; - case 4: - return `${fieldName} = data.getUint32(offset, Endian.little); offset += 4;`; - default: - return `// TODO: Handle ${serializationSize}-byte integer deserialization for ${fieldName}`; - } - } - - if (dartType === 'double' && serializationSize) { - switch (serializationSize) { - case 4: - return `${fieldName} = data.getFloat32(offset, Endian.little); offset += 4;`; - case 8: - return `${fieldName} = data.getFloat64(offset, Endian.little); offset += 8;`; - default: - return `// TODO: Handle ${serializationSize}-byte float deserialization for ${fieldName}`; - } - } - - if (dartType === 'BigInt' && serializationSize) { - return `// TODO: Handle BigInt deserialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType === 'String' && serializationSize === 32) { - return `// TODO: Handle PublicKey deserialization for ${fieldName} (32 bytes)`; - } - - if (dartType === 'String') { - return `// TODO: Handle String deserialization for ${fieldName}`; - } - - if (dartType === 'Uint8List') { - return `// TODO: Handle Uint8List deserialization for ${fieldName}`; - } - - if (dartType === 'List' && serializationSize) { - return `// TODO: Handle fixed-size byte array deserialization for ${fieldName} (${serializationSize} bytes)`; - } - - if (dartType.startsWith('List<')) { - return `// TODO: Handle List deserialization for ${fieldName}`; - } - - return `// TODO: Handle deserialization for ${fieldName} of type ${dartType}`; -} function getDefinedTypeLinkTypeInfo(node: DefinedTypeLinkNode, className: string): TypeInfo { // Generate import path for the custom type - // Assuming types are in '../types/' directory relative to accounts - const importPath = `../types/${node.name}.dart`; + const importPath = `${TYPES_IMPORT_PREFIX}${node.name}.dart`; return { dartType: className, diff --git a/src/visitors/getRenderMapVisitor.ts b/src/visitors/getRenderMapVisitor.ts index 6b60260..de84a1c 100644 --- a/src/visitors/getRenderMapVisitor.ts +++ b/src/visitors/getRenderMapVisitor.ts @@ -21,35 +21,20 @@ import { getProgramPageFragment, getStructTypeFragment, } from '../fragments'; -import { - createImportMap, - Fragment, - generatePubspec, - getImportFromFactory, - getNameApi, - getPageFragment, - GetRenderMapOptions, - parseCustomDataOptions, - RenderScope, -} from '../utils'; +import { Fragment, generatePubspec, getNameApi, getPageFragment, GetRenderMapOptions, RenderScope } from '../utils'; import { createInlinePdaFile } from '../utils/pda'; -export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { +export function getRenderMapVisitor(options: GetRenderMapOptions) { const linkables = new LinkableDictionary(); const stack = new NodeStack(); const byteSizeVisitor = getByteSizeVisitor(linkables, { stack }); const libraryName = options.libraryName ?? 'lib'; - const outputDirectory = options.outputDirectory ?? 'lib'; + const outputDirectory = options.outputDirectory; // Create the complete render scope const renderScope: RenderScope = { - customAccountData: parseCustomDataOptions(options.customAccountData ?? [], 'AccountData'), - customInstructionData: parseCustomDataOptions(options.customInstructionData ?? [], 'InstructionData'), - getImportFrom: getImportFromFactory(), - imports: createImportMap(), libraryName, - linkables, nameApi: getNameApi(options.nameTransformers), outputDirectory, }; @@ -71,7 +56,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { visitAccount(node) { const size = visit(node, byteSizeVisitor); return createRenderMap( - `${outputDirectory}/accounts/${camelCase(node.name)}.dart`, + `${libraryName}/accounts/${camelCase(node.name)}.dart`, asPage( getAccountPageFragment({ ...renderScope, @@ -85,7 +70,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { visitDefinedType(node) { if (node.type.kind === 'structTypeNode') { return createRenderMap( - `${outputDirectory}/types/${camelCase(node.name)}.dart`, + `${libraryName}/types/${camelCase(node.name)}.dart`, asPage( getStructTypeFragment({ ...renderScope, @@ -96,13 +81,12 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { ), ); } - // TODO: Implement other defined type fragments return createRenderMap(); }, visitInstruction(node) { const instructionRenderMap = createRenderMap( - `${outputDirectory}/instructions/${camelCase(node.name)}.dart`, + `${libraryName}/instructions/${camelCase(node.name)}.dart`, asPage( getInstructionPageFragment({ ...renderScope, @@ -137,7 +121,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { if (pdaFile) { pdaRenderMaps.set( pdaName, - createRenderMap(`${outputDirectory}/pdas/${pdaName}.dart`, pdaFile), + createRenderMap(`${libraryName}/pdas/${pdaName}.dart`, pdaFile), ); } } @@ -147,25 +131,13 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { return mergeRenderMaps([instructionRenderMap, ...pdaRenderMapArray]); }, - // visitPda(node) { - // return createRenderMap( - // `${outputDirectory}/pdas/${camelCase(node.name)}.dart`, - // asPage( - // getPdaPageFragment({ - // ...renderScope, - // pdaPath: stack.getPath('pdaNode'), - // }), - // ), - // ); - // }, - visitProgram(node, { self }) { return mergeRenderMaps([ createRenderMap({ - [`${outputDirectory}/programs/${camelCase(node.name)}.dart`]: asPage( + [`${libraryName}/programs/${camelCase(node.name)}.dart`]: asPage( getProgramPageFragment({ ...renderScope, programNode: node }), ), - [`${outputDirectory}/errors/${camelCase(node.name)}.dart`]: + [`${libraryName}/errors/${camelCase(node.name)}.dart`]: node.errors.length > 0 ? asPage(getErrorPageFragment({ ...renderScope, programNode: node })) : undefined, @@ -185,7 +157,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) { return mergeRenderMaps([ createRenderMap({ - [`${outputDirectory}/${libraryName}.dart`]: asPage( + [`${libraryName}/${libraryName}.dart`]: asPage( getLibraryIndexFragment({ ...renderScope, rootNode: node, diff --git a/src/visitors/renderVisitor.ts b/src/visitors/renderVisitor.ts index 3f458cf..acaf0b8 100644 --- a/src/visitors/renderVisitor.ts +++ b/src/visitors/renderVisitor.ts @@ -5,12 +5,8 @@ import { execSync } from 'child_process'; import { RenderOptions } from '../utils'; import { getRenderMapVisitor } from './getRenderMapVisitor'; -export function renderVisitor( - path: string, - options: RenderOptions = { deleteFolderBeforeRendering: true, formatCode: true, libraryName: 'lib' }, -) { +export function renderVisitor(path: string, options: RenderOptions) { return rootNodeVisitor(root => { - // Delete existing generated folder. if (options.deleteFolderBeforeRendering ?? true) { deleteDirectory(path); } @@ -18,10 +14,8 @@ export function renderVisitor( const renderMap = visit(root, getRenderMapVisitor(options)); writeRenderMap(renderMap, path); - // Format the code using dart format if requested. if (options.formatCode ?? true) { try { - console.log('Formatting Dart code...'); execSync(`dart format "${path}"`, { cwd: process.cwd(), stdio: 'ignore', From c77fc07446ba8a7c11f55a46a8b18073bcef272f Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Mon, 20 Oct 2025 11:30:03 +0300 Subject: [PATCH 04/16] fix: remove redundant code, add borsh_annotation_extended lib --- src/fragments/accountPage.ts | 8 ++--- src/fragments/instructionData.ts | 6 +++- src/fragments/structType.ts | 43 ++----------------------- src/utils/pubspec.ts | 41 ++++-------------------- src/utils/types.ts | 55 ++++---------------------------- 5 files changed, 24 insertions(+), 129 deletions(-) diff --git a/src/fragments/accountPage.ts b/src/fragments/accountPage.ts index bd43397..b28bf00 100644 --- a/src/fragments/accountPage.ts +++ b/src/fragments/accountPage.ts @@ -25,8 +25,8 @@ export function getAccountPageFragment( const typeInfo = getTypeInfo(dataTypeNode, scope.nameApi); const borshAnnotation = getBorshAnnotation(dataTypeNode, scope.nameApi); const allImports = [ - 'package:borsh_annotation/borsh_annotation.dart', - ...typeInfo.imports.filter(imp => imp !== 'dart:typed_data'), + 'package:borsh_annotation_extended/borsh_annotation_extended.dart', + ...typeInfo.imports, ]; const content = `part '${node.name}.g.dart'; @@ -77,10 +77,10 @@ function getStructAccountFragment( }) .join('\n'); - const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart']); + const allImports = new Set(['package:borsh_annotation_extended/borsh_annotation_extended.dart']); fields.forEach(field => { const typeInfo = getTypeInfo(field.type, scope.nameApi); - typeInfo.imports.filter(imp => imp !== 'dart:typed_data').forEach(imp => allImports.add(imp)); + typeInfo.imports.forEach(imp => allImports.add(imp)); }); const content = `part '${node.name}.g.dart'; diff --git a/src/fragments/instructionData.ts b/src/fragments/instructionData.ts index e4ca36a..f2b08a4 100644 --- a/src/fragments/instructionData.ts +++ b/src/fragments/instructionData.ts @@ -55,7 +55,11 @@ export function getInstructionDataFragment( ? ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');\n${validations}` : ` if (discriminator.length != 8) throw ArgumentError('discriminator must be exactly 8 bytes, got \${discriminator.length}');`; - const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart', 'package:solana/solana.dart']); + const allImports = new Set([ + 'package:borsh_annotation_extended/borsh_annotation_extended.dart', + 'package:solana/solana.dart', + 'package:solana/encoder.dart', + ]); structNode.fields.forEach(field => { const typeInfo = getTypeInfo(field.type, nameApi); typeInfo.imports.forEach(imp => allImports.add(imp)); diff --git a/src/fragments/structType.ts b/src/fragments/structType.ts index 565994b..09b71c0 100644 --- a/src/fragments/structType.ts +++ b/src/fragments/structType.ts @@ -13,37 +13,14 @@ export function getStructTypeFragment( const className = nameApi.definedType(camelCase(name)); const fields = node.fields || []; - const validations = fields - .map(field => { - const fieldName = nameApi.accountField(field.name); - - if (field.type.kind === 'fixedSizeTypeNode') { - const size = field.type.size; - if (field.type.type.kind === 'bytesTypeNode') { - return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must be exactly ${size} bytes, got \${${fieldName}.length}');`; - } else if (field.type.type.kind === 'arrayTypeNode') { - return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; - } - } - - if (field.type.kind === 'arrayTypeNode' && field.type.count && field.type.count.kind === 'fixedCountNode') { - const size = field.type.count.value; - return ` if (${fieldName}.length != ${size}) throw ArgumentError('${fieldName} must have exactly ${size} elements, got \${${fieldName}.length}');`; - } - - return ''; - }) - .filter(v => v) - .join('\n'); // Collect all imports - const allImports = new Set(['package:borsh_annotation/borsh_annotation.dart']); + const allImports = new Set(['package:borsh_annotation_extended/borsh_annotation_extended.dart']); fields.forEach(field => { const typeInfo = getTypeInfo(field.type, scope.nameApi); typeInfo.imports.forEach(imp => allImports.add(imp)); }); - const hasValidations = validations.length > 0; const factoryParams = fields .map(field => { const typeInfo = getTypeInfo(field.type, scope.nameApi); @@ -59,22 +36,8 @@ export function getStructTypeFragment( class ${className} with _$${className} { factory ${className}({ ${factoryParams} - })${ - hasValidations - ? ` { - // Validate fixed-size fields -${validations} - return _${className}( -${fields - .map(field => { - const fieldName = nameApi.accountField(field.name); - return ` ${fieldName}: ${fieldName},`; - }) - .join('\n')} - ); - }` - : ` = _${className};` - } + }) = _${className}; + const ${className}._(); diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts index 6e4428d..7d4cd40 100644 --- a/src/utils/pubspec.ts +++ b/src/utils/pubspec.ts @@ -1,6 +1,6 @@ // Constants for Git-based dependencies -const REPO_URL = 'https://github.com/vlady-kotsev/espresso-cash-public.git'; -const REPO_REF = '88f5db7cb883a8e81ed4932fee4933f1a97e5b79'; +const REPO_URL = 'https://github.com/vlady-kotsev/borsh_annotation_extended.git'; +const REPO_REF = 'f2fb3ca293d5243ae2ab4956d49c521877c5f60d'; export function generatePubspec( packageName: string, @@ -14,7 +14,7 @@ export function generatePubspec( } = {}, ): string { const { - description = 'Generated Dart package for generated Solana program interaction', + description = 'Generated Dart package for Solana program interaction', version = '1.0.0', author, homepage, @@ -45,31 +45,13 @@ export function generatePubspec( sections.push('', 'dependencies:'); // Borsh dependency - sections.push( - ' borsh:', - ' git:', - ` url: ${REPO_URL}`, - ` ref: ${REPO_REF}`, - ' path: packages/borsh', - ); + sections.push(' borsh: 0.3.2'); // Borsh annotation dependency - sections.push( - ' borsh_annotation:', - ' git:', - ` url: ${REPO_URL}`, - ` ref: ${REPO_REF}`, - ' path: packages/borsh_annotation', - ); + sections.push(' borsh_annotation_extended:', ' git:', ` url: ${REPO_URL}`, ` ref: ${REPO_REF}`); // Solana dependency - sections.push( - ' solana:', - ' git:', - ` url: ${REPO_URL}`, - ` ref: ${REPO_REF}`, - ' path: packages/solana', - ); + sections.push(' solana: 0.31.2'); // Add any additional dependencies Object.entries(dependencies).forEach(([name, version]) => { @@ -83,16 +65,5 @@ export function generatePubspec( }); } - // Add dependency overrides - sections.push( - '', - 'dependency_overrides:', - ' borsh_annotation:', - ' git:', - ` url: ${REPO_URL}`, - ' path: packages/borsh_annotation', - ` ref: ${REPO_REF}`, - ); - return sections.join('\n') + '\n'; } diff --git a/src/utils/types.ts b/src/utils/types.ts index 9df6b05..30c2cc1 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -37,12 +37,6 @@ export function getTypeInfo(typeNode: TypeNode, nameApi: NameApi): TypeInfo { return getArrayTypeInfo(typeNode, nameApi); case 'optionTypeNode': return getOptionTypeInfo(typeNode, nameApi); - case 'setTypeNode': - return getSetTypeInfo(); - case 'mapTypeNode': - return getMapTypeInfo(); - case 'dateTimeTypeNode': - return getDateTimeTypeInfo(); case 'publicKeyTypeNode': return getPublicKeyTypeInfo(); case 'fixedSizeTypeNode': @@ -110,7 +104,6 @@ function getStringTypeInfo(): TypeInfo { dartType: 'String', defaultValue: "''", imports: [], - // Variable size - will need length prefix }; } @@ -119,23 +112,20 @@ function getBytesTypeInfo(): TypeInfo { dartType: 'Uint8List', defaultValue: 'Uint8List(0)', imports: [], - // Variable size - will need length prefix }; } function getArrayTypeInfo(node: ArrayTypeNode, nameApi: NameApi): TypeInfo { - // Resolve the nested type to get the actual item type const resolvedType = resolveNestedTypeNode(node.item); const innerTypeInfo = getTypeInfo(resolvedType, nameApi); - // Check if this is a fixed-size array if (node.count && node.count.kind === 'fixedCountNode') { const size = node.count.value; return { dartType: `List<${innerTypeInfo.dartType}>`, defaultValue: `List.filled(${size}, ${innerTypeInfo.defaultValue})`, imports: innerTypeInfo.imports, - serializationSize: size, // Mark as fixed size + serializationSize: size, }; } @@ -143,46 +133,17 @@ function getArrayTypeInfo(node: ArrayTypeNode, nameApi: NameApi): TypeInfo { dartType: `List<${innerTypeInfo.dartType}>`, defaultValue: 'const []', imports: innerTypeInfo.imports, - // Variable size }; } function getOptionTypeInfo(node: OptionTypeNode, nameApi: NameApi): TypeInfo { - // Resolve the nested type to get the actual inner type const resolvedType = resolveNestedTypeNode(node.item); const innerTypeInfo = getTypeInfo(resolvedType, nameApi); - // Dart doesn't have built-in Option, we'll use nullable types return { dartType: `${innerTypeInfo.dartType}?`, defaultValue: 'null', imports: innerTypeInfo.imports, - // Variable size depending on content - }; -} - -function getSetTypeInfo(): TypeInfo { - return { - dartType: 'Set', - defaultValue: 'const {}', - imports: [], - }; -} - -function getMapTypeInfo(): TypeInfo { - return { - dartType: 'Map', - defaultValue: 'const {}', - imports: [], - }; -} - -function getDateTimeTypeInfo(): TypeInfo { - return { - dartType: 'DateTime', - defaultValue: 'DateTime.now()', - imports: [], - serializationSize: 8, // Usually stored as timestamp }; } @@ -229,7 +190,6 @@ function getAmountTypeInfo(): TypeInfo { }; } - export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string { switch (typeNode.kind) { case 'numberTypeNode': { @@ -265,22 +225,22 @@ export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string case 'bytesTypeNode': return '@BBytes()'; case 'publicKeyTypeNode': - return '@BPublicKey()'; // Use custom BPublicKey annotation + return '@BPublicKey()'; case 'fixedSizeTypeNode': { const fixedNode = typeNode as FixedSizeTypeNode; const resolvedType = resolveNestedTypeNode(fixedNode.type); + if (resolvedType.kind === 'bytesTypeNode') { return `@BFixedBytes(${fixedNode.size})`; } + const innerAnnotation = getBorshAnnotation(resolvedType, nameApi); return `@BFixedArray(${fixedNode.size}, ${innerAnnotation.replace('@', '')})`; } case 'arrayTypeNode': { const arrayNode = typeNode as ArrayTypeNode; - // Don't resolve nested types here - pass the original item type to getBorshAnnotation const arrayInnerAnnotation = getBorshAnnotation(arrayNode.item, nameApi); - // Check if this is a fixed-size array if (arrayNode.count && arrayNode.count.kind === 'fixedCountNode') { const size = arrayNode.count.value; return `@BFixedArray(${size}, ${arrayInnerAnnotation.replace('@', '')})`; @@ -297,26 +257,23 @@ export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string case 'definedTypeLinkNode': { const definedTypeNode = typeNode as DefinedTypeLinkNode; const className = nameApi.definedType(definedTypeNode.name); - return `@BCustom(B${className}())`; + return `@B${className}()`; } case 'sizePrefixTypeNode': { const sizePrefixNode = typeNode as SizePrefixTypeNode; const resolvedType = resolveNestedTypeNode(sizePrefixNode.type); - // If it's bytes with size prefix, use BBytes (variable length bytes with u32 prefix) if (resolvedType.kind === 'bytesTypeNode') { return '@BBytes()'; } - // For other size-prefixed types (like strings), use BString return '@BString()'; } default: - return '@BArray(BU8())'; // fallback for unsupported types + return '@BArray(BU8())'; } } - function getDefinedTypeLinkTypeInfo(node: DefinedTypeLinkNode, className: string): TypeInfo { // Generate import path for the custom type const importPath = `${TYPES_IMPORT_PREFIX}${node.name}.dart`; From 924ac281715af97c9d113ec9d05a6db3b5442d82 Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Mon, 20 Oct 2025 12:16:17 +0300 Subject: [PATCH 05/16] feat: add signed numbers custom handling --- src/utils/types.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/utils/types.ts b/src/utils/types.ts index 30c2cc1..97ea308 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -196,20 +196,25 @@ export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string const numberFormat = (typeNode as NumberTypeNode).format; switch (numberFormat) { case 'u8': - case 'i8': return '@BU8()'; + case 'i8': + return '@BI8()'; case 'u16': - case 'i16': return '@BU16()'; + case 'i16': + return '@BI16()'; case 'u32': - case 'i32': return '@BU32()'; + case 'i32': + return '@BI32()'; case 'u64': - case 'i64': return '@BU64()'; + case 'i64': + return '@BI64()'; case 'u128': - case 'i128': return '@BU128()'; + case 'i128': + return '@BI128()'; case 'f32': return '@BF32()'; case 'f64': @@ -229,11 +234,11 @@ export function getBorshAnnotation(typeNode: TypeNode, nameApi: NameApi): string case 'fixedSizeTypeNode': { const fixedNode = typeNode as FixedSizeTypeNode; const resolvedType = resolveNestedTypeNode(fixedNode.type); - + if (resolvedType.kind === 'bytesTypeNode') { return `@BFixedBytes(${fixedNode.size})`; } - + const innerAnnotation = getBorshAnnotation(resolvedType, nameApi); return `@BFixedArray(${fixedNode.size}, ${innerAnnotation.replace('@', '')})`; } From e559f3aa316e6f37c2f55f2ad7ee9bd885253b7d Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Mon, 20 Oct 2025 12:18:34 +0300 Subject: [PATCH 06/16] chore: update dependency commit ref --- src/utils/pubspec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts index 7d4cd40..08e1c97 100644 --- a/src/utils/pubspec.ts +++ b/src/utils/pubspec.ts @@ -1,6 +1,6 @@ // Constants for Git-based dependencies const REPO_URL = 'https://github.com/vlady-kotsev/borsh_annotation_extended.git'; -const REPO_REF = 'f2fb3ca293d5243ae2ab4956d49c521877c5f60d'; +const REPO_REF = 'abc277517eef633ec9a8f26aa77f466f5ab371c2'; export function generatePubspec( packageName: string, From 98ce7f775b79b721d0d41fa15e633072b6bb45b1 Mon Sep 17 00:00:00 2001 From: vlady-kotsev Date: Mon, 20 Oct 2025 15:18:09 +0300 Subject: [PATCH 07/16] chore: update borsh_extended commit ref --- src/utils/pubspec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/pubspec.ts b/src/utils/pubspec.ts index 08e1c97..7a8d6e1 100644 --- a/src/utils/pubspec.ts +++ b/src/utils/pubspec.ts @@ -1,6 +1,6 @@ // Constants for Git-based dependencies const REPO_URL = 'https://github.com/vlady-kotsev/borsh_annotation_extended.git'; -const REPO_REF = 'abc277517eef633ec9a8f26aa77f466f5ab371c2'; +const REPO_REF = '4fcc50dced4717257fc7cd4cf2ae5489ebfc1f48'; export function generatePubspec( packageName: string, From e30f89e5bb7b404589e23cd55ca74a58d7f4c5af Mon Sep 17 00:00:00 2001 From: Emil Roydev <125214785+ERoydev@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:59:15 +0300 Subject: [PATCH 08/16] Chore/consistent lib exports (#6) * fix: export programs * fix: Hardcode to use lib, so build runner can work properly --- src/fragments/libraryIndex.ts | 5 +++++ src/visitors/getRenderMapVisitor.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fragments/libraryIndex.ts b/src/fragments/libraryIndex.ts index 38e08f6..54964f0 100644 --- a/src/fragments/libraryIndex.ts +++ b/src/fragments/libraryIndex.ts @@ -38,6 +38,11 @@ export function getLibraryIndexFragment(scope: { rootNode: RootNode }): Fragment if (program.errors.length > 0) { exports.push(`export 'errors/${program.name}.dart';`); } + + // Export programs + if (program.name) { + exports.push(`export 'programs/${program.name}.dart';`); + } }); exports.sort(); diff --git a/src/visitors/getRenderMapVisitor.ts b/src/visitors/getRenderMapVisitor.ts index de84a1c..9c70777 100644 --- a/src/visitors/getRenderMapVisitor.ts +++ b/src/visitors/getRenderMapVisitor.ts @@ -29,7 +29,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions) { const stack = new NodeStack(); const byteSizeVisitor = getByteSizeVisitor(linkables, { stack }); - const libraryName = options.libraryName ?? 'lib'; + const libraryName = 'lib'; const outputDirectory = options.outputDirectory; // Create the complete render scope From b9b5a7ba8500e32dd4476e5d1ecf4b3ef93bf414 Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 10:39:05 +0300 Subject: [PATCH 09/16] fix: Instruction fragment gets programId from programs module --- src/fragments/instructionFunction.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/fragments/instructionFunction.ts b/src/fragments/instructionFunction.ts index 3c5383b..5f898c7 100644 --- a/src/fragments/instructionFunction.ts +++ b/src/fragments/instructionFunction.ts @@ -15,6 +15,14 @@ export function getInstructionFunctionFragment( const instructionNode = getLastNodeFromPath(instructionPath); const programNode = findProgramNodeFromPath(instructionPath)!; + const rootNode = instructionPath.find(node => node.kind === 'rootNode'); + let rootProgramClassName: string; + if (rootNode) { + rootProgramClassName = `${nameApi.programType(rootNode.program.name)}.programId`; + } else { + rootProgramClassName = `'${programNode.publicKey}'`; + } + const functionName = nameApi.instructionFunction(instructionNode.name); const instructionDataName = nameApi.instructionDataType(instructionNode.name); @@ -107,7 +115,7 @@ export function getInstructionFunctionFragment( pdaResolutions.push( ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? ` + - `await Ed25519HDPublicKey.findProgramAddress(\n seeds: [${seeds.join(', ')}],\n programId: programId ?? Ed25519HDPublicKey.fromBase58('${programNode.publicKey ?? 'PROGRAM_ID_HERE'}'),\n );`, + `await Ed25519HDPublicKey.findProgramAddress(\n seeds: [${seeds.join(', ')}],\n programId: programId ?? Ed25519HDPublicKey.fromBase58(${rootProgramClassName}),\n );`, ); } } else if (builtinAddress) { @@ -195,7 +203,7 @@ export function getInstructionFunctionFragment( const functionBody = `${pdaResolutionCode}${accountMetas}${dataSerializationCode} return Instruction( - programId: programId ?? Ed25519HDPublicKey.fromBase58('${programNode.publicKey ?? 'PROGRAM_ID_HERE'}'), + programId: programId ?? Ed25519HDPublicKey.fromBase58(${rootProgramClassName}), accounts: accounts, data: instructionData, );`; @@ -210,6 +218,9 @@ ${functionBody} }`; const imports = new Set(['package:solana/solana.dart']); + if (rootNode) { + imports.add(`../programs/${rootNode.program.name}.dart`); + } return createFragment(content, Array.from(imports)); } From 65842f29401234c1dd1bc7bab7a28b51ebd3f12b Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 11:08:11 +0300 Subject: [PATCH 10/16] fix: Use the programs module to derive programId in pdas --- src/utils/pda.ts | 20 ++++++++++++++++---- src/visitors/getRenderMapVisitor.ts | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/utils/pda.ts b/src/utils/pda.ts index 4d314f9..10b3657 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -1,4 +1,4 @@ -import { isNode, PdaNode, PdaSeedValueNode, StandaloneValueNode } from '@codama/nodes'; +import { CamelCaseString, isNode, PdaNode, PdaSeedValueNode, StandaloneValueNode } from '@codama/nodes'; import { Fragment } from './fragment'; import { RenderScope } from './options'; @@ -56,6 +56,7 @@ export function createInlinePdaFile( pdaSeedValues: PdaSeedValueNode[] | undefined, nameApi: RenderScope['nameApi'], programPublicKey: string | undefined, + programName: string | undefined, asPage: ( fragment: TFragment, pageOptions?: { libraryName?: string }, @@ -65,6 +66,11 @@ export function createInlinePdaFile( const seeds = generatePdaSeeds(pdaNode, pdaSeedValues, nameApi); const parameters: string[] = []; + let programClassName: string = ''; + if (programName) { + programClassName = nameApi.programType(programName as CamelCaseString); + } + pdaNode.seeds.forEach(seed => { if (isNode(seed, 'variablePdaSeedNode')) { @@ -78,9 +84,12 @@ export function createInlinePdaFile( }); const parameterList = parameters.length > 0 ? parameters.join(', ') : ''; - const programIdValue = programPublicKey - ? `Ed25519HDPublicKey.fromBase58('${programPublicKey}')` - : 'PROGRAM_ID_HERE'; + const programIdValue = + programClassName && programClassName !== '' + ? `Ed25519HDPublicKey.fromBase58(${programClassName}.programId)` + : programPublicKey + ? `Ed25519HDPublicKey.fromBase58('${programPublicKey}')` + : 'PROGRAM_ID_HERE'; const content = `/// Returns the PDA address for ${accountName} Future ${functionName}(${parameterList}) async { @@ -91,6 +100,9 @@ Future ${functionName}(${parameterList}) async { }`; const imports = new Set(['package:solana/solana.dart', 'dart:typed_data']); + if (programClassName) { + imports.add(`../programs/${programName}.dart`); + } const fragment: Fragment = { content, diff --git a/src/visitors/getRenderMapVisitor.ts b/src/visitors/getRenderMapVisitor.ts index 9c70777..11566f0 100644 --- a/src/visitors/getRenderMapVisitor.ts +++ b/src/visitors/getRenderMapVisitor.ts @@ -107,6 +107,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions) { } const pdaName = camelCase(account.name); + const programNode = findProgramNodeFromPath(stack.getPath('instructionNode')); // Avoid duplicate PDA files for the same account name if (!pdaRenderMaps.has(pdaName)) { @@ -115,7 +116,8 @@ export function getRenderMapVisitor(options: GetRenderMapOptions) { account.defaultValue.pda, account.defaultValue.seeds, renderScope.nameApi, - findProgramNodeFromPath(stack.getPath('instructionNode'))?.publicKey, + programNode?.publicKey, + programNode?.name, asPage, ); if (pdaFile) { From cefe1f430d81cbad7bab42bc1349239f488bf0b6 Mon Sep 17 00:00:00 2001 From: Vladislav Kotsev Date: Wed, 22 Oct 2025 12:50:07 +0000 Subject: [PATCH 11/16] feat: add generateBorsh flag (#7) --- src/utils/options.ts | 1 + src/visitors/renderVisitor.ts | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/utils/options.ts b/src/utils/options.ts index 72b3735..4dbab9e 100644 --- a/src/utils/options.ts +++ b/src/utils/options.ts @@ -3,6 +3,7 @@ import { NameApi } from './nameTransformers'; export type RenderOptions = GetRenderMapOptions & { deleteFolderBeforeRendering?: boolean; formatCode?: boolean; + generateBorsh?: boolean; }; export type GetRenderMapOptions = { diff --git a/src/visitors/renderVisitor.ts b/src/visitors/renderVisitor.ts index acaf0b8..6c12604 100644 --- a/src/visitors/renderVisitor.ts +++ b/src/visitors/renderVisitor.ts @@ -16,8 +16,8 @@ export function renderVisitor(path: string, options: RenderOptions) { if (options.formatCode ?? true) { try { - execSync(`dart format "${path}"`, { - cwd: process.cwd(), + execSync(`dart format .`, { + cwd: path, stdio: 'ignore', }); console.log('Dart formatting completed successfully.'); @@ -28,5 +28,25 @@ export function renderVisitor(path: string, options: RenderOptions) { console.warn('You can manually format the code by running: dart format "' + path + '"'); } } + if (options.generateBorsh ?? true) { + try { + execSync('dart pub get', { + cwd: path, + stdio: 'ignore', + }); + execSync('dart run build_runner build', { + cwd: path, + stdio: 'ignore', + }); + execSync('dart fix --apply', { + cwd: path, + stdio: 'ignore', + }); + } catch (error) { + console.log(error); + console.warn('Warning: Failed to run Dart commands. Make sure Dart SDK is installed.'); + console.warn(`You can manually run commands in ${path}: dart pub get && dart run build_runner build && dart fix --apply`); + } + } }); } From a7e5afc718d5a183e97d7f4bfd278ca6c0178877 Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 17:23:38 +0300 Subject: [PATCH 12/16] update: Handle seed serialization into bytes --- src/utils/pda.ts | 11 +++++++++-- src/utils/types.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/utils/pda.ts b/src/utils/pda.ts index 10b3657..63757e7 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -2,6 +2,7 @@ import { CamelCaseString, isNode, PdaNode, PdaSeedValueNode, StandaloneValueNode import { Fragment } from './fragment'; import { RenderScope } from './options'; +import { getTypeInfo, serializeDartValue } from './types'; /** * Generates Dart code for PDA seeds based on a PDA node and its seed values @@ -35,10 +36,16 @@ export function generatePdaSeeds( if (isNode(seed, 'variablePdaSeedNode')) { const valueSeed = pdaSeedValues?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; - if (valueSeed && (isNode(valueSeed, 'accountValueNode') || isNode(valueSeed, 'argumentValueNode'))) { + if (valueSeed && (isNode(valueSeed, 'accountValueNode'))) { const paramName = valueSeed.name; return `${paramName}.toByteArray()`; } + if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { + const paramName = valueSeed.name; + const dartType = getTypeInfo(seed.type, nameApi).dartType; + const result = serializeDartValue(paramName, dartType); + return `${result}`; + } const seedName = nameApi.instructionField(seed.name); return `${seedName}.toByteArray()`; @@ -99,7 +106,7 @@ Future ${functionName}(${parameterList}) async { ); }`; - const imports = new Set(['package:solana/solana.dart', 'dart:typed_data']); + const imports = new Set(['dart:convert', 'package:solana/solana.dart', 'dart:typed_data']); if (programClassName) { imports.add(`../programs/${programName}.dart`); } diff --git a/src/utils/types.ts b/src/utils/types.ts index 97ea308..abf1fa2 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -310,3 +310,29 @@ function getSizePrefixTypeInfo(node: SizePrefixTypeNode): TypeInfo { imports: [], }; } + +/** + * Returns Dart code for serializing a value of the given dartType. + */ +export function serializeDartValue(paramName: string, dartType: string): string { + switch (dartType) { + case 'String': + // UTF-8 encode the string + return `Uint8List.fromList(utf8.encode(${paramName}))`; + case 'Uint8List': + // Already bytes + return paramName; + case 'int': + // 8-byte little-endian for Solana PDA seeds + return `Uint8List.fromList(List.generate(8, (i) => (((${paramName}) >> (8 * i)) & 0xff)))`; + case 'BigInt': + // 8-byte little-endian for Solana PDA seeds + return `Uint8List.fromList(List.generate(8, (i) => (((${paramName}) >> (8 * i)) & BigInt.from(0xff)).toInt()))`; + case 'bool': + // Single byte: 1 for true, 0 for false + return `Uint8List.fromList([${paramName} ? 1 : 0])`; + default: + // Assume custom type with Borsh serialization + return `${paramName}.toBorsh()`; + } +} \ No newline at end of file From cc06f9423bfe1ee94f3cd062ce363be79ea4feba Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 17:24:01 +0300 Subject: [PATCH 13/16] add: export pascalCase function --- src/utils/nameTransformers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/nameTransformers.ts b/src/utils/nameTransformers.ts index a756100..423098c 100644 --- a/src/utils/nameTransformers.ts +++ b/src/utils/nameTransformers.ts @@ -66,7 +66,7 @@ export function getNameApi(transformers: Partial = {}): NameAp return { ...DEFAULT_NAME_TRANSFORMERS, ...transformers }; } -function pascalCase(str: string): string { +export function pascalCase(str: string): string { return str.charAt(0).toUpperCase() + camelCase(str).slice(1); } From f7f92af1b652809fa2e28794c3f729a00e9c5d1e Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 17:24:36 +0300 Subject: [PATCH 14/16] fix: Use real dartType instead of hardcoding as PublicKey type --- src/utils/pda.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/pda.ts b/src/utils/pda.ts index 63757e7..953071a 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -85,7 +85,8 @@ export function createInlinePdaFile( if (valueSeed && (isNode(valueSeed, 'accountValueNode') || isNode(valueSeed, 'argumentValueNode'))) { // This is either an account or argument parameter const paramName = valueSeed.name; - parameters.push(`Ed25519HDPublicKey ${paramName}`); + const dartType = getTypeInfo(seed.type, nameApi).dartType; + parameters.push(`${dartType} ${paramName}`); } } }); From b9bbce8dba440314bc579a581aaa9ab48fbb57c3 Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 17:25:23 +0300 Subject: [PATCH 15/16] update: Resolve and use pdas on instruction initialization --- src/fragments/instructionFunction.ts | 36 ++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/fragments/instructionFunction.ts b/src/fragments/instructionFunction.ts index 5f898c7..9139976 100644 --- a/src/fragments/instructionFunction.ts +++ b/src/fragments/instructionFunction.ts @@ -1,9 +1,8 @@ -import { InstructionNode, isNode, PdaSeedValueNode } from '@codama/nodes'; +import { InstructionNode, isNode, PdaSeedValueNode} from '@codama/nodes'; import { findProgramNodeFromPath, getLastNodeFromPath, NodePath } from '@codama/visitors-core'; -import { createFragment, Fragment, RenderScope } from '../utils'; +import { createFragment, Fragment, pascalCase, RenderScope } from '../utils'; import { getBuiltinProgramAddress } from '../utils/builtinPrograms'; -import { generatePdaSeeds } from '../utils/pda'; export function getInstructionFunctionFragment( scope: Pick & { @@ -30,6 +29,7 @@ export function getInstructionFunctionFragment( const hasArguments = instructionNode.arguments.length > 0; const params: string[] = []; + const pdaImports = new Set(); if (hasAccounts) { instructionNode.accounts.forEach(account => { @@ -51,7 +51,7 @@ export function getInstructionFunctionFragment( )?.value; if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { - canAutoderivePda = false; + canAutoderivePda = true; break; } } @@ -100,7 +100,7 @@ export function getInstructionFunctionFragment( )?.value; if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { - canAutoderivePda = false; + canAutoderivePda = true break; } } @@ -111,11 +111,24 @@ export function getInstructionFunctionFragment( if (hasDefaultPda && canAutoderivePda) { const pdaValue = account.defaultValue; if (isNode(pdaValue.pda, 'pdaNode')) { - const seeds = generatePdaSeeds(pdaValue.pda, pdaValue.seeds, nameApi); + const resolvePdaFunctionName = `derive${pascalCase(pdaValue.pda.name)}Pda`; + + const params: string[] = []; + + pdaValue.seeds.forEach(seed => { + if (isNode(seed.value, 'accountValueNode')) { + params.push(`${seed.name}`); + + } else { + params.push(`data.${seed.name}`); + } + }) + + pdaImports.add(`../pdas/${pdaValue.pda.name}.dart`); pdaResolutions.push( ` final resolved${accountName.charAt(0).toUpperCase() + accountName.slice(1)} = ${accountName} ?? ` + - `await Ed25519HDPublicKey.findProgramAddress(\n seeds: [${seeds.join(', ')}],\n programId: programId ?? Ed25519HDPublicKey.fromBase58(${rootProgramClassName}),\n );`, + `await ${resolvePdaFunctionName}(${params.join(', ')});`, ); } } else if (builtinAddress) { @@ -147,7 +160,7 @@ export function getInstructionFunctionFragment( )?.value; if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { - canAutoderivePda = false; + canAutoderivePda = true; break; } } @@ -191,7 +204,7 @@ export function getInstructionFunctionFragment( const valueSeed = pdaValue.seeds?.find((s: PdaSeedValueNode) => s.name === seed.name)?.value; if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { - canAutoderive = false; + canAutoderive = true; break; } } @@ -217,7 +230,10 @@ ${asyncModifier}Instruction${asyncSuffix} ${functionName}(${parameterList}) ${as ${functionBody} }`; - const imports = new Set(['package:solana/solana.dart']); + const imports = new Set([ + 'package:solana/solana.dart', + ...pdaImports, + ]); if (rootNode) { imports.add(`../programs/${rootNode.program.name}.dart`); } From 43533700806917f121a3dfdc5c0d741b2a41dabf Mon Sep 17 00:00:00 2001 From: ERoydev Date: Wed, 22 Oct 2025 18:45:21 +0300 Subject: [PATCH 16/16] ref: Variable names refactor --- src/utils/pda.ts | 6 +++--- src/utils/types.ts | 7 +------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/utils/pda.ts b/src/utils/pda.ts index 953071a..c0d1f95 100644 --- a/src/utils/pda.ts +++ b/src/utils/pda.ts @@ -2,7 +2,7 @@ import { CamelCaseString, isNode, PdaNode, PdaSeedValueNode, StandaloneValueNode import { Fragment } from './fragment'; import { RenderScope } from './options'; -import { getTypeInfo, serializeDartValue } from './types'; +import { generateDartSeedSerializationCode,getTypeInfo } from './types'; /** * Generates Dart code for PDA seeds based on a PDA node and its seed values @@ -43,8 +43,8 @@ export function generatePdaSeeds( if (valueSeed && isNode(valueSeed, 'argumentValueNode')) { const paramName = valueSeed.name; const dartType = getTypeInfo(seed.type, nameApi).dartType; - const result = serializeDartValue(paramName, dartType); - return `${result}`; + const fieldSerializationCode = generateDartSeedSerializationCode(paramName, dartType); + return `${fieldSerializationCode}`; } const seedName = nameApi.instructionField(seed.name); diff --git a/src/utils/types.ts b/src/utils/types.ts index abf1fa2..44be780 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -314,22 +314,17 @@ function getSizePrefixTypeInfo(node: SizePrefixTypeNode): TypeInfo { /** * Returns Dart code for serializing a value of the given dartType. */ -export function serializeDartValue(paramName: string, dartType: string): string { +export function generateDartSeedSerializationCode(paramName: string, dartType: string): string { switch (dartType) { case 'String': - // UTF-8 encode the string return `Uint8List.fromList(utf8.encode(${paramName}))`; case 'Uint8List': - // Already bytes return paramName; case 'int': - // 8-byte little-endian for Solana PDA seeds return `Uint8List.fromList(List.generate(8, (i) => (((${paramName}) >> (8 * i)) & 0xff)))`; case 'BigInt': - // 8-byte little-endian for Solana PDA seeds return `Uint8List.fromList(List.generate(8, (i) => (((${paramName}) >> (8 * i)) & BigInt.from(0xff)).toInt()))`; case 'bool': - // Single byte: 1 for true, 0 for false return `Uint8List.fromList([${paramName} ? 1 : 0])`; default: // Assume custom type with Borsh serialization