generator-jhipster 7.7.0 → 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 (603) hide show
  1. package/README.md +2 -3
  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 +21 -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/index.js +1 -1
  15. package/generators/ci-cd/templates/.gitlab-ci.yml.ejs +2 -3
  16. package/generators/ci-cd/templates/github-actions.yml.ejs +4 -4
  17. package/generators/client/files-angular.js +72 -89
  18. package/generators/client/files-common.js +1 -2
  19. package/generators/client/files-react.js +83 -71
  20. package/generators/client/files-vue.js +8 -54
  21. package/generators/client/index.js +19 -12
  22. package/generators/client/needle-api/needle-client-angular.js +1 -4
  23. package/generators/client/needle-api/needle-client-react.js +11 -8
  24. package/generators/client/prompts.js +1 -0
  25. package/generators/client/templates/angular/.eslintrc.json.ejs +10 -1
  26. package/generators/client/templates/angular/angular.json.ejs +1 -10
  27. package/generators/client/templates/angular/jest.conf.js.ejs +4 -2
  28. package/generators/client/templates/angular/package.json +33 -34
  29. package/generators/client/templates/angular/package.json.ejs +24 -23
  30. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.html.ejs +4 -4
  31. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.html.ejs +1 -1
  32. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.html.ejs +15 -15
  33. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.ts.ejs +17 -11
  34. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +16 -16
  35. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts.ejs +14 -9
  36. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +9 -9
  37. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.html.ejs +27 -27
  38. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.ts.ejs +28 -13
  39. package/generators/client/templates/angular/src/main/webapp/app/account/sessions/sessions.component.html.ejs +7 -7
  40. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.html.ejs +19 -19
  41. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.spec.ts.ejs +1 -1
  42. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.ts.ejs +35 -37
  43. package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +4 -4
  44. package/generators/client/templates/angular/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +7 -7
  45. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.html.ejs +6 -6
  46. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.module.ts.ejs +0 -1
  47. package/generators/client/templates/angular/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +3 -3
  48. package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.component.html.ejs +5 -5
  49. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +1 -1
  50. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html.ejs +5 -5
  51. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +10 -10
  52. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +10 -10
  53. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +9 -9
  54. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +8 -8
  55. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +5 -5
  56. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +4 -4
  57. package/generators/client/templates/angular/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +5 -5
  58. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +4 -4
  59. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +14 -14
  60. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +16 -16
  61. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +3 -2
  62. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +133 -138
  63. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts.ejs +22 -24
  64. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +40 -49
  65. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.model.ts.ejs +2 -2
  66. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.module.ts.ejs +0 -1
  67. package/generators/client/templates/angular/src/main/webapp/app/config/navigation.constants.ts.ejs +23 -0
  68. package/generators/client/templates/angular/src/main/webapp/app/config/pagination.constants.ts.ejs +2 -3
  69. package/generators/client/templates/angular/src/main/webapp/app/core/request/request-util.ts.ejs +1 -1
  70. package/generators/client/templates/angular/src/main/webapp/app/core/util/data-util.service.ts.ejs +1 -1
  71. package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
  72. package/generators/client/templates/angular/src/main/webapp/app/entities/user/user.model.ts.ejs +2 -2
  73. package/generators/client/templates/angular/src/main/webapp/app/entities/user/user.service.ts.ejs +7 -3
  74. package/generators/client/templates/angular/src/main/webapp/app/home/home.component.html.ejs +14 -14
  75. package/generators/client/templates/angular/src/main/webapp/app/layouts/error/error.component.html.ejs +1 -1
  76. package/generators/client/templates/angular/src/main/webapp/app/layouts/footer/footer.component.html.ejs +1 -1
  77. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +21 -21
  78. package/generators/client/templates/angular/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +1 -1
  79. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.html.ejs +9 -9
  80. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.ts.ejs +16 -27
  81. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.html.ejs +10 -0
  82. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.ts.ejs +23 -0
  83. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +40 -0
  84. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.ts.ejs +95 -0
  85. package/generators/client/templates/angular/src/main/webapp/app/shared/pagination/item-count.component.ts.ejs +1 -1
  86. package/generators/client/templates/angular/src/main/webapp/app/shared/shared.module.ts.ejs +3 -0
  87. package/generators/client/templates/angular/src/main/webapp/app/shared/sort/sort.service.ts.ejs +31 -0
  88. package/generators/client/templates/angular/src/main/webapp/declarations.d.ts.ejs +3 -8
  89. package/generators/client/templates/angular/tsconfig.json.ejs +6 -0
  90. package/generators/client/templates/angular/tsconfig.spec.json.ejs +1 -1
  91. package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +17 -2
  92. package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +1 -1
  93. package/generators/client/templates/common/package.json +8 -7
  94. package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +2 -0
  95. package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +2 -3
  96. package/generators/client/templates/react/.eslintrc.json.ejs +10 -1
  97. package/generators/client/templates/react/jest.conf.js.ejs +4 -2
  98. package/generators/client/templates/react/package.json +58 -59
  99. package/generators/client/templates/react/package.json.ejs +4 -3
  100. package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +1 -1
  101. package/generators/client/templates/react/src/main/webapp/app/app.tsx.ejs +3 -3
  102. package/generators/client/templates/react/src/main/webapp/app/config/store.ts.ejs +53 -6
  103. package/generators/client/templates/react/src/main/webapp/app/config/translation-middleware.ts.ejs +58 -0
  104. package/generators/client/templates/react/src/main/webapp/app/entities/menu.tsx.ejs +45 -0
  105. package/generators/client/templates/react/src/main/webapp/app/entities/reducers.ts.ejs +25 -0
  106. package/generators/client/templates/react/src/main/webapp/app/entities/routes.tsx.ejs +49 -0
  107. package/generators/client/templates/react/src/main/webapp/app/index.tsx.ejs +7 -7
  108. package/generators/client/templates/react/src/main/webapp/app/main.tsx.ejs +19 -0
  109. package/generators/client/templates/react/src/main/webapp/app/modules/account/activate/activate.tsx.ejs +8 -4
  110. package/generators/client/templates/react/src/main/webapp/app/modules/account/index.tsx.ejs +9 -6
  111. package/generators/client/templates/react/src/main/webapp/app/modules/account/password/password.tsx.ejs +1 -0
  112. package/generators/client/templates/react/src/main/webapp/app/modules/account/password-reset/finish/password-reset-finish.tsx.ejs +8 -5
  113. package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.ts.ejs +6 -7
  114. package/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health-modal.tsx.ejs +3 -2
  115. package/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health.tsx.ejs +4 -4
  116. package/generators/client/templates/react/src/main/webapp/app/modules/administration/index.tsx.ejs +14 -11
  117. package/generators/client/templates/react/src/main/webapp/app/modules/administration/logs/logs.tsx.ejs +1 -1
  118. package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +8 -2
  119. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/index.tsx.ejs +13 -13
  120. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-delete-dialog.tsx.ejs +7 -4
  121. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-detail.tsx.ejs +5 -3
  122. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management-update.tsx.ejs +10 -6
  123. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +20 -27
  124. package/generators/client/templates/react/src/main/webapp/app/modules/login/login-modal.tsx.ejs +5 -1
  125. package/generators/client/templates/react/src/main/webapp/app/modules/login/login-redirect.tsx.ejs +6 -3
  126. package/generators/client/templates/react/src/main/webapp/app/modules/login/login.tsx.ejs +6 -5
  127. package/generators/client/templates/react/src/main/webapp/app/routes.tsx.ejs +70 -25
  128. package/generators/client/templates/react/src/main/webapp/app/shared/auth/private-route.spec.tsx.ejs +30 -27
  129. package/generators/client/templates/react/src/main/webapp/app/shared/auth/private-route.tsx.ejs +35 -34
  130. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-routes.spec.tsx.ejs +55 -0
  131. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-routes.tsx.ejs +21 -0
  132. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary.spec.tsx.ejs +1 -1
  133. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary.tsx.ejs +1 -1
  134. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-loading.tsx.ejs +13 -0
  135. package/generators/client/templates/react/src/main/webapp/app/shared/error/page-not-found.tsx.ejs +9 -13
  136. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.spec.tsx.ejs +3 -5
  137. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.spec.tsx.ejs +5 -8
  138. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +35 -7
  139. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-item.tsx.ejs +12 -11
  140. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/index.ts.ejs +9 -2
  141. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.spec.ts.ejs +9 -3
  142. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.ts.ejs +21 -5
  143. package/generators/client/templates/react/src/main/webapp/app/typings.d.ts.ejs +15 -0
  144. package/generators/client/templates/react/src/main/webapp/microfrontends/entities-menu.tsx.ejs +3 -0
  145. package/generators/client/templates/react/src/main/webapp/microfrontends/entities-routes.tsx.ejs +3 -0
  146. package/generators/client/templates/react/tsconfig.json.ejs +5 -7
  147. package/generators/client/templates/react/tsconfig.test.json.ejs +10 -1
  148. package/generators/client/templates/react/webpack/webpack.common.js.ejs +12 -15
  149. package/generators/client/templates/react/webpack/webpack.dev.js.ejs +7 -8
  150. package/generators/client/templates/react/webpack/webpack.microfrontend.js.jhi.react.ejs +99 -0
  151. package/generators/client/templates/react/webpack/webpack.prod.js.ejs +31 -21
  152. package/generators/client/templates/vue/.eslintrc.js.ejs +10 -1
  153. package/generators/client/templates/vue/package.json +42 -42
  154. package/generators/client/templates/vue/package.json.ejs +4 -4
  155. package/generators/client/templates/vue/src/main/webapp/app/account/login-form/login-form.component.ts.ejs +2 -2
  156. package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.vue.ejs +1 -1
  157. package/generators/client/templates/vue/src/main/webapp/app/admin/user-management/user-management-edit.component.ts.ejs +2 -2
  158. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +6 -3
  159. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +2 -2
  160. package/generators/client/templates/vue/src/main/webapp/app/shared/alert/alert.service.ts.ejs +1 -1
  161. package/generators/client/templates/vue/src/main/webapp/app/shared/data/data-utils.service.ts.ejs +1 -1
  162. package/generators/client/templates/vue/src/main/webapp/app/shared/date/filters.ts.ejs +0 -6
  163. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +7 -2
  164. package/generators/client/templates/vue/src/test/javascript/spec/app/account/register/register.component.spec.ts.ejs +1 -1
  165. package/generators/client/templates/vue/tsconfig.json.ejs +1 -4
  166. package/generators/client/templates/vue/tsconfig.spec.json.ejs +2 -2
  167. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +6 -2
  168. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +4 -0
  169. package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +8 -1
  170. package/generators/client/transform-angular.cjs +117 -0
  171. package/generators/client/transform-react.cjs +126 -0
  172. package/generators/client/transform-vue.cjs +42 -0
  173. package/generators/common/files.js +2 -9
  174. package/generators/common/templates/.husky/pre-commit.ejs +0 -0
  175. package/generators/common/templates/README.md.jhi.ejs +21 -5
  176. package/generators/common/templates/package.json +3 -3
  177. package/generators/cypress/files.js +34 -22
  178. package/generators/cypress/index.js +42 -19
  179. package/generators/cypress/templates/cypress-audits.config.ts.ejs +28 -0
  180. package/generators/cypress/templates/cypress.config.ts.ejs +57 -0
  181. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/login-page.spec.ts.ejs → e2e/account/login-page.cy.ts.ejs} +0 -0
  182. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/password-page.spec.ts.ejs → e2e/account/password-page.cy.ts.ejs} +0 -0
  183. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/register-page.spec.ts.ejs → e2e/account/register-page.cy.ts.ejs} +0 -0
  184. 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
  185. package/generators/cypress/templates/src/test/javascript/cypress/{integration/account/settings-page.spec.ts.ejs → e2e/account/settings-page.cy.ts.ejs} +0 -0
  186. package/generators/cypress/templates/src/test/javascript/cypress/{integration/administration/administration.spec.ts.ejs → e2e/administration/administration.cy.ts.ejs} +1 -1
  187. package/generators/cypress/templates/src/test/javascript/cypress/{integration → e2e}/lighthouse.audits.ts.ejs +0 -0
  188. package/generators/cypress/templates/src/test/javascript/cypress/plugins/global.d.ts.ejs +25 -0
  189. package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +13 -14
  190. package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +4 -4
  191. package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +1 -1
  192. package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +8 -8
  193. package/generators/cypress/templates/src/test/javascript/cypress/tsconfig.json.ejs +8 -5
  194. package/generators/database-changelog-liquibase/files.js +1 -1
  195. package/generators/database-changelog-liquibase/index.js +3 -0
  196. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/added_entity.xml.ejs +1 -1
  197. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/added_entity_constraints.xml.ejs +1 -1
  198. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity.xml.ejs +1 -1
  199. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_constraints.xml.ejs +2 -2
  200. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_migrate.xml.ejs +1 -1
  201. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/fake-data/table_entity.csv.ejs +2 -2
  202. package/generators/docker-base.js +6 -3
  203. package/generators/docker-compose/files.js +5 -2
  204. package/generators/docker-compose/index.js +18 -25
  205. package/generators/docker-compose/templates/README-DOCKER-COMPOSE.md.ejs +1 -1
  206. package/generators/docker-compose/templates/docker-compose.yml.ejs +10 -8
  207. package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +62 -4
  208. package/generators/docker-prompts.js +1 -2
  209. package/generators/docker-utils.js +0 -1
  210. package/generators/entity/index.js +39 -34
  211. package/generators/entity/prompts.js +1 -52
  212. package/generators/entity-client/files-angular.cjs +169 -0
  213. package/generators/entity-client/files-cypress.cjs +52 -0
  214. package/generators/entity-client/files-react.cjs +113 -0
  215. package/generators/entity-client/files-vue.cjs +140 -0
  216. package/generators/entity-client/files.js +10 -381
  217. package/generators/entity-client/index.js +126 -17
  218. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.html.ejs +4 -5
  219. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.ts.ejs +2 -1
  220. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +12 -11
  221. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +0 -5
  222. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.model.ts.ejs +18 -25
  223. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.test-samples.ts.ejs +45 -0
  224. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +45 -37
  225. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +47 -28
  226. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +292 -94
  227. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/infinite-scroll-template.ejs +5 -106
  228. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/pagination-template.ejs +2 -82
  229. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +5 -5
  230. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.ts.ejs +5 -5
  231. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing.module.ts.ejs +2 -3
  232. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +89 -175
  233. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +69 -44
  234. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.spec.ts.ejs +111 -0
  235. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.ts.ejs +263 -0
  236. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.html.ejs +99 -120
  237. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.spec.ts.ejs +47 -71
  238. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +79 -195
  239. 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} +27 -17
  240. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-delete-dialog.tsx.ejs +12 -7
  241. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-detail.tsx.ejs +10 -7
  242. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +29 -23
  243. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.reducer.ts.ejs +2 -2
  244. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +32 -30
  245. package/generators/entity-client/templates/react/src/main/webapp/app/entities/index.tsx.ejs +13 -13
  246. package/generators/entity-client/templates/react/src/main/webapp/app/entities/react_validators.ejs +25 -32
  247. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +2 -2
  248. package/generators/entity-i18n/templates/i18n/entity_fr.json.ejs +1 -1
  249. package/generators/entity-server/cleanup.js +41 -0
  250. package/generators/entity-server/files.js +148 -63
  251. package/generators/entity-server/index.js +30 -25
  252. package/generators/entity-server/templates/couchbase/src/main/java/package/domain/Entity.java.jhi.spring_data_couchbase.ejs +1 -1
  253. package/generators/entity-server/templates/couchbase/src/main/java/package/repository/EntityRepository.java.ejs +31 -8
  254. package/generators/entity-server/templates/partials/save_template.ejs +1 -1
  255. package/generators/entity-server/templates/partials/update_template.ejs +77 -0
  256. package/generators/entity-server/templates/reactive/partials/save_template.ejs +1 -1
  257. package/generators/entity-server/templates/reactive/partials/update_template.ejs +41 -0
  258. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +13 -7
  259. package/generators/entity-server/templates/src/main/java/package/common/get_template.ejs +1 -1
  260. package/generators/entity-server/templates/src/main/java/package/common/inject_template.ejs +13 -4
  261. package/generators/entity-server/templates/src/main/java/package/common/patch_template.ejs +2 -2
  262. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +2 -1
  263. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.elastic_search.ejs +17 -0
  264. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.javax_lifecycle_events.ejs +31 -0
  265. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_cassandra.ejs +3 -1
  266. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_persistable.ejs +54 -0
  267. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_reactive.ejs +1 -1
  268. package/generators/entity-server/templates/src/main/java/package/domain/EntityCallback.java.ejs +43 -0
  269. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository.java.ejs +12 -7
  270. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +23 -27
  271. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryWithBagRelationships.java.ejs +2 -2
  272. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryWithBagRelationshipsImpl.java.ejs +17 -9
  273. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +18 -26
  274. package/generators/entity-server/templates/src/main/java/package/repository/EntitySqlHelper_reactive.java.ejs +2 -2
  275. package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +2 -2
  276. package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +50 -26
  277. package/generators/entity-server/templates/src/main/java/package/service/EntityQueryService.java.ejs +3 -3
  278. package/generators/entity-server/templates/src/main/java/package/service/EntityService.java.ejs +10 -2
  279. package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +22 -6
  280. package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +61 -90
  281. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +8 -9
  282. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +165 -144
  283. package/generators/gae/index.js +1 -1
  284. package/generators/generate-blueprint/constants.mjs +22 -2
  285. package/generators/generate-blueprint/esm.mjs +0 -0
  286. package/generators/generate-blueprint/generator.mjs +25 -6
  287. package/generators/generate-blueprint/templates/.github/workflows/generator.yml.ejs +5 -3
  288. package/generators/generate-blueprint/templates/cli/cli.mjs.ejs +0 -0
  289. package/generators/generate-blueprint/templates/cli/commands.cjs.ejs +2 -1
  290. package/generators/generate-blueprint/templates/generators/generator/generator.mjs.jhi.ejs +6 -5
  291. package/generators/generate-blueprint/templates/generators/generator/generator.spec.mjs.ejs +10 -1
  292. package/generators/generate-blueprint/templates/generators/generator/templates/template-file.ejs +0 -0
  293. package/generators/generator-base-blueprint.js +19 -20
  294. package/generators/generator-base-private.js +117 -65
  295. package/generators/generator-base.js +270 -91
  296. package/generators/generator-constants.js +119 -67
  297. package/generators/generator-defaults.js +1 -0
  298. package/generators/generator-transforms.js +0 -1
  299. package/generators/gradle/constants.cjs +1 -1
  300. package/generators/heroku/index.js +5 -4
  301. package/generators/heroku/templates/application-heroku.yml.ejs +1 -2
  302. package/generators/heroku/templates/heroku.gradle.ejs +28 -1
  303. package/generators/heroku/templates/pom-profile.xml.ejs +29 -0
  304. package/generators/init/templates/.husky/pre-commit +0 -0
  305. package/generators/java/index.cjs +2 -2
  306. package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -2
  307. package/generators/kubernetes/templates/db/mongodb.yml.ejs +1 -2
  308. package/generators/kubernetes/templates/ingress.yml.ejs +11 -4
  309. package/generators/kubernetes/templates/kubectl-apply.sh.ejs +0 -0
  310. package/generators/kubernetes/templates/monitoring/jhipster-grafana.yml.ejs +6 -2
  311. package/generators/kubernetes/templates/registry/consul.yml.ejs +1 -2
  312. package/generators/kubernetes/templates/registry/jhipster-registry.yml.ejs +1 -2
  313. package/generators/kubernetes-knative/templates/kubectl-apply.sh.ejs +0 -0
  314. package/generators/languages/templates/src/main/webapp/i18n/al/global.json.ejs +7 -1
  315. package/generators/languages/templates/src/main/webapp/i18n/ar-ly/global.json.ejs +7 -1
  316. package/generators/languages/templates/src/main/webapp/i18n/bg/global.json.ejs +7 -1
  317. package/generators/languages/templates/src/main/webapp/i18n/bn/global.json.ejs +7 -1
  318. package/generators/languages/templates/src/main/webapp/i18n/by/global.json.ejs +7 -1
  319. package/generators/languages/templates/src/main/webapp/i18n/ca/global.json.ejs +7 -1
  320. package/generators/languages/templates/src/main/webapp/i18n/cs/global.json.ejs +7 -1
  321. package/generators/languages/templates/src/main/webapp/i18n/da/global.json.ejs +7 -1
  322. package/generators/languages/templates/src/main/webapp/i18n/de/global.json.ejs +7 -1
  323. package/generators/languages/templates/src/main/webapp/i18n/el/global.json.ejs +7 -1
  324. package/generators/languages/templates/src/main/webapp/i18n/en/global.json.ejs +7 -1
  325. package/generators/languages/templates/src/main/webapp/i18n/en/health.json.ejs +3 -0
  326. package/generators/languages/templates/src/main/webapp/i18n/es/global.json.ejs +7 -1
  327. package/generators/languages/templates/src/main/webapp/i18n/et/global.json.ejs +7 -1
  328. package/generators/languages/templates/src/main/webapp/i18n/fa/global.json.ejs +7 -1
  329. package/generators/languages/templates/src/main/webapp/i18n/fi/global.json.ejs +7 -1
  330. package/generators/languages/templates/src/main/webapp/i18n/fr/global.json.ejs +7 -1
  331. package/generators/languages/templates/src/main/webapp/i18n/gl/global.json.ejs +7 -1
  332. package/generators/languages/templates/src/main/webapp/i18n/hi/global.json.ejs +7 -1
  333. package/generators/languages/templates/src/main/webapp/i18n/hr/global.json.ejs +7 -1
  334. package/generators/languages/templates/src/main/webapp/i18n/hu/global.json.ejs +7 -1
  335. package/generators/languages/templates/src/main/webapp/i18n/hy/global.json.ejs +7 -1
  336. package/generators/languages/templates/src/main/webapp/i18n/in/global.json.ejs +7 -1
  337. package/generators/languages/templates/src/main/webapp/i18n/it/global.json.ejs +7 -1
  338. package/generators/languages/templates/src/main/webapp/i18n/ja/global.json.ejs +7 -1
  339. package/generators/languages/templates/src/main/webapp/i18n/ko/global.json.ejs +7 -1
  340. package/generators/languages/templates/src/main/webapp/i18n/mr/global.json.ejs +7 -1
  341. package/generators/languages/templates/src/main/webapp/i18n/my/global.json.ejs +7 -1
  342. package/generators/languages/templates/src/main/webapp/i18n/nl/global.json.ejs +7 -1
  343. package/generators/languages/templates/src/main/webapp/i18n/pa/global.json.ejs +7 -1
  344. package/generators/languages/templates/src/main/webapp/i18n/pl/global.json.ejs +7 -1
  345. package/generators/languages/templates/src/main/webapp/i18n/pt-br/global.json.ejs +7 -1
  346. package/generators/languages/templates/src/main/webapp/i18n/pt-pt/global.json.ejs +7 -1
  347. package/generators/languages/templates/src/main/webapp/i18n/ro/global.json.ejs +7 -1
  348. package/generators/languages/templates/src/main/webapp/i18n/ru/global.json.ejs +7 -1
  349. package/generators/languages/templates/src/main/webapp/i18n/si/global.json.ejs +7 -1
  350. package/generators/languages/templates/src/main/webapp/i18n/sk/global.json.ejs +7 -1
  351. package/generators/languages/templates/src/main/webapp/i18n/sr/global.json.ejs +7 -1
  352. package/generators/languages/templates/src/main/webapp/i18n/sv/global.json.ejs +7 -1
  353. package/generators/languages/templates/src/main/webapp/i18n/ta/global.json.ejs +7 -1
  354. package/generators/languages/templates/src/main/webapp/i18n/te/global.json.ejs +7 -1
  355. package/generators/languages/templates/src/main/webapp/i18n/th/global.json.ejs +7 -1
  356. package/generators/languages/templates/src/main/webapp/i18n/tr/global.json.ejs +7 -1
  357. package/generators/languages/templates/src/main/webapp/i18n/ua/global.json.ejs +7 -1
  358. package/generators/languages/templates/src/main/webapp/i18n/uz-Cyrl-uz/global.json +7 -1
  359. package/generators/languages/templates/src/main/webapp/i18n/uz-Latn-uz/global.json.ejs +7 -1
  360. package/generators/languages/templates/src/main/webapp/i18n/vi/global.json.ejs +7 -1
  361. package/generators/languages/templates/src/main/webapp/i18n/zh-cn/global.json.ejs +7 -1
  362. package/generators/languages/templates/src/main/webapp/i18n/zh-tw/global.json.ejs +7 -1
  363. package/generators/languages/templates/src/test/resources/i18n/messages_al.properties.ejs +4 -1
  364. package/generators/languages/templates/src/test/resources/i18n/messages_ar_LY.properties.ejs +4 -1
  365. package/generators/languages/templates/src/test/resources/i18n/messages_bg.properties.ejs +1 -1
  366. package/generators/languages/templates/src/test/resources/i18n/messages_bn.properties.ejs +4 -1
  367. package/generators/languages/templates/src/test/resources/i18n/messages_by.properties.ejs +4 -1
  368. package/generators/languages/templates/src/test/resources/i18n/messages_ca.properties.ejs +4 -1
  369. package/generators/languages/templates/src/test/resources/i18n/messages_cs.properties.ejs +4 -1
  370. package/generators/languages/templates/src/test/resources/i18n/messages_da.properties.ejs +4 -1
  371. package/generators/languages/templates/src/test/resources/i18n/messages_de.properties.ejs +4 -1
  372. package/generators/languages/templates/src/test/resources/i18n/messages_el.properties.ejs +4 -1
  373. package/generators/languages/templates/src/test/resources/i18n/messages_es.properties.ejs +4 -1
  374. package/generators/languages/templates/src/test/resources/i18n/messages_et.properties.ejs +4 -1
  375. package/generators/languages/templates/src/test/resources/i18n/messages_fa.properties.ejs +4 -1
  376. package/generators/languages/templates/src/test/resources/i18n/messages_fi.properties.ejs +1 -1
  377. package/generators/languages/templates/src/test/resources/i18n/messages_gl.properties.ejs +4 -1
  378. package/generators/languages/templates/src/test/resources/i18n/messages_hi.properties.ejs +4 -1
  379. package/generators/languages/templates/src/test/resources/i18n/messages_hr.properties.ejs +1 -1
  380. package/generators/languages/templates/src/test/resources/i18n/messages_hu.properties.ejs +4 -1
  381. package/generators/languages/templates/src/test/resources/i18n/messages_hy.properties.ejs +4 -1
  382. package/generators/languages/templates/src/test/resources/i18n/messages_in.properties.ejs +4 -1
  383. package/generators/languages/templates/src/test/resources/i18n/messages_it.properties.ejs +4 -1
  384. package/generators/languages/templates/src/test/resources/i18n/messages_ja.properties.ejs +4 -1
  385. package/generators/languages/templates/src/test/resources/i18n/messages_ko.properties.ejs +4 -1
  386. package/generators/languages/templates/src/test/resources/i18n/messages_mr.properties.ejs +4 -1
  387. package/generators/languages/templates/src/test/resources/i18n/messages_my.properties.ejs +4 -1
  388. package/generators/languages/templates/src/test/resources/i18n/messages_nl.properties.ejs +4 -1
  389. package/generators/languages/templates/src/test/resources/i18n/messages_pa.properties.ejs +1 -1
  390. package/generators/languages/templates/src/test/resources/i18n/messages_pl.properties.ejs +4 -1
  391. package/generators/languages/templates/src/test/resources/i18n/messages_pt_BR.properties.ejs +1 -1
  392. package/generators/languages/templates/src/test/resources/i18n/messages_pt_PT.properties.ejs +4 -1
  393. package/generators/languages/templates/src/test/resources/i18n/messages_ro.properties.ejs +4 -1
  394. package/generators/languages/templates/src/test/resources/i18n/messages_ru.properties.ejs +4 -1
  395. package/generators/languages/templates/src/test/resources/i18n/messages_si.properties.ejs +4 -1
  396. package/generators/languages/templates/src/test/resources/i18n/messages_sk.properties.ejs +4 -1
  397. package/generators/languages/templates/src/test/resources/i18n/messages_sr.properties.ejs +4 -1
  398. package/generators/languages/templates/src/test/resources/i18n/messages_sv.properties.ejs +4 -1
  399. package/generators/languages/templates/src/test/resources/i18n/messages_ta.properties.ejs +4 -1
  400. package/generators/languages/templates/src/test/resources/i18n/messages_te.properties.ejs +4 -1
  401. package/generators/languages/templates/src/test/resources/i18n/messages_th.properties.ejs +4 -1
  402. package/generators/languages/templates/src/test/resources/i18n/messages_tr.properties.ejs +4 -1
  403. package/generators/languages/templates/src/test/resources/i18n/messages_ua.properties.ejs +4 -1
  404. package/generators/languages/templates/src/test/resources/i18n/messages_uz_Cyrl_UZ.properties.ejs +4 -1
  405. package/generators/languages/templates/src/test/resources/i18n/messages_uz_Latn_UZ.properties.ejs +4 -1
  406. package/generators/languages/templates/src/test/resources/i18n/messages_vi.properties.ejs +4 -1
  407. package/generators/languages/templates/src/test/resources/i18n/messages_zh_CN.properties.ejs +4 -1
  408. package/generators/languages/templates/src/test/resources/i18n/messages_zh_TW.properties.ejs +4 -1
  409. package/generators/maven/files.cjs +0 -1
  410. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  411. package/generators/maven/templates/.mvn/wrapper/maven-wrapper.properties +18 -2
  412. package/generators/maven/templates/mvnw +13 -7
  413. package/generators/maven/templates/mvnw.cmd +19 -13
  414. package/generators/maven/templates/pom.xml.jhi.ejs +2 -2
  415. package/generators/openapi-client/files.js +2 -8
  416. package/generators/openapi-client/index.js +2 -0
  417. package/generators/openshift/templates/registry/consul.yml.ejs +1 -2
  418. package/generators/openshift/templates/registry/jhipster-registry.yml.ejs +1 -2
  419. package/generators/project-name/index.cjs +8 -5
  420. package/generators/server/cleanup-angular.js +37 -0
  421. package/generators/server/cleanup-cache-provider.js +46 -0
  422. package/generators/server/cleanup-cassandra.js +49 -0
  423. package/generators/server/cleanup-cucumber.js +40 -0
  424. package/generators/server/cleanup-elasticsearch.js +48 -0
  425. package/generators/server/cleanup-gradle.js +40 -0
  426. package/generators/server/cleanup-kafka.js +41 -0
  427. package/generators/server/cleanup-maven.js +37 -0
  428. package/generators/server/cleanup-mongodb.js +40 -0
  429. package/generators/server/cleanup-oauth2.js +43 -0
  430. package/generators/server/cleanup-reactive.js +38 -0
  431. package/generators/server/cleanup-sql.js +48 -0
  432. package/generators/server/cleanup.js +89 -39
  433. package/generators/server/esm.mjs +1 -0
  434. package/generators/server/files-couchbase.js +11 -10
  435. package/generators/server/files-sql.js +197 -4
  436. package/generators/server/files.js +239 -248
  437. package/generators/server/index.js +38 -86
  438. package/generators/server/needle-api/needle-server-gradle.js +38 -0
  439. package/generators/server/needles.cjs +79 -0
  440. package/generators/server/templates/.mvn/jvm.config +1 -0
  441. package/generators/server/templates/.mvn/wrapper/maven-wrapper.jar +0 -0
  442. package/generators/server/templates/.mvn/wrapper/maven-wrapper.properties +18 -2
  443. package/generators/server/templates/.npmrc.ejs +1 -0
  444. package/generators/server/templates/build.gradle.ejs +126 -229
  445. package/generators/server/templates/couchbase/src/main/java/package/repository/JHipsterCouchbaseRepository.java.ejs +24 -1
  446. package/generators/server/templates/couchbase/src/test/java/package/config/CouchbaseTestContainer.java.ejs +67 -0
  447. package/generators/server/templates/couchbase/src/test/java/package/config/EmbeddedCouchbase.java.ejs +30 -0
  448. package/generators/server/templates/devcontainer/Dockerfile.ejs +25 -0
  449. package/generators/server/templates/devcontainer/devcontainer.json.ejs +64 -0
  450. package/generators/server/templates/gradle/docker.gradle.ejs +6 -0
  451. package/generators/server/templates/gradle/profile_dev.gradle.ejs +95 -3
  452. package/generators/server/templates/gradle/profile_prod.gradle.ejs +80 -4
  453. package/generators/server/templates/gradle/wrapper/gradle-wrapper.jar +0 -0
  454. package/generators/server/templates/gradle.properties.ejs +17 -13
  455. package/generators/server/templates/gradlew +0 -0
  456. package/generators/server/templates/mvnw +13 -7
  457. package/generators/server/templates/mvnw.cmd +19 -13
  458. package/generators/server/templates/npmw +0 -0
  459. package/generators/server/templates/pom.xml.ejs +287 -236
  460. package/generators/server/templates/settings.gradle.ejs +8 -5
  461. package/generators/server/templates/sql/common/src/main/docker/config/mariadb/my.cnf +49 -0
  462. package/generators/server/templates/sql/common/src/main/docker/config/mysql/my.cnf +82 -0
  463. package/generators/server/templates/{src → sql/common/src}/main/docker/mariadb.yml.ejs +2 -0
  464. package/generators/server/templates/{src → sql/common/src}/main/docker/mssql.yml.ejs +0 -0
  465. package/generators/server/templates/{src → sql/common/src}/main/docker/mysql.yml.ejs +2 -1
  466. package/generators/server/templates/{src → sql/common/src}/main/docker/postgresql.yml.ejs +0 -0
  467. package/generators/server/templates/{src → sql/common/src}/main/java/package/config/LiquibaseConfiguration.java.ejs +0 -0
  468. package/generators/server/templates/{src → sql/common/src}/main/resources/h2.server.properties.ejs +0 -0
  469. package/generators/server/templates/sql/common/src/test/java/package/config/EmbeddedSQL.java.ejs +30 -0
  470. package/generators/server/templates/sql/common/src/test/java/package/config/MariadbTestContainer.java.ejs +60 -0
  471. package/generators/server/templates/sql/common/src/test/java/package/config/MsSqlTestContainer.java.ejs +59 -0
  472. package/generators/server/templates/sql/common/src/test/java/package/config/MysqlTestContainer.java.ejs +69 -0
  473. package/generators/server/templates/sql/common/src/test/java/package/config/PostgreSqlTestContainer.java.ejs +59 -0
  474. package/generators/server/templates/sql/common/src/test/java/package/config/SqlTestContainer.java.ejs +28 -0
  475. package/generators/server/templates/{src → sql/common/src}/test/java/package/config/timezone/HibernateTimeZoneIT.java.ejs +0 -0
  476. package/generators/server/templates/{src → sql/common/src}/test/java/package/repository/timezone/DateTimeWrapper.java.ejs +0 -0
  477. package/generators/server/templates/{src → sql/common/src}/test/java/package/repository/timezone/DateTimeWrapperRepository.java.ejs +0 -0
  478. package/generators/server/templates/sql/common/src/test/resources/config/application-testdev.yml.ejs +93 -0
  479. package/generators/server/templates/{src/test/resources/config/application-testcontainers.yml.ejs → sql/common/src/test/resources/config/application-testprod.yml.ejs} +17 -33
  480. package/generators/server/templates/sql/common/src/test/resources/testcontainers/mariadb/my.cnf +49 -0
  481. package/generators/server/templates/sql/common/src/test/resources/testcontainers/mysql/my.cnf +83 -0
  482. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/EntityManager.java.ejs +48 -38
  483. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/rowmapper/ColumnConverter.java.ejs +0 -0
  484. package/generators/server/templates/{src → sql/reactive/src}/main/java/package/repository/rowmapper/UserRowMapper.java.ejs +0 -0
  485. package/generators/server/templates/src/main/docker/app.yml.ejs +18 -20
  486. package/generators/server/templates/src/main/docker/cassandra-migration.yml.ejs +1 -0
  487. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +64 -7
  488. package/generators/server/templates/src/main/docker/jhipster-control-center.yml.ejs +1 -1
  489. package/generators/server/templates/src/main/docker/jhipster-registry.yml.ejs +1 -1
  490. package/generators/server/templates/src/main/docker/jib/entrypoint.sh.ejs +36 -1
  491. package/generators/server/templates/src/main/docker/keycloak.yml.ejs +8 -6
  492. package/generators/server/templates/src/main/java/package/config/ApplicationProperties.java.ejs +3 -0
  493. package/generators/server/templates/src/main/java/package/config/AsyncConfiguration.java.ejs +2 -0
  494. package/generators/server/templates/src/main/java/package/config/DatabaseConfiguration_couchbase.java.ejs +1 -1
  495. package/generators/{client/templates/react/src/main/webapp/app/entities/index.tsx.ejs → server/templates/src/main/java/package/config/KafkaSseConsumer.java.ejs} +8 -14
  496. package/generators/server/templates/src/main/java/package/config/KafkaSseProducer.java.ejs +30 -0
  497. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +21 -33
  498. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +108 -15
  499. package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +6 -0
  500. package/generators/server/templates/src/main/java/package/security/DomainUserDetailsService.java.ejs +6 -3
  501. package/generators/server/templates/src/main/java/package/security/jwt/JWTFilter.java.ejs +1 -1
  502. package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +1 -1
  503. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +10 -3
  504. package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +12 -2
  505. package/generators/server/templates/src/main/java/package/web/rest/KafkaResource.java.ejs +60 -108
  506. package/generators/server/templates/src/main/java/package/web/rest/KafkaResource_reactive.java.ejs +74 -0
  507. package/generators/server/templates/src/main/java/package/web/rest/LogoutResource.java.ejs +1 -5
  508. package/generators/server/templates/src/main/java/package/web/rest/LogoutResource_reactive.java.ejs +1 -5
  509. package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +3 -4
  510. package/generators/server/templates/src/main/resources/config/application-dev.yml.ejs +4 -3
  511. package/generators/server/templates/src/main/resources/config/application.yml.ejs +27 -23
  512. package/generators/server/templates/src/main/resources/config/liquibase/changelog/initial_schema.xml.ejs +1 -1
  513. package/generators/server/templates/src/main/resources/config/liquibase/master.xml.ejs +54 -24
  514. package/generators/server/templates/src/main/resources/swagger/api.yml.ejs +3 -3
  515. package/generators/server/templates/src/test/java/package/CassandraKeyspaceIT.java.ejs +3 -4
  516. package/generators/server/templates/src/test/java/package/IntegrationTest.java.ejs +40 -21
  517. package/generators/server/templates/src/test/java/package/TechnicalStructureTest.java.ejs +0 -3
  518. package/generators/server/templates/src/test/java/package/{repository/search/UserSearchRepositoryMockConfiguration.java.ejs → config/AsyncSyncConfiguration.java.ejs} +12 -10
  519. package/generators/server/templates/src/test/java/package/config/CassandraTestContainer.java.ejs +141 -0
  520. 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
  521. package/generators/server/templates/src/test/java/package/config/ElasticsearchTestContainer.java.ejs +68 -0
  522. package/generators/server/templates/src/test/java/package/config/EmbeddedCassandra.java.ejs +30 -0
  523. package/generators/server/templates/src/test/java/package/config/EmbeddedElasticsearch.java.ejs +30 -0
  524. package/generators/server/templates/src/test/java/package/config/EmbeddedKafka.java.ejs +30 -0
  525. package/generators/server/templates/src/test/java/package/config/EmbeddedMongo.java.ejs +30 -0
  526. package/generators/server/templates/src/test/java/package/config/EmbeddedNeo4j.java.ejs +29 -0
  527. package/generators/server/templates/src/test/java/package/config/EmbeddedRedis.java.ejs +30 -0
  528. package/generators/server/templates/src/test/java/package/config/JHipsterBlockHoundIntegration.java.ejs +11 -2
  529. package/generators/server/templates/src/test/java/package/config/KafkaTestContainer.java.ejs +56 -0
  530. package/generators/server/templates/src/test/java/package/config/MongoDbTestContainer.java.ejs +67 -0
  531. package/generators/server/templates/src/test/java/package/config/Neo4jTestContainer.java.ejs +66 -0
  532. package/generators/server/templates/src/test/java/package/config/RedisTestContainer.java.ejs +57 -0
  533. package/generators/server/templates/src/test/java/package/config/{NoOpMailConfiguration.java.ejs → SpringBootTestClassOrderer.java.ejs} +16 -16
  534. package/generators/server/templates/src/test/java/package/config/TestContainersSpringContextCustomizerFactory.java.ejs +250 -0
  535. package/generators/server/templates/src/test/java/package/config/WebConfigurerTest.java.ejs +0 -23
  536. package/generators/server/templates/src/test/java/package/cucumber/CucumberIT.java.ejs +3 -10
  537. package/generators/server/templates/src/test/java/package/security/DomainUserDetailsServiceIT.java.ejs +6 -7
  538. package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +5 -5
  539. package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +9 -19
  540. package/generators/server/templates/src/test/java/package/service/UserServiceIT.java.ejs +9 -15
  541. package/generators/server/templates/src/test/java/package/service/mapper/UserMapperTest.java.ejs +1 -1
  542. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +20 -74
  543. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT_oauth2.java.ejs +1 -4
  544. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT_skipUserManagement.java.ejs +1 -12
  545. package/generators/server/templates/src/test/java/package/web/rest/KafkaResourceIT.java.ejs +52 -123
  546. package/generators/server/templates/src/test/java/package/web/rest/KafkaResourceIT_reactive.java.ejs +99 -0
  547. package/generators/server/templates/src/test/java/package/web/rest/PublicUserResourceIT.java.ejs +7 -10
  548. package/generators/server/templates/src/test/java/package/web/rest/TestUtil.java.ejs +13 -10
  549. package/generators/server/templates/src/test/java/package/web/rest/UserJWTControllerIT.java.ejs +1 -4
  550. package/generators/server/templates/src/test/java/package/web/rest/UserResourceIT.java.ejs +78 -56
  551. package/generators/server/templates/src/test/java/package/web/rest/errors/ExceptionTranslatorIT.java.ejs +1 -4
  552. package/generators/server/templates/src/test/java/package/web/rest/errors/ExceptionTranslatorIT_reactive.java.ejs +1 -4
  553. package/generators/server/templates/src/test/resources/META-INF/spring.factories.ejs +1 -1
  554. package/generators/server/templates/src/test/resources/config/application.yml.ejs +33 -81
  555. package/generators/server/templates/src/test/resources/junit-platform.properties.ejs +1 -0
  556. package/generators/server/templates/src/test/resources/templates/mail/activationEmail.html.ejs +19 -0
  557. package/generators/server/templates/src/test/resources/templates/mail/creationEmail.html.ejs +19 -0
  558. package/generators/server/templates/src/test/resources/templates/mail/passwordResetEmail.html.ejs +21 -0
  559. package/generators/server/templates/src/test/resources/testcontainers.properties.ejs +1 -0
  560. package/generators/spring-controller/index.js +16 -1
  561. package/generators/sql-constants.js +85 -0
  562. package/generators/statistics.js +6 -5
  563. package/generators/upgrade/index.js +1 -1
  564. package/generators/utils.js +32 -30
  565. package/generators/workspaces/index.js +32 -28
  566. package/jdl/converters/jdl-to-json/jdl-to-json-relationship-converter.js +2 -3
  567. package/jdl/converters/json-to-jdl-converter.js +23 -6
  568. package/jdl/exporters/applications/jhipster-application-formatter.js +7 -0
  569. package/jdl/jhipster/application-options.js +8 -0
  570. package/jdl/jhipster/default-application-options.js +2 -2
  571. package/jdl/parsing/lexer/application-tokens.js +6 -0
  572. package/jdl/parsing/validator.js +7 -0
  573. package/jdl/validators/application-validator.js +3 -1
  574. package/jdl/validators/jdl-with-application-validator.js +1 -0
  575. package/jdl/validators/jdl-without-application-validator.js +3 -2
  576. package/lib/support/base.cjs +43 -0
  577. package/lib/support/needles.cjs +221 -0
  578. package/lib/support/shared-data.cjs +2 -2
  579. package/package.json +34 -32
  580. package/utils/blueprint.js +1 -1
  581. package/utils/entity.js +11 -1
  582. package/utils/field.js +26 -6
  583. package/utils/liquibase.js +5 -8
  584. package/utils/relationship.js +13 -3
  585. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-route.spec.tsx.ejs +0 -33
  586. package/generators/client/templates/react/src/main/webapp/app/shared/error/error-boundary-route.tsx.ejs +0 -17
  587. package/generators/cypress/templates/cypress-audits.json.ejs +0 -32
  588. package/generators/cypress/templates/cypress.json.ejs +0 -46
  589. package/generators/docker-compose/templates/realm-config/jhipster-users-0.json.ejs +0 -61
  590. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/no-pagination-template.ejs +0 -81
  591. package/generators/entity-server/templates/src/main/java/package/repository/search/SortToSortBuilderListConverter.java.ejs +0 -25
  592. package/generators/maven/templates/.mvn/wrapper/MavenWrapperDownloader.java +0 -117
  593. package/generators/server/templates/.mvn/wrapper/MavenWrapperDownloader.java +0 -117
  594. package/generators/server/templates/couchbase/src/test/java/package/CouchbaseTestContainerExtension.java.ejs +0 -56
  595. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-users-0.json.ejs +0 -61
  596. package/generators/server/templates/src/main/java/package/config/KafkaProperties.java.ejs +0 -68
  597. package/generators/server/templates/src/test/java/package/AbstractCassandraTest.java.ejs +0 -125
  598. package/generators/server/templates/src/test/java/package/AbstractNeo4jIT.java.ejs +0 -44
  599. package/generators/server/templates/src/test/java/package/MongoDbTestContainerExtension.java.ejs +0 -37
  600. package/generators/server/templates/src/test/java/package/ReactiveSqlTestContainerExtension.java.ejs +0 -79
  601. package/generators/server/templates/src/test/java/package/RedisTestContainerExtension.java.ejs +0 -44
  602. package/generators/server/templates/src/test/java/package/TestContainersSpringContextCustomizerFactory.java.ejs +0 -24
  603. package/generators/server/templates/src/test/resources/testcontainers/mariadb/my.cnf +0 -2
