From 4056fcebb6098567298779e31f81e4cac0969dbf Mon Sep 17 00:00:00 2001 From: seraphinandrieux Date: Sun, 3 Apr 2022 09:31:52 +0200 Subject: [PATCH] Add pinia for vue 3 --- package-lock.json | 144 +++++++++++++++++- package.json | 2 + .../application/VueApplicationService.java | 4 + .../generator/client/vue/core/domain/Vue.java | 18 +++ .../vue/core/domain/VueDomainService.java | 51 +++++-- .../client/vue/core/domain/VueService.java | 2 + .../primary/rest/VueResource.java | 9 ++ .../generator/project/domain/Constants.java | 1 + .../generator/dependencies/vue/package.json | 3 + src/main/webapp/app/main.ts | 5 + .../application/VueApplicationServiceIT.java | 10 ++ .../vue/core/application/VueAssert.java | 4 + .../vue/core/domain/VueDomainServiceTest.java | 33 +++- .../primary/rest/VueResourceIT.java | 24 ++- 14 files changed, 282 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f38ef28401..718288b6a00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "license": "Apache-2.0", "dependencies": { "axios": "0.26.1", + "pinia": "2.0.12", + "pinia-plugin-persist": "1.0.0", "vue": "3.2.31", "vue-router": "4.0.14" }, @@ -2284,9 +2286,9 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.12.tgz", - "integrity": "sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw==" + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.3.tgz", + "integrity": "sha512-79InfO2xHv+WHIrH1bHXQUiQD/wMls9qBk6WVwGCbdwP7/3zINtvqPNMtmSHXsIKjvUAHc8L0ouOj6ZQQRmcXg==" }, "node_modules/@vue/eslint-config-typescript": { "version": "10.0.0", @@ -9831,6 +9833,99 @@ "node": ">=0.10.0" } }, + "node_modules/pinia": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.12.tgz", + "integrity": "sha512-tUeuYGFrLU5irmGyRAIxp35q1OTcZ8sKpGT4XkPeVcG35W4R6cfXDbCGexzmVqH5lTQJJTXXbNGutIu9yS5yew==", + "dependencies": { + "@vue/devtools-api": "^6.1.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz", + "integrity": "sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==", + "dependencies": { + "vue-demi": "^0.12.1" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0", + "pinia": "^2.0.0", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persist/node_modules/vue-demi": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.4.tgz", + "integrity": "sha512-ztPDkFt0TSUdoq1ZI6oD730vgztBkiByhUW7L1cOTebiSBqSYfSQgnhYakYigBkyAybqCTH7h44yZuDJf2xILQ==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.4.tgz", + "integrity": "sha512-ztPDkFt0TSUdoq1ZI6oD730vgztBkiByhUW7L1cOTebiSBqSYfSQgnhYakYigBkyAybqCTH7h44yZuDJf2xILQ==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -11835,7 +11930,7 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14284,9 +14379,9 @@ } }, "@vue/devtools-api": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.12.tgz", - "integrity": "sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw==" + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.3.tgz", + "integrity": "sha512-79InfO2xHv+WHIrH1bHXQUiQD/wMls9qBk6WVwGCbdwP7/3zINtvqPNMtmSHXsIKjvUAHc8L0ouOj6ZQQRmcXg==" }, "@vue/eslint-config-typescript": { "version": "10.0.0", @@ -19897,6 +19992,39 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pinia": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.12.tgz", + "integrity": "sha512-tUeuYGFrLU5irmGyRAIxp35q1OTcZ8sKpGT4XkPeVcG35W4R6cfXDbCGexzmVqH5lTQJJTXXbNGutIu9yS5yew==", + "requires": { + "@vue/devtools-api": "^6.1.0", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.4.tgz", + "integrity": "sha512-ztPDkFt0TSUdoq1ZI6oD730vgztBkiByhUW7L1cOTebiSBqSYfSQgnhYakYigBkyAybqCTH7h44yZuDJf2xILQ==", + "requires": {} + } + } + }, + "pinia-plugin-persist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz", + "integrity": "sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==", + "requires": { + "vue-demi": "^0.12.1" + }, + "dependencies": { + "vue-demi": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.4.tgz", + "integrity": "sha512-ztPDkFt0TSUdoq1ZI6oD730vgztBkiByhUW7L1cOTebiSBqSYfSQgnhYakYigBkyAybqCTH7h44yZuDJf2xILQ==", + "requires": {} + } + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -21449,7 +21577,7 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true + "devOptional": true }, "union-value": { "version": "1.0.1", diff --git a/package.json b/package.json index 98a35f15c50..595480e6d18 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ }, "dependencies": { "axios": "0.26.1", + "pinia": "2.0.12", + "pinia-plugin-persist": "1.0.0", "vue": "3.2.31", "vue-router": "4.0.14" }, diff --git a/src/main/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationService.java b/src/main/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationService.java index 7360ed75463..b84624e7c4a 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationService.java +++ b/src/main/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationService.java @@ -17,6 +17,10 @@ public void addVue(Project project) { vueService.addVue(project); } + public void addPinia(Project project) { + vueService.addPinia(project); + } + public void addStyledVue(Project project) { vueService.addStyledVue(project); } diff --git a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/Vue.java b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/Vue.java index cd67d52020e..fdd1e6bfbf9 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/Vue.java +++ b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/Vue.java @@ -1,11 +1,21 @@ package tech.jhipster.lite.generator.client.vue.core.domain; +import java.util.Collection; import java.util.List; public class Vue { public static final String ROUTER_IMPORT = "import router from \'./router/router\';"; public static final String ROUTER_PROVIDER = "app.use(router);"; + public static final Collection PINIA_IMPORTS = List.of( + "import {createPinia} from 'pinia';", + "import piniaPersist from 'pinia-plugin-persist'" + ); + public static final Collection PINIA_PROVIDERS = List.of( + "const pinia = createPinia();", + "pinia.use(piniaPersist);", + "app.use(pinia);" + ); private Vue() {} @@ -13,6 +23,14 @@ public static List dependencies() { return List.of("vue"); } + public static List piniaDependencies() { + return List.of("pinia", "pinia-plugin-persist"); + } + + public static List piniaDevDependencies() { + return List.of("@pinia/testing"); + } + public static List routerDependencies() { return List.of("vue-router"); } diff --git a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainService.java b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainService.java index 393ac70ed1a..480213b22c4 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainService.java +++ b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainService.java @@ -18,9 +18,15 @@ public class VueDomainService implements VueService { public static final String SOURCE = "client/vue"; public static final String NEEDLE_IMPORT = "// jhipster-needle-main-ts-import"; public static final String NEEDLE_PROVIDER = "// jhipster-needle-main-ts-provider"; - public static final String SOURCE_PRIMARY = getPath(SOURCE, "webapp/app/common/primary/app"); - public static final String DESTINATION_PRIMARY = "src/main/webapp/app/common/primary/app"; + public static final String SOURCE_PRIMARY = getPath(SOURCE, "webapp/app/common/primary"); + public static final String SOURCE_TEST_PRIMARY = getPath(SOURCE, "test/spec/common/primary"); + public static final String SOURCE_PRIMARY_APP = getPath(SOURCE_PRIMARY, "app"); + public static final String DESTINATION_PRIMARY = "src/main/webapp/app/common/primary"; + public static final String DESTINATION_PRIMARY_APP = DESTINATION_PRIMARY + "/app"; + public static final String DESTINATION_PRIMARY_TEST = "src/test/javascript/spec/common/primary"; + public static final String DESTINATION_PRIMARY_ROUTER = DESTINATION_PRIMARY + "/app"; public static final String DESTINATION_APP = "src/main/webapp/app"; + public static final String DESTINATION_ROUTER = DESTINATION_APP + "/router"; private final ProjectRepository projectRepository; private final NpmService npmService; @@ -42,6 +48,14 @@ public void addStyledVue(Project project) { addAppFilesWithCss(project); } + @Override + public void addPinia(Project project) { + Assert.notNull("project", project); + + addPiniaDependencies(project); + addPiniaMainConfiguration(project); + } + private void addCommonVue(Project project) { Assert.notNull("project", project); addDependencies(project); @@ -58,6 +72,18 @@ public void addDependencies(Project project) { Vue.dependencies().forEach(dependency -> addDependency(project, dependency)); } + public void addPiniaDependencies(Project project) { + Vue.piniaDependencies().forEach(dependency -> addDependency(project, dependency)); + Vue.piniaDevDependencies().forEach(devDependency -> addDevDependency(project, devDependency)); + } + + private void addPiniaMainConfiguration(Project project) { + Vue.PINIA_IMPORTS.forEach(importLine -> addNewNeedleLineToFile(project, importLine, DESTINATION_APP, MAIN_TYPESCRIPT, NEEDLE_IMPORT)); + Vue.PINIA_PROVIDERS.forEach(providerLine -> + addNewNeedleLineToFile(project, providerLine, DESTINATION_APP, MAIN_TYPESCRIPT, NEEDLE_PROVIDER) + ); + } + public void addDevDependencies(Project project) { Vue.devDependencies().forEach(devDependency -> addDevDependency(project, devDependency)); } @@ -126,7 +152,7 @@ private void addRouterFiles(Project project) { } private void addRouterConfigAndTestFiles(Project project) { - projectRepository.template(project, getPath(SOURCE, "webapp/app/router"), "router.ts", "src/main/webapp/app/router"); + projectRepository.template(project, getPath(SOURCE, "webapp/app/router"), ROUTER_TYPESCRIPT, "src/main/webapp/app/router"); projectRepository.template(project, getPath(SOURCE, "test/spec/router"), "Router.spec.ts", "src/test/javascript/spec/router"); } @@ -143,29 +169,24 @@ private void addNewNeedleLineToFile(Project project, String importLine, String f public void addAppFiles(Project project) { project.addDefaultConfig(BASE_NAME); - projectRepository.template(project, SOURCE_PRIMARY, "App.component.ts", DESTINATION_PRIMARY); - projectRepository.template(project, SOURCE_PRIMARY, "index.ts", DESTINATION_PRIMARY); + projectRepository.template(project, SOURCE_PRIMARY_APP, "App.component.ts", DESTINATION_PRIMARY_APP); + projectRepository.template(project, SOURCE_PRIMARY_APP, "index.ts", DESTINATION_PRIMARY_APP); - projectRepository.template( - project, - getPath(SOURCE, "test/spec/common/primary/app"), - "App.spec.ts", - "src/test/javascript/spec/common/primary/app" - ); + projectRepository.template(project, getPath(SOURCE_TEST_PRIMARY, "app"), "App.spec.ts", DESTINATION_PRIMARY_TEST + "/app"); } public void addAppFilesWithoutCss(Project project) { project.addDefaultConfig(BASE_NAME); - projectRepository.template(project, SOURCE_PRIMARY, "App.html", DESTINATION_PRIMARY); - projectRepository.template(project, SOURCE_PRIMARY, "App.vue", DESTINATION_PRIMARY); + projectRepository.template(project, SOURCE_PRIMARY_APP, "App.html", DESTINATION_PRIMARY_APP); + projectRepository.template(project, SOURCE_PRIMARY_APP, "App.vue", DESTINATION_PRIMARY_APP); } public void addAppFilesWithCss(Project project) { project.addDefaultConfig(BASE_NAME); - projectRepository.template(project, SOURCE_PRIMARY, "StyledApp.html", DESTINATION_PRIMARY, "App.html"); - projectRepository.template(project, SOURCE_PRIMARY, "StyledApp.vue", DESTINATION_PRIMARY, "App.vue"); + projectRepository.template(project, SOURCE_PRIMARY_APP, "StyledApp.html", DESTINATION_PRIMARY_APP, "App.html"); + projectRepository.template(project, SOURCE_PRIMARY_APP, "StyledApp.vue", DESTINATION_PRIMARY_APP, "App.vue"); projectRepository.add( project, diff --git a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueService.java b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueService.java index 66537475d9c..32ad0f43051 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueService.java +++ b/src/main/java/tech/jhipster/lite/generator/client/vue/core/domain/VueService.java @@ -6,4 +6,6 @@ public interface VueService { void addVue(Project project); void addStyledVue(Project project); + + void addPinia(Project project); } diff --git a/src/main/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResource.java b/src/main/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResource.java index 457078be5eb..5e4ffe849d4 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResource.java +++ b/src/main/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResource.java @@ -41,4 +41,13 @@ public void addStyledVue(@RequestBody ProjectDTO projectDTO) { Project project = ProjectDTO.toProject(projectDTO); vueApplicationService.addStyledVue(project); } + + @Operation(summary = "Add Pinia", description = "Add pinia for state management") + @ApiResponse(responseCode = "500", description = "An error occurred while adding Pinia") + @PostMapping("/pinia") + @GeneratorStep(id = "vue-pinia") + public void addPinia(@RequestBody ProjectDTO projectDTO) { + Project project = ProjectDTO.toProject(projectDTO); + vueApplicationService.addPinia(project); + } } diff --git a/src/main/java/tech/jhipster/lite/generator/project/domain/Constants.java b/src/main/java/tech/jhipster/lite/generator/project/domain/Constants.java index 7830e9ed9cd..59000799acb 100644 --- a/src/main/java/tech/jhipster/lite/generator/project/domain/Constants.java +++ b/src/main/java/tech/jhipster/lite/generator/project/domain/Constants.java @@ -27,6 +27,7 @@ private Constants() {} public static final String MAIN_TYPESCRIPT = "main.ts"; public static final String JHIPSTER_FOLDER = ".jhipster"; public static final String HISTORY_JSON = "history.json"; + public static final String ROUTER_TYPESCRIPT = "router.ts"; public static final String COMMENT_PROPERTIES_PREFIX = "#"; public static final String KEY_VALUE_PROPERTIES_SEPARATOR = "="; diff --git a/src/main/resources/generator/dependencies/vue/package.json b/src/main/resources/generator/dependencies/vue/package.json index ecda80f3250..6c87689f198 100644 --- a/src/main/resources/generator/dependencies/vue/package.json +++ b/src/main/resources/generator/dependencies/vue/package.json @@ -4,10 +4,13 @@ "description": "JHipster Lite : used for Vite+Vue3 dependencies", "license": "Apache-2.0", "dependencies": { + "pinia": "2.0.12", + "pinia-plugin-persist": "1.0.0", "vue": "3.2.31", "vue-router": "4.0.14" }, "devDependencies": { + "@pinia/testing": "0.0.10", "@rushstack/eslint-patch": "1.1.1", "@types/jest": "27.4.1", "@typescript-eslint/parser": "5.17.0", diff --git a/src/main/webapp/app/main.ts b/src/main/webapp/app/main.ts index f50ab00ae1f..233d5771ef9 100644 --- a/src/main/webapp/app/main.ts +++ b/src/main/webapp/app/main.ts @@ -9,6 +9,8 @@ import ReactRepository from '@/springboot/secondary/client/ReactRepository'; import VueRepository from '@/springboot/secondary/client/VueRepository'; import SpringBootRepository from './springboot/secondary/SpringBootRepository'; import ConsoleLogger from '@/common/secondary/ConsoleLogger'; +import { createPinia } from 'pinia'; +import piniaPersist from 'pinia-plugin-persist'; const axiosHttp = new AxiosHttp(axios.create({ baseURL: '' })); const consoleLogger = new ConsoleLogger(console); @@ -19,6 +21,8 @@ const vueRepository = new VueRepository(axiosHttp); const springBootRepository = new SpringBootRepository(axiosHttp); const app = createApp(App); +const pinia = createPinia(); +pinia.use(piniaPersist); app.provide('angularService', angularRepository); app.provide('logger', consoleLogger); app.provide('projectService', projectRepository); @@ -26,5 +30,6 @@ app.provide('reactService', reactRepository); app.provide('springBootService', springBootRepository); app.provide('vueService', vueRepository); app.use(router); +app.use(pinia); app.mount('#app'); diff --git a/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationServiceIT.java b/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationServiceIT.java index 215326fcbff..b63afa186e3 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationServiceIT.java +++ b/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueApplicationServiceIT.java @@ -31,6 +31,16 @@ void shouldAddVue() { VueAssert.assertJestSonar(project); } + @Test + void shouldAddPinia() { + Project project = tmpProjectWithPackageJson(); + + vueApplicationService.addVue(project); + vueApplicationService.addPinia(project); + + VueAssert.assertPiniaDependency(project); + } + @Test void shouldAddStyledVue() { Project project = tmpProjectWithPackageJson(); diff --git a/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueAssert.java b/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueAssert.java index caf72fad4b4..73d84add1d4 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueAssert.java +++ b/src/test/java/tech/jhipster/lite/generator/client/vue/core/application/VueAssert.java @@ -18,6 +18,10 @@ public static void assertDependency(Project project) { Vue.devDependencies().forEach(devDependency -> assertFileContent(project, PACKAGE_JSON, DQ + devDependency + DQ)); } + public static void assertPiniaDependency(Project project) { + Vue.piniaDependencies().forEach(dependency -> assertFileContent(project, PACKAGE_JSON, DQ + dependency + DQ)); + } + public static void assertScripts(Project project) { assertFileContent(project, PACKAGE_JSON, "\"build\": \"vue-tsc --noEmit && vite build --emptyOutDir\""); assertFileContent(project, PACKAGE_JSON, "\"dev\": \"vite\""); diff --git a/src/test/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainServiceTest.java b/src/test/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainServiceTest.java index d7a2ba05e12..869cc623819 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainServiceTest.java +++ b/src/test/java/tech/jhipster/lite/generator/client/vue/core/domain/VueDomainServiceTest.java @@ -5,7 +5,6 @@ import static org.mockito.Mockito.*; import static tech.jhipster.lite.TestUtils.*; -import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -55,6 +54,13 @@ void shouldNotAddVueWhenNoProject() { .hasMessageContaining("project"); } + @Test + void shouldNotAddPiniaWhenNoProject() { + assertThatThrownBy(() -> vueDomainService.addPinia(null)) + .isExactlyInstanceOf(MissingMandatoryValueException.class) + .hasMessageContaining("project"); + } + @Test void shouldAddStyledVue() { Project project = tmpProjectWithPackageJson(); @@ -183,4 +189,29 @@ void shouldAddAppFilesWithCss() { verify(projectRepository, times(2)).template(any(Project.class), anyString(), anyString(), anyString(), anyString()); verify(projectRepository, times(2)).add(any(Project.class), anyString(), anyString(), anyString()); } + + @Test + void shouldAddPiniaDependencies() { + Project project = tmpProject(); + + final String version = "1.0.0"; + when(npmService.getVersion(anyString(), anyString())).thenReturn(Optional.of(version)); + + vueDomainService.addPiniaDependencies(project); + ArgumentCaptor dependenciesCaptor = ArgumentCaptor.forClass(String.class); + verify(npmService, times(2)).addDependency(eq(project), dependenciesCaptor.capture(), eq(version)); + + assertThat(dependenciesCaptor.getAllValues()).containsAll(Vue.piniaDependencies()); + } + + @Test + void shouldUpdateMainConfigurationWhenAddingPinia() { + Project project = tmpProject(); + final String version = "1.0.0"; + when(npmService.getVersion(anyString(), anyString())).thenReturn(Optional.of(version)); + + vueDomainService.addPinia(project); + + verify(projectRepository, times(5)).replaceText(eq(project), anyString(), eq("main.ts"), anyString(), anyString()); + } } diff --git a/src/test/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResourceIT.java b/src/test/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResourceIT.java index 7c7ff28b211..ba845eee8b5 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResourceIT.java +++ b/src/test/java/tech/jhipster/lite/generator/client/vue/core/infrastructure/primary/rest/VueResourceIT.java @@ -1,9 +1,9 @@ package tech.jhipster.lite.generator.client.vue.core.infrastructure.primary.rest; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static tech.jhipster.lite.TestUtils.readFileToObject; -import static tech.jhipster.lite.common.domain.FileUtils.tmpDirForTest; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static tech.jhipster.lite.TestUtils.*; +import static tech.jhipster.lite.common.domain.FileUtils.*; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +48,22 @@ void shouldAddVue() throws Exception { VueAssert.assertJestSonar(project); } + @Test + void shouldAddPinia() throws Exception { + ProjectDTO projectDTO = readFileToObject("json/chips.json", ProjectDTO.class).folder(tmpDirForTest()); + Project project = ProjectDTO.toProject(projectDTO); + initApplicationService.init(project); + + mockMvc + .perform(post("/api/vue").contentType(MediaType.APPLICATION_JSON).content(TestUtils.convertObjectToJsonBytes(projectDTO))) + .andExpect(status().isOk()); + + mockMvc + .perform(post("/api/vue/pinia").contentType(MediaType.APPLICATION_JSON).content(TestUtils.convertObjectToJsonBytes(projectDTO))) + .andExpect(status().isOk()); + VueAssert.assertPiniaDependency(project); + } + @Test void shouldAddStyledVue() throws Exception { ProjectDTO projectDTO = readFileToObject("json/chips.json", ProjectDTO.class).folder(tmpDirForTest());