Skip to content

Commit b03df51

Browse files
Migrate the repository to React 19 & React Native 0.78.2
1 parent bbe9d38 commit b03df51

10 files changed

Lines changed: 81 additions & 46 deletions

File tree

packages/command-tests/commands.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,14 +376,15 @@ async function execFailedAsync(command, workDir) {
376376
function fixPackageJson(json) {
377377
const devDependencies = {
378378
"@types/jest": "^29.0.0",
379-
"@types/react": "~18.2.0",
380-
"@types/react-native": "~0.72.0",
381-
"@types/react-dom": "~18.2.0",
379+
"@types/react": "^19.0.0",
380+
"@types/react-native": "0.78.2",
381+
"@types/react-dom": "^19.0.0",
382382
"@types/react-test-renderer": "~18.0.0"
383383
};
384384
const overrides = {
385-
react: "18.2.0",
386-
"react-native": "0.72.7"
385+
"react": "^19.0.0",
386+
"react-dom": "^19.0.0",
387+
"react-native": "0.78.2"
387388
};
388389

389390
Object.keys(devDependencies)

packages/command-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"devDependencies": {
1111
"@prettier/plugin-xml": "^2.2.0",
1212
"@types/jest-image-snapshot": "^4.3.1",
13-
"@types/node": "^16.11.19",
13+
"@types/node": "^18.0.0",
1414
"@types/node-fetch": "2.6.1",
1515
"@types/shelljs": "^0.8.9",
1616
"@types/xml2js": "^0.4.5",

packages/generator-widget/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66

77
## [Unreleased]
88

9+
### Changed
10+
11+
- We upgraded React Native to version 0.78.2 for generated widgets.
12+
913
## [11.3.1] - 2026-02-04
1014

1115
### Changed

packages/generator-widget/generators/app/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class MxGenerator extends Generator {
6464

6565
install() {
6666
this.log(text.INSTALL_FINISH_MSG);
67-
this.npmInstall(undefined, { legacyPeerDeps: true });
67+
this.npmInstall(undefined, { legacyPeerDeps: false });
6868
}
6969

7070
async end() {

packages/generator-widget/generators/app/templates/packages/package_native.json.ejs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,25 @@
2727
"output": "./dist/testresults/TESTS-Jest.xml"
2828
},<% } %>
2929
"devDependencies": {
30-
"@mendix/pluggable-widgets-tools": "^11.3.1"<% if (isLanguageTS) { %>,
30+
"@mendix/pluggable-widgets-tools": "^11.6.0"<% if (isLanguageTS) { %>,
3131
"@types/big.js": "^6.0.2"<% if (hasUnitTests) { %>,
3232
"@types/jest": "^29.0.0"<% } %><% } %>
3333
},
3434
"dependencies": {
3535

3636
},
3737
"resolutions": {
38-
"react": "^18.2.0",<% if (isLanguageTS) { %>
39-
"@types/react": "^18.2.0",<% } %>
40-
"react-native": "0.77.3"
38+
"react": "^19.0.0",
39+
"react-dom": "^19.0.0",<% if (isLanguageTS) { %>
40+
"@types/react": "^19.0.0",
41+
"@types/react-dom": "^19.0.0",<% } %>
42+
"react-native": "~0.78.2"
4143
},
4244
"overrides": {
43-
"react": "^18.2.0",<% if (isLanguageTS) { %>
44-
"@types/react": "^18.2.0",<% } %>
45-
"react-native": "0.77.3"
45+
"react": "^19.0.0",
46+
"react-dom": "^19.0.0",<% if (isLanguageTS) { %>
47+
"@types/react": "^19.0.0",
48+
"@types/react-dom": "^19.0.0",<% } %>
49+
"react-native": "~0.78.2"
4650
}
4751
}

packages/generator-widget/generators/app/templates/packages/package_web.json.ejs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"release": "pluggable-widgets-tools release:web"
2929
},
3030
"devDependencies": {
31-
"@mendix/pluggable-widgets-tools": "^11.3.1"<% if (isLanguageTS) { %>,
31+
"@mendix/pluggable-widgets-tools": "^11.6.0"<% if (isLanguageTS) { %>,
3232
"@types/big.js": "^6.0.2"<% if (hasE2eTests) { %>,
3333
"@types/jasmine": "^3.6.9"<% } %><% if (hasUnitTests) { %>,
3434
"@types/jest": "^29.0.0"<% } %><% } %><% if (hasE2eTests) { %>,
@@ -38,17 +38,17 @@
3838
"classnames": "^2.2.6"
3939
},
4040
"resolutions": {
41-
"react": "^18.2.0",
42-
"react-dom": "18.2.0",<% if (isLanguageTS) { %>
43-
"@types/react": "^18.2.0",
44-
"@types/react-dom": "18.2.0",<% } %>
45-
"react-native": "0.72.7"
41+
"react": "^19.0.0",
42+
"react-dom": "^19.0.0",<% if (isLanguageTS) { %>
43+
"@types/react": "^19.0.0",
44+
"@types/react-dom": "^19.0.0",<% } %>
45+
"react-native": "~0.78.2"
4646
},
4747
"overrides": {
48-
"react": "^18.2.0",
49-
"react-dom": "18.2.0",<% if (isLanguageTS) { %>
50-
"@types/react": "^18.2.0",
51-
"@types/react-dom": "18.2.0",<% } %>
52-
"react-native": "0.72.7"
48+
"react": "^19.0.0",
49+
"react-dom": "^19.0.0",<% if (isLanguageTS) { %>
50+
"@types/react": "^19.0.0",
51+
"@types/react-dom": "^19.0.0",<% } %>
52+
"react-native": "~0.78.2"
5353
}
5454
}
Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, ReactNode, createElement, ElementType } from "react";
1+
import { Component, ReactNode, createElement } from "react";
22
import { Platform, Text, TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
33

44
import { mergeNativeStyles } from "@mendix/pluggable-widgets-tools";
@@ -14,25 +14,41 @@ export interface BadgeProps {
1414
export class Badge extends Component<BadgeProps> {
1515
private readonly styles = mergeNativeStyles(defaultBadgeStyle, this.props.style);
1616

17+
// React 19 + RN 0.78.x: RN's built-in types still expect legacy component typings (e.g. `refs`).
18+
// We return and assert `ReactNode` here to avoid JSX element type errors until upstream types align.
1719
render(): ReactNode {
18-
const Touchable: ElementType = Platform.OS === "android" ? TouchableNativeFeedback : TouchableOpacity;
20+
const isAndroid = Platform.OS === "android";
1921

2022
return (
2123
<View style={this.styles.container}>
22-
<Touchable accessibilityRole={"button"} style={this.styles.badge} onPress={this.props.onClick} useForeground={true}>
23-
{this.renderContent()}
24-
</Touchable>
24+
{isAndroid ? (
25+
<TouchableNativeFeedback
26+
accessibilityRole={"button"}
27+
onPress={this.props.onClick}
28+
useForeground={true}
29+
>
30+
{this.renderContent()}
31+
</TouchableNativeFeedback>
32+
) : (
33+
<TouchableOpacity
34+
accessibilityRole={"button"}
35+
style={this.styles.badge}
36+
onPress={this.props.onClick}
37+
>
38+
{this.renderContent()}
39+
</TouchableOpacity>
40+
)}
2541
</View>
26-
);
42+
) as ReactNode;
2743
}
2844

2945
private renderContent(): ReactNode {
3046
const text = <Text style={this.styles.label}>{this.props.value}</Text>;
3147

3248
if (Platform.OS === "android") {
33-
return <View style={this.styles.badge}>{text}</View>;
49+
return (<View style={this.styles.badge}>{text}</View>) as ReactNode;
3450
}
3551

36-
return text;
52+
return text as ReactNode;
3753
}
3854
}

packages/generator-widget/generators/app/templates/pluggable/native/fullTemplateTsFn/src/components/Badge.tsx.ejs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ReactElement, createElement, ElementType, useMemo } from "react";
1+
import { ReactElement, createElement, useMemo } from "react";
22
import { Platform, Text, TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
33

44
import { mergeNativeStyles } from "@mendix/pluggable-widgets-tools";
@@ -14,7 +14,7 @@ export interface BadgeProps {
1414
export function Badge({ value, style, onClick }: BadgeProps): ReactElement {
1515
const styles = mergeNativeStyles(defaultBadgeStyle, style);
1616

17-
const Touchable: ElementType = Platform.OS === "android" ? TouchableNativeFeedback : TouchableOpacity;
17+
const isAndroid = Platform.OS === "android";
1818

1919
const renderContent = useMemo(() => {
2020
const text = <Text style={styles.label}>{value}</Text>;
@@ -28,9 +28,19 @@ export function Badge({ value, style, onClick }: BadgeProps): ReactElement {
2828

2929
return (
3030
<View style={styles.container}>
31-
<Touchable accessibilityRole={"button"} style={styles.badge} onPress={onClick} useForeground={true}>
32-
{renderContent}
33-
</Touchable>
31+
{isAndroid ? (
32+
<TouchableNativeFeedback
33+
accessibilityRole={"button"}
34+
onPress={onClick}
35+
useForeground={true}
36+
>
37+
{renderContent}
38+
</TouchableNativeFeedback>
39+
) : (
40+
<TouchableOpacity accessibilityRole={"button"} style={styles.badge} onPress={onClick}>
41+
{renderContent}
42+
</TouchableOpacity>
43+
)}
3444
</View>
3545
);
3646

packages/generator-widget/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mendix/generator-widget",
3-
"version": "11.3.1",
3+
"version": "11.6.0",
44
"description": "Mendix Pluggable Widgets Generator",
55
"engines": {
66
"node": ">=16"

packages/pluggable-widgets-tools/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mendix/pluggable-widgets-tools",
3-
"version": "11.3.1",
3+
"version": "11.6.0",
44
"description": "Mendix Pluggable Widgets Tools",
55
"engines": {
66
"node": ">=20"
@@ -48,8 +48,8 @@
4848
"@testing-library/react": "^13.4.0",
4949
"@testing-library/user-event": "^14.4.3",
5050
"@testing-library/react-native": "^13.3.3",
51-
"@types/react": "^18.2.0",
52-
"@types/react-dom": "^18.2.0",
51+
"@types/react": "^19.0.0",
52+
"@types/react-dom": "^19.0.0",
5353
"@types/testing-library__jest-dom": "^5.14.5",
5454
"@typescript-eslint/eslint-plugin": "^5.8.1",
5555
"@typescript-eslint/parser": "^5.8.1",
@@ -78,7 +78,7 @@
7878
"jest-jasmine2": "^29.0.3",
7979
"jest-junit": "^13.0.0",
8080
"make-dir": "^3.1.0",
81-
"mendix": "^10.21.64362",
81+
"mendix": "^11.0.0",
8282
"mime": "^3.0.0",
8383
"node-fetch": "^2.6.1",
8484
"postcss": "^8.3.11",
@@ -111,9 +111,9 @@
111111
"@types/node": "^16.18.126",
112112
"@types/xml2js": "^0.4.5",
113113
"async-mutex": "^0.2.4",
114-
"react": "^18.2.0",
115-
"react-dom": "^18.2.0",
116-
"react-native": "~0.77.3",
114+
"react": "^19.0.0",
115+
"react-dom": "^19.0.0",
116+
"react-native": "~0.78.2",
117117
"tree-kill": "^1.2.2",
118118
"yeoman-test": "^6.2.0"
119119
},

0 commit comments

Comments
 (0)