@@ -21,16 +21,18 @@ version: '<%= DOCKER_COMPOSE_FORMAT_VERSION %>'
21
21
  services:
22
22
  keycloak:
23
23
  image: <%= DOCKER_KEYCLOAK %>
24
- command: ["-b", "0.0.0.0", "-Dkeycloak.migration.action=import", "-Dkeycloak.migration.provider=dir", "-Dkeycloak.migration.dir=/opt/jboss/keycloak/realm-config", "-Dkeycloak.migration.strategy=OVERWRITE_EXISTING", "-Djboss.socket.binding.port-offset=1000", "-Dkeycloak.profile.feature.upload_scripts=enabled"]
24
+ command: ['start-dev --import-realm']
25
25
  volumes:
26
- - ./realm-config:/opt/jboss/keycloak/realm-config
26
+ - ./realm-config:/opt/keycloak/data/import
27
27
  environment:
28
- - KEYCLOAK_USER=admin
29
- - KEYCLOAK_PASSWORD=admin
30
- - DB_VENDOR=h2
28
+ - KC_DB=dev-file
29
+ - KEYCLOAK_ADMIN=admin
30
+ - KEYCLOAK_ADMIN_PASSWORD=admin
31
+ - KC_FEATURES=scripts
32
+ - KC_HTTP_PORT=9080
33
+ - KC_HTTPS_PORT=9443
31
34
  # If you want to expose these ports outside your dev PC,
