generator-jhipster 8.10.0 → 8.11.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 (130) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/cli.mjs +0 -13
  3. package/dist/cli/environment-builder.mjs +3 -1
  4. package/dist/generators/angular/resources/package.json +18 -18
  5. package/dist/generators/angular/templates/README.md.jhi.client.angular.ejs +1 -1
  6. package/dist/generators/angular/templates/eslint.config.js.jhi.angular.ejs +4 -6
  7. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +1 -1
  8. package/dist/generators/angular/templates/src/main/webapp/app/core/tracker/tracker.service.ts.ejs +1 -1
  9. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +1 -1
  10. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.html.ejs +1 -1
  11. package/dist/generators/angular/templates/src/main/webapp/app/shared/sort/sort.service.ts.ejs +3 -3
  12. package/dist/generators/base/api.d.ts +3 -1
  13. package/dist/generators/base/shared-data.js +1 -0
  14. package/dist/generators/base/support/contents.d.ts +10 -1
  15. package/dist/generators/base/support/contents.js +9 -0
  16. package/dist/generators/base/support/index.d.ts +1 -0
  17. package/dist/generators/base/support/index.js +1 -0
  18. package/dist/generators/base/support/needles.js +2 -6
  19. package/dist/generators/base/support/os.d.ts +1 -0
  20. package/dist/generators/base/support/os.js +20 -0
  21. package/dist/generators/base/support/write-files.d.ts +18 -0
  22. package/dist/generators/base/support/write-files.js +0 -26
  23. package/dist/generators/base-core/generator.js +7 -4
  24. package/dist/generators/bootstrap/generator.js +31 -2
  25. package/dist/generators/bootstrap/support/auto-crlf-transform.js +2 -2
  26. package/dist/generators/bootstrap-application-base/generator.js +1 -3
  27. package/dist/generators/client/resources/package.json +4 -4
  28. package/dist/generators/common/resources/package.json +1 -1
  29. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/account/logout.cy.ts.ejs +11 -3
  30. package/dist/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +4 -4
  31. package/dist/generators/generate-blueprint/resources/package.json +2 -2
  32. package/dist/generators/generator-constants.d.ts +1 -1
  33. package/dist/generators/generator-constants.js +1 -1
  34. package/dist/generators/gradle/templates/gradle/wrapper/gradle-wrapper.properties +1 -1
  35. package/dist/generators/init/resources/.node-version +1 -1
  36. package/dist/generators/java/generators/graalvm/internal/constants.d.ts +1 -1
  37. package/dist/generators/java/generators/graalvm/internal/constants.js +1 -1
  38. package/dist/generators/java/generators/node/generator.js +2 -1
  39. package/dist/generators/javascript/generators/eslint/templates/eslint.config.js.jhi.ejs +8 -0
  40. package/dist/generators/javascript/resources/package.json +3 -3
  41. package/dist/generators/languages/support/languages.js +1 -0
  42. package/dist/generators/languages/templates/entity/i18n/entity_he.json.ejs +78 -0
  43. package/dist/generators/languages/templates/src/main/resources/i18n/messages_he.properties.ejs +41 -0
  44. package/dist/generators/languages/templates/src/main/webapp/i18n/he/activate.json.ejs +27 -0
  45. package/dist/generators/languages/templates/src/main/webapp/i18n/he/configuration.json +11 -0
  46. package/dist/generators/languages/templates/src/main/webapp/i18n/he/error.json +15 -0
  47. package/dist/generators/languages/templates/src/main/webapp/i18n/he/gateway.json +16 -0
  48. package/dist/generators/languages/templates/src/main/webapp/i18n/he/global.json.ejs +172 -0
  49. package/dist/generators/languages/templates/src/main/webapp/i18n/he/health.json.ejs +75 -0
  50. package/dist/generators/languages/templates/src/main/webapp/i18n/he/home.json.ejs +20 -0
  51. package/dist/generators/languages/templates/src/main/webapp/i18n/he/login.json +20 -0
  52. package/dist/generators/languages/templates/src/main/webapp/i18n/he/logs.json +12 -0
  53. package/dist/generators/languages/templates/src/main/webapp/i18n/he/metrics.json +103 -0
  54. package/dist/generators/languages/templates/src/main/webapp/i18n/he/password.json +13 -0
  55. package/dist/generators/languages/templates/src/main/webapp/i18n/he/register.json +25 -0
  56. package/dist/generators/languages/templates/src/main/webapp/i18n/he/reset.json.ejs +45 -0
  57. package/dist/generators/languages/templates/src/main/webapp/i18n/he/sessions.json +16 -0
  58. package/dist/generators/languages/templates/src/main/webapp/i18n/he/settings.json +33 -0
  59. package/dist/generators/languages/templates/src/main/webapp/i18n/he/tracker.json +13 -0
  60. package/dist/generators/languages/templates/src/main/webapp/i18n/he/user-management.json +32 -0
  61. package/dist/generators/languages/templates/src/test/resources/i18n/messages_he.properties.ejs +4 -0
  62. package/dist/generators/react/resources/package.json +23 -23
  63. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-delete-dialog.tsx.ejs +2 -1
  64. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.reducer.ts.ejs +4 -4
  65. package/dist/generators/react/templates/src/main/webapp/app/modules/administration/administration.reducer.spec.ts.ejs +0 -6
  66. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/application-profile.spec.ts.ejs +0 -6
  67. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/locale.spec.ts.ejs +0 -47
  68. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/reducer.utils.ts.ejs +1 -1
  69. package/dist/generators/react/templates/src/main/webapp/app/shared/util/entity-utils.ts.ejs +1 -1
  70. package/dist/generators/server/resources/Dockerfile +11 -11
  71. package/dist/generators/server/resources/gradle/libs.versions.toml +6 -6
  72. package/dist/generators/server/resources/pom.xml +7 -7
  73. package/dist/generators/spring-boot/generator.js +2 -3
  74. package/dist/generators/spring-boot/resources/spring-boot-dependencies.pom +115 -105
  75. package/dist/generators/spring-boot/templates/src/main/java/_package_/config/SecurityJwtConfiguration.java.ejs +0 -1
  76. package/dist/generators/spring-boot/templates/src/main/java/_package_/security/DomainUserDetailsService.java.ejs +61 -5
  77. package/dist/generators/spring-boot/templates/src/main/java/_package_/security/SecurityUtils.java.ejs +29 -1
  78. package/dist/generators/spring-boot/templates/src/main/java/_package_/web/rest/AuthenticateController.java.ejs +11 -5
  79. package/dist/generators/spring-boot/templates/src/test/java/_package_/security/SecurityUtilsUnitTest_imperative.java.ejs +35 -11
  80. package/dist/generators/spring-boot/templates/src/test/java/_package_/security/SecurityUtilsUnitTest_reactive.java.ejs +35 -6
  81. package/dist/generators/spring-boot/templates/src/test/java/_package_/security/jwt/JwtAuthenticationTestUtils.java.ejs +3 -2
  82. package/dist/generators/spring-cache/resources/gradle/libs.versions.toml +1 -1
  83. package/dist/generators/vue/cleanup.js +7 -1
  84. package/dist/generators/vue/files-vue.js +3 -8
  85. package/dist/generators/vue/resources/package.json +20 -20
  86. package/dist/generators/vue/templates/src/main/webapp/app/account/account.service.ts.ejs +9 -9
  87. package/dist/generators/vue/templates/src/main/webapp/app/account/activate/activate.component.spec.ts.ejs +21 -7
  88. package/dist/generators/vue/templates/src/main/webapp/app/account/activate/activate.component.ts.ejs +23 -9
  89. package/dist/generators/vue/templates/src/main/webapp/app/account/activate/activate.service.ts.ejs +1 -1
  90. package/dist/generators/vue/templates/src/main/webapp/app/account/activate/activate.vue.ejs +1 -1
  91. package/dist/generators/vue/templates/src/main/webapp/app/account/change-password/change-password.vue.ejs +1 -1
  92. package/dist/generators/vue/templates/src/main/webapp/app/account/login-form/login-form.component.spec.ts.ejs +22 -10
  93. package/dist/generators/vue/templates/src/main/webapp/app/account/login-form/login-form.component.ts.ejs +24 -5
  94. package/dist/generators/vue/templates/src/main/webapp/app/account/login-modal.ts.ejs +38 -0
  95. package/dist/generators/vue/templates/src/main/webapp/app/account/login.service.spec.ts.ejs +0 -4
  96. package/dist/generators/vue/templates/src/main/webapp/app/account/login.service.ts.ejs +3 -25
  97. package/dist/generators/vue/templates/src/main/webapp/app/account/register/register.component.spec.ts.ejs +24 -8
  98. package/dist/generators/vue/templates/src/main/webapp/app/account/register/register.component.ts.ejs +23 -9
  99. package/dist/generators/vue/templates/src/main/webapp/app/account/register/register.service.ts.ejs +1 -1
  100. package/dist/generators/vue/templates/src/main/webapp/app/account/register/register.vue.ejs +1 -1
  101. package/dist/generators/vue/templates/src/main/webapp/app/account/reset-password/finish/reset-password-finish.component.spec.ts.ejs +20 -4
  102. package/dist/generators/vue/templates/src/main/webapp/app/account/reset-password/finish/reset-password-finish.component.ts.ejs +23 -13
  103. package/dist/generators/vue/templates/src/main/webapp/app/account/reset-password/finish/reset-password-finish.vue.ejs +1 -1
  104. package/dist/generators/vue/templates/src/main/webapp/app/account/settings/settings.vue.ejs +1 -1
  105. package/dist/generators/vue/templates/src/main/webapp/app/admin/configuration/configuration.service.ts.ejs +2 -2
  106. package/dist/generators/vue/templates/src/main/webapp/app/admin/gateway/gateway.service.ts.ejs +1 -1
  107. package/dist/generators/vue/templates/src/main/webapp/app/admin/health/health.service.ts.ejs +10 -10
  108. package/dist/generators/vue/templates/src/main/webapp/app/admin/logs/logs.service.ts.ejs +2 -2
  109. package/dist/generators/vue/templates/src/main/webapp/app/admin/metrics/metrics-modal.vue.ejs +2 -2
  110. package/dist/generators/vue/templates/src/main/webapp/app/admin/metrics/metrics.service.ts.ejs +2 -2
  111. package/dist/generators/vue/templates/src/main/webapp/app/admin/tracker/tracker.service.ts.ejs +5 -5
  112. package/dist/generators/vue/templates/src/main/webapp/app/admin/user-management/user-management.service.ts.ejs +6 -6
  113. package/dist/generators/vue/templates/src/main/webapp/app/app.component.ts.ejs +29 -7
  114. package/dist/generators/vue/templates/src/main/webapp/app/app.vue.ejs +19 -1
  115. package/dist/generators/vue/templates/src/main/webapp/app/core/error/error.component.spec.ts.ejs +66 -51
  116. package/dist/generators/vue/templates/src/main/webapp/app/core/error/error.component.ts.ejs +30 -8
  117. package/dist/generators/vue/templates/src/main/webapp/app/core/home/home.component.spec.ts.ejs +41 -11
  118. package/dist/generators/vue/templates/src/main/webapp/app/core/home/home.component.ts.ejs +10 -11
  119. package/dist/generators/vue/templates/src/main/webapp/app/core/home/home.vue.ejs +2 -2
  120. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.spec.ts.ejs +43 -16
  121. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +14 -9
  122. package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +1 -1
  123. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.service.ts.ejs +7 -7
  124. package/dist/generators/vue/templates/src/main/webapp/app/entities/user/user.service.ts.ejs +1 -1
  125. package/dist/generators/vue/templates/src/main/webapp/app/locale/translation.service.ts.ejs +5 -5
  126. package/dist/generators/vue/templates/src/main/webapp/app/main.ts.ejs +18 -14
  127. package/dist/generators/vue/templates/src/main/webapp/app/shared/alert/alert.service.ts.ejs +4 -4
  128. package/dist/lib/testing/apply-patch-to-template.d.ts +13 -0
  129. package/dist/lib/testing/apply-patch-to-template.js +90 -0
  130. package/package.json +26 -26
