generator-jhipster 8.0.0-rc.1 → 8.0.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 (159) hide show
  1. package/README.md +10 -1
  2. package/dist/cli/environment-builder.mjs +3 -3
  3. package/dist/cli/jhipster-command.mjs +7 -3
  4. package/dist/cli/program.mjs +1 -1
  5. package/dist/generators/angular/generator.mjs +8 -7
  6. package/dist/generators/angular/resources/package.json +10 -9
  7. package/dist/generators/angular/templates/package.json.ejs +4 -8
  8. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +6 -10
  9. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/service/_entityFile_.service.ts.ejs +1 -1
  10. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.scss.ejs +1 -1
  11. package/dist/generators/angular/templates/webpack/webpack.microfrontend.js.ejs +48 -126
  12. package/dist/generators/app/support/config.mjs +3 -3
  13. package/dist/generators/base/generator.mjs +0 -3
  14. package/dist/generators/base/support/config.mjs +6 -6
  15. package/dist/generators/base/support/jhipster7-context.mjs +3 -3
  16. package/dist/generators/base-application/generator.mjs +2 -2
  17. package/dist/generators/base-application/support/enum.mjs +1 -1
  18. package/dist/generators/base-application/support/prepare-entity.mjs +14 -10
  19. package/dist/generators/base-application/support/prepare-field.mjs +11 -7
  20. package/dist/generators/base-application/support/prepare-relationship.mjs +12 -14
  21. package/dist/generators/base-workspaces/internal/docker-prompts.mjs +13 -12
  22. package/dist/generators/bootstrap/generator.mjs +64 -43
  23. package/dist/generators/bootstrap/support/auto-crlf-transform.mjs +34 -21
  24. package/dist/generators/bootstrap/support/eslint-transform.mjs +2 -5
  25. package/dist/generators/bootstrap/support/java-unused-imports-transform.mjs +2 -2
  26. package/dist/generators/bootstrap/support/multi-step-transform/index.mjs +17 -28
  27. package/dist/generators/bootstrap/support/multi-step-transform/template-file-fs.mjs +12 -6
  28. package/dist/generators/bootstrap/support/multi-step-transform/template-file.mjs +1 -0
  29. package/dist/generators/bootstrap/support/prettier-support.mjs +2 -2
  30. package/dist/generators/bootstrap-application/generator.mjs +10 -3
  31. package/dist/generators/bootstrap-application-base/generator.mjs +9 -6
  32. package/dist/generators/bootstrap-application-server/generator.mjs +2 -2
  33. package/dist/generators/client/resources/package.json +3 -3
  34. package/dist/generators/client/templates/src/main/webapp/content/css/loading.css.ejs +1 -1
  35. package/dist/generators/client/templates/webpack/webpack.microfrontend.js.jhi.ejs +14 -1
  36. package/dist/generators/common/files.mjs +1 -1
  37. package/dist/generators/common/generator.mjs +29 -7
  38. package/dist/generators/common/resources/package.json +3 -3
  39. package/dist/generators/common/templates/.lintstagedrc.cjs.ejs +21 -0
  40. package/dist/generators/common/templates/.prettierrc.ejs +1 -1
  41. package/dist/generators/common/templates/README.md.jhi.ejs +2 -0
  42. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/account/settings-page.cy.ts.ejs +3 -0
  43. package/dist/generators/entity/prompts.mjs +123 -306
  44. package/dist/generators/generator-constants.mjs +5 -5
  45. package/dist/generators/heroku/generator.mjs +318 -595
  46. package/dist/generators/heroku/templates/Procfile.ejs +1 -1
  47. package/dist/generators/heroku/templates/application-heroku.yml.ejs +0 -12
  48. package/dist/generators/info/generator.mjs +6 -4
  49. package/dist/generators/init/generator.mjs +2 -2
  50. package/dist/generators/java/entity-files.mjs +1 -1
  51. package/dist/generators/java/generator.mjs +12 -13
  52. package/dist/generators/java/support/package-info-transform.mjs +20 -6
  53. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs +24 -28
  54. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs +3 -3
  55. package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs +86 -8
  56. package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_TestSamples.java.ejs +85 -0
  57. package/dist/generators/jdl/generator.mjs +14 -5
  58. package/dist/generators/kubernetes/templates/ingress.yml.ejs +0 -1
  59. package/dist/generators/languages/command.mjs +5 -0
  60. package/dist/generators/languages/generator.mjs +20 -13
  61. package/dist/generators/languages/translation-data.mjs +8 -13
  62. package/dist/generators/liquibase/generator.mjs +7 -3
  63. package/dist/generators/project-name/generator.mjs +1 -1
  64. package/dist/generators/react/generator.mjs +18 -10
  65. package/dist/generators/react/resources/package.json +19 -18
  66. package/dist/generators/react/templates/package.json.ejs +4 -5
  67. package/dist/generators/react/templates/src/main/webapp/app/config/icon-loader.ts.ejs +35 -33
  68. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.tsx.ejs +7 -2
  69. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.reducer.ts.ejs +1 -1
  70. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.tsx.ejs +1 -1
  71. package/dist/generators/react/templates/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
  72. package/dist/generators/react/templates/src/main/webapp/app/routes.tsx.ejs +9 -2
  73. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header-components.tsx.ejs +1 -1
  74. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header.scss.ejs +5 -4
  75. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +10 -1
  76. package/dist/generators/react/templates/tsconfig.test.json.ejs +1 -1
  77. package/dist/generators/react/templates/webpack/webpack.microfrontend.js.jhi.react.ejs +13 -58
  78. package/dist/generators/server/generator.mjs +13 -4
  79. package/dist/generators/server/resources/Dockerfile +7 -7
  80. package/dist/generators/server/resources/gradle/libs.versions.toml +1 -1
  81. package/dist/generators/server/resources/pom.xml +11 -11
  82. package/dist/generators/server/support/config.mjs +4 -4
  83. package/dist/generators/server/support/prepare-entity.mjs +5 -5
  84. package/dist/generators/server/support/prepare-field.mjs +20 -0
  85. package/dist/generators/server/support/relationship.mjs +2 -1
  86. package/dist/generators/server/support/templates/field-values.mjs +5 -2
  87. package/dist/generators/server/templates/README.md.jhi.spring-boot.ejs +0 -1
  88. package/dist/generators/server/templates/package.json.ejs +0 -5
  89. package/dist/generators/server/templates/pom.xml.ejs +1 -8
  90. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/get_all_template.ejs +3 -3
  91. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs +2 -2
  92. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/web/rest/_entityClass_Resource.java.ejs +11 -11
  93. package/dist/generators/server/templates/src/main/java/_package_/config/JacksonConfiguration.java.ejs +2 -1
  94. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_imperative.java.ejs +1 -1
  95. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_reactive.java.ejs +2 -0
  96. package/dist/generators/server/templates/src/main/java/_package_/service/MailService.java.ejs +10 -4
  97. package/dist/generators/server/templates/src/main/java/_package_/web/rest/PublicUserResource.java.ejs +3 -4
  98. package/dist/generators/server/templates/src/main/java/_package_/web/rest/UserResource.java.ejs +0 -2
  99. package/dist/generators/server/templates/src/main/java/_package_/web/rest/errors/ExceptionTranslator.java.ejs +4 -7
  100. package/dist/generators/server/templates/src/test/java/_package_/_entityPackage_/web/rest/_entityClass_ResourceIT.java.ejs +3 -3
  101. package/dist/generators/server/templates/src/test/java/_package_/web/rest/AccountResourceIT.java.ejs +4 -4
  102. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/repository/search/_entityClass_SearchRepository.java.ejs +0 -2
  103. package/dist/generators/spring-data-neo4j/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.spring_data_neo4j.ejs +3 -37
  104. package/dist/generators/vue/generator.mjs +25 -16
  105. package/dist/generators/vue/resources/package.json +17 -16
  106. package/dist/generators/vue/templates/package.json.ejs +3 -5
  107. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +10 -3
  108. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +3 -4
  109. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.service.ts.ejs +1 -1
  110. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.vue.ejs +12 -0
  111. package/dist/generators/vue/templates/src/main/webapp/app/router/index.ts.ejs +8 -1
  112. package/dist/generators/vue/templates/webpack/webpack.microfrontend.js.jhi.vue.ejs +19 -34
  113. package/dist/jdl/converters/jdl-to-json/jdl-to-json-option-converter.js +2 -2
  114. package/dist/jdl/converters/jdl-to-json/jdl-to-json-relationship-converter.js +1 -1
  115. package/dist/jdl/converters/jdl-to-json/jdl-without-application-to-json-converter.js +1 -1
  116. package/dist/jdl/converters/parsed-jdl-to-jdl-object/application-converter.js +1 -17
  117. package/dist/jdl/exporters/applications/jhipster-application-formatter.js +17 -1
  118. package/dist/jdl/exporters/config.js +11 -0
  119. package/dist/jdl/exporters/export-utils.js +2 -13
  120. package/dist/jdl/index.js +1 -0
  121. package/dist/jdl/jdl-importer.js +6 -2
  122. package/dist/jdl/models/jdl-application-configuration-factory.js +34 -2
  123. package/dist/jdl/models/jdl-application-configuration.js +6 -3
  124. package/dist/jdl/models/jdl-application-factory.js +2 -2
  125. package/dist/jdl/models/jdl-application.js +12 -3
  126. package/dist/jdl/parsing/jdl-ast-builder-visitor.js +63 -7
  127. package/dist/jdl/parsing/jdl-parser.js +52 -6
  128. package/dist/jdl/parsing/lexer/application-tokens.js +1 -1
  129. package/dist/jdl/validators/entity-validator.js +4 -2
  130. package/dist/jdl/validators/enum-validator.js +4 -2
  131. package/dist/jdl/validators/jdl-with-application-validator.js +18 -8
  132. package/dist/jdl/validators/jdl-without-application-validator.js +30 -29
  133. package/dist/jdl/validators/validator.js +1 -1
  134. package/dist/types/generators/base/support/config.d.mts +3 -3
  135. package/dist/types/generators/base-application/support/prepare-entity.d.mts +6 -1
  136. package/dist/types/generators/bootstrap/support/auto-crlf-transform.d.mts +3 -2
  137. package/dist/types/generators/bootstrap/support/multi-step-transform/index.d.mts +3 -20
  138. package/dist/types/generators/bootstrap/support/multi-step-transform/template-file-fs.d.mts +15 -9
  139. package/dist/types/generators/bootstrap/support/multi-step-transform/template-file.d.mts +1 -0
  140. package/dist/types/generators/generator-constants.d.mts +3 -3
  141. package/dist/types/generators/java/support/package-info-transform.d.mts +1 -4
  142. package/dist/types/generators/server/support/templates/field-values.d.mts +1 -1
  143. package/dist/types/jdl/exporters/config.d.ts +1 -0
  144. package/dist/types/jdl/index.d.ts +1 -0
  145. package/dist/types/jdl/jdl-importer.d.ts +1 -0
  146. package/dist/types/jdl/models/jdl-application-configuration-factory.d.ts +1 -0
  147. package/dist/types/jdl/models/jdl-application-configuration-option.d.ts +2 -2
  148. package/dist/types/jdl/models/jdl-application-configuration.d.ts +8 -6
  149. package/dist/types/jdl/models/jdl-application-factory.d.ts +1 -1
  150. package/dist/types/jdl/models/jdl-application.d.ts +8 -4
  151. package/dist/types/jdl/models/jdl-object.d.ts +1 -1
  152. package/dist/types/jdl/models/list-jdl-application-configuration-option.d.ts +1 -1
  153. package/dist/types/jdl/parsing/jdl-ast-builder-visitor.d.ts +10 -0
  154. package/dist/types/jdl/parsing/jdl-parser.d.ts +3 -0
  155. package/dist/types/jdl/parsing/lexer/application-tokens.d.ts +1 -0
  156. package/dist/types/jdl/validators/entity-validator.d.ts +2 -2
  157. package/dist/types/jdl/validators/enum-validator.d.ts +2 -2
  158. package/dist/types/jdl/validators/validator.d.ts +4 -1
  159. package/package.json +31 -31