32
35
  # remove the "127.0.0.1:" prefix
33
36
  ports:
34
37
  - 127.0.0.1:9080:9080
35
38
  - 127.0.0.1:9443:9443
36
- - 127.0.0.1:10990:10990
@@ -28,4 +28,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
28
28
  */
29
29
  @ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
30
30
  public class ApplicationProperties {
31
+ // jhipster-needle-application-properties-property
32
+ // jhipster-needle-application-properties-property-getter
33
+ // jhipster-needle-application-properties-property-class
31
34
  }
@@ -26,6 +26,7 @@ import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
26
26
  import org.springframework.boot.autoconfigure.task.TaskExecutionProperties;
27
27
  import org.springframework.context.annotation.Bean;
28
28
  import org.springframework.context.annotation.Configuration;
29
+ import org.springframework.context.annotation.Profile;
29
30
  import org.springframework.scheduling.annotation.AsyncConfigurer;
30
31
  import org.springframework.scheduling.annotation.EnableAsync;
31
32
  import org.springframework.scheduling.annotation.EnableScheduling;
@@ -36,6 +37,7 @@ import java.util.concurrent.Executor;
36
37
  @Configuration
37
38
  @EnableAsync
38
39
  @EnableScheduling
40
+ @Profile("!testdev & !testprod")
39
41
  public class AsyncConfiguration implements AsyncConfigurer {
40
42
 
41
43
  private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class);