@@ -9,12 +9,12 @@
9
9
 
10
10
  <div>
11
11
  <div class="alert alert-success" v-if="authenticated">
12
- <span v-if="username" v-text="t$('home.logged.message', { username: username })">You are logged in as user "{{ username }}"</span>
12
+ <span v-if="username" v-text="t$('home.logged.message', { username })">You are logged in as user "{{ username }}"</span>
13
13
  </div>
14
14
 
15
15
  <div class="alert alert-warning" v-if="!authenticated">
16
16
  <span v-text="t$('global.messages.info.authenticated.prefix')">If you want to </span>
17
- <a class="alert-link" @click="openLogin()" v-text="t$('global.messages.info.authenticated.link')">sign in</a
17
+ <a class="alert-link" @click="<% if (authenticationTypeOauth2) { %>login<% } else { %>showLogin<% } %>()" v-text="t$('global.messages.info.authenticated.link')">sign in</a
18
18
  ><span v-html="t$('global.messages.info.authenticated.suffix')"
19
19
  >, you can try the default accounts:<br />- Administrator (login="admin" and password="admin") <br />- User (login="user" and
20
20
  password="user").</span
@@ -1,14 +1,36 @@
1
+ <%#
2
+ Copyright 2013-2025 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
+ -%>
1
19
  import { vitest } from 'vitest';
