diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0f28dc..ea7619f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,9 +195,6 @@ importers: vite: specifier: ^7.1.7 version: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - vite-plugin-top-level-await: - specifier: ^1.6.0 - version: 1.6.0(rollup@4.52.0)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) vite-plugin-wasm: specifier: ^3.5.0 version: 3.5.0(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) @@ -250,9 +247,6 @@ importers: vite: specifier: ^7.1.7 version: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - vite-plugin-top-level-await: - specifier: ^1.6.0 - version: 1.6.0(rollup@4.52.0)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) vite-plugin-vue-devtools: specifier: ^8.0.0 version: 8.0.2(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) @@ -1244,8 +1238,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@napi-rs/wasm-runtime@1.0.5': - resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.0.6': + resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} '@next/env@15.5.4': resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} @@ -1348,8 +1342,8 @@ packages: '@openzeppelin/contracts@4.9.6': resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} - '@oxc-project/types@0.93.0': - resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} + '@oxc-project/types@0.94.0': + resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -1375,85 +1369,85 @@ packages: '@quansync/fs@0.1.5': resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} - '@rolldown/binding-android-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.41': - resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': - resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': - resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': - resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1464,17 +1458,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} - '@rolldown/pluginutils@1.0.0-beta.41': - resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} - - '@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 + '@rolldown/pluginutils@1.0.0-beta.42': + resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} '@rollup/rollup-android-arm-eabi@4.52.0': resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} @@ -1615,87 +1600,9 @@ packages: peerDependencies: eslint: '>=9.0.0' - '@swc/core-darwin-arm64@1.13.5': - resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.13.5': - resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.13.5': - resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.13.5': - resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.13.5': - resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.13.5': - resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.13.5': - resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.13.5': - resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.13.5': - resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.13.5': - resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.13.5': - resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '>=0.5.17' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} - - '@swc/wasm@1.13.5': - resolution: {integrity: sha512-ZBZcxieydxNwgEU9eFAXGMaDb1Xoh+ZkZcUQ27LNJzc2lPSByoL6CSVqnYiaVo+n9JgqbYyHlMq+i7z0wRNTfA==} - '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -4155,8 +4062,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.41: - resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} + rolldown@1.0.0-beta.42: + resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -4617,10 +4524,6 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@2.0.1: resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -4655,11 +4558,6 @@ packages: '@nuxt/kit': optional: true - vite-plugin-top-level-await@1.6.0: - resolution: {integrity: sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==} - peerDependencies: - vite: '>=2.8' - vite-plugin-vue-devtools@8.0.2: resolution: {integrity: sha512-1069qvMBcyAu3yXQlvYrkwoyLOk0lSSR/gTKy/vy+Det7TXnouGei6ZcKwr5TIe938v/14oLlp0ow6FSJkkORA==} engines: {node: '>=v14.21.3'} @@ -5907,7 +5805,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@1.0.5': + '@napi-rs/wasm-runtime@1.0.6': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -6032,7 +5930,7 @@ snapshots: '@openzeppelin/contracts@4.9.6': {} - '@oxc-project/types@0.93.0': {} + '@oxc-project/types@0.94.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -6059,59 +5957,55 @@ snapshots: dependencies: quansync: 0.2.11 - '@rolldown/binding-android-arm64@1.0.0-beta.41': + '@rolldown/binding-android-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.41': + '@rolldown/binding-darwin-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': dependencies: - '@napi-rs/wasm-runtime': 1.0.5 + '@napi-rs/wasm-runtime': 1.0.6 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rolldown/pluginutils@1.0.0-beta.41': {} - - '@rollup/plugin-virtual@3.0.2(rollup@4.52.0)': - optionalDependencies: - rollup: 4.52.0 + '@rolldown/pluginutils@1.0.0-beta.42': {} '@rollup/rollup-android-arm-eabi@4.52.0': optional: true @@ -6210,64 +6104,10 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 - '@swc/core-darwin-arm64@1.13.5': - optional: true - - '@swc/core-darwin-x64@1.13.5': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.13.5': - optional: true - - '@swc/core-linux-arm64-gnu@1.13.5': - optional: true - - '@swc/core-linux-arm64-musl@1.13.5': - optional: true - - '@swc/core-linux-x64-gnu@1.13.5': - optional: true - - '@swc/core-linux-x64-musl@1.13.5': - optional: true - - '@swc/core-win32-arm64-msvc@1.13.5': - optional: true - - '@swc/core-win32-ia32-msvc@1.13.5': - optional: true - - '@swc/core-win32-x64-msvc@1.13.5': - optional: true - - '@swc/core@1.13.5': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 - optionalDependencies: - '@swc/core-darwin-arm64': 1.13.5 - '@swc/core-darwin-x64': 1.13.5 - '@swc/core-linux-arm-gnueabihf': 1.13.5 - '@swc/core-linux-arm64-gnu': 1.13.5 - '@swc/core-linux-arm64-musl': 1.13.5 - '@swc/core-linux-x64-gnu': 1.13.5 - '@swc/core-linux-x64-musl': 1.13.5 - '@swc/core-win32-arm64-msvc': 1.13.5 - '@swc/core-win32-ia32-msvc': 1.13.5 - '@swc/core-win32-x64-msvc': 1.13.5 - - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@swc/types@0.1.25': - dependencies: - '@swc/counter': 0.1.3 - - '@swc/wasm@1.13.5': {} - '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 @@ -9180,7 +9020,7 @@ snapshots: dependencies: bn.js: 5.2.2 - rolldown-plugin-dts@0.16.8(rolldown@1.0.0-beta.41)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)): + rolldown-plugin-dts@0.16.8(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -9191,7 +9031,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.41 + rolldown: 1.0.0-beta.42 optionalDependencies: typescript: 5.9.2 vue-tsc: 3.0.8(typescript@5.9.2) @@ -9199,26 +9039,26 @@ snapshots: - oxc-resolver - supports-color - rolldown@1.0.0-beta.41: + rolldown@1.0.0-beta.42: dependencies: - '@oxc-project/types': 0.93.0 - '@rolldown/pluginutils': 1.0.0-beta.41 + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.42 ansis: 4.2.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.41 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 - '@rolldown/binding-darwin-x64': 1.0.0-beta.41 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 + '@rolldown/binding-android-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-x64': 1.0.0-beta.42 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 rollup@4.52.0: dependencies: @@ -9584,8 +9424,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.41 - rolldown-plugin-dts: 0.16.8(rolldown@1.0.0-beta.41)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)) + rolldown: 1.0.0-beta.42 + rolldown-plugin-dts: 0.16.8(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -9716,8 +9556,6 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.19 - uuid@10.0.0: {} - uuid@2.0.1: {} uuid@3.3.2: {} @@ -9768,17 +9606,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-top-level-await@1.6.0(rollup@4.52.0)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)): - dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.52.0) - '@swc/core': 1.13.5 - '@swc/wasm': 1.13.5 - uuid: 10.0.0 - vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - transitivePeerDependencies: - - '@swc/helpers' - - rollup - vite-plugin-vue-devtools@8.0.2(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): dependencies: '@vue/devtools-core': 8.0.2(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) diff --git a/starters/hub-api-ts/.gitignore b/starters/hub-api-ts/.gitignore new file mode 100644 index 0000000..e985853 --- /dev/null +++ b/starters/hub-api-ts/.gitignore @@ -0,0 +1 @@ +.vercel diff --git a/starters/hub-api-ts/src/tests/hub-api.browser.test.ts b/starters/hub-api-ts/src/tests/hub-api.browser.test.ts index 3e5f9cc..d2432e7 100644 --- a/starters/hub-api-ts/src/tests/hub-api.browser.test.ts +++ b/starters/hub-api-ts/src/tests/hub-api.browser.test.ts @@ -32,7 +32,7 @@ it('opens Hub popup and verifies it loads the Hub interface', async () => { // Override window.open to capture the popup reference const originalOpen = window.open - window.open = function (...args: Parameters) { + window.open = function (...args: Parameters): Window | null { const url = args[0]?.toString() || '' // Check if it's the Hub @@ -41,12 +41,12 @@ it('opens Hub popup and verifies it loads the Hub interface', async () => { hubPopupUrl = url // Actually open the popup so we can inspect it - hubPopup = originalOpen.apply(window, args) + hubPopup = originalOpen.apply(window, args) as Window | null return hubPopup } - return originalOpen.apply(window, args) - } as typeof window.open + return originalOpen.apply(window, args) as Window | null + } // Import and initialize the app await import('../main') @@ -65,29 +65,32 @@ it('opens Hub popup and verifies it loads the Hub interface', async () => { expect(hubPopup).toBeTruthy() // Try to verify the popup loaded (if accessible due to CORS/same-origin policy) - if (hubPopup && !hubPopup.closed) { - try { - // Wait a bit for the Hub to load - await sleep(3000) - - // Check if we can access the popup's location - const popupLocation = hubPopup.location.href - expect(popupLocation).toContain('hub.nimiq') - console.log('✅ Hub popup verified - URL:', popupLocation) - - // Close the popup - hubPopup.close() - } - catch (error) { - // If we get a cross-origin error, that's actually good - it means the real Hub loaded - const errorMessage = error instanceof Error ? error.message : String(error) - if (errorMessage.includes('cross-origin') || errorMessage.includes('SecurityError')) { - console.log('✅ Hub popup loaded (cross-origin - real Hub domain)') - console.log(' Expected cross-origin restriction confirms real Hub loaded') - hubPopup.close() + if (hubPopup) { + const popup = hubPopup as Window + if (!popup.closed) { + try { + // Wait a bit for the Hub to load + await sleep(3000) + + // Check if we can access the popup's location + const popupLocation = popup.location.href + expect(popupLocation).toContain('hub.nimiq') + console.log('✅ Hub popup verified - URL:', popupLocation) + + // Close the popup + popup.close() } - else { - throw error + catch (error) { + // If we get a cross-origin error, that's actually good - it means the real Hub loaded + const errorMessage = error instanceof Error ? error.message : String(error) + if (errorMessage.includes('cross-origin') || errorMessage.includes('SecurityError')) { + console.log('✅ Hub popup loaded (cross-origin - real Hub domain)') + console.log(' Expected cross-origin restriction confirms real Hub loaded') + popup.close() + } + else { + throw error + } } } } diff --git a/starters/react-ts/package.json b/starters/react-ts/package.json index 4261479..2f7cae2 100644 --- a/starters/react-ts/package.json +++ b/starters/react-ts/package.json @@ -32,7 +32,6 @@ "playwright": "^1.55.1", "typescript": "^5.9.2", "vite": "^7.1.7", - "vite-plugin-top-level-await": "^1.6.0", "vite-plugin-wasm": "^3.5.0", "vitest": "^3.2.4" } diff --git a/starters/react-ts/vite.config.ts b/starters/react-ts/vite.config.ts index c9af88b..f7da6fe 100644 --- a/starters/react-ts/vite.config.ts +++ b/starters/react-ts/vite.config.ts @@ -1,13 +1,13 @@ +import type { Plugin } from 'vite' import { copyFile, cp, mkdir } from 'node:fs/promises' import path from 'node:path' -import { fileURLToPath, URL } from 'node:url' +import { fileURLToPath, URL } from 'node:url' import react from '@vitejs/plugin-react' import { defineConfig } from 'vite' -import topLevelAwait from 'vite-plugin-top-level-await' import wasm from 'vite-plugin-wasm' -function copyComlinkPlugin() { +function copyComlinkPlugin(): Plugin { return { name: 'copy-comlink-worker-dependency', apply: 'build', @@ -21,57 +21,79 @@ function copyComlinkPlugin() { await mkdir(distAssetsDir, { recursive: true }) await copyFile(src, dest) + // Copy worker WASM files if they exist const workerSrcDir = path.join(distDir, 'worker-wasm') const workerDestDir = path.join(distAssetsDir, 'worker-wasm') - await cp(workerSrcDir, workerDestDir, { recursive: true }) + try { + await cp(workerSrcDir, workerDestDir, { recursive: true }) + } + catch (error) { + // Ignore if worker-wasm doesn't exist + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error + } + } }, } } +/** + * Vite plugin for Nimiq blockchain integration + * Configures WebAssembly support and optimizations required for @nimiq/core + * + * Note: This plugin does not include top-level await support. Modern browsers + * support top-level await natively. If you need support for older browsers, + * you can add vite-plugin-top-level-await to your plugins array manually. + * + * @param {object} [options] - Plugin options + * @param {boolean} [options.worker] - Configure worker support for WASM + * @returns {import('vite').Plugin[]} Array of Vite plugins + */ +function nimiq({ worker = true } = {}) { + return [ + wasm(), + { + name: 'vite-plugin-nimiq', + config() { + return { + optimizeDeps: { + exclude: ['@nimiq/core'], + }, + build: { + target: 'esnext', + rollupOptions: { + output: { + format: 'es', + }, + }, + }, + ...(worker && { + worker: { + format: 'es', + plugins: [wasm()], + }, + }), + } + }, + }, + ] +} + // https://vite.dev/config/ export default defineConfig({ plugins: [ react(), - wasm(), - topLevelAwait({ - // The module that contains the top-level await - promiseExportName: '__tla', - // The function to generate the promise export name - promiseImportName: i => `__tla_${i}`, - }), + nimiq(), copyComlinkPlugin(), ], - worker: { - format: 'es', - rollupOptions: { - output: { - entryFileNames: 'assets/[name]-[hash].js', - chunkFileNames: 'assets/[name]-[hash].js', - assetFileNames: 'assets/[name]-[hash].[ext]', - }, - }, - plugins: () => [ - wasm(), - topLevelAwait({ - promiseExportName: '__tla', - promiseImportName: i => `__tla_${i}`, - }), - ], - }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, - optimizeDeps: { - exclude: ['@nimiq/core'], - }, - // Additional build configuration for Nimiq build: { - target: 'esnext', rollupOptions: { output: { - format: 'es', entryFileNames: 'assets/[name]-[hash].js', chunkFileNames: 'assets/[name]-[hash].js', assetFileNames: 'assets/[name]-[hash].[ext]', diff --git a/starters/vue-ts/package.json b/starters/vue-ts/package.json index eb5d84b..8a44401 100644 --- a/starters/vue-ts/package.json +++ b/starters/vue-ts/package.json @@ -31,7 +31,6 @@ "playwright": "^1.55.1", "typescript": "^5.9.2", "vite": "^7.1.7", - "vite-plugin-top-level-await": "^1.6.0", "vite-plugin-vue-devtools": "^8.0.0", "vite-plugin-wasm": "^3.5.0", "vitest": "^3.2.4", diff --git a/starters/vue-ts/vite.config.ts b/starters/vue-ts/vite.config.ts index baf44ba..af43542 100644 --- a/starters/vue-ts/vite.config.ts +++ b/starters/vue-ts/vite.config.ts @@ -1,14 +1,14 @@ +import type { Plugin } from 'vite' import { copyFile, cp, mkdir } from 'node:fs/promises' import path from 'node:path' -import { fileURLToPath, URL } from 'node:url' +import { fileURLToPath, URL } from 'node:url' import vue from '@vitejs/plugin-vue' import { defineConfig } from 'vite' -import topLevelAwait from 'vite-plugin-top-level-await' import vueDevTools from 'vite-plugin-vue-devtools' import wasm from 'vite-plugin-wasm' -function copyComlinkPlugin() { +function copyComlinkPlugin(): Plugin { return { name: 'copy-comlink-worker-dependency', apply: 'build', @@ -22,35 +22,75 @@ function copyComlinkPlugin() { await mkdir(distAssetsDir, { recursive: true }) await copyFile(src, dest) + // Copy worker WASM files if they exist const workerSrcDir = path.join(distDir, 'worker-wasm') const workerDestDir = path.join(distAssetsDir, 'worker-wasm') - await cp(workerSrcDir, workerDestDir, { recursive: true }) + try { + await cp(workerSrcDir, workerDestDir, { recursive: true }) + } + catch (error) { + // Ignore if worker-wasm doesn't exist + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error + } + } }, } } +/** + * Vite plugin for Nimiq blockchain integration + * Configures WebAssembly support and optimizations required for @nimiq/core + * + * Note: This plugin does not include top-level await support. Modern browsers + * support top-level await natively. If you need support for older browsers, + * you can add vite-plugin-top-level-await to your plugins array manually. + * + * @param {object} [options] - Plugin options + * @param {boolean} [options.worker] - Configure worker support for WASM + * @returns {import('vite').Plugin[]} Array of Vite plugins + */ +function nimiq({ worker = true } = {}) { + return [ + wasm(), + { + name: 'vite-plugin-nimiq', + config() { + return { + optimizeDeps: { + exclude: ['@nimiq/core'], + }, + build: { + target: 'esnext', + rollupOptions: { + output: { + format: 'es', + }, + }, + }, + ...(worker && { + worker: { + format: 'es', + plugins: [wasm()], + }, + }), + } + }, + }, + ] +} + // https://vite.dev/config/ export default defineConfig({ plugins: [ vue(), vueDevTools(), - wasm(), - topLevelAwait(), + nimiq(), copyComlinkPlugin(), ], - worker: { - format: 'es', - plugins: () => [ - wasm(), - topLevelAwait(), - ], - }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, - optimizeDeps: { - exclude: ['@nimiq/core'], - }, })