@@ -179,7 +179,7 @@ public class DatabaseConfiguration extends AbstractCouchbaseConfiguration {
179
179
  @Bean
180
180
  @Profile({JHipsterConstants.SPRING_PROFILE_TEST, JHipsterConstants.SPRING_PROFILE_E2E})
181
181
  public Couchmove waitForIndexes(Couchmove couchmove) {
182
- couchmove.waitForN1qlIndexes(getScopeName(), Duration.ofSeconds(60));
182
+ couchmove.waitForN1qlIndexes(getScopeName(), Duration.ofMinutes(15));
183
183
  return couchmove;
184
184
  }
185
185
 
@@ -16,21 +16,15 @@
16
16
  See the License for the specific language governing permissions and
17
17
  limitations under the License.
18
18
  -%>
19
- import React from 'react';
20
- import { Switch } from 'react-router-dom';
19
+ package <%= packageName %>.config;
21
20
 
22
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
23
- import ErrorBoundaryRoute from 'app/shared/error/error-boundary-route';
21
+ import org.springframework.cloud.stream.annotation.Input;
22
+ import org.springframework.messaging.MessageChannel;
24
23
 
25
- /* jhipster-needle-add-route-import - JHipster will add routes here */
24
+ public interface KafkaSseConsumer {
26
25
 
27
- const Routes = ({ match }) => (
28
- <div>
29
- <Switch>
30
- {/* prettier-ignore */}
31
- {/* jhipster-needle-add-route-path - JHipster will add routes here */}
32
- </Switch>
33
- </div>
34
- );
26
+ String CHANNELNAME = "binding-in-sse";
35
27
 
36
- export default Routes;
28
+ @Input(CHANNELNAME)
29
+ MessageChannel input();
30
+ }
@@ -0,0 +1,30 @@
1
+ <%#
2
+ Copyright 2013-2022 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ package <%= packageName %>.config;
20
+
21
+ import org.springframework.cloud.stream.annotation.Output;
22
+ import org.springframework.messaging.MessageChannel;
23
+
24
+ public interface KafkaSseProducer {
25
+
26
+ String CHANNELNAME = "binding-out-sse";
27
+
28
+ @Output(CHANNELNAME)
29
+ MessageChannel output();
30
+ }
@@ -45,7 +45,7 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity;
45
45
  <%_ } _%>