2
20
  import { computed } from 'vue';
3
21
  import { shallowMount } from '@vue/test-utils';
4
- import JhiNavbar from './jhi-navbar.vue';
5
22
  import { type Router } from 'vue-router';
6
23
  import { createTestingPinia } from '@pinia/testing';
7
24
 
8
25
  import { useStore } from '@/store';
9
26
  import { createRouter } from '@/router';
10
- import <% if (authenticationTypeOauth2) { %>type <% } %>LoginService from '@/account/login.service';
11
-
27
+ <%_ if (authenticationUsesCsrf) { _%>
28
+ import type LoginService from '@/account/login.service';
29
+ <%_ } _%>
30
+ <%_ if (generateUserManagement) { _%>
31
+ import { useLoginModal } from '@/account/login-modal';
32
+ <%_ } _%>
33
+ import JhiNavbar from './jhi-navbar.vue';
12
34
  <%_ if (applicationTypeGateway && microfrontend) { _%>
13
35
 
14
36
  vitest.mock('@module-federation/enhanced/runtime', () => ({
@@ -23,7 +45,12 @@ const store = useStore();
23
45
 
24
46
  describe('JhiNavbar', () => {
25
47
  let jhiNavbar: JhiNavbarComponentType;
48
+ <%_ if (authenticationUsesCsrf) { _%>
26
49
  let loginService: LoginService;
50
+ <%_ } _%>
51
+ <%_ if (generateUserManagement) { _%>
52
+ let login: ReturnType<typeof useLoginModal>;
53
+ <%_ } _%>
27
54
  const accountService = { hasAnyAuthorityAndCheckAuth: vitest.fn().mockImplementation(() => Promise.resolve(true)) };
28
55
  <%_ if (enableTranslation) { _%>
29
56
  const changeLanguage = vitest.fn();
@@ -32,14 +59,7 @@ describe('JhiNavbar', () => {
32
59
 
33
60
  beforeEach(() => {
34
61
  router = createRouter();
35
- <%_ if (authenticationTypeJwt) { _%>
36
- loginService = new LoginService({ emit: vitest.fn() });
37
- vitest.spyOn(loginService, 'openLogin');
38
- <%_ } else if (authenticationTypeSession) { _%>
39
- loginService = new LoginService({ emit: vitest.fn() });
40
- vitest.spyOn(loginService, 'openLogin');
41
- vitest.spyOn(loginService, 'logout');
42
- <%_ } else if (authenticationTypeOauth2) { _%>
62
+ <%_ if (authenticationUsesCsrf) { _%>
43
63
  loginService = { login: vitest.fn(), logout: vitest.fn() };
44
64
  <%_ } _%>
45
65
  const wrapper = shallowMount(JhiNavbar, {
@@ -57,7 +77,9 @@ describe('JhiNavbar', () => {
57
77
  'b-navbar-brand': true,
58
78
  },
59
79
  provide: {
80
+ <%_ if (authenticationUsesCsrf) { _%>
60
81
  loginService,
82
+ <%_ } _%>
61
83
  currentLanguage: computed(() => 'foo'),
62
84
  <%_ if (enableTranslation) { _%>
63
85
  changeLanguage,
@@ -67,6 +89,9 @@ describe('JhiNavbar', () => {
67
89
  },
68
90
  });
69
91
  jhiNavbar = wrapper.vm;
92
+ <%_ if (generateUserManagement) { _%>
93
+ login = useLoginModal();
94
+ <%_ } _%>
70
95
  });
71
96
 
72
97
  it('should not have user data set', () => {
@@ -89,11 +114,12 @@ describe('JhiNavbar', () => {
89
114
  });
90
115
 
91
116
  it('should use login service', () => {
92
- jhiNavbar.openLogin();
93
- <%_ if (!authenticationTypeOauth2) { _%>
94
- expect(loginService.openLogin).toHaveBeenCalled();
95
- <%_ } else { _%>
117
+ jhiNavbar.<% if (authenticationTypeOauth2) { %>login<% } else { %>showLogin<% } %>();
118
+
119
+ <%_ if (authenticationTypeOauth2) { _%>
96
120
  expect(loginService.login).toHaveBeenCalled();
121
+ <%_ } else { _%>
122
+ expect(login.showLogin).toHaveBeenCalled();
97
123
  <%_ } _%>
98
124
  });
99
125
 
@@ -108,9 +134,10 @@ describe('JhiNavbar', () => {
108
134
  <%_ if (authenticationTypeOauth2) { _%>
109
135
  const logoutUrl = '/to-match';
110
136
  (loginService.logout as any).mockReturnValue(Promise.resolve({ data: { logoutUrl } }));
111
- <%_ } else if (!authenticationTypeJwt) { _%>
137
+ <%_ } else if (authenticationUsesCsrf) { _%>
112
138
  (loginService.logout as any).mockReturnValue(Promise.resolve({}));
113
139
  <%_ } _%>
140
+
114
141
  await jhiNavbar.logout();
115
142
 
116
143
  <%_ if (!authenticationTypeJwt) { _%>
@@ -2,7 +2,12 @@ import { computed, <% if (applicationTypeGateway && microfrontend) { %>defineAsy
2
2
  <%_ if (enableTranslation) { _%>
3
3
  import { useI18n } from 'vue-i18n';
4
4
  <%_ } _%>
5
+ <%_ if (authenticationUsesCsrf) { _%>
5
6
  import type LoginService from '@/account/login.service';
7
+ <%_ } %>
8
+ <%_ if (generateUserManagement) { %>
9
+ import { useLoginModal } from '@/account/login-modal';
10
+ <%_ } _%>
6
11
  import type AccountService from '@/account/account.service';
7
12
  <%_ if (enableTranslation) { _%>
8
13
  import languages from '@/shared/config/languages';
@@ -30,7 +35,15 @@ export default defineComponent({
30
35
  <%_ } _%>
31
36
  },
32
37
  setup() {
38
+ <%_ if (authenticationUsesCsrf) { _%>
33
39
  const loginService = inject<LoginService>('loginService');
40
+ <%_ if (authenticationTypeOauth2) { _%>
41
+ const { login } = loginService;
42
+ <%_ } %>
43
+ <%_ } %>
44
+ <%_ if (generateUserManagement) { %>
45
+ const { showLogin } = useLoginModal();
46
+ <%_ } _%>
34
47
  const accountService = inject<AccountService>('accountService');
35
48
  const currentLanguage = inject('currentLanguage', () => computed(() => navigator.language ?? '<%- nativeLanguage %>'), true);
36
49
  <%_ if (enableTranslation) { _%>
@@ -51,14 +64,6 @@ export default defineComponent({
51
64
  const inProduction = computed(() => store.activeProfiles.indexOf('prod') > -1);
52
65
  const authenticated = computed(() => store.authenticated);
53
66
 
54
- const openLogin = () => {
55
- <%_ if (!authenticationTypeOauth2) { _%>
56
- loginService.openLogin();
57
- <%_ } else { %>
58
- loginService.login();
59
- <%_ } _%>
60
- };
61
-
62
67
  const subIsActive = (input: string | string[]) => {
63
68
  const paths = Array.isArray(input) ? input : [input];
64
69
  return paths.some(path => {
@@ -95,7 +100,7 @@ export default defineComponent({
95
100
  logout,
96
101
  subIsActive,
97
102
  accountService,
98
- openLogin,
103
+ <% if (authenticationTypeOauth2) { %>login<% } else { %>showLogin<% } %>,
99
104
  <%_ if (enableTranslation) { _%>
100
105
  changeLanguage,
101
106
  languages: languages(),
@@ -152,7 +152,7 @@
152
152
  <font-awesome-icon icon="sign-out-alt" />
153
153
  <span v-text="t$('global.menu.account.logout')">Sign out</span>
154
154
  </b-dropdown-item>
155
- <b-dropdown-item data-cy="login" v-if="!authenticated" @click="openLogin()" id="login" active-class="active">
155
+ <b-dropdown-item data-cy="login" v-if="!authenticated" @click="showLogin()" id="login" active-class="active">
156
156
  <font-awesome-icon icon="sign-in-alt" />
157
157
  <span v-text="t$('global.menu.account.login')">Sign in</span>
158
158
  </b-dropdown-item>
@@ -11,7 +11,7 @@ const baseSearchApiUrl = '<%= entityApi %>api/<%= entityApiUrl %>/_search?query=
11
11
 
12
12
  export default class <%= entityAngularName %>Service {
13
13
  <%_ if (searchEngineAny) { _%>
14
- public search(query<% if (!paginationNo) { %>, paginationQuery<% } %>) : Promise<any> {
14
+ search(query<% if (!paginationNo) { %>, paginationQuery<% } %>) : Promise<any> {
15
15
  return new Promise<any>((resolve, reject) => {
16
16
  axios.get(`${baseSearchApiUrl}${query}<% if (!paginationNo) { %>&${buildPaginationQueryOpts(paginationQuery)}<% } %>`).then(res => {
17
17
  resolve(<% if (!paginationNo) { %>res<% } else { %>res.data<% } %>);
@@ -20,7 +20,7 @@ export default class <%= entityAngularName %>Service {
20
20
  }
21
21
  <%_ } _%>
22
22
 
23
- public find(<%= primaryKey.name %>: <%- primaryKey.tsType %>) : Promise<I<%= entityAngularName %>> {
23
+ find(<%= primaryKey.name %>: <%- primaryKey.tsType %>) : Promise<I<%= entityAngularName %>> {
24
24
  return new Promise<I<%= entityAngularName %>>((resolve, reject) => {
25
25
  axios.get(`${baseApiUrl}/${<%= primaryKey.name %>}`).then(res => {
26
26
  resolve(res.data);
@@ -28,7 +28,7 @@ export default class <%= entityAngularName %>Service {
28
28
  });
29
29
  }
30
30
 
31
- public retrieve(<% if (!paginationNo) { %>paginationQuery?: any<% } %>) : Promise<any> {
31
+ retrieve(<% if (!paginationNo) { %>paginationQuery?: any<% } %>) : Promise<any> {
32
32
  return new Promise<any>((resolve, reject) => {
33
33
  axios.get(baseApiUrl<% if (!paginationNo) { %> + `?${buildPaginationQueryOpts(paginationQuery)}` <% } %>).then(res => {
34
34
  resolve(res);
@@ -37,7 +37,7 @@ export default class <%= entityAngularName %>Service {
37
37
  }
38
38
  <%_ if (!readOnly) { _%>
39
39
 
40
- public delete(<%= primaryKey.name %>: <%- primaryKey.tsType %>) : Promise<any> {
40
+ delete(<%= primaryKey.name %>: <%- primaryKey.tsType %>) : Promise<any> {
41
41
  return new Promise<any>((resolve, reject) => {
42
42
  axios.delete(`${baseApiUrl}/${<%= primaryKey.name %>}`).then(res => {
43
43
  resolve(res);
@@ -45,7 +45,7 @@ export default class <%= entityAngularName %>Service {
45
45
  });
46
46
  }
47
47
 
48
- public create(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
48
+ create(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
49
49
  return new Promise<I<%= entityAngularName %>>((resolve, reject) => {
50
50
  axios.post(`${baseApiUrl}`, entity).then(res => {
51
51
  resolve(res.data);
@@ -53,7 +53,7 @@ export default class <%= entityAngularName %>Service {
53
53
  });
54
54
  }
55
55
 
56
- public update(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
56
+ update(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
57
57
  return new Promise<I<%= entityAngularName %>>((resolve, reject) => {
58
58
  axios.put(`${baseApiUrl}/${entity.<%= primaryKey.name %>}`, entity).then(res => {
59
59
  resolve(res.data);
@@ -61,7 +61,7 @@ export default class <%= entityAngularName %>Service {
61
61
  });
62
62
  }
63
63
 
64
- public partialUpdate(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
64
+ partialUpdate(entity: I<%= entityAngularName %>) : Promise<I<%= entityAngularName %>> {
65
65
  return new Promise<I<%= entityAngularName %>>((resolve, reject) => {
66
66
  axios.patch(`${baseApiUrl}/${entity.<%= primaryKey.name %>}`, entity).then(res => {
67
67
  resolve(res.data);
@@ -3,7 +3,7 @@ import axios from 'axios';
3
3
  const baseApiUrl = 'api/users';
4
4
 
5
5
  export default class UserService {
6
- public retrieve(): Promise<any> {
6
+ retrieve(): Promise<any> {
7
7
  return new Promise<any>((resolve, reject) => {
8
8
  axios
9
9
  .get(baseApiUrl)
@@ -12,7 +12,7 @@ export default class TranslationService {
12
12
  }
13
13
  <%_ if (microfrontend) { _%>
14
14
 
15
- public loadTranslations({ currentLanguage, urlPrefix, hash }: { currentLanguage: string; urlPrefix: string; hash: string }) {
15
+ loadTranslations({ currentLanguage, urlPrefix, hash }: { currentLanguage: string; urlPrefix: string; hash: string }) {
16
16
  if (!this.i18n) return;
17
17
  axios.get(`${urlPrefix}i18n/${currentLanguage}.json?_=${hash}`).then((res: any) => {
18
18
  if (res.data) {
@@ -22,7 +22,7 @@ export default class TranslationService {
22
22
  }
23
23
  <%_ } _%>
24
24
 
25
- public async refreshTranslation(newLanguage: string) {
25
+ async refreshTranslation(newLanguage: string) {
26
26
  if (this.i18n && !this.i18n.messages[newLanguage]) {
27
27
  <%_ if (microfrontend) { _%>
28
28
  const res = await axios.get(`i18n/${newLanguage}.json?_=${I18N_HASH}`);
@@ -34,7 +34,7 @@ export default class TranslationService {
34
34
  }
35
35
  }
36
36
 
37
- public setLocale(lang: string) {
37
+ setLocale(lang: string) {
38
38
  dayjs.locale(lang);
39
39
  this.i18n.locale.value = lang;
40
40
  axios.defaults.headers.common['Accept-Language'] = lang;
@@ -54,11 +54,11 @@ export default class TranslationService {
54
54
  }
55
55
  <%_ } _%>
56
56
 
57
- public isLanguageSupported(lang: string) {
57
+ isLanguageSupported(lang: string) {
58
58
  return Boolean(this.languages[lang]);
59
59
  }
60
60
 
61
- public getLocalStoreLanguage(): string | null {
61
+ getLocalStoreLanguage(): string | null {
62
62
  return localStorage.getItem('currentLanguage');
63
63
  }
64
64
  }
@@ -11,12 +11,17 @@ import { setupAxiosInterceptors } from '@/shared/config/axios-interceptor';
11
11
 
12
12
  import App from './app.vue';
13
13
  import router<% if (applicationTypeGateway && microfrontend) { %>, { lazyRoutes }<% } %> from './router';
14
- import { initFortAwesome<% if (enableTranslation) { %>, initI18N<% } %> } from './shared/config/config';
15
- import { initBootstrapVue } from './shared/config/config-bootstrap-vue';
16
- import JhiItemCountComponent from './shared/jhi-item-count.vue';
17
- import JhiSortIndicatorComponent from './shared/sort/jhi-sort-indicator.vue';
18
- import LoginService from './account/login.service';
19
- import AccountService from './account/account.service';
14
+ import { initFortAwesome<% if (enableTranslation) { %>, initI18N<% } %> } from '@/shared/config/config';
15
+ import { initBootstrapVue } from '@/shared/config/config-bootstrap-vue';
16
+ import JhiItemCountComponent from '@/shared/jhi-item-count.vue';
17
+ import JhiSortIndicatorComponent from '@/shared/sort/jhi-sort-indicator.vue';
18
+ <%_ if (authenticationUsesCsrf) { _%>
19
+ import LoginService from '@/account/login.service';
20
+ <%_ } _%>
21
+ <%_ if (generateUserManagement) { _%>
22
+ import { useLoginModal } from '@/account/login-modal';
23
+ <%_ } _%>
24
+ import AccountService from '@/account/account.service';
20
25
 
21
26
  import '../content/scss/global.scss';
22
27
  import '../content/scss/vendor.scss';
@@ -85,14 +90,12 @@ const i18n = initI18N();
85
90
  const app = createApp({
86
91
  compatConfig: { MODE: 3 },
87
92
  components: { App },
88
- template: '<App/>',
89
- <%_ if (!authenticationTypeOauth2) { _%>
90
- setup(_props, { emit }) {
91
- const loginService = new LoginService({ emit });
92
- provide('loginService', loginService);
93
- <%_ } else { _%>
94
93
  setup() {
94
+ <%_ if (authenticationUsesCsrf) { _%>
95
95
  provide('loginService', new LoginService());
96
+ <%_ } _%>
97
+ <%_ if (generateUserManagement) { _%>
98
+ const { hideLogin, showLogin } = useLoginModal();
96
99
  <%_ } _%>
97
100
  const store = useStore();
98
101
  const accountService = new AccountService(store);
@@ -143,7 +146,7 @@ const app = createApp({
143
146
  router.beforeResolve(async (to, from, next) => {
144
147
  <%_ if (!authenticationTypeOauth2) { _%>
145
148
  // Make sure login modal is closed
146
- loginService.hideLogin();
149
+ hideLogin();
147
150
 
148
151
  <%_ } _%>
149
152
  if (!store.authenticated) {
@@ -173,7 +176,7 @@ const app = createApp({
173
176
  <%_ if (authenticationTypeOauth2) { _%>
174
177
  window.location.reload();
175
178
  <%_ } else { _%>
176
- loginService.openLogin();
179
+ showLogin();
177
180
  <%_ } _%>
178
181
  return;
179
182
  }
@@ -205,6 +208,7 @@ const app = createApp({
205
208
  provide('microfrontendI18n', false);
206
209
  <%_ } _%>
207
210
  },
211
+ template: '<App/>',
208
212
  });
209
213
 
210
214
  initFortAwesome(app);
@@ -43,7 +43,7 @@ export default class AlertService {
43
43
  <%_ } _%>
44
44
  }
45
45
 
46
- public showInfo(toastMessage: string, toastOptions?: any) {
46
+ showInfo(toastMessage: string, toastOptions?: any) {
47
47
  this.bvToast.toast(toastMessage, {
48
48
  toaster: 'b-toaster-top-center',
49
49
  title: 'Info',
@@ -54,7 +54,7 @@ export default class AlertService {
54
54
  });
55
55
  }
56
56
 
57
- public showSuccess(toastMessage: string) {
57
+ showSuccess(toastMessage: string) {
58
58
  this.bvToast.toast(toastMessage, {
59
59
  toaster: 'b-toaster-top-center',
60
60
  title: 'Success',
@@ -64,7 +64,7 @@ export default class AlertService {
64
64
  });
65
65
  }
66
66
 
67
- public showError(toastMessage: string) {
67
+ showError(toastMessage: string) {
68
68
  this.bvToast.toast(toastMessage, {
69
69
  toaster: 'b-toaster-top-center',
70
70
  title: 'Error',
@@ -74,7 +74,7 @@ export default class AlertService {
74
74
  });
75
75
  }
76
76
 
77
- public showHttpError(httpErrorResponse: any) {
77
+ showHttpError(httpErrorResponse: any) {
78
78
  let errorMessage: string | null = null;
79
79
  switch (httpErrorResponse.status) {
80
80
  case 0:
@@ -0,0 +1,13 @@
1
+ type ApplyOptions = {
2
+ templateFile: string;
3
+ oldFileContents: string;
4
+ newFileContents: string;
5
+ contextSize?: number;
6
+ fuzzFactor?: number;
7
+ };
8
+ export declare const applyChangesToFile: ({ templateFile, oldFileContents, newFileContents, contextSize, fuzzFactor }: ApplyOptions) => {
9
+ success: number;
10
+ failures: number;
11
+ };
12
+ export declare const applyChangesToFileOrCopy: ({ templateFile, oldFileContents, ...opts }: ApplyOptions) => void;
13
+ export {};
@@ -0,0 +1,90 @@
1
+ import { readFileSync, writeFileSync } from 'fs';
2
+ import { applyPatch, structuredPatch } from 'diff';
3
+ const splitHunk = ({ lines, ...hunk }, contextSize) => {
4
+ let contextLines = [];
5
+ // let nextHunkContextLines = [];
6
+ let hunkLines = [];
7
+ const hunks = [];
8
+ for (const line of lines) {
9
+ if (line.startsWith(' ')) {
10
+ contextLines.push(line);
11
+ if (contextLines.length >= contextSize && hunkLines.length > 0) {
12
+ hunks.push({ lines: [...hunkLines, ...contextLines], ...hunk });
13
+ hunkLines = [];
14
+ }
15
+ }
16
+ else {
17
+ hunkLines.push(...contextLines);
18
+ hunkLines.push(line);
19
+ contextLines = [];
20
+ }
21
+ }
22
+ if (hunkLines.length > 0) {
23
+ hunks.push({ lines: [...contextLines, ...hunkLines], ...hunk });
24
+ }
25
+ return hunks;
26
+ };
27
+ export const applyChangesToFile = ({ templateFile, oldFileContents, newFileContents, contextSize = 2, fuzzFactor = 0 }) => {
28
+ const patch = structuredPatch(templateFile, templateFile, oldFileContents, newFileContents, undefined, undefined, {
29
+ context: contextSize,
30
+ newlineIsToken: false,
31
+ // ignoreWhitespace: true,
32
+ // oneChangePerToken: true,
33
+ // maxEditLength: 3,
34
+ });
35
+ patch.hunks = patch.hunks
36
+ .map(({ lines, ...remainning }) => ({
37
+ ...remainning,
38
+ lines: lines
39
+ .map(line => (line === '-' ? ' ' : line.replace('-import', ' import').replace('+import', ' import')))
40
+ .filter(line => line !== '+'),
41
+ }))
42
+ .filter(({ lines }) => lines.some(line => line.startsWith('+') || line.startsWith('-')));
43
+ // apply hunk by hunk, since if a hunk fails, the rest of the file will be skipped
44
+ const content = readFileSync(templateFile, 'utf8').toString();
45
+ let applied = content;
46
+ let failures = 0;
47
+ let success = 0;
48
+ for (const hunk of patch.hunks.map(hunk => splitHunk(hunk, contextSize)).flat()) {
49
+ const result = applyPatch(applied, { ...patch, hunks: [hunk] }, { fuzzFactor });
50
+ if (result) {
51
+ applied = result;
52
+ success++;
53
+ }
54
+ else {
55
+ failures++;
56
+ }
57
+ }
58
+ if (content !== applied) {
59
+ writeFileSync(templateFile, applied);
60
+ }
61
+ return { success, failures };
62
+ };
63
+ export const applyChangesToFileOrCopy = ({ templateFile, oldFileContents, ...opts }) => {
64
+ const result = applyChangesToFile({ templateFile, oldFileContents, ...opts });
65
+ if (result.success === 0 && result.failures > 0) {
66
+ let diskContents;
67
+ if (templateFile.endsWith('.ejs')) {
68
+ diskContents = `<%#
69
+ Copyright 2013-2025 the original author or authors from the JHipster project.
70
+
71
+ This file is part of the JHipster project, see https://www.jhipster.tech/
72
+ for more information.
73
+
74
+ Licensed under the Apache License, Version 2.0 (the "License");
75
+ you may not use this file except in compliance with the License.
76
+ You may obtain a copy of the License at
77
+
78
+ https://www.apache.org/licenses/LICENSE-2.0
79
+
80
+ Unless required by applicable law or agreed to in writing, software
81
+ distributed under the License is distributed on an "AS IS" BASIS,
82
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83
+ See the License for the specific language governing permissions and
84
+ limitations under the License.
85
+ -%>
86
+ ${oldFileContents}`;
87
+ }
88
+ writeFileSync(templateFile, diskContents ?? oldFileContents, { encoding: 'utf-8' });
89
+ }
90
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generator-jhipster",
3
- "version": "8.10.0",
3
+ "version": "8.11.0",
4
4
  "description": "Spring Boot + Angular/React/Vue in one handy generator",
5
5
  "keywords": [
6
6
  "yeoman-generator",
@@ -119,17 +119,22 @@
119
119
  "update-snapshot": "esmocha --no-insight --no-parallel --update-snapshot --",
120
120
  "update-snapshots": "esmocha lib/jdl generators cli .blueprint --update-snapshot --no-insight --forbid-only"
121
121
  },
122
+ "overrides": {
123
+ "ejs-lint": {
124
+ "ejs": "$ejs"
125
+ }
126
+ },
122
127
  "dependencies": {
123
- "@eslint/js": "9.23.0",
124
- "@faker-js/faker": "9.6.0",
128
+ "@eslint/js": "9.26.0",
129
+ "@faker-js/faker": "9.7.0",
125
130
  "@iarna/toml": "3.0.0",
126
131
  "@types/ejs": "3.1.5",
127
132
  "@types/lodash-es": "4.17.12",
128
- "@yeoman/adapter": "2.0.0",
129
- "@yeoman/conflicter": "2.3.2",
133
+ "@yeoman/adapter": "2.1.1",
134
+ "@yeoman/conflicter": "2.4.0",
130
135
  "@yeoman/namespace": "1.0.1",
131
136
  "@yeoman/transform": "2.1.0",
132
- "@yeoman/types": "1.5.0",
137
+ "@yeoman/types": "1.6.0",
133
138
  "chalk": "5.4.1",
134
139
  "chevrotain": "11.0.3",
135
140
  "commander": "13.1.0",
@@ -138,12 +143,12 @@
138
143
  "dockerfile-ast": "0.7.0",
139
144
  "dot-properties": "1.1.0",
140
145
  "ejs": "3.1.10",
141
- "eslint": "9.23.0",
142
- "eslint-plugin-import-x": "4.9.4",
146
+ "eslint": "9.26.0",
147
+ "eslint-plugin-import-x": "4.11.0",
143
148
  "eslint-plugin-unused-imports": "4.1.4",
144
149
  "execa": "9.5.2",
145
- "fast-xml-parser": "5.0.9",
146
- "glob": "11.0.1",
150
+ "fast-xml-parser": "5.2.2",
151
+ "glob": "11.0.2",
147
152
  "globals": "16.0.0",
148
153
  "isbinaryfile": "5.0.4",
149
154
  "java-lint": "0.3.0",
@@ -160,37 +165,37 @@
160
165
  "pluralize": "8.0.0",
161
166
  "prettier": "3.5.3",
162
167
  "prettier-plugin-java": "2.6.7",
163
- "prettier-plugin-packagejson": "2.5.10",
168
+ "prettier-plugin-packagejson": "2.5.11",
164
169
  "prettier-plugin-properties": "0.3.0",
165
170
  "randexp": "0.5.3",
166
171
  "semver": "7.7.1",
167
172
  "simple-git": "3.27.0",
168
173
  "sort-keys": "5.1.0",
169
- "tinyglobby": "0.2.12",
170
- "type-fest": "4.38.0",
171
- "typescript": "5.8.2",
172
- "typescript-eslint": "8.29.0",
174
+ "tinyglobby": "0.2.13",
175
+ "type-fest": "4.41.0",
176
+ "typescript": "5.8.3",
177
+ "typescript-eslint": "8.32.0",
173
178
  "yaml": "2.7.1",
174
179
  "yeoman-environment": "4.4.3",
175
180
  "yeoman-generator": "7.5.1"
176
181
  },
177
182
  "devDependencies": {
178
- "@eslint/core": "0.12.0",
183
+ "@eslint/core": "0.14.0",
179
184
  "@node-loaders/esbuild": "2.0.0",
180
- "@types/chai": "5.2.1",
185
+ "@types/chai": "5.2.2",
181
186
  "@types/estree": "1.0.7",
182
187
  "@types/node": "20.11.25",
183
188
  "@types/sinon-chai": "4.0.0",
184
189
  "chai": "5.2.0",
185
190
  "cpy-cli": "5.0.0",
186
191
  "ejs-lint": "2.0.1",
187
- "eslint-config-prettier": "10.1.1",
188
- "eslint-import-resolver-typescript": "4.3.1",
192
+ "eslint-config-prettier": "10.1.2",
193
+ "eslint-import-resolver-typescript": "4.3.4",
189
194
  "eslint-plugin-chai-friendly": "1.0.1",
190
- "eslint-plugin-prettier": "5.2.5",
195
+ "eslint-plugin-prettier": "5.4.0",
191
196
  "esmocha": "3.0.0",
192
197
  "jsdoc": "4.0.4",
193
- "mocha": "11.1.0",
198
+ "mocha": "11.2.2",
194
199
  "open-cli": "8.0.0",
195
200
  "prettier2": "npm:prettier@2.8.8",
196
201
  "rimraf": "6.0.1",
@@ -214,10 +219,5 @@
214
219
  "type": "opencollective",
215
220
  "url": "https://opencollective.com/generator-jhipster",
216
221
  "logo": "https://opencollective.com/opencollective/logo.txt"
217
- },
218
- "overrides": {
219
- "ejs-lint": {
220
- "ejs": "$ejs"
221
- }
222
222
  }
223
223
  }