generator-jhipster 8.0.0-rc.1 → 8.1.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 (369) hide show
  1. package/README.md +71 -58
  2. package/dist/cli/environment-builder.mjs +14 -7
  3. package/dist/cli/jhipster-command.mjs +7 -3
  4. package/dist/cli/program.mjs +2 -2
  5. package/dist/generators/angular/cleanup.mjs +7 -0
  6. package/dist/generators/angular/files-angular.mjs +3 -4
  7. package/dist/generators/angular/generator.mjs +10 -22
  8. package/dist/generators/angular/needle-api/needle-client-angular.mjs +2 -8
  9. package/dist/generators/angular/resources/package.json +25 -24
  10. package/dist/generators/angular/support/translate-angular.mjs +2 -2
  11. package/dist/generators/angular/templates/README.md.jhi.client.angular.ejs +1 -1
  12. package/dist/generators/angular/templates/angular.json.ejs +3 -7
  13. package/dist/generators/angular/templates/package.json.ejs +4 -8
  14. package/dist/generators/angular/templates/src/main/webapp/app/account/activate/activate.component.html.ejs +6 -4
  15. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
  16. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password.component.html.ejs +39 -33
  17. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +44 -36
  18. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +24 -23
  19. package/dist/generators/angular/templates/src/main/webapp/app/account/register/register.component.html.ejs +74 -62
  20. package/dist/generators/angular/templates/src/main/webapp/app/account/sessions/sessions.component.html.ejs +12 -4
  21. package/dist/generators/angular/templates/src/main/webapp/app/account/settings/settings.component.html.ejs +54 -48
  22. package/dist/generators/angular/templates/src/main/webapp/app/admin/admin.routes.ts.ejs +74 -0
  23. package/dist/generators/angular/templates/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +15 -5
  24. package/dist/generators/angular/templates/src/main/webapp/app/admin/docs/docs.component.ts.ejs +1 -1
  25. package/dist/generators/angular/templates/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +20 -7
  26. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/health.component.html.ejs +10 -7
  27. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +9 -3
  28. package/dist/generators/angular/templates/src/main/webapp/app/admin/logs/logs.component.html.ejs +12 -4
  29. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +13 -7
  30. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +6 -2
  31. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +3 -1
  32. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html.ejs +13 -9
  33. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +13 -5
  34. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +21 -7
  35. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +6 -2
  36. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html.ejs +3 -1
  37. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +16 -7
  38. package/dist/generators/angular/templates/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +3 -1
  39. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +3 -1
  40. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +11 -4
  41. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +20 -11
  42. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +48 -34
  43. package/dist/generators/angular/templates/src/main/webapp/app/app.component.ts.ejs +73 -0
  44. package/dist/generators/angular/templates/src/main/webapp/app/app.config.ts.ejs +67 -0
  45. package/dist/generators/angular/templates/src/main/webapp/app/app.routes.ts.ejs +85 -0
  46. package/dist/generators/angular/templates/src/main/webapp/app/core/microfrontend/index.ts.ejs +5 -4
  47. package/dist/generators/angular/templates/src/main/webapp/app/core/util/alert.service.spec.ts.ejs +1 -1
  48. package/dist/generators/angular/templates/src/main/webapp/app/core/util/data-util.service.ts.ejs +2 -2
  49. package/dist/generators/angular/templates/src/main/webapp/app/core/util/event-manager.service.spec.ts.ejs +12 -12
  50. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.model.ts.ejs +4 -4
  51. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/delete/_entityFile_-delete-dialog.component.html.ejs +3 -1
  52. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/detail/_entityFile_-detail.component.html.ejs +26 -14
  53. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +44 -35
  54. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.ts.ejs +1 -1
  55. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/service/_entityFile_.service.ts.ejs +1 -1
  56. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.spec.ts.ejs +2 -2
  57. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.ts.ejs +5 -12
  58. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.html.ejs +55 -21
  59. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.spec.ts.ejs +2 -2
  60. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.ts.ejs +10 -10
  61. package/dist/generators/angular/templates/src/main/webapp/app/entities/entity.routes.ts.ejs +25 -0
  62. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.html.ejs +21 -17
  63. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.ts.ejs +1 -1
  64. package/dist/generators/angular/templates/src/main/webapp/app/layouts/error/error.component.html.ejs +3 -3
  65. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +5 -2
  66. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.ts.ejs +5 -1
  67. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +97 -78
  68. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.scss.ejs +1 -1
  69. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +1 -1
  70. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss.ejs +1 -1
  71. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +6 -4
  72. package/dist/generators/angular/templates/src/main/webapp/app/login/login.component.html.ejs +3 -3
  73. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert-error.component.html.ejs +6 -2
  74. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert.component.html.ejs +6 -2
  75. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.component.html.ejs +11 -7
  76. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +1 -1
  77. package/dist/generators/angular/templates/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts.ejs +3 -3
  78. package/dist/generators/angular/templates/src/main/webapp/bootstrap.ts.ejs +5 -5
  79. package/dist/generators/angular/templates/src/main/webapp/content/scss/global.scss.ejs +1 -1
  80. package/dist/generators/angular/templates/webpack/webpack.microfrontend.js.ejs +48 -126
  81. package/dist/generators/app/README.md +108 -0
  82. package/dist/generators/app/USAGE +3 -0
  83. package/dist/generators/app/command.mjs +3 -3
  84. package/dist/generators/app/generator.mjs +11 -0
  85. package/dist/generators/app/support/config.mjs +3 -3
  86. package/dist/generators/base/command.mjs +0 -11
  87. package/dist/generators/base/generator.mjs +0 -3
  88. package/dist/generators/base/support/config.mjs +6 -6
  89. package/dist/generators/base/support/jhipster7-context.mjs +3 -3
  90. package/dist/generators/base-application/generator.mjs +7 -8
  91. package/dist/generators/base-application/support/entities.mjs +2 -2
  92. package/dist/generators/base-application/support/enum.mjs +1 -1
  93. package/dist/generators/base-application/support/index.mjs +1 -0
  94. package/dist/generators/base-application/support/prepare-entity.mjs +14 -11
  95. package/dist/generators/base-application/support/prepare-field.mjs +11 -7
  96. package/dist/generators/base-application/support/prepare-relationship.mjs +16 -14
  97. package/dist/generators/base-application/support/update-application-entities-transform.mjs +52 -0
  98. package/dist/generators/base-core/generator.mjs +17 -4
  99. package/dist/generators/base-entity-changes/generator.mjs +1 -1
  100. package/dist/generators/base-workspaces/internal/docker-prompts.mjs +13 -12
  101. package/dist/generators/bootstrap/command.mjs +6 -0
  102. package/dist/generators/bootstrap/generator.mjs +84 -45
  103. package/dist/generators/bootstrap/support/auto-crlf-transform.mjs +34 -21
  104. package/dist/generators/bootstrap/support/eslint-transform.mjs +2 -5
  105. package/dist/generators/bootstrap/support/java-unused-imports-transform.mjs +2 -2
  106. package/dist/generators/bootstrap/support/multi-step-transform/index.mjs +17 -28
  107. package/dist/generators/bootstrap/support/multi-step-transform/template-file-fs.mjs +12 -6
  108. package/dist/generators/bootstrap/support/multi-step-transform/template-file.mjs +1 -0
  109. package/dist/generators/bootstrap/support/prettier-support.mjs +2 -2
  110. package/dist/generators/bootstrap-application/generator.mjs +10 -21
  111. package/dist/generators/bootstrap-application-base/command.mjs +30 -0
  112. package/dist/generators/bootstrap-application-base/generator.mjs +36 -11
  113. package/dist/generators/bootstrap-application-base/index.mjs +1 -0
  114. package/dist/generators/bootstrap-application-base/support/export-jdl-transform.mjs +61 -0
  115. package/dist/generators/bootstrap-application-base/support/import-jdl-transform.mjs +64 -0
  116. package/dist/generators/bootstrap-application-base/support/index.mjs +2 -0
  117. package/dist/generators/bootstrap-application-server/generator.mjs +2 -2
  118. package/dist/generators/client/command.mjs +2 -0
  119. package/dist/generators/client/resources/package.json +4 -4
  120. package/dist/generators/client/support/entity-definition.mjs +3 -3
  121. package/dist/generators/client/templates/README.md.jhi.client.ejs +2 -2
  122. package/dist/generators/client/templates/src/main/webapp/content/css/loading.css.ejs +1 -1
  123. package/dist/generators/client/templates/src/main/webapp/index.html.ejs +2 -2
  124. package/dist/generators/client/templates/webpack/webpack.microfrontend.js.jhi.ejs +14 -1
  125. package/dist/generators/common/command.mjs +2 -0
  126. package/dist/generators/common/files.mjs +1 -1
  127. package/dist/generators/common/generator.mjs +29 -7
  128. package/dist/generators/common/resources/package.json +4 -4
  129. package/dist/generators/common/templates/.lintstagedrc.cjs.ejs +21 -0
  130. package/dist/generators/common/templates/.prettierrc.ejs +1 -1
  131. package/dist/generators/common/templates/README.md.jhi.ejs +2 -0
  132. package/dist/generators/common/templates/sonar-project.properties.ejs +1 -1
  133. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/account/settings-page.cy.ts.ejs +3 -0
  134. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/entity/_entity_.cy.ts.ejs +0 -1
  135. package/dist/generators/docker/generator.mjs +1 -1
  136. package/dist/generators/docker/templates/docker/cassandra.yml.ejs +2 -2
  137. package/dist/generators/docker/templates/docker/keycloak.yml.ejs +1 -1
  138. package/dist/generators/docker/templates/docker/realm-config/jhipster-realm.json.ejs +4 -1
  139. package/dist/generators/docker-compose/generator.mjs +4 -11
  140. package/dist/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
  141. package/dist/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +4 -1
  142. package/dist/generators/entity/prompts.mjs +123 -306
  143. package/dist/generators/export-jdl/generator.mjs +1 -1
  144. package/dist/generators/feign-client/cleanup.mjs +12 -0
  145. package/dist/generators/feign-client/files.mjs +35 -0
  146. package/dist/generators/feign-client/generator.mjs +65 -0
  147. package/dist/generators/feign-client/index.mjs +19 -0
  148. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizationHeaderUtil.java.ejs +174 -0
  149. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizedFeignClient.java.ejs +72 -0
  150. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuth2InterceptedFeignConfiguration.java.ejs +35 -0
  151. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuthIdpTokenResponseDTO.java.ejs +161 -0
  152. package/dist/generators/feign-client/templates/src/main/java/_package_/client/TokenRelayRequestInterceptor.java.ejs +42 -0
  153. package/dist/generators/feign-client/templates/src/main/java/_package_/client/UserFeignClientInterceptor_jwt.java.ejs +36 -0
  154. package/dist/generators/feign-client/templates/src/main/java/_package_/config/FeignConfiguration.java.ejs +45 -0
  155. package/dist/generators/feign-client/templates/src/test/java/_package_/client/AuthorizationHeaderUtilTest.java.ejs +263 -0
  156. package/dist/generators/generate-blueprint/command.mjs +1 -1
  157. package/dist/generators/generate-blueprint/resources/package.json +1 -1
  158. package/dist/generators/generate-blueprint/templates/vitest.config.ts.ejs +1 -1
  159. package/dist/generators/generator-constants.mjs +11 -7
  160. package/dist/generators/generator-list.mjs +1 -0
  161. package/dist/generators/git/generator.mjs +3 -5
  162. package/dist/generators/gradle/constants.mjs +1 -1
  163. package/dist/generators/heroku/generator.mjs +318 -595
  164. package/dist/generators/heroku/templates/Procfile.ejs +1 -1
  165. package/dist/generators/heroku/templates/application-heroku.yml.ejs +0 -12
  166. package/dist/generators/info/generator.mjs +6 -4
  167. package/dist/generators/init/generator.mjs +2 -2
  168. package/dist/generators/java/command.mjs +6 -0
  169. package/dist/generators/java/entity-files.mjs +5 -1
  170. package/dist/generators/java/generator.mjs +15 -15
  171. package/dist/generators/java/support/package-info-transform.mjs +20 -6
  172. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs +24 -28
  173. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jackson_identity_info.ejs +30 -0
  174. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs +3 -3
  175. package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs +86 -8
  176. package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_TestSamples.java.ejs +85 -0
  177. package/dist/generators/jdl/generator.mjs +32 -28
  178. package/dist/generators/kubernetes/templates/ingress.yml.ejs +0 -1
  179. package/dist/generators/kubernetes/templates/keycloak/keycloak-configmap.yml.ejs +4 -1
  180. package/dist/generators/kubernetes/templates/keycloak/keycloak.yml.ejs +1 -1
  181. package/dist/generators/languages/command.mjs +5 -0
  182. package/dist/generators/languages/generator.mjs +44 -28
  183. package/dist/generators/languages/prompts.mjs +3 -1
  184. package/dist/generators/languages/support/translate.mjs +1 -1
  185. package/dist/generators/languages/templates/entity/i18n/entity_pt-br.json.ejs +1 -1
  186. package/dist/generators/languages/translation-data.mjs +8 -13
  187. package/dist/generators/liquibase/README.md +19 -0
  188. package/dist/generators/liquibase/generator.mjs +7 -3
  189. package/dist/generators/project-name/generator.mjs +14 -19
  190. package/dist/generators/project-name/support/name-resolver.mjs +35 -6
  191. package/dist/generators/react/generator.mjs +18 -10
  192. package/dist/generators/react/resources/package.json +30 -29
  193. package/dist/generators/react/templates/package.json.ejs +4 -5
  194. package/dist/generators/react/templates/src/main/webapp/app/config/icon-loader.ts.ejs +35 -33
  195. package/dist/generators/react/templates/src/main/webapp/app/config/notification-middleware.spec.ts.ejs +4 -4
  196. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-detail.tsx.ejs +1 -2
  197. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.tsx.ejs +19 -15
  198. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.reducer.ts.ejs +1 -1
  199. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.tsx.ejs +3 -8
  200. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityModel_.model.ts.ejs +1 -1
  201. package/dist/generators/react/templates/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
  202. package/dist/generators/react/templates/src/main/webapp/app/routes.tsx.ejs +9 -2
  203. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header-components.tsx.ejs +1 -1
  204. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header.scss.ejs +6 -5
  205. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +10 -1
  206. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/reducer.utils.ts.ejs +1 -1
  207. package/dist/generators/react/templates/src/main/webapp/app/shared/util/date-utils.ts.ejs +1 -1
  208. package/dist/generators/react/templates/tsconfig.test.json.ejs +1 -1
  209. package/dist/generators/react/templates/webpack/webpack.microfrontend.js.jhi.react.ejs +13 -58
  210. package/dist/generators/server/cleanup.mjs +5 -0
  211. package/dist/generators/server/command.mjs +13 -2
  212. package/dist/generators/server/entity-files.mjs +3 -3
  213. package/dist/generators/server/files.mjs +2 -38
  214. package/dist/generators/server/generator.mjs +48 -23
  215. package/dist/generators/server/jdl/application-definition.mjs +5 -2
  216. package/dist/generators/server/options/feign-client.mjs +24 -0
  217. package/dist/generators/server/options/index.mjs +1 -0
  218. package/dist/generators/server/resources/Dockerfile +19 -19
  219. package/dist/generators/server/resources/gradle/libs.versions.toml +4 -4
  220. package/dist/generators/server/resources/pom.xml +18 -18
  221. package/dist/generators/server/support/config.mjs +5 -4
  222. package/dist/generators/server/support/prepare-entity.mjs +9 -6
  223. package/dist/generators/server/support/prepare-field.mjs +20 -0
  224. package/dist/generators/server/support/relationship.mjs +2 -1
  225. package/dist/generators/server/support/templates/field-values.mjs +5 -2
  226. package/dist/generators/server/templates/README.md.jhi.spring-boot.ejs +0 -1
  227. package/dist/generators/server/templates/build.gradle.ejs +1 -2
  228. package/dist/generators/server/templates/gradle/profile_dev.gradle.ejs +3 -21
  229. package/dist/generators/server/templates/gradle/profile_prod.gradle.ejs +5 -15
  230. package/dist/generators/server/templates/package.json.ejs +0 -5
  231. package/dist/generators/server/templates/pom.xml.ejs +2 -12
  232. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/get_all_template.ejs +8 -8
  233. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/search_template.ejs +4 -4
  234. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/repository/_entityClass_Repository.java.ejs +1 -1
  235. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs +2 -2
  236. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/mapper/_entityClass_Mapper.java.ejs +2 -2
  237. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/web/rest/_entityClass_Resource.java.ejs +14 -14
  238. package/dist/generators/server/templates/src/main/java/_package_/config/JacksonConfiguration.java.ejs +2 -1
  239. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_imperative.java.ejs +21 -3
  240. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_reactive.java.ejs +6 -1
  241. package/dist/generators/server/templates/src/main/java/_package_/security/oauth2/CustomClaimConverter.java.ejs +1 -5
  242. package/dist/generators/server/templates/src/main/java/_package_/service/MailService.java.ejs +48 -6
  243. package/dist/generators/server/templates/src/main/java/_package_/web/rest/AccountResource.java.ejs +1 -1
  244. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_imperative.java.ejs +4 -13
  245. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_reactive.java.ejs +5 -11
  246. package/dist/generators/server/templates/src/main/java/_package_/web/rest/PublicUserResource.java.ejs +6 -7
  247. package/dist/generators/server/templates/src/main/java/_package_/web/rest/UserResource.java.ejs +6 -8
  248. package/dist/generators/server/templates/src/main/java/_package_/web/rest/errors/ExceptionTranslator.java.ejs +4 -7
  249. package/dist/generators/server/templates/src/main/resources/config/application.yml.ejs +8 -7
  250. package/dist/generators/server/templates/src/test/java/_package_/TechnicalStructureTest.java.ejs +1 -1
  251. package/dist/generators/server/templates/src/test/java/_package_/_entityPackage_/web/rest/_entityClass_ResourceIT.java.ejs +11 -11
  252. package/dist/generators/server/templates/src/test/java/_package_/web/rest/AccountResourceIT.java.ejs +4 -4
  253. package/dist/generators/server/templates/src/test/java/_package_/web/rest/errors/ExceptionTranslatorTestController.java.ejs +2 -2
  254. package/dist/generators/spring-cache/internal/dependencies.mjs +1 -1
  255. package/dist/generators/spring-cache/templates/gradle/cache.gradle.ejs +1 -1
  256. package/dist/generators/spring-cache/templates/src/main/java/_package_/config/CacheFactoryConfiguration.java.ejs +1 -1
  257. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_imperative.java.ejs +1 -1
  258. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_reactive.java.ejs +1 -1
  259. package/dist/generators/spring-cloud-stream/templates/src/test/java/_package_/web/rest/KafkaResourceIT_reactive.java.ejs +3 -0
  260. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.elastic_search.ejs +1 -1
  261. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/repository/search/_entityClass_SearchRepository.java.ejs +1 -3
  262. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/repository/search/UserSearchRepository.java.ejs +4 -4
  263. package/dist/generators/spring-data-neo4j/generator.mjs +43 -1
  264. package/dist/generators/spring-data-neo4j/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.spring_data_neo4j.ejs +3 -37
  265. package/dist/generators/spring-data-relational/README.md +7 -0
  266. package/dist/generators/spring-data-relational/generator.mjs +2 -1
  267. package/dist/generators/spring-data-relational/internal/dependencies.mjs +29 -8
  268. package/dist/generators/spring-data-relational/support/database-data.mjs +4 -0
  269. package/dist/generators/spring-data-relational/templates/src/main/java/_package_/repository/EntityManager_reactive.java.ejs +49 -8
  270. package/dist/generators/spring-data-relational/templates/src/test/java/_package_/config/SqlTestContainersSpringContextCustomizerFactory.java.ejs +1 -1
  271. package/dist/generators/upgrade/generator.mjs +3 -3
  272. package/dist/generators/vue/generator.mjs +25 -16
  273. package/dist/generators/vue/resources/package.json +29 -28
  274. package/dist/generators/vue/templates/package.json.ejs +4 -5
  275. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +10 -3
  276. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +3 -4
  277. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-details.vue.ejs +1 -2
  278. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.spec.ts.ejs +1 -1
  279. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.ts.ejs +3 -3
  280. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.vue.ejs +2 -15
  281. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.service.ts.ejs +1 -1
  282. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.vue.ejs +14 -7
  283. package/dist/generators/vue/templates/src/main/webapp/app/router/index.ts.ejs +8 -1
  284. package/dist/generators/vue/templates/webpack/webpack.microfrontend.js.jhi.vue.ejs +19 -34
  285. package/dist/jdl/converters/jdl-to-json/jdl-to-json-basic-entity-converter.js +1 -0
  286. package/dist/jdl/converters/jdl-to-json/jdl-to-json-option-converter.js +2 -2
  287. package/dist/jdl/converters/jdl-to-json/jdl-to-json-relationship-converter.js +1 -1
  288. package/dist/jdl/converters/jdl-to-json/jdl-without-application-to-json-converter.js +1 -1
  289. package/dist/jdl/converters/json-to-jdl-converter.js +1 -1
  290. package/dist/jdl/converters/json-to-jdl-entity-converter.js +1 -0
  291. package/dist/jdl/converters/parsed-jdl-to-jdl-object/application-converter.js +1 -17
  292. package/dist/jdl/converters/parsed-jdl-to-jdl-object/entity-converter.js +5 -0
  293. package/dist/jdl/converters/parsed-jdl-to-jdl-object/parsed-jdl-to-jdl-object-converter.js +0 -27
  294. package/dist/jdl/exporters/applications/jhipster-application-formatter.js +17 -1
  295. package/dist/jdl/exporters/config.js +11 -0
  296. package/dist/jdl/exporters/export-utils.js +2 -13
  297. package/dist/jdl/exporters/jhipster-entity-exporter.js +3 -2
  298. package/dist/jdl/index.js +1 -0
  299. package/dist/jdl/jdl-importer.js +6 -2
  300. package/dist/jdl/jhipster/default-application-options.js +1 -1
  301. package/dist/jdl/jhipster/field-types.js +1 -1
  302. package/dist/jdl/jhipster/json-entity.js +6 -0
  303. package/dist/jdl/models/jdl-application-configuration-factory.js +34 -2
  304. package/dist/jdl/models/jdl-application-configuration.js +6 -3
  305. package/dist/jdl/models/jdl-application-factory.js +2 -2
  306. package/dist/jdl/models/jdl-application.js +12 -3
  307. package/dist/jdl/models/jdl-entity.js +16 -1
  308. package/dist/jdl/models/jdl-field.js +13 -0
  309. package/dist/jdl/models/jdl-object.js +3 -3
  310. package/dist/jdl/models/jdl-relationship.js +23 -5
  311. package/dist/jdl/parsing/jdl-ast-builder-visitor.js +63 -7
  312. package/dist/jdl/parsing/jdl-parser.js +52 -6
  313. package/dist/jdl/parsing/lexer/application-tokens.js +2 -2
  314. package/dist/jdl/validators/entity-validator.js +4 -2
  315. package/dist/jdl/validators/enum-validator.js +4 -2
  316. package/dist/jdl/validators/jdl-with-application-validator.js +18 -8
  317. package/dist/jdl/validators/jdl-without-application-validator.js +30 -29
  318. package/dist/jdl/validators/validator.js +1 -1
  319. package/dist/testing/helpers.mjs +10 -3
  320. package/dist/types/cli/environment-builder.d.mts +2 -0
  321. package/dist/types/generators/angular/needle-api/needle-client-angular.d.mts +0 -1
  322. package/dist/types/generators/base/api.d.mts +12 -0
  323. package/dist/types/generators/base/support/config.d.mts +3 -3
  324. package/dist/types/generators/base/support/needles.d.mts +1 -1
  325. package/dist/types/generators/base-application/generator.d.mts +2 -2
  326. package/dist/types/generators/base-application/support/index.d.mts +1 -0
  327. package/dist/types/generators/base-application/support/prepare-entity.d.mts +6 -1
  328. package/dist/types/generators/base-application/support/update-application-entities-transform.d.mts +4 -0
  329. package/dist/types/generators/base-application/types/relationship.d.mts +4 -0
  330. package/dist/types/generators/base-core/generator.d.mts +7 -1
  331. package/dist/types/generators/bootstrap/support/auto-crlf-transform.d.mts +3 -2
  332. package/dist/types/generators/bootstrap/support/multi-step-transform/index.d.mts +3 -20
  333. package/dist/types/generators/bootstrap/support/multi-step-transform/template-file-fs.d.mts +15 -9
  334. package/dist/types/generators/bootstrap/support/multi-step-transform/template-file.d.mts +1 -0
  335. package/dist/types/generators/bootstrap-application-base/support/export-jdl-transform.d.mts +8 -0
  336. package/dist/types/generators/bootstrap-application-base/support/import-jdl-transform.d.mts +6 -0
  337. package/dist/types/generators/bootstrap-application-base/support/index.d.mts +2 -0
  338. package/dist/types/generators/client/support/entity-definition.d.mts +2 -2
  339. package/dist/types/generators/feign-client/types-export.d.ts +1 -0
  340. package/dist/types/generators/generator-constants.d.mts +52 -48
  341. package/dist/types/generators/generator-list.d.mts +1 -0
  342. package/dist/types/generators/java/support/package-info-transform.d.mts +1 -4
  343. package/dist/types/generators/project-name/support/name-resolver.d.mts +9 -1
  344. package/dist/types/generators/server/options/feign-client.d.mts +21 -0
  345. package/dist/types/generators/server/options/index.d.mts +1 -0
  346. package/dist/types/generators/server/support/templates/field-values.d.mts +1 -1
  347. package/dist/types/jdl/converters/json-to-jdl-converter.d.ts +1 -0
  348. package/dist/types/jdl/converters/parsed-jdl-to-jdl-object/option-converter.d.ts +1 -1
  349. package/dist/types/jdl/exporters/config.d.ts +1 -0
  350. package/dist/types/jdl/index.d.ts +1 -0
  351. package/dist/types/jdl/jdl-importer.d.ts +1 -0
  352. package/dist/types/jdl/jhipster/json-entity.d.ts +2 -0
  353. package/dist/types/jdl/models/jdl-application-configuration-factory.d.ts +1 -0
  354. package/dist/types/jdl/models/jdl-application-configuration-option.d.ts +2 -2
  355. package/dist/types/jdl/models/jdl-application-configuration.d.ts +8 -6
  356. package/dist/types/jdl/models/jdl-application-factory.d.ts +1 -1
  357. package/dist/types/jdl/models/jdl-application.d.ts +8 -4
  358. package/dist/types/jdl/models/jdl-entity.d.ts +1 -0
  359. package/dist/types/jdl/models/jdl-object.d.ts +1 -1
  360. package/dist/types/jdl/models/jdl-relationship.d.ts +0 -18
  361. package/dist/types/jdl/models/list-jdl-application-configuration-option.d.ts +1 -1
  362. package/dist/types/jdl/parsing/jdl-ast-builder-visitor.d.ts +10 -0
  363. package/dist/types/jdl/parsing/jdl-parser.d.ts +3 -0
  364. package/dist/types/jdl/parsing/lexer/application-tokens.d.ts +1 -0
  365. package/dist/types/jdl/types/types.d.mts +2 -2
  366. package/dist/types/jdl/validators/entity-validator.d.ts +2 -2
  367. package/dist/types/jdl/validators/enum-validator.d.ts +2 -2
  368. package/dist/types/jdl/validators/validator.d.ts +4 -1
  369. package/package.json +41 -41
