generator-jhipster 7.3.0 → 7.5.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 (340) hide show
  1. package/cli/import-jdl.js +3 -2
  2. package/cli/jhipster-command.js +2 -2
  3. package/cli/program.js +32 -29
  4. package/generators/app/index.js +46 -27
  5. package/generators/aws/index.js +8 -8
  6. package/generators/aws/lib/eb.js +1 -1
  7. package/generators/azure-app-service/index.js +16 -9
  8. package/generators/azure-app-service/templates/github/workflows/azure-app-service.yml.ejs +2 -2
  9. package/generators/azure-spring-cloud/index.js +16 -9
  10. package/generators/azure-spring-cloud/templates/github/workflows/azure-spring-cloud.yml.ejs +2 -2
  11. package/generators/bootstrap/index.js +57 -62
  12. package/generators/ci-cd/index.js +11 -8
  13. package/generators/ci-cd/templates/github-actions.yml.ejs +1 -1
  14. package/generators/ci-cd/templates/travis.yml.ejs +9 -4
  15. package/generators/cleanup.js +27 -171
  16. package/generators/client/files-angular.js +12 -1
  17. package/generators/client/files-common.js +6 -2
  18. package/generators/client/files-react.js +13 -2
  19. package/generators/client/files-vue.js +59 -7
  20. package/generators/client/index.js +46 -32
  21. package/generators/client/needle-api/needle-client-angular.js +1 -1
  22. package/generators/client/needle-api/needle-client-vue.js +57 -7
  23. package/generators/client/templates/angular/.eslintrc.json.ejs +1 -0
  24. package/generators/client/templates/angular/angular.json.ejs +5 -0
  25. package/generators/client/templates/angular/jest.conf.js.ejs +2 -0
  26. package/generators/client/templates/angular/package.json +29 -29
  27. package/generators/client/templates/angular/package.json.ejs +3 -1
  28. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.spec.ts.ejs +52 -54
  29. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.ts.ejs +4 -4
  30. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.service.spec.ts.ejs +65 -0
  31. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts.ejs +35 -37
  32. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
  33. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.spec.ts.ejs +78 -80
  34. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.ts.ejs +4 -4
  35. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.service.spec.ts.ejs +41 -0
  36. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts.ejs +73 -75
  37. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts.ejs +4 -4
  38. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.spec.ts.ejs +62 -0
  39. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts.ejs +44 -46
  40. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.service.spec.ts.ejs +61 -0
  41. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.spec.ts.ejs +122 -123
  42. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.ts.ejs +1 -1
  43. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.service.spec.ts.ejs +66 -0
  44. package/generators/client/templates/angular/src/main/webapp/app/account/sessions/sessions.component.spec.ts.ejs +75 -77
  45. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.spec.ts.ejs +80 -80
  46. package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.component.spec.ts.ejs +48 -50
  47. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.spec.ts.ejs +45 -47
  48. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.ts.ejs +4 -4
  49. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.spec.ts.ejs +66 -0
  50. package/generators/client/templates/angular/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts.ejs +99 -101
  51. package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.component.spec.ts.ejs +61 -63
  52. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +2 -2
  53. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/metrics.component.spec.ts.ejs +28 -30
  54. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts.ejs +35 -37
  55. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts.ejs +40 -42
  56. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts.ejs +89 -91
  57. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +4 -4
  58. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts.ejs +81 -83
  59. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +8 -8
  60. package/generators/client/templates/angular/src/main/webapp/app/app-routing.module.ts.ejs +14 -3
  61. package/generators/client/templates/angular/src/main/webapp/app/app.module.ts.ejs +8 -29
  62. package/generators/client/templates/angular/src/main/webapp/app/config/datepicker-adapter.ts.ejs +1 -1
  63. package/generators/client/templates/angular/src/main/webapp/app/config/dayjs.ts.ejs +4 -4
  64. package/generators/client/templates/angular/src/main/webapp/app/core/auth/account.service.spec.ts.ejs +14 -9
  65. package/generators/client/templates/angular/src/main/webapp/app/core/tracker/tracker.service.ts.ejs +6 -6
  66. package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
  67. package/generators/client/templates/angular/src/main/webapp/app/entities/entity-navbar-items.ts.ejs +29 -0
  68. package/generators/client/templates/angular/src/main/webapp/app/home/home.component.spec.ts.ejs +106 -98
  69. package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +166 -168
  70. package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.ts.ejs +1 -1
  71. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +20 -0
  72. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts.ejs +74 -70
  73. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +41 -2
  74. package/generators/client/templates/angular/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts.ejs +27 -29
  75. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.spec.ts.ejs +114 -115
  76. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.ts.ejs +4 -4
  77. package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert-error.component.spec.ts.ejs +132 -134
  78. package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert.component.spec.ts.ejs +29 -31
  79. package/generators/client/templates/angular/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts.ejs +4 -4
  80. package/generators/client/templates/angular/src/main/webapp/app/shared/date/duration.pipe.ts.ejs +1 -1
  81. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts.ejs +1 -1
  82. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.ts.ejs +1 -1
  83. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts.ejs +1 -1
  84. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts.ejs +1 -1
  85. package/generators/client/templates/angular/src/main/webapp/app/shared/language/translate.directive.ts.ejs +6 -6
  86. package/generators/client/templates/angular/src/main/webapp/app/shared/language/translation.module.ts.ejs +83 -0
  87. package/generators/client/templates/angular/src/main/webapp/declarations.d.ts.ejs +16 -2
  88. package/generators/client/templates/angular/tsconfig.json.ejs +2 -0
  89. package/generators/client/templates/angular/tsconfig.spec.json.ejs +0 -1
  90. package/generators/client/templates/angular/webpack/proxy.conf.js.ejs +0 -2
  91. package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +0 -16
  92. package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +12 -5
  93. package/generators/client/templates/common/package.json +6 -6
  94. package/generators/client/templates/common/src/main/webapp/robots.txt.ejs +0 -1
  95. package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +86 -56
  96. package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +56 -0
  97. package/generators/client/templates/react/.eslintrc.json.ejs +1 -0
  98. package/generators/client/templates/react/package.json +54 -53
  99. package/generators/client/templates/react/package.json.ejs +6 -1
  100. package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +0 -3
  101. package/generators/client/templates/react/src/main/webapp/app/config/axios-interceptor.spec.ts.ejs +3 -2
  102. package/generators/client/templates/react/src/main/webapp/app/modules/account/password/password.tsx.ejs +2 -2
  103. package/generators/client/templates/react/src/main/webapp/app/modules/administration/configuration/configuration.tsx.ejs +2 -2
  104. package/generators/client/templates/react/src/main/webapp/app/modules/administration/gateway/gateway.tsx.ejs +2 -2
  105. package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +6 -6
  106. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +8 -8
  107. package/generators/client/templates/react/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
  108. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.scss.ejs +9 -0
  109. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.tsx.ejs +2 -2
  110. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.tsx.ejs +3 -3
  111. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +7 -7
  112. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-components.tsx.ejs +1 -1
  113. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.spec.ts.ejs +1 -1
  114. package/generators/client/templates/react/webpack/webpack.dev.js.ejs +17 -3
  115. package/generators/client/templates/react/webpack/webpack.prod.js.ejs +13 -1
  116. package/generators/client/templates/vue/.eslintrc.js.ejs +8 -5
  117. package/generators/client/templates/vue/package.json +40 -49
  118. package/generators/client/templates/vue/package.json.ejs +13 -17
  119. package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +23 -12
  120. package/generators/client/templates/vue/src/main/webapp/app/account/settings/settings.vue.ejs +7 -1
  121. package/generators/client/templates/vue/src/main/webapp/app/admin/configuration/configuration.vue.ejs +1 -1
  122. package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.component.ts.ejs +1 -1
  123. package/generators/client/templates/vue/src/main/webapp/app/constants.ts.ejs +16 -6
  124. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +27 -8
  125. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +6 -0
  126. package/generators/client/templates/vue/src/main/webapp/app/declarations.d.ts.ejs +41 -0
  127. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.component.ts.ejs +34 -0
  128. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.vue.ejs +13 -0
  129. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.component.ts.ejs +20 -0
  130. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.vue.ejs +5 -0
  131. package/generators/client/templates/vue/src/main/webapp/app/entities/user/{user.oauth2.service.ts.ejs → user.service.ts.ejs} +1 -1
  132. package/generators/client/templates/vue/{webpack/utils.js.ejs → src/main/webapp/app/index.ts.ejs} +1 -12
  133. package/generators/client/templates/vue/src/main/webapp/app/locale/translation.service.ts.ejs +26 -9
  134. package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +20 -18
  135. package/generators/client/templates/vue/src/main/webapp/app/router/entities.ts.ejs +45 -3
  136. package/generators/client/templates/vue/src/main/webapp/app/router/index.ts.ejs +19 -3
  137. package/generators/client/templates/vue/src/main/webapp/app/shared/config/axios-interceptor.ts.ejs +0 -2
  138. package/generators/client/templates/vue/src/main/webapp/app/shared/data/data-utils.service.ts.ejs +3 -1
  139. package/generators/client/templates/vue/src/main/webapp/app/shims-vue.d.ts.ejs +17 -3
  140. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +25 -10
  141. package/generators/client/templates/vue/src/test/javascript/spec/app/account/login-form/login-form.component.spec.ts.ejs +2 -2
  142. package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management-edit.component.spec.ts.ejs +6 -4
  143. package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts.ejs +4 -2
  144. package/generators/client/templates/vue/src/test/javascript/spec/app/core/jhi-navbar/jhi-navbar.component.spec.ts.ejs +10 -4
  145. package/generators/client/templates/vue/src/test/javascript/spec/app/entities/entities-menu.spec.ts.ejs +52 -0
  146. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.component.ts.ejs +4 -0
  147. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.vue.ejs +7 -0
  148. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-router.ts.ejs +1 -0
  149. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/axios-interceptor.spec.ts.ejs +0 -1
  150. package/generators/client/templates/vue/tsconfig.json.ejs +6 -10
  151. package/generators/client/templates/vue/tsconfig.spec.json.ejs +37 -0
  152. package/generators/client/templates/vue/webpack/config.js.ejs +50 -0
  153. package/generators/client/templates/vue/webpack/vue.utils.js.ejs +33 -32
  154. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +150 -126
  155. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +19 -76
  156. package/generators/client/templates/vue/webpack/webpack.microfrontend.js.jhi.vue.ejs +77 -0
  157. package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +5 -41
  158. package/generators/cloudfoundry/index.js +9 -9
  159. package/generators/common/index.js +12 -10
  160. package/generators/common/templates/.prettierrc.ejs +1 -1
  161. package/generators/common/templates/README.md.jhi.ejs +19 -0
  162. package/generators/common/templates/package.json +4 -4
  163. package/generators/cypress/index.js +12 -9
  164. package/generators/cypress/templates/cypress.json.ejs +16 -2
  165. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/login-page.spec.ts.ejs +3 -14
  166. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/password-page.spec.ts.ejs +33 -39
  167. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/register-page.spec.ts.ejs +52 -62
  168. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/reset-password-page.spec.ts.ejs +2 -10
  169. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/settings-page.spec.ts.ejs +25 -34
  170. package/generators/cypress/templates/src/test/javascript/cypress/integration/administration/administration.spec.ts.ejs +1 -22
  171. package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +4 -4
  172. package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +67 -7
  173. package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +4 -4
  174. package/generators/cypress/templates/src/test/javascript/cypress/support/index.ts.ejs +1 -6
  175. package/generators/cypress/templates/src/test/javascript/cypress/support/management.ts.ejs +1 -1
  176. package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +8 -8
  177. package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +0 -9
  178. package/generators/database-changelog/index.js +33 -22
  179. package/generators/database-changelog-liquibase/index.js +12 -8
  180. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_constraints.xml.ejs +1 -1
  181. package/generators/docker-compose/index.js +11 -12
  182. package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +1 -1
  183. package/generators/entities/index.js +35 -26
  184. package/generators/entities-client/index.js +10 -7
  185. package/generators/entity/index.js +81 -32
  186. package/generators/entity-client/files.js +7 -16
  187. package/generators/entity-client/index.js +22 -12
  188. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.spec.ts.ejs +42 -44
  189. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +1 -1
  190. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.spec.ts.ejs +58 -60
  191. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +1 -35
  192. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.model.ts.ejs +1 -1
  193. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +4 -4
  194. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +110 -112
  195. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +9 -2
  196. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/infinite-scroll-template.ejs +8 -8
  197. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/no-pagination-template.ejs +8 -8
  198. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/pagination-template.ejs +8 -8
  199. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +15 -6
  200. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing.module.ts.ejs +1 -1
  201. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +1 -1
  202. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +1 -1
  203. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.spec.ts.ejs +203 -198
  204. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +5 -5
  205. package/generators/entity-client/templates/angular/src/test/javascript/e2e/entities/entity.spec.ts.ejs +1 -1
  206. package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +264 -127
  207. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +17 -14
  208. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.reducer.ts.ejs +5 -4
  209. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +11 -13
  210. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +32 -25
  211. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.vue.ejs +6 -9
  212. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -1
  213. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.model.ts.ejs +1 -1
  214. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.service.ts.ejs +2 -6
  215. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity-update.component.spec.ts.ejs +10 -7
  216. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.component.spec.ts.ejs +5 -1
  217. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.service.spec.ts.ejs +1 -1
  218. package/generators/entity-i18n/index.js +7 -4
  219. package/generators/entity-server/files.js +14 -0
  220. package/generators/entity-server/index.js +12 -8
  221. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +2 -2
  222. package/generators/entity-server/templates/src/main/java/package/common/search_template.ejs +1 -1
  223. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +9 -8
  224. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +16 -29
  225. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +3 -3
  226. package/generators/entity-server/templates/src/main/java/package/repository/EntitySqlHelper_reactive.java.ejs +46 -0
  227. package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +1 -1
  228. package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +18 -2
  229. package/generators/entity-server/templates/src/main/java/package/repository/search/SortToFieldSortBuilderConverter.java.ejs +24 -0
  230. package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +8 -6
  231. package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +5 -1
  232. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +41 -43
  233. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +3 -3
  234. package/generators/gae/index.js +10 -10
  235. package/generators/generator-base-blueprint.js +14 -46
  236. package/generators/generator-base-private.js +44 -23
  237. package/generators/generator-base.js +58 -18
  238. package/generators/generator-constants.js +30 -23
  239. package/generators/generator-transforms.js +39 -27
  240. package/generators/heroku/index.js +14 -33
  241. package/generators/init/constants.cjs +1 -1
  242. package/generators/java/constants.cjs +1 -1
  243. package/generators/kubernetes/files.js +3 -0
  244. package/generators/kubernetes/index.js +10 -10
  245. package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -1
  246. package/generators/kubernetes/templates/deployment.yml.ejs +8 -3
  247. package/generators/kubernetes/templates/istio/destination-rule.yml.ejs +1 -1
  248. package/generators/kubernetes/templates/istio/gateway/grafana-gateway.yml.ejs +5 -2
  249. package/generators/kubernetes/templates/istio/gateway/jhipster-grafana-gateway.yml.ejs +5 -2
  250. package/generators/kubernetes/templates/istio/gateway/kiali-gateway.yml.ejs +10 -8
  251. package/generators/kubernetes/templates/istio/gateway/zipkin-gateway.yml.ejs +5 -2
  252. package/generators/kubernetes/templates/istio/gateway.yml.ejs +7 -5
  253. package/generators/kubernetes/templates/secret/couchbase-secret.yml.ejs +9 -0
  254. package/generators/kubernetes-base.js +1 -0
  255. package/generators/kubernetes-helm/files.js +3 -8
  256. package/generators/kubernetes-helm/index.js +10 -10
  257. package/generators/kubernetes-helm/templates/README-KUBERNETES-HELM.md.ejs +0 -1
  258. package/generators/kubernetes-helm/templates/app/Chart.yml.ejs +5 -0
  259. package/generators/kubernetes-helm/templates/app/helpers.tpl.ejs +0 -11
  260. package/generators/kubernetes-helm/templates/app/requirements.yml.ejs +5 -0
  261. package/generators/kubernetes-helm/templates/app/values.yml.ejs +68 -5
  262. package/generators/kubernetes-helm/templates/csvc/Chart.yml.ejs +1 -1
  263. package/generators/kubernetes-helm/templates/csvc/requirements.yml.ejs +1 -1
  264. package/generators/kubernetes-knative/index.js +10 -10
  265. package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +6 -4
  266. package/generators/kubernetes-knative/templates/service.yml.ejs +1 -1
  267. package/generators/languages/index.js +13 -13
  268. package/generators/languages/templates/src/main/webapp/i18n/vi/login.json +1 -1
  269. package/generators/openapi-client/index.js +13 -10
  270. package/generators/openshift/index.js +10 -11
  271. package/generators/openshift/templates/deployment.yml.ejs +1 -1
  272. package/generators/page/index.js +12 -10
  273. package/generators/server/__snapshots__/generator.spec.mjs.snap +28 -15
  274. package/generators/server/cleanup.js +151 -0
  275. package/generators/server/files-sql.js +52 -0
  276. package/generators/server/files.js +31 -14
  277. package/generators/server/index.js +86 -33
  278. package/generators/server/templates/build.gradle.ejs +231 -189
  279. package/generators/server/templates/gradle.properties.ejs +12 -12
  280. package/generators/server/templates/npmw +8 -6
  281. package/generators/server/templates/npmw.cmd +13 -8
  282. package/generators/server/templates/pom.xml.ejs +425 -217
  283. package/generators/server/templates/sql/reactive/src/main/java/package/repository/UserSqlHelper.java.ejs +48 -0
  284. package/generators/server/templates/src/main/docker/app.yml.ejs +1 -1
  285. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +2 -2
  286. package/generators/server/templates/src/main/java/package/config/LocaleConfiguration.java.ejs +3 -2
  287. package/generators/server/templates/src/main/java/package/config/OpenApiConfiguration.java.ejs +17 -54
  288. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +5 -5
  289. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +4 -6
  290. package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +0 -3
  291. package/generators/server/templates/src/main/java/package/config/neo4j/Neo4jMigrations.java.ejs +19 -9
  292. package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs +68 -0
  293. package/generators/server/templates/src/main/java/package/repository/AuthorityRepository.java.ejs +2 -2
  294. package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs +0 -25
  295. package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +31 -4
  296. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +23 -11
  297. package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +16 -8
  298. package/generators/server/templates/src/main/java/package/service/dto/UserDTO.java.ejs +6 -6
  299. package/generators/server/templates/src/main/java/package/web/filter/ModifyServersOpenApiFilter.java.ejs +3 -2
  300. package/generators/server/templates/src/main/java/package/web/filter/SpaWebFilter.java.ejs +1 -1
  301. package/generators/server/templates/src/main/java/package/web/rest/PublicUserResource.java.ejs +2 -2
  302. package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +2 -2
  303. package/generators/server/templates/src/main/resources/config/application.yml.ejs +22 -8
  304. package/generators/server/templates/src/main/resources/logback-spring.xml.ejs +1 -2
  305. package/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +1 -1
  306. package/generators/server/templates/src/test/java/package/cucumber/CucumberIT.java.ejs +2 -6
  307. package/generators/server/templates/src/test/java/package/cucumber/CucumberTestContextConfiguration.java.ejs +2 -3
  308. package/generators/server/templates/src/test/java/package/cucumber/stepdefs/UserStepDefs.java.ejs +41 -6
  309. package/generators/server/templates/src/test/java/package/management/SecurityMetersServiceTests.java.ejs +113 -0
  310. package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +6 -1
  311. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderSecurityMetersTests.java.ejs +198 -0
  312. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderTest.java.ejs +13 -3
  313. package/generators/server/templates/src/test/java/package/security/oauth2/AuthorizationHeaderUtilTest.java.ejs +17 -3
  314. package/generators/server/templates/src/test/java/package/security/oauth2/CustomClaimConverterIT.java.ejs +63 -0
  315. package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +1 -1
  316. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +2 -3
  317. package/generators/server/templates/src/test/java/package/web/rest/ClientForwardControllerTest.java.ejs +9 -0
  318. package/generators/server/templates/src/test/resources/junit-platform.properties.ejs +2 -0
  319. package/generators/server/templates/src/test/resources/logback.xml.ejs +1 -1
  320. package/generators/server/templates/src/test/{features → resources/package/features}/gitkeep +0 -0
  321. package/generators/server/templates/src/test/{features → resources/package/features}/user/user.feature.ejs +0 -0
  322. package/generators/spring-controller/index.js +9 -7
  323. package/generators/spring-controller/templates/src/test/java/package/web/rest/ResourceIT.java.ejs +1 -1
  324. package/generators/spring-service/index.js +10 -7
  325. package/generators/upgrade/index.js +4 -5
  326. package/generators/utils.js +2 -2
  327. package/generators/workspaces/index.js +16 -7
  328. package/jdl/jhipster/default-application-options.js +9 -7
  329. package/package.json +22 -22
  330. package/utils/entity.js +17 -4
  331. package/utils/field.js +11 -1
  332. package/utils/multi-step-transform/index.js +8 -8
  333. package/generators/client/templates/react/.npmrc.ejs +0 -1
  334. package/generators/client/templates/vue/webpack/dev.env.js.ejs +0 -17
  335. package/generators/client/templates/vue/webpack/env.js.ejs +0 -67
  336. package/generators/client/templates/vue/webpack/loader.conf.js.ejs +0 -20
  337. package/generators/client/templates/vue/webpack/prod.env.js.ejs +0 -15
  338. package/generators/server/templates/src/main/java/package/config/apidocs/GatewaySwaggerResourcesProvider.java.ejs +0 -91
  339. package/generators/server/templates/src/test/java/package/config/apidocs/GatewaySwaggerResourcesProviderTest.java.ejs +0 -79
  340. package/generators/server/templates/src/test/resources/cucumber.properties.ejs +0 -1