46
46
  <%_ } _%>
47
47
  import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
48
- import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
48
+ import org.springframework.security.web.SecurityFilterChain;
49
49
  <%_ if (authenticationTypeJwt || (authenticationTypeOauth2 && applicationTypeMicroservice)) { _%>
50
50
  import org.springframework.security.config.http.SessionCreationPolicy;
51
51
  <%_ } _%>
@@ -100,7 +100,7 @@ import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport;
100
100
  @EnableWebSecurity
101
101
  @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
102
102
  @Import(SecurityProblemSupport.class)
103
- public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
103
+ public class SecurityConfiguration {
104
104
 
105
105
  private final JHipsterProperties jHipsterProperties;
106
106
  <%_ if (authenticationTypeSession && !skipUserManagement) { _%>
@@ -159,35 +159,9 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
159
159
  return new BCryptPasswordEncoder();
160
160
  }
161
161
  <%_ } _%>
162
- <%_ if (!applicationTypeMicroservice) { _%>
163
162
 
164
- @Override
165
- public void configure(WebSecurity web) {
166
- web.ignoring()
167
- .antMatchers(HttpMethod.OPTIONS, "/**")
168
- <%_ if (!skipClient) { _%>
169
- .antMatchers("/app/**/*.{js,html}")
170
- .antMatchers("/i18n/**")
171
- .antMatchers("/content/**")
172
- <%_ } _%>
173
- <%_ if (devDatabaseTypeH2Any) { _%>
174
- .antMatchers("/h2-console/**")
175
- <%_ } _%>
176
- .antMatchers("/swagger-ui/**")
177
- .antMatchers("/test/**");
178
- }
179
- <%_ } else { _%>
180
- <%_ if (devDatabaseTypeH2Any) { _%>
181
- @Override
182
- public void configure(WebSecurity web) {
183
- web.ignoring()
184
- .antMatchers("/h2-console/**");
185
- }
186
- <%_ } _%>
187
- <%_ } _%>
188
-
189
- @Override
190
- public void configure(HttpSecurity http) throws Exception {
163
+ @Bean
164
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
191
165
  // @formatter:off
192
166
  http
193
167
  .csrf()
@@ -236,7 +210,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
236
210
  .permissionsPolicy().policy("camera=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), sync-xhr=()")
237
211
  .and()
238
212
  .frameOptions()
239
- .deny()
213
+ .sameOrigin()
240
214
  .and()
241
215
  <%_ if (authenticationTypeJwt || (authenticationTypeOauth2 && applicationTypeMicroservice)) { _%>
242
216
  .sessionManagement()
@@ -244,6 +218,19 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
244
218
  .and()
245
219
  <%_ } _%>
246
220
  .authorizeRequests()
221
+ <%_ if (!applicationTypeMicroservice) { _%>
222
+ .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
223
+ <%_ if (!skipClient) { _%>
224
+ .antMatchers("/app/**/*.{js,html}").permitAll()
225
+ .antMatchers("/i18n/**").permitAll()
226
+ .antMatchers("/content/**").permitAll()
227
+ <%_ } _%>
228
+ .antMatchers("/swagger-ui/**").permitAll()
229
+ .antMatchers("/test/**").permitAll()
230
+ <%_ } _%>
231
+ <%_ if (devDatabaseTypeH2Any) { _%>
232
+ .antMatchers("/h2-console/**").permitAll()
233
+ <%_ } _%>
247
234
  .antMatchers("/api/authenticate").permitAll()
248
235
  <%_ if (!authenticationTypeOauth2 && !skipUserManagement) { _%>
249
236
  .antMatchers("/api/register").permitAll()
@@ -284,6 +271,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
284
271
  .and()
285
272
  .oauth2Client();
286
273
  <%_ } _%>
274
+ return http.build();
287
275
  // @formatter:on
288
276
  }
