generator-jhipster 7.3.1 → 7.4.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 (154) hide show
  1. package/cli/jhipster-command.js +2 -2
  2. package/cli/program.js +31 -29
  3. package/generators/app/index.js +30 -25
  4. package/generators/aws/index.js +8 -8
  5. package/generators/aws/lib/eb.js +1 -1
  6. package/generators/azure-app-service/index.js +13 -9
  7. package/generators/azure-spring-cloud/index.js +13 -9
  8. package/generators/bootstrap/index.js +49 -59
  9. package/generators/ci-cd/index.js +10 -8
  10. package/generators/client/files-common.js +6 -2
  11. package/generators/client/files-react.js +10 -1
  12. package/generators/client/files-vue.js +40 -1
  13. package/generators/client/index.js +42 -31
  14. package/generators/client/needle-api/needle-client-vue.js +1 -1
  15. package/generators/client/templates/angular/.eslintrc.json.ejs +1 -0
  16. package/generators/client/templates/angular/package.json +14 -14
  17. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +2 -2
  18. package/generators/client/templates/common/package.json +3 -3
  19. package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +56 -0
  20. package/generators/client/templates/react/.eslintrc.json.ejs +1 -0
  21. package/generators/client/templates/react/package.json +44 -43
  22. package/generators/client/templates/react/package.json.ejs +3 -0
  23. package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +0 -3
  24. package/generators/client/templates/react/src/main/webapp/app/modules/administration/configuration/configuration.tsx.ejs +2 -2
  25. package/generators/client/templates/react/src/main/webapp/app/modules/administration/gateway/gateway.tsx.ejs +2 -2
  26. package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +6 -6
  27. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +8 -8
  28. package/generators/client/templates/react/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
  29. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.tsx.ejs +1 -1
  30. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.tsx.ejs +3 -3
  31. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +7 -7
  32. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-components.tsx.ejs +1 -1
  33. package/generators/client/templates/react/webpack/webpack.dev.js.ejs +17 -1
  34. package/generators/client/templates/react/webpack/webpack.prod.js.ejs +13 -1
  35. package/generators/client/templates/vue/.eslintrc.js.ejs +8 -5
  36. package/generators/client/templates/vue/package.json +31 -38
  37. package/generators/client/templates/vue/package.json.ejs +8 -10
  38. package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +1 -2
  39. package/generators/client/templates/vue/src/main/webapp/app/account/settings/settings.vue.ejs +7 -1
  40. package/generators/client/templates/vue/src/main/webapp/app/admin/configuration/configuration.vue.ejs +1 -1
  41. package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.component.ts.ejs +1 -1
  42. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +12 -1
  43. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +6 -0
  44. package/generators/client/templates/vue/src/main/webapp/app/declarations.d.ts.ejs +41 -0
  45. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.component.ts.ejs +34 -0
  46. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.vue.ejs +13 -0
  47. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.component.ts.ejs +12 -0
  48. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.vue.ejs +5 -0
  49. package/generators/client/templates/vue/src/main/webapp/app/index.ts.ejs +19 -0
  50. package/generators/client/templates/vue/src/main/webapp/app/locale/translation.service.ts.ejs +25 -8
  51. package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +9 -4
  52. package/generators/client/templates/vue/src/main/webapp/app/router/entities.ts.ejs +44 -1
  53. package/generators/client/templates/vue/src/main/webapp/app/router/index.ts.ejs +11 -0
  54. package/generators/client/templates/vue/src/main/webapp/app/shims-vue.d.ts.ejs +0 -10
  55. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +19 -8
  56. package/generators/client/templates/vue/src/test/javascript/spec/app/entities/entities-menu.spec.ts.ejs +52 -0
  57. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.component.ts.ejs +4 -0
  58. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.vue.ejs +7 -0
  59. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-router.ts.ejs +1 -0
  60. package/generators/client/templates/vue/tsconfig.json.ejs +5 -9
  61. package/generators/client/templates/vue/tsconfig.spec.json.ejs +37 -0
  62. package/generators/client/templates/vue/webpack/config.js.ejs +2 -0
  63. package/generators/client/templates/vue/webpack/vue.utils.js.ejs +13 -12
  64. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +64 -50
  65. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +17 -68
  66. package/generators/client/templates/vue/webpack/webpack.microfrontend.js.jhi.vue.ejs +77 -0
  67. package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +1 -30
  68. package/generators/cloudfoundry/index.js +9 -9
  69. package/generators/common/index.js +12 -10
  70. package/generators/common/templates/package.json +4 -4
  71. package/generators/cypress/index.js +12 -9
  72. package/generators/cypress/templates/cypress.json.ejs +3 -0
  73. package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +3 -3
  74. package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +2 -2
  75. package/generators/database-changelog/index.js +33 -22
  76. package/generators/database-changelog-liquibase/index.js +12 -8
  77. package/generators/docker-compose/index.js +11 -12
  78. package/generators/entities/index.js +35 -26
  79. package/generators/entities-client/index.js +10 -7
  80. package/generators/entity/index.js +25 -28
  81. package/generators/entity-client/files.js +6 -11
  82. package/generators/entity-client/index.js +9 -7
  83. package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +4 -4
  84. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +1 -1
  85. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +7 -7
  86. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -1
  87. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.service.ts.ejs +2 -6
  88. package/generators/entity-i18n/index.js +7 -4
  89. package/generators/entity-server/index.js +11 -8
  90. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +39 -41
  91. package/generators/gae/index.js +10 -10
  92. package/generators/generator-base-blueprint.js +7 -44
  93. package/generators/generator-base.js +7 -0
  94. package/generators/generator-constants.js +20 -18
  95. package/generators/generator-transforms.js +27 -23
  96. package/generators/heroku/index.js +12 -10
  97. package/generators/init/constants.cjs +1 -1
  98. package/generators/kubernetes/files.js +3 -0
  99. package/generators/kubernetes/index.js +10 -10
  100. package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -1
  101. package/generators/kubernetes/templates/deployment.yml.ejs +8 -3
  102. package/generators/kubernetes/templates/istio/destination-rule.yml.ejs +1 -1
  103. package/generators/kubernetes/templates/istio/gateway/grafana-gateway.yml.ejs +5 -2
  104. package/generators/kubernetes/templates/istio/gateway/jhipster-grafana-gateway.yml.ejs +5 -2
  105. package/generators/kubernetes/templates/istio/gateway/kiali-gateway.yml.ejs +10 -8
  106. package/generators/kubernetes/templates/istio/gateway/zipkin-gateway.yml.ejs +5 -2
  107. package/generators/kubernetes/templates/istio/gateway.yml.ejs +7 -5
  108. package/generators/kubernetes/templates/secret/couchbase-secret.yml.ejs +9 -0
  109. package/generators/kubernetes-base.js +1 -0
  110. package/generators/kubernetes-helm/files.js +3 -8
  111. package/generators/kubernetes-helm/index.js +10 -10
  112. package/generators/kubernetes-helm/templates/README-KUBERNETES-HELM.md.ejs +0 -1
  113. package/generators/kubernetes-helm/templates/app/Chart.yml.ejs +5 -0
  114. package/generators/kubernetes-helm/templates/app/helpers.tpl.ejs +0 -11
  115. package/generators/kubernetes-helm/templates/app/requirements.yml.ejs +5 -0
  116. package/generators/kubernetes-helm/templates/app/values.yml.ejs +68 -5
  117. package/generators/kubernetes-helm/templates/csvc/Chart.yml.ejs +1 -1
  118. package/generators/kubernetes-helm/templates/csvc/requirements.yml.ejs +1 -1
  119. package/generators/kubernetes-knative/index.js +10 -10
  120. package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +6 -4
  121. package/generators/kubernetes-knative/templates/service.yml.ejs +1 -1
  122. package/generators/languages/index.js +13 -13
  123. package/generators/openapi-client/index.js +13 -10
  124. package/generators/openshift/index.js +10 -11
  125. package/generators/openshift/templates/deployment.yml.ejs +1 -1
  126. package/generators/page/index.js +12 -10
  127. package/generators/server/__snapshots__/generator.spec.mjs.snap +12 -0
  128. package/generators/server/files.js +12 -0
  129. package/generators/server/index.js +32 -18
  130. package/generators/server/templates/gradle.properties.ejs +10 -10
  131. package/generators/server/templates/pom.xml.ejs +6 -6
  132. package/generators/server/templates/src/main/docker/app.yml.ejs +1 -1
  133. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +2 -2
  134. package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +0 -1
  135. package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs +68 -0
  136. package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +29 -4
  137. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +21 -9
  138. package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +13 -5
  139. package/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +1 -1
  140. package/generators/server/templates/src/test/java/package/management/SecurityMetersServiceTests.java.ejs +113 -0
  141. package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +6 -1
  142. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderSecurityMetersTests.java.ejs +198 -0
  143. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderTest.java.ejs +13 -3
  144. package/generators/server/templates/src/test/java/package/security/oauth2/AuthorizationHeaderUtilTest.java.ejs +16 -2
  145. package/generators/server/templates/src/test/java/package/security/oauth2/CustomClaimConverterIT.java.ejs +63 -0
  146. package/generators/spring-controller/index.js +9 -7
  147. package/generators/spring-service/index.js +10 -7
  148. package/generators/upgrade/index.js +3 -4
  149. package/generators/utils.js +2 -2
  150. package/generators/workspaces/index.js +16 -7
  151. package/jdl/jhipster/default-application-options.js +9 -7
  152. package/package.json +15 -15
  153. package/utils/entity.js +14 -0
  154. package/utils/multi-step-transform/index.js +8 -8
