diff --git a/.gitignore b/.gitignore index 5b9e049..0e50763 100644 --- a/.gitignore +++ b/.gitignore @@ -222,4 +222,7 @@ $RECYCLE.BIN/ # Temp directory /tmp -# End of https://www.toptal.com/developers/gitignore/api/windows,macos,node,visualstudiocode \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/windows,macos,node,visualstudiocode + +# Mendix Widget schema file +custom_widget.xsd \ No newline at end of file diff --git a/README.md b/README.md index 2ea1bdb..36028a8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # hyper-pwt +hyper-pwt + A faster, more modern, superior alternative for [Mendix PWT](https://github.com/mendix/widgets-tools). ## How to use? @@ -29,6 +31,49 @@ Second, replace pluggable-widgets-tools to hyper-pwt in widget's package.json. ## Custom build configurations +### Web + +Create vite.config.mjs on your pwt root directory. + +```javascript +import { definePWTConfig } from '@repixelcorp/hyper-pwt'; + +export default definePWTConfig(() => { + return { + // Your custom configuration in here. + }; +}); +``` + +hyper-pwt uses the [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react-swc) plugin. The settings for this plugin can be changed as follows. + +```javascript +import { definePWTConfig } from '@repixelcorp/hyper-pwt'; + +export default definePWTConfig(() => { + return { + reactPluginOptions: { + tsDecorators: true, + } + }; +}); +``` + +definePWTConfig also supports asynchronous mode. It can be used as follows. + +```javascript +import { definePWTConfig } from '@repixelcorp/hyper-pwt'; + +export default definePWTConfig(async () => { + const promise = await somethingPromise(); + + return { + }; +}); +``` + +### Native + TODO ## Performance compare with Mendix PWT @@ -70,3 +115,5 @@ Please refer to the [LICENSE](./LICENSE). ## Disclaimers Neither Repixel Co., Ltd., nor the project maintainers or contributors, are responsible for any problems arising from the use of this software. The user is entirely responsible. + + diff --git a/package.json b/package.json index 06a74f5..756a54b 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,65 @@ -{ - "name": "@repixelcorp/hyper-pwt", - "version": "0.1.0", - "description": "A faster, more modern, superior alternative for Mendix PWT.", - "repository": { - "type": "git", - "url": "git+https://github.com/repixelcorp/hyper-pwt.git" - }, - "scripts": { - "build": "rslib build", - "watch": "rslib build --watch", - "start": "pnpm build && node ./dist/index.js", - "link": "pnpm build && npm link --force" - }, - "bin": { - "hyper-pwt": "dist/index.js" - }, - "keywords": [ - "mendix", - "pwt", - "mendix-pwt", - "pluggable-widgets-tools" - ], - "author": "Repixel Co, Ltd.", - "license": "MIT", - "packageManager": "pnpm@10.15.0", - "devDependencies": { - "@rslib/core": "0.12.2", - "@types/node": "22.17.2", - "type-fest": "4.41.0" - }, - "dependencies": { - "@vitejs/plugin-react-swc": "4.0.1", - "chalk": "5.6.0", - "commander": "14.0.0", - "vite": "7.1.3", - "zip-a-folder": "3.1.9" - }, - "files": [ - "dist/**/*", - "package.json", - "LICENSE" - ], - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org" - } -} +{ + "name": "@repixelcorp/hyper-pwt", + "version": "0.2.0", + "description": "A faster, more modern, superior alternative for Mendix PWT.", + "repository": { + "type": "git", + "url": "git+https://github.com/repixelcorp/hyper-pwt.git" + }, + "scripts": { + "build": "rslib build", + "watch": "rslib build --watch", + "start": "pnpm build && node ./dist/cli.js", + "package": "pnpm build && pnpm pack", + "prepare": "node ./tools/copy-widget-schema.js" + }, + "main": "dist/index.cjs", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs", + "types": "./dist/index.d.ts" + } + }, + "bin": { + "hyper-pwt": "dist/cli.js" + }, + "keywords": [ + "mendix", + "pwt", + "mendix-pwt", + "pluggable-widgets-tools" + ], + "author": "Repixel Co, Ltd.", + "license": "MIT", + "packageManager": "pnpm@10.15.0", + "devDependencies": { + "@rslib/core": "0.12.2", + "@types/node": "22.17.2", + "esbuild": "0.25.9", + "type-fest": "4.41.0", + "typescript": "5.9.2" + }, + "dependencies": { + "@vitejs/plugin-react-swc": "4.0.1", + "chalk": "5.6.0", + "commander": "14.0.0", + "fast-xml-parser": "5.2.5", + "mendix": "10.24.77222", + "vite": "7.1.3", + "zip-a-folder": "3.1.9" + }, + "files": [ + "dist/**/*", + "package.json", + "LICENSE", + "src/configurations/hotReload/**/*", + "custom_widget.xsd" + ], + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a42579..bf4b390 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1843 +1,1916 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@vitejs/plugin-react-swc': - specifier: 4.0.1 - version: 4.0.1(@swc/helpers@0.5.17)(vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1)) - chalk: - specifier: 5.6.0 - version: 5.6.0 - commander: - specifier: 14.0.0 - version: 14.0.0 - vite: - specifier: 7.1.3 - version: 7.1.3(@types/node@22.17.2)(jiti@2.5.1) - zip-a-folder: - specifier: 3.1.9 - version: 3.1.9 - devDependencies: - '@rslib/core': - specifier: 0.12.2 - version: 0.12.2 - '@types/node': - specifier: 22.17.2 - version: 22.17.2 - type-fest: - specifier: 4.41.0 - version: 4.41.0 - -packages: - - '@ast-grep/napi-darwin-arm64@0.37.0': - resolution: {integrity: sha512-QAiIiaAbLvMEg/yBbyKn+p1gX2/FuaC0SMf7D7capm/oG4xGMzdeaQIcSosF4TCxxV+hIH4Bz9e4/u7w6Bnk3Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@ast-grep/napi-darwin-x64@0.37.0': - resolution: {integrity: sha512-zvcvdgekd4ySV3zUbUp8HF5nk5zqwiMXTuVzTUdl/w08O7JjM6XPOIVT+d2o/MqwM9rsXdzdergY5oY2RdhSPA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@ast-grep/napi-linux-arm64-gnu@0.37.0': - resolution: {integrity: sha512-L7Sj0lXy8X+BqSMgr1LB8cCoWk0rericdeu+dC8/c8zpsav5Oo2IQKY1PmiZ7H8IHoFBbURLf8iklY9wsD+cyA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@ast-grep/napi-linux-arm64-musl@0.37.0': - resolution: {integrity: sha512-LF9sAvYy6es/OdyJDO3RwkX3I82Vkfsng1sqUBcoWC1jVb1wX5YVzHtpQox9JrEhGl+bNp7FYxB4Qba9OdA5GA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@ast-grep/napi-linux-x64-gnu@0.37.0': - resolution: {integrity: sha512-TViz5/klqre6aSmJzswEIjApnGjJzstG/SE8VDWsrftMBMYt2PTu3MeluZVwzSqDao8doT/P+6U11dU05UOgxw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@ast-grep/napi-linux-x64-musl@0.37.0': - resolution: {integrity: sha512-/BcCH33S9E3ovOAEoxYngUNXgb+JLg991sdyiNP2bSoYd30a9RHrG7CYwW6fMgua3ijQ474eV6cq9yZO1bCpXg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@ast-grep/napi-win32-arm64-msvc@0.37.0': - resolution: {integrity: sha512-TjQA4cFoIEW2bgjLkaL9yqT4XWuuLa5MCNd0VCDhGRDMNQ9+rhwi9eLOWRaap3xzT7g+nlbcEHL3AkVCD2+b3A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@ast-grep/napi-win32-ia32-msvc@0.37.0': - resolution: {integrity: sha512-uNmVka8fJCdYsyOlF9aZqQMLTatEYBynjChVTzUfFMDfmZ0bihs/YTqJVbkSm8TZM7CUX82apvn50z/dX5iWRA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@ast-grep/napi-win32-x64-msvc@0.37.0': - resolution: {integrity: sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@ast-grep/napi@0.37.0': - resolution: {integrity: sha512-Hb4o6h1Pf6yRUAX07DR4JVY7dmQw+RVQMW5/m55GoiAT/VRoKCWBtIUPPOnqDVhbx1Cjfil9b6EDrgJsUAujEQ==} - engines: {node: '>= 10'} - - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} - - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@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'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@module-federation/error-codes@0.18.0': - resolution: {integrity: sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==} - - '@module-federation/runtime-core@0.18.0': - resolution: {integrity: sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==} - - '@module-federation/runtime-tools@0.18.0': - resolution: {integrity: sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==} - - '@module-federation/runtime@0.18.0': - resolution: {integrity: sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==} - - '@module-federation/sdk@0.18.0': - resolution: {integrity: sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==} - - '@module-federation/webpack-bundler-runtime@0.18.0': - resolution: {integrity: sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==} - - '@napi-rs/wasm-runtime@1.0.3': - resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rolldown/pluginutils@1.0.0-beta.32': - resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} - - '@rollup/rollup-android-arm-eabi@4.46.4': - resolution: {integrity: sha512-B2wfzCJ+ps/OBzRjeds7DlJumCU3rXMxJJS1vzURyj7+KBHGONm7c9q1TfdBl4vCuNMkDvARn3PBl2wZzuR5mw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.46.4': - resolution: {integrity: sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.46.4': - resolution: {integrity: sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.46.4': - resolution: {integrity: sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.46.4': - resolution: {integrity: sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.46.4': - resolution: {integrity: sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.46.4': - resolution: {integrity: sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.46.4': - resolution: {integrity: sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.46.4': - resolution: {integrity: sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.46.4': - resolution: {integrity: sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.46.4': - resolution: {integrity: sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.46.4': - resolution: {integrity: sha512-YMdz2phOTFF+Z66dQfGf0gmeDSi5DJzY5bpZyeg9CPBkV9QDzJ1yFRlmi/j7WWRf3hYIWrOaJj5jsfwgc8GTHQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.46.4': - resolution: {integrity: sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.46.4': - resolution: {integrity: sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.46.4': - resolution: {integrity: sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.46.4': - resolution: {integrity: sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.46.4': - resolution: {integrity: sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.46.4': - resolution: {integrity: sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.46.4': - resolution: {integrity: sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.46.4': - resolution: {integrity: sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==} - cpu: [x64] - os: [win32] - - '@rsbuild/core@1.5.0-beta.4': - resolution: {integrity: sha512-h1jqpjZunalsdxTcJCbY8DovLu6F4MQgsYdZyxDjUp0xuggQayi1tpcE6MhLs3WWa077g+LZ2Am4gKt/pl/W9Q==} - engines: {node: '>=18.12.0'} - hasBin: true - - '@rslib/core@0.12.2': - resolution: {integrity: sha512-5DPVxmzzyoQlLqSt8Y/8kbYNtbJ0AEVUXd1hDFQ0Iq5Eb5XA4363PDeLdfeKJ1h93YqT7M9WZ3Cyhvosx1EimQ==} - engines: {node: '>=18.12.0'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7 - typescript: ^5 - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - typescript: - optional: true - - '@rspack/binding-darwin-arm64@1.5.0-beta.1': - resolution: {integrity: sha512-aXSbz9Bo480xNDK6v64SZ19I/bmMuxaOuex6V9q0S+v3qx/ZsUWL+5aUd71scq7EfAb3KkvQFsYACpt5PMZ9DQ==} - cpu: [arm64] - os: [darwin] - - '@rspack/binding-darwin-x64@1.5.0-beta.1': - resolution: {integrity: sha512-addeCT0bXtfOfvJZdVuHWBl20Cd8RmweOX03OiEH4AmQc9EgUEP/oCGpOmakBXxUCl3x/RnlrXx2nD1uDyuyLA==} - cpu: [x64] - os: [darwin] - - '@rspack/binding-linux-arm64-gnu@1.5.0-beta.1': - resolution: {integrity: sha512-fYgOfSsA0J0rUA40ZEexrMRKyIVAUo4m0KShTm6yVaAzQHWVZ0xjjcoLFNxCVE7EvAPI7wl9fDOyr7Y8EylVfQ==} - cpu: [arm64] - os: [linux] - - '@rspack/binding-linux-arm64-musl@1.5.0-beta.1': - resolution: {integrity: sha512-wWlOzsoJU2HJyPxoCDScW4zt3+5WO6NI8B7jSmhVA9dfmvCYUKktt/YZpskcgMsvCgtzXTE62wDc+VTQ5ucp9A==} - cpu: [arm64] - os: [linux] - - '@rspack/binding-linux-x64-gnu@1.5.0-beta.1': - resolution: {integrity: sha512-OlgQIQLDLDDXvbUYBEfZmofO3uTDi0rGfIr58PXz/wTF87KdwqlU0HyjIeaeDUaQlV+lNXNysuCwvI0hl/o2tw==} - cpu: [x64] - os: [linux] - - '@rspack/binding-linux-x64-musl@1.5.0-beta.1': - resolution: {integrity: sha512-LkQSyfyf5Jy0UGD0tvm2Gz+0VjboawtRrYd+qYHE0Pm4h7tTJWyqnh02LRTROxOl3GrssC1VGn6J8XYTxOAWug==} - cpu: [x64] - os: [linux] - - '@rspack/binding-wasm32-wasi@1.5.0-beta.1': - resolution: {integrity: sha512-ysnuVnqC9byoYfoAi/TsV0U5ZUxU0snnVPa/SvQEO6ew3J2GaNDq1vS1zWo0SOA4eLmwkop0/UcH8n3VXOy7NA==} - cpu: [wasm32] - - '@rspack/binding-win32-arm64-msvc@1.5.0-beta.1': - resolution: {integrity: sha512-vcMXybMchQomBODyi6aIMCur8/oQktw+iVv0dH3hiiWy0v2g8xS9VLMjWXfGZAhonhRe7YWTP12dxCPbWmQyZw==} - cpu: [arm64] - os: [win32] - - '@rspack/binding-win32-ia32-msvc@1.5.0-beta.1': - resolution: {integrity: sha512-fCj904xjc5iKOdUS0VLUE/LbAQZWlub/TF0ZKhzq2UK8WWwrfhA5U8ZHximU0A0LVDoMVZCM5M12rO12P0uHKw==} - cpu: [ia32] - os: [win32] - - '@rspack/binding-win32-x64-msvc@1.5.0-beta.1': - resolution: {integrity: sha512-iWCoFMwP2aUea1mIp2+mTE7IKj6wp9hxMuZgOcEGWQidE7pUss5/Zp3wrOSWnnyovIeQLmK9wsQEA/W3i3MiAQ==} - cpu: [x64] - os: [win32] - - '@rspack/binding@1.5.0-beta.1': - resolution: {integrity: sha512-qZ+cxvsNvXBOPX0NEP+KfxQlJI7TDZR2XLS8Jl+zHl2kgulEOBWsBa7Q1Dcw73YQgz2owxP3OWl3f8LWXnnC1Q==} - - '@rspack/core@1.5.0-beta.1': - resolution: {integrity: sha512-o3yQreNKldm0k96wPMpXBI9p0B03LpeK3XyV4vhk24RfLIa2p6C2LPF4xn6U2M28CFQkSbeu1vwlMHnfW4xHNg==} - engines: {node: '>=18.12.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@rspack/lite-tapable@1.0.1': - resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} - engines: {node: '>=16.0.0'} - - '@swc/core-darwin-arm64@1.13.4': - resolution: {integrity: sha512-CGbTu9dGBwgklUj+NAQAYyPjBuoHaNRWK4QXJRv1QNIkhtE27aY7QA9uEON14SODxsio3t8+Pjjl2Mzx1Pxf+g==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.13.4': - resolution: {integrity: sha512-qLFwYmLrqHNCf+JO9YLJT6IP/f9LfbXILTaqyfluFLW1GCfJyvUrSt3CWaL2lwwyT1EbBh6BVaAAecXiJIo3vg==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.13.4': - resolution: {integrity: sha512-y7SeNIA9em3+smNMpr781idKuNwJNAqewiotv+pIR5FpXdXXNjHWW+jORbqQYd61k6YirA5WQv+Af4UzqEX17g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.13.4': - resolution: {integrity: sha512-u0c51VdzRmXaphLgghY9+B2Frzler6nIv+J788nqIh6I0ah3MmMW8LTJKZfdaJa3oFxzGNKXsJiaU2OFexNkug==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.13.4': - resolution: {integrity: sha512-Z92GJ98x8yQHn4I/NPqwAQyHNkkMslrccNVgFcnY1msrb6iGSw5uFg2H2YpvQ5u2/Yt6CRpLIUVVh8SGg1+gFA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.13.4': - resolution: {integrity: sha512-rSUcxgpFF0L8Fk1CbUf946XCX1CRp6eaHfKqplqFNWCHv8HyqAtSFvgCHhT+bXru6Ca/p3sLC775SUeSWhsJ9w==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.13.4': - resolution: {integrity: sha512-qY77eFUvmdXNSmTW+I1fsz4enDuB0I2fE7gy6l9O4koSfjcCxkXw2X8x0lmKLm3FRiINS1XvZSg2G+q4NNQCRQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.13.4': - resolution: {integrity: sha512-xjPeDrOf6elCokxuyxwoskM00JJFQMTT2hTQZE24okjG3JiXzSFV+TmzYSp+LWNxPpnufnUUy/9Ee8+AcpslGw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.13.4': - resolution: {integrity: sha512-Ta+Bblc9tE9X9vQlpa3r3+mVnHYdKn09QsZ6qQHvuXGKWSS99DiyxKTYX2vxwMuoTObR0BHvnhNbaGZSV1VwNA==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.13.4': - resolution: {integrity: sha512-pHnb4QwGiuWs4Z9ePSgJ48HP3NZIno6l75SB8YLCiPVDiLhvCLKEjz/caPRsFsmet9BEP8e3bAf2MV8MXgaTSg==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.13.4': - resolution: {integrity: sha512-bCq2GCuKV16DSOOEdaRqHMm1Ok4YEoLoNdgdzp8BS/Hxxr/0NVCHBUgRLLRy/TlJGv20Idx+djd5FIDvsnqMaw==} - 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.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@swc/types@0.1.24': - resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} - - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/node@22.17.2': - resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} - - '@vitejs/plugin-react-swc@4.0.1': - resolution: {integrity: sha512-NQhPjysi5duItyrMd5JWZFf2vNOuSMyw+EoZyTBDzk+DkfYD8WNrsUs09sELV2cr1P15nufsN25hsUBt4CKF9Q==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - vite: ^4 || ^5 || ^6 || ^7 - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.0: - resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bare-events@2.6.1: - resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - 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'} - - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} - - core-js@3.45.1: - resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} - engines: {node: '>=18'} - hasBin: true - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - 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 - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - 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-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - 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} - - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - 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} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - - rollup@4.46.4: - resolution: {integrity: sha512-YbxoxvoqNg9zAmw4+vzh1FkGAiZRK+LhnSrbSrSXMdZYsRPDWoshcSd/pldKRO6lWzv/e9TiJAVQyirYIeSIPQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rsbuild-plugin-dts@0.12.2: - resolution: {integrity: sha512-qI7wwT7R6T5LzuwcBWt6dZYaS1Fv5Tg2D3OHbAX9MXYn2oJ3eJjdwXU2LcLALd1CpXUPaQCjOTHRMJzHT0++JQ==} - engines: {node: '>=18.12.0'} - peerDependencies: - '@microsoft/api-extractor': ^7 - '@rsbuild/core': 1.x - typescript: ^5 - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - typescript: - optional: true - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - 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'} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} - - 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'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - vite@7.1.3: - resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} - 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 - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - 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'} - - zip-a-folder@3.1.9: - resolution: {integrity: sha512-0TPP3eK5mbZxHnOE8w/Jg6gwxsxZOrA3hXHMfC3I4mcTvyJwNt7GZP8i6uiAMVNu43QTmVz0ngEMKcjgpLZLmQ==} - - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - -snapshots: - - '@ast-grep/napi-darwin-arm64@0.37.0': - optional: true - - '@ast-grep/napi-darwin-x64@0.37.0': - optional: true - - '@ast-grep/napi-linux-arm64-gnu@0.37.0': - optional: true - - '@ast-grep/napi-linux-arm64-musl@0.37.0': - optional: true - - '@ast-grep/napi-linux-x64-gnu@0.37.0': - optional: true - - '@ast-grep/napi-linux-x64-musl@0.37.0': - optional: true - - '@ast-grep/napi-win32-arm64-msvc@0.37.0': - optional: true - - '@ast-grep/napi-win32-ia32-msvc@0.37.0': - optional: true - - '@ast-grep/napi-win32-x64-msvc@0.37.0': - optional: true - - '@ast-grep/napi@0.37.0': - optionalDependencies: - '@ast-grep/napi-darwin-arm64': 0.37.0 - '@ast-grep/napi-darwin-x64': 0.37.0 - '@ast-grep/napi-linux-arm64-gnu': 0.37.0 - '@ast-grep/napi-linux-arm64-musl': 0.37.0 - '@ast-grep/napi-linux-x64-gnu': 0.37.0 - '@ast-grep/napi-linux-x64-musl': 0.37.0 - '@ast-grep/napi-win32-arm64-msvc': 0.37.0 - '@ast-grep/napi-win32-ia32-msvc': 0.37.0 - '@ast-grep/napi-win32-x64-msvc': 0.37.0 - - '@emnapi/core@1.4.5': - dependencies: - '@emnapi/wasi-threads': 1.0.4 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.5': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.0.4': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.9': - optional: true - - '@esbuild/android-arm64@0.25.9': - optional: true - - '@esbuild/android-arm@0.25.9': - optional: true - - '@esbuild/android-x64@0.25.9': - optional: true - - '@esbuild/darwin-arm64@0.25.9': - optional: true - - '@esbuild/darwin-x64@0.25.9': - optional: true - - '@esbuild/freebsd-arm64@0.25.9': - optional: true - - '@esbuild/freebsd-x64@0.25.9': - optional: true - - '@esbuild/linux-arm64@0.25.9': - optional: true - - '@esbuild/linux-arm@0.25.9': - optional: true - - '@esbuild/linux-ia32@0.25.9': - optional: true - - '@esbuild/linux-loong64@0.25.9': - optional: true - - '@esbuild/linux-mips64el@0.25.9': - optional: true - - '@esbuild/linux-ppc64@0.25.9': - optional: true - - '@esbuild/linux-riscv64@0.25.9': - optional: true - - '@esbuild/linux-s390x@0.25.9': - optional: true - - '@esbuild/linux-x64@0.25.9': - optional: true - - '@esbuild/netbsd-arm64@0.25.9': - optional: true - - '@esbuild/netbsd-x64@0.25.9': - optional: true - - '@esbuild/openbsd-arm64@0.25.9': - optional: true - - '@esbuild/openbsd-x64@0.25.9': - optional: true - - '@esbuild/openharmony-arm64@0.25.9': - optional: true - - '@esbuild/sunos-x64@0.25.9': - optional: true - - '@esbuild/win32-arm64@0.25.9': - optional: true - - '@esbuild/win32-ia32@0.25.9': - optional: true - - '@esbuild/win32-x64@0.25.9': - optional: true - - '@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.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@module-federation/error-codes@0.18.0': {} - - '@module-federation/runtime-core@0.18.0': - dependencies: - '@module-federation/error-codes': 0.18.0 - '@module-federation/sdk': 0.18.0 - - '@module-federation/runtime-tools@0.18.0': - dependencies: - '@module-federation/runtime': 0.18.0 - '@module-federation/webpack-bundler-runtime': 0.18.0 - - '@module-federation/runtime@0.18.0': - dependencies: - '@module-federation/error-codes': 0.18.0 - '@module-federation/runtime-core': 0.18.0 - '@module-federation/sdk': 0.18.0 - - '@module-federation/sdk@0.18.0': {} - - '@module-federation/webpack-bundler-runtime@0.18.0': - dependencies: - '@module-federation/runtime': 0.18.0 - '@module-federation/sdk': 0.18.0 - - '@napi-rs/wasm-runtime@1.0.3': - dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 - optional: true - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@rolldown/pluginutils@1.0.0-beta.32': {} - - '@rollup/rollup-android-arm-eabi@4.46.4': - optional: true - - '@rollup/rollup-android-arm64@4.46.4': - optional: true - - '@rollup/rollup-darwin-arm64@4.46.4': - optional: true - - '@rollup/rollup-darwin-x64@4.46.4': - optional: true - - '@rollup/rollup-freebsd-arm64@4.46.4': - optional: true - - '@rollup/rollup-freebsd-x64@4.46.4': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.46.4': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.46.4': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.46.4': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.46.4': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.46.4': - optional: true - - '@rollup/rollup-linux-x64-musl@4.46.4': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.46.4': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.46.4': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.46.4': - optional: true - - '@rsbuild/core@1.5.0-beta.4': - dependencies: - '@rspack/core': 1.5.0-beta.1(@swc/helpers@0.5.17) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 - core-js: 3.45.1 - jiti: 2.5.1 - - '@rslib/core@0.12.2': - dependencies: - '@rsbuild/core': 1.5.0-beta.4 - rsbuild-plugin-dts: 0.12.2(@rsbuild/core@1.5.0-beta.4) - tinyglobby: 0.2.14 - - '@rspack/binding-darwin-arm64@1.5.0-beta.1': - optional: true - - '@rspack/binding-darwin-x64@1.5.0-beta.1': - optional: true - - '@rspack/binding-linux-arm64-gnu@1.5.0-beta.1': - optional: true - - '@rspack/binding-linux-arm64-musl@1.5.0-beta.1': - optional: true - - '@rspack/binding-linux-x64-gnu@1.5.0-beta.1': - optional: true - - '@rspack/binding-linux-x64-musl@1.5.0-beta.1': - optional: true - - '@rspack/binding-wasm32-wasi@1.5.0-beta.1': - dependencies: - '@napi-rs/wasm-runtime': 1.0.3 - optional: true - - '@rspack/binding-win32-arm64-msvc@1.5.0-beta.1': - optional: true - - '@rspack/binding-win32-ia32-msvc@1.5.0-beta.1': - optional: true - - '@rspack/binding-win32-x64-msvc@1.5.0-beta.1': - optional: true - - '@rspack/binding@1.5.0-beta.1': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.5.0-beta.1 - '@rspack/binding-darwin-x64': 1.5.0-beta.1 - '@rspack/binding-linux-arm64-gnu': 1.5.0-beta.1 - '@rspack/binding-linux-arm64-musl': 1.5.0-beta.1 - '@rspack/binding-linux-x64-gnu': 1.5.0-beta.1 - '@rspack/binding-linux-x64-musl': 1.5.0-beta.1 - '@rspack/binding-wasm32-wasi': 1.5.0-beta.1 - '@rspack/binding-win32-arm64-msvc': 1.5.0-beta.1 - '@rspack/binding-win32-ia32-msvc': 1.5.0-beta.1 - '@rspack/binding-win32-x64-msvc': 1.5.0-beta.1 - - '@rspack/core@1.5.0-beta.1(@swc/helpers@0.5.17)': - dependencies: - '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.0-beta.1 - '@rspack/lite-tapable': 1.0.1 - optionalDependencies: - '@swc/helpers': 0.5.17 - - '@rspack/lite-tapable@1.0.1': {} - - '@swc/core-darwin-arm64@1.13.4': - optional: true - - '@swc/core-darwin-x64@1.13.4': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.13.4': - optional: true - - '@swc/core-linux-arm64-gnu@1.13.4': - optional: true - - '@swc/core-linux-arm64-musl@1.13.4': - optional: true - - '@swc/core-linux-x64-gnu@1.13.4': - optional: true - - '@swc/core-linux-x64-musl@1.13.4': - optional: true - - '@swc/core-win32-arm64-msvc@1.13.4': - optional: true - - '@swc/core-win32-ia32-msvc@1.13.4': - optional: true - - '@swc/core-win32-x64-msvc@1.13.4': - optional: true - - '@swc/core@1.13.4(@swc/helpers@0.5.17)': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.24 - optionalDependencies: - '@swc/core-darwin-arm64': 1.13.4 - '@swc/core-darwin-x64': 1.13.4 - '@swc/core-linux-arm-gnueabihf': 1.13.4 - '@swc/core-linux-arm64-gnu': 1.13.4 - '@swc/core-linux-arm64-musl': 1.13.4 - '@swc/core-linux-x64-gnu': 1.13.4 - '@swc/core-linux-x64-musl': 1.13.4 - '@swc/core-win32-arm64-msvc': 1.13.4 - '@swc/core-win32-ia32-msvc': 1.13.4 - '@swc/core-win32-x64-msvc': 1.13.4 - '@swc/helpers': 0.5.17 - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@swc/types@0.1.24': - dependencies: - '@swc/counter': 0.1.3 - - '@tybys/wasm-util@0.10.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/estree@1.0.8': {} - - '@types/node@22.17.2': - dependencies: - undici-types: 6.21.0 - - '@vitejs/plugin-react-swc@4.0.1(@swc/helpers@0.5.17)(vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1))': - dependencies: - '@rolldown/pluginutils': 1.0.0-beta.32 - '@swc/core': 1.13.4(@swc/helpers@0.5.17) - vite: 7.1.3(@types/node@22.17.2)(jiti@2.5.1) - transitivePeerDependencies: - - '@swc/helpers' - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - archiver-utils@5.0.2: - dependencies: - glob: 10.4.5 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.17.21 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.7.0 - readdir-glob: 1.1.3 - tar-stream: 3.1.7 - zip-stream: 6.0.1 - - async@3.2.6: {} - - b4a@1.6.7: {} - - balanced-match@1.0.2: {} - - bare-events@2.6.1: - optional: true - - base64-js@1.5.1: {} - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - buffer-crc32@1.0.0: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - chalk@5.6.0: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.0: {} - - compress-commons@6.0.2: - dependencies: - crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - core-js@3.45.1: {} - - core-util-is@1.0.3: {} - - crc-32@1.2.2: {} - - crc32-stream@6.0.0: - dependencies: - crc-32: 1.2.2 - readable-stream: 4.7.0 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - esbuild@0.25.9: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 - - event-target-shim@5.0.1: {} - - events@3.3.0: {} - - fast-fifo@1.3.2: {} - - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - fsevents@2.3.3: - optional: true - - 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 - - graceful-fs@4.2.11: {} - - ieee754@1.2.1: {} - - inherits@2.0.4: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-stream@2.0.1: {} - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - 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 - - jiti@2.5.1: {} - - json5@2.2.3: {} - - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - - lodash@4.17.21: {} - - lru-cache@10.4.3: {} - - lru-cache@11.1.0: {} - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - minimatch@10.0.3: - dependencies: - '@isaacs/brace-expansion': 5.0.0 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - nanoid@3.3.11: {} - - normalize-path@3.0.0: {} - - package-json-from-dist@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.1.0 - minipass: 7.1.2 - - picocolors@1.1.1: {} - - picomatch@4.0.3: {} - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.6 - - rollup@4.46.4: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.4 - '@rollup/rollup-android-arm64': 4.46.4 - '@rollup/rollup-darwin-arm64': 4.46.4 - '@rollup/rollup-darwin-x64': 4.46.4 - '@rollup/rollup-freebsd-arm64': 4.46.4 - '@rollup/rollup-freebsd-x64': 4.46.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.4 - '@rollup/rollup-linux-arm-musleabihf': 4.46.4 - '@rollup/rollup-linux-arm64-gnu': 4.46.4 - '@rollup/rollup-linux-arm64-musl': 4.46.4 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.4 - '@rollup/rollup-linux-ppc64-gnu': 4.46.4 - '@rollup/rollup-linux-riscv64-gnu': 4.46.4 - '@rollup/rollup-linux-riscv64-musl': 4.46.4 - '@rollup/rollup-linux-s390x-gnu': 4.46.4 - '@rollup/rollup-linux-x64-gnu': 4.46.4 - '@rollup/rollup-linux-x64-musl': 4.46.4 - '@rollup/rollup-win32-arm64-msvc': 4.46.4 - '@rollup/rollup-win32-ia32-msvc': 4.46.4 - '@rollup/rollup-win32-x64-msvc': 4.46.4 - fsevents: 2.3.3 - - rsbuild-plugin-dts@0.12.2(@rsbuild/core@1.5.0-beta.4): - dependencies: - '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 1.5.0-beta.4 - magic-string: 0.30.17 - picocolors: 1.1.1 - tinyglobby: 0.2.14 - tsconfig-paths: 4.2.0 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - signal-exit@4.1.0: {} - - source-map-js@1.2.1: {} - - streamx@2.22.1: - dependencies: - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.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.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.2.0 - - strip-bom@3.0.0: {} - - tar-stream@3.1.7: - dependencies: - b4a: 1.6.7 - fast-fifo: 1.3.2 - streamx: 2.22.1 - - text-decoder@1.2.3: - dependencies: - b4a: 1.6.7 - - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.8.1: {} - - type-fest@4.41.0: {} - - undici-types@6.21.0: {} - - util-deprecate@1.0.2: {} - - vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1): - dependencies: - esbuild: 0.25.9 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.46.4 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.17.2 - fsevents: 2.3.3 - jiti: 2.5.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - 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.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - zip-a-folder@3.1.9: - dependencies: - archiver: 7.0.1 - glob: 11.0.3 - is-glob: 4.0.3 - - zip-stream@6.0.1: - dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 - readable-stream: 4.7.0 +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vitejs/plugin-react-swc': + specifier: 4.0.1 + version: 4.0.1(@swc/helpers@0.5.17)(vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1)) + chalk: + specifier: 5.6.0 + version: 5.6.0 + commander: + specifier: 14.0.0 + version: 14.0.0 + fast-xml-parser: + specifier: 5.2.5 + version: 5.2.5 + mendix: + specifier: 10.24.77222 + version: 10.24.77222 + vite: + specifier: 7.1.3 + version: 7.1.3(@types/node@22.17.2)(jiti@2.5.1) + zip-a-folder: + specifier: 3.1.9 + version: 3.1.9 + devDependencies: + '@rslib/core': + specifier: 0.12.2 + version: 0.12.2(typescript@5.9.2) + '@types/node': + specifier: 22.17.2 + version: 22.17.2 + esbuild: + specifier: 0.25.9 + version: 0.25.9 + type-fest: + specifier: 4.41.0 + version: 4.41.0 + typescript: + specifier: 5.9.2 + version: 5.9.2 + +packages: + + '@ast-grep/napi-darwin-arm64@0.37.0': + resolution: {integrity: sha512-QAiIiaAbLvMEg/yBbyKn+p1gX2/FuaC0SMf7D7capm/oG4xGMzdeaQIcSosF4TCxxV+hIH4Bz9e4/u7w6Bnk3Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@ast-grep/napi-darwin-x64@0.37.0': + resolution: {integrity: sha512-zvcvdgekd4ySV3zUbUp8HF5nk5zqwiMXTuVzTUdl/w08O7JjM6XPOIVT+d2o/MqwM9rsXdzdergY5oY2RdhSPA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@ast-grep/napi-linux-arm64-gnu@0.37.0': + resolution: {integrity: sha512-L7Sj0lXy8X+BqSMgr1LB8cCoWk0rericdeu+dC8/c8zpsav5Oo2IQKY1PmiZ7H8IHoFBbURLf8iklY9wsD+cyA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ast-grep/napi-linux-arm64-musl@0.37.0': + resolution: {integrity: sha512-LF9sAvYy6es/OdyJDO3RwkX3I82Vkfsng1sqUBcoWC1jVb1wX5YVzHtpQox9JrEhGl+bNp7FYxB4Qba9OdA5GA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ast-grep/napi-linux-x64-gnu@0.37.0': + resolution: {integrity: sha512-TViz5/klqre6aSmJzswEIjApnGjJzstG/SE8VDWsrftMBMYt2PTu3MeluZVwzSqDao8doT/P+6U11dU05UOgxw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ast-grep/napi-linux-x64-musl@0.37.0': + resolution: {integrity: sha512-/BcCH33S9E3ovOAEoxYngUNXgb+JLg991sdyiNP2bSoYd30a9RHrG7CYwW6fMgua3ijQ474eV6cq9yZO1bCpXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ast-grep/napi-win32-arm64-msvc@0.37.0': + resolution: {integrity: sha512-TjQA4cFoIEW2bgjLkaL9yqT4XWuuLa5MCNd0VCDhGRDMNQ9+rhwi9eLOWRaap3xzT7g+nlbcEHL3AkVCD2+b3A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@ast-grep/napi-win32-ia32-msvc@0.37.0': + resolution: {integrity: sha512-uNmVka8fJCdYsyOlF9aZqQMLTatEYBynjChVTzUfFMDfmZ0bihs/YTqJVbkSm8TZM7CUX82apvn50z/dX5iWRA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@ast-grep/napi-win32-x64-msvc@0.37.0': + resolution: {integrity: sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@ast-grep/napi@0.37.0': + resolution: {integrity: sha512-Hb4o6h1Pf6yRUAX07DR4JVY7dmQw+RVQMW5/m55GoiAT/VRoKCWBtIUPPOnqDVhbx1Cjfil9b6EDrgJsUAujEQ==} + engines: {node: '>= 10'} + + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@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'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@module-federation/error-codes@0.18.0': + resolution: {integrity: sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==} + + '@module-federation/runtime-core@0.18.0': + resolution: {integrity: sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==} + + '@module-federation/runtime-tools@0.18.0': + resolution: {integrity: sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==} + + '@module-federation/runtime@0.18.0': + resolution: {integrity: sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==} + + '@module-federation/sdk@0.18.0': + resolution: {integrity: sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==} + + '@module-federation/webpack-bundler-runtime@0.18.0': + resolution: {integrity: sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==} + + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rolldown/pluginutils@1.0.0-beta.32': + resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + + '@rollup/rollup-android-arm-eabi@4.46.4': + resolution: {integrity: sha512-B2wfzCJ+ps/OBzRjeds7DlJumCU3rXMxJJS1vzURyj7+KBHGONm7c9q1TfdBl4vCuNMkDvARn3PBl2wZzuR5mw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.46.4': + resolution: {integrity: sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.46.4': + resolution: {integrity: sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.46.4': + resolution: {integrity: sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.46.4': + resolution: {integrity: sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.46.4': + resolution: {integrity: sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': + resolution: {integrity: sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.46.4': + resolution: {integrity: sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.46.4': + resolution: {integrity: sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.46.4': + resolution: {integrity: sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': + resolution: {integrity: sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.46.4': + resolution: {integrity: sha512-YMdz2phOTFF+Z66dQfGf0gmeDSi5DJzY5bpZyeg9CPBkV9QDzJ1yFRlmi/j7WWRf3hYIWrOaJj5jsfwgc8GTHQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.46.4': + resolution: {integrity: sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.46.4': + resolution: {integrity: sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.4': + resolution: {integrity: sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.46.4': + resolution: {integrity: sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.46.4': + resolution: {integrity: sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.46.4': + resolution: {integrity: sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.46.4': + resolution: {integrity: sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.46.4': + resolution: {integrity: sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==} + cpu: [x64] + os: [win32] + + '@rsbuild/core@1.5.0-beta.4': + resolution: {integrity: sha512-h1jqpjZunalsdxTcJCbY8DovLu6F4MQgsYdZyxDjUp0xuggQayi1tpcE6MhLs3WWa077g+LZ2Am4gKt/pl/W9Q==} + engines: {node: '>=18.12.0'} + hasBin: true + + '@rslib/core@0.12.2': + resolution: {integrity: sha512-5DPVxmzzyoQlLqSt8Y/8kbYNtbJ0AEVUXd1hDFQ0Iq5Eb5XA4363PDeLdfeKJ1h93YqT7M9WZ3Cyhvosx1EimQ==} + engines: {node: '>=18.12.0'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7 + typescript: ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + typescript: + optional: true + + '@rspack/binding-darwin-arm64@1.5.0-beta.1': + resolution: {integrity: sha512-aXSbz9Bo480xNDK6v64SZ19I/bmMuxaOuex6V9q0S+v3qx/ZsUWL+5aUd71scq7EfAb3KkvQFsYACpt5PMZ9DQ==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.5.0-beta.1': + resolution: {integrity: sha512-addeCT0bXtfOfvJZdVuHWBl20Cd8RmweOX03OiEH4AmQc9EgUEP/oCGpOmakBXxUCl3x/RnlrXx2nD1uDyuyLA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.5.0-beta.1': + resolution: {integrity: sha512-fYgOfSsA0J0rUA40ZEexrMRKyIVAUo4m0KShTm6yVaAzQHWVZ0xjjcoLFNxCVE7EvAPI7wl9fDOyr7Y8EylVfQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.5.0-beta.1': + resolution: {integrity: sha512-wWlOzsoJU2HJyPxoCDScW4zt3+5WO6NI8B7jSmhVA9dfmvCYUKktt/YZpskcgMsvCgtzXTE62wDc+VTQ5ucp9A==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.5.0-beta.1': + resolution: {integrity: sha512-OlgQIQLDLDDXvbUYBEfZmofO3uTDi0rGfIr58PXz/wTF87KdwqlU0HyjIeaeDUaQlV+lNXNysuCwvI0hl/o2tw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.5.0-beta.1': + resolution: {integrity: sha512-LkQSyfyf5Jy0UGD0tvm2Gz+0VjboawtRrYd+qYHE0Pm4h7tTJWyqnh02LRTROxOl3GrssC1VGn6J8XYTxOAWug==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.5.0-beta.1': + resolution: {integrity: sha512-ysnuVnqC9byoYfoAi/TsV0U5ZUxU0snnVPa/SvQEO6ew3J2GaNDq1vS1zWo0SOA4eLmwkop0/UcH8n3VXOy7NA==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.5.0-beta.1': + resolution: {integrity: sha512-vcMXybMchQomBODyi6aIMCur8/oQktw+iVv0dH3hiiWy0v2g8xS9VLMjWXfGZAhonhRe7YWTP12dxCPbWmQyZw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.5.0-beta.1': + resolution: {integrity: sha512-fCj904xjc5iKOdUS0VLUE/LbAQZWlub/TF0ZKhzq2UK8WWwrfhA5U8ZHximU0A0LVDoMVZCM5M12rO12P0uHKw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.5.0-beta.1': + resolution: {integrity: sha512-iWCoFMwP2aUea1mIp2+mTE7IKj6wp9hxMuZgOcEGWQidE7pUss5/Zp3wrOSWnnyovIeQLmK9wsQEA/W3i3MiAQ==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.5.0-beta.1': + resolution: {integrity: sha512-qZ+cxvsNvXBOPX0NEP+KfxQlJI7TDZR2XLS8Jl+zHl2kgulEOBWsBa7Q1Dcw73YQgz2owxP3OWl3f8LWXnnC1Q==} + + '@rspack/core@1.5.0-beta.1': + resolution: {integrity: sha512-o3yQreNKldm0k96wPMpXBI9p0B03LpeK3XyV4vhk24RfLIa2p6C2LPF4xn6U2M28CFQkSbeu1vwlMHnfW4xHNg==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@swc/core-darwin-arm64@1.13.4': + resolution: {integrity: sha512-CGbTu9dGBwgklUj+NAQAYyPjBuoHaNRWK4QXJRv1QNIkhtE27aY7QA9uEON14SODxsio3t8+Pjjl2Mzx1Pxf+g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.13.4': + resolution: {integrity: sha512-qLFwYmLrqHNCf+JO9YLJT6IP/f9LfbXILTaqyfluFLW1GCfJyvUrSt3CWaL2lwwyT1EbBh6BVaAAecXiJIo3vg==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.13.4': + resolution: {integrity: sha512-y7SeNIA9em3+smNMpr781idKuNwJNAqewiotv+pIR5FpXdXXNjHWW+jORbqQYd61k6YirA5WQv+Af4UzqEX17g==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.13.4': + resolution: {integrity: sha512-u0c51VdzRmXaphLgghY9+B2Frzler6nIv+J788nqIh6I0ah3MmMW8LTJKZfdaJa3oFxzGNKXsJiaU2OFexNkug==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.13.4': + resolution: {integrity: sha512-Z92GJ98x8yQHn4I/NPqwAQyHNkkMslrccNVgFcnY1msrb6iGSw5uFg2H2YpvQ5u2/Yt6CRpLIUVVh8SGg1+gFA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.13.4': + resolution: {integrity: sha512-rSUcxgpFF0L8Fk1CbUf946XCX1CRp6eaHfKqplqFNWCHv8HyqAtSFvgCHhT+bXru6Ca/p3sLC775SUeSWhsJ9w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.13.4': + resolution: {integrity: sha512-qY77eFUvmdXNSmTW+I1fsz4enDuB0I2fE7gy6l9O4koSfjcCxkXw2X8x0lmKLm3FRiINS1XvZSg2G+q4NNQCRQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.13.4': + resolution: {integrity: sha512-xjPeDrOf6elCokxuyxwoskM00JJFQMTT2hTQZE24okjG3JiXzSFV+TmzYSp+LWNxPpnufnUUy/9Ee8+AcpslGw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.13.4': + resolution: {integrity: sha512-Ta+Bblc9tE9X9vQlpa3r3+mVnHYdKn09QsZ6qQHvuXGKWSS99DiyxKTYX2vxwMuoTObR0BHvnhNbaGZSV1VwNA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.13.4': + resolution: {integrity: sha512-pHnb4QwGiuWs4Z9ePSgJ48HP3NZIno6l75SB8YLCiPVDiLhvCLKEjz/caPRsFsmet9BEP8e3bAf2MV8MXgaTSg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.13.4': + resolution: {integrity: sha512-bCq2GCuKV16DSOOEdaRqHMm1Ok4YEoLoNdgdzp8BS/Hxxr/0NVCHBUgRLLRy/TlJGv20Idx+djd5FIDvsnqMaw==} + 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.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@swc/types@0.1.24': + resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} + + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + + '@types/big.js@6.2.2': + resolution: {integrity: sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@22.17.2': + resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react@18.0.38': + resolution: {integrity: sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==} + + '@types/scheduler@0.26.0': + resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} + + '@vitejs/plugin-react-swc@4.0.1': + resolution: {integrity: sha512-NQhPjysi5duItyrMd5JWZFf2vNOuSMyw+EoZyTBDzk+DkfYD8WNrsUs09sELV2cr1P15nufsN25hsUBt4CKF9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4 || ^5 || ^6 || ^7 + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.6.1: + resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + 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'} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + core-js@3.45.1: + resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + engines: {node: '>=18'} + hasBin: true + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + 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 + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + 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-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + 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} + + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + mendix@10.24.77222: + resolution: {integrity: sha512-sxDa9DrGFJY65bE1XbREozEUWmYKZUc+cmATxq61mK8qMGININaN0+qCat/2Qb6iIMlcid8JUxUL7szDgRonYQ==} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + 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} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + rollup@4.46.4: + resolution: {integrity: sha512-YbxoxvoqNg9zAmw4+vzh1FkGAiZRK+LhnSrbSrSXMdZYsRPDWoshcSd/pldKRO6lWzv/e9TiJAVQyirYIeSIPQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rsbuild-plugin-dts@0.12.2: + resolution: {integrity: sha512-qI7wwT7R6T5LzuwcBWt6dZYaS1Fv5Tg2D3OHbAX9MXYn2oJ3eJjdwXU2LcLALd1CpXUPaQCjOTHRMJzHT0++JQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@microsoft/api-extractor': ^7 + '@rsbuild/core': 1.x + typescript: ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + typescript: + optional: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + + 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'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@7.1.3: + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} + 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 + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + 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'} + + zip-a-folder@3.1.9: + resolution: {integrity: sha512-0TPP3eK5mbZxHnOE8w/Jg6gwxsxZOrA3hXHMfC3I4mcTvyJwNt7GZP8i6uiAMVNu43QTmVz0ngEMKcjgpLZLmQ==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@ast-grep/napi-darwin-arm64@0.37.0': + optional: true + + '@ast-grep/napi-darwin-x64@0.37.0': + optional: true + + '@ast-grep/napi-linux-arm64-gnu@0.37.0': + optional: true + + '@ast-grep/napi-linux-arm64-musl@0.37.0': + optional: true + + '@ast-grep/napi-linux-x64-gnu@0.37.0': + optional: true + + '@ast-grep/napi-linux-x64-musl@0.37.0': + optional: true + + '@ast-grep/napi-win32-arm64-msvc@0.37.0': + optional: true + + '@ast-grep/napi-win32-ia32-msvc@0.37.0': + optional: true + + '@ast-grep/napi-win32-x64-msvc@0.37.0': + optional: true + + '@ast-grep/napi@0.37.0': + optionalDependencies: + '@ast-grep/napi-darwin-arm64': 0.37.0 + '@ast-grep/napi-darwin-x64': 0.37.0 + '@ast-grep/napi-linux-arm64-gnu': 0.37.0 + '@ast-grep/napi-linux-arm64-musl': 0.37.0 + '@ast-grep/napi-linux-x64-gnu': 0.37.0 + '@ast-grep/napi-linux-x64-musl': 0.37.0 + '@ast-grep/napi-win32-arm64-msvc': 0.37.0 + '@ast-grep/napi-win32-ia32-msvc': 0.37.0 + '@ast-grep/napi-win32-x64-msvc': 0.37.0 + + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.25.9': + optional: true + + '@esbuild/android-x64@0.25.9': + optional: true + + '@esbuild/darwin-arm64@0.25.9': + optional: true + + '@esbuild/darwin-x64@0.25.9': + optional: true + + '@esbuild/freebsd-arm64@0.25.9': + optional: true + + '@esbuild/freebsd-x64@0.25.9': + optional: true + + '@esbuild/linux-arm64@0.25.9': + optional: true + + '@esbuild/linux-arm@0.25.9': + optional: true + + '@esbuild/linux-ia32@0.25.9': + optional: true + + '@esbuild/linux-loong64@0.25.9': + optional: true + + '@esbuild/linux-mips64el@0.25.9': + optional: true + + '@esbuild/linux-ppc64@0.25.9': + optional: true + + '@esbuild/linux-riscv64@0.25.9': + optional: true + + '@esbuild/linux-s390x@0.25.9': + optional: true + + '@esbuild/linux-x64@0.25.9': + optional: true + + '@esbuild/netbsd-arm64@0.25.9': + optional: true + + '@esbuild/netbsd-x64@0.25.9': + optional: true + + '@esbuild/openbsd-arm64@0.25.9': + optional: true + + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': + optional: true + + '@esbuild/sunos-x64@0.25.9': + optional: true + + '@esbuild/win32-arm64@0.25.9': + optional: true + + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.25.9': + optional: true + + '@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.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@module-federation/error-codes@0.18.0': {} + + '@module-federation/runtime-core@0.18.0': + dependencies: + '@module-federation/error-codes': 0.18.0 + '@module-federation/sdk': 0.18.0 + + '@module-federation/runtime-tools@0.18.0': + dependencies: + '@module-federation/runtime': 0.18.0 + '@module-federation/webpack-bundler-runtime': 0.18.0 + + '@module-federation/runtime@0.18.0': + dependencies: + '@module-federation/error-codes': 0.18.0 + '@module-federation/runtime-core': 0.18.0 + '@module-federation/sdk': 0.18.0 + + '@module-federation/sdk@0.18.0': {} + + '@module-federation/webpack-bundler-runtime@0.18.0': + dependencies: + '@module-federation/runtime': 0.18.0 + '@module-federation/sdk': 0.18.0 + + '@napi-rs/wasm-runtime@1.0.3': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.32': {} + + '@rollup/rollup-android-arm-eabi@4.46.4': + optional: true + + '@rollup/rollup-android-arm64@4.46.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.46.4': + optional: true + + '@rollup/rollup-darwin-x64@4.46.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.46.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.46.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.46.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.46.4': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.46.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.46.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.46.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.46.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.46.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.46.4': + optional: true + + '@rsbuild/core@1.5.0-beta.4': + dependencies: + '@rspack/core': 1.5.0-beta.1(@swc/helpers@0.5.17) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.17 + core-js: 3.45.1 + jiti: 2.5.1 + + '@rslib/core@0.12.2(typescript@5.9.2)': + dependencies: + '@rsbuild/core': 1.5.0-beta.4 + rsbuild-plugin-dts: 0.12.2(@rsbuild/core@1.5.0-beta.4)(typescript@5.9.2) + tinyglobby: 0.2.14 + optionalDependencies: + typescript: 5.9.2 + + '@rspack/binding-darwin-arm64@1.5.0-beta.1': + optional: true + + '@rspack/binding-darwin-x64@1.5.0-beta.1': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.5.0-beta.1': + optional: true + + '@rspack/binding-linux-arm64-musl@1.5.0-beta.1': + optional: true + + '@rspack/binding-linux-x64-gnu@1.5.0-beta.1': + optional: true + + '@rspack/binding-linux-x64-musl@1.5.0-beta.1': + optional: true + + '@rspack/binding-wasm32-wasi@1.5.0-beta.1': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.5.0-beta.1': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.5.0-beta.1': + optional: true + + '@rspack/binding-win32-x64-msvc@1.5.0-beta.1': + optional: true + + '@rspack/binding@1.5.0-beta.1': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.5.0-beta.1 + '@rspack/binding-darwin-x64': 1.5.0-beta.1 + '@rspack/binding-linux-arm64-gnu': 1.5.0-beta.1 + '@rspack/binding-linux-arm64-musl': 1.5.0-beta.1 + '@rspack/binding-linux-x64-gnu': 1.5.0-beta.1 + '@rspack/binding-linux-x64-musl': 1.5.0-beta.1 + '@rspack/binding-wasm32-wasi': 1.5.0-beta.1 + '@rspack/binding-win32-arm64-msvc': 1.5.0-beta.1 + '@rspack/binding-win32-ia32-msvc': 1.5.0-beta.1 + '@rspack/binding-win32-x64-msvc': 1.5.0-beta.1 + + '@rspack/core@1.5.0-beta.1(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.18.0 + '@rspack/binding': 1.5.0-beta.1 + '@rspack/lite-tapable': 1.0.1 + optionalDependencies: + '@swc/helpers': 0.5.17 + + '@rspack/lite-tapable@1.0.1': {} + + '@swc/core-darwin-arm64@1.13.4': + optional: true + + '@swc/core-darwin-x64@1.13.4': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.13.4': + optional: true + + '@swc/core-linux-arm64-gnu@1.13.4': + optional: true + + '@swc/core-linux-arm64-musl@1.13.4': + optional: true + + '@swc/core-linux-x64-gnu@1.13.4': + optional: true + + '@swc/core-linux-x64-musl@1.13.4': + optional: true + + '@swc/core-win32-arm64-msvc@1.13.4': + optional: true + + '@swc/core-win32-ia32-msvc@1.13.4': + optional: true + + '@swc/core-win32-x64-msvc@1.13.4': + optional: true + + '@swc/core@1.13.4(@swc/helpers@0.5.17)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.24 + optionalDependencies: + '@swc/core-darwin-arm64': 1.13.4 + '@swc/core-darwin-x64': 1.13.4 + '@swc/core-linux-arm-gnueabihf': 1.13.4 + '@swc/core-linux-arm64-gnu': 1.13.4 + '@swc/core-linux-arm64-musl': 1.13.4 + '@swc/core-linux-x64-gnu': 1.13.4 + '@swc/core-linux-x64-musl': 1.13.4 + '@swc/core-win32-arm64-msvc': 1.13.4 + '@swc/core-win32-ia32-msvc': 1.13.4 + '@swc/core-win32-x64-msvc': 1.13.4 + '@swc/helpers': 0.5.17 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.24': + dependencies: + '@swc/counter': 0.1.3 + + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/big.js@6.2.2': {} + + '@types/estree@1.0.8': {} + + '@types/node@22.17.2': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react@18.0.38': + dependencies: + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.26.0 + csstype: 3.1.3 + + '@types/scheduler@0.26.0': {} + + '@vitejs/plugin-react-swc@4.0.1(@swc/helpers@0.5.17)(vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.32 + '@swc/core': 1.13.4(@swc/helpers@0.5.17) + vite: 7.1.3(@types/node@22.17.2)(jiti@2.5.1) + transitivePeerDependencies: + - '@swc/helpers' + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + async@3.2.6: {} + + b4a@1.6.7: {} + + balanced-match@1.0.2: {} + + bare-events@2.6.1: + optional: true + + base64-js@1.5.1: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + buffer-crc32@1.0.0: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + chalk@5.6.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@14.0.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + core-js@3.45.1: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.25.9: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + fast-fifo@1.3.2: {} + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + 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 + + graceful-fs@4.2.11: {} + + ieee754@1.2.1: {} + + inherits@2.0.4: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-stream@2.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + 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 + + jiti@2.5.1: {} + + json5@2.2.3: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lru-cache@11.1.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mendix@10.24.77222: + dependencies: + '@types/big.js': 6.2.2 + '@types/react': 18.0.38 + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + nanoid@3.3.11: {} + + normalize-path@3.0.0: {} + + package-json-from-dist@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.1.0 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + rollup@4.46.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.4 + '@rollup/rollup-android-arm64': 4.46.4 + '@rollup/rollup-darwin-arm64': 4.46.4 + '@rollup/rollup-darwin-x64': 4.46.4 + '@rollup/rollup-freebsd-arm64': 4.46.4 + '@rollup/rollup-freebsd-x64': 4.46.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.4 + '@rollup/rollup-linux-arm-musleabihf': 4.46.4 + '@rollup/rollup-linux-arm64-gnu': 4.46.4 + '@rollup/rollup-linux-arm64-musl': 4.46.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.4 + '@rollup/rollup-linux-ppc64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-musl': 4.46.4 + '@rollup/rollup-linux-s390x-gnu': 4.46.4 + '@rollup/rollup-linux-x64-gnu': 4.46.4 + '@rollup/rollup-linux-x64-musl': 4.46.4 + '@rollup/rollup-win32-arm64-msvc': 4.46.4 + '@rollup/rollup-win32-ia32-msvc': 4.46.4 + '@rollup/rollup-win32-x64-msvc': 4.46.4 + fsevents: 2.3.3 + + rsbuild-plugin-dts@0.12.2(@rsbuild/core@1.5.0-beta.4)(typescript@5.9.2): + dependencies: + '@ast-grep/napi': 0.37.0 + '@rsbuild/core': 1.5.0-beta.4 + magic-string: 0.30.17 + picocolors: 1.1.1 + tinyglobby: 0.2.14 + tsconfig-paths: 4.2.0 + optionalDependencies: + typescript: 5.9.2 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.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.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + + strip-bom@3.0.0: {} + + strnum@2.1.1: {} + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typescript@5.9.2: {} + + undici-types@6.21.0: {} + + util-deprecate@1.0.2: {} + + vite@7.1.3(@types/node@22.17.2)(jiti@2.5.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.4 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.17.2 + fsevents: 2.3.3 + jiti: 2.5.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + 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.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + zip-a-folder@3.1.9: + dependencies: + archiver: 7.0.1 + glob: 11.0.3 + is-glob: 4.0.3 + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 diff --git a/rslib.config.ts b/rslib.config.ts index f51f381..70632f4 100644 --- a/rslib.config.ts +++ b/rslib.config.ts @@ -4,14 +4,50 @@ export default defineConfig({ lib: [ { format: 'cjs', - bundle: true + bundle: true, + dts: true, + source: { + entry: { + cli: 'src/cli.ts' + } + }, + output: { + filename: { + js: '[name].js' + } + } + }, + { + format: 'esm', + bundle: true, + dts: true, + source: { + entry: { + index: 'src/index.ts' + } + }, + output: { + filename: { + js: '[name].mjs' + } + } + }, + { + format: 'cjs', + bundle: true, + dts: false, + source: { + entry: { + index: 'src/index.ts' + } + }, + output: { + filename: { + js: '[name].cjs' + } + } } ], - source: { - entry: { - index: 'src/cli.ts' - } - }, output: { minify: { js: true, diff --git a/src/commands/build/web/index.ts b/src/commands/build/web/index.ts index 7c13170..c880620 100644 --- a/src/commands/build/web/index.ts +++ b/src/commands/build/web/index.ts @@ -3,7 +3,7 @@ import path from 'path'; import { InlineConfig, UserConfig, build as viteBuild } from 'vite'; import { zip } from 'zip-a-folder'; -import { COLOR_ERROR, COLOR_GREEN, DIST_DIRECTORY_NAME, PROJECT_DIRECTORY, WEB_OUTPUT_DIRECTORY } from '../../../constants'; +import { COLOR_ERROR, COLOR_GREEN, DIST_DIRECTORY_NAME, PROJECT_DIRECTORY, VITE_CONFIGURATION_FILENAME, WEB_OUTPUT_DIRECTORY } from '../../../constants'; import pathIsExists from '../../../utils/pathIsExists'; import getWidgetVersion from '../../../utils/getWidgetVersion'; import showMessage from '../../../utils/showMessage'; @@ -11,9 +11,29 @@ import { getEditorConfigDefaultConfig, getEditorPreviewDefaultConfig, getViteDef import getWidgetName from '../../../utils/getWidgetName'; import getWidgetPackageJson from '../../../utils/getWidgetPackageJson'; import getMendixWidgetDirectory from '../../../utils/getMendixWidgetDirectory'; +import getViteUserConfiguration from '../../../utils/getViteUserConfiguration'; +import { generateTypesFromFile } from '../../../type-generator'; const buildWebCommand = async (isProduction: boolean = false) => { try { + showMessage('Generate types'); + + const widgetName = await getWidgetName(); + const originWidgetXmlPath = path.join(PROJECT_DIRECTORY, `src/${widgetName}.xml`); + const typingsPath = path.join(PROJECT_DIRECTORY, 'typings'); + const typingsDirExists = await pathIsExists(typingsPath); + + if (typingsDirExists) { + await fs.rm(typingsPath, { recursive: true, force: true }); + } + + await fs.mkdir(typingsPath); + + const newTypingsFilePath = path.join(typingsPath, `${widgetName}Props.d.ts`); + const typingContents = await generateTypesFromFile(originWidgetXmlPath, 'web'); + + await fs.writeFile(newTypingsFilePath, typingContents); + showMessage('Remove previous builds'); const distDir = path.join(PROJECT_DIRECTORY, DIST_DIRECTORY_NAME); @@ -33,22 +53,20 @@ const buildWebCommand = async (isProduction: boolean = false) => { await fs.mkdir(outputDir); await fs.mkdir(WEB_OUTPUT_DIRECTORY, { recursive: true }); - const customViteConfigPath = path.join(PROJECT_DIRECTORY, 'vite.config.ts'); + const customViteConfigPath = path.join(PROJECT_DIRECTORY, VITE_CONFIGURATION_FILENAME); const viteConfigIsExists = await pathIsExists(customViteConfigPath); let resultViteConfig: UserConfig; if (viteConfigIsExists) { - const userConfig: UserConfig = await import(customViteConfigPath); + const userConfig = await getViteUserConfiguration(customViteConfigPath); - resultViteConfig = await getViteDefaultConfig(isProduction, userConfig); + resultViteConfig = await getViteDefaultConfig(false, userConfig); } else { - resultViteConfig = await getViteDefaultConfig(isProduction); + resultViteConfig = await getViteDefaultConfig(false); } - const widgetName = await getWidgetName(); const originPackageXmlPath = path.join(PROJECT_DIRECTORY, 'src/package.xml'); const destPackageXmlPath = path.join(WEB_OUTPUT_DIRECTORY, 'package.xml'); - const originWidgetXmlPath = path.join(PROJECT_DIRECTORY, `src/${widgetName}.xml`); const destWidgetXmlPath = path.join(WEB_OUTPUT_DIRECTORY, `${widgetName}.xml`); await fs.copyFile(originPackageXmlPath, destPackageXmlPath); @@ -94,7 +112,7 @@ const buildWebCommand = async (isProduction: boolean = false) => { showMessage(`${COLOR_GREEN('Build complete.')}`); } catch (error) { - showMessage(`${COLOR_ERROR('Build failed.')}\nError occurred: ${COLOR_ERROR((error as Error).message)}`); + showMessage(`${COLOR_ERROR('Build failed.')}\nError occurred: ${COLOR_ERROR((error as Error).stack)}`); } }; diff --git a/src/commands/start/web/index.ts b/src/commands/start/web/index.ts index 3e3d02f..54b6fa4 100644 --- a/src/commands/start/web/index.ts +++ b/src/commands/start/web/index.ts @@ -1,48 +1,126 @@ import fs from 'fs/promises'; import path from 'path'; -import { UserConfig, build as viteBuild } from 'vite'; +import { UserConfig, createServer } from 'vite'; +import { PluginOption } from 'vite'; -import { COLOR_ERROR, PROJECT_DIRECTORY } from "../../../constants"; +import { CLI_DIRECTORY, COLOR_ERROR, COLOR_GREEN, PROJECT_DIRECTORY, VITE_CONFIGURATION_FILENAME } from "../../../constants"; import showMessage from "../../../utils/showMessage"; import getViteWatchOutputDirectory from "../../../utils/getViteWatchOutputDirectory"; import pathIsExists from "../../../utils/pathIsExists"; import { getViteDefaultConfig } from '../../../configurations/vite'; +import getWidgetName from '../../../utils/getWidgetName'; +import getViteUserConfiguration from '../../../utils/getViteUserConfiguration'; +import { generateTypesFromFile } from '../../../type-generator'; +import { mendixHotreloadReactPlugin } from '../../../configurations/vite/plugins/mendix-hotreload-react-plugin'; +import { mendixHotreloadReactEsbuildPlugin } from '../../../configurations/vite/plugins/mendix-hotreload-react-esbuild-plugin'; +import { mendixPatchViteClientPlugin } from '../../../configurations/vite/plugins/mendix-patch-vite-client-plugin'; -const startWebCommand = async () => { - try { - showMessage('Ready for watch'); +const generateTyping = async () => { + const widgetName = await getWidgetName(); + const originWidgetXmlPath = path.join(PROJECT_DIRECTORY, `src/${widgetName}.xml`); + const typingsPath = path.join(PROJECT_DIRECTORY, 'typings'); + const typingsDirExists = await pathIsExists(typingsPath); - const distDir = await getViteWatchOutputDirectory(); - const distIsExists = await pathIsExists(distDir); + if (typingsDirExists) { + await fs.rm(typingsPath, { recursive: true, force: true }); + } - if (distIsExists) { - await fs.rm(distDir, { recursive: true, force: true }); - } + await fs.mkdir(typingsPath); - await fs.mkdir(distDir, { recursive: true }); + const newTypingsFilePath = path.join(typingsPath, `${widgetName}Props.d.ts`); + const typingContents = await generateTypesFromFile(originWidgetXmlPath, 'web'); + + await fs.writeFile(newTypingsFilePath, typingContents); +}; + +const startWebCommand = async () => { + try { + showMessage('Start widget server'); + + await generateTyping(); - const customViteConfigPath = path.join(PROJECT_DIRECTORY, 'vite.config.ts'); + const customViteConfigPath = path.join(PROJECT_DIRECTORY, VITE_CONFIGURATION_FILENAME); const viteConfigIsExists = await pathIsExists(customViteConfigPath); let resultViteConfig: UserConfig; + const widgetName = await getWidgetName(); if (viteConfigIsExists) { - const userConfig: UserConfig = await import(customViteConfigPath); + const userConfig = await getViteUserConfiguration(customViteConfigPath); - resultViteConfig = await getViteDefaultConfig(userConfig); + resultViteConfig = await getViteDefaultConfig(false, userConfig); } else { - resultViteConfig = await getViteDefaultConfig(); + resultViteConfig = await getViteDefaultConfig(false); } - showMessage('Start watch'); + const viteCachePath = path.join(PROJECT_DIRECTORY, 'node_modules/.vite'); + const viteCachePathExists = await pathIsExists(viteCachePath); - await viteBuild({ + if (viteCachePathExists) { + await fs.rm(viteCachePath, { recursive: true, force: true }); + } + + const viteServer = await createServer({ ...resultViteConfig, - build: { - ...resultViteConfig.build, - outDir: distDir, - watch: {}, - } - }) + root: PROJECT_DIRECTORY, + server: { + fs: { + strict: false + }, + watch: { + usePolling: true, + interval: 100 + }, + }, + optimizeDeps: { + esbuildOptions: { + plugins: [ + mendixHotreloadReactEsbuildPlugin(), + ], + } + }, + plugins: [ + ...resultViteConfig.plugins as PluginOption[], + mendixHotreloadReactPlugin(), + mendixPatchViteClientPlugin(), + { + name: 'mendix-xml-watch-plugin', + configureServer(server) { + server.watcher.on('change', (file) => { + if (file.endsWith('xml')) { + generateTyping(); + } + }); + } + }, + ] + }); + + await viteServer.listen(); + + showMessage('Generate hot reload widget'); + + const hotReloadTemplate = path.join(CLI_DIRECTORY, 'src/configurations/hotReload/widget.proxy.js.template'); + const hotReloadContents = await fs.readFile(hotReloadTemplate, 'utf-8'); + const devServerUrl = viteServer.resolvedUrls?.local[0] || ''; + const newHotReloadContents = hotReloadContents + .replaceAll('{{ WIDGET_NAME }}', widgetName) + .replaceAll('{{ DEV_SERVER_URL }}', devServerUrl) + + const distDir = await getViteWatchOutputDirectory(); + const distIsExists = await pathIsExists(distDir); + const hotReloadWidgetPath = path.join(distDir, `${widgetName}.mjs`); + const dummyCssPath = path.join(distDir, `${widgetName}.css`); + + if (distIsExists) { + await fs.rm(distDir, { recursive: true, force: true }); + } + + await fs.mkdir(distDir, { recursive: true }); + await fs.writeFile(hotReloadWidgetPath, newHotReloadContents); + await fs.writeFile(dummyCssPath, ''); + + showMessage(`${COLOR_GREEN('Widget hot reload is ready!')}`); + showMessage(`${COLOR_GREEN('Mendix webpage will refresh shortly. Hot reload will work after refreshing.')}`); } catch (error) { showMessage(`${COLOR_ERROR('Build failed.')}\nError occurred: ${COLOR_ERROR((error as Error).message)}`); } diff --git a/src/configurations/hotReload/widget.proxy.js.template b/src/configurations/hotReload/widget.proxy.js.template new file mode 100644 index 0000000..d4396d8 --- /dev/null +++ b/src/configurations/hotReload/widget.proxy.js.template @@ -0,0 +1,86 @@ +if (!window.$RefreshReg$) { + window.$RefreshReg$ = () => {}; + window.$RefreshSig$ = () => (type) => type; + window.$RefreshRuntime$ = { + register: () => {}, + createSignatureFunctionForTransform: () => () => {}, + performed: false + }; +} + +if (!window.__vite_plugin_react_preamble_installed__) { + window.__vite_plugin_react_preamble_installed__ = true; +} + +import React from 'react'; +import * as ReactDOM from 'react-dom'; +import * as ReactDOMClient from 'react-dom/client'; +import * as ReactJSXRuntime from 'react/jsx-runtime'; +import * as ReactJSXDevRuntime from 'react/jsx-dev-runtime'; + +if (!window.React) { + window.React = React; + window.ReactDOM = ReactDOM.default; + window.ReactDOMClient = ReactDOMClient.default; + window.ReactJSXRuntime = ReactJSXRuntime.default; + window.ReactJSXDevRuntime = ReactJSXDevRuntime.default; +} + +const DEV_SERVER_URL = '{{ DEV_SERVER_URL }}'; +const WIDGET_NAME = '{{ WIDGET_NAME }}'; + +function WidgetProxy(props) { + const [WidgetComponent, setWidgetComponent] = React.useState(null); + const [error, setError] = React.useState(null); + const [version, setVersion] = React.useState(0); + const viteClientRef = React.useRef(null); + const [viteClientInitialized, setViteClientInitialized] = React.useState(false); + + const loadWidget = async () => { + try { + const module = await import(`${DEV_SERVER_URL}src/${WIDGET_NAME}.tsx?t=${Date.now()}`); + + setWidgetComponent(() => module.default || module[WIDGET_NAME]); + setError(null); + } catch (err) { + console.error('Widget loading failed:', err); + } + }; + + const setupViteClient = async () => { + await fetch(`${DEV_SERVER_URL}@vite/client`); + + const clientModule = await import(`${DEV_SERVER_URL}@vite/client.mjs?t=${Date.now()}`); + + if (clientModule.createHotContext) { + viteClientRef.current = clientModule.createHotContext(`${DEV_SERVER_URL}src/${WIDGET_NAME}.tsx?t=${Date.now()}`); + } + + setViteClientInitialized(true); + }; + + React.useEffect(() => { + setupViteClient(); + }, []); + + React.useEffect(() => { + if (viteClientInitialized) { + fetch(`${DEV_SERVER_URL}src/${WIDGET_NAME}.tsx`) + .then(() => { + loadWidget(); + + viteClientRef.current.on('vite:afterUpdate', () => { + loadWidget(); + }); + }); + } + }, [viteClientInitialized]); + + if (!WidgetComponent) { + return React.createElement('div', null, 'Loading hot reload widget...'); + } + + return React.createElement(WidgetComponent, props); +} + +export default WidgetProxy; \ No newline at end of file diff --git a/src/configurations/vite/index.ts b/src/configurations/vite/index.ts index 4792c8a..f214deb 100644 --- a/src/configurations/vite/index.ts +++ b/src/configurations/vite/index.ts @@ -5,6 +5,7 @@ import path from "path"; import getWidgetName from "../../utils/getWidgetName"; import { PROJECT_DIRECTORY, WEB_OUTPUT_DIRECTORY } from "../../constants"; import getViteOutputDirectory from "../../utils/getViteOutputDirectory"; +import { PWTConfig } from "../.."; export const getEditorConfigDefaultConfig = async (isProduction: boolean): Promise => { const widgetName = await getWidgetName(); @@ -64,12 +65,12 @@ export const getEditorPreviewDefaultConfig = async (isProduction: boolean): Prom }; }; -export const getViteDefaultConfig = async (isProduction: boolean, userCustomConfig?: UserConfig): Promise => { +export const getViteDefaultConfig = async (isProduction: boolean, userCustomConfig?: PWTConfig): Promise => { const widgetName = await getWidgetName(); const viteOutputDirectory = await getViteOutputDirectory(); return { - plugins: [react()], + plugins: [react(userCustomConfig?.reactPluginOptions || undefined)], define: { 'process.env': {}, 'process.env.NODE_ENV': isProduction ? '"production"' : '"development"' diff --git a/src/configurations/vite/plugins/mendix-hotreload-react-esbuild-plugin.ts b/src/configurations/vite/plugins/mendix-hotreload-react-esbuild-plugin.ts new file mode 100644 index 0000000..3096244 --- /dev/null +++ b/src/configurations/vite/plugins/mendix-hotreload-react-esbuild-plugin.ts @@ -0,0 +1,186 @@ +import { Plugin } from "esbuild"; + +// @note When the React version of Mendix is updated, the following content must also be updated. +// @todo Depending on the React version, we need to consider whether there is a way to handle this automatically rather than manually. +export function mendixHotreloadReactEsbuildPlugin(): Plugin { + return { + name: 'mendix-hotreload-react-esbuild', + setup(build) { + build.onResolve({ filter: /^react$/ }, (args) => { + return { + path: 'mendix:react', + namespace: 'mendix-react', + external: false + }; + }); + + build.onResolve({ filter: /^react-dom$/ }, (args) => { + return { + path: 'mendix:react-dom', + namespace: 'mendix-react-dom', + external: false + }; + }); + + build.onResolve({ filter: /^react-dom\/client$/ }, (args) => { + return { + path: 'mendix:react-dom/client', + namespace: 'mendix-react-dom-client', + external: false + }; + }); + + build.onResolve({ filter: /^react\/jsx-runtime$/ }, (args) => { + return { + path: 'mendix:react/jsx-runtime', + namespace: 'mendix-react-jsx-runtime', + external: false + }; + }); + + build.onResolve({ filter: /^react\/jsx-dev-runtime$/ }, (args) => { + return { + path: 'mendix:react/jsx-dev-runtime', + namespace: 'mendix-react-jsx-dev-runtime', + external: false + }; + }); + + build.onLoad({ filter: /.*/, namespace: 'mendix-react' }, () => { + return { + contents: ` + const React = window.React; + + export const Children = React.Children; + export const Component = React.Component; + export const Fragment = React.Fragment; + export const Profiler = React.Profiler; + export const PureComponent = React.PureComponent; + export const StrictMode = React.StrictMode; + export const Suspense = React.Suspense; + export const cloneElement = React.cloneElement; + export const createContext = React.createContext; + export const createElement = React.createElement; + export const createFactory = React.createFactory; + export const createRef = React.createRef; + export const forwardRef = React.forwardRef; + export const isValidElement = React.isValidElement; + export const lazy = React.lazy; + export const memo = React.memo; + export const startTransition = React.startTransition; + export const unstable_act = React.unstable_act; + export const useCallback = React.useCallback; + export const useContext = React.useContext; + export const useDebugValue = React.useDebugValue; + export const useDeferredValue = React.useDeferredValue; + export const useEffect = React.useEffect; + export const useId = React.useId; + export const useImperativeHandle = React.useImperativeHandle; + export const useInsertionEffect = React.useInsertionEffect; + export const useLayoutEffect = React.useLayoutEffect; + export const useMemo = React.useMemo; + export const useReducer = React.useReducer; + export const useRef = React.useRef; + export const useState = React.useState; + export const useSyncExternalStore = React.useSyncExternalStore; + export const useTransition = React.useTransition; + export const version = React.version; + + export default React; + `, + loader: 'js', + }; + }); + + build.onLoad({ filter: /.*/, namespace: 'mendix-react-dom' }, () => { + return { + contents: ` + const ReactDOM = window.ReactDOM; + + export const createPortal = ReactDOM.createPortal; + export const createRoot = ReactDOM.createRoot; + export const findDOMNode = ReactDOM.findDOMNode; + export const flushSync = ReactDOM.flushSync; + export const hydrate = ReactDOM.hydrate; + export const hydrateRoot = ReactDOM.hydrateRoot; + export const render = ReactDOM.render; + export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode; + export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates; + export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer; + export const version = ReactDOM.version; + + export default ReactDOM; + `, + loader: 'js', + }; + }); + + build.onLoad({ filter: /.*/, namespace: 'mendix-react-dom-client' }, () => { + return { + contents: ` + const ReactDOMClient = window.ReactDOMClient; + + export const createRoot = ReactDOMClient.createRoot; + export const hydrateRoot = ReactDOMClient.hydrateRoot; + + export default ReactDOMClient; + `, + loader: 'js', + }; + }); + + build.onLoad({ filter: /.*/, namespace: 'mendix-react-jsx-runtime' }, () => { + return { + contents: ` + const ReactJSXRuntime = window.ReactJSXRuntime; + + export const Fragment = ReactJSXRuntime.Fragment; + export const jsx = ReactJSXRuntime.jsx; + export const jsxs = ReactJSXRuntime.jsxs; + + export default ReactJSXRuntime; + `, + loader: 'js', + }; + }); + + build.onLoad({ filter: /.*/, namespace: 'mendix-react-jsx-dev-runtime' }, () => { + return { + contents: ` + const ReactJSXDevRuntime = window.ReactJSXDevRuntime; + + export const Fragment = ReactJSXDevRuntime.Fragment; + export const jsxDEV = ReactJSXDevRuntime.jsxDEV; + + export default ReactJSXDevRuntime; + `, + loader: 'js', + }; + }); + + build.onResolve({ filter: /.*node_modules[\\\/]react[\\\/]index\.js$/ }, (args) => { + return { + path: 'mendix:react', + namespace: 'mendix-react', + external: false + }; + }); + + build.onResolve({ filter: /.*node_modules[\\\/]react-dom[\\\/]index\.js$/ }, (args) => { + return { + path: 'mendix:react-dom', + namespace: 'mendix-react-dom', + external: false + }; + }); + + build.onResolve({ filter: /.*node_modules[\\\/]react-dom[\\\/]client\.js$/ }, (args) => { + return { + path: 'mendix:react-dom/client', + namespace: 'mendix-react-dom-client', + external: false + }; + }); + } + }; +} \ No newline at end of file diff --git a/src/configurations/vite/plugins/mendix-hotreload-react-plugin.ts b/src/configurations/vite/plugins/mendix-hotreload-react-plugin.ts new file mode 100644 index 0000000..91e6880 --- /dev/null +++ b/src/configurations/vite/plugins/mendix-hotreload-react-plugin.ts @@ -0,0 +1,129 @@ +import { Plugin } from "vite"; + +// @note When the React version of Mendix is updated, the following content must also be updated. +// @todo Depending on the React version, we need to consider whether there is a way to handle this automatically rather than manually. +export function mendixHotreloadReactPlugin(): Plugin { + return { + name: 'mendix-hotreload-react-18.2.0', + enforce: 'pre', + resolveId(id) { + if (id === 'react') { + return { id: 'mendix:react', external: true }; + } + + if (id === 'react-dom') { + return { id: 'mendix:react-dom', external: true }; + } + + if (id === 'react-dom/client') { + return { id: 'mendix:react-dom/client', external: true }; + } + + if (id === 'react/jsx-runtime') { + return { id: 'mendix:react/jsx-runtime', external: true }; + } + + if (id === 'react/jsx-dev-runtime') { + return { id: 'mendix:react/jsx-dev-runtime', external: true }; + } + }, + load(id) { + if (id === 'mendix:react') { + return ` + const React = window.React; + + export const Children = React.Children; + export const Component = React.Component; + export const Fragment = React.Fragment; + export const Profiler = React.Profiler; + export const PureComponent = React.PureComponent; + export const StrictMode = React.StrictMode; + export const Suspense = React.Suspense; + export const cloneElement = React.cloneElement; + export const createContext = React.createContext; + export const createElement = React.createElement; + export const createFactory = React.createFactory; + export const createRef = React.createRef; + export const forwardRef = React.forwardRef; + export const isValidElement = React.isValidElement; + export const lazy = React.lazy; + export const memo = React.memo; + export const startTransition = React.startTransition; + export const unstable_act = React.unstable_act; + export const useCallback = React.useCallback; + export const useContext = React.useContext; + export const useDebugValue = React.useDebugValue; + export const useDeferredValue = React.useDeferredValue; + export const useEffect = React.useEffect; + export const useId = React.useId; + export const useImperativeHandle = React.useImperativeHandle; + export const useInsertionEffect = React.useInsertionEffect; + export const useLayoutEffect = React.useLayoutEffect; + export const useMemo = React.useMemo; + export const useReducer = React.useReducer; + export const useRef = React.useRef; + export const useState = React.useState; + export const useSyncExternalStore = React.useSyncExternalStore; + export const useTransition = React.useTransition; + export const version = React.version; + + export default React; + `; + } + + if (id === 'mendix:react-dom') { + return ` + const ReactDOM = window.ReactDOM; + + export const createPortal = ReactDOM.createPortal; + export const createRoot = ReactDOM.createRoot; + export const findDOMNode = ReactDOM.findDOMNode; + export const flushSync = ReactDOM.flushSync; + export const hydrate = ReactDOM.hydrate; + export const hydrateRoot = ReactDOM.hydrateRoot; + export const render = ReactDOM.render; + export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode; + export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates; + export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer; + export const version = ReactDOM.version; + + export default ReactDOM; + `; + } + + if (id === 'mendix:react-dom/client') { + return ` + const ReactDOMClient = window.ReactDOMClient; + + export const createRoot = ReactDOMClient.createRoot; + export const hydrateRoot = ReactDOMClient.hydrateRoot; + + export default ReactDOMClient; + `; + } + + if (id === 'mendix:react/jsx-runtime') { + return ` + const ReactJSXRuntime = window.ReactJSXRuntime; + + export const Fragment = ReactJSXRuntime.Fragment; + export const jsx = ReactJSXRuntime.jsx; + export const jsxs = ReactJSXRuntime.jsxs; + + export default ReactJSXRuntime; + `; + } + + if (id === 'mendix:react/jsx-dev-runtime') { + return ` + const ReactJSXDevRuntime = window.ReactJSXDevRuntime; + + export const Fragment = ReactJSXDevRuntime.Fragment; + export const jsxDEV = ReactJSXDevRuntime.jsxDEV; + + export default ReactJSXDevRuntime; + `; + } + } + }; +} \ No newline at end of file diff --git a/src/configurations/vite/plugins/mendix-patch-vite-client-plugin.ts b/src/configurations/vite/plugins/mendix-patch-vite-client-plugin.ts new file mode 100644 index 0000000..5513bb2 --- /dev/null +++ b/src/configurations/vite/plugins/mendix-patch-vite-client-plugin.ts @@ -0,0 +1,56 @@ +import { Plugin } from "vite"; + +export function mendixPatchViteClientPlugin(): Plugin { + return { + name: 'mendix-patch-vite-client', + enforce: 'pre', + apply: 'serve', + configureServer(server) { + server.middlewares.use(async (req, res, next) => { + const url = req.url || ''; + + if (url.includes('@vite/client.mjs')) { + const transformed = await server.transformRequest('/@vite/client.mjs'); + let code = transformed?.code || ''; + const rePageReload = /const\s+pageReload\s*=\s*debounceReload\(\s*(\d+)\s*\)/; + const m = code.match(rePageReload); + + if (m) { + const delay = m[1]; + const injectScript = ` +const __mx_debounceReload = (time) => { + let timer; + return () => { + if (timer) { clearTimeout(timer); timer = null; } + + timer = setTimeout(() => { + try { + const mx = (typeof window !== 'undefined') ? window.mx : undefined; + + if (mx) { + mx.reloadWithState(); + return; + } + } catch (e) { + console.warn('[patch-vite-client-debounce] mx.reloadWithState failed:', e); + } + + location.reload(); + }, time); + }; +}; + `; + + code = code.replace(rePageReload, `${injectScript}\nconst pageReload = __mx_debounceReload(${delay})`); + } + + res.setHeader('Content-Type', 'application/javascript; charset=utf-8'); + res.end(code); + return; + } + + next(); + }); + } + }; +} \ No newline at end of file diff --git a/src/constants/index.ts b/src/constants/index.ts index a16df06..e871067 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -9,6 +9,8 @@ export const DIST_DIRECTORY_NAME = 'dist'; export const WEB_OUTPUT_DIRECTORY = path.join(PROJECT_DIRECTORY, `/${DIST_DIRECTORY_NAME}/tmp/widgets`); +export const VITE_CONFIGURATION_FILENAME = 'vite.config.mjs'; + export const COLOR_NAME = chalk.bold.blueBright; export const COLOR_ERROR = chalk.bold.red; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..944dae6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,13 @@ +import type { UserConfig } from "vite"; +import reactPlugin from "@vitejs/plugin-react-swc"; + +export type PWTConfig = UserConfig & { + reactPluginOptions?: Parameters[0]; +}; + +export type PWTConfigFnPromise = () => Promise; +export type PWTConfigFn = () => PWTConfig | Promise; + +export function definePWTConfig(config: PWTConfigFn | PWTConfigFnPromise): PWTConfigFn | PWTConfigFnPromise { + return config; +} diff --git a/src/type-generator/generator.ts b/src/type-generator/generator.ts new file mode 100644 index 0000000..372dd79 --- /dev/null +++ b/src/type-generator/generator.ts @@ -0,0 +1,146 @@ +import type { + WidgetDefinition, + Property, + PropertyGroup, + SystemProperty, +} from './types'; +import type { GenerateTargetPlatform } from './mendix-types'; +import { + mapPropertyTypeToTS, + pascalCase, + sanitizePropertyKey, + formatDescription, +} from './utils'; +import { getMendixImports, generateMendixImports } from './mendix-types'; +import { + extractSystemProperties, + hasLabelProperty, + generateSystemProps, + getSystemPropsImports +} from './system-props'; +import { generateHeaderComment } from './header'; + +export function generateTypeDefinition(widget: WidgetDefinition, target: GenerateTargetPlatform): string { + const interfaceName = generateInterfaceName(widget.name); + const properties = extractAllProperties(widget.properties); + const systemProps = extractSystemProperties(widget.properties); + const hasLabel = hasLabelProperty(systemProps); + const widgetProperties = properties.filter(p => !isSystemProperty(p)) as Property[]; + + let output = ''; + + output += generateHeaderComment(); + + const imports = getMendixImports(widgetProperties, target); + const systemImports = getSystemPropsImports({ hasLabel, platform: target }); + const allImports = [...imports, ...systemImports]; + const importStatements = generateMendixImports(allImports); + + if (importStatements) { + output += importStatements + '\n'; + } + + output += generateJSDoc(widget); + output += `export interface ${interfaceName} {\n`; + + const systemPropsLines = generateSystemProps({ hasLabel, platform: target }); + + for (const line of systemPropsLines) { + output += ` ${line}\n`; + } + + if (systemPropsLines.length > 0 && widgetProperties.length > 0) { + output += `\n // Widget properties\n`; + } + + for (const property of widgetProperties) { + output += generatePropertyDefinition(property, target); + } + + output += '}\n'; + + return output; +} + +function generateInterfaceName(widgetName: string): string { + return `${pascalCase(widgetName)}ContainerProps`; +} + +export function extractAllProperties(properties: PropertyGroup[] | Property[]): (Property | SystemProperty)[] { + const result: (Property | SystemProperty)[] = []; + + for (const item of properties) { + if (isPropertyGroup(item)) { + result.push(...item.properties); + } else { + result.push(item); + } + } + + return result; +} + +function isPropertyGroup(item: PropertyGroup | Property | SystemProperty): item is PropertyGroup { + return 'caption' in item && 'properties' in item; +} + +function isSystemProperty(item: Property | SystemProperty): item is SystemProperty { + return !('type' in item) && 'key' in item; +} + +function generateJSDoc(widget: WidgetDefinition): string { + let jsDoc = '/**\n'; + jsDoc += ` * Props for ${widget.name}\n`; + + if (widget.description) { + jsDoc += ` * ${formatDescription(widget.description)}\n`; + } + + if (widget.needsEntityContext) { + jsDoc += ` * @needsEntityContext true\n`; + } + + if (widget.supportedPlatform && widget.supportedPlatform !== 'Web') { + jsDoc += ` * @platform ${widget.supportedPlatform}\n`; + } + + jsDoc += ' */\n'; + return jsDoc; +} + +function generatePropertyDefinition(property: Property, target: GenerateTargetPlatform): string { + const indent = ' '; + let output = ''; + + if (property.description) { + output += `${indent}/**\n`; + output += `${indent} * ${formatDescription(property.description)}\n`; + + if (property.caption && property.caption !== property.description) { + output += `${indent} * @caption ${property.caption}\n`; + } + + if (property.defaultValue !== undefined && property.defaultValue !== '') { + output += `${indent} * @default ${property.defaultValue}\n`; + } + + if (property.type === 'attribute' && property.attributeTypes) { + output += `${indent} * @attributeTypes ${property.attributeTypes.join(', ')}\n`; + } + + if (property.type === 'enumeration' && property.enumerationValues) { + const values = property.enumerationValues.map(ev => ev.key).join(', '); + output += `${indent} * @enum {${values}}\n`; + } + + output += `${indent} */\n`; + } + + const propertyKey = sanitizePropertyKey(property.key); + const optional = property.required === false ? '?' : ''; + const propertyType = mapPropertyTypeToTS(property, target); + + output += `${indent}${propertyKey}${optional}: ${propertyType};\n`; + + return output; +} \ No newline at end of file diff --git a/src/type-generator/header.ts b/src/type-generator/header.ts new file mode 100644 index 0000000..0ff29ba --- /dev/null +++ b/src/type-generator/header.ts @@ -0,0 +1,37 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; + +export function getPackageVersion(): string { + try { + const packageJsonPath = join(process.cwd(), 'node_modules', '@repixelcorp', 'hyper-pwt', 'package.json'); + const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + + return packageJson.version || 'unknown'; + } catch { + try { + const currentDir = process.cwd(); + const packageJsonPath = join(currentDir, 'package.json'); + const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + + if (packageJson.name === '@repixelcorp/hyper-pwt') { + return packageJson.version || 'unknown'; + } + } catch { + return 'unknown'; + } + } +} + +export function generateHeaderComment(): string { + const version = getPackageVersion(); + + return `/** + * This file was automatically generated by @repixelcorp/hyper-pwt v${version} + * DO NOT MODIFY THIS FILE DIRECTLY + * + * To regenerate this file, run the type generator with your widget XML file. + * Any manual changes to this file will be lost when the types are regenerated. + */ + +`; +} \ No newline at end of file diff --git a/src/type-generator/index.ts b/src/type-generator/index.ts new file mode 100644 index 0000000..d9cc96c --- /dev/null +++ b/src/type-generator/index.ts @@ -0,0 +1,25 @@ +import { readFile } from 'fs/promises'; +import { parseWidgetXML } from './parser'; +import { generateTypeDefinition } from './generator'; +import { generatePreviewTypeDefinition } from './preview-types'; +import type { GenerateTargetPlatform } from './mendix-types'; + +export { parseWidgetXML } from './parser'; +export { generateTypeDefinition } from './generator'; +export { generatePreviewTypeDefinition } from './preview-types'; +export type { WidgetDefinition, Property, PropertyGroup, PropertyType } from './types'; + +export function generateTypes(xmlContent: string, target: GenerateTargetPlatform): string { + const widget = parseWidgetXML(xmlContent); + let output = generateTypeDefinition(widget, target); + + output += '\n' + generatePreviewTypeDefinition(widget); + + return output; +} + +export async function generateTypesFromFile(filePath: string, target: GenerateTargetPlatform): Promise { + const xmlContent = await readFile(filePath, 'utf-8'); + + return generateTypes(xmlContent, target); +} \ No newline at end of file diff --git a/src/type-generator/mendix-types.ts b/src/type-generator/mendix-types.ts new file mode 100644 index 0000000..6202b37 --- /dev/null +++ b/src/type-generator/mendix-types.ts @@ -0,0 +1,347 @@ +import type { + Property, + AttributeType, +} from './types'; + +export interface MendixTypeMapping { + type: string; + imports: Set; +} + +export type GenerateTargetPlatform = 'web' | 'native'; + +export function getMendixImports(properties: Property[], target: GenerateTargetPlatform): string[] { + const imports = new Set(); + + for (const property of properties) { + const mapping = mapPropertyToMendixType(property, target); + + mapping.imports.forEach(imp => imports.add(imp)); + } + + return Array.from(imports).sort(); +} + +export function mapPropertyToMendixType(property: Property, platform: GenerateTargetPlatform = 'web'): MendixTypeMapping { + const imports = new Set(); + let type: string; + + switch (property.type) { + case 'string': + case 'translatableString': + type = 'string'; + break; + + case 'boolean': + type = 'boolean'; + break; + + case 'integer': + type = 'number'; + break; + + case 'decimal': + imports.add('Big'); + type = 'Big'; + break; + + case 'textTemplate': + imports.add('DynamicValue'); + if (property.dataSource) { + imports.add('ListExpressionValue'); + type = 'ListExpressionValue'; + } else { + type = 'DynamicValue'; + } + break; + + case 'action': + if (property.dataSource) { + imports.add('ListActionValue'); + type = 'ListActionValue'; + } else { + imports.add('ActionValue'); + type = 'ActionValue'; + } + break; + + case 'microflow': + case 'nanoflow': + imports.add('ActionValue'); + type = 'ActionValue'; + break; + + case 'attribute': + type = mapAttributeToMendixType(property, imports); + break; + + case 'expression': + type = mapExpressionToMendixType(property, imports); + break; + + case 'datasource': + imports.add('ListValue'); + type = 'ListValue'; + break; + + case 'icon': + imports.add('DynamicValue'); + if (platform === 'native') { + imports.add('NativeIcon'); + type = 'DynamicValue'; + } else if (platform === 'web') { + imports.add('WebIcon'); + type = 'DynamicValue'; + } else { + imports.add('WebIcon'); + imports.add('NativeIcon'); + type = 'DynamicValue'; + } + break; + + case 'image': + imports.add('DynamicValue'); + if (platform === 'native') { + imports.add('NativeImage'); + type = 'DynamicValue'; + } else if (platform === 'web') { + imports.add('WebImage'); + type = 'DynamicValue'; + } else { + imports.add('WebImage'); + imports.add('NativeImage'); + type = 'DynamicValue'; + } + break; + + case 'file': + imports.add('DynamicValue'); + imports.add('FileValue'); + type = 'DynamicValue'; + break; + + case 'widgets': + if (property.dataSource) { + imports.add('ListWidgetValue'); + type = 'ListWidgetValue'; + } else { + imports.add('ReactNode'); + type = 'ReactNode'; + } + break; + + case 'object': + if (property.properties && property.properties.length > 0) { + type = generateObjectInterface(property); + } else { + type = 'object'; + } + break; + + case 'entity': + imports.add('ObjectItem'); + type = 'ObjectItem'; + break; + + case 'entityConstraint': + type = 'string'; + break; + + case 'enumeration': + if (property.enumerationValues && property.enumerationValues.length > 0) { + type = property.enumerationValues.map(ev => `"${ev.key}"`).join(' | '); + } else { + type = 'string'; + } + break; + + case 'association': + type = mapAssociationToMendixType(property, imports); + break; + + case 'selection': + type = mapSelectionToMendixType(property, imports); + break; + + case 'form': + type = 'string'; + break; + + default: + type = 'any'; + } + + if (property.isList && !['datasource', 'widgets'].includes(property.type)) { + type = `${type}[]`; + } + + return { type, imports }; +} + +function mapAttributeToMendixType(property: Property, imports: Set): string { + const baseType = getAttributeBaseType(property.attributeTypes || []); + + if (property.dataSource) { + imports.add('ListAttributeValue'); + + return `ListAttributeValue<${baseType}>`; + } else { + imports.add('EditableValue'); + + return `EditableValue<${baseType}>`; + } +} + +function mapExpressionToMendixType(property: Property, imports: Set): string { + const baseType = property.returnType ? mapReturnTypeToTS(property.returnType.type) : 'string'; + + if (property.dataSource) { + imports.add('ListExpressionValue'); + + const typeStr = property.returnType?.isList ? `${baseType}[]` : baseType; + + return `ListExpressionValue<${typeStr}>`; + } else { + imports.add('DynamicValue'); + + const typeStr = property.returnType?.isList ? `${baseType}[]` : baseType; + + return `DynamicValue<${typeStr}>`; + } +} + +function mapAssociationToMendixType(property: Property, imports: Set): string { + if (!property.associationTypes || property.associationTypes.length === 0) { + imports.add('ObjectItem'); + + return 'ObjectItem'; + } + + const assocType = property.associationTypes[0]; + + if (assocType === 'Reference') { + if (property.dataSource) { + imports.add('ListReferenceValue'); + + return 'ListReferenceValue'; + } else { + imports.add('ReferenceValue'); + + return 'ReferenceValue'; + } + } else if (assocType === 'ReferenceSet') { + if (property.dataSource) { + imports.add('ListReferenceSetValue'); + + return 'ListReferenceSetValue'; + } else { + imports.add('ReferenceSetValue'); + + return 'ReferenceSetValue'; + } + } + + imports.add('ObjectItem'); + + return 'ObjectItem'; +} + +function mapSelectionToMendixType(property: Property, imports: Set): string { + if (!property.selectionTypes || property.selectionTypes.length === 0) { + imports.add('SelectionSingleValue'); + + return 'SelectionSingleValue'; + } + + const selectionType = property.selectionTypes[0]; + + if (selectionType === 'Multi') { + imports.add('SelectionMultiValue'); + + return 'SelectionMultiValue'; + } else { + imports.add('SelectionSingleValue'); + + return 'SelectionSingleValue'; + } +} + +function getAttributeBaseType(attributeTypes: AttributeType[]): string { + if (attributeTypes.length === 0) return 'any'; + + const types = attributeTypes.map(type => { + switch (type) { + case 'String': + case 'HashString': + case 'Enum': + return 'string'; + case 'Boolean': + return 'boolean'; + case 'Integer': + case 'Long': + case 'AutoNumber': + case 'Float': + case 'Currency': + return 'number'; + case 'Decimal': + return 'Big'; + case 'DateTime': + return 'Date'; + case 'Binary': + return 'string'; + default: + return 'any'; + } + }); + + const uniqueTypes = Array.from(new Set(types)); + return uniqueTypes.length === 1 ? uniqueTypes[0] : uniqueTypes.join(' | '); +} + +function mapReturnTypeToTS(returnType: string): string { + switch (returnType) { + case 'Void': + return 'void'; + case 'Boolean': + return 'boolean'; + case 'Integer': + case 'Float': + return 'number'; + case 'Decimal': + return 'Big'; + case 'DateTime': + return 'Date'; + case 'String': + return 'string'; + case 'Object': + return 'object'; + default: + return 'any'; + } +} + +function generateObjectInterface(property: Property): string { + return `${property.key}Type`; +} + +export function generateMendixImports(imports: string[]): string { + if (imports.length === 0) return ''; + + const mendixImports = imports.filter(imp => + !['ReactNode'].includes(imp) + ); + + const reactImports = imports.filter(imp => imp === 'ReactNode'); + + let output = ''; + + if (reactImports.length > 0) { + output += `import { ${reactImports.join(', ')} } from 'react';\n`; + } + + if (mendixImports.length > 0) { + output += `import { ${mendixImports.join(', ')} } from 'mendix';\n`; + } + + return output; +} \ No newline at end of file diff --git a/src/type-generator/parser.ts b/src/type-generator/parser.ts new file mode 100644 index 0000000..3b8bc77 --- /dev/null +++ b/src/type-generator/parser.ts @@ -0,0 +1,194 @@ +import { XMLParser } from 'fast-xml-parser'; +import type { + WidgetDefinition, + Property, + PropertyGroup, + SystemProperty, + AttributeType, + AssociationType, + SelectionType, + EnumerationValue, + ParsedXMLWidget, + ParsedXMLProperty, + ParsedXMLPropertyGroup, + ParsedXMLSystemProperty, + ParsedXMLAttributeType, + ParsedXMLAssociationType, + ParsedXMLSelectionType, + ParsedXMLEnumerationValue, +} from './types'; +import { ensureArray } from './utils'; + +const parserOptions = { + ignoreAttributes: false, + attributeNamePrefix: '', + textNodeName: '_', + parseAttributeValue: false, + trimValues: true, + parseTrueNumberOnly: false, + parseTagValue: false, + allowBooleanAttributes: true, +}; + +export function parseWidgetXML(xmlContent: string): WidgetDefinition { + const parser = new XMLParser(parserOptions); + const parsedXML = parser.parse(xmlContent) as ParsedXMLWidget; + + if (!parsedXML.widget) { + throw new Error('Invalid widget XML: missing widget element'); + } + + const widget = parsedXML.widget; + + const widgetDef: WidgetDefinition = { + id: widget.id, + name: widget.name, + description: widget.description, + needsEntityContext: widget.needsEntityContext === 'true', + pluginWidget: widget.pluginWidget === 'true', + offlineCapable: widget.offlineCapable === 'true', + supportedPlatform: (widget.supportedPlatform as 'All' | 'Native' | 'Web') || 'Web', + properties: [], + }; + + if (widget.properties) { + widgetDef.properties = parseProperties(widget.properties); + } + + return widgetDef; +} + +function parseProperties(props: any): PropertyGroup[] | Property[] { + if (props.propertyGroup) { + const groups = ensureArray(props.propertyGroup); + + return groups.map(group => parsePropertyGroup(group)); + } + + const properties: Property[] = []; + + if (props.property) { + const propsArray = ensureArray(props.property); + + for (const prop of propsArray) { + properties.push(parseProperty(prop)); + } + } + + return properties; +} + +function parsePropertyGroup(group: ParsedXMLPropertyGroup): PropertyGroup { + const properties: (Property | SystemProperty)[] = []; + + if (group.property) { + const props = ensureArray(group.property); + for (const prop of props) { + properties.push(parseProperty(prop)); + } + } + + if (group.systemProperty) { + const sysProps = ensureArray(group.systemProperty); + for (const sysProp of sysProps) { + properties.push(parseSystemProperty(sysProp)); + } + } + + return { + caption: group.caption, + properties, + }; +} + +function parseProperty(prop: ParsedXMLProperty): Property { + const property: Property = { + key: prop.key, + type: prop.type, + caption: prop.caption || '', + description: prop.description || '', + required: prop.required !== 'false', + isList: prop.isList === 'true', + }; + + if (prop.defaultValue !== undefined) { + property.defaultValue = prop.defaultValue; + } + + if (prop.onChange) { + property.onChange = prop.onChange; + } + + if (prop.dataSource) { + property.dataSource = prop.dataSource; + } + + if (prop.attributeTypes) { + property.attributeTypes = parseAttributeTypes(prop.attributeTypes); + } + + if (prop.associationTypes) { + property.associationTypes = parseAssociationTypes(prop.associationTypes); + } + + if (prop.selectionTypes) { + property.selectionTypes = parseSelectionTypes(prop.selectionTypes); + } + + if (prop.enumerationValues) { + property.enumerationValues = parseEnumerationValues(prop.enumerationValues); + } + + if (prop.properties) { + const parsedProps = parseProperties(prop.properties); + property.properties = parsedProps.filter(p => !('caption' in p && 'properties' in p)) as Property[]; + } + + if (prop.returnType) { + property.returnType = { + type: prop.returnType.type as any, + isList: prop.returnType.isList === 'true', + }; + } + + return property; +} + +function parseSystemProperty(sysProp: ParsedXMLSystemProperty): SystemProperty { + const systemProperty: SystemProperty = { + key: sysProp.key, + }; + + if (sysProp.category) { + systemProperty.category = sysProp.category; + } + + return systemProperty; +} + +function parseAttributeTypes(attributeTypes: { attributeType: ParsedXMLAttributeType | ParsedXMLAttributeType[] }): AttributeType[] { + const types = ensureArray(attributeTypes.attributeType); + + return types.map(type => type.name); +} + +function parseAssociationTypes(associationTypes: { associationType: ParsedXMLAssociationType | ParsedXMLAssociationType[] }): AssociationType[] { + const types = ensureArray(associationTypes.associationType); + + return types.map(type => type.name); +} + +function parseSelectionTypes(selectionTypes: { selectionType: ParsedXMLSelectionType | ParsedXMLSelectionType[] }): SelectionType[] { + const types = ensureArray(selectionTypes.selectionType); + + return types.map(type => type.name); +} + +function parseEnumerationValues(enumerationValues: { enumerationValue: ParsedXMLEnumerationValue | ParsedXMLEnumerationValue[] }): EnumerationValue[] { + const values = ensureArray(enumerationValues.enumerationValue); + + return values.map(value => ({ + key: value.key, + value: value._ || value.key, + })); +} \ No newline at end of file diff --git a/src/type-generator/preview-types.ts b/src/type-generator/preview-types.ts new file mode 100644 index 0000000..9d61759 --- /dev/null +++ b/src/type-generator/preview-types.ts @@ -0,0 +1,221 @@ +import type { + WidgetDefinition, + Property, + PropertyGroup, + SystemProperty +} from './types'; +import { + pascalCase, + sanitizePropertyKey, + formatDescription +} from './utils'; +import { + extractSystemProperties, + hasLabelProperty, + generatePreviewSystemProps +} from './system-props'; + +export function generatePreviewTypeDefinition( + widget: WidgetDefinition, +): string { + const interfaceName = `${pascalCase(widget.name)}PreviewProps`; + const properties = extractAllProperties(widget.properties); + const systemProps = extractSystemProperties(widget.properties); + const hasLabel = hasLabelProperty(systemProps); + const widgetProperties = properties.filter(p => !isSystemProperty(p)) as Property[]; + + let output = ''; + + output += generatePreviewImports(); + output += generatePreviewJSDoc(widget); + output += `export interface ${interfaceName} {\n`; + output += ' /**\n'; + output += ' * Whether the widget is in read-only mode\n'; + output += ' */\n'; + output += ' readOnly: boolean;\n'; + output += ' /**\n'; + output += ' * The render mode of the widget preview\n'; + output += ' */\n'; + output += ' renderMode?: "design" | "xray" | "structure";\n'; + + const systemPropsLines = generatePreviewSystemProps(hasLabel); + + for (const line of systemPropsLines) { + output += ' ' + line + '\n'; + } + + for (const property of widgetProperties) { + output += generatePreviewPropertyDefinition(property); + } + + output += '}\n'; + + return output; +} + +function generatePreviewImports(): string { + const imports: string[] = []; + + imports.push('CSSProperties'); + imports.push('PreviewValue'); + + let output = ''; + + if (imports.length > 0) { + output += `import type { ${imports.join(', ')} } from 'react';\n\n`; + } + + return output; +} + +function generatePreviewJSDoc(widget: WidgetDefinition): string { + let jsDoc = '/**\n'; + jsDoc += ` * Preview props for ${widget.name}\n`; + + if (widget.description) { + jsDoc += ` * ${formatDescription(widget.description)}\n`; + } + + jsDoc += ' * @preview This interface is used in design mode\n'; + jsDoc += ' */\n'; + return jsDoc; +} + +function generatePreviewPropertyDefinition( + property: Property, +): string { + const indent = ' '; + let output = ''; + + if (property.description) { + output += `${indent}/**\n`; + output += `${indent} * ${formatDescription(property.description)}\n`; + + if (property.caption && property.caption !== property.description) { + output += `${indent} * @caption ${property.caption}\n`; + } + + output += `${indent} */\n`; + } + + const propertyKey = sanitizePropertyKey(property.key); + const optional = property.required === false ? '?' : ''; + const propertyType = mapPropertyToPreviewType(property); + + output += `${indent}${propertyKey}${optional}: ${propertyType};\n`; + + return output; +} + +function mapPropertyToPreviewType( + property: Property, +): string { + const { type, isList, enumerationValues } = property; + + let baseType: string; + + switch (type) { + case 'string': + case 'translatableString': + baseType = 'string'; + break; + + case 'boolean': + baseType = 'boolean'; + break; + + case 'integer': + case 'decimal': + baseType = 'number'; + break; + + case 'action': + case 'microflow': + case 'nanoflow': + baseType = '{} | null'; + break; + + case 'attribute': + case 'expression': + case 'entityConstraint': + baseType = 'string'; + break; + + case 'textTemplate': + baseType = 'string'; + break; + + case 'datasource': + baseType = '{ type: string } | { caption: string } | {}'; + break; + + case 'icon': + case 'image': + case 'file': + baseType = '{ uri: string } | null'; + break; + + case 'widgets': + baseType = 'PreviewValue | null'; + break; + + case 'enumeration': + if (enumerationValues && enumerationValues.length > 0) { + baseType = enumerationValues.map(ev => `"${ev.key}"`).join(' | '); + } else { + baseType = 'string'; + } + break; + + case 'object': + if (property.properties && property.properties.length > 0) { + baseType = `${pascalCase(property.key)}PreviewType`; + } else { + baseType = 'object'; + } + break; + + case 'entity': + case 'association': + case 'selection': + baseType = 'string'; + break; + + case 'form': + baseType = 'string'; + break; + + default: + baseType = 'any'; + } + + return isList && type !== 'datasource' ? `${baseType}[]` : baseType; +} + +function extractAllProperties( + properties: PropertyGroup[] | Property[] +): (Property | SystemProperty)[] { + const result: (Property | SystemProperty)[] = []; + + for (const item of properties) { + if (isPropertyGroup(item)) { + result.push(...item.properties); + } else { + result.push(item); + } + } + + return result; +} + +function isPropertyGroup( + item: PropertyGroup | Property | SystemProperty +): item is PropertyGroup { + return 'caption' in item && 'properties' in item; +} + +function isSystemProperty( + item: Property | SystemProperty +): item is SystemProperty { + return !('type' in item) && 'key' in item; +} \ No newline at end of file diff --git a/src/type-generator/system-props.ts b/src/type-generator/system-props.ts new file mode 100644 index 0000000..8b20b02 --- /dev/null +++ b/src/type-generator/system-props.ts @@ -0,0 +1,87 @@ +import { GenerateTargetPlatform } from './mendix-types'; +import type { SystemProperty, Property, PropertyGroup } from './types'; + +export interface SystemPropsConfig { + hasLabel?: boolean; + platform?: GenerateTargetPlatform; +} + +export function extractSystemProperties( + properties: PropertyGroup[] | Property[] | (Property | SystemProperty)[] +): SystemProperty[] { + const systemProps: SystemProperty[] = []; + + for (const item of properties) { + if (isPropertyGroup(item)) { + for (const prop of item.properties) { + if (isSystemProperty(prop)) { + systemProps.push(prop); + } + } + } else if (isSystemProperty(item)) { + systemProps.push(item); + } + } + + return systemProps; +} + +export function hasLabelProperty(systemProperties: SystemProperty[]): boolean { + return systemProperties.some(prop => prop.key === 'Label'); +} + +export function generateSystemProps(config: SystemPropsConfig = {}): string[] { + const { hasLabel = false, platform = 'web' } = config; + const props: string[] = []; + + props.push('name?: string;'); + + if (platform !== 'native') { + if (!hasLabel) { + props.push('class?: string;'); + props.push('style?: CSSProperties;'); + } + props.push('tabIndex?: number;'); + } + + if (hasLabel) { + props.push('id?: string;'); + } + + return props; +} + +export function getSystemPropsImports(config: SystemPropsConfig = {}): string[] { + const { platform = 'web' } = config; + const imports: string[] = []; + + if (platform !== 'native') { + imports.push('CSSProperties'); + } + + return imports; +} + +export function generatePreviewSystemProps(hasLabel: boolean): string[] { + const props: string[] = []; + + if (!hasLabel) { + props.push('/**'); + props.push(' * @deprecated Use class property instead'); + props.push(' */'); + props.push('className: string;'); + props.push('class: string;'); + props.push('style: string;'); + props.push('styleObject?: CSSProperties;'); + } + + return props; +} + +function isPropertyGroup(item: PropertyGroup | Property | SystemProperty): item is PropertyGroup { + return 'caption' in item && 'properties' in item; +} + +function isSystemProperty(item: Property | SystemProperty): item is SystemProperty { + return !('type' in item) && 'key' in item; +} \ No newline at end of file diff --git a/src/type-generator/types.ts b/src/type-generator/types.ts new file mode 100644 index 0000000..0398013 --- /dev/null +++ b/src/type-generator/types.ts @@ -0,0 +1,174 @@ +export interface WidgetDefinition { + id: string; + name: string; + description: string; + needsEntityContext?: boolean; + pluginWidget?: boolean; + offlineCapable?: boolean; + supportedPlatform?: 'All' | 'Native' | 'Web'; + properties: PropertyGroup[] | Property[]; +} + +export interface PropertyGroup { + caption: string; + properties: (Property | SystemProperty)[]; +} + +export interface Property { + key: string; + type: PropertyType; + caption: string; + description: string; + required?: boolean; + isList?: boolean; + defaultValue?: string; + attributeTypes?: AttributeType[]; + associationTypes?: AssociationType[]; + selectionTypes?: SelectionType[]; + enumerationValues?: EnumerationValue[]; + properties?: Property[]; + returnType?: ReturnType; + onChange?: string; + dataSource?: string; +} + +export interface SystemProperty { + key: SystemPropertyKey; + category?: string; +} + +export type PropertyType = + | 'action' + | 'association' + | 'attribute' + | 'boolean' + | 'datasource' + | 'decimal' + | 'entity' + | 'entityConstraint' + | 'enumeration' + | 'expression' + | 'file' + | 'form' + | 'icon' + | 'image' + | 'integer' + | 'microflow' + | 'nanoflow' + | 'object' + | 'selection' + | 'string' + | 'translatableString' + | 'textTemplate' + | 'widgets'; + +export type AttributeType = + | 'AutoNumber' + | 'Binary' + | 'Boolean' + | 'Currency' + | 'DateTime' + | 'Enum' + | 'Float' + | 'HashString' + | 'Integer' + | 'Long' + | 'String' + | 'Decimal'; + +export type AssociationType = 'Reference' | 'ReferenceSet'; + +export type SelectionType = 'None' | 'Single' | 'Multi'; + +export type SystemPropertyKey = + | 'Label' + | 'Name' + | 'TabIndex' + | 'Editability' + | 'Visibility'; + +export interface EnumerationValue { + key: string; + value: string; +} + +export interface ReturnType { + type: 'Void' | 'Boolean' | 'Integer' | 'Float' | 'DateTime' | 'String' | 'Object' | 'Decimal'; + isList?: boolean; +} + +export interface ParsedXMLWidget { + widget: { + id: string; + pluginWidget?: string; + needsEntityContext?: string; + offlineCapable?: string; + supportedPlatform?: string; + name: string; + description: string; + properties: ParsedXMLProperties; + }; +} + +export interface ParsedXMLProperties { + property?: ParsedXMLProperty | ParsedXMLProperty[]; + propertyGroup?: ParsedXMLPropertyGroup | ParsedXMLPropertyGroup[]; + systemProperty?: ParsedXMLSystemProperty | ParsedXMLSystemProperty[]; +} + +export interface ParsedXMLPropertyGroup { + caption: string; + property?: ParsedXMLProperty | ParsedXMLProperty[]; + systemProperty?: ParsedXMLSystemProperty | ParsedXMLSystemProperty[]; +} + +export interface ParsedXMLProperty { + key: string; + type: PropertyType; + required?: string; + isList?: string; + defaultValue?: string; + onChange?: string; + dataSource?: string; + caption: string; + description: string; + attributeTypes?: { + attributeType: ParsedXMLAttributeType | ParsedXMLAttributeType[]; + }; + associationTypes?: { + associationType: ParsedXMLAssociationType | ParsedXMLAssociationType[]; + }; + selectionTypes?: { + selectionType: ParsedXMLSelectionType | ParsedXMLSelectionType[]; + }; + enumerationValues?: { + enumerationValue: ParsedXMLEnumerationValue | ParsedXMLEnumerationValue[]; + }; + properties?: ParsedXMLProperties; + returnType?: { + type: string; + isList?: string; + }; +} + +export interface ParsedXMLSystemProperty { + key: SystemPropertyKey; + category?: string; +} + +export interface ParsedXMLAttributeType { + name: AttributeType; +} + +export interface ParsedXMLAssociationType { + name: AssociationType; +} + +export interface ParsedXMLSelectionType { + name: SelectionType; +} + +export interface ParsedXMLEnumerationValue { + _: string; + key: string; +} \ No newline at end of file diff --git a/src/type-generator/utils.ts b/src/type-generator/utils.ts new file mode 100644 index 0000000..bb67c80 --- /dev/null +++ b/src/type-generator/utils.ts @@ -0,0 +1,88 @@ +import type { + AttributeType, + Property, +} from './types'; +import type { GenerateTargetPlatform } from './mendix-types'; +import { mapPropertyToMendixType } from './mendix-types'; + +export function mapPropertyTypeToTS(property: Property, target?: GenerateTargetPlatform): string { + const mapping = mapPropertyToMendixType(property, target); + + return mapping.type; +} + +export function mapAttributeTypeToTS(attributeType: AttributeType): string { + switch (attributeType) { + case 'String': + case 'HashString': + case 'Enum': + return 'string'; + case 'Boolean': + return 'boolean'; + case 'Integer': + case 'Long': + case 'AutoNumber': + case 'Float': + case 'Currency': + case 'Decimal': + return 'number'; + + case 'DateTime': + return 'Date | string'; + + case 'Binary': + return 'Blob | string'; + + default: + return 'any'; + } +} + +export function mapReturnTypeToTS(returnType: string): string { + switch (returnType) { + case 'Void': + return 'void'; + case 'Boolean': + return 'boolean'; + case 'Integer': + case 'Float': + case 'Decimal': + return 'number'; + case 'DateTime': + return 'Date | string'; + case 'String': + return 'string'; + case 'Object': + return 'object'; + default: + return 'any'; + } +} + +export function ensureArray(value: T | T[] | undefined): T[] { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +} + +export function pascalCase(str: string): string { + return str + .split(/[-_\s]+/) + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(''); +} + +export function sanitizePropertyKey(key: string): string { + if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) { + return key; + } + return `'${key}'`; +} + +export function formatDescription(description: string): string { + return description + .trim() + .split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0) + .join(' '); +} \ No newline at end of file diff --git a/src/utils/getViteUserConfiguration.ts b/src/utils/getViteUserConfiguration.ts new file mode 100644 index 0000000..3483564 --- /dev/null +++ b/src/utils/getViteUserConfiguration.ts @@ -0,0 +1,17 @@ +import { PWTConfig, PWTConfigFn, PWTConfigFnPromise } from ".."; + +const getViteUserConfiguration = async (path: string): Promise => { + const getUserConfig = await import(`file://${path}`); + const getUserConfigFn: PWTConfigFn | PWTConfigFnPromise = getUserConfig.default; + const userConfig = getUserConfigFn(); + + if (userConfig instanceof Promise) { + const userConfigValue = await userConfig; + + return userConfigValue; + } + + return userConfig; +}; + +export default getViteUserConfiguration; \ No newline at end of file diff --git a/static/header.png b/static/header.png new file mode 100644 index 0000000..de85455 Binary files /dev/null and b/static/header.png differ diff --git a/tools/copy-widget-schema.js b/tools/copy-widget-schema.js new file mode 100644 index 0000000..9fafc2d --- /dev/null +++ b/tools/copy-widget-schema.js @@ -0,0 +1,20 @@ +const fs = require('fs'); +const path = require('path'); + +const sourcePath = path.join(__dirname, '..', 'node_modules', 'mendix', 'custom_widget.xsd'); +const targetPath = path.join(__dirname, '..', 'custom_widget.xsd'); + +try { + if (fs.existsSync(sourcePath)) { + fs.copyFileSync(sourcePath, targetPath); + + console.log('Successfully copied custom_widget.xsd to project root'); + } else { + console.warn('custom_widget.xsd not found in node_modules/mendix'); + console.warn('Make sure mendix package is installed'); + } +} catch (error) { + console.error('Failed to copy custom_widget.xsd:', error.message); + + process.exit(1); +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e52987c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "include": ["src/**/*"], + "exclude": ["node_modules"], + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["ESNext"], + "module": "preserve", + "moduleResolution": "bundler" + }, +} \ No newline at end of file