diff --git a/e2e/helpers.ts b/e2e/helpers.ts index d4db216..cc9e48c 100644 --- a/e2e/helpers.ts +++ b/e2e/helpers.ts @@ -122,20 +122,14 @@ export const generateProject = async ( ]); }; -const listFiles = (root: string, current = root): string[] => { - const files: string[] = []; - - for (const entry of fs.readdirSync(current, { withFileTypes: true })) { - const absolutePath = path.join(current, entry.name); - if (entry.isDirectory()) { - files.push(...listFiles(root, absolutePath)); - } else { - files.push(path.relative(root, absolutePath)); - } - } - - return files.sort(); -}; +const listFiles = (root: string): string[] => + fs + .readdirSync(root, { recursive: true, withFileTypes: true }) + .filter((entry) => !entry.isDirectory()) + .map((entry) => + path.relative(root, path.join(entry.parentPath, entry.name)), + ) + .sort(); export const compareProjects = (actual: string, expected: string): void => { const actualFiles = listFiles(actual); diff --git a/package.json b/package.json index 1b55542..8cba2e7 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "@stricli/core": "^1.3.0", "@vue/compiler-sfc": "^3.5.40", "prettier": "3.9.6", - "ts-poet": "^6.12.0", "validate-npm-package-name": "^8.0.0" }, "devDependencies": { @@ -63,5 +62,5 @@ "typescript-eslint": "^8.65.0", "vitest": "^4.1.10" }, - "packageManager": "pnpm@11.16.0" + "packageManager": "pnpm@11.18.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 156fd4d..e755ed0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,16 +23,13 @@ importers: prettier: specifier: 3.9.6 version: 3.9.6 - ts-poet: - specifier: ^6.12.0 - version: 6.12.0 validate-npm-package-name: specifier: ^8.0.0 version: 8.0.0 devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.7.0(supports-color@7.2.0)) + version: 10.0.1(eslint@10.8.0(supports-color@7.2.0)) '@types/node': specifier: ^24.13.3 version: 24.13.3 @@ -44,16 +41,16 @@ importers: version: 4.1.10(vitest@4.1.10) eslint: specifier: ^10.7.0 - version: 10.7.0(supports-color@7.2.0) + version: 10.8.0(supports-color@7.2.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.7.0(supports-color@7.2.0)) + version: 10.1.8(eslint@10.8.0(supports-color@7.2.0)) typescript: specifier: ^6.0.3 version: 6.0.3 typescript-eslint: specifier: ^8.65.0 - version: 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + version: 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) vitest: specifier: ^4.1.10 version: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@24.13.3)) @@ -112,8 +109,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -167,11 +164,12 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + '@napi-rs/wasm-runtime@1.2.0': + resolution: {integrity: sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@emnapi/core': ^2.0.0-alpha.3 + '@emnapi/runtime': ^2.0.0-alpha.3 '@noble/hashes@2.2.0': resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} @@ -431,8 +429,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -450,9 +448,9 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -477,18 +475,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dprint-node@1.0.8: - resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} - entities@7.0.1: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} @@ -518,8 +508,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.7.0: - resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -758,8 +748,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} ms@2.1.3: @@ -807,8 +797,8 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - postcss@8.5.21: - resolution: {integrity: sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==} + postcss@8.5.24: + resolution: {integrity: sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -873,8 +863,8 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} ts-api-utils@2.5.0: @@ -883,9 +873,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-poet@6.12.0: - resolution: {integrity: sha512-xo+iRNMWqyvXpFTaOAvLPA5QAWO6TZrSUs5s4Odaya3epqofBu/fMLHEWl8jPmjhA0s9sgj9sNvF1BmaQlmQkA==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1062,9 +1049,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.7.0(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.0(supports-color@7.2.0))': dependencies: - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1073,11 +1060,11 @@ snapshots: dependencies: '@eslint/object-schema': 3.0.5 debug: 4.4.3(supports-color@7.2.0) - minimatch: 10.2.5 + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -1085,9 +1072,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.7.0(supports-color@7.2.0))': + '@eslint/js@10.0.1(eslint@10.8.0(supports-color@7.2.0))': optionalDependencies: - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) '@eslint/object-schema@3.0.5': {} @@ -1121,7 +1108,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 @@ -1172,7 +1159,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.2.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@rolldown/binding-win32-arm64-msvc@1.1.5': @@ -1218,15 +1205,15 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1234,14 +1221,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3(supports-color@7.2.0) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -1264,13 +1251,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) debug: 4.4.3(supports-color@7.2.0) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -1285,7 +1272,7 @@ snapshots: '@typescript-eslint/types': 8.65.0 '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3(supports-color@7.2.0) - minimatch: 10.2.5 + minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1293,13 +1280,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -1320,7 +1307,7 @@ snapshots: magicast: 0.5.3 obug: 2.1.4 std-env: 4.2.0 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@24.13.3)) '@vitest/expect@4.1.10': @@ -1330,7 +1317,7 @@ snapshots: '@vitest/spy': 4.1.10 '@vitest/utils': 4.1.10 chai: 6.2.2 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3))': dependencies: @@ -1342,7 +1329,7 @@ snapshots: '@vitest/pretty-format@4.1.10': dependencies: - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 '@vitest/runner@4.1.10': dependencies: @@ -1362,7 +1349,7 @@ snapshots: dependencies: '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 '@vue/compiler-core@3.5.40': dependencies: @@ -1386,7 +1373,7 @@ snapshots: '@vue/shared': 3.5.40 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.21 + postcss: 8.5.24 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.40': @@ -1396,11 +1383,11 @@ snapshots: '@vue/shared@3.5.40': {} - acorn-jsx@5.3.2(acorn@8.17.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.17.0 + acorn: 8.18.0 - acorn@8.17.0: {} + acorn@8.18.0: {} ajv@6.15.0: dependencies: @@ -1419,7 +1406,7 @@ snapshots: balanced-match@4.0.4: {} - brace-expansion@5.0.7: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -1441,23 +1428,17 @@ snapshots: deep-is@0.1.4: {} - detect-libc@1.0.3: {} - detect-libc@2.1.2: {} - dprint-node@1.0.8: - dependencies: - detect-libc: 1.0.3 - entities@7.0.1: {} es-module-lexer@2.3.1: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.7.0(supports-color@7.2.0)): + eslint-config-prettier@10.1.8(eslint@10.8.0(supports-color@7.2.0)): dependencies: - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) eslint-scope@9.1.2: dependencies: @@ -1470,12 +1451,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0(supports-color@7.2.0): + eslint@10.8.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@7.2.0) - '@eslint/config-helpers': 0.6.0 + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -1499,7 +1480,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -1507,8 +1488,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -1689,9 +1670,9 @@ snapshots: dependencies: semver: 7.8.5 - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.8 ms@2.1.3: {} @@ -1728,7 +1709,7 @@ snapshots: picomatch@4.0.5: {} - postcss@8.5.21: + postcss@8.5.24: dependencies: nanoid: 3.3.16 picocolors: 1.1.1 @@ -1792,16 +1773,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - tinyrainbow@3.1.0: {} + tinyrainbow@3.1.1: {} ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 - ts-poet@6.12.0: - dependencies: - dprint-node: 1.0.8 - tslib@2.8.1: optional: true @@ -1809,13 +1786,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): + typescript-eslint@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.7.0(supports-color@7.2.0) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -1834,7 +1811,7 @@ snapshots: dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.21 + postcss: 8.5.24 rolldown: 1.1.5 tinyglobby: 0.2.17 optionalDependencies: @@ -1860,7 +1837,7 @@ snapshots: tinybench: 2.9.0 tinyexec: 1.2.4 tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 vite: 8.1.5(@types/node@24.13.3) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/src/generator/format-generated-file.ts b/src/generator/format-generated-file.ts index db3ac11..e26efed 100644 --- a/src/generator/format-generated-file.ts +++ b/src/generator/format-generated-file.ts @@ -1,7 +1,5 @@ -import path from 'node:path'; import { parse as parseVue } from '@vue/compiler-sfc'; import { format, getFileInfo } from 'prettier'; -import type { Code } from 'ts-poet'; const validateVue = (relativePath: string, source: string): void => { const { errors } = parseVue(source, { filename: relativePath }); @@ -17,15 +15,12 @@ const validateVue = (relativePath: string, source: string): void => { export const formatGeneratedFile = async ( relativePath: string, - sourceCode: Code, + sourceCode: string, ): Promise => { - const extension = path.extname(relativePath); const { inferredParser: parser } = await getFileInfo(relativePath, { ignorePath: [], }); - const source = sourceCode - .toString({ format: false, path: relativePath }) - .replace(/^\n/, ''); + const source = sourceCode.replace(/^\n/, ''); if (!parser) return source; let formatted: string; @@ -37,7 +32,7 @@ export const formatGeneratedFile = async ( }); } - if (extension === '.vue') { + if (parser === 'vue') { validateVue(relativePath, formatted); } diff --git a/src/generator/generate.test.ts b/src/generator/generate.test.ts index b24b41e..096626b 100644 --- a/src/generator/generate.test.ts +++ b/src/generator/generate.test.ts @@ -1,22 +1,11 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import { afterEach, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { generateApp } from './generate.js'; -const outputs: string[] = []; - -const temporaryOutput = (): string => { - const output = fs.mkdtempSync(path.join(os.tmpdir(), 'paraspell-generator-')); - outputs.push(output); - return output; -}; - -afterEach(() => { - for (const output of outputs.splice(0)) { - fs.rmSync(output, { recursive: true, force: true }); - } -}); +const temporaryOutput = () => + fs.mkdtempDisposableSync(path.join(os.tmpdir(), 'paraspell-generator-')); describe('generateApp', () => { it('ships compact ParaSpell web assets at their intended dimensions', () => { @@ -41,7 +30,8 @@ describe('generateApp', () => { }); it('replaces an existing directory with a browser project and its logo', async () => { - const out = temporaryOutput(); + using output = temporaryOutput(); + const out = output.path; fs.writeFileSync(path.join(out, 'stale.txt'), 'stale'); await generateApp({ @@ -67,7 +57,8 @@ describe('generateApp', () => { }); it('writes a private node environment with configured wallets', async () => { - const out = temporaryOutput(); + using output = temporaryOutput(); + const out = output.path; const privateKey = `0x${'a'.repeat(64)}`; await generateApp({ diff --git a/src/generator/templates/index.test.ts b/src/generator/templates/index.test.ts index 1c9de2d..40919ac 100644 --- a/src/generator/templates/index.test.ts +++ b/src/generator/templates/index.test.ts @@ -59,10 +59,7 @@ const renderTemplates = ( }, }); return new Map( - createTemplateFiles(context).map((file) => [ - file.path, - file.render().toString({ format: false, path: file.path }), - ]), + createTemplateFiles(context).map((file) => [file.path, file.render()]), ); }; @@ -88,9 +85,7 @@ describe('createTemplateFiles', () => { expect(new Set(paths).size).toBe(paths.length); expect(paths).toContain('package.json'); for (const file of files) { - const output = file - .render() - .toString({ format: false, path: file.path }); + const output = file.render(); expect(output.length).toBeGreaterThan(0); } } @@ -113,9 +108,9 @@ describe('createTemplateFiles', () => { const manifestFile = files.find((file) => file.path === 'package.json'); expect(manifestFile).toBeDefined(); - const manifest = JSON.parse( - manifestFile!.render().toString({ format: false, path: 'package.json' }), - ) as { dependencies: Record }; + const manifest = JSON.parse(manifestFile!.render()) as { + dependencies: Record; + }; expect(manifest.dependencies).toHaveProperty('@polkadot/api'); expect(manifest.dependencies).toHaveProperty('@polkadot/types'); @@ -157,8 +152,18 @@ describe('createTemplateFiles', () => { const apiReact = renderTemplates('api', 'react', 'papi', fullExtensions); expect(apiReact.has('src/evm/index.ts')).toBe(false); expect(apiReact.has('src/wallet/evm/index.ts')).toBe(false); - expect(apiReact.get('src/utils.ts')).not.toContain('onSign'); - expect(apiReact.get('src/utils.ts')).not.toContain('{ txHash: string }'); + expect(apiReact.has('src/utils.ts')).toBe(false); + const apiPapiSubmit = apiReact.get('src/submit/submitPapiTransaction.ts'); + expect(apiPapiSubmit).toContain('tx.signAndSubmit(signer)'); + expect(apiPapiSubmit).toContain('throw new Error(message)'); + expect(apiPapiSubmit).not.toContain('UnsupportedOperationError'); + expect(apiPapiSubmit).not.toContain('signSubmitAndWatch'); + expect(apiReact.get('src/submit/submitEvmTx.ts')).toContain( + 'walletClient.sendTransaction', + ); + expect(apiReact.get('src/submit/submitEvmTx.ts')).not.toContain( + 'createPublicClient', + ); const minimalPapiReact = renderTemplates( 'sdk', @@ -173,6 +178,13 @@ describe('createTemplateFiles', () => { expect(minimalPapiReact.get('src/hooks/usePapiWallet.ts')).not.toMatch( /return\s*\{[\s\S]*?\bselectedAccount,/, ); + expect(minimalPapiReact.get('src/xcm/papi.ts')).toContain( + 'submitPapiTransaction(tx, signer)', + ); + const sdkPapiSubmit = minimalPapiReact.get( + 'src/xcm/submitPapiTransaction.ts', + ); + expect(sdkPapiSubmit).toBe(apiPapiSubmit); const fullPapiNode = renderTemplates('sdk', 'node', 'papi', fullExtensions); expect(fullPapiNode.has('src/isEvmOrigin.ts')).toBe(false); @@ -184,7 +196,7 @@ describe('createTemplateFiles', () => { 'dedot', minimalExtensions, ); - expect(minimalDedotNode.has('src/isEvmOrigin.ts')).toBe(true); + expect(minimalDedotNode.has('src/isEvmOrigin.ts')).toBe(false); expect(minimalDedotNode.get('src/substrate.ts')).not.toContain('signBytes'); expect(minimalDedotNode.get('src/types.ts')).not.toContain( 'currencyToLocation', @@ -199,6 +211,21 @@ describe('createTemplateFiles', () => { expect(minimalApiNode.get('src/substrate.ts')).toContain( 'export const getSubstrateMnemonic', ); + expect(minimalApiNode.get('src/substrate.ts')).toContain( + 'keyring.addFromUri(secret)', + ); + expect(minimalApiNode.get('src/substrate.ts')).not.toContain( + 'addFromMnemonic', + ); + expect(minimalApiNode.get('src/submitSubstrate.ts')).toContain( + 'submitPapiTransaction(tx, signer)', + ); + expect(minimalApiNode.get('src/submitSubstrate.ts')).not.toContain( + 'signSubmitAndWatch', + ); + expect(minimalApiNode.get('src/submitPapiTransaction.ts')).toBe( + apiPapiSubmit, + ); expect(minimalApiNode.get('src/types.ts')).not.toContain( 'currencyToLocation', ); @@ -237,10 +264,7 @@ describe('createTemplateFiles', () => { }); const files = createTemplateFiles(context); const outputByPath = new Map( - files.map((file) => [ - file.path, - file.render().toString({ format: false, path: file.path }), - ]), + files.map((file) => [file.path, file.render()]), ); expect(outputByPath.get('src/App.tsx')).toContain('/paraspell.png'); diff --git a/src/generator/templates/package-json.ts b/src/generator/templates/package-json.ts index 6850553..26f2802 100644 --- a/src/generator/templates/package-json.ts +++ b/src/generator/templates/package-json.ts @@ -1,6 +1,4 @@ -import type { Code } from 'ts-poet'; import type { TTemplateContext } from '../types.js'; -import { source } from './source.js'; type TPackageJson = { name: string; @@ -162,11 +160,10 @@ const nodeManifest = (context: TTemplateContext): TPackageJson => { }; }; -export const renderPackageJson = (context: TTemplateContext): Code => { +export const renderPackageJson = (context: TTemplateContext): string => { const manifest = context.framework === 'node' ? nodeManifest(context) : browserManifest(context); - return source`${JSON.stringify(manifest, null, 2)} -`; + return `${JSON.stringify(manifest, null, 2)}\n`; }; diff --git a/src/generator/templates/quality.ts b/src/generator/templates/quality.ts index 60835d4..1ba8b4e 100644 --- a/src/generator/templates/quality.ts +++ b/src/generator/templates/quality.ts @@ -126,6 +126,6 @@ export const createQualityTemplates = ( { path: 'pnpm-workspace.yaml', skip: context.packageManager !== 'pnpm', - render: () => source`${pnpmWorkspace}`, + render: () => pnpmWorkspace, }, ]; diff --git a/src/generator/templates/scaffold.ts b/src/generator/templates/scaffold.ts index 52f2122..083ef4e 100644 --- a/src/generator/templates/scaffold.ts +++ b/src/generator/templates/scaffold.ts @@ -1,11 +1,10 @@ -import type { Code } from 'ts-poet'; import type { TTemplateContext, TTemplateFile } from '../types.js'; import { createFragmentFile } from './fragment-file.js'; import { renderPackageJson } from './package-json.js'; import type { TFragmentRenderer } from './shared/fragment-types.js'; import { source } from './source.js'; -const renderGitignore = (framework: TTemplateContext['framework']): Code => +const renderGitignore = (framework: TTemplateContext['framework']): string => framework === 'node' ? source`node_modules dist @@ -35,7 +34,7 @@ const renderGitignore = (framework: TTemplateContext['framework']): Code => .DS_Store `; -const renderScripts = (context: TTemplateContext): Code => { +const renderScripts = (context: TTemplateContext): string => { const { framework, packageManager, startCmd } = context; return framework === 'node' @@ -58,7 +57,7 @@ const renderScripts = (context: TTemplateContext): Code => { `; }; -const renderBrowserReadme = (context: TTemplateContext): Code => { +const renderBrowserReadme = (context: TTemplateContext): string => { const { projectKind, installCmd, @@ -111,7 +110,7 @@ const renderBrowserReadme = (context: TTemplateContext): Code => { `; }; -const renderNodeReadme = (context: TTemplateContext): Code => { +const renderNodeReadme = (context: TTemplateContext): string => { const { projectKind, installCmd, diff --git a/src/generator/templates/shared/api.ts b/src/generator/templates/shared/api.ts index f15d405..59269db 100644 --- a/src/generator/templates/shared/api.ts +++ b/src/generator/templates/shared/api.ts @@ -108,13 +108,8 @@ export const createApiFragments: TFragmentFactory = ( : '' } `, - 'api/submitEvmTx': () => source`import { - createPublicClient, - http, - parseTransaction, - type Hex, - type WalletClient, - } from "viem"; + 'api/submitEvmTx': + () => source`import { parseTransaction, type Hex, type WalletClient } from "viem"; export const submitEvmTx = async ( serializedTx: Hex, @@ -130,34 +125,14 @@ export const createApiFragments: TFragmentFactory = ( throw new Error("Wallet client has no chain configured."); } - const publicClient = createPublicClient({ - chain, - transport: http(), - }); - const parsed = parseTransaction(serializedTx); - const [gas, fees, nonce] = await Promise.all([ - publicClient.estimateGas({ - account, - to: parsed.to ?? undefined, - data: parsed.data, - value: parsed.value, - }), - publicClient.estimateFeesPerGas(), - publicClient.getTransactionCount({ address: account.address, blockTag: "pending" }), - ]); - return walletClient.sendTransaction({ account, chain, to: parsed.to ?? undefined, data: parsed.data, value: parsed.value, - gas, - maxFeePerGas: fees.maxFeePerGas, - maxPriorityFeePerGas: fees.maxPriorityFeePerGas, - nonce, }); }; `, @@ -256,13 +231,18 @@ export const createApiFragments: TFragmentFactory = ( import { createWsClient } from "polkadot-api/ws"; import { API_URL } from "../consts"; import { fetchFromApi${evmWallet ? source`, fetchFromEvmApi` : ''} } from "../fetchFromApi"; - import { requireCurrency${swap ? source`, requireSwapCurrency` : ''} } from "../requireAsset"; + ${ + swap + ? source`import { requireSwapCurrency } from "../requireAsset"; + ` + : '' + } ${ evmWallet ? source`import { submitEvmTx } from "./submitEvmTx"; ` : '' - }import { submitTransaction } from "../utils"; + }import { submitPapiTransaction } from "./submitPapiTransaction"; import type { TApiParams, TApiTransaction, @@ -290,7 +270,7 @@ export const createApiFragments: TFragmentFactory = ( try { const callData = Binary.fromHex(apiTx.tx); const tx = await client.getUnsafeApi().txFromCallData(callData); - await submitTransaction(tx, signer); + await submitPapiTransaction(tx, signer); } finally { client.destroy(); } @@ -303,13 +283,12 @@ export const createApiFragments: TFragmentFactory = ( options: TWalletSubmitOptions, evmOrigins: TEvmOriginHelpers, ): Promise => { - const currency = requireCurrency(formValues.currency); + const currency = formValues.currency; ${ swap - ? source` const swapCurrencyTo = requireSwapCurrency( - formValues.swapEnabled, - formValues.currencyTo, - ); + ? source` const swapCurrencyTo = formValues.swapEnabled + ? requireSwapCurrency(formValues.currencyTo) + : undefined; ` : '' } @@ -382,13 +361,12 @@ export const createApiFragments: TFragmentFactory = ( signer: PolkadotSigner, senderAddress: string, ): Promise => { - const currency = requireCurrency(formValues.currency); + const currency = formValues.currency; ${ swap - ? source` const swapCurrencyTo = requireSwapCurrency( - formValues.swapEnabled, - formValues.currencyTo, - ); + ? source` const swapCurrencyTo = formValues.swapEnabled + ? requireSwapCurrency(formValues.currencyTo) + : undefined; ` : '' } @@ -419,43 +397,5 @@ export const createApiFragments: TFragmentFactory = ( ` } `, - 'api/utils': () => source`import { - InvalidTxError, - type PolkadotSigner, - type Transaction, - type TxFinalizedPayload, - } from "polkadot-api"; - - export const submitTransaction = async ( - tx: Transaction, - signer: PolkadotSigner, - ): Promise => { - return new Promise((resolve, reject) => { - tx.signSubmitAndWatch(signer).subscribe({ - next: (event) => { - if (event.type === "finalized") { - if (!event.ok) { - const errorMsg = event.dispatchError?.value - ? JSON.stringify(event.dispatchError.value) - : "Transaction failed"; - reject(new Error(errorMsg)); - } else { - resolve(event); - } - } - }, - error: (error) => { - if (error instanceof InvalidTxError) { - reject( - new Error(\`Invalid transaction: \${JSON.stringify(error.error)}\`), - ); - } else { - reject(error); - } - }, - }); - }); - }; - `, }; }; diff --git a/src/generator/templates/shared/base.ts b/src/generator/templates/shared/base.ts index 65a55f0..273cce3 100644 --- a/src/generator/templates/shared/base.ts +++ b/src/generator/templates/shared/base.ts @@ -7,7 +7,7 @@ export const createBaseFragments: TFragmentFactory = ( context, ) => { const { - extensions: { evm, snowbridge, swap }, + extensions: { evm, snowbridge }, } = context; return { @@ -46,31 +46,14 @@ export const createBaseFragments: TFragmentFactory = ( : '' }`, requireAsset: - () => source`export const requireCurrency = ( - currency: T | undefined, - ): T => { - if (!currency?.location) { - throw new Error("Currency is required."); - } - return currency; - };${ - swap - ? source` - - export const requireSwapCurrency = ( - swapEnabled: boolean | undefined, + () => source`export const requireSwapCurrency = ( currencyTo: T | undefined, - ): T | undefined => { - if (!swapEnabled) { - return undefined; - } + ): T => { if (!currencyTo?.location) { throw new Error("Swap destination currency is required."); } return currencyTo; - };` - : '' - } + }; `, }; }; diff --git a/src/generator/templates/shared/evm-core.ts b/src/generator/templates/shared/evm-core.ts index b046b27..d1acfcb 100644 --- a/src/generator/templates/shared/evm-core.ts +++ b/src/generator/templates/shared/evm-core.ts @@ -10,7 +10,6 @@ export const createEvmCoreFragments: TFragmentFactory = ( context, ) => { const { - sdkPackage, extensions: { evm, snowbridge }, } = context; @@ -45,35 +44,6 @@ export const createEvmCoreFragments: TFragmentFactory = ( evmOriginChains: readonly string[], ): boolean => evmOriginChains.includes(chain); `, - 'evm/evmWalletClient': - () => source`import type { EIP1193Provider } from "mipd"; - import { - createWalletClient, - custom, - type Address, - type WalletClient, - } from "viem"; - import { getViemChainForOrigin } from "./getViemChain"; - - export const ensureEvmWalletClient = async ( - walletClient: WalletClient, - origin: string, - provider: EIP1193Provider, - ): Promise => { - if (!walletClient.account) { - throw new Error( - "EVM wallet has no account. Disconnect and connect again.", - ); - } - const address: Address = walletClient.account.address; - - return createWalletClient({ - account: address, - chain: getViemChainForOrigin(origin), - transport: custom(provider), - }); - }; - `, 'evm/getViemChain': () => source`import type { Chain } from "viem";${ evm ? source` @@ -109,24 +79,6 @@ export const createEvmCoreFragments: TFragmentFactory = ( return chain; }; `, - 'evm/isEvmOrigin.sdk': () => source`import { - isChainEvm, - type TChain, - type TSubstrateChain, - } from "${sdkPackage}"; - - const isSubstrateOrigin = ( - chain: TChain, - ): chain is TSubstrateChain => !isChainEvm(chain); - - export const assertSubstrateOrigin: ( - chain: TChain, - ) => asserts chain is TSubstrateChain = (chain) => { - if (!isSubstrateOrigin(chain)) { - throw new Error("EVM origins are submitted via the EVM wallet path."); - } - }; - `, 'evm/utils.ts': () => source`import type { EIP6963ProviderDetail } from "mipd"; import type { TEvmProviderOption } from "../types"; @@ -142,12 +94,6 @@ export const createEvmCoreFragments: TFragmentFactory = ( label: entry.info.name, })); - export const parseRequestedAccounts = (result: unknown): string[] => { - if (!Array.isArray(result)) { - throw new Error("Wallet returned an invalid accounts response."); - } - return result.filter((value): value is string => typeof value === "string"); - }; `, }; }; diff --git a/src/generator/templates/shared/evm-react.ts b/src/generator/templates/shared/evm-react.ts index c626c53..704399e 100644 --- a/src/generator/templates/shared/evm-react.ts +++ b/src/generator/templates/shared/evm-react.ts @@ -137,11 +137,10 @@ export const createEvmReactFragments: TFragmentFactory< () => source`import { useCallback, useEffect, useMemo, useState } from "react"; import type { EIP6963ProviderDetail } from "mipd"; import { getAddress, type WalletClient } from "viem"; - import { createWalletClient, custom, isAddress } from "viem"; + import { createWalletClient, custom } from "viem"; import { getEip6963Providers } from "../evm/eip6963"; import { getViemChainForOrigin } from "../evm/getViemChain"; import { - parseRequestedAccounts, toProviderOptions, truncateAddress, } from "../evm/utils"; @@ -190,9 +189,10 @@ export const createEvmReactFragments: TFragmentFactory< const connectWithProvider = useCallback( async (providerDetail: EIP6963ProviderDetail) => { const provider = providerDetail.provider; - const requestedAccounts = parseRequestedAccounts( - await provider.request({ method: "eth_requestAccounts" }), - ); + const walletClient = createWalletClient({ + transport: custom(provider), + }); + const requestedAccounts = await walletClient.requestAddresses(); if (requestedAccounts.length === 0) { alert("No accounts found in the connected wallet."); @@ -252,9 +252,6 @@ export const createEvmReactFragments: TFragmentFactory< const getWalletClient = useCallback( (origin: string): WalletClient | undefined => { if (!selectedAddress || !selectedProvider) return undefined; - if (!isAddress(selectedAddress)) { - throw new Error("Selected EVM address is invalid."); - } return createWalletClient({ account: getAddress(selectedAddress), diff --git a/src/generator/templates/shared/evm-vue.ts b/src/generator/templates/shared/evm-vue.ts index a0ec191..4f62a48 100644 --- a/src/generator/templates/shared/evm-vue.ts +++ b/src/generator/templates/shared/evm-vue.ts @@ -12,41 +12,26 @@ export const createEvmVueFragments: TFragmentFactory< defineProps<{ providerOptions: TEvmProviderOption[]; - selectedProviderUuid: string | undefined; accounts: TEvmAccountOption[]; - selectedAddress: string | undefined; }>(); + const selectedProviderUuid = defineModel("selectedProviderUuid", { + default: "", + }); + const selectedAddress = defineModel("selectedAddress", { + default: "", + }); + const emit = defineEmits<{ connectClick: []; - providerChange: [uuid: string]; - accountChange: [address: string]; disconnect: []; }>(); - - const onProviderChange = (event: Event) => { - const target = event.target; - if (!(target instanceof HTMLSelectElement)) return; - - const uuid = target.value; - if (uuid) emit("providerChange", uuid); - }; - - const onAccountChange = (event: Event) => { - const target = event.target; - if (!(target instanceof HTMLSelectElement)) return; - - emit("accountChange", target.value); - };