What's changed
This release adds Playwright support! π₯³
You can now generate end-to-end tests with Playwright as an alternative to Cypress. The specs are a line-by-line port of the Cypress ones, with the same files, test titles, and data-cy locators so that you can compare the two suites side by side.
This release also finishes the move away from webpack. Angular microfrontends now use Native Federation on top of the esbuild-based Angular CLI builder, and webpack is gone from Angular and Vue apps (React switched to Vite in 9.3.0). On the backend, we reimplemented R2DBC repositories, and Liquibase now supports Cassandra.
π Highlights
π Playwright
- Playwright is now a supported e2e test framework, selectable through
testFrameworksalongside Cypress. Entity specs are generated too, including the bootstrap of required relationships - Angular apps register the
playwright-ng-schematicsbuilder, song e2edrives the dev server - Porting the assertions surfaced two application bugs that Cypress had hidden, and both are fixed
π₯οΈ Frontend
- Angular microfrontends are now built with esbuild and Native Federation (
@angular-architects/native-federation) instead of webpack Module Federation, and Angular's webpack templates are gone - Vue dropped webpack support, so Vue apps build with Vite or Rsbuild
- Angular entities can now be created with a user-provided ID, stored blobs open as a download unless the content type is allowed, and React production bundles have smaller chunks
- Lots of Bootstrap 5 cleanup across Angular and Vue templates, along with i18n placeholder fixes and removal of unused translation keys
π Spring Boot and data
- R2DBC repositories were reimplemented on top of Spring Data repositories with Criteria, using the CriteriaBuilder from jhipster-framework
- Liquibase now supports Cassandra and is enabled by default, so schemas no longer need a separate Docker image outside the application
- Fixes for build errors on OAuth2 gateways without a database, tests deleting every User record, incremental Liquibase changelogs for MapStruct expression fields, and the Spring Boot error page showing a duplicated error instead of the HTTP status
π Security hardening
- yeoman-generator v9 throws when a template or destination path resolves outside the generator root, so write operations outside the project are now controlled
--disable-blueprintsalso disables local.blueprintdirectories, which matters for CI and JHipster Online running against untrusted checkouts
π§° Generator and blueprints
- A new
jhipster describecommand gives you a queryable, machine-readable catalog of commands, options, prompts, and config owners - A new
--export-applicationoption packs the generated files into a zip archive instead of writing them to disk - Blueprint authors now have a documented public API with semver guarantees
- JDL keywords are matched only as whole words in the lexer, and the bootstrap commit pipeline no longer depends on project configuration
π¦ Toolchain updates
- Build tooling moved to Node.js 24.21.0, Cypress 16, and Vitest 5
π By the numbers
- 272 closed issues and pull requests since 9.3.0 (full list)
- Toolchain updates include yeoman-generator 9, Node.js 24.21.0, Cypress 16, and Vitest 5
π§ More changes
π§ Core generator, testing, and code quality
- Fix redundant wording in partial update log message (#34998) @qmonmert
- Fix duplicate test and describe names in specs (#34999) @qmonmert
- Fix typos in spec files (#35000) @qmonmert
- Fix some typos (#34993) @qmonmert
- chore(deps): update dependency graalvm-reachability-metadata to v1.0.15 (#34958) @renovate[bot]
- Remove unused duplicated Elasticsearch error templates (#34930) @qmonmert
- Use Optional.empty() (#34931) @qmonmert
- Use List.getFirst() instead of get(0) in Java templates (#34929) @qmonmert
- Avoid repeated getEnum calls in jdl field converter (#34923) @qmonmert
- Fix some typos (#34922) @qmonmert
- Fix CURRENT_USER typo in oracle reserved keywords (#34917) @qmonmert
- Fix java constructor lookup for protected constructors (#34920) @qmonmert
- cli: make EnvironmentBuild aware of disable-blueprint option (#34909) @mshima
- dev-blueprint: describe every jhipster-daily-builds workflow (#34889) @mshima
- dev-blueprint: add describe-samples and share the sample resolution w⦠(#34878) @mshima
- describe: fix databaseType owner expectations (#34880) @qmonmert
- base: fix types for generate-blueprint (#34877) @mshima
- cypress: remove workarounds. (#34849) @mshima
- internal: convert renderTemplate to sync (#34848) @mshima
- internal: do not use mem-fs-editor's async operations (#34845) @mshima
- liquibase: fix templates (#34844) @mshima
- internal: disable ejs cache (#34843) @mshima
- chore(deps): update dependency graalvm-reachability-metadata to v1.0.14 (#34840) @renovate[bot]
- spring-boot: split and simplify UserRepository template (#34809) @mshima
- ci: remove non working workaround (#34803) @mshima
- spring-boot: add ProcessBuilder log (#34733) @mshima
- spring-boot: add cassandraKeyspaceName property (#34802) @mshima
- chore(deps): update dependency graalvm-reachability-metadata to v1.0.13 (#34763) @renovate[bot]
π₯οΈ Frontend
- [i18n] Remove unused duplicate uz-Cyrl-uz activate.json and reset.json (#35004) @qmonmert
- [React] Remove redundant initial state of the login modal (#34992) @qmonmert
- [Angular] Use danger style for blocked threads progress bar (#34991) @qmonmert
- [Vue] Use static field-name attribute on sort indicators (#34983) @qmonmert
- [Vue] Use static to attribute instead of bound string literal (#34982) @qmonmert
- git, common: give the git generator ownership of the repository inspe⦠(#34971) @mshima
- [Vue] Remove unsupported right attribute from navbar components (#34970) @qmonmert
- [Vue] Remove useless v-b-modal directive (#34969) @qmonmert
- [Vue] Remove redundant conditions (#34968) @qmonmert
- [Vue] Remove unused toastify-container class (#34967) @qmonmert
- [Vue] Remove empty table header column (#34966) @qmonmert
- [Vue] Fix bootstrap 5 classes (#34965) @qmonmert
- [Vue] Replace obsolete data-translate attributes with t$ (#34964) @qmonmert
- [Vue] Use bootstrap ms-2 utility class instead of inline style (#34962) @qmonmert
- [Vue] Remove obsolete seamless attribute from iframe (#34961) @qmonmert
- [Vue] Use bootstrap 5 form-select class for select elements (#34942) @qmonmert
- [Angular] Replace bootstrap 3 well class with alert (#34940) @qmonmert
- [Angular] Use bootstrap 5 form-select class for select elements (#34939) @qmonmert
- [Angular] Remove obsolete seamless and target attributes from iframe (#34938) @qmonmert
- Remove obsolete ie6 hacks (#34937) @qmonmert
- [Vue] Remove legacy bootstrap data attributes (#34936) @qmonmert
- [Angular] Remove legacy bootstrap data attributes (#34935) @qmonmert
- [Angular] Remove unused empty (#34932) @qmonmert
- Drop an unreachable xml check in toOpenableContentType (#34928) @qmonmert
- Scope eslint-disable directives to the line they cover (#34927) @qmonmert
- Use String#endsWith instead of a custom function (#34925) @qmonmert
- Add the missing license header to templates (#34924) @qmonmert
- [Angular] inject TitleStrategy instead of a second strategy instance (#34916) @qmonmert
- [Vue] Reuse the happy-dom instance with the vmThreads pool (#34912) @qmonmert
- [Vue] refacto abbreviate function (#34911) @qmonmert
- [Vue] Use reset.finish.title on the reset password finish page (#34910) @qmonmert
- [Angular] Add missing form-label class to language select label (#34890) @qmonmert
- [Angular] Add missing template ref for focused input (#34891) @qmonmert
- [Angular] Fix style for the strength bar list selector (#34893) @qmonmert
- [Vue] Remove unused variable (#34894) @qmonmert
- [React] header logo does not display in prod mode (#34888) @qmonmert
- React/Vue: drop Axios global workaround, keep it for sockjs-client (#34887) @qmonmert
- [React] Remove the react/react-dom overrides workaround (#34871) @qmonmert
- Angular: use type=button for buttons outside of a form (#34743) @qmonmert
πΎ JDL/Internals/Blueprints
- Fix broken data-relational link in app generator README (#35001) @qmonmert
- Fix inverted markdown link syntax (#35002) @qmonmert
- Fix npm test command (#34926) @qmonmert
- Fix some typos (#34918) @qmonmert
- internal: try to generate value for pattern a few times (#34851) @mshima
- java/ci-cd: graalvm adjusts (#34818) @mshima
π¦ Dependency updates
- Bump transitional dependencies (#34921) @github-actions[bot], @jhipster-bot
- chore: bump yeoman stack (#34846) @mshima
- chore: recreate package-lock.json (#34820) @mshima
- chore: bump yeoman stack (#34794) @mshima
π¦ Install
npm install -g generator-jhipster@9.4.0Refer to the upgrade instructions for upgrading existing applications.
π Contributors
Thanks to everyone who contributed to this release!