@@ -53,6 +53,7 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
53
53
  composedBlueprints;
54
54
  languageCommand;
55
55
  writeJavaLanguageFiles;
56
+ regenerateLanguages;
56
57
  constructor(args, options, features) {
57
58
  super(args, options, features);
58
59
  this.languageCommand = this.options.commandName === 'languages';
@@ -177,7 +178,7 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
177
178
  return this.asPreparingTaskGroup({
178
179
  prepareForTemplates({ application, source }) {
179
180
  if (application.enableTranslation) {
180
- if (!this.languageCommand) {
181
+ if (!this.languageCommand || this.regenerateLanguages) {
181
182
  this.languagesToApply = application.languages;
182
183
  }
183
184
  else {
@@ -204,17 +205,21 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
204
205
  get default() {
205
206
  return this.asDefaultTaskGroup({
206
207
  async loadNativeLanguage({ application, control }) {
208
+ if (application.skipClient)
209
+ return;
207
210
  control.translations = control.translations ?? {};
208
211
  this.translationData = new TranslationData({ generator: this, translations: control.translations });
209
212
  const { clientSrcDir, enableTranslation, nativeLanguage } = application;
210
213
  const fallbackLanguage = 'en';
211
214
  this.queueLoadLanguages({ clientSrcDir, enableTranslation, nativeLanguage, fallbackLanguage });
212
215
  const filter = createTranslationsFilter({ clientSrcDir, nativeLanguage, fallbackLanguage });
213
- this.env.sharedFs.on('change', filePath => {
216
+ const listener = filePath => {
214
217
  if (filter(filePath)) {
218
+ this.env.sharedFs.removeListener('change', listener);
215
219
  this.queueLoadLanguages({ clientSrcDir, enableTranslation, nativeLanguage, fallbackLanguage });
216
220
  }
217
- });
221
+ };
222
+ this.env.sharedFs.on('change', listener);
218
223
  control.getWebappTranslation = (...args) => this.translationData.getClientTranslation(...args);
219
224
  },
220
225
  insight() {
@@ -305,7 +310,7 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
305
310
  if (application.enableTranslation &&
306
311
  application.generateUserManagement &&
307
312
  !application.skipServer &&
308
- (application.backendTypeSpringBoot || this.writeJavaLanguageFiles)) {
313
+ application.backendTypeSpringBoot) {
309
314
  updateLanguagesInJava.call(this, { application, control });
310
315
  }
311
316
  },
@@ -317,6 +322,8 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
317
322
  get postWritingEntities() {
318
323
  return this.asPostWritingEntitiesTaskGroup({
319
324
  addEntities({ application, entities, source }) {
325
+ if (application.skipClient)
326
+ return;
320
327
  const languagesToApply = application.enableTranslation ? this.languagesToApply : [...new Set([application.nativeLanguage, 'en'])];
321
328
  for (const entity of entities.filter(entity => !entity.skipClient && !entity.builtIn)) {
322
329
  for (const language of languagesToApply) {
@@ -346,16 +353,16 @@ export default class LanguagesGenerator extends BaseApplicationGenerator {
346
353
  this.queueTask({
347
354
  method: async () => {
348
355
  const filter = createTranslationsFileFilter({ clientSrcDir, nativeLanguage, fallbackLanguage });
349
- await this.env.applyTransforms([this.translationData.loadFromStreamTransform({ clientSrcDir, nativeLanguage, fallbackLanguage })], {
356
+ await this.pipeline({
350
357
  name: 'loading translations',
351
- streamOptions: { filter },
352
- });
353
- if (!enableTranslation) {
354
- await this.env.applyTransforms([this.translationData.clearTranslationsStatusTransform({ clientSrcDir, nativeLanguage, fallbackLanguage })], {
355
- name: 'clearing translations',
356
- streamOptions: { filter },
357
- });
358
- }
358
+ filter: file => file.path.startsWith(this.destinationPath()) && filter(file),
359
+ refresh: true,
360
+ }, this.translationData.loadFromStreamTransform({
361
+ enableTranslation,
362
+ clientSrcDir,
363
+ nativeLanguage,
364
+ fallbackLanguage,
365
+ }));
359
366
  },
360
367
  taskName: 'loadingTranslations',
361
368
  queueName: QUEUES.LOADING_TRANSLATIONS_QUEUE,
@@ -18,9 +18,8 @@
18
18
  */
19
19
  import { inspect } from 'node:util';
20
20
  import * as _ from 'lodash-es';
21
- import { passthrough } from '@yeoman/transform';
21
+ import { transform } from '@yeoman/transform';
22
22
  import { Minimatch } from 'minimatch';
23
- import { clearFileState } from 'mem-fs-editor/state';
24
23
  const { get } = _;
25
24
  export const createTranslationsFilter = ({ clientSrcDir, nativeLanguage, fallbackLanguage }) => {
26
25
  const pattern = !fallbackLanguage || nativeLanguage === fallbackLanguage
@@ -42,22 +41,18 @@ export default class TranslationData {
42
41
  this.generator = generator;
43
42
  this.translations = translations;
44
43
  }
45
- loadFromStreamTransform({ clientSrcDir, nativeLanguage, fallbackLanguage = 'en' }) {
44
+ loadFromStreamTransform({ enableTranslation, clientSrcDir, nativeLanguage, fallbackLanguage = 'en' }) {
46
45
  const filter = createTranslationsFileFilter({ clientSrcDir, nativeLanguage, fallbackLanguage });
47
46
  const minimatchNative = new Minimatch(`**/${clientSrcDir}i18n/${nativeLanguage}/*.json`);
48
- return passthrough(file => {
49
- if (filter(file)) {
47
+ return transform(file => {
48
+ if (filter(file) && file.contents) {
50
49
  const contents = JSON.parse(file.contents.toString());
51
50
  this.mergeTranslation(contents, !minimatchNative.match(file.path));
51
+ if (!enableTranslation) {
52
+ return undefined;
53
+ }
52
54
  }
53
- });
54
- }
55
- clearTranslationsStatusTransform({ clientSrcDir, nativeLanguage, fallbackLanguage = 'en' }) {
56
- const filter = createTranslationsFileFilter({ clientSrcDir, nativeLanguage, fallbackLanguage });
57
- return passthrough(file => {
58
- if (filter(file)) {
59
- clearFileState(file);
60
- }
55
+ return file;
61
56
  });
62
57
  }
63
58
  mergeTranslation(translation, fallback) {
@@ -35,6 +35,8 @@ export default class LiquibaseGenerator extends BaseEntityChangesGenerator {
35
35
  recreateInitialChangelog;
36
36
  numberOfRows;
37
37
  databaseChangelogs = [];
38
+ injectBuildTool = true;
39
+ injectLogs = true;
38
40
  constructor(args, options, features) {
39
41
  super(args, options, { skipParseOptions: false, ...features });
40
42
  this.argument('entities', {
@@ -137,7 +139,7 @@ export default class LiquibaseGenerator extends BaseEntityChangesGenerator {
137
139
  prepareEntity(entity, this, application);
138
140
  prepareEntityForServer(entity);
139
141
  if (!entity.embedded && !entity.primaryKey) {
140
- prepareEntityPrimaryKeyForTemplates(entity, this);
142
+ prepareEntityPrimaryKeyForTemplates.call(this, { entity, application });
141
143
  }
142
144
  for (const field of entity.fields ?? []) {
143
145
  prepareField(entity, field, this);
@@ -222,13 +224,15 @@ export default class LiquibaseGenerator extends BaseEntityChangesGenerator {
222
224
  get postWriting() {
223
225
  return this.asPostWritingTaskGroup({
224
226
  customizeSpring({ source }) {
227
+ if (!this.injectLogs)
228
+ return;
225
229
  source.addLogbackMainLog?.({ name: 'liquibase', level: 'WARN' });
226
230
  source.addLogbackMainLog?.({ name: 'LiquibaseSchemaResolver', level: 'INFO' });
227
231
  source.addLogbackTestLog?.({ name: 'liquibase', level: 'WARN' });
228
232
  source.addLogbackTestLog?.({ name: 'LiquibaseSchemaResolver', level: 'INFO' });
229
233
  },
230
234
  customizeMaven({ source, application }) {
231
- if (!application.buildToolMaven)
235
+ if (!application.buildToolMaven || !this.injectBuildTool)
232
236
  return;
233
237
  if (!application.javaDependencies) {
234
238
  throw new Error('Some application fields are be mandatory');
@@ -331,7 +335,7 @@ export default class LiquibaseGenerator extends BaseEntityChangesGenerator {
331
335
  }
332
336
  },
333
337
  injectGradle({ source, application }) {
334
- if (!application.buildToolGradle)
338
+ if (!application.buildToolGradle || !this.injectBuildTool)
335
339
  return;
336
340
  if (!application.javaDependencies) {
337
341
  throw new Error('Some application fields are be mandatory');
@@ -114,7 +114,7 @@ export default class ProjectNameGenerator extends BaseApplicationGenerator {
114
114
  * @returns Boolean
115
115
  */
116
116
  validateBaseName(input) {
117
- if (!/^([\w-]*)$/.test(input)) {
117
+ if (!/^([\w]*)$/.test(input)) {
118
118
  return 'Your base name cannot contain special characters or a blank space';
119
119
  }
120
120
  if (/_/.test(input)) {
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
  import * as _ from 'lodash-es';
20
- import { isFilePending } from 'mem-fs-editor/state';
20
+ import { isFileStateModified } from 'mem-fs-editor/state';
21
21
  import chalk from 'chalk';
22
22
  import BaseApplicationGenerator from '../base-application/index.mjs';
23
23
  import { GENERATOR_CLIENT, GENERATOR_LANGUAGES, GENERATOR_REACT } from '../generator-list.mjs';
@@ -54,7 +54,7 @@ export default class ReactGenerator extends BaseApplicationGenerator {
54
54
  });
55
55
  }
56
56
  get [BaseApplicationGenerator.LOADING]() {
57
- return this.asLoadingTaskGroup(this.delegateTasksToBlueprint(() => this.loading));
57
+ return this.delegateTasksToBlueprint(() => this.loading);
58
58
  }
59
59
  get preparing() {
60
60
  return this.asPreparingTaskGroup({
@@ -84,18 +84,26 @@ export default class ReactGenerator extends BaseApplicationGenerator {
84
84
  get [BaseApplicationGenerator.PREPARING_EACH_ENTITY]() {
85
85
  return this.asPreparingEachEntityTaskGroup(this.delegateTasksToBlueprint(() => this.preparingEachEntity));
86
86
  }
87
- get writing() {
88
- return {
89
- cleanupOldFilesTask,
90
- writeFiles,
87
+ get default() {
88
+ return this.asDefaultTaskGroup({
91
89
  queueTranslateTransform({ control, application }) {
92
90
  if (!application.enableTranslation) {
93
- this.queueTransformStream(translateReactFilesTransform(control.getWebappTranslation), {
94
- name: 'translating webapp',
95
- streamOptions: { filter: file => isFilePending(file) && isTranslatedReactFile(file) },
96
- });
91
+ this.queueTransformStream({
92
+ name: 'translating react application',
93
+ filter: file => isFileStateModified(file) && file.path.startsWith(this.destinationPath()) && isTranslatedReactFile(file),
94
+ refresh: false,
95
+ }, translateReactFilesTransform(control.getWebappTranslation));
97
96
  }
98
97
  },
98
+ });
99
+ }
100
+ get [BaseApplicationGenerator.DEFAULT]() {
101
+ return this.delegateTasksToBlueprint(() => this.default);
102
+ }
103
+ get writing() {
104
+ return {
105
+ cleanupOldFilesTask,
106
+ writeFiles,
99
107
  };
100
108
  }
101
109
  get [BaseApplicationGenerator.WRITING]() {
@@ -4,7 +4,7 @@
4
4
  "@fortawesome/free-solid-svg-icons": "6.4.2",
5
5
  "@fortawesome/react-fontawesome": "0.2.0",
6
6
  "@reduxjs/toolkit": "1.9.7",
7
- "axios": "1.5.1",
7
+ "axios": "1.6.0",
8
8
  "bootstrap": "5.3.2",
9
9
  "bootswatch": "5.3.2",
10
10
  "lodash": "4.17.21",
@@ -16,7 +16,7 @@
16
16
  "react-loadable": "5.5.0",
17
17
  "react-redux": "8.1.3",
18
18
  "react-redux-loading-bar": "5.0.4",
19
- "react-router-dom": "6.16.0",
19
+ "react-router-dom": "6.18.0",
20
20
  "react-toastify": "9.1.3",
21
21
  "react-transition-group": "4.4.5",
22
22
  "reactstrap": "9.2.0",
@@ -27,31 +27,32 @@
27
27
  "uuid": "9.0.1"
28
28
  },
29
29
  "devDependencies": {
30
+ "@module-federation/utilities": "3.0.3-0",
30
31
  "@testing-library/react": "14.0.0",
31
- "@types/jest": "29.5.5",
32
- "@types/lodash": "4.14.199",
33
- "@types/node": "18.18.5",
34
- "@types/react": "18.2.28",
35
- "@types/react-dom": "18.2.13",
36
- "@types/react-redux": "7.1.27",
32
+ "@types/jest": "29.5.7",
33
+ "@types/lodash": "4.14.200",
34
+ "@types/node": "18.18.8",
35
+ "@types/react": "18.2.34",
36
+ "@types/react-dom": "18.2.14",
37
+ "@types/react-redux": "7.1.28",
37
38
  "@types/redux": "3.6.31",
38
- "@types/webpack-env": "1.18.2",
39
- "@typescript-eslint/eslint-plugin": "6.7.5",
40
- "@typescript-eslint/parser": "6.7.5",
39
+ "@types/webpack-env": "1.18.3",
40
+ "@typescript-eslint/eslint-plugin": "6.9.1",
41
+ "@typescript-eslint/parser": "6.9.1",
41
42
  "autoprefixer": "10.4.16",
42
43
  "browser-sync": "2.29.3",
43
44
  "browser-sync-webpack-plugin": "2.3.0",
44
45
  "copy-webpack-plugin": "11.0.0",
45
- "core-js": "3.33.0",
46
+ "core-js": "3.33.2",
46
47
  "cross-env": "7.0.3",
47
48
  "css-loader": "6.8.1",
48
49
  "css-minimizer-webpack-plugin": "5.0.1",
49
- "eslint": "8.51.0",
50
+ "eslint": "8.52.0",
50
51
  "eslint-config-prettier": "9.0.0",
51
52
  "eslint-plugin-react": "7.33.2",
52
53
  "eslint-webpack-plugin": "4.0.1",
53
54
  "folder-hash": "4.0.4",
54
- "fork-ts-checker-webpack-plugin": "9.0.0",
55
+ "fork-ts-checker-webpack-plugin": "9.0.2",
55
56
  "html-webpack-plugin": "5.5.3",
56
57
  "identity-obj-proxy": "3.0.0",
57
58
  "jest": "29.7.0",
@@ -66,10 +67,10 @@
66
67
  "react-infinite-scroll-component": "6.1.0",
67
68
  "redux-mock-store": "1.5.4",
68
69
  "rimraf": "5.0.5",
69
- "sass": "1.69.3",
70
+ "sass": "1.69.5",
70
71
  "sass-loader": "13.3.2",
71
72
  "simple-progress-webpack-plugin": "2.0.0",
72
- "sinon": "16.1.0",
73
+ "sinon": "17.0.1",
73
74
  "source-map-loader": "4.0.1",
74
75
  "sourcemap-istanbul-instrumenter-loader": "0.2.0",
75
76
  "style-loader": "3.3.3",
@@ -78,10 +79,10 @@
78
79
  "ts-jest": "29.1.1",
79
80
  "ts-loader": "9.5.0",
80
81
  "typescript": "5.2.2",
81
- "webpack": "5.88.2",
82
+ "webpack": "5.89.0",
82
83
  "webpack-cli": "5.1.4",
83
84
  "webpack-dev-server": "4.15.1",
84
- "webpack-merge": "5.9.0",
85
+ "webpack-merge": "5.10.0",
85
86
  "webpack-notifier": "1.15.0",
86
87
  "workbox-webpack-plugin": "7.0.0"
87
88
  }
@@ -45,6 +45,7 @@
45
45
  "react-loadable": "<%= nodeDependencies['react-loadable'] %>",
46
46
  "react-redux": "<%= nodeDependencies['react-redux'] %>",
47
47
  "react-redux-loading-bar": "<%= nodeDependencies['react-redux-loading-bar'] %>",
48
+ "react-router": "<%= nodeDependencies['react-router-dom'] %>",
48
49
  "react-router-dom": "<%= nodeDependencies['react-router-dom'] %>",
49
50
  "react-toastify": "<%= nodeDependencies['react-toastify'] %>",
50
51
  "react-transition-group": "<%= nodeDependencies['react-transition-group'] %>",
@@ -64,6 +65,9 @@
64
65
  <%_ } _%>
65
66
  },
66
67
  "devDependencies": {
68
+ <%_ if (applicationTypeGateway && microfrontend) { _%>
69
+ "@module-federation/utilities": "<%= nodeDependencies['@module-federation/utilities'] %>",
70
+ <%_ } _%>
67
71
  "@testing-library/react": "<%= nodeDependencies['@testing-library/react'] %>",
68
72
  "@types/jest": "<%= nodeDependencies['@types/jest'] %>",
69
73
  "@types/lodash": "<%= nodeDependencies['@types/lodash'] %>",
@@ -104,11 +108,6 @@
104
108
  <%_ if (enableI18nRTL) { _%>
105
109
  "postcss-rtlcss": "<%= nodeDependencies['postcss-rtlcss'] %>",
106
110
  <%_ } _%>
107
- "prettier": "<%= nodeDependencies['prettier'] %>",
108
- <%_ if (!skipServer) { _%>
109
- "prettier-plugin-java": "<%= nodeDependencies['prettier-plugin-java'] %>",
110
- <%_ } _%>
111
- "prettier-plugin-packagejson": "<%= nodeDependencies['prettier-plugin-packagejson'] %>",
112
111
  "react-infinite-scroll-component": "<%= nodeDependencies['react-infinite-scroll-component'] %>",
113
112
  "redux-mock-store": "<%= nodeDependencies['redux-mock-store'] %>",
114
113
  "rimraf": "<%= nodeDependencies['rimraf'] %>",
@@ -16,39 +16,41 @@
16
16
  See the License for the specific language governing permissions and
17
17
  limitations under the License.
18
18
  -%>
19
- import { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';
20
- import { faBan } from '@fortawesome/free-solid-svg-icons/faBan';
21
- import { faAsterisk } from '@fortawesome/free-solid-svg-icons/faAsterisk';
22
- import { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';
23
- import { faBell } from '@fortawesome/free-solid-svg-icons/faBell';
24
- import { faBook } from '@fortawesome/free-solid-svg-icons/faBook';
25
- import { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';
26
- import { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';
27
- import { faEye } from '@fortawesome/free-solid-svg-icons/faEye';
28
- import { faFlag } from '@fortawesome/free-solid-svg-icons/faFlag';
29
- import { faHeart } from '@fortawesome/free-solid-svg-icons/faHeart';
30
- import { faHome } from '@fortawesome/free-solid-svg-icons/faHome';
31
- import { faList } from '@fortawesome/free-solid-svg-icons/faList';
32
- import { faLock } from '@fortawesome/free-solid-svg-icons/faLock';
33
- import { faPencilAlt } from '@fortawesome/free-solid-svg-icons/faPencilAlt';
34
- import { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';
35
- import { faSave } from '@fortawesome/free-solid-svg-icons/faSave';
36
- import { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';
37
- import { faSort } from '@fortawesome/free-solid-svg-icons/faSort';
38
- import { faSync } from '@fortawesome/free-solid-svg-icons/faSync';
39
- import { faRoad } from '@fortawesome/free-solid-svg-icons/faRoad';
40
- import { faSignInAlt } from '@fortawesome/free-solid-svg-icons/faSignInAlt';
41
- import { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';
42
- import { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';
43
- import { faTasks } from '@fortawesome/free-solid-svg-icons/faTasks';
44
- import { faThList } from '@fortawesome/free-solid-svg-icons/faThList';
45
- import { faTimesCircle } from '@fortawesome/free-solid-svg-icons/faTimesCircle';
46
- import { faTrash } from '@fortawesome/free-solid-svg-icons/faTrash';
47
- import { faUser } from '@fortawesome/free-solid-svg-icons/faUser';
48
- import { faUserPlus } from '@fortawesome/free-solid-svg-icons/faUserPlus';
49
- import { faUsers } from '@fortawesome/free-solid-svg-icons/faUsers';
50
- import { faUsersCog } from '@fortawesome/free-solid-svg-icons/faUsersCog';
51
- import { faWrench } from '@fortawesome/free-solid-svg-icons/faWrench';
19
+ import {
20
+ faCogs,
21
+ faBan,
22
+ faAsterisk,
23
+ faArrowLeft,
24
+ faBell,
25
+ faBook,
26
+ faCloud,
27
+ faDatabase,
28
+ faEye,
29
+ faFlag,
30
+ faHeart,
31
+ faHome,
32
+ faList,
33
+ faLock,
34
+ faPencilAlt,
35
+ faPlus,
36
+ faSave,
37
+ faSearch,
38
+ faSort,
39
+ faSync,
40
+ faRoad,
41
+ faSignInAlt,
42
+ faSignOutAlt,
43
+ faTachometerAlt,
44
+ faTasks,
45
+ faThList,
46
+ faTimesCircle,
47
+ faTrash,
48
+ faUser,
49
+ faUserPlus,
50
+ faUsers,
51
+ faUsersCog,
52
+ faWrench,
53
+ } from '@fortawesome/free-solid-svg-icons';
52
54
 
53
55
  import { library } from '@fortawesome/fontawesome-svg-core';
54
56
 
@@ -148,13 +148,18 @@ export const <%= entityReactName %>Update = () => {
148
148
  }
149
149
  }, [updateSuccess]);
150
150
 
151
+ // eslint-disable-next-line complexity
151
152
  const saveEntity = values => {
152
- <%_ for (field of fields.filter(field => !field.id)) {
153
+ <%_ for (field of fields) {
153
154
  const fieldName = field.fieldName;
154
155
  _%>
155
156
  <%_ if (field.fieldTypeTimed) { _%>
156
157
  values.<%= fieldName %> = convertDateTimeToServer(values.<%= fieldName %>);
157
- <%_ } _%>
158
+ <%_ } else if (field.fieldTypeNumeric) { _%>
159
+ if (values.<%= fieldName %> !== undefined && typeof values.<%= fieldName %> !== 'number') {
160
+ values.<%= fieldName %> = Number(values.<%= fieldName %>);
161
+ }
162
+ <%_ } _%>
158
163
  <%_ } _%>
159
164
 
160
165
  const entity = {
@@ -48,7 +48,7 @@ const initialState: EntityState<I<%= entityReactName %>> = {
48
48
 
49
49
  const apiUrl = '<%= entityApi %>api/<%= entityApiUrl %>';
50
50
  <%_ if (searchEngineAny) { _%>
51
- const apiSearchUrl = '<%= entityApi %>api/_search/<%= entityApiUrl %>';
51
+ const apiSearchUrl = '<%= entityApi %>api/<%= entityApiUrl %>/_search';
52
52
  <%_ } _%>
53
53
 
54
54
  // Actions
@@ -491,7 +491,7 @@ _%>
491
491
  <Button tag={Link} to={`/<%= entityPage %>/${<%= entityInstance %>.<%= primaryKey.name %>}/edit<%_ if (paginationPagination) { _%>?page=${paginationState.activePage}&sort=${paginationState.sort},${paginationState.order}<%_ } _%>`} color="primary" size="sm" data-cy="entityEditButton">
492
492
  <FontAwesomeIcon icon="pencil-alt" /> <span className="d-none d-md-inline"><Translate contentKey="entity.action.edit">Edit</Translate></span>
493
493
  </Button>
494
- <Button tag={Link} to={`/<%= entityPage %>/${<%= entityInstance %>.<%= primaryKey.name %>}/delete<%_ if (paginationPagination) { _%>?page=${paginationState.activePage}&sort=${paginationState.sort},${paginationState.order}<%_ } _%>`} color="danger" size="sm" data-cy="entityDeleteButton">
494
+ <Button onClick={() => location.href=`/<%= entityPage %>/${<%= entityInstance %>.<%= primaryKey.name %>}/delete<%_ if (paginationPagination) { _%>?page=${paginationState.activePage}&sort=${paginationState.sort},${paginationState.order}<%_ } _%>`} color="danger" size="sm" data-cy="entityDeleteButton">
495
495
  <FontAwesomeIcon icon="trash" /> <span className="d-none d-md-inline"><Translate contentKey="entity.action.delete">Delete</Translate></span>
496
496
  </Button>
497
497
  <%_ } _%>
@@ -50,7 +50,7 @@ export const Home = () => {
50
50
  <span className="hipster rounded" />
51
51
  </Col>
52
52
  <Col md="9">
53
- <h2><Translate contentKey="home.title">Welcome, <%= backendType %> Hipster!</Translate></h2>
53
+ <h1 className="display-4"><Translate contentKey="home.title">Welcome, <%= backendType %> Hipster!</Translate></h1>
54
54
  <p className="lead"><Translate contentKey="home.subtitle">This is your homepage</Translate></p>
55
55
  {
56
56
  (account?.login) ? (
@@ -19,6 +19,9 @@
19
19
  import React<% if (applicationTypeGateway && microfrontend) { %>, { Suspense }<% } %> from 'react';
20
20
  import { Route <% if (communicationSpringWebsocket) { %>, useLocation <% } %>} from 'react-router-dom';
21
21
  import Loadable from 'react-loadable';
22
+ <%_ if (applicationTypeGateway && microfrontend) { _%>
23
+ import { importRemote } from '@module-federation/utilities';
24
+ <%_ } _%>
22
25
 
23
26
  <%_ if (!authenticationTypeOauth2) { _%>
24
27
  import Login from 'app/modules/login/login';
@@ -59,10 +62,14 @@ const Admin = Loadable({
59
62
  <%_ if (applicationTypeGateway && microfrontend) { _%>
60
63
 
61
64
  <%_ for (const remote of microfrontends) { _%>
62
- const <%= remote.capitalizedBaseName %>Routes = React.lazy(() => import('@<%= remote.lowercaseBaseName %>/entities-routes').catch(() => import('app/shared/error/error-loading')));
65
+ const <%= remote.capitalizedBaseName %>Routes = React.lazy(() => importRemote<any>({
66
+ url: `./services/<%= remote.lowercaseBaseName %>`,
67
+ scope: '<%= remote.lowercaseBaseName %>',
68
+ module: './entities-routes',
69
+ }).catch(() => import('app/shared/error/error-loading')));
70
+
63
71
  <%_ } _%>
64
72
  <%_ } _%>
65
-
66
73
  const AppRoutes = () => {
67
74
  <%_ if (communicationSpringWebsocket) { _%>
68
75
  const pageLocation = useLocation();
@@ -36,7 +36,7 @@ export const Brand = () => (
36
36
  <NavbarBrand tag={Link} to="/" className="brand-logo">
37
37
  <BrandIcon />
38
38
  <span className="brand-title"><Translate contentKey="global.title"><%= capitalizedBaseName %></Translate></span>
39
- <span className="navbar-version">{VERSION}</span>
39
+ <span className="navbar-version">{VERSION.toLowerCase().startsWith('v') ? VERSION : `v${VERSION}`}</span>
40
40
  </NavbarBrand>
41
41
  );
42
42
 
@@ -33,7 +33,7 @@ Developement Ribbon
33
33
  transform: rotate(-45deg);
34
34
  overflow: hidden;
35
35
  position: absolute;
36
- top: 30px;
36
+ top: 40px;
37
37
  white-space: nowrap;
38
38
  width: 15em;
39
39
  z-index: 99999;
@@ -105,7 +105,7 @@ Navbar styles
105
105
  }
106
106
 
107
107
  .navbar-version {
108
- font-size: 10px;
108
+ font-size: 0.65em;
109
109
  color: $header-color-secondary;
110
110
  padding: 0 0 0 10px;
111
111
  }
@@ -119,13 +119,14 @@ Navbar styles
119
119
  width: auto;
120
120
  display: inline-block;
121
121
  img {
122
- height: 45px;
122
+ width: 45px;
123
123
  }
124
124
  }
125
125
  }
126
126
 
127
127
  .brand-title {
128
- font-size: 24px;
128
+ font-size: 1.25rem;
129
+ margin-left: .25rem;
129
130
  color: $header-color;
130
131
  &:hover {
131
132
  color: $header-color-hover;
@@ -19,12 +19,21 @@
19
19
  import React<% if (microfrontend) { %>, { Suspense }<% } %> from 'react';
20
20
  import { translate } from 'react-jhipster';
21
21
  import { NavDropdown } from './menu-components';
22
+ <%_ if (applicationTypeGateway && microfrontend) { _%>
23
+ import { importRemote } from '@module-federation/utilities';
24
+ <%_ } _%>
22
25
  <%_ if (microfrontend) { _%>
23
26
 
24
27
  const EntitiesMenuItems = React.lazy(() => import('app/entities/menu').catch(() => import('app/shared/error/error-loading')));
28
+
25
29
  <%_ if (applicationTypeGateway) { _%>
26
30
  <%_ for (const remote of microfrontends) { _%>
27
- const <%= remote.capitalizedBaseName %>EntitiesMenuItems = React.lazy(() => import('@<%= remote.lowercaseBaseName %>/entities-menu').catch(() => import('app/shared/error/error-loading')));
31
+ const <%= remote.capitalizedBaseName %>EntitiesMenuItems = React.lazy(async () => importRemote<any>({
32
+ url: `./services/<%= remote.lowercaseBaseName %>`,
33
+ scope: '<%= remote.lowercaseBaseName %>',
34
+ module: './entities-menu',
35
+ }).catch(() => import('app/shared/error/error-loading')));
36
+
28
37
  <%_ } _%>
29
38
  <%_ } _%>
30
39
  <%_ } else { _%>
@@ -18,7 +18,7 @@
18
18
  -%>
19
19
  {
20
20
  "extends": "./tsconfig",
21
- "include": ["<%= this.relativeDir(clientRootDir, clientSrcDir) %>app", "<%= this.relativeDir(clientRootDir, clientSrcDir) %>microfrontend"],
21
+ "include": ["<%= this.relativeDir(clientRootDir, clientSrcDir) %>app", "<%= this.relativeDir(clientRootDir, clientSrcDir) %>microfrontends"],
22
22
  "exclude": [],
23
23
  "compilerOptions": {
24
24
  "paths": {