@@ -190,7 +190,7 @@ objects:
190
190
  <%_ if (app.databaseTypeCouchbase) { _%>
191
191
  - name: SPRING_COUCHBASE_CONNECTION_STRING
192
192
  value: ${APPLICATION_NAME}-couchbase
193
- - name: JHIPSTER_COUCHBASE_BUCKET_NAME
193
+ - name: JHIPSTER_DATABASE_COUCHBASE_BUCKET_NAME
194
194
  value: ${APPLICATION_NAME}
195
195
  <%_ } _%>
196
196
  <%_ if (app.searchEngineElasticsearch) { _%>
@@ -27,8 +27,6 @@ const { PROTRACTOR } = require('../../jdl/jhipster/test-framework-types');
27
27
 
28
28
  const { VUE } = constants.SUPPORTED_CLIENT_FRAMEWORKS;
29
29
 
30
- let useBlueprints;
31
-
32
30
  module.exports = class extends BaseBlueprintGenerator {
33
31
  constructor(args, options, features) {
34
32
  super(args, options, features);
@@ -61,8 +59,12 @@ module.exports = class extends BaseBlueprintGenerator {
61
59
  this.loadRuntimeOptions();
62
60
 
63
61
  this.rootGenerator = this.env.rootGenerator() === this;
62
+ }
64
63
 
65
- useBlueprints = !this.fromBlueprint && this.instantiateBlueprints(GENERATOR_PAGE);
64
+ async _postConstruct() {
65
+ if (!this.fromBlueprint) {
66
+ await this.composeWithBlueprints(GENERATOR_PAGE);
67
+ }
66
68
  }
67
69
 
68
70
  _initializing() {
@@ -81,7 +83,7 @@ module.exports = class extends BaseBlueprintGenerator {
81
83
  }
82
84
 
83
85
  get initializing() {
84
- if (useBlueprints) return;
86
+ if (this.delegateToBlueprint) return {};
85
87
  return this._initializing();
86
88
  }
87
89
 
@@ -92,7 +94,7 @@ module.exports = class extends BaseBlueprintGenerator {
92
94
  }
93
95
 
94
96
  get prompting() {
95
- if (useBlueprints) return;
97
+ if (this.delegateToBlueprint) return {};
96
98
  return this._prompting();
97
99
  }
98
100
 
@@ -110,7 +112,7 @@ module.exports = class extends BaseBlueprintGenerator {
110
112
  }
111
113
 
112
114
  get configuring() {
113
- if (useBlueprints) return;
115
+ if (this.delegateToBlueprint) return {};
114
116
  return this._configuring();
115
117
  }
116
118
 
@@ -130,7 +132,7 @@ module.exports = class extends BaseBlueprintGenerator {
130
132
  }
131
133
 
132
134
  get default() {
133
- if (useBlueprints) return;
135
+ if (this.delegateToBlueprint) return {};
134
136
  return this._default();
135
137
  }
136
138
 
@@ -147,7 +149,7 @@ module.exports = class extends BaseBlueprintGenerator {
147
149
  }
148
150
 
149
151
  get writing() {
150
- if (useBlueprints) return;
152
+ if (this.delegateToBlueprint) return {};
151
153
  return this._writing();
152
154
  }
153
155
 
@@ -165,7 +167,7 @@ module.exports = class extends BaseBlueprintGenerator {
165
167
  }
166
168
 
167
169
  get postWriting() {
168
- if (useBlueprints) return;
170
+ if (this.delegateToBlueprint) return {};
169
171
  return this._postWriting();
170
172
  }
171
173
 
@@ -183,7 +185,7 @@ module.exports = class extends BaseBlueprintGenerator {
183
185
  }
184
186
 
185
187
  get end() {
186
- if (useBlueprints) return;
188
+ if (this.delegateToBlueprint) return {};
187
189
  return this._end();
188
190
  }
189
191
  };
@@ -378,6 +378,10 @@ Object {
378
378
  "file": "package/security/jwt/JWTFilter.java",
379
379
  "renameTo": [Function],
380
380
  },
381
+ Object {
382
+ "file": "package/management/SecurityMetersService.java",
383
+ "renameTo": [Function],
384
+ },
381
385
  ],
382
386
  },
383
387
  Object {
@@ -1130,10 +1134,18 @@ Object {
1130
1134
  "condition": [Function],
1131
1135
  "path": "src/test/java/",
1132
1136
  "templates": Array [
1137
+ Object {
1138
+ "file": "package/management/SecurityMetersServiceTests.java",
1139
+ "renameTo": [Function],
1140
+ },
1133
1141
  Object {
1134
1142
  "file": "package/security/jwt/TokenProviderTest.java",
1135
1143
  "renameTo": [Function],
1136
1144
  },
1145
+ Object {
1146
+ "file": "package/security/jwt/TokenProviderSecurityMetersTests.java",
1147
+ "renameTo": [Function],
1148
+ },
1137
1149
  Object {
1138
1150
  "file": "package/security/jwt/JWTFilterTest.java",
1139
1151
  "renameTo": [Function],
@@ -452,6 +452,10 @@ const baseServerFiles = {
452
452
  file: 'package/security/jwt/JWTFilter.java',
453
453
  renameTo: generator => `${generator.javaDir}security/jwt/JWTFilter.java`,
454
454
  },
455
+ {
456
+ file: 'package/management/SecurityMetersService.java',
457
+ renameTo: generator => `${generator.javaDir}management/SecurityMetersService.java`,
458
+ },
455
459
  ],
456
460
  },
457
461
  {
@@ -1598,10 +1602,18 @@ const baseServerFiles = {
1598
1602
  condition: generator => generator.authenticationType === JWT,
1599
1603
  path: SERVER_TEST_SRC_DIR,
1600
1604
  templates: [
1605
+ {
1606
+ file: 'package/management/SecurityMetersServiceTests.java',
1607
+ renameTo: generator => `${generator.testDir}management/SecurityMetersServiceTests.java`,
1608
+ },
1601
1609
  {
1602
1610
  file: 'package/security/jwt/TokenProviderTest.java',
1603
1611
  renameTo: generator => `${generator.testDir}security/jwt/TokenProviderTest.java`,
1604
1612
  },
1613
+ {
1614
+ file: 'package/security/jwt/TokenProviderSecurityMetersTests.java',
1615
+ renameTo: generator => `${generator.testDir}security/jwt/TokenProviderSecurityMetersTests.java`,
1616
+ },
1605
1617
  {
1606
1618
  file: 'package/security/jwt/JWTFilterTest.java',
1607
1619
  renameTo: generator => `${generator.testDir}security/jwt/JWTFilterTest.java`,
@@ -54,8 +54,6 @@ const NO_CACHE = cacheTypes.NO;
54
54
  const NO_DATABASE = databaseTypes.NO;
55
55
  const NO_WEBSOCKET = websocketTypes.FALSE;
56
56
 
57
- let useBlueprints;
58
-
59
57
  module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
60
58
  constructor(args, options, features) {
61
59
  super(args, options, { unique: 'namespace', ...features });
@@ -75,11 +73,15 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
75
73
 
76
74
  // preserve old jhipsterVersion value for cleanup which occurs after new config is written into disk
77
75
  this.jhipsterOldVersion = this.jhipsterConfig.jhipsterVersion;
76
+ }
78
77
 
79
- useBlueprints = !this.fromBlueprint && this.instantiateBlueprints(GENERATOR_SERVER);
78
+ async _postConstruct() {
79
+ if (!this.fromBlueprint) {
80
+ await this.composeWithBlueprints(GENERATOR_SERVER);
81
+ }
80
82
 
81
83
  // Not using normal blueprints or this is a normal blueprint.
82
- if (!useBlueprints || (this.fromBlueprint && this.sbsBlueprint)) {
84
+ if ((!this.fromBlueprint && !this.delegateToBlueprint) || (this.fromBlueprint && this.sbsBlueprint)) {
83
85
  this.setFeatures({
84
86
  customInstallTask: async function customInstallTask(preferredPm, defaultInstallTask) {
85
87
  const buildTool = this.jhipsterConfig.buildTool;
@@ -231,7 +233,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
231
233
  }
232
234
 
233
235
  get initializing() {
234
- if (useBlueprints) return;
236
+ if (this.delegateToBlueprint) return {};
235
237
  return this._initializing();
236
238
  }
237
239
 
@@ -251,7 +253,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
251
253
  }
252
254
 
253
255
  get prompting() {
254
- if (useBlueprints) return;
256
+ if (this.delegateToBlueprint) return {};
255
257
  return this._prompting();
256
258
  }
257
259
 
@@ -270,27 +272,27 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
270
272
  }
271
273
 
272
274
  get configuring() {
273
- if (useBlueprints) return;
275
+ if (this.delegateToBlueprint) return {};
274
276
  return this._configuring();
275
277
  }
276
278
 
277
279
  // Public API method used by the getter and also by Blueprints
278
280
  _composing() {
279
281
  return {
280
- composeCommon() {
281
- this.composeWithJHipster(GENERATOR_COMMON, true);
282
+ async composeCommon() {
283
+ await this.composeWithJHipster(GENERATOR_COMMON, true);
282
284
  },
283
285
 
284
- composeLanguages() {
286
+ async composeLanguages() {
285
287
  // We don't expose client/server to cli, composing with languages is used for test purposes.
286
288
  if (this.jhipsterConfig.enableTranslation === false) return;
287
- this.composeWithJHipster(GENERATOR_LANGUAGES, true);
289
+ await this.composeWithJHipster(GENERATOR_LANGUAGES, true);
288
290
  },
289
291
  };
290
292
  }
291
293
 
292
294
  get composing() {
293
- if (useBlueprints) return;
295
+ if (this.delegateToBlueprint) return {};
294
296
  return this._composing();
295
297
  }
296
298
 
@@ -310,7 +312,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
310
312
  }
311
313
 
312
314
  get loading() {
313
- if (useBlueprints) return;
315
+ if (this.delegateToBlueprint) return {};
314
316
  return this._loading();
315
317
  }
316
318
 
@@ -357,7 +359,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
357
359
  }
358
360
 
359
361
  get preparing() {
360
- if (useBlueprints) return;
362
+ if (this.delegateToBlueprint) return {};
361
363
  return this._preparing();
362
364
  }
363
365
 
@@ -415,7 +417,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
415
417
  }
416
418
 
417
419
  get default() {
418
- if (useBlueprints) return;
420
+ if (this.delegateToBlueprint) return {};
419
421
  return this._default();
420
422
  }
421
423
 
@@ -428,7 +430,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
428
430
  }
429
431
 
430
432
  get writing() {
431
- if (useBlueprints) return;
433
+ if (this.delegateToBlueprint) return {};
432
434
  return this._writing();
433
435
  }
434
436
 
@@ -595,12 +597,24 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
595
597
  'concurrently -k -s first "npm run backend:start" "npm start" "wait-on http-get://localhost:9000 && npm run e2e:headless -- -c baseUrl=http://localhost:9000"',
596
598
  });
597
599
  }
600
+ // Vue eagerly loads remotes, wait for it.
601
+ if (this.microfrontend && this.applicationTypeGateway && this.clientFrameworkVue) {
602
+ const remotesScript = this.remotes
603
+ .map(
604
+ app =>
605
+ `echo "Waiting for microfrontend ${app.baseName} to start" && wait-on http-get://localhost:$npm_package_config_backend_port/${app.endpointPrefix}/remoteEntry.js && echo "Microfrontend ${app.baseName} started"`
606
+ )
607
+ .join(' && ');
608
+ scriptsStorage.set({
609
+ 'ci:server:await': `${scriptsStorage.get('ci:server:await')} && ${remotesScript}`,
610
+ });
611
+ }
598
612
  },
599
613
  };
600
614
  }
601
615
 
602
616
  get postWriting() {
603
- if (useBlueprints) return;
617
+ if (this.delegateToBlueprint) return {};
604
618
  return this._postWriting();
605
619
  }
606
620
 
@@ -632,7 +646,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
632
646
  }
633
647
 
634
648
  get end() {
635
- if (useBlueprints) return;
649
+ if (this.delegateToBlueprint) return {};
636
650
  return this._end();
637
651
  }
638
652
 
@@ -28,12 +28,12 @@ springBootVersion=<%= SPRING_BOOT_VERSION %>
28
28
  # https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/<%= SPRING_BOOT_VERSION %> -->
29
29
  hibernateVersion=<%= HIBERNATE_VERSION %>
30
30
  mapstructVersion=1.4.2.Final
31
- archunitJunit5Version=0.21.0
31
+ archunitJunit5Version=0.22.0
32
32
  <%_ if (enableSwaggerCodegen) { _%>
33
33
  jacksonDatabindNullableVersion=<%= JACKSON_DATABIND_NULLABLE_VERSION %>
34
34
  <%_ } _%>
35
35
  <%_ if (cacheProviderCaffeine) { _%>
36
- caffeineVersion=3.0.3
36
+ caffeineVersion=3.0.4
37
37
  typesafeConfigVersion=1.4.1
38
38
  <%_ } _%>
39
39
  <%_ if (databaseTypeSql && !reactive) { _%>
@@ -47,7 +47,7 @@ commonsBeanutilsVersion=1.9.4
47
47
 
48
48
  <%_ if (reactive) { _%>
49
49
  blockhoundJunitPlatformVersion=1.0.6.RELEASE
50
- junitPlatformLauncherVersion=1.7.2
50
+ junitPlatformLauncherVersion=1.8.1
51
51
  <%_ } _%>
52
52
 
53
53
  <%_ if (databaseTypeSql) { _%>
@@ -63,21 +63,21 @@ cassandraDriverVersion=4.11.3
63
63
  jibPluginVersion=<%= JIB_VERSION %>
64
64
  gitPropertiesPluginVersion=2.3.1
65
65
  <%_ if (!skipClient) { _%>
66
- gradleNodePluginVersion=3.1.0
66
+ gradleNodePluginVersion=3.1.1
67
67
  <%_ } _%>
68
68
  <%_ if (databaseTypeSql && !reactive) { _%>
69
- liquibasePluginVersion=2.0.4
69
+ liquibasePluginVersion=2.1.0
70
70
  <%_ } _%>
71
71
  sonarqubePluginVersion=3.3
72
72
  <%_ if (enableSwaggerCodegen) { _%>
73
73
  openapiPluginVersion=5.2.1
74
74
  <%_ } _%>
75
- noHttpCheckstyleVersion=0.0.9
76
- checkstyleVersion=9.0
77
- modernizerPluginVersion=1.6.0
75
+ noHttpCheckstyleVersion=0.0.10
76
+ checkstyleVersion=9.1
77
+ modernizerPluginVersion=1.6.1
78
78
  <%_ if (enableGradleEnterprise) { _%>
79
- gradleEnterprisePluginVersion=3.6.4
80
- gradleCommonCustomUserDataPluginVersion=1.4.2
79
+ gradleEnterprisePluginVersion=3.7.1
80
+ gradleCommonCustomUserDataPluginVersion=1.5
81
81
  <%_ } _%>
82
82
  # jhipster-needle-gradle-property - JHipster will add additional properties here
83
83
 
@@ -126,13 +126,13 @@
126
126
  https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} -->
127
127
  <cassandra-driver.version>4.11.3</cassandra-driver.version>
128
128
  <%_ } _%>
129
- <archunit-junit5.version>0.21.0</archunit-junit5.version>
129
+ <archunit-junit5.version>0.22.0</archunit-junit5.version>
130
130
  <mapstruct.version>1.4.2.Final</mapstruct.version>
131
131
  <%_ if (enableSwaggerCodegen) { _%>
132
132
  <jackson-databind-nullable.version><%= JACKSON_DATABIND_NULLABLE_VERSION %></jackson-databind-nullable.version>
133
133
  <%_ } _%>
134
134
  <%_ if (cacheProviderCaffeine) { _%>
135
- <caffeine.version>3.0.3</caffeine.version>
135
+ <caffeine.version>3.0.4</caffeine.version>
136
136
  <typesafe.version>1.4.1</typesafe.version>
137
137
  <%_ } _%>
138
138
  <%_ if (databaseTypeNeo4j) { _%>
@@ -151,10 +151,10 @@
151
151
  <maven-idea-plugin.version>2.2.1</maven-idea-plugin.version>
152
152
  <maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
153
153
  <maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
154
- <maven-war-plugin.version>3.3.1</maven-war-plugin.version>
154
+ <maven-war-plugin.version>3.3.2</maven-war-plugin.version>
155
155
  <maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
156
- <checkstyle.version>9.0</checkstyle.version>
157
- <nohttp-checkstyle.version>0.0.9</nohttp-checkstyle.version>
156
+ <checkstyle.version>9.1</checkstyle.version>
157
+ <nohttp-checkstyle.version>0.0.10</nohttp-checkstyle.version>
158
158
  <%_ if (!skipClient) { _%>
159
159
  <frontend-maven-plugin.version>1.12.0</frontend-maven-plugin.version>
160
160
  <checksum-maven-plugin.version>1.11</checksum-maven-plugin.version>
@@ -171,7 +171,7 @@
171
171
  <openapi-generator-maven-plugin.version>5.2.1</openapi-generator-maven-plugin.version>
172
172
  <%_ } _%>
173
173
  <properties-maven-plugin.version>1.0.0</properties-maven-plugin.version>
174
- <sonar-maven-plugin.version>3.9.0.2155</sonar-maven-plugin.version>
174
+ <sonar-maven-plugin.version>3.9.1.2184</sonar-maven-plugin.version>
175
175
  <!-- jhipster-needle-maven-property -->
176
176
  </properties>
177
177
 
@@ -52,7 +52,7 @@ _%>
52
52
  <%_ } _%>
53
53
  <%_ if (databaseTypeCouchbase) { _%>
54
54
  - SPRING_COUCHBASE_CONNECTION_STRING=<%= baseName.toLowerCase() %>-couchbase
55
- - JHIPSTER_COUCHBASE_BUCKET_NAME=<%= baseName %>
55
+ - JHIPSTER_DATABASE_COUCHBASE_BUCKET_NAME=<%= baseName %>
56
56
  <%_ } _%>
57
57
  <%_ if (cacheProviderMemcached) { _%>
58
58
  - JHIPSTER_CACHE_MEMCACHED_SERVERS=<%= baseName.toLowerCase() %>-memcached:11211
@@ -278,8 +278,8 @@ public class SecurityConfiguration {
278
278
  .pathMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN)
279
279
  .pathMatchers("/api/**").authenticated()
280
280
  <%_ if (applicationTypeGateway) { _%>
281
- <%_ if (microfrontend && authenticationTypeJwt) { _%>
282
- // microfrontend resources are loaded by webpack without a bearer-token, they need to be public
281
+ <%_ if (microfrontend && (authenticationTypeJwt || clientFrameworkVue)) { _%>
282
+ // microfrontend resources are loaded by webpack without authentication, they need to be public
283
283
  .pathMatchers("/services/*/*.js").permitAll()
284
284
  .pathMatchers("/services/*/*.js.map").permitAll()
285
285
  <%_ } _%>
@@ -79,7 +79,6 @@ import javax.servlet.*;
79
79
  import java.io.File;
80
80
  import java.nio.charset.StandardCharsets;
81
81
  import java.nio.file.Paths;
82
- import java.util.*;
83
82
 
84
83
  import static java.net.URLDecoder.decode;
85
84
  <%_ } _%>
@@ -0,0 +1,68 @@
1
+ <%#
2
+ Copyright 2013-2021 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ package <%= packageName %>.management;
20
+
21
+ import org.springframework.stereotype.Service;
22
+
23
+ import io.micrometer.core.instrument.Counter;
24
+ import io.micrometer.core.instrument.MeterRegistry;
25
+
26
+ @Service
27
+ public class SecurityMetersService {
28
+
29
+ public static final String INVALID_TOKENS_METER_NAME = "security.authentication.invalid-tokens";
30
+ public static final String INVALID_TOKENS_METER_DESCRIPTION = "Indicates validation error count of the tokens presented by the clients.";
31
+ public static final String INVALID_TOKENS_METER_BASE_UNIT = "errors";
32
+ public static final String INVALID_TOKENS_METER_CAUSE_DIMENSION = "cause";
33
+
34
+ private final Counter tokenInvalidSignatureCounter;
35
+ private final Counter tokenExpiredCounter;
36
+ private final Counter tokenUnsupportedCounter;
37
+ private final Counter tokenMalformedCounter;
38
+
39
+ public SecurityMetersService(MeterRegistry registry) {
40
+ this.tokenInvalidSignatureCounter = invalidTokensCounterForCauseBuilder("invalid-signature").register(registry);
41
+ this.tokenExpiredCounter = invalidTokensCounterForCauseBuilder("expired").register(registry);
42
+ this.tokenUnsupportedCounter = invalidTokensCounterForCauseBuilder("unsupported").register(registry);
43
+ this.tokenMalformedCounter = invalidTokensCounterForCauseBuilder("malformed").register(registry);
44
+ }
45
+
46
+ private Counter.Builder invalidTokensCounterForCauseBuilder(String cause) {
47
+ return Counter.builder(INVALID_TOKENS_METER_NAME)
48
+ .baseUnit(INVALID_TOKENS_METER_BASE_UNIT)
49
+ .description(INVALID_TOKENS_METER_DESCRIPTION)
50
+ .tag(INVALID_TOKENS_METER_CAUSE_DIMENSION, cause);
51
+ }
52
+
53
+ public void trackTokenInvalidSignature() {
54
+ this.tokenInvalidSignatureCounter.increment();
55
+ }
56
+
57
+ public void trackTokenExpired() {
58
+ this.tokenExpiredCounter.increment();
59
+ }
60
+
61
+ public void trackTokenUnsupported() {
62
+ this.tokenUnsupportedCounter.increment();
63
+ }
64
+
65
+ public void trackTokenMalformed() {
66
+ this.tokenMalformedCounter.increment();
67
+ }
68
+ }
@@ -34,13 +34,17 @@ import org.springframework.stereotype.Component;
34
34
  import org.springframework.util.ObjectUtils;
35
35
 
36
36
  import tech.jhipster.config.JHipsterProperties;
37
+
37
38
  import io.jsonwebtoken.*;
38
39
  import io.jsonwebtoken.io.Decoders;
40
+ import io.jsonwebtoken.security.SignatureException;
39
41
  <%_ if (reactive) { _%>
40
42
  import io.jsonwebtoken.jackson.io.JacksonSerializer;
41
43
  <%_ } _%>
42
44
  import io.jsonwebtoken.security.Keys;
43
45
 
46
+ import <%= packageName %>.management.SecurityMetersService;
47
+
44
48
  @Component
45
49
  public class TokenProvider {
46
50
 
@@ -56,7 +60,9 @@ public class TokenProvider {
56
60
 
57
61
  private final long tokenValidityInMillisecondsForRememberMe;
58
62
 
59
- public TokenProvider(JHipsterProperties jHipsterProperties) {
63
+ private final SecurityMetersService securityMetersService;
64
+
65
+ public TokenProvider(JHipsterProperties jHipsterProperties, SecurityMetersService securityMetersService) {
60
66
  byte[] keyBytes;
61
67
  String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret();
62
68
  if (!ObjectUtils.isEmpty(secret)) {
@@ -75,6 +81,8 @@ public class TokenProvider {
75
81
  this.tokenValidityInMillisecondsForRememberMe =
76
82
  1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
77
83
  .getTokenValidityInSecondsForRememberMe();
84
+
85
+ this.securityMetersService = securityMetersService;
78
86
  }
79
87
 
80
88
  public String createToken(Authentication authentication, boolean rememberMe) {
@@ -118,11 +126,28 @@ public class TokenProvider {
118
126
  public boolean validateToken(String authToken) {
119
127
  try {
120
128
  jwtParser.parseClaimsJws(authToken);
129
+
121
130
  return true;
122
- } catch (JwtException | IllegalArgumentException e) {
123
- log.info("Invalid JWT token.");
124
- log.trace("Invalid JWT token trace.", e);
131
+ } catch (ExpiredJwtException e) {
132
+ this.securityMetersService.trackTokenExpired();
133
+
134
+ log.trace("Invalid JWT token.", e);
135
+ } catch (UnsupportedJwtException e) {
136
+ this.securityMetersService.trackTokenUnsupported();
137
+
138
+ log.trace("Invalid JWT token.", e);
139
+ } catch (MalformedJwtException e) {
140
+ this.securityMetersService.trackTokenMalformed();
141
+
142
+ log.trace("Invalid JWT token.", e);
143
+ } catch (SignatureException e) {
144
+ this.securityMetersService.trackTokenInvalidSignature();
145
+
146
+ log.trace("Invalid JWT token.", e);
147
+ } catch (IllegalArgumentException e) { // TODO: should we let it bubble (no catch), to avoid defensive programming and follow the fail-fast principle?
148
+ log.error("Token validation error {}", e.getMessage());
125
149
  }
150
+
126
151
  return false;
127
152
  }
128
153
  }
@@ -34,6 +34,7 @@ import org.springframework.web.client.RestTemplate;
34
34
  import org.springframework.web.context.request.RequestContextHolder;
35
35
  import org.springframework.web.context.request.ServletRequestAttributes;
36
36
 
37
+ import java.util.Arrays;
37
38
  import java.util.Collections;
38
39
  import java.util.HashMap;
39
40
  import java.util.List;
@@ -62,7 +63,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
62
63
 
63
64
  public Map<String, Object> convert(Map<String, Object> claims) {
64
65
  Map<String, Object> convertedClaims = this.delegate.convert(claims);
65
- if (RequestContextHolder.getRequestAttributes() != null) {
66
+ if (RequestContextHolder.getRequestAttributes() != null && ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) != null) {
66
67
  // Retrieve and set the token
67
68
  String token = bearerTokenResolver.resolve(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
68
69
  HttpHeaders headers = new HttpHeaders();
@@ -83,20 +84,31 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
83
84
  if (user.has("family_name")) {
84
85
  convertedClaims.put("family_name", user.get("family_name").asText());
85
86
  }
87
+ if (user.has("email")) {
88
+ convertedClaims.put("email", user.get("email").asText());
89
+ }
90
+ // Allow full name in a name claim - happens with Auth0
91
+ if (user.has("name")) {
92
+ String[] name = user.get("name").asText().split("\\s+");
93
+ if (name.length > 0) {
94
+ convertedClaims.put("given_name", name[0]);
95
+ convertedClaims.put("family_name",
96
+ String.join(" ", Arrays.copyOfRange(name, 1, name.length)));
97
+ }
98
+ }
86
99
  if (user.has("groups")) {
87
100
  List<String> groups = StreamSupport.stream(user.get("groups").spliterator(), false)
88
101
  .map(JsonNode::asText)
89
102
  .collect(Collectors.toList());
90
103
  convertedClaims.put("groups", groups);
91
104
  }
92
- }
93
-
94
- if (user.has(SecurityUtils.CLAIMS_NAMESPACE + "roles")) {
95
- List<String> roles = StreamSupport
96
- .stream(user.get(SecurityUtils.CLAIMS_NAMESPACE + "roles").spliterator(), false)
97
- .map(JsonNode::asText)
98
- .collect(Collectors.toList());
99
- convertedClaims.put("roles", roles);
105
+ if (user.has(SecurityUtils.CLAIMS_NAMESPACE + "roles")) {
106
+ List<String> roles = StreamSupport
107
+ .stream(user.get(SecurityUtils.CLAIMS_NAMESPACE + "roles").spliterator(), false)
108
+ .map(JsonNode::asText)
109
+ .collect(Collectors.toList());
110
+ convertedClaims.put("roles", roles);
111
+ }
100
112
  }
101
113
  }
102
114
  return convertedClaims;
@@ -1017,15 +1017,20 @@ public class UserService {
1017
1017
  private static <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> getUser(Map<String, Object> details) {
1018
1018
  <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> user = new <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %>();
1019
1019
  Boolean activated = Boolean.TRUE;
1020
+ String sub = String.valueOf(details.get("sub"));
1021
+ String username = null;
1022
+ if (details.get("preferred_username") != null) {
1023
+ username = ((String) details.get("preferred_username")).toLowerCase();
1024
+ }
1020
1025
  // handle resource server JWT, where sub claim is email and uid is ID
1021
1026
  if (details.get("uid") != null) {
1022
1027
  user.setId((String) details.get("uid"));
1023
- user.setLogin((String) details.get("sub"));
1028
+ user.setLogin(sub);
1024
1029
  } else {
1025
- user.setId((String) details.get("sub"));
1030
+ user.setId(sub);
1026
1031
  }
1027
- if (details.get("preferred_username") != null) {
1028
- user.setLogin(((String) details.get("preferred_username")).toLowerCase());
1032
+ if (username != null) {
1033
+ user.setLogin(username);
1029
1034
  } else if (user.getLogin() == null) {
1030
1035
  user.setLogin(user.getId());
1031
1036
  }
@@ -1042,8 +1047,11 @@ public class UserService {
1042
1047
  }
1043
1048
  if (details.get("email") != null) {
1044
1049
  user.setEmail(((String) details.get("email")).toLowerCase());
1050
+ } else if (sub.contains("|") && (username != null && username.contains("@"))) {
1051
+ // special handling for Auth0
1052
+ user.setEmail(username);
1045
1053
  } else {
1046
- user.setEmail((String) details.get("sub"));
1054
+ user.setEmail(sub);
1047
1055
  }
1048
1056
  if (details.get("langKey") != null) {
1049
1057
  user.setLangKey((String) details.get("langKey"));