@@ -21,6 +21,7 @@ import { fieldTypes, validations } from '../../../jdl/jhipster/index.mjs';
21
21
  import { getTypescriptType, prepareField as prepareClientFieldForTemplates } from '../../client/support/index.mjs';
22
22
  import { prepareField as prepareServerFieldForTemplates } from '../../server/support/index.mjs';
23
23
  import { fieldIsEnum } from './field-utils.mjs';
24
+ import { mutateData } from '../../base/support/config.mjs';
24
25
  const { BlobTypes, CommonDBTypes, RelationalOnlyDBTypes } = fieldTypes;
25
26
  const { Validations: { MIN, MINLENGTH, MINBYTES, MAX, MAXBYTES, MAXLENGTH, PATTERN, REQUIRED, UNIQUE }, } = validations;
26
27
  const { TEXT, IMAGE, ANY } = BlobTypes;
@@ -267,14 +268,17 @@ export default function prepareField(entityWithConfig, field, generator) {
267
268
  return field;
268
269
  }
269
270
  function prepareCommonFieldForTemplates(entityWithConfig, field, generator) {
270
- _.defaults(field, {
271
- propertyName: field.fieldName,
271
+ mutateData(field, {
272
272
  path: [field.fieldName],
273
- fieldNameCapitalized: _.upperFirst(field.fieldName),
274
- fieldNameUnderscored: _.snakeCase(field.fieldName),
275
- fieldNameHumanized: _.startCase(field.fieldName),
276
- fieldTranslationKey: `${entityWithConfig.i18nKeyPrefix}.${field.fieldName}`,
277
- tsType: getTypescriptType(field.fieldType),
273
+ propertyName: field.fieldName,
274
+ propertyNameCapitalized: ({ propertyName, propertyNameCapitalized }) => propertyNameCapitalized ?? _.upperFirst(propertyName),
275
+ fieldNameCapitalized: ({ fieldName, fieldNameCapitalized }) => fieldNameCapitalized ?? _.upperFirst(fieldName),
276
+ fieldNameUnderscored: ({ fieldName, fieldNameUnderscored }) => fieldNameUnderscored ?? _.snakeCase(fieldName),
277
+ fieldNameHumanized: ({ fieldName, fieldNameHumanized }) => fieldNameHumanized ?? _.startCase(fieldName),
278
+ fieldTranslationKey: ({ fieldName, fieldTranslationKey }) => fieldTranslationKey ?? `${entityWithConfig.i18nKeyPrefix}.${fieldName}`,
279
+ tsType: ({ fieldType, tsType }) => tsType ?? getTypescriptType(fieldType),
280
+ });
281
+ _.defaults(field, {
278
282
  entity: entityWithConfig,
279
283
  });
280
284
  const fieldType = field.fieldType;
@@ -22,20 +22,12 @@ import { databaseTypes, entityOptions, reservedKeywords, validations, checkAndRe
22
22
  import { upperFirstCamelCase } from '../../base/support/string.mjs';
23
23
  import { getJoinTableName, hibernateSnakeCase } from '../../server/support/index.mjs';
24
24
  import { stringifyApplicationData } from './debug.mjs';
25
+ import { mutateData } from '../../base/support/config.mjs';
25
26
  const { isReservedTableName } = reservedKeywords;
26
27
  const { NEO4J, NO: DATABASE_NO } = databaseTypes;
27
28
  const { MapperTypes } = entityOptions;
28
29
  const { Validations: { REQUIRED }, } = validations;
29
30
  const { MAPSTRUCT } = MapperTypes;
30
- function _derivedProperties(relationship) {
31
- _.defaults(relationship, {
32
- relationshipOneToOne: relationship.relationshipType === 'one-to-one',
33
- relationshipOneToMany: relationship.relationshipType === 'one-to-many',
34
- relationshipManyToOne: relationship.relationshipType === 'many-to-one',
35
- relationshipManyToMany: relationship.relationshipType === 'many-to-many',
36
- otherEntityUser: relationship.otherEntityName === 'user',
37
- });
38
- }
39
31
  function _defineOnUpdateAndOnDelete(relationship, generator) {
40
32
  relationship.onDelete = checkAndReturnRelationshipOnValue(relationship.options?.onDelete, generator);
41
33
  relationship.onUpdate = checkAndReturnRelationshipOnValue(relationship.options?.onUpdate, generator);
@@ -54,12 +46,19 @@ export default function prepareRelationship(entityWithConfig, relationship, gene
54
46
  Object.assign(relationship, {
55
47
  relationshipLeftSide: relationship.relationshipSide === 'left',
56
48
  relationshipRightSide: relationship.relationshipSide === 'right',
49
+ collection: relationship.relationshipType === 'one-to-many' || relationship.relationshipType === 'many-to-many',
50
+ relationshipOneToOne: relationship.relationshipType === 'one-to-one',
51
+ relationshipOneToMany: relationship.relationshipType === 'one-to-many',
52
+ relationshipManyToOne: relationship.relationshipType === 'many-to-one',
53
+ relationshipManyToMany: relationship.relationshipType === 'many-to-many',
54
+ otherEntityUser: relationship.otherEntityName === 'user',
57
55
  });
58
- _.defaults(relationship, {
56
+ mutateData(relationship, {
59
57
  // let ownerSide true when type is 'many-to-one' for convenience.
60
58
  // means that this side should control the reference.
61
- ownerSide: relationship.ownerSide || relationship.relationshipType === 'many-to-one' || relationship.relationshipSide === 'left',
62
- collection: relationship.relationshipType === 'one-to-many' || relationship.relationshipType === 'many-to-many',
59
+ ownerSide: ({ ownerSide, relationshipLeftSide, relationshipManyToOne, relationshipOneToMany }) => ownerSide ?? (relationshipManyToOne || (relationshipLeftSide && !relationshipOneToMany)),
60
+ persistableRelationship: ({ persistableRelationship, ownerSide }) => persistableRelationship ?? ownerSide,
61
+ relationshipUpdateBackReference: ({ relationshipUpdateBackReference, ownerSide, relationshipRightSide }) => relationshipUpdateBackReference ?? (entityWithConfig.databaseType === 'neo4j' ? relationshipRightSide : !ownerSide),
63
62
  });
64
63
  relationship.otherSideReferenceExists = false;
65
64
  relationship.otherEntityIsEmbedded = otherEntityData.embedded;
@@ -80,6 +79,9 @@ export default function prepareRelationship(entityWithConfig, relationship, gene
80
79
  entityWithConfig.databaseType !== NEO4J &&
81
80
  entityWithConfig.databaseType !== DATABASE_NO &&
82
81
  (relationship.relationshipType === 'one-to-many' || relationship.ownerSide === false)) {
82
+ if (otherEntityData.builtInUser) {
83
+ throw new Error(`Error at entity ${entityName}: relationships with built-in User cannot have back reference`);
84
+ }
83
85
  throw new Error(`Error at entity ${entityName}: could not find the other side of the relationship ${stringifyApplicationData(relationship)}`);
84
86
  }
85
87
  else {
@@ -130,8 +132,9 @@ export default function prepareRelationship(entityWithConfig, relationship, gene
130
132
  : _.upperFirst(pluralize(relationship.relationshipName)),
131
133
  otherEntityNameCapitalizedPlural: pluralize(relationship.otherEntityNameCapitalized),
132
134
  });
133
- _.defaults(relationship, {
135
+ mutateData(relationship, {
134
136
  propertyName: relationship.collection ? relationship.relationshipFieldNamePlural : relationship.relationshipFieldName,
137
+ propertyNameCapitalized: ({ propertyName, propertyNameCapitalized }) => propertyNameCapitalized ?? _.upperFirst(propertyName),
135
138
  });
136
139
  if (entityWithConfig.dto === MAPSTRUCT) {
137
140
  if (otherEntityData.dto !== MAPSTRUCT && !otherEntityData.builtInUser) {
@@ -205,7 +208,6 @@ export default function prepareRelationship(entityWithConfig, relationship, gene
205
208
  }
206
209
  relationship.reference = relationshipToReference(entityWithConfig, relationship);
207
210
  _defineOnUpdateAndOnDelete(relationship, generator);
208
- _derivedProperties(relationship);
209
211
  return relationship;
210
212
  }
211
213
  function relationshipToReference(entity, relationship, pathPrefix = []) {
@@ -0,0 +1,52 @@
1
+ import { readdir } from 'fs/promises';
2
+ import { loadFile } from 'mem-fs';
3
+ import { Minimatch } from 'minimatch';
4
+ import { transform } from 'p-transform';
5
+ import { basename, join } from 'path';
6
+ import { GENERATOR_JHIPSTER } from '../../generator-constants.mjs';
7
+ export const updateApplicationEntitiesTransform = ({ destinationPath, throwOnMissingConfig = true, }) => {
8
+ let yoRcFileInMemory;
9
+ const entities = [];
10
+ const yoRcFilePath = join(destinationPath, '.yo-rc.json');
11
+ const entitiesMatcher = new Minimatch(`${destinationPath}/.jhipster/*.json`);
12
+ return transform(file => {
13
+ if (file.path === yoRcFilePath) {
14
+ yoRcFileInMemory = file;
15
+ return undefined;
16
+ }
17
+ if (entitiesMatcher.match(file.path)) {
18
+ entities.push(basename(file.path).replace('.json', ''));
19
+ }
20
+ return file;
21
+ }, async function () {
22
+ try {
23
+ entities.push(...(await readdir(join(destinationPath, '.jhipster'))).map(file => file.replace('.json', '')));
24
+ }
25
+ catch {
26
+ // Directory does not exist
27
+ }
28
+ if (entities.length > 0) {
29
+ // The mem-fs instance requires another file instance to emit a change event
30
+ const yoRcFile = loadFile(yoRcFilePath);
31
+ // Prefer in-memory file if it exists
32
+ const yoRcFileContents = yoRcFileInMemory?.contents ?? yoRcFile.contents;
33
+ if (yoRcFileContents) {
34
+ const contents = JSON.parse(yoRcFileContents.toString());
35
+ if (contents[GENERATOR_JHIPSTER]) {
36
+ contents[GENERATOR_JHIPSTER].entities = [...new Set([...(contents[GENERATOR_JHIPSTER].entities ?? []), ...entities])];
37
+ yoRcFile.contents = Buffer.from(JSON.stringify(contents, null, 2));
38
+ yoRcFileInMemory = yoRcFile;
39
+ }
40
+ else if (throwOnMissingConfig) {
41
+ throw new Error(`File ${yoRcFile.path} is not a valid JHipster configuration file`);
42
+ }
43
+ }
44
+ else if (throwOnMissingConfig) {
45
+ throw new Error(`File ${yoRcFile.path} has no contents`);
46
+ }
47
+ }
48
+ if (yoRcFileInMemory) {
49
+ this.push(yoRcFileInMemory);
50
+ }
51
+ });
52
+ };
@@ -116,7 +116,7 @@ export default class CoreGenerator extends YeomanGenerator {
116
116
  }
117
117
  this.registerPriorities(CUSTOM_PRIORITIES);
118
118
  if (this.getFeatures().jhipsterBootstrap ?? true) {
119
- // jhipster:bootstrap is always required. Run it once the enviroment starts.
119
+ // jhipster:bootstrap is always required. Run it once the environment starts.
120
120
  this.env.queueTask('environment:run', async () => this.composeWithJHipster(GENERATOR_BOOTSTRAP).then(), {
121
121
  once: 'queueJhipsterBootstrap',
122
122
  startQueue: false,
@@ -141,6 +141,19 @@ export default class CoreGenerator extends YeomanGenerator {
141
141
  }
142
142
  return this._needleApi;
143
143
  }
144
+ /**
145
+ * Warn or throws check failure based on current skipChecks option.
146
+ * @param message
147
+ */
148
+ handleCheckFailure(message) {
149
+ if (this.skipChecks) {
150
+ this.log.warn(message);
151
+ }
152
+ else {
153
+ throw new Error(`${message}
154
+ You can ignore this error by passing '--skip-checks' to jhipster command.`);
155
+ }
156
+ }
144
157
  /**
145
158
  * Check if the JHipster version used to generate an existing project is less than the passed version argument
146
159
  *
@@ -189,7 +202,7 @@ export default class CoreGenerator extends YeomanGenerator {
189
202
  */
190
203
  getTaskNames() {
191
204
  let priorities = super.getTaskNames();
192
- if (this.options.skipPriorities) {
205
+ if (!this.features.disableSkipPriorities && this.options.skipPriorities) {
193
206
  // Make sure yeoman-generator will not throw on empty tasks due to filtered priorities.
194
207
  this.customLifecycle = priorities.length > 0;
195
208
  priorities = priorities.filter(priorityName => !this.options.skipPriorities.includes(priorityName));
@@ -226,7 +239,7 @@ export default class CoreGenerator extends YeomanGenerator {
226
239
  if (!optionDesc?.type || !optionDesc.scope || (common && optionDesc.scope === 'generator'))
227
240
  return;
228
241
  let optionValue;
229
- // Hidden options are test options, which doesn't rely on commoander for options parsing.
242
+ // Hidden options are test options, which doesn't rely on commander for options parsing.
230
243
  // We must parse environment variables manually
231
244
  if (this.options[optionDesc.name ?? optionName] === undefined && optionDesc.env && process.env[optionDesc.env]) {
232
245
  optionValue = process.env[optionDesc.env];
@@ -413,7 +426,7 @@ export default class CoreGenerator extends YeomanGenerator {
413
426
  generator = namespace;
414
427
  }
415
428
  else {
416
- // Keep test compatibily were jhipster lookup does not run.
429
+ // Keep test compatibility were jhipster lookup does not run.
417
430
  const found = ['/index.js', '/index.cjs', '/index.mjs', '/index.ts', '/index.cts', '/index.mts'].find(extension => {
418
431
  const pathToLook = join(__dirname, `../${generator}${extension}`);
419
432
  return existsSync(pathToLook) ? pathToLook : undefined;
@@ -64,7 +64,7 @@ export default class GeneratorBaseEntityChanges extends GeneratorBaseApplication
64
64
  const { generateBuiltInUserEntity, incrementalChangelog } = this.sharedData.getApplication();
65
65
  const entityNames = this.getExistingEntityNames();
66
66
  const entitiesByName = Object.fromEntries(entityNames.map(entityName => [entityName, this.sharedData.getEntity(entityName)]));
67
- const entitiesWithExistingChangelog = entityNames.filter(entityName => !this.isChangelogNew({ entityName, changelogDate: entitiesByName[entityName].changelogDate }));
67
+ const entitiesWithExistingChangelog = entityNames.filter(entityName => !this.isChangelogNew({ entityName, changelogDate: entitiesByName[entityName].annotations?.changelogDate }));
68
68
  const previousEntitiesByName = Object.fromEntries(entityNames
69
69
  .filter(entityName => existsSync(this.getEntityConfigPath(entityName)))
70
70
  .map(entityName => [
@@ -17,7 +17,8 @@
17
17
  * limitations under the License.
18
18
  */
19
19
  import chalk from 'chalk';
20
- import { readdirSync, statSync } from 'node:fs';
20
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
21
+ import { join } from 'node:path';
21
22
  import { loadConfigs } from './docker-base.mjs';
22
23
  import { applicationTypes, monitoringTypes, serviceDiscoveryTypes } from '../../../jdl/jhipster/index.mjs';
23
24
  import { convertSecretToBase64 } from '../../base/support/index.mjs';
@@ -115,7 +116,7 @@ async function askForPath() {
115
116
  const path = this.destinationPath(input);
116
117
  try {
117
118
  if (statSync(path).isDirectory) {
118
- const appsFolders = getAppFolders.call(this, input, deploymentApplicationType);
119
+ const appsFolders = getAppFolders.call(this, path, deploymentApplicationType);
119
120
  if (appsFolders.length === 0) {
120
121
  return deploymentApplicationType === MONOLITH
121
122
  ? `No monolith found in ${path}`
@@ -138,7 +139,7 @@ async function askForPath() {
138
139
  this.log.log(chalk.yellow(`The path "${this.directoryPath}" does not end with a trailing "/", adding it anyway.`));
139
140
  this.directoryPath += '/';
140
141
  }
141
- this.appsFolders = getAppFolders.call(this, this.directoryPath, deploymentApplicationType);
142
+ this.appsFolders = getAppFolders.call(this, this.destinationPath(this.directoryPath), deploymentApplicationType);
142
143
  // Removing registry from appsFolders, using reverse for loop
143
144
  for (let i = this.appsFolders.length - 1; i >= 0; i--) {
144
145
  if (this.appsFolders[i] === 'jhipster-registry' || this.appsFolders[i] === 'registry') {
@@ -341,25 +342,25 @@ async function askForDockerPushCommand() {
341
342
  * @param deploymentApplicationType type of application being composed
342
343
  * @returns {Array} array of string representing app folders
343
344
  */
344
- export function getAppFolders(input, deploymentApplicationType) {
345
- const destinationPath = this.destinationPath(input);
346
- const files = readdirSync(destinationPath);
345
+ export function getAppFolders(directory, deploymentApplicationType) {
346
+ const files = readdirSync(directory);
347
347
  const appsFolders = [];
348
348
  files.forEach(file => {
349
349
  try {
350
- if (statSync(this.destinationPath(file)).isDirectory()) {
351
- if (statSync(this.destinationPath(file, '.yo-rc.json')).isFile()) {
350
+ if (statSync(join(directory, file)).isDirectory()) {
351
+ const yoRcFile = join(directory, file, '.yo-rc.json');
352
+ if (statSync(yoRcFile).isFile()) {
352
353
  try {
353
- const fileData = this.readDestinationJSON(`${file.name}/.yo-rc.json`);
354
+ const fileData = JSON.parse(readFileSync(yoRcFile).toString());
354
355
  if (fileData['generator-jhipster'].baseName !== undefined &&
355
356
  (deploymentApplicationType === undefined ||
356
- deploymentApplicationType === fileData['generator-jhipster'].applicationType ||
357
+ deploymentApplicationType === (fileData['generator-jhipster'].applicationType ?? MONOLITH) ||
357
358
  (deploymentApplicationType === MICROSERVICE && fileData['generator-jhipster'].applicationType === GATEWAY))) {
358
- appsFolders.push(file.name.match(/([^/]*)\/*$/)[1]);
359
+ appsFolders.push(file.match(/([^/]*)\/*$/)[1]);
359
360
  }
360
361
  }
361
362
  catch (err) {
362
- this.log.error(chalk.red(`${file}: this .yo-rc.json can't be read`));
363
+ this.log.error(chalk.red(`${yoRcFile}: this .yo-rc.json can't be read`));
363
364
  this.log.debug('Error:', err);
364
365
  }
365
366
  }
@@ -11,6 +11,12 @@ const command = {
11
11
  hide: true,
12
12
  scope: 'generator',
13
13
  },
14
+ refreshOnCommit: {
15
+ description: 'Refresh files on commit',
16
+ type: Boolean,
17
+ hide: true,
18
+ scope: 'generator',
19
+ },
14
20
  },
15
21
  };
16
22
  export default command;
@@ -16,8 +16,10 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
+ import { Duplex } from 'stream';
19
20
  import { forceYoFiles, createConflicterTransform, createYoResolveTransform } from '@yeoman/conflicter';
20
- import { isFilePending } from 'mem-fs-editor/state';
21
+ import { isFileStateModified, isFilePending } from 'mem-fs-editor/state';
22
+ import { createCommitTransform } from 'mem-fs-editor/transform';
21
23
  import BaseGenerator from '../base/index.mjs';
22
24
  import { createMultiStepTransform, createPrettierTransform, createForceWriteConfigFilesTransform, autoCrlfTransform, isPrettierConfigFilePath, createSortConfigFilesTransform, createESLintTransform, createRemoveUnusedImportsTransform, } from './support/index.mjs';
23
25
  import { PRETTIER_EXTENSIONS } from '../generator-constants.mjs';
@@ -34,8 +36,11 @@ export default class BootstrapGenerator extends BaseGenerator {
34
36
  static PRE_CONFLICTS = PRE_CONFLICTS_PRIORITY;
35
37
  upgradeCommand;
36
38
  skipPrettier;
39
+ prettierExtensions = PRETTIER_EXTENSIONS.split(',');
40
+ prettierOptions = { plugins: [] };
41
+ refreshOnCommit = false;
37
42
  constructor(args, options, features) {
38
- super(args, options, { jhipsterBootstrap: false, uniqueGlobally: true, customCommitTask: () => this.commitSharedFs(), ...features });
43
+ super(args, options, { jhipsterBootstrap: false, uniqueGlobally: true, customCommitTask: () => this.commitTask(), ...features });
39
44
  }
40
45
  async beforeQueue() {
41
46
  loadStoredAppOptions.call(this);
@@ -52,7 +57,7 @@ export default class BootstrapGenerator extends BaseGenerator {
52
57
  get initializing() {
53
58
  return this.asInitializingTaskGroup({
54
59
  loadOptions() {
55
- this.parseJHipsterOptions(command.options);
60
+ this.parseJHipsterOptions(command.options, command.configs);
56
61
  },
57
62
  validateBlueprint() {
58
63
  if (this.jhipsterConfig.blueprints && !this.skipChecks) {
@@ -69,13 +74,8 @@ export default class BootstrapGenerator extends BaseGenerator {
69
74
  }
70
75
  get multistepTransform() {
71
76
  return {
72
- queueTransform() {
77
+ queueMultistepTransform() {
73
78
  this.queueMultistepTransform();
74
- this.env.sharedFs.on('change', filePath => {
75
- if (createMultiStepTransform().templateFileFs.isTemplate(filePath)) {
76
- this.queueMultistepTransform();
77
- }
78
- });
79
79
  },
80
80
  };
81
81
  }
@@ -84,13 +84,8 @@ export default class BootstrapGenerator extends BaseGenerator {
84
84
  }
85
85
  get preConflicts() {
86
86
  return {
87
- async queueCommitPrettierConfig() {
88
- await this.queueCommitPrettierConfig();
89
- this.env.sharedFs.on('change', filePath => {
90
- if (isPrettierConfigFilePath(filePath)) {
91
- this.queueCommitPrettierConfig();
92
- }
93
- });
87
+ queueCommitPrettierConfig() {
88
+ this.queueCommitPrettierConfig();
94
89
  },
95
90
  };
96
91
  }
@@ -101,14 +96,22 @@ export default class BootstrapGenerator extends BaseGenerator {
101
96
  * Queue multi step templates transform
102
97
  */
103
98
  queueMultistepTransform() {
99
+ const multiStepTransform = createMultiStepTransform();
100
+ const listener = filePath => {
101
+ if (multiStepTransform.templateFileFs.isTemplate(filePath)) {
102
+ this.env.sharedFs.removeListener('change', listener);
103
+ this.queueMultistepTransform();
104
+ }
105
+ };
104
106
  this.queueTask({
105
- method: () => {
106
- const multiStepTransform = createMultiStepTransform();
107
- const filter = file => isFilePending(file) && multiStepTransform.templateFileFs.isTemplate(file.path);
108
- return this.env.applyTransforms([multiStepTransform], {
107
+ method: async () => {
108
+ await this.pipeline({
109
109
  name: 'applying multi-step templates',
110
- streamOptions: { filter },
111
- });
110
+ filter: file => isFileStateModified(file) && multiStepTransform.templateFileFs.isTemplate(file.path),
111
+ refresh: true,
112
+ allowOverride: true,
113
+ }, multiStepTransform);
114
+ this.env.sharedFs.on('change', listener);
112
115
  },
113
116
  taskName: MULTISTEP_TRANSFORM_QUEUE,
114
117
  queueName: MULTISTEP_TRANSFORM_QUEUE,
@@ -116,9 +119,16 @@ export default class BootstrapGenerator extends BaseGenerator {
116
119
  });
117
120
  }
118
121
  queueCommitPrettierConfig() {
122
+ const listener = filePath => {
123
+ if (isPrettierConfigFilePath(filePath)) {
124
+ this.env.sharedFs.removeListener('change', listener);
125
+ this.queueCommitPrettierConfig();
126
+ }
127
+ };
119
128
  this.queueTask({
120
129
  method: async () => {
121
130
  await this.commitPrettierConfig();
131
+ this.env.sharedFs.on('change', listener);
122
132
  },
123
133
  taskName: 'commitPrettierConfig',
124
134
  queueName: PRE_CONFLICTS_QUEUE,
@@ -126,37 +136,66 @@ export default class BootstrapGenerator extends BaseGenerator {
126
136
  });
127
137
  }
128
138
  async commitPrettierConfig() {
129
- const filter = file => isFilePending(file) && isPrettierConfigFilePath(file.path);
130
- await this.commitSharedFs(this.env.sharedFs.stream({ filter }));
131
- this.log.ok('committed prettier configuration files');
139
+ await this.commitSharedFs({
140
+ log: 'prettier configuration files committed to disk',
141
+ filter: file => isPrettierConfigFilePath(file.path),
142
+ });
143
+ }
144
+ async commitTask() {
145
+ await this.commitSharedFs({ refresh: this.refreshOnCommit }, ...this.env
146
+ .findFeature('commitTransformFactory')
147
+ .map(({ feature }) => feature())
148
+ .flat());
132
149
  }
133
150
  /**
134
151
  * Commits the MemFs to the disc.
135
- * @param stream - files stream, defaults to this.sharedFs.stream().
136
152
  */
137
- async commitSharedFs(stream = this.env.sharedFs.stream({ filter: isFilePending })) {
138
- const { skipYoResolve } = this.options;
139
- const ignoreErrors = this.options.ignoreErrors || this.upgradeCommand;
153
+ async commitSharedFs({ log, ...options } = {}, ...transforms) {
154
+ const skipYoResolveTransforms = [];
155
+ if (!this.options.skipYoResolve) {
156
+ skipYoResolveTransforms.push(createYoResolveTransform());
157
+ }
158
+ const prettierTransforms = [];
159
+ if (!this.skipPrettier) {
160
+ const ignoreErrors = this.options.ignoreErrors || this.upgradeCommand;
161
+ prettierTransforms.push(createESLintTransform.call(this, { ignoreErrors, extensions: 'ts,js' }), createRemoveUnusedImportsTransform.call(this, { ignoreErrors }), await createPrettierTransform.call(this, {
162
+ ignoreErrors,
163
+ prettierPackageJson: true,
164
+ prettierJava: !this.jhipsterConfig.skipServer,
165
+ extensions: this.prettierExtensions.join(','),
166
+ prettierOptions: this.prettierOptions,
167
+ }));
168
+ }
169
+ const autoCrlfTransforms = [];
170
+ if (this.jhipsterConfig.autoCrlf) {
171
+ autoCrlfTransforms.push(await autoCrlfTransform({ baseDir: this.destinationPath() }));
172
+ }
140
173
  const transformStreams = [
141
- ...(skipYoResolve ? [] : [createYoResolveTransform()]),
174
+ ...skipYoResolveTransforms,
142
175
  forceYoFiles(),
143
176
  createSortConfigFilesTransform(),
144
177
  createForceWriteConfigFilesTransform(),
145
- ...(this.skipPrettier
146
- ? []
147
- : [
148
- createESLintTransform.call(this, { ignoreErrors, extensions: 'ts,js' }),
149
- createRemoveUnusedImportsTransform.call(this, { ignoreErrors }),
150
- await createPrettierTransform.call(this, {
151
- ignoreErrors,
152
- prettierPackageJson: true,
153
- prettierJava: !this.jhipsterConfig.skipServer,
154
- extensions: PRETTIER_EXTENSIONS,
155
- }),
156
- ]),
157
- ...(this.jhipsterConfig.autoCrlf ? [autoCrlfTransform(this.createGit())] : []),
158
- createConflicterTransform(this.env.adapter, { ...this.env.conflicterOptions, memFs: this.env.sharedFs }),
178
+ ...prettierTransforms,
179
+ ...autoCrlfTransforms,
180
+ createConflicterTransform(this.env.adapter, { ...this.env.conflicterOptions }),
181
+ createCommitTransform(),
159
182
  ];
160
- await this.fs.commit(transformStreams, stream);
183
+ await this.pipeline({
184
+ refresh: false,
185
+ // Let pending files pass through.
186
+ pendingFiles: false,
187
+ ...options,
188
+ // Disable progress since it blocks stdin.
189
+ disabled: true,
190
+ }, ...transforms,
191
+ // Filter out pending files.
192
+ Duplex.from(async function* (files) {
193
+ for await (const file of files) {
194
+ if (isFilePending(file)) {
195
+ yield file;
196
+ }
197
+ }
198
+ }), ...transformStreams);
199
+ this.log.ok(log ?? 'files committed to disk');
161
200
  }
162
201
  }
@@ -18,8 +18,11 @@
18
18
  */
19
19
  import { stat } from 'fs/promises';
20
20
  import { createReadStream } from 'fs';
21
+ import { relative } from 'path';
21
22
  import { transform } from 'p-transform';
22
23
  import { isBinaryFile } from 'isbinaryfile';
24
+ import { simpleGit } from 'simple-git';
25
+ import { isFileStateModified } from 'mem-fs-editor/state';
23
26
  import { normalizeLineEndings } from '../../base/support/index.mjs';
24
27
  /**
25
28
  * Detect the file first line endings
@@ -44,27 +47,37 @@ export function detectCrLf(filePath) {
44
47
  });
45
48
  });
46
49
  }
47
- const autoCrlfTransform = (git) => transform(async (file) => {
48
- if (!file.contents) {
49
- return file;
50
- }
51
- if (await isBinaryFile(file.contents)) {
52
- return file;
53
- }
54
- const fstat = await stat(file.path);
55
- if (!fstat.isFile()) {
56
- return file;
50
+ const autoCrlfTransform = async ({ baseDir }) => {
51
+ const git = simpleGit({ baseDir }).env({
52
+ ...process.env,
53
+ LANG: 'en',
54
+ });
55
+ if (!(await git.checkIsRepo())) {
56
+ throw new Error(`${baseDir} is not inside a git repository`);
57
57
  }
58
- const attributes = Object.fromEntries((await git.raw('check-attr', 'binary', 'eol', '--', file.path))
59
- .split(/\r\n|\r|\n/)
60
- .map(attr => attr.split(':'))
61
- .map(([_file, attr, value]) => [attr, value]));
62
- if (attributes.binary === 'set' || attributes.eol === 'lf') {
58
+ return transform(async (file) => {
59
+ if (!isFileStateModified(file) || !file.path.startsWith(baseDir)) {
60
+ return file;
61
+ }
62
+ try {
63
+ const fstat = await stat(file.path);
64
+ if (fstat.isFile()) {
65
+ if (await isBinaryFile(file.contents)) {
66
+ return file;
67
+ }
68
+ const attrs = Object.fromEntries((await git.raw('check-attr', 'binary', 'eol', '--', relative(baseDir, file.path)))
69
+ .split(/\r\n|\r|\n/)
70
+ .map(attr => attr.split(':'))
71
+ .map(([_file, attr, value]) => [attr, value]));
72
+ if (attrs.eol === 'crlf' || (attrs.binary !== 'set' && attrs.eol !== 'lf' && (await detectCrLf(file.path)))) {
73
+ file.contents = Buffer.from(normalizeLineEndings(file.contents.toString(), '\r\n'));
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ // File doesn't exist.
79
+ }
63
80
  return file;
64
- }
65
- if (attributes.eol === 'crlf' || (await detectCrLf(file.path))) {
66
- file.contents = Buffer.from(normalizeLineEndings(file.contents.toString(), '\r\n'));
67
- }
68
- return file;
69
- });
81
+ });
82
+ };
70
83
  export default autoCrlfTransform;
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
  import { passthrough } from 'p-transform';
20
- import { isFileStateDeleted } from 'mem-fs-editor/state';
20
+ import { isFileStateModified } from 'mem-fs-editor/state';
21
21
  import ESLint from 'eslint';
22
22
  import { Minimatch } from 'minimatch';
23
23
  import { getPackageRoot } from '../../../lib/index.mjs';
@@ -46,12 +46,9 @@ export const createESLintTransform = function (transformOptions = {}) {
46
46
  },
47
47
  });
48
48
  return passthrough(async (file) => {
49
- if (!minimatch.match(file.path) || isFileStateDeleted(file)) {
49
+ if (!minimatch.match(file.path) || !isFileStateModified(file)) {
50
50
  return;
51
51
  }
52
- if (!file.contents) {
53
- throw new Error(`File content doesn't exist for ${file.relative}`);
54
- }
55
52
  try {
56
53
  if (await eslint.isPathIgnored(file.path)) {
57
54
  return;
@@ -1,12 +1,12 @@
1
1
  import { extname } from 'path';
2
2
  import { passthrough } from '@yeoman/transform';
3
- import { isFileStateDeleted } from 'mem-fs-editor/state';
3
+ import { isFileStateModified } from 'mem-fs-editor/state';
4
4
  import { removeUnusedImports } from 'java-lint';
5
5
  // eslint-disable-next-line import/prefer-default-export
6
6
  export const createRemoveUnusedImportsTransform = function (options = {}) {
7
7
  const { ignoreErrors } = options;
8
8
  return passthrough((file) => {
9
- if (extname(file.path) === '.java' && !isFileStateDeleted(file)) {
9
+ if (extname(file.path) === '.java' && isFileStateModified(file)) {
10
10
  if (file.contents) {
11
11
  try {
12
12
  file.contents = Buffer.from(removeUnusedImports(file.contents.toString('utf8')));