generator-jhipster 7.8.1 → 7.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +1 -1
  2. package/cli/environment-builder.js +3 -1
  3. package/cli/import-jdl.js +61 -35
  4. package/cli/jdl.js +5 -4
  5. package/cli/jhipster-command.js +1 -1
  6. package/cli/jhipster.js +0 -0
  7. package/cli/program.js +5 -3
  8. package/generators/app/index.js +11 -0
  9. package/generators/app/prompts.js +60 -12
  10. package/generators/azure-app-service/templates/github/workflows/azure-app-service.yml.ejs +3 -3
  11. package/generators/azure-spring-cloud/templates/github/workflows/azure-spring-cloud.yml.ejs +3 -3
  12. package/generators/bootstrap/index.js +1 -0
  13. package/generators/bootstrap-application/generator.mjs +1 -0
  14. package/generators/ci-cd/templates/.gitlab-ci.yml.ejs +2 -3
  15. package/generators/client/files-angular.js +72 -89
  16. package/generators/client/files-react.js +63 -74
  17. package/generators/client/files-vue.js +8 -54
  18. package/generators/client/index.js +18 -11
  19. package/generators/client/needle-api/needle-client-angular.js +1 -4
  20. package/generators/client/needle-api/needle-client-react.js +2 -2
  21. package/generators/client/prompts.js +1 -0
  22. package/generators/client/templates/angular/.eslintrc.json.ejs +10 -1
  23. package/generators/client/templates/angular/angular.json.ejs +0 -1
  24. package/generators/client/templates/angular/jest.conf.js.ejs +3 -1
  25. package/generators/client/templates/angular/package.json +31 -31
  26. package/generators/client/templates/angular/package.json.ejs +23 -22
  27. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.html.ejs +4 -4
  28. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.html.ejs +1 -1
  29. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.html.ejs +15 -15
  30. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.ts.ejs +17 -11
  31. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +16 -16
  32. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts.ejs +14 -9
  33. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +9 -9
  34. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.html.ejs +27 -27
  35. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.ts.ejs +28 -13
  36. package/generators/client/templates/angular/src/main/webapp/app/account/sessions/sessions.component.html.ejs +7 -7
  37. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.html.ejs +19 -19
  38. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.spec.ts.ejs +1 -1
  39. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.ts.ejs +35 -37
  40. package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +4 -4
  41. package/generators/client/templates/angular/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +7 -7
  42. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.html.ejs +6 -6
  43. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.module.ts.ejs +0 -1
  44. package/generators/client/templates/angular/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +3 -3
  45. package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.component.html.ejs +5 -5
  46. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +1 -1
  47. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html.ejs +5 -5
  48. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +10 -10
  49. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +10 -10
  50. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +9 -9
  51. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +8 -8
  52. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +5 -5
  53. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +4 -4
  54. package/generators/client/templates/angular/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +5 -5
  55. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +4 -4
  56. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +14 -14
  57. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +16 -16
  58. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +2 -1
  59. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +133 -138
  60. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts.ejs +22 -24
  61. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +40 -49
  62. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.model.ts.ejs +2 -2
  63. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.module.ts.ejs +0 -1
  64. package/generators/client/templates/angular/src/main/webapp/app/config/navigation.constants.ts.ejs +23 -0
  65. package/generators/client/templates/angular/src/main/webapp/app/config/pagination.constants.ts.ejs +2 -3
  66. package/generators/client/templates/angular/src/main/webapp/app/core/request/request-util.ts.ejs +1 -1
  67. package/generators/client/templates/angular/src/main/webapp/app/entities/user/user.model.ts.ejs +2 -2
  68. package/generators/client/templates/angular/src/main/webapp/app/entities/user/user.service.ts.ejs +7 -3
  69. package/generators/client/templates/angular/src/main/webapp/app/home/home.component.html.ejs +14 -14
  70. package/generators/client/templates/angular/src/main/webapp/app/layouts/error/error.component.html.ejs +1 -1
  71. package/generators/client/templates/angular/src/main/webapp/app/layouts/footer/footer.component.html.ejs +1 -1
  72. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +21 -21
  73. package/generators/client/templates/angular/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +1 -1
  74. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.html.ejs +9 -9
  75. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.ts.ejs +16 -27
  76. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.html.ejs +10 -0
  77. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.ts.ejs +23 -0
  78. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +40 -0
  79. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.ts.ejs +95 -0
  80. package/generators/client/templates/angular/src/main/webapp/app/shared/pagination/item-count.component.ts.ejs +1 -1
  81. package/generators/client/templates/angular/src/main/webapp/app/shared/shared.module.ts.ejs +3 -0
  82. package/generators/client/templates/angular/src/main/webapp/app/shared/sort/sort.service.ts.ejs +31 -0
  83. package/generators/client/templates/angular/src/main/webapp/declarations.d.ts.ejs +3 -8
  84. package/generators/client/templates/angular/tsconfig.json.ejs +6 -0
  85. package/generators/client/templates/angular/tsconfig.spec.json.ejs +1 -1
  86. package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +6 -2
  87. package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +1 -1
  88. package/generators/client/templates/common/package.json +6 -6
  89. package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +2 -0
  90. package/generators/client/templates/react/.eslintrc.json.ejs +10 -1
  91. package/generators/client/templates/react/jest.conf.js.ejs +3 -1
  92. package/generators/client/templates/react/package.json +57 -57
  93. package/generators/client/templates/react/package.json.ejs +3 -3
  94. package/generators/client/templates/react/src/main/webapp/app/app.tsx.ejs +3 -3
  95. package/generators/client/templates/react/src/main/webapp/app/entities/menu.tsx.ejs +1 -1
  96. package/generators/client/templates/react/src/main/webapp/app/entities/routes.tsx.ejs +7 -5
  97. package/generators/client/templates/react/src/main/webapp/app/modules/account/activate/activate.tsx.ejs +8 -4
  98. package/generators/client/templates/react/src/main/webapp/app/modules/account/index.tsx.ejs +9 -6
  99. package/generators/client/templates/react/src/main/webapp/app/modules/account/password/password.tsx.ejs +1 -0
  100. package/generators/client/templates/react/src/main/webapp/app/modules/account/password-reset/finish/password-reset-finish.tsx.ejs +8 -5
  101. package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.ts.ejs +6 -7
  102. package/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health-modal.tsx.ejs +3 -2
  103. package/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health.tsx.ejs +4 -4
  104. package/generators/client/templates/react/src/main/webapp/app/modules/administration/index.tsx.ejs +14 -11
  105. package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +8 -2
  106. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/index.tsx.ejs +13 -13
  107. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-delete-dialog.tsx.ejs +7 -4
  108. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-detail.tsx.ejs +5 -3
  109. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-update.tsx.ejs +10 -6
  110. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +18 -26
  111. package/generators/client/templates/react/src/main/webapp/app/modules/login/login-redirect.tsx.ejs +6 -3
  112. package/generators/client/templates/react/src/main/webapp/app/modules/login/login.tsx.ejs +6 -5
  113. package/generators/client/templates/react/src/main/webapp/app/routes.tsx.ejs +53 -25
  114. package/generators/client/templates/react/src/main/webapp/app/shared/auth/private-route.spec.tsx.ejs +30 -27
  115. package/generators/client/templates/react/src/main/webapp/app/shared/auth/private-route.tsx.ejs +35 -34
  116. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-routes.spec.tsx.ejs +55 -0
  117. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-routes.tsx.ejs +21 -0
  118. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary.spec.tsx.ejs +1 -1
  119. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary.tsx.ejs +1 -1
  120. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-loading.tsx.ejs +8 -10
  121. package/generators/client/templates/react/src/main/webapp/app/shared/error/page-not-found.tsx.ejs +9 -13
  122. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.spec.tsx.ejs +3 -5
  123. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.spec.tsx.ejs +5 -8
  124. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +1 -1
  125. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-item.tsx.ejs +12 -11
  126. package/generators/client/templates/react/src/main/webapp/app/typings.d.ts.ejs +2 -2
  127. package/generators/client/templates/react/tsconfig.json.ejs +2 -4
  128. package/generators/client/templates/react/tsconfig.test.json.ejs +1 -0
  129. package/generators/client/templates/react/webpack/webpack.common.js.ejs +7 -3
  130. package/generators/client/templates/react/webpack/webpack.microfrontend.js.jhi.react.ejs +4 -4
  131. package/generators/client/templates/vue/.eslintrc.js.ejs +10 -1
  132. package/generators/client/templates/vue/package.json +40 -39
  133. package/generators/client/templates/vue/package.json.ejs +3 -3
  134. package/generators/client/templates/vue/src/main/webapp/app/account/login-form/login-form.component.ts.ejs +2 -2
  135. package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.vue.ejs +1 -1
  136. package/generators/client/templates/vue/src/main/webapp/app/admin/user-management/user-management-edit.component.ts.ejs +2 -2
  137. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +5 -3
  138. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +2 -2
  139. package/generators/client/templates/vue/src/main/webapp/app/shared/alert/alert.service.ts.ejs +1 -1
  140. package/generators/client/templates/vue/src/main/webapp/app/shared/date/filters.ts.ejs +0 -6
  141. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +5 -0
  142. package/generators/client/templates/vue/src/test/javascript/spec/app/account/register/register.component.spec.ts.ejs +1 -1
  143. package/generators/client/templates/vue/tsconfig.json.ejs +1 -1
  144. package/generators/client/templates/vue/tsconfig.spec.json.ejs +2 -2
  145. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +4 -0
  146. package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +8 -1
  147. package/generators/client/transform-angular.cjs +117 -0
  148. package/generators/client/transform-react.cjs +126 -0
  149. package/generators/client/transform-vue.cjs +42 -0
  150. package/generators/common/files.js +2 -9
  151. package/generators/common/templates/.husky/pre-commit.ejs +0 -0
  152. package/generators/common/templates/README.md.jhi.ejs +21 -5
  153. package/generators/common/templates/package.json +3 -3
  154. package/generators/cypress/files.js +34 -22
  155. package/generators/cypress/index.js +42 -19
  156. package/generators/cypress/templates/cypress-audits.config.ts.ejs +28 -0
  157. package/generators/cypress/templates/cypress.config.ts.ejs +57 -0
  158. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/login-page.spec.ts.ejs → e2e/account/login-page.cy.ts.ejs} +0 -0
  159. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/password-page.spec.ts.ejs → e2e/account/password-page.cy.ts.ejs} +0 -0
  160. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/register-page.spec.ts.ejs → e2e/account/register-page.cy.ts.ejs} +0 -0
  161. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/reset-password-page.spec.ts.ejs → e2e/account/reset-password-page.cy.ts.ejs} +0 -0
  162. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/settings-page.spec.ts.ejs → e2e/account/settings-page.cy.ts.ejs} +0 -0
  163. package/generators/cypress/templates/src/test/javascript/cypress/{integration/administration/administration.spec.ts.ejs → e2e/administration/administration.cy.ts.ejs} +1 -1
  164. package/generators/cypress/templates/src/test/javascript/cypress/{integration → e2e}/lighthouse.audits.ts.ejs +0 -0
  165. package/generators/cypress/templates/src/test/javascript/cypress/plugins/global.d.ts.ejs +25 -0
  166. package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +13 -14
  167. package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +4 -4
  168. package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +1 -1
  169. package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +8 -8
  170. package/generators/cypress/templates/src/test/javascript/cypress/tsconfig.json.ejs +8 -5
  171. package/generators/database-changelog-liquibase/files.js +1 -1
  172. package/generators/database-changelog-liquibase/index.js +3 -0
  173. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/added_entity.xml.ejs +1 -1
  174. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/added_entity_constraints.xml.ejs +1 -1
  175. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity.xml.ejs +1 -1
  176. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_constraints.xml.ejs +2 -2
  177. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_migrate.xml.ejs +1 -1
  178. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/fake-data/table_entity.csv.ejs +2 -2
  179. package/generators/docker-base.js +6 -3
  180. package/generators/docker-compose/files.js +5 -2
  181. package/generators/docker-compose/index.js +13 -24
  182. package/generators/docker-compose/templates/README-DOCKER-COMPOSE.md.ejs +1 -1
  183. package/generators/docker-compose/templates/docker-compose.yml.ejs +10 -8
  184. package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +62 -4
  185. package/generators/docker-prompts.js +1 -2
  186. package/generators/docker-utils.js +0 -1
  187. package/generators/entity/index.js +5 -15
  188. package/generators/entity/prompts.js +1 -52
  189. package/generators/entity-client/files-angular.cjs +169 -0
  190. package/generators/entity-client/files-cypress.cjs +52 -0
  191. package/generators/entity-client/files-react.cjs +113 -0
  192. package/generators/entity-client/files-vue.cjs +140 -0
  193. package/generators/entity-client/files.js +10 -381
  194. package/generators/entity-client/index.js +120 -19
  195. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.html.ejs +4 -5
  196. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.ts.ejs +2 -1
  197. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +12 -11
  198. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +0 -5
  199. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.model.ts.ejs +18 -25
  200. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.test-samples.ts.ejs +45 -0
  201. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +45 -37
  202. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +47 -28
  203. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +292 -94
  204. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/infinite-scroll-template.ejs +5 -106
  205. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/pagination-template.ejs +2 -82
  206. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +5 -5
  207. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.ts.ejs +5 -5
  208. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing.module.ts.ejs +2 -3
  209. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +89 -175
  210. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +69 -44
  211. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.spec.ts.ejs +111 -0
  212. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.ts.ejs +263 -0
  213. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.html.ejs +99 -120
  214. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.spec.ts.ejs +47 -71
  215. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +79 -195
  216. package/generators/entity-client/templates/{common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs → cypress/src/test/javascript/cypress/e2e/entity/entity.cy.ts.ejs} +26 -17
  217. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-delete-dialog.tsx.ejs +10 -5
  218. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-detail.tsx.ejs +5 -3
  219. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +11 -6
  220. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +11 -10
  221. package/generators/entity-client/templates/react/src/main/webapp/app/entities/index.tsx.ejs +13 -13
  222. package/generators/entity-client/templates/react/src/main/webapp/app/entities/react_validators.ejs +25 -32
  223. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +2 -2
  224. package/generators/entity-server/cleanup.js +41 -0
  225. package/generators/entity-server/files.js +118 -53
  226. package/generators/entity-server/index.js +14 -27
  227. package/generators/entity-server/templates/partials/save_template.ejs +1 -1
  228. package/generators/entity-server/templates/partials/update_template.ejs +1 -1
  229. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +11 -5
  230. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.elastic_search.ejs +17 -0
  231. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_cassandra.ejs +3 -1
  232. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository.java.ejs +6 -1
  233. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +1 -1
  234. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryWithBagRelationships.java.ejs +2 -2
  235. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryWithBagRelationshipsImpl.java.ejs +13 -6
  236. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +1 -1
  237. package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +46 -9
  238. package/generators/entity-server/templates/src/main/java/package/service/EntityQueryService.java.ejs +3 -3
  239. package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +2 -2
  240. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +2 -5
  241. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +140 -132
  242. package/generators/gae/index.js +1 -1
  243. package/generators/generate-blueprint/constants.mjs +22 -2
  244. package/generators/generate-blueprint/esm.mjs +0 -0
  245. package/generators/generate-blueprint/generator.mjs +25 -6
  246. package/generators/generate-blueprint/templates/.github/workflows/generator.yml.ejs +5 -3
  247. package/generators/generate-blueprint/templates/cli/cli.mjs.ejs +0 -0
  248. package/generators/generate-blueprint/templates/cli/commands.cjs.ejs +2 -1
  249. package/generators/generate-blueprint/templates/generators/generator/generator.mjs.jhi.ejs +6 -5
  250. package/generators/generate-blueprint/templates/generators/generator/generator.spec.mjs.ejs +10 -1
  251. package/generators/generate-blueprint/templates/generators/generator/templates/template-file.ejs +0 -0
  252. package/generators/generator-base-blueprint.js +19 -20
  253. package/generators/generator-base-private.js +116 -64
  254. package/generators/generator-base.js +241 -91
  255. package/generators/generator-constants.js +118 -66
  256. package/generators/generator-defaults.js +1 -0
  257. package/generators/heroku/index.js +5 -4
  258. package/generators/heroku/templates/application-heroku.yml.ejs +1 -2
  259. package/generators/heroku/templates/heroku.gradle.ejs +28 -1
  260. package/generators/heroku/templates/pom-profile.xml.ejs +29 -0
  261. package/generators/init/templates/.husky/pre-commit +0 -0
  262. package/generators/java/index.cjs +2 -2
  263. package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -2
  264. package/generators/kubernetes/templates/db/mongodb.yml.ejs +1 -2
  265. package/generators/kubernetes/templates/ingress.yml.ejs +11 -4
  266. package/generators/kubernetes/templates/kubectl-apply.sh.ejs +0 -0
  267. package/generators/kubernetes/templates/monitoring/jhipster-grafana.yml.ejs +6 -2
  268. package/generators/kubernetes/templates/registry/consul.yml.ejs +1 -2
  269. package/generators/kubernetes/templates/registry/jhipster-registry.yml.ejs +1 -2
  270. package/generators/kubernetes-knative/templates/kubectl-apply.sh.ejs +0 -0
  271. package/generators/languages/templates/src/main/webapp/i18n/al/global.json.ejs +7 -1
  272. package/generators/languages/templates/src/main/webapp/i18n/ar-ly/global.json.ejs +7 -1
  273. package/generators/languages/templates/src/main/webapp/i18n/bg/global.json.ejs +7 -1
  274. package/generators/languages/templates/src/main/webapp/i18n/bn/global.json.ejs +7 -1
  275. package/generators/languages/templates/src/main/webapp/i18n/by/global.json.ejs +7 -1
  276. package/generators/languages/templates/src/main/webapp/i18n/ca/global.json.ejs +7 -1
  277. package/generators/languages/templates/src/main/webapp/i18n/cs/global.json.ejs +7 -1
  278. package/generators/languages/templates/src/main/webapp/i18n/da/global.json.ejs +7 -1
  279. package/generators/languages/templates/src/main/webapp/i18n/de/global.json.ejs +7 -1
  280. package/generators/languages/templates/src/main/webapp/i18n/el/global.json.ejs +7 -1
  281. package/generators/languages/templates/src/main/webapp/i18n/en/global.json.ejs +7 -1
  282. package/generators/languages/templates/src/main/webapp/i18n/en/health.json.ejs +3 -0
  283. package/generators/languages/templates/src/main/webapp/i18n/es/global.json.ejs +7 -1
  284. package/generators/languages/templates/src/main/webapp/i18n/et/global.json.ejs +7 -1
  285. package/generators/languages/templates/src/main/webapp/i18n/fa/global.json.ejs +7 -1
  286. package/generators/languages/templates/src/main/webapp/i18n/fi/global.json.ejs +7 -1
  287. package/generators/languages/templates/src/main/webapp/i18n/fr/global.json.ejs +7 -1
  288. package/generators/languages/templates/src/main/webapp/i18n/gl/global.json.ejs +7 -1
  289. package/generators/languages/templates/src/main/webapp/i18n/hi/global.json.ejs +7 -1
  290. package/generators/languages/templates/src/main/webapp/i18n/hr/global.json.ejs +7 -1
  291. package/generators/languages/templates/src/main/webapp/i18n/hu/global.json.ejs +7 -1
  292. package/generators/languages/templates/src/main/webapp/i18n/hy/global.json.ejs +7 -1
  293. package/generators/languages/templates/src/main/webapp/i18n/in/global.json.ejs +7 -1
  294. package/generators/languages/templates/src/main/webapp/i18n/it/global.json.ejs +7 -1
  295. package/generators/languages/templates/src/main/webapp/i18n/ja/global.json.ejs +7 -1
  296. package/generators/languages/templates/src/main/webapp/i18n/ko/global.json.ejs +7 -1
  297. package/generators/languages/templates/src/main/webapp/i18n/mr/global.json.ejs +7 -1
  298. package/generators/languages/templates/src/main/webapp/i18n/my/global.json.ejs +7 -1
  299. package/generators/languages/templates/src/main/webapp/i18n/nl/global.json.ejs +7 -1
  300. package/generators/languages/templates/src/main/webapp/i18n/pa/global.json.ejs +7 -1
  301. package/generators/languages/templates/src/main/webapp/i18n/pl/global.json.ejs +7 -1
  302. package/generators/languages/templates/src/main/webapp/i18n/pt-br/global.json.ejs +7 -1
  303. package/generators/languages/templates/src/main/webapp/i18n/pt-pt/global.json.ejs +7 -1
  304. package/generators/languages/templates/src/main/webapp/i18n/ro/global.json.ejs +7 -1
  305. package/generators/languages/templates/src/main/webapp/i18n/ru/global.json.ejs +7 -1
  306. package/generators/languages/templates/src/main/webapp/i18n/si/global.json.ejs +7 -1
  307. package/generators/languages/templates/src/main/webapp/i18n/sk/global.json.ejs +7 -1
  308. package/generators/languages/templates/src/main/webapp/i18n/sr/global.json.ejs +7 -1
  309. package/generators/languages/templates/src/main/webapp/i18n/sv/global.json.ejs +7 -1
  310. package/generators/languages/templates/src/main/webapp/i18n/ta/global.json.ejs +7 -1
  311. package/generators/languages/templates/src/main/webapp/i18n/te/global.json.ejs +7 -1
  312. package/generators/languages/templates/src/main/webapp/i18n/th/global.json.ejs +7 -1
  313. package/generators/languages/templates/src/main/webapp/i18n/tr/global.json.ejs +7 -1
  314. package/generators/languages/templates/src/main/webapp/i18n/ua/global.json.ejs +7 -1
  315. package/generators/languages/templates/src/main/webapp/i18n/uz-Cyrl-uz/global.json +7 -1
  316. package/generators/languages/templates/src/main/webapp/i18n/uz-Latn-uz/global.json.ejs +7 -1
  317. package/generators/languages/templates/src/main/webapp/i18n/vi/global.json.ejs +7 -1
  318. package/generators/languages/templates/src/main/webapp/i18n/zh-cn/global.json.ejs +7 -1
  319. package/generators/languages/templates/src/main/webapp/i18n/zh-tw/global.json.ejs +7 -1
  320. package/generators/languages/templates/src/test/resources/i18n/messages_al.properties.ejs +4 -1
  321. package/generators/languages/templates/src/test/resources/i18n/messages_ar_LY.properties.ejs +4 -1
  322. package/generators/languages/templates/src/test/resources/i18n/messages_bg.properties.ejs +1 -1
  323. package/generators/languages/templates/src/test/resources/i18n/messages_bn.properties.ejs +4 -1
  324. package/generators/languages/templates/src/test/resources/i18n/messages_by.properties.ejs +4 -1
  325. package/generators/languages/templates/src/test/resources/i18n/messages_ca.properties.ejs +4 -1
  326. package/generators/languages/templates/src/test/resources/i18n/messages_cs.properties.ejs +4 -1
  327. package/generators/languages/templates/src/test/resources/i18n/messages_da.properties.ejs +4 -1
  328. package/generators/languages/templates/src/test/resources/i18n/messages_de.properties.ejs +4 -1
  329. package/generators/languages/templates/src/test/resources/i18n/messages_el.properties.ejs +4 -1
  330. package/generators/languages/templates/src/test/resources/i18n/messages_es.properties.ejs +4 -1
  331. package/generators/languages/templates/src/test/resources/i18n/messages_et.properties.ejs +4 -1
  332. package/generators/languages/templates/src/test/resources/i18n/messages_fa.properties.ejs +4 -1
  333. package/generators/languages/templates/src/test/resources/i18n/messages_fi.properties.ejs +1 -1
  334. package/generators/languages/templates/src/test/resources/i18n/messages_gl.properties.ejs +4 -1
  335. package/generators/languages/templates/src/test/resources/i18n/messages_hi.properties.ejs +4 -1
  336. package/generators/languages/templates/src/test/resources/i18n/messages_hr.properties.ejs +1 -1
  337. package/generators/languages/templates/src/test/resources/i18n/messages_hu.properties.ejs +4 -1
  338. package/generators/languages/templates/src/test/resources/i18n/messages_hy.properties.ejs +4 -1
  339. package/generators/languages/templates/src/test/resources/i18n/messages_in.properties.ejs +4 -1
  340. package/generators/languages/templates/src/test/resources/i18n/messages_it.properties.ejs +4 -1
  341. package/generators/languages/templates/src/test/resources/i18n/messages_ja.properties.ejs +4 -1
  342. package/generators/languages/templates/src/test/resources/i18n/messages_ko.properties.ejs +4 -1
  343. package/generators/languages/templates/src/test/resources/i18n/messages_mr.properties.ejs +4 -1
  344. package/generators/languages/templates/src/test/resources/i18n/messages_my.properties.ejs +4 -1
  345. package/generators/languages/templates/src/test/resources/i18n/messages_nl.properties.ejs +4 -1
  346. package/generators/languages/templates/src/test/resources/i18n/messages_pa.properties.ejs +1 -1
  347. package/generators/languages/templates/src/test/resources/i18n/messages_pl.properties.ejs +4 -1
  348. package/generators/languages/templates/src/test/resources/i18n/messages_pt_BR.properties.ejs +1 -1
  349. package/generators/languages/templates/src/test/resources/i18n/messages_pt_PT.properties.ejs +4 -1
  350. package/generators/languages/templates/src/test/resources/i18n/messages_ro.properties.ejs +4 -1
  351. package/generators/languages/templates/src/test/resources/i18n/messages_ru.properties.ejs +4 -1
  352. package/generators/languages/templates/src/test/resources/i18n/messages_si.properties.ejs +4 -1
  353. package/generators/languages/templates/src/test/resources/i18n/messages_sk.properties.ejs +4 -1
  354. package/generators/languages/templates/src/test/resources/i18n/messages_sr.properties.ejs +4 -1
  355. package/generators/languages/templates/src/test/resources/i18n/messages_sv.properties.ejs +4 -1
  356. package/generators/languages/templates/src/test/resources/i18n/messages_ta.properties.ejs +4 -1
  357. package/generators/languages/templates/src/test/resources/i18n/messages_te.properties.ejs +4 -1
  358. package/generators/languages/templates/src/test/resources/i18n/messages_th.properties.ejs +4 -1
  359. package/generators/languages/templates/src/test/resources/i18n/messages_tr.properties.ejs +4 -1
  360. package/generators/languages/templates/src/test/resources/i18n/messages_ua.properties.ejs +4 -1
  361. package/generators/languages/templates/src/test/resources/i18n/messages_uz_Cyrl_UZ.properties.ejs +4 -1
  362. package/generators/languages/templates/src/test/resources/i18n/messages_uz_Latn_UZ.properties.ejs +4 -1
  363. package/generators/languages/templates/src/test/resources/i18n/messages_vi.properties.ejs +4 -1
  364. package/generators/languages/templates/src/test/resources/i18n/messages_zh_CN.properties.ejs +4 -1
  365. package/generators/languages/templates/src/test/resources/i18n/messages_zh_TW.properties.ejs +4 -1
  366. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  367. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.properties +3 -3
  368. package/generators/maven/templates/mvnw +0 -0
  369. package/generators/maven/templates/pom.xml.jhi.ejs +2 -2
  370. package/generators/openapi-client/files.js +2 -8
  371. package/generators/openapi-client/index.js +2 -0
  372. package/generators/openshift/templates/registry/consul.yml.ejs +1 -2
  373. package/generators/openshift/templates/registry/jhipster-registry.yml.ejs +1 -2
  374. package/generators/project-name/index.cjs +8 -5
  375. package/generators/server/cleanup-angular.js +37 -0
  376. package/generators/server/cleanup-cache-provider.js +46 -0
  377. package/generators/server/cleanup-cassandra.js +49 -0
  378. package/generators/server/cleanup-cucumber.js +40 -0
  379. package/generators/server/cleanup-elasticsearch.js +48 -0
  380. package/generators/server/cleanup-gradle.js +40 -0
  381. package/generators/server/cleanup-kafka.js +41 -0
  382. package/generators/server/cleanup-maven.js +37 -0
  383. package/generators/server/cleanup-mongodb.js +40 -0
  384. package/generators/server/cleanup-oauth2.js +43 -0
  385. package/generators/server/cleanup-reactive.js +38 -0
  386. package/generators/server/cleanup-sql.js +48 -0
  387. package/generators/server/cleanup.js +85 -51
  388. package/generators/server/esm.mjs +1 -0
  389. package/generators/server/files-couchbase.js +11 -10
  390. package/generators/server/files-sql.js +197 -4
  391. package/generators/server/files.js +180 -273
  392. package/generators/server/index.js +32 -86
  393. package/generators/server/needles.cjs +79 -0
  394. package/generators/server/templates/.mvn/jvm.config +1 -1
  395. package/generators/server/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  396. package/generators/server/templates/.mvn/wrapper/maven-wrapper.properties +3 -3
  397. package/generators/server/templates/.npmrc.ejs +1 -0
  398. package/generators/server/templates/build.gradle.ejs +121 -226
  399. package/generators/server/templates/couchbase/src/test/java/package/config/CouchbaseTestContainer.java.ejs +67 -0
  400. package/generators/server/templates/couchbase/src/test/java/package/config/EmbeddedCouchbase.java.ejs +30 -0
  401. package/generators/server/templates/gradle/docker.gradle.ejs +6 -0
  402. package/generators/server/templates/gradle/profile_dev.gradle.ejs +95 -3
  403. package/generators/server/templates/gradle/profile_prod.gradle.ejs +80 -4
  404. package/generators/server/templates/gradle.properties.ejs +17 -13
  405. package/generators/server/templates/gradlew +0 -0
  406. package/generators/server/templates/mvnw +0 -0
  407. package/generators/server/templates/npmw +0 -0
  408. package/generators/server/templates/pom.xml.ejs +274 -225
  409. package/generators/server/templates/settings.gradle.ejs +2 -1
  410. package/generators/server/templates/sql/common/src/main/docker/config/mariadb/my.cnf +49 -0
  411. package/generators/server/templates/sql/common/src/main/docker/config/mysql/my.cnf +82 -0
  412. package/generators/server/templates/{src → sql/common/src}/main/docker/mariadb.yml.ejs +2 -0
  413. package/generators/server/templates/{src → sql/common/src}/main/docker/mssql.yml.ejs +0 -0
  414. package/generators/server/templates/{src → sql/common/src}/main/docker/mysql.yml.ejs +2 -2
  415. package/generators/server/templates/{src → sql/common/src}/main/docker/postgresql.yml.ejs +0 -0
  416. package/generators/server/templates/{src → sql/common/src}/main/java/package/config/LiquibaseConfiguration.java.ejs +0 -0
  417. package/generators/server/templates/{src → sql/common/src}/main/resources/h2.server.properties.ejs +0 -0
  418. package/generators/server/templates/sql/common/src/test/java/package/config/EmbeddedSQL.java.ejs +30 -0
  419. package/generators/server/templates/sql/common/src/test/java/package/config/MariadbTestContainer.java.ejs +60 -0
  420. package/generators/server/templates/sql/common/src/test/java/package/config/MsSqlTestContainer.java.ejs +59 -0
  421. package/generators/server/templates/sql/common/src/test/java/package/config/MysqlTestContainer.java.ejs +69 -0
  422. package/generators/server/templates/sql/common/src/test/java/package/config/PostgreSqlTestContainer.java.ejs +59 -0
  423. package/generators/server/templates/sql/common/src/test/java/package/config/SqlTestContainer.java.ejs +28 -0
  424. package/generators/server/templates/{src → sql/common/src}/test/java/package/config/timezone/HibernateTimeZoneIT.java.ejs +0 -0
  425. package/generators/server/templates/{src → sql/common/src}/test/java/package/repository/timezone/DateTimeWrapper.java.ejs +0 -0
  426. package/generators/server/templates/{src → sql/common/src}/test/java/package/repository/timezone/DateTimeWrapperRepository.java.ejs +0 -0
  427. package/generators/server/templates/sql/common/src/test/resources/config/application-testdev.yml.ejs +93 -0
  428. package/generators/server/templates/{src/test/resources/config/application-testcontainers.yml.ejs → sql/common/src/test/resources/config/application-testprod.yml.ejs} +17 -33
  429. package/generators/server/templates/sql/common/src/test/resources/testcontainers/mariadb/my.cnf +49 -0
  430. package/generators/server/templates/sql/common/src/test/resources/testcontainers/mysql/my.cnf +83 -0
  431. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/EntityManager.java.ejs +0 -0
  432. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/rowmapper/ColumnConverter.java.ejs +0 -0
  433. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/rowmapper/UserRowMapper.java.ejs +0 -0
  434. package/generators/server/templates/src/main/docker/app.yml.ejs +16 -14
  435. package/generators/server/templates/src/main/docker/cassandra-migration.yml.ejs +1 -0
  436. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +62 -6
  437. package/generators/server/templates/src/main/docker/jhipster-control-center.yml.ejs +1 -1
  438. package/generators/server/templates/src/main/docker/jhipster-registry.yml.ejs +1 -1
  439. package/generators/server/templates/src/main/docker/jib/entrypoint.sh.ejs +36 -1
  440. package/generators/server/templates/src/main/docker/keycloak.yml.ejs +8 -6
  441. package/generators/server/templates/src/main/java/package/config/ApplicationProperties.java.ejs +3 -0
  442. package/generators/server/templates/src/main/java/package/config/AsyncConfiguration.java.ejs +2 -6
  443. package/generators/server/templates/src/main/java/package/config/DatabaseConfiguration_couchbase.java.ejs +1 -1
  444. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +16 -30
  445. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +108 -15
  446. package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +6 -0
  447. package/generators/server/templates/src/main/java/package/security/DomainUserDetailsService.java.ejs +6 -3
  448. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +10 -3
  449. package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +12 -2
  450. package/generators/server/templates/src/main/java/package/web/rest/LogoutResource.java.ejs +1 -5
  451. package/generators/server/templates/src/main/java/package/web/rest/LogoutResource_reactive.java.ejs +1 -5
  452. package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +3 -4
  453. package/generators/server/templates/src/main/resources/config/application-dev.yml.ejs +4 -3
  454. package/generators/server/templates/src/main/resources/config/application.yml.ejs +1 -1
  455. package/generators/server/templates/src/main/resources/config/liquibase/changelog/initial_schema.xml.ejs +1 -1
  456. package/generators/server/templates/src/main/resources/config/liquibase/master.xml.ejs +54 -24
  457. package/generators/server/templates/src/main/resources/swagger/api.yml.ejs +3 -3
  458. package/generators/server/templates/src/test/java/package/IntegrationTest.java.ejs +32 -19
  459. package/generators/server/templates/src/test/java/package/{repository/search/UserSearchRepositoryMockConfiguration.java.ejs → config/AsyncSyncConfiguration.java.ejs} +12 -10
  460. package/generators/server/templates/src/test/java/package/config/CassandraTestContainer.java.ejs +20 -1
  461. package/generators/{entity-server/templates/src/test/java/package/repository/search/EntitySearchRepositoryMockConfiguration.java.ejs → server/templates/src/test/java/package/config/ElasticsearchReactiveTestConfiguration.java.ejs} +14 -11
  462. package/generators/server/templates/src/test/java/package/config/ElasticsearchTestContainer.java.ejs +68 -0
  463. package/generators/server/templates/src/test/java/package/config/EmbeddedCassandra.java.ejs +19 -0
  464. package/generators/server/templates/src/test/java/package/config/EmbeddedElasticsearch.java.ejs +30 -0
  465. package/generators/server/templates/src/test/java/package/config/EmbeddedKafka.java.ejs +19 -0
  466. package/generators/server/templates/src/test/java/package/config/EmbeddedMongo.java.ejs +19 -0
  467. package/generators/server/templates/src/test/java/package/config/EmbeddedNeo4j.java.ejs +29 -0
  468. package/generators/server/templates/src/test/java/package/config/EmbeddedRedis.java.ejs +30 -0
  469. package/generators/server/templates/src/test/java/package/config/JHipsterBlockHoundIntegration.java.ejs +11 -2
  470. package/generators/server/templates/src/test/java/package/config/KafkaTestContainer.java.ejs +19 -1
  471. package/generators/server/templates/src/test/java/package/config/MongoDbTestContainer.java.ejs +5 -5
  472. package/generators/server/templates/src/test/java/package/config/Neo4jTestContainer.java.ejs +66 -0
  473. package/generators/server/templates/src/test/java/package/config/RedisTestContainer.java.ejs +57 -0
  474. package/generators/server/templates/src/test/java/package/config/{NoOpMailConfiguration.java.ejs → SpringBootTestClassOrderer.java.ejs} +16 -16
  475. package/generators/server/templates/src/test/java/package/config/TestContainersSpringContextCustomizerFactory.java.ejs +166 -30
  476. package/generators/server/templates/src/test/java/package/config/WebConfigurerTest.java.ejs +0 -23
  477. package/generators/server/templates/src/test/java/package/security/DomainUserDetailsServiceIT.java.ejs +5 -3
  478. package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +7 -15
  479. package/generators/server/templates/src/test/java/package/service/UserServiceIT.java.ejs +8 -11
  480. package/generators/server/templates/src/test/java/package/service/mapper/UserMapperTest.java.ejs +1 -1
  481. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +19 -73
  482. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT_skipUserManagement.java.ejs +0 -8
  483. package/generators/server/templates/src/test/java/package/web/rest/TestUtil.java.ejs +13 -10
  484. package/generators/server/templates/src/test/java/package/web/rest/UserResourceIT.java.ejs +76 -51
  485. package/generators/server/templates/src/test/resources/config/application.yml.ejs +13 -62
  486. package/generators/server/templates/src/test/resources/junit-platform.properties.ejs +1 -0
  487. package/generators/server/templates/src/test/resources/templates/mail/activationEmail.html.ejs +19 -0
  488. package/generators/server/templates/src/test/resources/templates/mail/creationEmail.html.ejs +19 -0
  489. package/generators/server/templates/src/test/resources/templates/mail/passwordResetEmail.html.ejs +21 -0
  490. package/generators/spring-controller/index.js +16 -1
  491. package/generators/sql-constants.js +85 -0
  492. package/generators/statistics.js +6 -5
  493. package/generators/upgrade/index.js +1 -1
  494. package/generators/utils.js +32 -30
  495. package/generators/workspaces/index.js +31 -28
  496. package/jdl/converters/jdl-to-json/jdl-to-json-relationship-converter.js +2 -3
  497. package/jdl/converters/json-to-jdl-converter.js +23 -6
  498. package/jdl/exporters/applications/jhipster-application-formatter.js +7 -0
  499. package/jdl/jhipster/application-options.js +8 -0
  500. package/jdl/jhipster/default-application-options.js +2 -2
  501. package/jdl/parsing/lexer/application-tokens.js +6 -0
  502. package/jdl/parsing/validator.js +7 -0
  503. package/jdl/validators/application-validator.js +3 -1
  504. package/jdl/validators/jdl-with-application-validator.js +1 -0
  505. package/jdl/validators/jdl-without-application-validator.js +3 -2
  506. package/lib/support/base.cjs +43 -0
  507. package/lib/support/needles.cjs +221 -0
  508. package/lib/support/shared-data.cjs +2 -2
  509. package/package.json +29 -27
  510. package/utils/blueprint.js +1 -1
  511. package/utils/entity.js +9 -1
  512. package/utils/field.js +18 -3
  513. package/utils/liquibase.js +5 -8
  514. package/utils/relationship.js +3 -2
  515. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-route.spec.tsx.ejs +0 -33
  516. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-route.tsx.ejs +0 -17
  517. package/generators/cypress/templates/cypress-audits.json.ejs +0 -32
  518. package/generators/cypress/templates/cypress.json.ejs +0 -46
  519. package/generators/docker-compose/templates/realm-config/jhipster-users-0.json.ejs +0 -61
  520. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/no-pagination-template.ejs +0 -81
  521. package/generators/server/templates/couchbase/src/test/java/package/CouchbaseTestContainerExtension.java.ejs +0 -56
  522. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-users-0.json.ejs +0 -61
  523. package/generators/server/templates/src/test/java/package/AbstractNeo4jIT.java.ejs +0 -44
  524. package/generators/server/templates/src/test/java/package/ReactiveSqlTestContainerExtension.java.ejs +0 -79
  525. package/generators/server/templates/src/test/java/package/RedisTestContainerExtension.java.ejs +0 -44
  526. package/generators/server/templates/src/test/resources/testcontainers/mariadb/my.cnf +0 -2
