diff --git a/.github/workflows/CreateGWRelease.yml b/.github/workflows/CreateGWRelease.yml deleted file mode 100644 index 3bacfb00..00000000 --- a/.github/workflows/CreateGWRelease.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Create GitHub release of GW - -# This workflow for generator-widget: -# 1. Puts current version from package.json as the version for unreleased changes in CHANGELOG.md -# 2. Commits the updates of CHANGELOG.md and pushes the commit to the repo -# 3. Based on the commit it: -# 3.1 Creates a draft GitHub release for GW. -# 3.2 Creates a merge request that targets CHANGELOG.md updates back to master. -# -# NOTE: Publishing to npm doesn't happen in this workflow. PublishNpm.yml is responsible fot npm publishing. -# When the GitHub release is approved, that creates a corresponding git tag to trigger PublishNpm.yml. - -on: workflow_dispatch - -jobs: - release: - name: "Create GitHub release and changelogs MR of GW" - runs-on: ubuntu-latest - - steps: - - name: "Checking-out code" - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2 - with: - submodules: false - - - name: Setup pnpm - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda #v4.1.0 - - - name: "Defining node version" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version-file: ".nvmrc" - cache: 'pnpm' - - - name: "Installing dependencies" - run: pnpm install - - - name: "Creating GW release and MR" - run: "pnpm --dir packages/release-tools run release:gw" - env: - GH_USERNAME: ${{ secrets.GH_USERNAME }} - GH_EMAIL: ${{ secrets.GH_EMAIL }} - GH_NAME: ${{ secrets.GH_NAME }} - GH_PAT: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/CreatePWTRelease.yml b/.github/workflows/CreateGithubRelease.yml similarity index 75% rename from .github/workflows/CreatePWTRelease.yml rename to .github/workflows/CreateGithubRelease.yml index aa3d6fef..a1fa95f7 100644 --- a/.github/workflows/CreatePWTRelease.yml +++ b/.github/workflows/CreateGithubRelease.yml @@ -1,4 +1,4 @@ -name: Create GitHub release of PWT +name: Create GitHub release # This workflow for pluggable-widgets-tools: # 1. Puts current version from package.json as the version for unreleased changes in CHANGELOG.md @@ -10,11 +10,20 @@ name: Create GitHub release of PWT # NOTE: Publishing to npm doesn't happen in this workflow. PublishNpm.yml is responsible fot npm publishing. # When the GitHub release is approved, that creates a corresponding git tag to trigger PublishNpm.yml. -on: workflow_dispatch +on: + workflow_dispatch: + inputs: + package_name: + description: Package to create release for + required: true + type: choice + options: + - pluggable-widgets-tools + - generator-widget jobs: release: - name: "Create GitHub release and changelogs MR of PWT" + name: "Create GitHub release and changelogs MR" runs-on: ubuntu-latest steps: @@ -35,8 +44,8 @@ jobs: - name: "Installing dependencies" run: pnpm install - - name: "Creating PWT release and MR" - run: "pnpm --dir packages/release-tools run release:pwt" + - name: "Creating Github release and MR" + run: pnpm exec create-release ${{ inputs.package_name }} $GITHUB_REF_NAME env: GH_USERNAME: ${{ secrets.GH_USERNAME }} GH_EMAIL: ${{ secrets.GH_EMAIL }} diff --git a/.github/workflows/ShaCheck.yml b/.github/workflows/ShaCheck.yml index b3446feb..6d08dd1f 100644 --- a/.github/workflows/ShaCheck.yml +++ b/.github/workflows/ShaCheck.yml @@ -2,9 +2,13 @@ name: Ensure SHA pinned actions on: push: - branches: [master] + branches: + - 'master' + - 'version/*' pull_request: - branches: [master] + branches: + - 'master' + - 'version/*' jobs: harden_security: diff --git a/.github/workflows/TestPWTCommands.yml b/.github/workflows/TestPWTCommands.yml index 13deb0f1..ca5010f6 100644 --- a/.github/workflows/TestPWTCommands.yml +++ b/.github/workflows/TestPWTCommands.yml @@ -3,7 +3,8 @@ name: Script tests on: push: branches: - - master + - 'master' + - 'version/*' paths: - 'pnpm-lock.yaml' - 'packages/generator-widget/**' @@ -11,7 +12,8 @@ on: - 'packages/command-tests/**' pull_request: branches: - - master + - 'master' + - 'version/*' paths: - 'pnpm-lock.yaml' - 'packages/generator-widget/**' @@ -20,11 +22,10 @@ on: jobs: test: - name: "Script tests (Node ${{ matrix.node }}, ${{ matrix.os }})" + name: "Script tests (${{ matrix.os }})" runs-on: ${{ matrix.os }} strategy: matrix: - node: [20] os: [windows-latest, ubuntu-latest] steps: - name: "Checking-out code" diff --git a/.github/workflows/UnitTests.yml b/.github/workflows/UnitTests.yml index 094da009..ba4fedd3 100644 --- a/.github/workflows/UnitTests.yml +++ b/.github/workflows/UnitTests.yml @@ -2,12 +2,16 @@ name: Run unit tests on: push: - branches: [master] + branches: + - 'master' + - 'version/*' paths: - 'pnpm-lock.yaml' - 'packages/**' pull_request: - branches: [master] + branches: + - 'master' + - 'version/*' paths: - 'pnpm-lock.yaml' - 'packages/**' @@ -40,3 +44,18 @@ jobs: - name: "Linting packages" run: pnpm lint + + - name: "Linting changelogs" + run: | + failures=0 + for changelog in $(find . -type f -name CHANGELOG.md -mindepth 3 -maxdepth 3); do + echo "Parsing $changelog" + if pnpm exec changelog-parser parse $changelog; then + : + else + : $((failures++)) + fi + done + if [[ $failures -gt 0 ]]; then + exit 1; + fi diff --git a/.nvmrc b/.nvmrc index ccc4c6c7..c9471194 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.20.2 +22.23.2 diff --git a/eslint.config.js b/eslint.config.js index 279de296..a7c988f8 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,7 +8,8 @@ import prettierRecommended from "eslint-plugin-prettier/recommended"; export default defineConfig( globalIgnores([ "packages/generator-widget/generators/app/templates/**", - "packages/pluggable-widgets-tools/dist/**" + "packages/pluggable-widgets-tools/dist/**", + "packages/release-tools/utils/changelog-parser/changelog.*" ]), { files: ["**/*.js", "**/*.mjs"], diff --git a/package.json b/package.json index 31903fd2..5e091b33 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "widgets-tools", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "private": "true", "type": "module", @@ -17,6 +17,7 @@ }, "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800", "devDependencies": { + "@mendix/release-tools": "workspace:*", "@eslint/js": "^10.0.1", "@prettier/plugin-xml": "^3.4.2", "@typescript-eslint/eslint-plugin": "^8.59.0", diff --git a/packages/command-tests/commands.js b/packages/command-tests/commands.js index adfeeeb0..a77f73df 100644 --- a/packages/command-tests/commands.js +++ b/packages/command-tests/commands.js @@ -193,9 +193,6 @@ async function main() { widgetPackageJson = await readJson(join(workDir, "package.json")); widgetPackageJson.devDependencies["@mendix/pluggable-widgets-tools"] = toolsPackagePath; - // Adds compatibility to new React 18 and React native 0.72 - fixPackageJson(widgetPackageJson); - await writeJson(join(workDir, "package.json"), widgetPackageJson); await execAsync("npm install --loglevel=error", workDir, logger); @@ -399,25 +396,3 @@ async function execFailedAsync(command, workDir) { } throw new Error(`Expected '${command}' to fail, but it didn't!`); } - -function fixPackageJson(json) { - const devDependencies = { - "@types/jest": "^29.0.0", - "@types/react": "^19.0.0", - "@types/react-native": "0.78.2", - "@types/react-dom": "^19.0.0", - "@types/react-test-renderer": "~18.0.0" - }; - const overrides = { - react: "^19.0.0", - "react-dom": "^19.0.0", - "react-native": "0.78.2" - }; - - Object.keys(devDependencies) - .filter(dep => !!json.devDependencies[dep]) - .forEach(dep => (json.devDependencies[dep] = devDependencies[dep])); - - json.overrides = overrides; - json.resolutions = overrides; -} diff --git a/packages/command-tests/package.json b/packages/command-tests/package.json index 74edf49c..3dd153bb 100644 --- a/packages/command-tests/package.json +++ b/packages/command-tests/package.json @@ -13,7 +13,7 @@ "@mendix/pluggable-widgets-tools": "workspace:*", "@prettier/plugin-xml": "^2.2.0", "@types/jest-image-snapshot": "^4.3.1", - "@types/node": "^20.14.8", + "@types/node": "^22.18.0", "@types/shelljs": "^0.10.0", "@types/xml2js": "^0.4.5", "async-mutex": "^0.5.0", diff --git a/packages/generator-widget/CHANGELOG.md b/packages/generator-widget/CHANGELOG.md index 2aa2b3cf..eb1c7e35 100644 --- a/packages/generator-widget/CHANGELOG.md +++ b/packages/generator-widget/CHANGELOG.md @@ -9,25 +9,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Changed - We cleaned up a template with unused imports. - -## [11.11.0] - 2026-06-04 - -### Changed +- We increased the minimum node version to 22. - We updated the version of cypress when e2e tests are generated. - We renamed the initial e2e tests so they match cypress' default specPattern. -## [11.6.0] - 2026-03-04 - -### Changed - -- We upgraded React to version 19 and React Native to version 0.78.2 for generated widgets. - -## [11.3.1] - 2026-02-04 - -### Changed - - We migrated the generated unit tests to use React Testing Library instead of enzyme. - We changed the copyright prompt to prefill the current year. diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js-unit.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js-unit.json index 08cffe5c..618cf5d4 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js-unit.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js-unit.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -27,19 +27,19 @@ "output": "./dist/testresults/TESTS-Jest.xml" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0" + "@mendix/pluggable-widgets-tools": "^10.24.1" }, "dependencies": { }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "~0.77.3" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "~0.77.3" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js.json index 4bd5d7b6..0477eccb 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-js.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -22,19 +22,19 @@ "release": "pluggable-widgets-tools release:native" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0" + "@mendix/pluggable-widgets-tools": "^10.24.1" }, "dependencies": { }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "~0.77.3" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "~0.77.3" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts-unit.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts-unit.json index 3e038020..02920d88 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts-unit.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts-unit.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -27,7 +27,7 @@ "output": "./dist/testresults/TESTS-Jest.xml" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2", "@types/jest": "^30.0.0" }, @@ -35,17 +35,17 @@ }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "react-native": "~0.77.3" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "react-native": "~0.77.3" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts.json index 6155da66..f0ade70b 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_native.json-ts.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -22,24 +22,24 @@ "release": "pluggable-widgets-tools release:native" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2" }, "dependencies": { }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "react-native": "~0.77.3" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "react-native": "~0.77.3" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-e2e.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-e2e.json index 0a77cae6..4decbbe4 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-e2e.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-e2e.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -26,18 +26,18 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "cypress": "^15.15.0" }, "dependencies": { "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit-e2e.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit-e2e.json index 49c37938..599f7d07 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit-e2e.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit-e2e.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -28,18 +28,18 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "cypress": "^15.15.0" }, "dependencies": { "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit.json index d1d80190..2d56ef2d 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js-unit.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -27,17 +27,17 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0" + "@mendix/pluggable-widgets-tools": "^10.24.1" }, "dependencies": { "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js.json index 4b2b2132..3ccad369 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-js.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -25,17 +25,17 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0" + "@mendix/pluggable-widgets-tools": "^10.24.1" }, "dependencies": { "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-e2e.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-e2e.json index 761cf8d1..c89d5136 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-e2e.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-e2e.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -26,7 +26,7 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2", "@types/jasmine": "^3.6.9", "cypress": "^15.15.0" @@ -35,15 +35,15 @@ "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit-e2e.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit-e2e.json index 22a6ff61..e190b07a 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit-e2e.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit-e2e.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -28,7 +28,7 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2", "@types/jasmine": "^3.6.9", "@types/jest": "^30.0.0", @@ -38,15 +38,15 @@ "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit.json index b1d7c49f..7d5c7715 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts-unit.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -27,7 +27,7 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2", "@types/jest": "^30.0.0" }, @@ -35,15 +35,15 @@ "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts.json b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts.json index f81db78d..6435315a 100644 --- a/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts.json +++ b/packages/generator-widget/generators/app/templates/packages/__tests__/outputs/package_web.json-ts.json @@ -6,7 +6,7 @@ "copyright": "Mendix 2023", "author": "Jest", "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": "Apache-2.0", "config": { @@ -25,22 +25,22 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0", + "@mendix/pluggable-widgets-tools": "^10.24.1", "@types/big.js": "^6.0.2" }, "dependencies": { "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0" } } diff --git a/packages/generator-widget/generators/app/templates/packages/package_native.json.ejs b/packages/generator-widget/generators/app/templates/packages/package_native.json.ejs index d6e15df1..6d6dc7da 100644 --- a/packages/generator-widget/generators/app/templates/packages/package_native.json.ejs +++ b/packages/generator-widget/generators/app/templates/packages/package_native.json.ejs @@ -6,7 +6,7 @@ "copyright": <%- JSON.stringify(copyright) %>, "author": <%- JSON.stringify(author) %>, "engines": { - "node": ">=20" + "node": "^22.18.0" }, "license": <%- JSON.stringify(license) %>, "config": { @@ -27,7 +27,7 @@ "output": "./dist/testresults/TESTS-Jest.xml" },<% } %> "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0"<% if (isLanguageTS) { %>, + "@mendix/pluggable-widgets-tools": "^10.24.1"<% if (isLanguageTS) { %>, "@types/big.js": "^6.0.2"<% if (hasUnitTests) { %>, "@types/jest": "^30.0.0"<% } %><% } %> }, @@ -35,17 +35,17 @@ }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0",<% if (isLanguageTS) { %> - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0",<% } %> - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0",<% if (isLanguageTS) { %> + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0",<% } %> + "react-native": "~0.77.3" }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0",<% if (isLanguageTS) { %> - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0",<% } %> - "react-native": "~0.78.2" + "react": "^18.2.0", + "react-dom": "^18.2.0",<% if (isLanguageTS) { %> + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0",<% } %> + "react-native": "~0.77.3" } } diff --git a/packages/generator-widget/generators/app/templates/packages/package_web.json.ejs b/packages/generator-widget/generators/app/templates/packages/package_web.json.ejs index a303a1b3..717a0369 100644 --- a/packages/generator-widget/generators/app/templates/packages/package_web.json.ejs +++ b/packages/generator-widget/generators/app/templates/packages/package_web.json.ejs @@ -6,7 +6,7 @@ "copyright": <%- JSON.stringify(copyright) %>, "author": <%- JSON.stringify(author) %>, "engines": { - "node": ">=16" + "node": "^22.18.0" }, "license": <%- JSON.stringify(license) %>, "config": { @@ -28,7 +28,7 @@ "release": "pluggable-widgets-tools release:web" }, "devDependencies": { - "@mendix/pluggable-widgets-tools": "^11.11.0"<% if (isLanguageTS) { %>, + "@mendix/pluggable-widgets-tools": "^10.24.1"<% if (isLanguageTS) { %>, "@types/big.js": "^6.0.2"<% if (hasE2eTests) { %>, "@types/jasmine": "^3.6.9"<% } %><% if (hasUnitTests) { %>, "@types/jest": "^30.0.0"<% } %><% } %><% if (hasE2eTests) { %>, @@ -38,15 +38,15 @@ "classnames": "^2.5.1" }, "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0"<% if (isLanguageTS) { %>, - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0"<% } %> + "react": "^18.2.0", + "react-dom": "^18.2.0"<% if (isLanguageTS) { %>, + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0"<% } %> }, "overrides": { - "react": "^19.0.0", - "react-dom": "^19.0.0"<% if (isLanguageTS) { %>, - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0"<% } %> + "react": "^18.2.0", + "react-dom": "^18.2.0"<% if (isLanguageTS) { %>, + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0"<% } %> } } diff --git a/packages/generator-widget/package.json b/packages/generator-widget/package.json index 13d09874..6e0e9493 100644 --- a/packages/generator-widget/package.json +++ b/packages/generator-widget/package.json @@ -1,15 +1,16 @@ { "name": "@mendix/generator-widget", - "version": "11.11.0", + "version": "10.24.1", "description": "Mendix Pluggable Widgets Generator", "type": "module", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "bin": "./bin.js", "main": "generators/app/index.js", "scripts": { - "test": "jest --config ./jest.config.js" + "test": "jest --config ./jest.config.js", + "lint:changelog": "../release-tools/utils/changelog-parser/cli.ts parse ./CHANGELOG.md" }, "files": [ "generators" diff --git a/packages/pluggable-widgets-tools/CHANGELOG.md b/packages/pluggable-widgets-tools/CHANGELOG.md index f26e8e40..af74dec5 100644 --- a/packages/pluggable-widgets-tools/CHANGELOG.md +++ b/packages/pluggable-widgets-tools/CHANGELOG.md @@ -10,83 +10,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - We fixed an issue with the Jest configuration affecting unit tests for widgets importing enums from the mendix package (e.g. ValueStatus, FormatterType). It would cause tests to fail with the error "This package should not be used in the runtime". -## [11.12.0] - 2026-06-30 +- We added the `audit` command. It will scan the dependencies of pluggable-widgets-tools for vulnerable packages and suggest overrides. Currently only npm is supported. ### Changed +- We increased the minimum node version to 22. + - We replaced `ts-jest` with `@swc/jest` as the Jest transform (3–5× faster for TSX-heavy test suites) and switched the test runner from `jest-jasmine2` to `jest-circus`. - **Breaking:** The `jest-jasmine2` runner has been removed. Tests using Jasmine-specific globals (`jasmine.createSpy()`, `jasmine.objectContaining()`, etc.) will throw `ReferenceError: jasmine is not defined`. Replace with Jest equivalents: `jest.fn()`, `expect.objectContaining()`. - **Breaking:** Consumers who extended the base config with `globals['ts-jest']` options must migrate those settings to the `@swc/jest` transform config. -### Fixed - -- We fixed an issue on Windows where the generated `.mpk` was missing the widget's `.xml` files and icon/tile PNGs. - -- We fixed an error thrown by the `audit` command on windows. It would fail when looking up available versions for vulnerable packages. - -- We updated the type generator to format types according to prettier. Inconsistencies would block the `release` command. - -## [11.11.0] - 2026-06-04 - -### Added - -- We added support for the `allowUpload` attribute on image properties in native widgets, generating `EditableImageValue` when enabled, introduced in Mendix 11.11. - -- We added support for single object datasource properties, introduced in Mendix 11.11. - -- We added the `audit` command. It will scan the dependencies of pluggable-widgets-tools for vulnerable packages and suggest overrides. Currently only npm is supported. - -### Changed - - We changed the order of imports in generated widget prop types to match that of the eslint sort-imports rule. - We silenced the Sass legacy JS API deprecation warning that appeared during widget bundling. - We updated outdated and vulnerable dependencies. This required major upgrades of several dependencies, including eslint@9, jest@30, and rollup@4. -## [11.8.1] - 2026-03-16 - -### Fixed - -- We fixed the bundling of Javascript widgets which broke in 11.6.0 after migrating to [React 17's JSX Transform](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#how-to-upgrade-to-the-new-jsx-transform). (Ticket 270777) - -## [11.8.0] - 2026-03-06 - -### Added - -- We added support for editable image and file properties, introduced in Mendix 11.8. - -### Changed +- **Breaking:** We removed Enzyme testing library and associated dependencies from pluggable-widgets-tools. Tests using Enzyme should be updated to use React Testing Library. See the [migration guide](https://testing-library.com/docs/react-testing-library/migrate-from-enzyme) for more information. The `test:unit:web:enzyme-free` command has been removed; use `test:unit:web` instead. -- We updated the Mendix package to 11.8. - -## [11.6.0] - 2026-03-04 - -### Changed - -- We upgraded the Pluggable Widgets Tools to React 19 and React Native 0.78.2. After installation upgrade all dependencies by running `npm run build`. - -- We updated the Mendix package to 11.6. - -## [11.3.1] - 2026-02-04 - -### Breaking changes +- We fixed an issue where `require` was not transformed to `import` for the `es` output format which could result in an error when the widget was used in a project with React client enabled. -- We removed Enzyme testing library and associated dependencies from pluggable-widgets-tools. Tests using Enzyme should be updated to use React Testing Library. See the [migration guide](https://testing-library.com/docs/react-testing-library/migrate-from-enzyme) for more information. The `test:unit:web:enzyme-free` command has been removed; use `test:unit:web` instead. +- We now enforce the same validation for the `widgetName` in the widget bundler as we do in the generator. Validation is now also enforced for the organization name (`packagePath`). -### Changed +- We added @d11/react-native-fast-image as an external native dependency in rollup config. -- We fixed an issue where `require` was not transformed to `import` for the `es` output format which could result in an error when the widget was used in a project with React client enabled. +### Fixed -- We now enforce the same validation for the `widgetName` in the widget bundler as we do in the generator. Validation is now also enforced for the organization name (`packagePath`). +- We fixed an issue on Windows where the generated `.mpk` was missing the widget's `.xml` files and icon/tile PNGs. -## [11.3.0] - 2025-11-12 +- We fixed an error thrown by the `audit` command on windows. It would fail when looking up available versions for vulnerable packages. -### Changed +- We updated the type generator to format types according to prettier. Inconsistencies would block the `release` command. -- We added @d11/react-native-fast-image as an external native dependency in rollup config. +- We fixed the bundling of Javascript widgets which broke in 11.6.0 after migrating to [React 17's JSX Transform](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#how-to-upgrade-to-the-new-jsx-transform). (Ticket 270777) ## [10.24.0] - 2025-09-24 diff --git a/packages/pluggable-widgets-tools/package.json b/packages/pluggable-widgets-tools/package.json index 7e54af75..0d700d63 100644 --- a/packages/pluggable-widgets-tools/package.json +++ b/packages/pluggable-widgets-tools/package.json @@ -1,9 +1,9 @@ { "name": "@mendix/pluggable-widgets-tools", - "version": "11.12.0", + "version": "10.24.1", "description": "Mendix Pluggable Widgets Tools", "engines": { - "node": ">=20" + "node": "^22.18.0" }, "main": "dist/index.js", "types": "dist/index.d.ts", @@ -11,6 +11,7 @@ "pluggable-widgets-tools": "bin/mx-scripts.js" }, "scripts": { + "lint:changelog": "../release-tools/utils/changelog-parser/cli.ts parse ./CHANGELOG.md", "prepack": "shx rm -rf dist && tsc", "typecheck:test-config": "tsc -p test-config/tsconfig.json", "test": "pnpm typecheck:test-config && jest" @@ -50,8 +51,8 @@ "@testing-library/react": "^16.3.2", "@testing-library/react-native": "^13.3.3", "@testing-library/user-event": "^14.6.1", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/semver": "^7.7.1", "@types/testing-library__jest-dom": "^5.14.5", "@typescript-eslint/eslint-plugin": "^8.59.0", @@ -78,13 +79,13 @@ "jest-jasmine2": "~30.3.0", "jest-junit": "^17.0.0", "make-dir": "^5.1.0", - "mendix": "^11.8.0", + "mendix": "^10.24.73019", "mime": "^4.1.0", "postcss": "^8.5.10", "postcss-import": "^14.0.2", "postcss-url": "^10.1.4", "prettier": "^2.5.1", - "react-test-renderer": "^19.2.5", + "react-test-renderer": "^18.3.1", "recursive-copy": "^2.0.11", "resolve": "^1.22.12", "rollup": "^4.60.2", @@ -108,11 +109,13 @@ }, "devDependencies": { "@types/jest": "^30.0.0", - "@types/node": "^16.18.126", - "@types/xml2js": "^0.4.5", - "react": "^19.2.5", - "react-dom": "^19.2.5", - "react-native": "~0.78.2" + "@types/node": "^22.18.0", + "@types/xml2js": "^0.4.5" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "~0.77.3" }, "keywords": [ "typings", diff --git a/packages/pluggable-widgets-tools/src/typings-generator/WidgetXml.ts b/packages/pluggable-widgets-tools/src/typings-generator/WidgetXml.ts index f6220ef6..99656baa 100644 --- a/packages/pluggable-widgets-tools/src/typings-generator/WidgetXml.ts +++ b/packages/pluggable-widgets-tools/src/typings-generator/WidgetXml.ts @@ -51,7 +51,6 @@ export interface Property { isDefault?: string; dataSource?: string; onChange?: string; - allowUpload?: string; }; caption?: string[]; category?: string[]; diff --git a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/index.spec.ts b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/index.spec.ts index f624b586..bd1ee166 100644 --- a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/index.spec.ts +++ b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/index.spec.ts @@ -50,11 +50,6 @@ import { } from "./outputs/list-action-with-variables"; import { imageWebInput, imageNativeInput } from "./inputs/image"; import { imageWebOutput, imageNativeOutput } from "./outputs/image"; -import { singleObjectDatasourceInput, singleObjectDatasourceInputNative } from "./inputs/single-object-datasource"; -import { - singleObjectDatasourceNativeOutput, - singleObjectDatasourceWebOutput -} from "./outputs/single-object-datasource"; describe("Generating tests", () => { it("Generates a parsed typing from XML for native", () => { @@ -256,16 +251,6 @@ describe("Generating tests", () => { const newContent = generateNativeTypesFor(imageNativeInput); expect(newContent).toBe(imageNativeOutput); }); - - it("Generates a parsed typing from XML for web using single object datasource", () => { - const newContent = generateFullTypesFor(singleObjectDatasourceInput); - expect(newContent).toBe(singleObjectDatasourceWebOutput); - }); - - it("Generates a parsed typing from XML for native using single object datasource", () => { - const newContent = generateNativeTypesFor(singleObjectDatasourceInputNative); - expect(newContent).toBe(singleObjectDatasourceNativeOutput); - }); }); function generateFullTypesFor(xml: string) { diff --git a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/file.ts b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/file.ts index e341da70..c922bd4e 100644 --- a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/file.ts +++ b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/file.ts @@ -1,7 +1,8 @@ export const fileInput = ` - + @@ -12,22 +13,14 @@ export const fileInput = ` File 2 - - File 3 - - - - File 4 - - Action - - + + Action @@ -42,13 +35,13 @@ export const fileInput = ` `; - export const fileInputNative = ` - + - + File @@ -57,22 +50,14 @@ export const fileInputNative = ` File 2 - - File 3 - - - - File 4 - - Action - - + + Action diff --git a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/image.ts b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/image.ts index d649f924..b6268172 100644 --- a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/image.ts +++ b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/image.ts @@ -1,7 +1,8 @@ export const imageWebInput = ` - + @@ -12,18 +13,14 @@ export const imageWebInput = ` Image 2 - - Image 3 - - Action - - + + Action @@ -38,13 +35,13 @@ export const imageWebInput = ` `; - export const imageNativeInput = ` - + - + Image @@ -53,18 +50,14 @@ export const imageNativeInput = ` Image 2 - - Image 3 - - Action - - + + Action diff --git a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/single-object-datasource.ts b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/single-object-datasource.ts deleted file mode 100644 index 97850552..00000000 --- a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/inputs/single-object-datasource.ts +++ /dev/null @@ -1,136 +0,0 @@ -export const singleObjectDatasourceInput = ` - - - - - Single object data source - - - - Optional single object data source - - - - List data source - - - - Single Content - - - - Single Attribute - - - - - - - - - Single Action - - - - Single Text Template - - - - Single Expression - - - - - Optional Single Attribute - - - - - - - Optional Single Action - - - - List Content - - - - List Attribute - - - - - - - List Action - - - - - - - - -`; - -export const singleObjectDatasourceInputNative = ` - - - - - Single object data source - - - - List data source - - - - Single Content - - - - Single Attribute - - - - - - - - - Single Action - - - - Single Text Template - - - - Single Expression - - - - - List Content - - - - List Attribute - - - - - - - List Action - - - - -`; diff --git a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/outputs/file.ts b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/outputs/file.ts index 65c66083..8be35660 100644 --- a/packages/pluggable-widgets-tools/src/typings-generator/__tests__/outputs/file.ts +++ b/packages/pluggable-widgets-tools/src/typings-generator/__tests__/outputs/file.ts @@ -3,7 +3,7 @@ export const fileWebOutput = `/** * WARNING: All changes made to this file will be overwritten * @author Mendix Widgets Framework Team */ -import { ActionValue, DynamicValue, EditableFileValue, EditableValue, FileValue } from "mendix"; +import { ActionValue, DynamicValue, EditableValue, FileValue } from "mendix"; export interface MyWidgetContainerProps { name: string; @@ -11,8 +11,6 @@ export interface MyWidgetContainerProps { id: string; file: DynamicValue; file2?: DynamicValue; - file3: EditableFileValue; - file4?: EditableFileValue; description: EditableValue; action?: ActionValue; } @@ -23,8 +21,6 @@ export interface MyWidgetPreviewProps { translate: (text: string) => string; file: string; file2: string; - file3: string; - file4: string; description: string; action: {} | null; } @@ -34,8 +30,6 @@ export const fileNativeOutput = `export interface MyWidgetProps