diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml
index 63fb8490d3..d1fb1c84df 100644
--- a/.github/workflows/validation.yml
+++ b/.github/workflows/validation.yml
@@ -91,8 +91,6 @@ jobs:
name: Check style
runs-on: ubuntu-latest
timeout-minutes: 25
- strategy:
- fail-fast: false
steps:
- name: Checkout Project Code
@@ -120,8 +118,6 @@ jobs:
name: Test Java
runs-on: ubuntu-latest
timeout-minutes: 25
- strategy:
- fail-fast: false
steps:
- name: Checkout Project Code
@@ -160,8 +156,6 @@ jobs:
name: Test TypeScript
runs-on: ubuntu-latest
timeout-minutes: 25
- strategy:
- fail-fast: false
steps:
- name: Install Chrome
@@ -311,6 +305,66 @@ jobs:
packages/java/gradle-plugin/build/test-results/*
packages/java/gradle-plugin/build/reports/*
+ test-react-18:
+ needs:
+ - init
+ name: React 18 Tests
+ runs-on: ubuntu-latest
+ timeout-minutes: 25
+ steps:
+ - name: Install Chrome
+ id: setup-chrome
+ uses: browser-actions/setup-chrome@v1
+ - name: Checkout Project Code
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ fetch-depth: 0
+ - name: Setup
+ uses: ./.github/actions/setup
+ - uses: actions/download-artifact@v4
+ with:
+ name: saved-workspace
+ - name: Restore Workspace
+ run: |
+ set -x
+ tar xf workspace.tar
+ tar cf - .m2 | (cd ~ && tar xf -)
+ - name: Install React 18
+ run: npm install --save-dev react@18 react-dom@18 @types/react@18 @types/react-dom@18
+ - name: Test
+ run: npm run test:react
+ env:
+ CI: true
+ CHROME_BIN: ${{ steps.setup-chrome.outputs.chrome-path }}
+ - name: Set TB License
+ run: |
+ TB_LICENSE=${{secrets.TB_LICENSE}}
+ mkdir -p ~/.vaadin/
+ echo '{"username":"'`echo $TB_LICENSE | cut -d / -f1`'","proKey":"'`echo $TB_LICENSE | cut -d / -f2`'"}' > ~/.vaadin/proKey
+ - name: Verify
+ run: |
+ (
+ cd packages/java/tests && \
+ mvn -B -am -ntp -fae \
+ -Dfailsafe.forkCount=4 \
+ -Dcom.vaadin.testbench.Parameters.testsInParallel=5 \
+ -Dfailsafe.rerunFailingTestsCount=2 \
+ -Dmaven.wagon.httpconnectionManager.ttlSeconds=25 \
+ -Dmaven.wagon.http.retryHandler.count=3 \
+ -P\!it-modules \
+ -Preact-18 \
+ -Pproduction \
+ verify
+ )
+ - uses: actions/upload-artifact@v4
+ if: ${{ failure() || success() }}
+ with:
+ name: saved-outputs-it-${{ matrix.os }}-${{ matrix.it-modules }}
+ path: |
+ packages/java/tests/**/target/*-reports/*
+ packages/java/tests/**/error-screenshots/*.png
+
test-all:
name: Tests Summary
runs-on: ubuntu-latest
@@ -321,6 +375,7 @@ jobs:
- test-typescript
- test-it
- test-gradle
+ - test-react-18
steps:
- name: Merge Artifacts
uses: actions/upload-artifact/merge@v4
@@ -328,5 +383,5 @@ jobs:
name: saved-outputs
pattern: saved-outputs-*
- name: Fail if test jobs did not succeed
- if: ${{ needs.check-style.result != 'success' || needs.test-java.result != 'success' || needs.test-typescript.result != 'success' || needs.test-it.result != 'success' || needs.test-gradle.result != 'success' }}
+ if: ${{ needs.check-style.result != 'success' || needs.test-java.result != 'success' || needs.test-typescript.result != 'success' || needs.test-it.result != 'success' || needs.test-gradle.result != 'success' || needs.test-react-18.result != 'success' }}
run: exit 1
diff --git a/package-lock.json b/package-lock.json
index afa365e66a..d79b7df16a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4512,9 +4512,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "19.0.3",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz",
- "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==",
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz",
+ "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
"devOptional": true,
"license": "MIT",
"peerDependencies": {
diff --git a/package.json b/package.json
index e0c67d984a..26d9407288 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"lint:fix": "nx run-many -t lint:fix --all --output-style stream",
"test": "nx run-many -t test --all --output-style stream",
"test:coverage": "nx run-many -t test:coverage --all --output-style stream",
+ "test:react": "nx run-many -t test:react --all --output-style stream",
"typecheck": "nx run-many -t typecheck --all --output-style stream"
},
"repository": {
diff --git a/packages/java/tests/gradle/single-module-tests/src/main/resources/vaadin-featureflags.properties b/packages/java/tests/gradle/single-module-tests/src/main/resources/vaadin-featureflags.properties
new file mode 100644
index 0000000000..80f7397d52
--- /dev/null
+++ b/packages/java/tests/gradle/single-module-tests/src/main/resources/vaadin-featureflags.properties
@@ -0,0 +1,2 @@
+# React 19 (default in Vaadin 25)
+com.vaadin.experimental.react19=true
diff --git a/packages/java/tests/gradle/single-module/src/main/resources/vaadin-featureflags.properties b/packages/java/tests/gradle/single-module/src/main/resources/vaadin-featureflags.properties
new file mode 100644
index 0000000000..80f7397d52
--- /dev/null
+++ b/packages/java/tests/gradle/single-module/src/main/resources/vaadin-featureflags.properties
@@ -0,0 +1,2 @@
+# React 19 (default in Vaadin 25)
+com.vaadin.experimental.react19=true
diff --git a/packages/java/tests/pom.xml b/packages/java/tests/pom.xml
index 5c493501f4..96f9929cd9 100644
--- a/packages/java/tests/pom.xml
+++ b/packages/java/tests/pom.xml
@@ -30,6 +30,9 @@
false
+
+ true
+
8888
@@ -139,6 +142,18 @@
+
+ org.codehaus.mojo
+ properties-maven-plugin
+ ${properties-maven-plugin.version}
+
+
+
+ set-system-properties
+
+
+
+
org.apache.maven.plugins
maven-failsafe-plugin
@@ -252,16 +267,26 @@
- ${vaadin.reuseDevServer}
-
- ${vaadin.devmode.liveReload.enabled}
-
- ${vaadin.allow.appshell.annotations}
-
-
- ${jetty.scantrigger}-->
-
- ${vaadin.devmode.vite.options}
+
+ ${jetty.scantrigger}
+
+
+ ${vaadin.reuseDevServer}
+
+
+ ${vaadin.devmode.liveReload.enabled}
+
+
+ ${vaadin.allow.appshell.annotations}
+
+
+
+ ${vaadin.devmode.vite.options}
+
+
+ ${vaadin.experimental.react19}
+
@@ -331,5 +356,15 @@
+
+ react-18
+
+ false
+
+
+ spring
+
+
+
diff --git a/packages/java/tests/spring/pom.xml b/packages/java/tests/spring/pom.xml
index 4401d1dbba..8381de75e6 100644
--- a/packages/java/tests/spring/pom.xml
+++ b/packages/java/tests/spring/pom.xml
@@ -130,6 +130,44 @@
+
+
+
+ ${vaadin.reuseDevServer}
+
+
+ ${vaadin.devmode.liveReload.enabled}
+
+
+ ${vaadin.allow.appshell.annotations}
+
+
+
+ ${vaadin.devmode.vite.options}
+
+
+ ${vaadin.experimental.react19}
+
+
+ ${vaadin.reuseDevServer}
+
+
+ ${vaadin.devmode.liveReload.enabled}
+
+
+ ${vaadin.allow.appshell.annotations}
+
+
+
+ ${vaadin.devmode.vite.options}
+
+
+ ${vaadin.experimental.react19}
+
+
+
@@ -231,6 +269,16 @@
+
+ react-18
+
+ no-endpoints
+ react-grid-test
+ react-i18n
+ react-signals
+
+
+
native
diff --git a/packages/java/tests/spring/react-grid-test/src/main/resources/vaadin-featureflags.properties b/packages/java/tests/spring/react-grid-test/src/main/resources/vaadin-featureflags.properties
new file mode 100644
index 0000000000..1cdc976662
--- /dev/null
+++ b/packages/java/tests/spring/react-grid-test/src/main/resources/vaadin-featureflags.properties
@@ -0,0 +1,4 @@
+# Enable Hilla I18n feature flag so that we can test it
+com.vaadin.experimental.hillaI18n=true
+# React 19 (default in Vaadin 25)
+com.vaadin.experimental.react19=true
diff --git a/packages/java/tests/spring/react-i18n/src/main/resources/vaadin-featureflags.properties b/packages/java/tests/spring/react-i18n/src/main/resources/vaadin-featureflags.properties
index d26e4c1cd8..1cdc976662 100644
--- a/packages/java/tests/spring/react-i18n/src/main/resources/vaadin-featureflags.properties
+++ b/packages/java/tests/spring/react-i18n/src/main/resources/vaadin-featureflags.properties
@@ -1,2 +1,4 @@
# Enable Hilla I18n feature flag so that we can test it
com.vaadin.experimental.hillaI18n=true
+# React 19 (default in Vaadin 25)
+com.vaadin.experimental.react19=true
diff --git a/packages/java/tests/spring/react-signals/src/main/resources/vaadin-featureflags.properties b/packages/java/tests/spring/react-signals/src/main/resources/vaadin-featureflags.properties
index 64ea97e958..730ab22978 100644
--- a/packages/java/tests/spring/react-signals/src/main/resources/vaadin-featureflags.properties
+++ b/packages/java/tests/spring/react-signals/src/main/resources/vaadin-featureflags.properties
@@ -1,2 +1,4 @@
# Experimental feature flags for Vaadin
com.vaadin.experimental.fullstackSignals=true
+# React 19 (default in Vaadin 25)
+com.vaadin.experimental.react19=true
diff --git a/packages/ts/file-router/package.json b/packages/ts/file-router/package.json
index 3047ecd365..fe2e908a01 100644
--- a/packages/ts/file-router/package.json
+++ b/packages/ts/file-router/package.json
@@ -25,6 +25,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
diff --git a/packages/ts/generator-plugin-transfertypes/package.json b/packages/ts/generator-plugin-transfertypes/package.json
index c9f8a94c88..b1fce05ab7 100644
--- a/packages/ts/generator-plugin-transfertypes/package.json
+++ b/packages/ts/generator-plugin-transfertypes/package.json
@@ -13,8 +13,9 @@
"lint": "eslint src test",
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
- "test:update": "vitest --update",
- "test:coverage": "vitest --coverage",
+ "test:coverage": "vitest --run --coverage",
+ "test:update": "vitest --run --update",
+ "test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
"exports": {
diff --git a/packages/ts/react-auth/package.json b/packages/ts/react-auth/package.json
index 4d0124bc68..e4846eaf48 100644
--- a/packages/ts/react-auth/package.json
+++ b/packages/ts/react-auth/package.json
@@ -22,6 +22,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
diff --git a/packages/ts/react-crud/package.json b/packages/ts/react-crud/package.json
index eafb23aa22..150c546e6b 100644
--- a/packages/ts/react-crud/package.json
+++ b/packages/ts/react-crud/package.json
@@ -22,6 +22,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
diff --git a/packages/ts/react-form/package.json b/packages/ts/react-form/package.json
index 36a92ad886..441db91ce8 100644
--- a/packages/ts/react-form/package.json
+++ b/packages/ts/react-form/package.json
@@ -22,6 +22,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
diff --git a/packages/ts/react-i18n/package.json b/packages/ts/react-i18n/package.json
index 548c051582..8ac1f59c07 100644
--- a/packages/ts/react-i18n/package.json
+++ b/packages/ts/react-i18n/package.json
@@ -22,6 +22,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
diff --git a/packages/ts/react-signals/package.json b/packages/ts/react-signals/package.json
index ad043f1f1b..6ee0a642ce 100644
--- a/packages/ts/react-signals/package.json
+++ b/packages/ts/react-signals/package.json
@@ -22,6 +22,7 @@
"lint:fix": "eslint src test --fix",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
+ "test:react": "npm run test",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},