@@ -47,6 +47,9 @@ import org.springframework.context.annotation.Bean;
47
47
  import org.springframework.context.annotation.Import;
48
48
  <%_ if (authenticationTypeOauth2) { _%>
49
49
  import org.springframework.core.convert.converter.Converter;
50
+ <%_ if (!applicationTypeMicroservice) { _%>
51
+ import org.springframework.core.ParameterizedTypeReference;
52
+ <%_ } _%>
50
53
  <%_ } _%>
51
54
  import org.springframework.http.HttpMethod;
52
55
  <%_ if (authenticationTypeSession) { _%>
@@ -68,17 +71,18 @@ import org.springframework.security.core.AuthenticationException;
68
71
  import org.springframework.security.core.GrantedAuthority;
69
72
  import org.springframework.security.oauth2.client.oidc.userinfo.OidcReactiveOAuth2UserService;
70
73
  import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
71
- <%_ if (applicationTypeGateway) { _%>
74
+ <%_ if (!applicationTypeMicroservice) { _%>
75
+ import org.springframework.security.oauth2.client.registration.ClientRegistration;
72
76
  import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
73
77
  <%_ } _%>
74
78
  import org.springframework.security.oauth2.client.userinfo.ReactiveOAuth2UserService;
75
- <%_ if (applicationTypeGateway) { _%>
79
+ <%_ if (!applicationTypeMicroservice) { _%>
76
80
  import org.springframework.security.oauth2.client.web.server.DefaultServerOAuth2AuthorizationRequestResolver;
77
81
  import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizationRequestResolver;
78
82
  <%_ } _%>
79
83
  import org.springframework.security.oauth2.core.DelegatingOAuth2TokenValidator;
80
84
  import org.springframework.security.oauth2.core.OAuth2TokenValidator;
81
- <%_ if (applicationTypeGateway) { _%>
85
+ <%_ if (!applicationTypeMicroservice) { _%>
82
86
  import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
83
87
  <%_ } _%>
84
88
  import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
@@ -87,7 +91,6 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
87
91
  import org.springframework.security.oauth2.jwt.*;
88
92
  import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter;
89
93
  import org.springframework.security.web.server.csrf.CookieServerCsrfTokenRepository;
90
- import org.springframework.security.web.server.header.ReferrerPolicyServerHttpHeadersWriter;
91
94
  <%_ } _%>
92
95
  <%_ if (!authenticationTypeOauth2) { _%>
93
96
  <%_ if (skipUserManagement) { _%>
@@ -122,17 +125,25 @@ import org.springframework.security.web.server.util.matcher.OrServerWebExchangeM
122
125
  <%_ if (skipUserManagement && !authenticationTypeOauth2) { _%>
123
126
  import org.springframework.util.StringUtils;
124
127
  <%_ } _%>
128
+ import org.springframework.web.cors.reactive.CorsWebFilter;
125
129
  import org.zalando.problem.spring.webflux.advice.security.SecurityProblemSupport;
126
130
  <%_ if (authenticationTypeSession || authenticationTypeOauth2) { _%>
127
131
  import reactor.core.publisher.Mono;
128
132
  <%_ } _%>
129
133
  <%_ if (authenticationTypeOauth2) { _%>
134
+ <%_ if (!applicationTypeMicroservice) { _%>
135
+ import org.springframework.web.reactive.function.client.WebClient;
136
+
137
+ import java.util.Arrays;
138
+ import java.util.Map;
139
+ <%_ } _%>
130
140
 
131
141
  import java.util.HashSet;
132
142
  import java.util.Set;
133
- <%_ if (applicationType === 'gateway') { _%>
143
+ <%_ if (!applicationTypeMicroservice) { _%>
144
+ import java.util.concurrent.ConcurrentHashMap;
134
145
  import java.util.function.Consumer;
135
- <%_ } _%>
146
+ <%_ } _%>
136
147
  <%_ } _%>
137
148
 
138
149
  import static org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers.pathMatchers;
@@ -155,15 +166,20 @@ public class SecurityConfiguration {
155
166
  <%_ if (authenticationTypeOauth2) { _%>
156
167
  @Value("${spring.security.oauth2.client.provider.oidc.issuer-uri}")
157
168
  private String issuerUri;
158
- <%_ if (applicationTypeGateway) { _%>
169
+ <%_ if (!applicationTypeMicroservice) { _%>
159
170
 
160
171
  private final ReactiveClientRegistrationRepository clientRegistrationRepository;
172
+
173
+ // todo: optimize for scale https://github.com/jhipster/generator-jhipster/issues/18868
174
+ private final Map<String, Mono<Jwt>> users = new ConcurrentHashMap<>();
175
+
161
176
  <%_ } _%>
162
177
  <%_ } _%>
163
178
  private final SecurityProblemSupport problemSupport;
179
+ private final CorsWebFilter corsWebFilter;
164
180
 
165
- public SecurityConfiguration(<% if (!skipUserManagement && !authenticationTypeOauth2) { %>ReactiveUserDetailsService userDetailsService, <% } %><% if (authenticationTypeJwt) { %>TokenProvider tokenProvider, <% } %><% if (authenticationTypeOauth2 && applicationTypeGateway) { %> ReactiveClientRegistrationRepository clientRegistrationRepository, <% } %>JHipsterProperties jHipsterProperties, SecurityProblemSupport problemSupport) {
166
- <%_ if (authenticationTypeOauth2 && applicationTypeGateway) { _%>
181
+ public SecurityConfiguration(<% if (!skipUserManagement && !authenticationTypeOauth2) { %>ReactiveUserDetailsService userDetailsService, <% } %><% if (authenticationTypeJwt) { %>TokenProvider tokenProvider, <% } %><% if (authenticationTypeOauth2 && !applicationTypeMicroservice) { %> ReactiveClientRegistrationRepository clientRegistrationRepository, <% } %>JHipsterProperties jHipsterProperties, SecurityProblemSupport problemSupport, CorsWebFilter corsWebFilter) {
182
+ <%_ if (authenticationTypeOauth2 && !applicationTypeMicroservice) { _%>
167
183
  this.clientRegistrationRepository = clientRegistrationRepository;
168
184
  <%_ } _%>
169
185
  <%_ if (!skipUserManagement && !authenticationTypeOauth2) { _%>
@@ -174,6 +190,7 @@ public class SecurityConfiguration {
174
190
  <%_ } _%>
175
191
  this.jHipsterProperties = jHipsterProperties;
176
192
  this.problemSupport = problemSupport;
193
+ this.corsWebFilter = corsWebFilter;
177
194
  }
178
195
 
179
196
  <%_ if (!skipUserManagement && !authenticationTypeOauth2) { _%>
@@ -212,7 +229,7 @@ public class SecurityConfiguration {
212
229
  // @formatter:off
213
230
  http
214
231
  .securityMatcher(new NegatedServerWebExchangeMatcher(new OrServerWebExchangeMatcher(
215
- pathMatchers("/app/**", "/i18n/**", "/content/**", "/swagger-ui/**", "/v3/api-docs/**", "/test/**"),
232
+ pathMatchers("/app/**", "/_app/**", "/i18n/**", "/img/**", "/content/**", "/swagger-ui/**", "/v3/api-docs/**", "/test/**"),
216
233
  pathMatchers(HttpMethod.OPTIONS, "/**")
217
234
  )))
218
235
  .csrf()
@@ -224,6 +241,7 @@ public class SecurityConfiguration {
224
241
  <%_ } else { _%>
225
242
  .disable()
226
243
  <%_ } _%>
244
+ .addFilterBefore(corsWebFilter, SecurityWebFiltersOrder.REACTOR_CONTEXT)
227
245
  <%_ if (!skipClient) { _%>
228
246
  .addFilterAt(new SpaWebFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
229
247
  <%_ } _%>
@@ -275,16 +293,20 @@ public class SecurityConfiguration {
275
293
  .pathMatchers("/api/account/reset-password/init").permitAll()
276
294
  .pathMatchers("/api/account/reset-password/finish").permitAll()
277
295
  <%_ } _%>
296
+ <%_ if (authenticationTypeOauth2) { _%>
278
297
  .pathMatchers("/api/auth-info").permitAll()
298
+ <%_ } _%>
279
299
  .pathMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN)
280
300
  .pathMatchers("/api/**").authenticated()
281
301
  <%_ if (applicationTypeGateway) { _%>
302
+ <%_ if (microfrontend) { _%>
282
303
  // microfrontend resources are loaded by webpack without authentication, they need to be public
283
304
  .pathMatchers("/services/*/*.js").permitAll()
284
305
  .pathMatchers("/services/*/*.js.map").permitAll()
306
+ <%_ } _%>
285
307
  .pathMatchers("/services/*/v3/api-docs").hasAuthority(AuthoritiesConstants.ADMIN)
286
308
  <%_ } _%>
287
- <%_ if (applicationTypeMonolith || applicationTypeGateway) { _%>
309
+ <%_ if (!applicationTypeMicroservice) { _%>
288
310
  .pathMatchers("/services/**").authenticated()
289
311
  <%_ } _%>
290
312
  .pathMatchers("/management/health").permitAll()
@@ -294,8 +316,7 @@ public class SecurityConfiguration {
294
316
  .pathMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN);
295
317
  <%_ if (authenticationTypeOauth2) { _%>
296
318
 
297
- http<%_ if (applicationTypeGateway || applicationTypeMonolith) { _%><%_ if (applicationTypeGateway) { _%>.oauth2Login(oauth2 -> oauth2.authorizationRequestResolver(authorizationRequestResolver(this.clientRegistrationRepository)))<%_ } else { _%>.oauth2Login()
298
- .and()<%_ } _%>
319
+ http<%_ if (!applicationTypeMicroservice) { _%>.oauth2Login(oauth2 -> oauth2.authorizationRequestResolver(authorizationRequestResolver(this.clientRegistrationRepository)))
299
320
  <% } %>
300
321
  .oauth2ResourceServer()
301
322
  .jwt()
@@ -307,7 +328,7 @@ public class SecurityConfiguration {
307
328
  }
308
329
  <%_ if (authenticationTypeOauth2) { _%>
309
330
 
310
- <%_ if (applicationTypeGateway) { _%>
331
+ <%_ if (!applicationTypeMicroservice) { _%>
311
332
  private ServerOAuth2AuthorizationRequestResolver authorizationRequestResolver(
312
333
  ReactiveClientRegistrationRepository clientRegistrationRepository) {
313
334
  DefaultServerOAuth2AuthorizationRequestResolver authorizationRequestResolver =
@@ -359,7 +380,8 @@ public class SecurityConfiguration {
359
380
  }
360
381
 
361
382
  @Bean
362
- ReactiveJwtDecoder jwtDecoder() {
383
+ ReactiveJwtDecoder jwtDecoder(<%_ if (!applicationTypeMicroservice) { _%>ReactiveClientRegistrationRepository registrations<%_ } _%>) {
384
+ <%_ if (applicationTypeMicroservice) { _%>
363
385
  NimbusReactiveJwtDecoder jwtDecoder = (NimbusReactiveJwtDecoder) ReactiveJwtDecoders.fromOidcIssuerLocation(issuerUri);
364
386
 
365
387
  OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(jHipsterProperties.getSecurity().getOauth2().getAudience());
@@ -370,7 +392,78 @@ public class SecurityConfiguration {
370
392
 
371
393
  return jwtDecoder;
372
394
  }
395
+ <%_ } else { _%>
396
+
397
+ Mono<ClientRegistration> clientRegistration = registrations.findByRegistrationId("oidc");
398
+
399
+ return clientRegistration.map(oidc -> createJwtDecoder(
400
+ oidc.getProviderDetails().getIssuerUri(),
401
+ oidc.getProviderDetails().getJwkSetUri(),
402
+ oidc.getProviderDetails().getUserInfoEndpoint().getUri()
403
+ )).block();
404
+ }
405
+
406
+ private ReactiveJwtDecoder createJwtDecoder(String issuerUri, String jwkSetUri, String userInfoUri) {
407
+ NimbusReactiveJwtDecoder jwtDecoder = new NimbusReactiveJwtDecoder(jwkSetUri);
408
+ OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(
409
+ jHipsterProperties.getSecurity().getOauth2().getAudience());
410
+ OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuerUri);
411
+ OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);
412
+
413
+ jwtDecoder.setJwtValidator(withAudience);
373
414
 
415
+ return new ReactiveJwtDecoder() {
416
+ @Override
417
+ public Mono<Jwt> decode(String token) throws JwtException {
418
+ return jwtDecoder.decode(token)
419
+ .flatMap(jwt -> enrich(token, jwt));
420
+ }
421
+
422
+ private Mono<Jwt> enrich(String token, Jwt jwt) {
423
+ // Only look up user information if identity claims are missing
424
+ if (jwt.hasClaim("given_name") && jwt.hasClaim("family_name")) {
425
+ return Mono.just(jwt);
426
+ }
427
+ // Retrieve user info from OAuth provider if not already loaded
428
+ return users.computeIfAbsent(jwt.getSubject(), s -> {
429
+ WebClient webClient = WebClient.create();
430
+
431
+ return webClient
432
+ .get()
433
+ .uri(userInfoUri)
434
+ .headers(headers -> headers.setBearerAuth(token))
435
+ .retrieve()
436
+ .bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {})
437
+ .map(userInfo ->
438
+ Jwt
439
+ .withTokenValue(jwt.getTokenValue())
440
+ .subject(jwt.getSubject())
441
+ .audience(jwt.getAudience())
442
+ .headers(headers -> headers.putAll(jwt.getHeaders()))
443
+ .claims(claims -> {
444
+ String username = userInfo.get("preferred_username").toString();
445
+ // special handling for Auth0
446
+ if (userInfo.get("sub").toString().contains("|") && username.contains("@")) {
447
+ userInfo.put("email", username);
448
+ }
449
+ // Allow full name in a name claim - happens with Auth0
450
+ if (userInfo.get("name") != null) {
451
+ String[] name = userInfo.get("name").toString().split("\\s+");
452
+ if (name.length > 0) {
453
+ userInfo.put("given_name", name[0]);
454
+ userInfo.put("family_name", String.join(" ", Arrays.copyOfRange(name, 1, name.length)));
455
+ }
456
+ }
457
+ claims.putAll(userInfo);
458
+ })
459
+ .claims(claims -> claims.putAll(jwt.getClaims()))
460
+ .build()
461
+ );
462
+ });
463
+ }
464
+ };
465
+ }
466
+ <%_ } _%>
374
467
  <%_ } _%>
375
468
  <%_ if (authenticationTypeSession) { _%>
376
469
 
@@ -41,6 +41,9 @@ import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerF
41
41
  <%_ if (reactive && !skipClient) { _%>
42
42
  import org.springframework.boot.autoconfigure.web.reactive.ResourceHandlerRegistrationCustomizer;
43
43
  <%_ } _%>
44
+ <%_ if (messageBrokerKafka) { _%>
45
+ import org.springframework.cloud.stream.annotation.EnableBinding;
46
+ <%_ } _%>
44
47
  import org.springframework.context.annotation.Bean;
45
48
  import org.springframework.context.annotation.Configuration;
46
49
  <%_ if (reactive) { _%>
@@ -91,6 +94,9 @@ import java.util.concurrent.TimeUnit;
91
94
  /**
92
95
  * Configuration of web application with Servlet 3.0 APIs.
93
96
  */
97
+ <%_ if (messageBrokerKafka) { _%>
98
+ @EnableBinding({KafkaSseConsumer.class, KafkaSseProducer.class})
99
+ <%_ } _%>
94
100
  @Configuration
95
101
  public class WebConfigurer implements <% if (!reactive) { %>ServletContextInitializer<% if (!skipClient) { %>, WebServerFactoryCustomizer<WebServerFactory><% } %><% } %><% if (reactive) { %>WebFluxConfigurer<% } %> {
96
102
 
@@ -19,6 +19,9 @@
19
19
  package <%= packageName %>.security;
20
20
 
21
21
  import <%= packageName %>.domain.<%= asEntity('User') %>;
22
+ <%_ if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j) { _%>
23
+ import <%= packageName %>.domain.Authority;
24
+ <%_ } _%>
22
25
  import <%= packageName %>.repository.UserRepository;
23
26
  import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator;
24
27
  import org.slf4j.Logger;
@@ -60,7 +63,7 @@ public class DomainUserDetailsService implements <% if (reactive) { %>Reactive<%
60
63
 
61
64
  @Override
62
65
  <%_ if (databaseTypeSql) { _%>
63
- @Transactional
66
+ @Transactional(readOnly = true)
64
67
  <%_ } _%>
65
68
  public <% if (reactive) { %>Mono<UserDetails> findByUsername<% } else { %>UserDetails loadUserByUsername<% } %>(final String login) {
66
69
  log.debug("Authenticating {}", login);
@@ -89,8 +92,8 @@ public class DomainUserDetailsService implements <% if (reactive) { %>Reactive<%
89
92
  throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
90
93
  }
91
94
  List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()<% if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j) { %>
92
- .map(authority -> new SimpleGrantedAuthority(authority.getName()))<% } %><% if (databaseTypeCassandra || databaseTypeCouchbase) { %>
93
- .map(SimpleGrantedAuthority::new)<% } %>
95
+ .map(Authority::getName)<% } %>
96
+ .map(SimpleGrantedAuthority::new)
94
97
  .collect(Collectors.toList());
95
98
  return new org.springframework.security.core.userdetails.User(user.getLogin(),
96
99
  user.getPassword(),
@@ -31,6 +31,7 @@ import org.springframework.security.oauth2.jwt.MappedJwtClaimSetConverter;
31
31
  import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
32
32
  import org.springframework.security.oauth2.server.resource.web.DefaultBearerTokenResolver;
33
33
  import org.springframework.web.client.RestTemplate;
34
+ import org.springframework.web.context.request.RequestAttributes;
34
35
  import org.springframework.web.context.request.RequestContextHolder;
35
36
  import org.springframework.web.context.request.ServletRequestAttributes;
36
37
 
@@ -54,6 +55,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
54
55
 
55
56
  private final ClientRegistration registration;
56
57
 
58
+ // todo: optimize for scale https://github.com/jhipster/generator-jhipster/issues/18868
57
59
  private final Map<String, ObjectNode> users = new ConcurrentHashMap<>();
58
60
 
59
61
  public CustomClaimConverter(ClientRegistration registration, RestTemplate restTemplate) {
@@ -62,14 +64,19 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
62
64
  }
63
65
 
64
66
  public Map<String, Object> convert(Map<String, Object> claims) {
67
+ // Only look up user information if identity claims are missing
68
+ if (claims.containsKey("given_name") && claims.containsKey("family_name")) {
69
+ return claims;
70
+ }
65
71
  Map<String, Object> convertedClaims = this.delegate.convert(claims);
66
- if (RequestContextHolder.getRequestAttributes() != null && ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) != null) {
72
+ RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
73
+ if (attributes instanceof ServletRequestAttributes) {
67
74
  // Retrieve and set the token
68
- String token = bearerTokenResolver.resolve(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
75
+ String token = bearerTokenResolver.resolve(((ServletRequestAttributes) attributes).getRequest());
69
76
  HttpHeaders headers = new HttpHeaders();
70
77
  headers.set("Authorization", buildBearer(token));
71
78
 
72
- // Retrieve user infos from OAuth provider if not already loaded
79
+ // Retrieve user info from OAuth provider if not already loaded
73
80
  ObjectNode user = users.computeIfAbsent(claims.get("sub").toString(), s -> {
74
81
  ResponseEntity<ObjectNode> userInfo = restTemplate.exchange(registration.getProviderDetails().getUserInfoEndpoint().getUri(), HttpMethod.GET, new HttpEntity<String>(headers), ObjectNode.class);
75
82
  return userInfo.getBody();
@@ -911,7 +911,12 @@ public class UserService {
911
911
  // if IdP sends last updated information, use it to determine if an update should happen
912
912
  if (details.get("updated_at") != null) {
913
913
  Instant dbModifiedDate = existingUser.getLastModifiedDate();
914
- Instant idpModifiedDate = (Instant) details.get("updated_at");
914
+ Instant idpModifiedDate;
915
+ if (details.get("updated_at") instanceof Instant) {
916
+ idpModifiedDate = (Instant) details.get("updated_at");
917
+ } else {
918
+ idpModifiedDate = Instant.ofEpochSecond((Integer) details.get("updated_at"));
919
+ }
915
920
  if (idpModifiedDate.isAfter(dbModifiedDate)) {
916
921
  log.debug("Updating user '{}' in local database", user.getLogin());
917
922
  return updateUser(user.getFirstName(), user.getLastName(), user.getEmail(),
@@ -948,7 +953,12 @@ public class UserService {
948
953
  // if IdP sends last updated information, use it to determine if an update should happen
949
954
  if (details.get("updated_at") != null) {
950
955
  Instant dbModifiedDate = existingUser.get().getLastModifiedDate();
951
- Instant idpModifiedDate = (Instant) details.get("updated_at");
956
+ Instant idpModifiedDate;
957
+ if (details.get("updated_at") instanceof Instant) {
958
+ idpModifiedDate = (Instant) details.get("updated_at");
959
+ } else {
960
+ idpModifiedDate = Instant.ofEpochSecond((Integer) details.get("updated_at"));
961
+ }
952
962
  if (idpModifiedDate.isAfter(dbModifiedDate)) {
953
963
  log.debug("Updating user '{}' in local database", user.getLogin());
954
964
  updateUser(user.getFirstName(), user.getLastName(), user.getEmail(),
@@ -61,13 +61,9 @@ public class LogoutResource {
61
61
 
62
62
  String originUrl = request.getHeader(HttpHeaders.ORIGIN);
63
63
 
64
- if (logoutUrl.indexOf("/protocol") > -1) {
65
- logoutUrl.append("?redirect_uri=").append(originUrl);
66
- } else if (logoutUrl.indexOf("auth0.com") > -1) {
67
- // Auth0
64
+ if (issuerUri.contains("auth0.com")) {
68
65
  logoutUrl.append("?client_id=").append(this.registration.getClientId()).append("&returnTo=").append(originUrl);
69
66
  } else {
70
- // Okta
71
67
  logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
72
68
  }
73
69
 
@@ -68,13 +68,9 @@ public class LogoutResource {
68
68
  }
69
69
 
70
70
  String originUrl = request.getHeaders().getOrigin();
71
- if (logoutUrl.indexOf("/protocol") > -1) {
72
- logoutUrl.append("?redirect_uri=").append(originUrl);
73
- } else if (logoutUrl.indexOf("auth0.com") > -1) {
74
- // Auth0
71
+ if (issuerUri.contains("auth0.com")) {
75
72
  logoutUrl.append("?client_id=").append(clientRegistration.getClientId()).append("&returnTo=").append(originUrl);
76
73
  } else {
77
- // Okta
78
74
  logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
79
75
  }
80
76
  return Map.of("logoutUrl", logoutUrl.toString());
@@ -195,7 +195,7 @@ public class UserResource {
195
195
  .map(user -> {
196
196
  try {
197
197
  return ResponseEntity.created(new URI("/api/admin/users/" + user.getLogin()))
198
- .headers(HeaderUtil.createAlert(applicationName, "userManagement.created", user.getLogin()))
198
+ .headers(HeaderUtil.createAlert(applicationName, <% if (enableTranslation) { %> "userManagement.created"<% } else { %> "A user is created with identifier " + user.getLogin()<% } %>, user.getLogin()))
199
199
  .body(user);
200
200
  } catch (URISyntaxException e) {
201
201
  throw new RuntimeException(e);
@@ -248,7 +248,7 @@ public class UserResource {
248
248
  })
249
249
  .switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.NOT_FOUND)))
250
250
  .map(user -> ResponseEntity.ok()
251
- .headers(HeaderUtil.createAlert(applicationName, "userManagement.updated", userDTO.getLogin()))
251
+ .headers(HeaderUtil.createAlert(applicationName, <% if (enableTranslation) { %>"userManagement.updated"<% } else { %>"A user is updated with identifier " + userDTO.getLogin()<% } %>, userDTO.getLogin()))
252
252
  .body(user)
253
253
  );
254
254
  <%_ } else { _%>
@@ -357,11 +357,10 @@ public class UserResource {
357
357
  @DeleteMapping("/users/{login}")
358
358
  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
359
359
  <%_ if (reactive) { _%>
360
- @ResponseStatus(code = HttpStatus.NO_CONTENT)
361
360
  public Mono<ResponseEntity<Void>> deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
362
361
  log.debug("REST request to delete User: {}", login);
363
362
  return userService.deleteUser(login)
364
- .map(it -> ResponseEntity.noContent().headers(HeaderUtil.createAlert( applicationName, "userManagement.deleted", login)).build());
363
+ .then(Mono.just(ResponseEntity.noContent().headers(HeaderUtil.createAlert( applicationName, <% if (enableTranslation) { %> "userManagement.deleted"<% } else { %> "A user is deleted with identifier " + login<% } %>, login)).build()));
365
364
  <%_ } else { _%>
366
365
  public ResponseEntity<Void> deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
367
366
  log.debug("REST request to delete User: {}", login);
@@ -167,8 +167,6 @@ spring:
167
167
  jpa:
168
168
  <%_ if (devDatabaseTypePostgres) { _%>
169
169
  database-platform: tech.jhipster.domain.util.FixedPostgreSQL10Dialect
170
- <%_ } else if (devDatabaseTypeH2Any) { _%>
171
- database-platform: tech.jhipster.domain.util.FixedH2Dialect
172
170
  <%_ } _%>
173
171
  <%_ } _%>
174
172
  <%_ if (databaseTypeMongodb || databaseTypeCassandra || (searchEngineElasticsearch && reactive)) { _%>
@@ -355,7 +353,10 @@ jhipster:
355
353
  # CORS is only enabled by default with the "dev" profile
356
354
  cors:
357
355
  # Allow Ionic for JHipster by default (* no longer allowed in Spring Boot 2.4+)
358
- allowed-origins: "http://localhost:8100,https://localhost:8100,http://localhost:9000,https://localhost:9000<%_ if (!skipClient) { _%>,http://localhost:<%= devServerPort %>,https://localhost:<%= devServerPort %><%_ if (applicationTypeGateway && microfrontend) { for ({applicationIndex, devServerPort: microserviceDevServerPort = devServerPort + applicationIndex} of Object.values(jhipsterConfig.applications || {})) { _%>,http://localhost:<%= microserviceDevServerPort %>,https://localhost:<%= microserviceDevServerPort %><%_ } } _%><%_ } _%>"
356
+ <%_ if (microfrontend) { _%>
357
+ # Ports <%= devServerPort + 1 %>-<%= devServerPort + 9 %> are allowed for microfrontend development
358
+ <%_ } _%>
359
+ allowed-origins: "http://localhost:8100,https://localhost:8100,http://localhost:9000,https://localhost:9000<%_ if (!skipClient) { _%>,http://localhost:<%= devServerPort %>,https://localhost:<%= devServerPort %><%_ if (microfrontend) { for (let port = 1; port < 10; port++) { _%>,http://localhost:<%= devServerPort + port %>,https://localhost:<%= devServerPort + port %><%_ } _%><%_ } } _%>"
359
360
  # Enable CORS when running in GitHub Codespaces
360
361
  allowed-origin-patterns: 'https://*.githubpreview.dev'
361
362
  allowed-methods: "*"
@@ -305,7 +305,7 @@ spring:
305
305
  client:
306
306
  provider:
307
307
  oidc:
308
- issuer-uri: http://localhost:9080/auth/realms/jhipster
308
+ issuer-uri: http://localhost:9080/realms/jhipster
309
309
  registration:
310
310
  oidc:
311
311
  <%_ if (applicationTypeMicroservice) { _%>
@@ -21,7 +21,7 @@
21
21
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
22
22
  xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
23
23
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
24
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-<%= LIQUIBASE_DTD_VERSION %>.xsd
24
+ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
25
25
  http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
26
26
 
27
27
  <%_ const isAutoIncrementDB = reactive || prodDatabaseTypeMysql; _%>
@@ -2,38 +2,68 @@
2
2
  <databaseChangeLog
3
3
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4
4
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-<%= LIQUIBASE_DTD_VERSION %>.xsd">
6
-
5
+ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
6
+ <%_ if (devDatabaseTypeH2Any) { _%>
7
7
  <property name="now" value="now()" dbms="h2"/>
8
- <%_ if (prodDatabaseTypeMysql || prodDatabaseTypeMariadb) { _%>
9
- <property name="now" value="now()" dbms="mysql, mariadb"/>
8
+ <property name="floatType" value="float4" dbms="h2"/>
9
+ <%_ if (prodDatabaseTypeMysql || prodDatabaseTypeMariadb) { _%>
10
+ <property name="uuidType" value="varchar(36)" dbms="h2"/>
11
+ <%_ } else { _%>
12
+ <property name="uuidType" value="uuid" dbms="h2"/>
13
+ <%_ } _%>
14
+ <property name="datetimeType" value="datetime" dbms="h2"/>
15
+ <%_ if (reactive) { _%>
16
+ <property name="clobType" value="varchar(1000000)" dbms="h2"/>
17
+ <property name="blobType" value="varchar(1000000)" dbms="h2"/>
18
+ <%_ } else { _%>
19
+ <%_ if (prodDatabaseTypePostgres) { _%>
20
+ <property name="clobType" value="longvarchar" dbms="h2"/>
21
+ <%_ } else { _%>
22
+ <property name="clobType" value="clob" dbms="h2"/>
23
+ <%_ } _%>
24
+ <property name="blobType" value="blob" dbms="h2"/>
25
+ <%_ } _%>
26
+ <%_ } _%>
27
+ <%_ if (devDatabaseTypeMysql || prodDatabaseTypeMysql) { _%>
28
+ <property name="now" value="now()" dbms="mysql"/>
29
+ <property name="floatType" value="float" dbms="mysql"/>
30
+ <property name="clobType" value="clob" dbms="mysql"/>
31
+ <property name="blobType" value="longblob" dbms="mysql"/>
32
+ <property name="uuidType" value="varchar(36)" dbms="mysql"/>
33
+ <property name="datetimeType" value="datetime(6)" dbms="mysql"/>
34
+ <%_ } _%>
35
+ <%_ if (devDatabaseTypeMariadb || prodDatabaseTypeMariadb) { _%>
36
+ <property name="now" value="now()" dbms="mariadb"/>
37
+ <property name="floatType" value="float" dbms="mariadb"/>
38
+ <property name="clobType" value="clob" dbms="mariadb"/>
39
+ <property name="blobType" value="longblob" dbms="mariadb"/>
40
+ <property name="uuidType" value="varchar(36)" dbms="mariadb"/>
41
+ <property name="datetimeType" value="datetime(6)" dbms="mariadb"/>
10
42
  <%_ } _%>
11
- <%_ if (prodDatabaseTypePostgres) { _%>
43
+ <%_ if (devDatabaseTypePostgres || prodDatabaseTypePostgres) { _%>
12
44
  <property name="now" value="current_timestamp" dbms="postgresql"/>
45
+ <property name="floatType" value="float4" dbms="postgresql"/>
46
+ <property name="clobType" value="longvarchar" dbms="postgresql"/>
47
+ <property name="blobType" value="bytea" dbms="postgresql"/>
48
+ <property name="uuidType" value="uuid" dbms="postgresql"/>
49
+ <property name="datetimeType" value="datetime" dbms="postgresql"/>
13
50
  <%_ } _%>
14
- <%_ if (prodDatabaseTypeOracle) { _%>
51
+ <%_ if (devDatabaseTypeOracle || prodDatabaseTypeOracle) { _%>
15
52
  <property name="now" value="sysdate" dbms="oracle"/>
53
+ <property name="floatType" value="float" dbms="oracle"/>
54
+ <property name="clobType" value="clob" dbms="oracle"/>
55
+ <property name="blobType" value="blob" dbms="oracle"/>
56
+ <property name="uuidType" value="uuid" dbms="oracle"/>
57
+ <property name="datetimeType" value="datetime" dbms="oracle"/>
16
58
  <%_ } _%>
17
- <%_ if (prodDatabaseTypeMssql) { _%>
59
+ <%_ if (devDatabaseTypeMssql || prodDatabaseTypeMssql) { _%>
18
60
  <property name="now" value="GETDATE()" dbms="mssql"/>
61
+ <property name="floatType" value="float" dbms="mssql"/>
62
+ <property name="clobType" value="clob" dbms="mssql"/>
63
+ <property name="blobType" value="blob" dbms="mssql"/>
64
+ <property name="uuidType" value="uuid" dbms="mssql"/>
65
+ <property name="datetimeType" value="datetime" dbms="mssql"/>
19
66
  <%_ } _%>
20
- <property name="floatType" value="float4" dbms="postgresql, h2"/>
21
- <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/>
22
- <%_ if (prodDatabaseTypePostgres) { _%>
23
- <property name="clobType" value="longvarchar" dbms="h2"/>
24
- <%_ } else if (reactive) { _%>
25
- <property name="clobType" value="varchar(1000000)" dbms="h2"/>
26
- <%_ } else { _%>
27
- <property name="clobType" value="clob" dbms="h2"/>
28
- <%_ } _%>
29
- <property name="clobType" value="clob" dbms="mysql, oracle, mssql, mariadb, postgresql"/>
30
- <%_ if (prodDatabaseTypeMysql || prodDatabaseTypeMariadb) { _%>
31
- <property name="uuidType" value="varchar(36)" dbms="h2, mysql, mariadb"/>
32
- <%_ } else { _%>
33
- <property name="uuidType" value="uuid" dbms="h2, <%= prodDatabaseType %>"/>
34
- <%_ } _%>
35
- <property name="datetimeType" value="datetime(6)" dbms="mysql, mariadb"/>
36
- <property name="datetimeType" value="datetime" dbms="oracle, mssql, postgresql, h2"/>
37
67
 
38
68
  <include file="config/liquibase/changelog/00000000000000_initial_schema.xml" relativeToChangelogFile="false"/>
39
69
  <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here -->
@@ -62,8 +62,8 @@ security:
62
62
  description: OAuth2 authentication with KeyCloak
63
63
  flows:
64
64
  authorizationCode:
65
- authorizationUrl: http://localhost:9080/auth/realms/jhipster/protocol/openid-connect/auth
66
- tokenUrl: http://localhost:9080/auth/realms/jhipster/protocol/openid-connect/token
65
+ authorizationUrl: http://localhost:9080/realms/jhipster/protocol/openid-connect/auth
66
+ tokenUrl: http://localhost:9080/realms/jhipster/protocol/openid-connect/token
67
67
  scopes:
68
68
  jhipster: Jhipster specific claims
69
69
  email: Email claims
@@ -71,7 +71,7 @@ security:
71
71
  openId:
72
72
  type: openIdConnect
73
73
  description: OpenID Connect authentication with KeyCloak
74
- openIdConnectUrl: http://localhost:9080/auth/realms/jhipster/.well-known/openid-configuration
74
+ openIdConnectUrl: http://localhost:9080/realms/jhipster/.well-known/openid-configuration
75
75
  security:
76
76
  - oauth: [jhipster, email, profile]
77
77
  - openId: [jhipster, email, profile]