diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml index 98f883f47..4d10881f0 100644 --- a/.github/workflows/Build.yml +++ b/.github/workflows/Build.yml @@ -72,3 +72,9 @@ jobs: run: pnpm -r --filter='!native-widgets' --filter=$(if [ "${{ steps.files.outputs.global_files }}" = "" ] && ${{ github.event_name == 'pull_request' }}; then echo '...[origin/main]'; else echo '**'; fi) run build env: NODE_OPTIONS: --max_old_space_size=8192 + - name: "Validating manifest format" + run: pnpm run validate-manifest-format + - name: "Validating native dependencies" + run: pnpm run validate-native-dependencies + env: + CI_COMMIT_MESSAGE: ${{ github.event.head_commit.message || github.event.pull_request.title }} diff --git a/.husky/commit-msg b/.husky/commit-msg index 3b4299ef3..474570e59 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -2,3 +2,4 @@ . "$(dirname "$0")/_/husky.sh" npx --no -- commitlint --edit "$1" +pnpm run validate-native-dependencies "$1" diff --git a/configs/e2e/mendix-versions.json b/configs/e2e/mendix-versions.json index f29ceecd6..d7a50cf9b 100644 --- a/configs/e2e/mendix-versions.json +++ b/configs/e2e/mendix-versions.json @@ -1,3 +1,3 @@ { - "latest": "11.12.3" + "latest": "11.14.0" } diff --git a/configs/jsactions/rollup-plugin-collect-dependencies.mjs b/configs/jsactions/rollup-plugin-collect-dependencies.mjs index 0a0ca59f2..9c623a5ad 100644 --- a/configs/jsactions/rollup-plugin-collect-dependencies.mjs +++ b/configs/jsactions/rollup-plugin-collect-dependencies.mjs @@ -127,7 +127,13 @@ async function resolvePackage(target, sourceDir, optional = false) { } async function hasNativeCode(dir) { - return (await fg(["**/{android,ios}/*", "**/*.podspec"], { cwd: dir })).length > 0; + return (await fg( + ["**/{android,ios}/*", "**/*.podspec"], + { + cwd: dir, + ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**"] + } + )).length > 0; } async function getTransitiveDependencies(packagePath, isExternal) { @@ -187,7 +193,7 @@ export async function copyJsModule(moduleSourcePath, to) { // Skip certain directories if ( - relativePath.match(/[\\/](android|ios|windows|mac|jest|github|gradle|__.*__|docs|example.*)[\\/]/) + relativePath.match(/(^|[\\/])(android|ios|windows|mac|jest|github|gradle|__.*__|docs|example.*)([\\/]|$)/) ) { return false; } diff --git a/package.json b/package.json index 3165c6eb3..b29ae4d1c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "build-mpk": "ts-node --project ./scripts/tsconfig.json ./scripts/release/build-mpk.ts", "version": "ts-node --project ./scripts/tsconfig.json ./scripts/release/BumpVersion.ts", "validate-staged-widget-versions": "node scripts/validation/validate-versions-staged-files.js", + "validate-manifest-format": "node scripts/validation/validate-manifest-format.js", + "validate-native-dependencies": "node scripts/validation/validate-native-dependencies.js", "setup-mobile": "pnpm setup-android && pnpm setup-ios", "build:widgets": "node ./scripts/widget/buildWidgets.js", "test_widgets:maestro:ios": "bash maestro/run_maestro_widget_tests.sh ios", @@ -106,7 +108,7 @@ "react-native-gesture-handler@2.31.2": "patches/react-native-gesture-handler+2.31.2.patch", "react-native-slider@0.11.0": "patches/react-native-slider+0.11.0.patch", "react-native-snap-carousel@3.9.1": "patches/react-native-snap-carousel+3.9.1.patch", - "@mendix/pluggable-widgets-tools": "patches/@mendix__pluggable-widgets-tools.patch" + "@mendix/pluggable-widgets-tools@11.12.0": "patches/@mendix__pluggable-widgets-tools@11.12.0.patch" } }, "packageManager": "pnpm@10.32.0+sha512.9b2634bb3fed5601c33633f2d92593f506270a3963b8c51d2b2d6a828da615ce4e9deebef9614ccebbc13ac8d3c0f9c9ccceb583c69c8578436fa477dbb20d70" diff --git a/patches/@mendix__pluggable-widgets-tools.patch b/patches/@mendix__pluggable-widgets-tools@11.12.0.patch similarity index 84% rename from patches/@mendix__pluggable-widgets-tools.patch rename to patches/@mendix__pluggable-widgets-tools@11.12.0.patch index 6f88831f7..c7bfd744b 100644 --- a/patches/@mendix__pluggable-widgets-tools.patch +++ b/patches/@mendix__pluggable-widgets-tools@11.12.0.patch @@ -1,5 +1,5 @@ diff --git a/configs/rollup-plugin-collect-dependencies.mjs b/configs/rollup-plugin-collect-dependencies.mjs -index d45c737bf32cb1029249fdc069b3df3f832d1ab4..9246919bd939c622447ba0227c5b695892f162a8 100644 +index d45c737bf32cb1029249fdc069b3df3f832d1ab4..9f5ae6f6adf3e41220d897ba1aa074c7da458314 100644 --- a/configs/rollup-plugin-collect-dependencies.mjs +++ b/configs/rollup-plugin-collect-dependencies.mjs @@ -1,8 +1,7 @@ @@ -21,7 +21,22 @@ index d45c737bf32cb1029249fdc069b3df3f832d1ab4..9246919bd939c622447ba0227c5b6958 ); } } -@@ -169,14 +168,28 @@ async function copyJsModule(moduleSourcePath, to) { +@@ -125,7 +124,13 @@ async function resolvePackage(target, sourceDir, optional = false) { + } + + async function hasNativeCode(dir) { +- return (await fg(["**/{android,ios}/*", "**/*.podspec"], { cwd: dir })).length > 0; ++ return (await fg( ++ ["**/{android,ios}/*", "**/*.podspec"], ++ { ++ cwd: dir, ++ ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**"] ++ } ++ )).length > 0; + } + + async function getTransitiveDependencies(packagePath, isExternal) { +@@ -169,14 +174,28 @@ async function copyJsModule(moduleSourcePath, to) { if (existsSync(to)) { return; } @@ -45,7 +60,7 @@ index d45c737bf32cb1029249fdc069b3df3f832d1ab4..9246919bd939c622447ba0227c5b6958 + filter: src => { + const relativePath = src.replace(actualSourcePath, "").replace(/^[\\/]/, ""); + -+ if (relativePath.match(/[\\/](android|ios|windows|mac|jest|github|gradle|__.*__|docs|example.*)[\\/]/)) { ++ if (relativePath.match(/(^|[\\/])(android|ios|windows|mac|jest|github|gradle|__.*__|docs|example.*)([\\/]|$)/)) { + return false; + } + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f45195e7f..85cf54799 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,9 +30,9 @@ overrides: lodash: '>=4.18.0' patchedDependencies: - '@mendix/pluggable-widgets-tools': - hash: cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf - path: patches/@mendix__pluggable-widgets-tools.patch + '@mendix/pluggable-widgets-tools@11.12.0': + hash: 6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389 + path: patches/@mendix__pluggable-widgets-tools@11.12.0.patch react-native-gesture-handler@2.31.2: hash: 5be6c2cce8be6bd8afdbbf6c289d8b210686eafce0b41bf8cae2c29388aaa3b8 path: patches/react-native-gesture-handler+2.31.2.patch @@ -176,7 +176,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/querystringify': specifier: ^2.0.0 version: 2.0.2 @@ -213,7 +213,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) mendix: specifier: 11.8.0 version: 11.8.0 @@ -222,7 +222,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) concurrently: specifier: ^6.0.0 version: 6.5.1 @@ -244,7 +244,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/activity-indicator-native: dependencies: @@ -257,7 +257,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/animation-native: dependencies: @@ -273,7 +273,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/app-events-native: dependencies: @@ -289,7 +289,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/background-gradient-native: dependencies: @@ -302,7 +302,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/background-image-native: dependencies: @@ -315,7 +315,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/badge-native: dependencies: @@ -328,7 +328,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/bar-chart-native: dependencies: @@ -341,7 +341,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/barcode-scanner-native: dependencies: @@ -360,7 +360,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/bottom-sheet-native: dependencies: @@ -391,7 +391,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/react-native-actionsheet': specifier: ^2.4.1 version: 2.4.7 @@ -416,7 +416,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/react-native-snap-carousel': specifier: ^3.7.4 version: 3.8.12(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3)) @@ -444,7 +444,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/tinycolor2': specifier: ^1.4.1 version: 1.4.6 @@ -460,7 +460,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/feedback-native: dependencies: @@ -482,7 +482,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/querystringify': specifier: ^2.0.2 version: 2.0.2 @@ -501,7 +501,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/gallery-native: dependencies: @@ -517,7 +517,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/gallery-text-filter-native: dependencies: @@ -533,7 +533,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/image-native: dependencies: @@ -558,7 +558,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/intro-screen-native: dependencies: @@ -580,7 +580,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/line-chart-native: dependencies: @@ -593,7 +593,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/listview-swipe-native: dependencies: @@ -609,7 +609,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/maps-native: dependencies: @@ -631,7 +631,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/notifications-native: dependencies: @@ -650,7 +650,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/pie-doughnut-chart-native: dependencies: @@ -663,7 +663,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/popup-menu-native: dependencies: @@ -679,7 +679,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/react-native-material-menu': specifier: ^1.0.6 version: 1.0.10(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react@19.2.3) @@ -698,7 +698,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/progress-circle-native: dependencies: @@ -714,7 +714,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/qr-code-native: dependencies: @@ -733,7 +733,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/radio-buttons-native: dependencies: @@ -746,7 +746,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/range-slider-native: dependencies: @@ -762,7 +762,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/rating-native: dependencies: @@ -781,7 +781,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/react-native-star-rating': specifier: ^1.1.6 version: 1.1.6(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react@19.2.3) @@ -797,7 +797,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/safe-area-view-native: dependencies: @@ -816,7 +816,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/signature-native: dependencies: @@ -835,7 +835,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/slider-native: dependencies: @@ -851,7 +851,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/switch-native: dependencies: @@ -864,7 +864,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/toggle-buttons-native: dependencies: @@ -883,7 +883,7 @@ importers: version: 7.29.7(@babel/core@7.29.7) '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/pluggableWidgets/video-player-native: dependencies: @@ -902,7 +902,7 @@ importers: version: link:../../tools/piw-utils-internal '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) '@types/react-native-video': specifier: ^5.0.4 version: 5.0.21(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3)) @@ -921,13 +921,13 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) packages/tools/piw-native-utils-internal: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) rimraf: specifier: ^6.1.2 version: 6.1.3 @@ -936,7 +936,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.12.0 - version: 11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) + version: 11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1) rimraf: specifier: ^6.1.2 version: 6.1.3 @@ -9440,7 +9440,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mendix/pluggable-widgets-tools@11.12.0(patch_hash=cac90aed34fd19a0a6f1475c31d66a807c1e123ddf7116b44bf4b1f29ebe11bf)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1)': + '@mendix/pluggable-widgets-tools@11.12.0(patch_hash=6c126ccd843c0d2171a692235aff82990be64a7edbd70905cc90482bfd5c4389)(@jest/transform@30.3.0)(@jest/types@30.4.1)(@types/babel__core@7.20.5)(@types/node@20.19.41)(jest-util@30.4.1)(jiti@2.6.1)(picomatch@4.0.4)(react-dom@19.2.3(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tslib@2.8.1)': dependencies: '@babel/core': 7.29.7 '@babel/eslint-parser': 7.29.7(@babel/core@7.29.7)(eslint@9.39.4(jiti@2.6.1)) diff --git a/scripts/validation/validate-manifest-format.js b/scripts/validation/validate-manifest-format.js new file mode 100644 index 000000000..8ef340b23 --- /dev/null +++ b/scripts/validation/validate-manifest-format.js @@ -0,0 +1,107 @@ +const { readFileSync, existsSync, readdirSync } = require("fs"); +const { join } = require("path"); + +/** + * CI Check: Prevent Empty Manifest Objects + * + * Purpose: Ensure JS-only widgets don't emit empty {} manifests. + * Studio Pro's JSON parser uses MissingMemberHandling.Error with [JsonRequired], + * so an empty object would fail the entire manifest file parse. + * + * Expected behavior: + * - Widgets WITH native dependencies: emit {"nativeDependencies": {...}} + * - Widgets WITHOUT native dependencies: emit NO FILE at all + */ + +try { + validateManifestFormat(); +} catch (error) { + console.error(error); + process.exit(1); +} + +function validateManifestFormat() { + const violations = []; + const widgetsDir = join(process.cwd(), "packages/pluggableWidgets"); + + if (!existsSync(widgetsDir)) { + console.log("✅ No widgets directory found"); + return; + } + + const widgets = readdirSync(widgetsDir); + let checkedCount = 0; + + for (const widget of widgets) { + const manifestDir = join(widgetsDir, widget, "dist/tmp/widgets"); + + if (!existsSync(manifestDir)) continue; + + const files = readdirSync(manifestDir).filter(f => f.endsWith(".json") && f !== "package.json"); + + for (const file of files) { + checkedCount++; + const fullPath = join(manifestDir, file); + + try { + const content = readFileSync(fullPath, "utf-8"); + + // Check if file is empty (not even valid JSON) + if (!content.trim()) { + violations.push({ + widget, + file, + reason: "File is completely empty (not even valid JSON)" + }); + continue; + } + + const manifest = JSON.parse(content); + + // Check for empty manifest or empty nativeDependencies object + const isEmpty = + Object.keys(manifest).length === 0 || + (manifest.nativeDependencies && Object.keys(manifest.nativeDependencies).length === 0); + + if (isEmpty) { + violations.push({ + widget, + file, + reason: + Object.keys(manifest).length === 0 + ? "Manifest is completely empty: {}" + : "nativeDependencies object is empty: {}" + }); + } + } catch (error) { + // Invalid JSON is also a violation + violations.push({ + widget, + file, + reason: `Invalid JSON: ${error.message}` + }); + } + } + } + + if (violations.length > 0) { + console.error("\n❌ EMPTY MANIFEST VIOLATION DETECTED\n"); + console.error("The following widgets have empty manifest files:\n"); + + for (const violation of violations) { + console.error(` Widget: ${violation.widget}`); + console.error(` File: ${violation.file}`); + console.error(` Issue: ${violation.reason}\n`); + } + + console.error("⚠️ Empty manifests break Studio Pro's JSON parser!"); + console.error(" Expected behavior:"); + console.error(" - Widgets WITH native deps: emit {nativeDependencies: {...}}"); + console.error(" - Widgets WITHOUT native deps: emit NO FILE at all\n"); + console.error("This is a bug in the build tooling. Check writeNativeDependenciesJson().\n"); + + throw new Error("Manifest format validation failed"); + } + + console.log(`✅ All manifests valid (checked ${checkedCount} manifest files)`); +} diff --git a/scripts/validation/validate-native-dependencies.js b/scripts/validation/validate-native-dependencies.js new file mode 100644 index 000000000..dc9baccb4 --- /dev/null +++ b/scripts/validation/validate-native-dependencies.js @@ -0,0 +1,153 @@ +const { existsSync, readdirSync, readFileSync } = require("fs"); +const { join } = require("path"); +const { execSync } = require("child_process"); +const fg = require("fast-glob"); + +/** + * CI Check: Detect New Native Dependencies + * + * Purpose: Warn when a widget adds a new dependency that contains native code. + * This helps catch when developers accidentally add native dependencies, + * which forces customers to rebuild their mobile apps. + * + * How it works: + * - Compares package.json dependencies against previous commit (HEAD) + * - For any NEW dependencies, checks if they contain native code + * - Warns if the new dependency has ios/android folders + * + * Bypass: Include "NATIVE_DEPENDENCY_APPROVED" in the commit message. + */ + +try { + validateNativeDependencies(); +} catch (error) { + console.error(error); + process.exit(1); +} + +async function validateNativeDependencies() { + // Check for bypass approval + // In CI: read from environment variable + // In commit-msg hook: read from file path passed as argument + let commitMessage = process.env.CI_COMMIT_MESSAGE || ""; + + const commitMsgFile = process.argv[2]; // Path from commit-msg hook + if (commitMsgFile && existsSync(commitMsgFile)) { + commitMessage = readFileSync(commitMsgFile, "utf-8"); + } + + const isApproved = commitMessage.includes("NATIVE_DEPENDENCY_APPROVED"); + + if (isApproved) { + console.log("✅ Native dependency changes approved via commit message"); + return; + } + + const violations = []; + const widgetsDir = join(process.cwd(), "packages/pluggableWidgets"); + + if (!existsSync(widgetsDir)) { + console.log("✅ No widgets directory found"); + return; + } + + const widgets = readdirSync(widgetsDir); + let checkedCount = 0; + + for (const widget of widgets) { + const widgetPath = join(widgetsDir, widget); + const packageJsonPath = join(widgetPath, "package.json"); + + if (!existsSync(packageJsonPath)) continue; + + checkedCount++; + + try { + // Get current package.json + const currentPackageJson = require(packageJsonPath); + const currentDeps = { + ...currentPackageJson.dependencies, + ...currentPackageJson.peerDependencies + }; + + // Get previous package.json from git (HEAD) + let previousDeps = {}; + try { + const relativePath = join("packages/pluggableWidgets", widget, "package.json"); + const previousContent = execSync(`git show HEAD:${relativePath}`, { + encoding: "utf-8", + stdio: ["pipe", "pipe", "ignore"] + }); + const previousPackageJson = JSON.parse(previousContent); + previousDeps = { + ...previousPackageJson.dependencies, + ...previousPackageJson.peerDependencies + }; + } catch (error) { + // package.json doesn't exist in previous commit (new widget) + // We'll check all dependencies + } + + // Find NEW dependencies (in current but not in previous) + const newDeps = Object.keys(currentDeps).filter(dep => !previousDeps[dep]); + + if (newDeps.length === 0) continue; + + // Check each new dependency for native code + for (const depName of newDeps) { + const depPath = join(widgetPath, "node_modules", depName); + + if (!existsSync(depPath)) continue; + + const hasNative = await hasNativeCode(depPath); + + if (hasNative) { + violations.push({ + widget, + dependency: `${depName}@${currentDeps[depName]}`, + path: depPath + }); + } + } + } catch (error) { + console.warn(`⚠️ Could not check ${widget}: ${error.message}`); + } + } + + if (violations.length > 0) { + console.error("\n❌ NEW NATIVE DEPENDENCY DETECTED\n"); + console.error("The following widgets added dependencies with native code:\n"); + + for (const violation of violations) { + console.error(` Widget: ${violation.widget}`); + console.error(` New Dependency: ${violation.dependency}`); + console.error(` (Contains ios/android folders)\n`); + } + + console.error("⚠️ Adding native dependencies is a BREAKING CHANGE:"); + console.error(" - Forces customers to rebuild their mobile apps"); + console.error(" - Requires resubmission to App Store / Play Store"); + console.error(" - Can take days/weeks for customer deployment\n"); + console.error("To approve this change, include 'NATIVE_DEPENDENCY_APPROVED' in your commit message.\n"); + + throw new Error("Native dependency validation failed"); + } + + console.log(`✅ No new native dependencies detected (checked ${checkedCount} widgets)`); +} + +/** + * Check if a dependency contains native code + * Same logic as the patched hasNativeCode function + */ +async function hasNativeCode(dir) { + try { + const files = await fg(["**/{android,ios}/*", "**/*.podspec"], { + cwd: dir, + ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**"] + }); + return files.length > 0; + } catch (error) { + return false; + } +}