289
277
  <%_ if (authenticationTypeJwt) { _%>
@@ -325,7 +313,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
325
313
  <%_ } _%>
326
314
 
327
315
  @Bean
328
- JwtDecoder jwtDecoder(<%_ if (authenticationTypeOauth2 && applicationTypeMonolith) { _%>ClientRegistrationRepository clientRegistrationRepository, RestTemplateBuilder restTemplateBuilder<%_ } _%>) {
316
+ JwtDecoder jwtDecoder(<%_ if (!applicationTypeMicroservice) { _%>ClientRegistrationRepository clientRegistrationRepository, RestTemplateBuilder restTemplateBuilder<%_ } _%>) {
329
317
  NimbusJwtDecoder jwtDecoder = JwtDecoders.fromOidcIssuerLocation(issuerUri);
330
318
 
331
319
  OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(jHipsterProperties.getSecurity().getOauth2().getAudience());
@@ -333,7 +321,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
333
321
  OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);
334
322
 
335
323
  jwtDecoder.setJwtValidator(withAudience);
336
- <%_ if (authenticationTypeOauth2 && applicationTypeMonolith) { _%>
324
+ <%_ if (!applicationTypeMicroservice) { _%>
337
325
  jwtDecoder.setClaimSetConverter(new CustomClaimConverter(clientRegistrationRepository.findByRegistrationId("oidc"), restTemplateBuilder.build()));
338
326
  <%_ } _%>
339
327
 
@@ -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(),
@@ -75,7 +75,7 @@ public class JWTFilter <% if (reactive) { %>implements WebFilter<% } else { %>ex
75
75
  if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
76
76
  Authentication authentication = this.tokenProvider.getAuthentication(jwt);
77
77
  <%_ if (reactive) { _%>
78
- return chain.filter(exchange).subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));
78
+ return chain.filter(exchange).contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication));
79
79
  }
80
80
  return chain.filter(exchange);
81
81
  <%_ } else { _%>
@@ -106,7 +106,7 @@ public class TokenProvider {
106
106
  .signWith(key, SignatureAlgorithm.HS512)
107
107
  .setExpiration(validity)
108
108
  <%_ if (reactive) { _%>
109
- .serializeToJsonWith(new JacksonSerializer())
109
+ .serializeToJsonWith(new JacksonSerializer<>())
110
110
  <%_ } _%>
111
111
  .compact();
112
112
  }
@@ -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(),