From bcd0db6eef38de78d9590abdd32ce61a0217fb3a Mon Sep 17 00:00:00 2001 From: Srirang Kalantri Date: Thu, 10 Sep 2026 16:03:02 +0530 Subject: [PATCH 1/4] fix: tighten native dependency detection --- configs/e2e/mendix-versions.json | 2 +- .../rollup-plugin-collect-dependencies.mjs | 8 +- package.json | 4 +- ...ix__pluggable-widgets-tools@11.12.0.patch} | 21 ++- pnpm-lock.yaml | 96 ++++++------ .../validation/validate-manifest-format.js | 107 +++++++++++++ .../validate-native-dependencies.js | 145 ++++++++++++++++++ 7 files changed, 329 insertions(+), 54 deletions(-) rename patches/{@mendix__pluggable-widgets-tools.patch => @mendix__pluggable-widgets-tools@11.12.0.patch} (84%) create mode 100644 scripts/validation/validate-manifest-format.js create mode 100644 scripts/validation/validate-native-dependencies.js 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..81931d81e 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) { 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..c47c64dff --- /dev/null +++ b/scripts/validation/validate-native-dependencies.js @@ -0,0 +1,145 @@ +const { existsSync, readdirSync } = 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 + const commitMessage = process.env.CI_COMMIT_MESSAGE || ""; + 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; + } +} From 7d9ccdfc16b95ce0093ca4857bc237715cf30642 Mon Sep 17 00:00:00 2001 From: Srirang Kalantri Date: Thu, 10 Sep 2026 16:21:01 +0530 Subject: [PATCH 2/4] chore: include scripts in CI --- .github/workflows/Build.yml | 6 ++++++ .husky/commit-msg | 1 + scripts/validation/validate-native-dependencies.js | 12 ++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) 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/scripts/validation/validate-native-dependencies.js b/scripts/validation/validate-native-dependencies.js index c47c64dff..dc9baccb4 100644 --- a/scripts/validation/validate-native-dependencies.js +++ b/scripts/validation/validate-native-dependencies.js @@ -1,4 +1,4 @@ -const { existsSync, readdirSync } = require("fs"); +const { existsSync, readdirSync, readFileSync } = require("fs"); const { join } = require("path"); const { execSync } = require("child_process"); const fg = require("fast-glob"); @@ -27,7 +27,15 @@ try { async function validateNativeDependencies() { // Check for bypass approval - const commitMessage = process.env.CI_COMMIT_MESSAGE || ""; + // 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) { From 61dd111851b3988e212bc8b109bae98a87a7b5d7 Mon Sep 17 00:00:00 2001 From: Srirang Kalantri Date: Fri, 11 Sep 2026 11:59:06 +0530 Subject: [PATCH 3/4] fix: remove unnecessary files from jsactions dependency --- configs/jsactions/rollup-plugin-collect-dependencies.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/jsactions/rollup-plugin-collect-dependencies.mjs b/configs/jsactions/rollup-plugin-collect-dependencies.mjs index 81931d81e..9c623a5ad 100644 --- a/configs/jsactions/rollup-plugin-collect-dependencies.mjs +++ b/configs/jsactions/rollup-plugin-collect-dependencies.mjs @@ -193,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; } From 0985c333947eab13e7d874561ec6866367efb2bc Mon Sep 17 00:00:00 2001 From: Srirang Kalantri Date: Tue, 15 Sep 2026 18:17:39 +0530 Subject: [PATCH 4/4] fix: validator scripts --- .github/workflows/Build.yml | 2 - .../rollup-plugin-collect-dependencies.mjs | 5 +- package.json | 4 +- ...-format.js => validate-manifest-format.ts} | 23 +++-- ...ies.js => validate-native-dependencies.ts} | 83 +++++++++++++------ 5 files changed, 79 insertions(+), 38 deletions(-) rename scripts/validation/{validate-manifest-format.js => validate-manifest-format.ts} (87%) rename scripts/validation/{validate-native-dependencies.js => validate-native-dependencies.ts} (63%) diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml index 4d10881f0..0f5825c58 100644 --- a/.github/workflows/Build.yml +++ b/.github/workflows/Build.yml @@ -76,5 +76,3 @@ jobs: 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/configs/jsactions/rollup-plugin-collect-dependencies.mjs b/configs/jsactions/rollup-plugin-collect-dependencies.mjs index 9c623a5ad..b51714042 100644 --- a/configs/jsactions/rollup-plugin-collect-dependencies.mjs +++ b/configs/jsactions/rollup-plugin-collect-dependencies.mjs @@ -131,7 +131,8 @@ async function hasNativeCode(dir) { ["**/{android,ios}/*", "**/*.podspec"], { cwd: dir, - ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**"] + ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**", "**/.github/**"], + caseSensitiveMatch: false } )).length > 0; } @@ -193,7 +194,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.*)([\\/]|$)/i) ) { return false; } diff --git a/package.json b/package.json index b29ae4d1c..38e497f34 100644 --- a/package.json +++ b/package.json @@ -30,8 +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", + "validate-manifest-format": "node --experimental-strip-types scripts/validation/validate-manifest-format.ts", + "validate-native-dependencies": "node --experimental-strip-types scripts/validation/validate-native-dependencies.ts", "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", diff --git a/scripts/validation/validate-manifest-format.js b/scripts/validation/validate-manifest-format.ts similarity index 87% rename from scripts/validation/validate-manifest-format.js rename to scripts/validation/validate-manifest-format.ts index 8ef340b23..83f1d0a8c 100644 --- a/scripts/validation/validate-manifest-format.js +++ b/scripts/validation/validate-manifest-format.ts @@ -1,5 +1,5 @@ -const { readFileSync, existsSync, readdirSync } = require("fs"); -const { join } = require("path"); +import { readFileSync, existsSync, readdirSync } from "fs"; +import { join } from "path"; /** * CI Check: Prevent Empty Manifest Objects @@ -13,6 +13,17 @@ const { join } = require("path"); * - Widgets WITHOUT native dependencies: emit NO FILE at all */ +interface Manifest { + nativeDependencies?: Record; + [key: string]: unknown; +} + +interface Violation { + widget: string; + file: string; + reason: string; +} + try { validateManifestFormat(); } catch (error) { @@ -20,8 +31,8 @@ try { process.exit(1); } -function validateManifestFormat() { - const violations = []; +function validateManifestFormat(): void { + const violations: Violation[] = []; const widgetsDir = join(process.cwd(), "packages/pluggableWidgets"); if (!existsSync(widgetsDir)) { @@ -56,7 +67,7 @@ function validateManifestFormat() { continue; } - const manifest = JSON.parse(content); + const manifest: Manifest = JSON.parse(content); // Check for empty manifest or empty nativeDependencies object const isEmpty = @@ -78,7 +89,7 @@ function validateManifestFormat() { violations.push({ widget, file, - reason: `Invalid JSON: ${error.message}` + reason: `Invalid JSON: ${error instanceof Error ? error.message : String(error)}` }); } } diff --git a/scripts/validation/validate-native-dependencies.js b/scripts/validation/validate-native-dependencies.ts similarity index 63% rename from scripts/validation/validate-native-dependencies.js rename to scripts/validation/validate-native-dependencies.ts index dc9baccb4..ab794596e 100644 --- a/scripts/validation/validate-native-dependencies.js +++ b/scripts/validation/validate-native-dependencies.ts @@ -1,7 +1,7 @@ -const { existsSync, readdirSync, readFileSync } = require("fs"); -const { join } = require("path"); -const { execSync } = require("child_process"); -const fg = require("fast-glob"); +import { existsSync, readdirSync, readFileSync } from "fs"; +import { join } from "path"; +import { execSync } from "child_process"; +import * as fg from "fast-glob"; /** * CI Check: Detect New Native Dependencies @@ -11,39 +11,68 @@ const fg = require("fast-glob"); * which forces customers to rebuild their mobile apps. * * How it works: - * - Compares package.json dependencies against previous commit (HEAD) + * - Compares package.json dependencies against parent 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. */ +interface PackageJson { + dependencies?: Record; + peerDependencies?: Record; +} + +interface Violation { + widget: string; + dependency: string; + path: string; +} + try { - validateNativeDependencies(); + await validateNativeDependencies(); } catch (error) { console.error(error); process.exit(1); } -async function validateNativeDependencies() { +async function validateNativeDependencies(): Promise { // 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 || ""; + let isApproved = false; - const commitMsgFile = process.argv[2]; // Path from commit-msg hook + // In commit-msg hook: read from file path passed as argument + const commitMsgFile = process.argv[2]; if (commitMsgFile && existsSync(commitMsgFile)) { - commitMessage = readFileSync(commitMsgFile, "utf-8"); + const commitMessage = readFileSync(commitMsgFile, "utf-8"); + isApproved = commitMessage.includes("NATIVE_DEPENDENCY_APPROVED"); + } else { + // In CI: check all commits between HEAD^ and HEAD + try { + const commitMessages = execSync("git log HEAD^..HEAD --format=%B", { + encoding: "utf-8", + stdio: ["pipe", "pipe", "ignore"] + }); + isApproved = commitMessages.includes("NATIVE_DEPENDENCY_APPROVED"); + } catch (error) { + // If git log fails (e.g., no parent commit), fall back to checking HEAD only + try { + const commitMessage = execSync("git log -1 --format=%B", { + encoding: "utf-8", + stdio: ["pipe", "pipe", "ignore"] + }); + isApproved = commitMessage.includes("NATIVE_DEPENDENCY_APPROVED"); + } catch (fallbackError) { + // If even that fails, continue with validation + } + } } - const isApproved = commitMessage.includes("NATIVE_DEPENDENCY_APPROVED"); - if (isApproved) { console.log("✅ Native dependency changes approved via commit message"); return; } - const violations = []; + const violations: Violation[] = []; const widgetsDir = join(process.cwd(), "packages/pluggableWidgets"); if (!existsSync(widgetsDir)) { @@ -64,21 +93,22 @@ async function validateNativeDependencies() { try { // Get current package.json - const currentPackageJson = require(packageJsonPath); - const currentDeps = { + const currentPackageJson: PackageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); + const currentDeps: Record = { ...currentPackageJson.dependencies, ...currentPackageJson.peerDependencies }; - // Get previous package.json from git (HEAD) - let previousDeps = {}; + // Get previous package.json from git (HEAD^) + let previousDeps: Record = {}; try { - const relativePath = join("packages/pluggableWidgets", widget, "package.json"); - const previousContent = execSync(`git show HEAD:${relativePath}`, { + // Git always uses forward slashes, even on Windows + const relativePath = join("packages/pluggableWidgets", widget, "package.json").replace(/\\/g, "/"); + const previousContent = execSync(`git show HEAD^:${relativePath}`, { encoding: "utf-8", stdio: ["pipe", "pipe", "ignore"] }); - const previousPackageJson = JSON.parse(previousContent); + const previousPackageJson: PackageJson = JSON.parse(previousContent); previousDeps = { ...previousPackageJson.dependencies, ...previousPackageJson.peerDependencies @@ -110,7 +140,7 @@ async function validateNativeDependencies() { } } } catch (error) { - console.warn(`⚠️ Could not check ${widget}: ${error.message}`); + console.warn(`⚠️ Could not check ${widget}: ${error instanceof Error ? error.message : String(error)}`); } } @@ -140,11 +170,12 @@ async function validateNativeDependencies() { * Check if a dependency contains native code * Same logic as the patched hasNativeCode function */ -async function hasNativeCode(dir) { +async function hasNativeCode(dir: string): Promise { try { - const files = await fg(["**/{android,ios}/*", "**/*.podspec"], { + const files = await fg.default(["**/{android,ios}/*", "**/*.podspec"], { cwd: dir, - ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**"] + ignore: ["**/example*/**", "**/__tests__/**", "**/docs/**", "**/.github/**"], + caseSensitiveMatch: false }); return files.length > 0; } catch (error) {