Changes since 25.2.0-alpha3
Breaking changes
-
Stop auto-running
vaadinPrepareFrontendin development mode
Commit · Pull request · IssueIDE-triggered Gradle builds (e.g. IntelliJ compiling on file change) were running
vaadinPrepareFrontendviaprocessResources, which interfered with the running Vite dev server and broke hotdeploy. Since Vaadin 25, the dev server handles frontend preparation at runtime, so the task no longer needs to run automatically. The previous behavior can be restored by settingalwaysExecutePrepareFrontend = true.
New features
-
Add help goal for maven plugin
Commit · Pull requestAdds generation of help goal for the Flow maven plugin. Also renamed execution identifier to avoid double execution of the descriptor goal.
-
Expose application properties via
OptionsforTypeScriptBootstrapModifierconsumers
Commit · Pull request · IssueTypeScriptBootstrapModifierimplementations (e.g., Copilot) need access to application properties to conditionally modify bootstrap TypeScript. Currently, the Copilot script is injected in dev mode regardless of whether Copilot is enabled in the project configuration. AddwithApplicationConfigurationtoOptionsand property accessor methods (getApplicationStringProperty,getApplicationBooleanProperty) that returnOptional.empty()when configuration is unavailable (build time). WireApplicationConfigurationfromDevModeInitializer.
Fixes
-
Respect user opt-out when adding overrides
Commit · Pull requestAdjust the checks for user opt-out in package.json overrides, so that an existing override for new entries added by Vaadin is considered as an opt-out, so that the existing user value is kept. This behavior satisfies the previously existing
NodeUpdatePackagesNpmVersionLockingTest.shouldNotUpdatesOverrides_whenHasUserModificationtest. -
Prevent deletion of app-shell-imports by frontend cleanup task
Commit · Pull requestTaskRemoveOldFrontendGeneratedFilesdeletes files in the frontend generated folder that are not recognized as known generated files. Theapp-shell-imports.jsandapp-shell-imports.d.tsfiles were missing from the known files list, causing them to be deleted whenvaadinPrepareFrontendruns without the index generation task, for example when IntelliJ IDEA triggers a Gradle compilation while the dev server is running with hot deploy. AddAPP_SHELL_IMPORTS_NAMEandAPP_SHELL_IMPORTS_D_TS_NAMEto the known files list. Also improve test coverage by verifying all known file types, including Hilla generated files. Related to #24108 -
Add package.json overrides for workbox dependencies
Commit · Pull request- Add PwaConfiguration parameter to TaskUpdateVite constructor - Remove service worker plugin and its imports from vite.generated.ts when offline build is not enabled - Use FrontendDependenciesScanner in TaskGeneratePackageJson to generate correct dev dependencies - Enhance TaskUpdatePackages for proper override handling - Move all workbox dependencies to
workbox/package.jsonand only add when offline sw build is needed - Add overrides for workbox dependencies to package.json - Add overrides support to NodeUpdater - Remove empty vaadin.overrides from package.json
- Add PwaConfiguration parameter to TaskUpdateVite constructor - Remove service worker plugin and its imports from vite.generated.ts when offline build is not enabled - Use FrontendDependenciesScanner in TaskGeneratePackageJson to generate correct dev dependencies - Enhance TaskUpdatePackages for proper override handling - Move all workbox dependencies to
-
Add popover attribute to system error container
Commit · Pull requestE.g. Dialog can obscure the message
-
Remove duplicate CI run for main branch merges
Commit · Pull requestSummary - Remove
mainfrom thepushtrigger branches invalidation.ymlto avoid duplicate CI runs - Since merge queue is enabled onmain, every merge triggers both amerge_groupand apushevent for the same commit, causing two full CI runs (build + unit tests + integration tests) - Direct pushes tomainare not possible (branch protection), so thepushtrigger formainis redundant - Other branches (25.1, 25.0, 24.10, etc.) still need thepushtrigger as they do not use merge queue ## Context When a PR merges via the merge queue, GitHub fires two events for the same commit (example vs example). The concurrency groups differ between the two events (gh-readonly-queue/main/...vsmain), so they do not cancel each other and both run to completion.merge_groupworkflow run uses the same commit hash as the merged commit, so Bender should be able to match against it. This should be verified after merging. -
Filter hop-by-hop headers in dev server proxy
Commit · Pull requestThe dev server proxy in
AbstractDevServerRunnerforwarded all HTTP headers between the browser and the Vite dev server, including hop-by-hop headers that must not be forwarded by a proxy per RFC 9110 Section 7.6.1. It also forwarded the upstream Content-Length which may not match the actual bytes after HttpURLConnection decoding, causing broken responses on some servlet containers. This change filters hop-by-hop headers and Content-Length from proxied requests and responses, and avoids closing the output stream aftersendError(). Related to #23564 -
Encode location query parameter in init request to preserve +
Commit · Pull requestRe-add encodeURIComponent() around the location parameter in the init request query string. Without encoding, a literal + in the URL path (e.g. /+/dashboard) is interpreted as a space by the servlet container's query parameter decoding, resulting in InvalidLocationException: Relative path cannot start with / The encodeURIComponent was removed in #22791 to preserve %2F in wildcard parameters, but this is not needed: double-encoding (%2F becomes %252F) is correctly undone by the servlet's single query parameter decode.
-
Log Vite build failure only once instead of on every request
Commit · Pull requestWhen the Vite dev server fails to start, the exception was re-thrown on every subsequent HTTP request, flooding the log with identical stack traces. Now the error is thrown once and subsequent requests gets the error in the browser instead.