@@ -84,7 +84,7 @@ import reactor.core.publisher.Mono;
84
84
  import reactor.core.scheduler.Schedulers;
85
85
  <%_ } _%>
86
86
 
87
- <%_ if ((databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) && authenticationTypeSession && !reactive) { _%>
87
+ <%_ if ((databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) && authenticationTypeSession && !reactive) { _%>
88
88
  import java.time.LocalDate;
89
89
  <%_ } _%>
90
90
  <%_ if (!databaseTypeNo) { _%>
@@ -659,7 +659,7 @@ public class UserService {
659
659
  <%_ if (reactive) { _%>
660
660
  <%_ if (databaseTypeSql && authenticationTypeOauth2) { _%>
661
661
  @Transactional
662
- public Mono<User> saveUser(User user) {
662
+ public Mono<<%= asEntity('User') %>> saveUser(<%= asEntity('User') %> user) {
663
663
  return saveUser(user, false);
664
664
  }
665
665
 
@@ -682,7 +682,7 @@ public class UserService {
682
682
  // Saving the relationship can be done in an entity callback
683
683
  // once https://github.com/spring-projects/spring-data-r2dbc/issues/215 is done
684
684
  <%_ if (authenticationTypeOauth2) { _%>
685
- Mono<User> persistedUser;
685
+ Mono<<%= asEntity('User') %>> persistedUser;
686
686
  if (forceCreate) {
687
687
  persistedUser = userRepository.create(user);
688
688
  } else {
@@ -1017,15 +1017,20 @@ public class UserService {
1017
1017
  private static <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> getUser(Map<String, Object> details) {
1018
1018
  <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> user = new <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %>();
1019
1019
  Boolean activated = Boolean.TRUE;
1020
+ String sub = String.valueOf(details.get("sub"));
1021
+ String username = null;
1022
+ if (details.get("preferred_username") != null) {
1023
+ username = ((String) details.get("preferred_username")).toLowerCase();
1024
+ }
1020
1025
  // handle resource server JWT, where sub claim is email and uid is ID
1021
1026
  if (details.get("uid") != null) {
1022
1027
  user.setId((String) details.get("uid"));
1023
- user.setLogin((String) details.get("sub"));
1028
+ user.setLogin(sub);
1024
1029
  } else {
1025
- user.setId((String) details.get("sub"));
1030
+ user.setId(sub);
1026
1031
  }
1027
- if (details.get("preferred_username") != null) {
1028
- user.setLogin(((String) details.get("preferred_username")).toLowerCase());
1032
+ if (username != null) {
1033
+ user.setLogin(username);
1029
1034
  } else if (user.getLogin() == null) {
1030
1035
  user.setLogin(user.getId());
1031
1036
  }
@@ -1042,8 +1047,11 @@ public class UserService {
1042
1047
  }
1043
1048
  if (details.get("email") != null) {
1044
1049
  user.setEmail(((String) details.get("email")).toLowerCase());
1050
+ } else if (sub.contains("|") && (username != null && username.contains("@"))) {
1051
+ // special handling for Auth0
1052
+ user.setEmail(username);
1045
1053
  } else {
1046
- user.setEmail((String) details.get("sub"));
1054
+ user.setEmail(sub);
1047
1055
  }
1048
1056
  if (details.get("langKey") != null) {
1049
1057
  user.setLangKey((String) details.get("langKey"));
@@ -71,12 +71,12 @@ public class <%= asDto('User') %> {
71
71
  }
72
72
 
73
73
  <%_ for (field of user.fields.filter(field => !field.builtIn && field.relatedByOtherEntity)) { _%>
74
- public String get<%= javaBeanCase(field.fieldName) %>() {
75
- return <%= field.fieldName %>;
76
- }
77
- public void set<%= javaBeanCase(field.fieldName) %>(String <%= field.fieldName %>) {
78
- this.<%= field.fieldName %> = <%= field.fieldName %>;
79
- }
74
+ public String get<%= javaBeanCase(field.fieldName) %>() {
75
+ return <%= field.fieldName %>;
76
+ }
77
+ public void set<%= javaBeanCase(field.fieldName) %>(String <%= field.fieldName %>) {
78
+ this.<%= field.fieldName %> = <%= field.fieldName %>;
79
+ }
80
80
  <%_ } _%>
81
81
 
82
82
  // prettier-ignore
@@ -34,12 +34,13 @@ import reactor.core.publisher.Mono;
34
34
  @Component
35
35
  public class ModifyServersOpenApiFilter implements GlobalFilter, Ordered {
36
36
 
37
+ private static final String OPEN_API_PATH = "/v3/api-docs";
37
38
  private static final Logger log = LoggerFactory.getLogger(ModifyServersOpenApiFilter.class);
38
39
 
39
40
  @Override
40
41
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
41
42
  String path = exchange.getRequest().getURI().getPath();
42
- if (path.startsWith("/services") && path.contains("/v3/api-docs")) {
43
+ if (path.startsWith("/services") && path.contains(OPEN_API_PATH)) {
43
44
  ServerHttpResponse originalResponse = exchange.getResponse();
44
45
  DataBufferFactory bufferFactory = originalResponse.bufferFactory();
45
46
  ServerHttpResponseDecorator decoratedResponse = createModifyServersOpenApiInterceptor(path, originalResponse, bufferFactory);
@@ -109,7 +110,7 @@ public class ModifyServersOpenApiFilter implements GlobalFilter, Ordered {
109
110
  ObjectMapper mapper = new ObjectMapper();
110
111
  JsonNode jsonBody = mapper.readTree(strBody);
111
112
  ObjectNode serversToJson = mapper.createObjectNode();
112
- serversToJson.set("url", mapper.valueToTree(path.replace("/v3/api-docs", "")));
113
+ serversToJson.set("url", mapper.valueToTree(path.replaceFirst(OPEN_API_PATH + "(/.*)?$", "")));
113
114
  serversToJson.set("description", mapper.valueToTree("added by global filter"));
114
115
 
115
116
  // add custom server
@@ -35,7 +35,7 @@ public class SpaWebFilter implements WebFilter {
35
35
  String path = exchange.getRequest().getURI().getPath();
36
36
  if (!path.startsWith("/api") && !path.startsWith("/management")<% if (authenticationTypeOauth2) { %> && !path.startsWith("/login")<% } %>
37
37
  <%_ if (applicationTypeGateway || applicationTypeMonolith) { _%>
38
- && !path.startsWith("/services") && !path.startsWith("/swagger") && !path.startsWith("/v2/api-docs") && !path.startsWith("/v3/api-docs")
38
+ && !path.startsWith("/services") && !path.startsWith("/v3/api-docs")
39
39
  <%_ } _%>
40
40
  && path.matches("[^\\\\.]*")) {
41
41
  return chain.filter(
@@ -126,7 +126,7 @@ public class PublicUserResource {
126
126
  @GetMapping("/users")
127
127
  <%_ if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) { _%>
128
128
  <%_ if (!reactive) { _%>
129
- public ResponseEntity<List<<%= asDto('User') %>>> getAllPublicUsers(Pageable pageable) {
129
+ public ResponseEntity<List<<%= asDto('User') %>>> getAllPublicUsers(@org.springdoc.api.annotations.ParameterObject Pageable pageable) {
130
130
  log.debug("REST request to get all public User names");
131
131
  <%_ if (!authenticationTypeOauth2) { _%>
132
132
  if (!onlyContainsAllowedProperties(pageable)) {
@@ -139,7 +139,7 @@ public class PublicUserResource {
139
139
  return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
140
140
  }
141
141
  <%_ } else { _%>
142
- public Mono<ResponseEntity<Flux<<%= asDto('User') %>>>> getAllPublicUsers(ServerHttpRequest request, Pageable pageable) {
142
+ public Mono<ResponseEntity<Flux<<%= asDto('User') %>>>> getAllPublicUsers(ServerHttpRequest request, @org.springdoc.api.annotations.ParameterObject Pageable pageable) {
143
143
  log.debug("REST request to get all public User names");
144
144
  <%_ if (!authenticationTypeOauth2) { _%>
145
145
  if (!onlyContainsAllowedProperties(pageable)) {
@@ -284,7 +284,7 @@ public class UserResource {
284
284
  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
285
285
  <%_ if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) { _%>
286
286
  <%_ if (!reactive) { _%>
287
- public ResponseEntity<List<<%= asDto('AdminUser') %>>> getAllUsers(Pageable pageable) {
287
+ public ResponseEntity<List<<%= asDto('AdminUser') %>>> getAllUsers(@org.springdoc.api.annotations.ParameterObject Pageable pageable) {
288
288
  log.debug("REST request to get all User for an admin");
289
289
  <%_ if (!authenticationTypeOauth2) { _%>
290
290
  if (!onlyContainsAllowedProperties(pageable)) {
@@ -296,7 +296,7 @@ public class UserResource {
296
296
  HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
297
297
  return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
298
298
  <%_ } else { _%>
299
- public Mono<ResponseEntity<Flux<<%= asDto('AdminUser') %>>>> getAllUsers(ServerHttpRequest request, Pageable pageable) {
299
+ public Mono<ResponseEntity<Flux<<%= asDto('AdminUser') %>>>> getAllUsers(@org.springdoc.api.annotations.ParameterObject ServerHttpRequest request, @org.springdoc.api.annotations.ParameterObject Pageable pageable) {
300
300
  log.debug("REST request to get all User for an admin");
301
301
  <%_ if (!authenticationTypeOauth2) { _%>
302
302
  if (!onlyContainsAllowedProperties(pageable)) {
@@ -32,6 +32,17 @@
32
32
  # http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
33
33
  # ===================================================================
34
34
 
35
+ ---
36
+ # Conditionally disable springdoc on missing api-docs profile
37
+ spring:
38
+ config:
39
+ activate:
40
+ on-profile: '!api-docs'
41
+ springdoc:
42
+ api-docs:
43
+ enabled: false
44
+ ---
45
+
35
46
  <%_ if (serviceDiscoveryEureka) { _%>
36
47
  eureka:
37
48
  client:
@@ -85,24 +96,24 @@ management:
85
96
  web:
86
97
  base-path: /management
87
98
  exposure:
88
- include: ["configprops", "env", <% if (applicationTypeGateway && reactive) { %>"gateway", <% } %>"health", "info", "jhimetrics", "logfile", "loggers", "prometheus", "threaddump"<% if (cacheManagerIsAvailable) { %>, "caches"<% } %><% if (databaseTypeSql) { %>, "liquibase"<% } %>]
99
+ include: ["configprops", "env", <% if (applicationTypeGateway && reactive) { %>"gateway", <% } %>"health", "info", "jhimetrics", 'jhiopenapigroups', "logfile", "loggers", "prometheus", "threaddump"<% if (cacheManagerIsAvailable) { %>, "caches"<% } %><% if (databaseTypeSql) { %>, "liquibase"<% } %>]
89
100
  endpoint:
90
101
  health:
91
102
  show-details: when_authorized
92
103
  roles: "ROLE_ADMIN"
93
104
  probes:
94
105
  enabled: true
106
+ group:
107
+ liveness:
108
+ include: livenessState
109
+ readiness:
110
+ include: readinessState<% if (databaseTypeSql) { %>,db<% } %>
95
111
  jhimetrics:
96
112
  enabled: true
97
113
  info:
98
114
  git:
99
115
  mode: full
100
116
  health:
101
- group:
102
- liveness:
103
- include: livenessState
104
- readiness:
105
- include: readinessState<% if (databaseTypeSql) { %>,db<% } %>
106
117
  mail:
107
118
  enabled: false # When using the MailService, configure an SMTP server and set this to true
108
119
  metrics:
@@ -289,6 +300,9 @@ server:
289
300
  cookie:
290
301
  http-only: true
291
302
 
303
+ springdoc:
304
+ show-actuator: true
305
+
292
306
  # Properties to be exposed on the /info management endpoint
293
307
  info:
294
308
  # Comma separated list of profiles that will trigger the ribbon to show
@@ -318,8 +332,8 @@ jhipster:
318
332
  mail:
319
333
  from: <%= baseName %>@localhost
320
334
  api-docs:
321
- default-include-pattern: ${server.servlet.context-path:}/api/.*
322
- management-include-pattern: ${server.servlet.context-path:}/management/.*
335
+ default-include-pattern: ${server.servlet.context-path:}/api/**
336
+ management-include-pattern: ${server.servlet.context-path:}/management/**
323
337
  title: <%= humanizedBaseName %> API
324
338
  description: <%= humanizedBaseName %> API documentation
325
339
  version: 0.0.1
@@ -138,13 +138,12 @@
138
138
  <%_ if (reactive) { _%>
139
139
  <logger name="reactor" level="WARN"/>
140
140
  <%_ } _%>
141
- <logger name="springfox" level="WARN"/>
141
+ <logger name="io.swagger.v3" level="INFO"/>
142
142
  <logger name="sun.rmi" level="WARN"/>
143
143
  <%_ if (databaseTypeSql) { _%>
144
144
  <logger name="liquibase" level="WARN"/>
145
145
  <logger name="LiquibaseSchemaResolver" level="INFO"/>
146
146
  <%_ } _%>
147
- <logger name="springfox.documentation.schema.property" level="ERROR"/>
148
147
  <%_ if (applicationTypeMicroservice || applicationTypeGateway || cacheProviderHazelcast) { _%>
149
148
  <logger name="sun.net.www" level="INFO"/>
150
149
  <%_ } _%>
@@ -78,7 +78,7 @@
78
78
 
79
79
  <ul>
80
80
  <%_ if (microfrontend) { %>
81
- <li>Microfrontends packages don't provide a stand-alone front-end. Packaged microfrontend should be accessed through a JHipster gateway.</li>
81
+ <li>JHipster's microfrontends implementation doesn't provide a stand-alone UI. Packaged microfrontends should be accessed through a JHipster gateway.</li>
82
82
  <li>Stand-alone development server can be started by `npm start`.</li>
83
83
  <%_ } else { %>
84
84
  <li>It does not have a front-end. The front-end should be generated on a JHipster gateway.</li>
@@ -18,19 +18,15 @@
18
18
  -%>
19
19
  package <%= packageName %>.cucumber;
20
20
 
21
- import org.junit.runner.RunWith;
22
-
23
21
  <%_ if (databaseTypeCassandra) { _%>
24
22
  import <%= packageName %>.AbstractCassandraTest;
25
23
  <%_ } _%>
26
24
  <%_ if (databaseTypeNeo4j) { _%>
27
25
  import <%= packageName %>.AbstractNeo4jIT;
28
26
  <%_ } _%>
29
- import io.cucumber.junit.CucumberOptions;
30
- import io.cucumber.junit.Cucumber;
27
+ import io.cucumber.junit.platform.engine.Cucumber;
31
28
 
32
- @RunWith(Cucumber.class)
33
- @CucumberOptions(plugin = "pretty", features = "<%= TEST_DIR %>features")
29
+ @Cucumber
34
30
  <%_ if (databaseTypeNeo4j) { _%>
35
31
  @ExtendWith(AbstractNeo4jIT)
36
32
  <%_ } _%>
@@ -18,13 +18,12 @@
18
18
  -%>
19
19
  package <%= packageName %>.cucumber;
20
20
 
21
- import <%= packageName %>.<%= mainClass %>;
21
+ import <%= packageName %>.IntegrationTest;
22
22
  import io.cucumber.spring.CucumberContextConfiguration;
23
- import org.springframework.boot.test.context.SpringBootTest;
24
23
  import org.springframework.test.context.web.WebAppConfiguration;
25
24
 
26
25
  @CucumberContextConfiguration
27
- @SpringBootTest(classes = <%= mainClass %>.class)
26
+ @IntegrationTest
28
27
  @WebAppConfiguration
29
28
  public class CucumberTestContextConfiguration {
30
29
 
@@ -18,36 +18,71 @@
18
18
  -%>
19
19
  package <%= packageName %>.cucumber.stepdefs;
20
20
 
21
+ import java.util.List;
22
+ import java.util.ArrayList;
23
+
21
24
  import io.cucumber.java.Before;
22
25
  import io.cucumber.java.en.Then;
23
26
  import io.cucumber.java.en.When;
24
27
 
25
28
  import org.springframework.beans.factory.annotation.Autowired;
26
29
  import org.springframework.http.MediaType;
27
- import org.springframework.test.web.servlet.MockMvc;
28
- import org.springframework.test.web.servlet.setup.MockMvcBuilders;
30
+ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
31
+ import org.springframework.security.core.Authentication;
32
+ import org.springframework.security.core.GrantedAuthority;
33
+ import org.springframework.security.core.authority.SimpleGrantedAuthority;
34
+ import org.springframework.security.core.context.SecurityContext;
35
+ import org.springframework.security.core.context.SecurityContextHolder;
36
+ import org.springframework.security.core.userdetails.User;
29
37
 
30
38
  import <%= packageName %>.web.rest.UserResource;
39
+ import <%= packageName %>.security.AuthoritiesConstants;
40
+
41
+ <%_ if (reactive) { _%>
42
+ import org.springframework.test.web.reactive.server.WebTestClient;
43
+ <%_ } else { _%>
44
+ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
45
+ import org.springframework.test.web.servlet.MockMvc;
31
46
 
32
47
  import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
33
48
  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
49
+ <%_ } _%>
34
50
 
35
51
  public class UserStepDefs extends StepDefs {
36
52
 
37
53
  @Autowired
38
54
  private UserResource userResource;
39
55
 
40
- private MockMvc restUserMockMvc;
56
+ <%_ if (reactive) { _%>
57
+ private WebTestClient userResourceMock;
58
+ <%_ } else { _%>
59
+ private MockMvc userResourceMock;
60
+ <%_ } _%>
41
61
 
42
62
  @Before
43
63
  public void setup() {
44
- this.restUserMockMvc = MockMvcBuilders.standaloneSetup(userResource).build();
64
+ List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
65
+ grantedAuthorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ADMIN));
66
+ User principal = new User("username", "", true, true, true, true, grantedAuthorities);
67
+ Authentication authentication = new UsernamePasswordAuthenticationToken(
68
+ principal,
69
+ principal.getPassword(),
70
+ principal.getAuthorities()
71
+ );
72
+ SecurityContext context = SecurityContextHolder.createEmptyContext();
73
+ context.setAuthentication(authentication);
74
+ SecurityContextHolder.setContext(context);
75
+ this.userResourceMock = MockMvcBuilders.standaloneSetup(userResource).build();
45
76
  }
46
77
 
47
78
  @When("I search user {string}")
48
79
  public void i_search_user(String userId) throws Throwable {
49
- actions = restUserMockMvc.perform(get("/api/users/" + userId)
50
- .accept(MediaType.APPLICATION_JSON));
80
+ <%_ if (reactive) { _%>
81
+ actions = userResourceMock.get().uri("/api/admin/users/" + userId)
82
+ <%_ } else { _%>
83
+ actions = userResourceMock.perform(get("/api/admin/users/" + userId)
84
+ <%_ } _%>
85
+ .accept(MediaType.APPLICATION_JSON)<% if (!reactive) { %>)<%_ } _%>;
51
86
  }
52
87
 
53
88
  @Then("the user is found")
@@ -0,0 +1,113 @@
1
+ <%#
2
+ Copyright 2013-2021 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 %>.management;
20
+
21
+ import io.micrometer.core.instrument.Counter;
22
+ import io.micrometer.core.instrument.MeterRegistry;
23
+ import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
24
+ import org.junit.jupiter.api.BeforeEach;
25
+ import org.junit.jupiter.api.Test;
26
+
27
+ import java.util.Collection;
28
+
29
+ import static org.assertj.core.api.Assertions.assertThat;
30
+
31
+ class SecurityMetersServiceTests {
32
+ private static final String INVALID_TOKENS_METER_EXPECTED_NAME = "security.authentication.invalid-tokens";
33
+
34
+ private MeterRegistry meterRegistry;
35
+
36
+ private SecurityMetersService securityMetersService;
37
+
38
+ @BeforeEach
39
+ public void setup() {
40
+ meterRegistry = new SimpleMeterRegistry();
41
+
42
+ securityMetersService = new SecurityMetersService(meterRegistry);
43
+ }
44
+
45
+ @Test
46
+ void testInvalidTokensCountersByCauseAreCreated() {
47
+ meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME).counter();
48
+
49
+ meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
50
+ .tag("cause", "expired")
51
+ .counter();
52
+
53
+ meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
54
+ .tag("cause", "unsupported")
55
+ .counter();
56
+
57
+ meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
58
+ .tag("cause", "invalid-signature")
59
+ .counter();
60
+
61
+ meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
62
+ .tag("cause", "malformed")
63
+ .counter();
64
+
65
+ Collection<Counter> counters = meterRegistry.find(INVALID_TOKENS_METER_EXPECTED_NAME).counters();
66
+
67
+ assertThat(counters).hasSize(4);
68
+ }
69
+
70
+ @Test
71
+ void testCountMethodsShouldBeBoundToCorrectCounters() {
72
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
73
+ .tag("cause", "expired")
74
+ .counter().count()).isZero();
75
+
76
+ securityMetersService.trackTokenExpired();
77
+
78
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
79
+ .tag("cause", "expired")
80
+ .counter().count()).isEqualTo(1);
81
+
82
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
83
+ .tag("cause", "unsupported")
84
+ .counter().count()).isZero();
85
+
86
+ securityMetersService.trackTokenUnsupported();
87
+
88
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
89
+ .tag("cause", "unsupported")
90
+ .counter().count()).isEqualTo(1);
91
+
92
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
93
+ .tag("cause", "invalid-signature")
94
+ .counter().count()).isZero();
95
+
96
+ securityMetersService.trackTokenInvalidSignature();
97
+
98
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
99
+ .tag("cause", "invalid-signature")
100
+ .counter().count()).isEqualTo(1);
101
+
102
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
103
+ .tag("cause", "malformed")
104
+ .counter().count()).isZero();
105
+
106
+ securityMetersService.trackTokenMalformed();
107
+
108
+ assertThat(meterRegistry.get(INVALID_TOKENS_METER_EXPECTED_NAME)
109
+ .tag("cause", "malformed")
110
+ .counter().count()).isEqualTo(1);
111
+ }
112
+
113
+ }
@@ -18,8 +18,10 @@
18
18
  -%>
19
19
  package <%= packageName %>.security.jwt;
20
20
 
21
+ import <%= packageName %>.management.SecurityMetersService;
21
22
  import <%= packageName %>.security.AuthoritiesConstants;
22
23
  import tech.jhipster.config.JHipsterProperties;
24
+ import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
23
25
  import io.jsonwebtoken.io.Decoders;
24
26
  import io.jsonwebtoken.security.Keys;
25
27
 
@@ -63,7 +65,10 @@ class JWTFilterTest {
63
65
  JHipsterProperties jHipsterProperties = new JHipsterProperties();
64
66
  String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8";
65
67
  jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret);
66
- tokenProvider = new TokenProvider(jHipsterProperties);
68
+
69
+ SecurityMetersService securityMetersService = new SecurityMetersService(new SimpleMeterRegistry());
70
+
71
+ tokenProvider = new TokenProvider(jHipsterProperties, securityMetersService);
67
72
  ReflectionTestUtils.setField(tokenProvider, "key", Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret)));
68
73
 
69
74
  ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000);