From d2f7c85b07a2f1584ede498d0c38d1591bf9ecd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Fri, 7 Jul 2023 22:29:43 +0200 Subject: [PATCH 1/5] generator: Upgrade to prettier 3 Fixes #6802 --- .prettierrc | 4 ++ package-lock.json | 123 ++++++++++++++++++++++++++-------------------- package.json | 5 +- 3 files changed, 78 insertions(+), 54 deletions(-) diff --git a/.prettierrc b/.prettierrc index 38f91af0622..b61211821cb 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,6 +5,10 @@ singleQuote: true tabWidth: 2 useTabs: false +plugins: + - '@prettier/plugin-xml' + - prettier-plugin-java + # js and ts rules: arrowParens: avoid diff --git a/package-lock.json b/package-lock.json index 255fae8953f..6a29b13f323 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "vue-router": "4.2.4" }, "devDependencies": { - "@prettier/plugin-xml": "2.2.0", + "@prettier/plugin-xml": "3.1.0", "@rushstack/eslint-patch": "1.3.2", "@tikui/core": "4.1.0", "@types/sinon": "10.0.15", @@ -29,13 +29,14 @@ "cypress": "12.17.1", "eslint": "8.44.0", "eslint-plugin-cypress": "2.13.3", + "eslint-plugin-prettier": "5.0.0", "eslint-plugin-vue": "9.15.1", "fontello-cli": "0.6.2", "husky": "8.0.3", "jsdom": "22.1.0", "lint-staged": "13.2.3", "postcss-scss": "4.0.6", - "prettier": "2.8.8", + "prettier": "3.0.0", "prettier-plugin-java": "2.2.0", "prettier-plugin-packagejson": "2.4.5", "pug-lint": "2.7.0", @@ -1246,13 +1247,13 @@ } }, "node_modules/@prettier/plugin-xml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", - "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.1.0.tgz", + "integrity": "sha512-0RskvTvwQzTOq3nKXjHT7mnTUs/b8xh1iONC0lEYyWRtSHseE2N8pEvdYSy/7dIKEA34aPHKGrSAmKjK2xPAtQ==", "dev": true, "dependencies": { "@xml-tools/parser": "^1.0.11", - "prettier": ">=2.4.0" + "prettier": ">=3.0.0" } }, "node_modules/@rushstack/eslint-patch": { @@ -2012,6 +2013,27 @@ "prettier": ">= 2.0.0" } }, + "node_modules/@vue/eslint-config-prettier/node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/@vue/eslint-config-typescript": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", @@ -4419,21 +4441,29 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=12.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -8321,15 +8351,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -8358,21 +8388,6 @@ "prettier": "3.0.0" } }, - "node_modules/prettier-plugin-java/node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/prettier-plugin-packagejson": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.5.tgz", @@ -12808,13 +12823,13 @@ } }, "@prettier/plugin-xml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", - "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.1.0.tgz", + "integrity": "sha512-0RskvTvwQzTOq3nKXjHT7mnTUs/b8xh1iONC0lEYyWRtSHseE2N8pEvdYSy/7dIKEA34aPHKGrSAmKjK2xPAtQ==", "dev": true, "requires": { "@xml-tools/parser": "^1.0.11", - "prettier": ">=2.4.0" + "prettier": ">=3.0.0" } }, "@rushstack/eslint-patch": { @@ -13382,6 +13397,17 @@ "requires": { "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0" + }, + "dependencies": { + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + } } }, "@vue/eslint-config-typescript": { @@ -15308,12 +15334,13 @@ } }, "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" } }, "eslint-plugin-vue": { @@ -18092,9 +18119,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "prettier-linter-helpers": { @@ -18115,14 +18142,6 @@ "java-parser": "2.0.4", "lodash": "4.17.21", "prettier": "3.0.0" - }, - "dependencies": { - "prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", - "dev": true - } } }, "prettier-plugin-packagejson": { diff --git a/package.json b/package.json index 16585393562..ab3b24105be 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "vue-router": "4.2.4" }, "devDependencies": { - "@prettier/plugin-xml": "2.2.0", + "@prettier/plugin-xml": "3.1.0", "@rushstack/eslint-patch": "1.3.2", "@tikui/core": "4.1.0", "@types/sinon": "10.0.15", @@ -63,13 +63,14 @@ "cypress": "12.17.1", "eslint": "8.44.0", "eslint-plugin-cypress": "2.13.3", + "eslint-plugin-prettier": "5.0.0", "eslint-plugin-vue": "9.15.1", "fontello-cli": "0.6.2", "husky": "8.0.3", "jsdom": "22.1.0", "lint-staged": "13.2.3", "postcss-scss": "4.0.6", - "prettier": "2.8.8", + "prettier": "3.0.0", "prettier-plugin-java": "2.2.0", "prettier-plugin-packagejson": "2.4.5", "pug-lint": "2.7.0", From d46509cdc1e07ae9e48c446d75f759391eb7380c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sat, 8 Jul 2023 14:14:09 +0200 Subject: [PATCH 2/5] Reformatted existing generator code with prettier 3.0 --- src/main/glyph/css/jhlite-icons-embedded.css | 6 ++-- src/main/glyph/css/jhlite-icons.css | 9 +++-- .../springboot/mvc/web/resources/404.html | 6 ++-- .../primary/theme-button/ThemeButton.vue | 4 ++- .../app/module/domain/landscape/Landscape.ts | 34 +++++++++++-------- .../domain/landscape/LandscapeFeature.ts | 5 ++- .../domain/landscape/LandscapeModule.ts | 5 ++- .../primary/landscape/Landscape.component.ts | 8 ++--- .../primary/landscape/LandscapeConnector.ts | 4 +-- .../modules-patch/ComponentModulePatch.ts | 2 +- .../ComponentModulePatchCategory.ts | 7 ++-- .../modules-patch/ComponentModulesPatch.ts | 7 ++-- .../secondary/LocalWindowThemeRepository.ts | 7 ++-- .../module/secondary/RestModulesRepository.ts | 2 +- src/main/webapp/content/css/custom.css | 3 +- src/main/webapp/index.html | 2 +- .../spec/common/domain/Optional.spec.ts | 14 ++++---- .../common/secondary/EmitterStub.fixture.ts | 2 +- .../secondary/alert/MittAlertBus.spec.ts | 4 +-- .../javascript/spec/http/AxiosHttpStub.ts | 4 +-- src/test/javascript/spec/http/AxiosStub.ts | 4 +-- .../module/domain/ModuleParameters.fixture.ts | 2 +- .../spec/module/domain/Modules.fixture.ts | 2 +- .../module/domain/ProjectFolders.fixture.ts | 2 +- .../domain/landscape/Landscape.fixture.ts | 4 +-- .../landscape/LandscapeComponent.spec.ts | 6 ++-- .../landscape/LandscapeScroller.spec.ts | 2 +- .../ModulesPatchComponent.spec.ts | 4 +-- .../secondary/RestModulesRepository.spec.ts | 4 +-- 29 files changed, 98 insertions(+), 67 deletions(-) diff --git a/src/main/glyph/css/jhlite-icons-embedded.css b/src/main/glyph/css/jhlite-icons-embedded.css index cb1701b9b17..fd765df28d3 100644 --- a/src/main/glyph/css/jhlite-icons-embedded.css +++ b/src/main/glyph/css/jhlite-icons-embedded.css @@ -1,14 +1,16 @@ @font-face { font-family: 'jhlite-icons'; src: url('../font/jhlite-icons.eot?57255817'); - src: url('../font/jhlite-icons.eot?57255817#iefix') format('embedded-opentype'), + src: + url('../font/jhlite-icons.eot?57255817#iefix') format('embedded-opentype'), url('../font/jhlite-icons.svg?57255817#jhlite-icons') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'jhlite-icons'; - src: url('data:application/octet-stream;base64,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') + src: + url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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') format('truetype'); diff --git a/src/main/glyph/css/jhlite-icons.css b/src/main/glyph/css/jhlite-icons.css index 46bacc39221..7abd03e8788 100644 --- a/src/main/glyph/css/jhlite-icons.css +++ b/src/main/glyph/css/jhlite-icons.css @@ -1,9 +1,12 @@ @font-face { font-family: 'jhlite-icons'; src: url('../font/jhlite-icons.eot?43345743'); - src: url('../font/jhlite-icons.eot?43345743#iefix') format('embedded-opentype'), - url('../font/jhlite-icons.woff2?43345743') format('woff2'), url('../font/jhlite-icons.woff?43345743') format('woff'), - url('../font/jhlite-icons.ttf?43345743') format('truetype'), url('../font/jhlite-icons.svg?43345743#jhlite-icons') format('svg'); + src: + url('../font/jhlite-icons.eot?43345743#iefix') format('embedded-opentype'), + url('../font/jhlite-icons.woff2?43345743') format('woff2'), + url('../font/jhlite-icons.woff?43345743') format('woff'), + url('../font/jhlite-icons.ttf?43345743') format('truetype'), + url('../font/jhlite-icons.svg?43345743#jhlite-icons') format('svg'); font-weight: normal; font-style: normal; } diff --git a/src/main/resources/generator/server/springboot/mvc/web/resources/404.html b/src/main/resources/generator/server/springboot/mvc/web/resources/404.html index 2742eeb2f88..7266111587e 100644 --- a/src/main/resources/generator/server/springboot/mvc/web/resources/404.html +++ b/src/main/resources/generator/server/springboot/mvc/web/resources/404.html @@ -1,4 +1,4 @@ - + @@ -23,7 +23,9 @@ border: 1px solid #b3b3b3; border-radius: 4px; margin: 0 auto; - box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff; + box-shadow: + 0 1px 10px #a7a7a7, + inset 0 1px 0 #fff; background: #fcfcfc; } diff --git a/src/main/webapp/app/common/primary/theme-button/ThemeButton.vue b/src/main/webapp/app/common/primary/theme-button/ThemeButton.vue index f6eb79263a4..b6da9913898 100644 --- a/src/main/webapp/app/common/primary/theme-button/ThemeButton.vue +++ b/src/main/webapp/app/common/primary/theme-button/ThemeButton.vue @@ -56,7 +56,9 @@ height: calc(var(--jhlite-element-size) * 0.4); width: calc(var(--jhlite-element-size) * 0.4); transform: translateX(0); - transition: transform 0.3s ease, background-color 0.5s ease; + transition: + transform 0.3s ease, + background-color 0.5s ease; } .jhlite-theme-switch_toggle-checked { diff --git a/src/main/webapp/app/module/domain/landscape/Landscape.ts b/src/main/webapp/app/module/domain/landscape/Landscape.ts index 2090c887dd4..342e84d9b8b 100644 --- a/src/main/webapp/app/module/domain/landscape/Landscape.ts +++ b/src/main/webapp/app/module/domain/landscape/Landscape.ts @@ -18,7 +18,10 @@ export class Landscape { private readonly properties: ModulePropertyDefinition[]; private readonly memoizedSelectionElements = new Memoizer(); - private constructor(private readonly state: LandscapeState, private readonly projections: LevelsProjections) { + private constructor( + private readonly state: LandscapeState, + private readonly projections: LevelsProjections, + ) { this.modules = this.buildModules(); this.properties = this.buildProperties(); } @@ -40,7 +43,7 @@ export class Landscape { private buildSelectionTree(module: LandscapeModule): LandscapeSelectionTree { const dependenciesSelection = new LandscapeSelectionTree( - module.dependencies().flatMap(dependency => this.toSelectionElements(dependency)) + module.dependencies().flatMap(dependency => this.toSelectionElements(dependency)), ); return new LandscapeSelectionTree([this.moduleSelection(module, dependenciesSelection), ...dependenciesSelection.elements]); @@ -108,9 +111,9 @@ export class Landscape { this.projections .getStandaloneModule(selectedModule) .map(standaloneModule => - standaloneModule.dependencies().some(dependency => dependency.get() === selectedFeatureModule.slug().get()) + standaloneModule.dependencies().some(dependency => dependency.get() === selectedFeatureModule.slug().get()), ) - .orElse(false) + .orElse(false), ); } @@ -133,7 +136,7 @@ export class Landscape { private toFeatureSelectionWithIncompatibleModule( dependency: ModuleSlug, - incompatibleModule: LandscapeModule + incompatibleModule: LandscapeModule, ): LandscapeSelectionElement[] { const notSelectableDependencySelection: LandscapeSelectionElement = { slug: dependency, @@ -196,7 +199,7 @@ export class Landscape { standaloneModule .allModules() .flatMap(dependencyModules => dependencyModules.dependencies()) - .flatMap(moduleDependency => this.toSelectionElements(moduleDependency)) + .flatMap(moduleDependency => this.toSelectionElements(moduleDependency)), ) .orElse([]); } @@ -245,7 +248,7 @@ export class Landscape { private nestedSelectedDependantElements(element: LandscapeElementId): LandscapeElementId[] { const selectedDependantElements = this.getAllDependantModules(element).filter(dependantElement => - this.isSelectedModuleOrFeature(dependantElement) + this.isSelectedModuleOrFeature(dependantElement), ); return [ @@ -283,8 +286,8 @@ export class Landscape { private buildProperties(): ModulePropertyDefinition[] { const deduplicatedProperties = Array.from( new Map( - this.state.selectedModules.flatMap(module => this.toPropertiesDefinitions(module)).map(property => [property.key, property]) - ).values() + this.state.selectedModules.flatMap(module => this.toPropertiesDefinitions(module)).map(property => [property.key, property]), + ).values(), ); return deduplicatedProperties.sort((first, second) => first.order - second.order); @@ -404,7 +407,10 @@ export class Landscape { } class LandscapeState { - constructor(public readonly appliedModules: ModuleId[], public readonly selectedModules: ModuleId[]) {} + constructor( + public readonly appliedModules: ModuleId[], + public readonly selectedModules: ModuleId[], + ) {} public isApplied(module: ModuleId): boolean { return this.isModuleIn(module, this.appliedModules); @@ -486,13 +492,13 @@ class LevelsProjections { .flatMap(level => level.elements) .filter(element => element instanceof LandscapeFeature) .map(feature => feature as LandscapeFeature) - .map(feature => [feature.slugString(), feature]) + .map(feature => [feature.slugString(), feature]), ); } private buildModuleFeatures(): Map { return new Map( - Array.from(this.features.values()).flatMap(feature => feature.allModules().map(module => [module.slugString(), feature])) + Array.from(this.features.values()).flatMap(feature => feature.allModules().map(module => [module.slugString(), feature])), ); } @@ -501,7 +507,7 @@ class LevelsProjections { levels .flatMap(level => level.elements) .flatMap(landscapeElement => landscapeElement.allModules()) - .map(module => [module.slugString(), module]) + .map(module => [module.slugString(), module]), ); } @@ -509,7 +515,7 @@ class LevelsProjections { return this.memoizedDependantModules.get(element.get(), () => Array.from(this.standaloneModules.values()) .filter(standaloneModule => standaloneModule.dependencies().some(dependency => dependency.get() === element.get())) - .map(module => module.slug()) + .map(module => module.slug()), ); } diff --git a/src/main/webapp/app/module/domain/landscape/LandscapeFeature.ts b/src/main/webapp/app/module/domain/landscape/LandscapeFeature.ts index 9dbe256ba8b..2c2af0aeaea 100644 --- a/src/main/webapp/app/module/domain/landscape/LandscapeFeature.ts +++ b/src/main/webapp/app/module/domain/landscape/LandscapeFeature.ts @@ -3,7 +3,10 @@ import { LandscapeFeatureSlug } from './LandscapeFeatureSlug'; import { LandscapeElement } from './LandscapeElement'; export class LandscapeFeature implements LandscapeElement { - constructor(private readonly featureSlug: LandscapeFeatureSlug, public readonly modules: LandscapeModule[]) {} + constructor( + private readonly featureSlug: LandscapeFeatureSlug, + public readonly modules: LandscapeModule[], + ) {} public slugString(): string { return this.slug().get(); diff --git a/src/main/webapp/app/module/domain/landscape/LandscapeModule.ts b/src/main/webapp/app/module/domain/landscape/LandscapeModule.ts index 7f6c2a0bdca..2272a1e73af 100644 --- a/src/main/webapp/app/module/domain/landscape/LandscapeModule.ts +++ b/src/main/webapp/app/module/domain/landscape/LandscapeModule.ts @@ -28,7 +28,10 @@ const INITIAL_CONTEXT: LandscapeModuleContext = { }; export class LandscapeModule implements LandscapeElement { - private constructor(private readonly information: LandscapeModuleInformation, private readonly context: LandscapeModuleContext) {} + private constructor( + private readonly information: LandscapeModuleInformation, + private readonly context: LandscapeModuleContext, + ) {} public static initialState(information: LandscapeModuleInformation): LandscapeModule { return new LandscapeModule(information, INITIAL_CONTEXT); diff --git a/src/main/webapp/app/module/primary/landscape/Landscape.component.ts b/src/main/webapp/app/module/primary/landscape/Landscape.component.ts index fdd85d9da2c..7c95a5ad70f 100644 --- a/src/main/webapp/app/module/primary/landscape/Landscape.component.ts +++ b/src/main/webapp/app/module/primary/landscape/Landscape.component.ts @@ -145,18 +145,18 @@ export default defineComponent({ dependantElementSlug: module.slug(), dependencyElement: landscapeElements.value.get(dependency.get())!, dependencyElementSlug: dependency, - }) + }), ); }; const buildConnectorsSize = (): LandscapeConnectorsSize => ({ width: Math.max.apply( null, - landscapeConnectors.value.flatMap(connector => connector.positions).map(position => position.x) + landscapeConnectors.value.flatMap(connector => connector.positions).map(position => position.x), ), height: Math.max.apply( null, - landscapeConnectors.value.flatMap(connector => connector.positions).map(position => position.y) + landscapeConnectors.value.flatMap(connector => connector.positions).map(position => position.y), ), }); @@ -333,7 +333,7 @@ export default defineComponent({ const missingMandatoryProperty = () => { return selectedModulesProperties().some( - property => property.mandatory && empty(moduleParametersValues.value.get(property.key)) && empty(property.defaultValue) + property => property.mandatory && empty(moduleParametersValues.value.get(property.key)) && empty(property.defaultValue), ); }; diff --git a/src/main/webapp/app/module/primary/landscape/LandscapeConnector.ts b/src/main/webapp/app/module/primary/landscape/LandscapeConnector.ts index 0ac81d67430..4f4682ecc26 100644 --- a/src/main/webapp/app/module/primary/landscape/LandscapeConnector.ts +++ b/src/main/webapp/app/module/primary/landscape/LandscapeConnector.ts @@ -13,7 +13,7 @@ export class LandscapeConnector { constructor( public readonly positions: LandscapeConnectorPosition[], public readonly startingElement: LandscapeElementId, - public readonly endingElement: LandscapeElementId + public readonly endingElement: LandscapeElementId, ) { this.points = this.buildPoints(); this.path = this.buildCurvedPath(); @@ -106,6 +106,6 @@ export const buildConnector = (parameters: BuildConnectorsParameters): Landscape return new LandscapeConnector( [dependencyStartingPoint, dependencySpacer, dependantSpacer, dependantStartingPoint], parameters.dependantElementSlug, - parameters.dependencyElementSlug + parameters.dependencyElementSlug, ); }; diff --git a/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatch.ts b/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatch.ts index c8cb9c54ee9..369255891ff 100644 --- a/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatch.ts +++ b/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatch.ts @@ -7,7 +7,7 @@ export class ComponentModule { public readonly description: string, public readonly properties: ModulePropertyDefinition[], public readonly tags: string[], - public readonly normalizedContent: string + public readonly normalizedContent: string, ) {} static from(module: Module): ComponentModule { diff --git a/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatchCategory.ts b/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatchCategory.ts index cde27ed6345..23e72c498de 100644 --- a/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatchCategory.ts +++ b/src/main/webapp/app/module/primary/modules-patch/ComponentModulePatchCategory.ts @@ -2,12 +2,15 @@ import { Category } from '@/module/domain/Category'; import { ComponentModule } from './ComponentModulePatch'; export class ComponentModuleCategory { - private constructor(public readonly name: string, public readonly modules: ComponentModule[]) {} + private constructor( + public readonly name: string, + public readonly modules: ComponentModule[], + ) {} static from(category: Category): ComponentModuleCategory { return new ComponentModuleCategory( category.name, - category.modules.map(module => ComponentModule.from(module)) + category.modules.map(module => ComponentModule.from(module)), ); } } diff --git a/src/main/webapp/app/module/primary/modules-patch/ComponentModulesPatch.ts b/src/main/webapp/app/module/primary/modules-patch/ComponentModulesPatch.ts index f3724f16280..17c36aabd5a 100644 --- a/src/main/webapp/app/module/primary/modules-patch/ComponentModulesPatch.ts +++ b/src/main/webapp/app/module/primary/modules-patch/ComponentModulesPatch.ts @@ -2,12 +2,15 @@ import { Modules } from '@/module/domain/Modules'; import { ComponentModuleCategory } from './ComponentModulePatchCategory'; export class ComponentModules { - private constructor(public readonly categories: ComponentModuleCategory[], public readonly modulesCount: number) {} + private constructor( + public readonly categories: ComponentModuleCategory[], + public readonly modulesCount: number, + ) {} static fromModules(modules: Modules): ComponentModules { return new ComponentModules( modules.categories.map(category => ComponentModuleCategory.from(category)), - modules.modulesCount() + modules.modulesCount(), ); } diff --git a/src/main/webapp/app/module/secondary/LocalWindowThemeRepository.ts b/src/main/webapp/app/module/secondary/LocalWindowThemeRepository.ts index beb7f14ca4a..0d229293a02 100644 --- a/src/main/webapp/app/module/secondary/LocalWindowThemeRepository.ts +++ b/src/main/webapp/app/module/secondary/LocalWindowThemeRepository.ts @@ -1,10 +1,13 @@ import { ThemeRepository } from '../domain/ThemeRepository'; -import { ThemePreference as Theme, getMediaPreference } from './GetMediaPreference'; +import { getMediaPreference, ThemePreference as Theme } from './GetMediaPreference'; const THEME_STORAGE_KEY = 'theme'; export class LocalWindowThemeRepository implements ThemeRepository { - constructor(private readonly win: Window, private readonly storage: Storage) {} + constructor( + private readonly win: Window, + private readonly storage: Storage, + ) {} get(): Theme { return (this.storage.getItem(THEME_STORAGE_KEY) as Theme) || getMediaPreference(this.win); diff --git a/src/main/webapp/app/module/secondary/RestModulesRepository.ts b/src/main/webapp/app/module/secondary/RestModulesRepository.ts index 458a07d7b2e..77419fe22fb 100644 --- a/src/main/webapp/app/module/secondary/RestModulesRepository.ts +++ b/src/main/webapp/app/module/secondary/RestModulesRepository.ts @@ -57,7 +57,7 @@ export class RestModulesRepository implements ModulesRepository { const mapToProject = (response: AxiosResponse): Project => ({ filename: Optional.ofUndefinable(response.headers['x-suggested-filename']).orElseThrow( - () => new Error('Impossible to download file without filename') + () => new Error('Impossible to download file without filename'), ), content: response.data, }); diff --git a/src/main/webapp/content/css/custom.css b/src/main/webapp/content/css/custom.css index 61b7d921d54..8773c5f27c0 100644 --- a/src/main/webapp/content/css/custom.css +++ b/src/main/webapp/content/css/custom.css @@ -238,7 +238,8 @@ input[type='radio'] { } .shadow-primary { --bs-bg-opacity: 0.2; - box-shadow: 0.2em -0.2em rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)), + box-shadow: + 0.2em -0.2em rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)), 0.1em 0.1em 0.3em 0.1em rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; } diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 15893e0d15a..fda21e14006 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -1,4 +1,4 @@ - + diff --git a/src/test/javascript/spec/common/domain/Optional.spec.ts b/src/test/javascript/spec/common/domain/Optional.spec.ts index 026e2acaa8e..43a57c37d49 100644 --- a/src/test/javascript/spec/common/domain/Optional.spec.ts +++ b/src/test/javascript/spec/common/domain/Optional.spec.ts @@ -1,5 +1,5 @@ import { Optional } from '@/common/domain/Optional'; -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('Optional', () => { describe('Empty check', () => { @@ -27,7 +27,7 @@ describe('Optional', () => { expect( Optional.empty() .map(dummy => dummy) - .isEmpty() + .isEmpty(), ).toBe(true); }); @@ -35,7 +35,7 @@ describe('Optional', () => { expect( Optional.of('value') .map(value => 'beer ' + value) - .orElse('dummy') + .orElse('dummy'), ).toBe('beer value'); }); }); @@ -45,7 +45,7 @@ describe('Optional', () => { expect( Optional.empty() .filter(() => true) - .isEmpty() + .isEmpty(), ).toBe(true); }); @@ -53,7 +53,7 @@ describe('Optional', () => { expect( Optional.of('value') .filter(value => value.indexOf('v') !== -1) - .orElse('dummy') + .orElse('dummy'), ).toBe('value'); }); @@ -61,7 +61,7 @@ describe('Optional', () => { expect( Optional.of('value') .filter(() => false) - .orElse('other') + .orElse('other'), ).toBe('other'); }); }); @@ -129,7 +129,7 @@ describe('Optional', () => { expect( Optional.of('beer') .flatMap(value => Optional.of('my ' + value)) - .orElse('dummy') + .orElse('dummy'), ).toBe('my beer'); }); }); diff --git a/src/test/javascript/spec/common/secondary/EmitterStub.fixture.ts b/src/test/javascript/spec/common/secondary/EmitterStub.fixture.ts index f47f3269abe..facf8d8cac8 100644 --- a/src/test/javascript/spec/common/secondary/EmitterStub.fixture.ts +++ b/src/test/javascript/spec/common/secondary/EmitterStub.fixture.ts @@ -8,4 +8,4 @@ interface EmitterStub extends Emitter { export const stubEmitter = (): EmitterStub => ({ emit: sinon.stub(), - } as EmitterStub); + }) as EmitterStub; diff --git a/src/test/javascript/spec/common/secondary/alert/MittAlertBus.spec.ts b/src/test/javascript/spec/common/secondary/alert/MittAlertBus.spec.ts index 0c855554454..73dc842a068 100644 --- a/src/test/javascript/spec/common/secondary/alert/MittAlertBus.spec.ts +++ b/src/test/javascript/spec/common/secondary/alert/MittAlertBus.spec.ts @@ -2,7 +2,7 @@ import sinon, { SinonStub } from 'sinon'; import { Emitter } from 'mitt'; import { MittAlertBus } from '@/common/secondary/alert/MittAlertBus'; import { AlertType } from '@/common/secondary/alert/AlertType'; -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; interface EmitterStub extends Emitter { emit: SinonStub; @@ -11,7 +11,7 @@ interface EmitterStub extends Emitter { const stubEmitter = (): EmitterStub => ({ emit: sinon.stub(), - } as EmitterStub); + }) as EmitterStub; describe('MittAlertBus', () => { it('should emit success', () => { diff --git a/src/test/javascript/spec/http/AxiosHttpStub.ts b/src/test/javascript/spec/http/AxiosHttpStub.ts index 2f378d11b50..0e762353fe7 100644 --- a/src/test/javascript/spec/http/AxiosHttpStub.ts +++ b/src/test/javascript/spec/http/AxiosHttpStub.ts @@ -14,9 +14,9 @@ export const stubAxiosHttp = (): AxiosHttpStub => post: sinon.stub(), delete: sinon.stub(), put: sinon.stub(), - } as AxiosHttpStub); + }) as AxiosHttpStub; export const dataBackendResponse = (data: T): AxiosHttpResponse => ({ data, - } as AxiosHttpResponse); + }) as AxiosHttpResponse; diff --git a/src/test/javascript/spec/http/AxiosStub.ts b/src/test/javascript/spec/http/AxiosStub.ts index 9b9d2cc356c..ce73e6eb2d6 100644 --- a/src/test/javascript/spec/http/AxiosStub.ts +++ b/src/test/javascript/spec/http/AxiosStub.ts @@ -14,9 +14,9 @@ export const stubAxiosInstance = (): AxiosStubInstance => put: sinon.stub(), post: sinon.stub(), delete: sinon.stub(), - } as AxiosStubInstance); + }) as AxiosStubInstance; export const dataAxiosResponse = (data: T): AxiosResponse => ({ data, - } as AxiosResponse); + }) as AxiosResponse; diff --git a/src/test/javascript/spec/module/domain/ModuleParameters.fixture.ts b/src/test/javascript/spec/module/domain/ModuleParameters.fixture.ts index 1e81cdfd1c6..cf2cf155e10 100644 --- a/src/test/javascript/spec/module/domain/ModuleParameters.fixture.ts +++ b/src/test/javascript/spec/module/domain/ModuleParameters.fixture.ts @@ -14,4 +14,4 @@ export const stubModuleParametersRepository = (): ModuleParametersRepositoryStub storeCurrentFolderPath: sinon.stub(), get: sinon.stub(), getCurrentFolderPath: sinon.stub(), - } as ModuleParametersRepositoryStub); + }) as ModuleParametersRepositoryStub; diff --git a/src/test/javascript/spec/module/domain/Modules.fixture.ts b/src/test/javascript/spec/module/domain/Modules.fixture.ts index 9f6c933400e..aec8b1e73f6 100644 --- a/src/test/javascript/spec/module/domain/Modules.fixture.ts +++ b/src/test/javascript/spec/module/domain/Modules.fixture.ts @@ -28,7 +28,7 @@ export const stubModulesRepository = (): ModulesRepositoryStub => history: sinon.stub(), format: sinon.stub(), download: sinon.stub(), - } as ModulesRepositoryStub); + }) as ModulesRepositoryStub; export const applicationBaseNamePropertyDefinition = (): ModulePropertyDefinition => ({ type: 'STRING', diff --git a/src/test/javascript/spec/module/domain/ProjectFolders.fixture.ts b/src/test/javascript/spec/module/domain/ProjectFolders.fixture.ts index 810f996a122..9814fda8299 100644 --- a/src/test/javascript/spec/module/domain/ProjectFolders.fixture.ts +++ b/src/test/javascript/spec/module/domain/ProjectFolders.fixture.ts @@ -8,4 +8,4 @@ export interface ProjectFoldersRepositoryStub extends ProjectFoldersRepository { export const stubProjectFoldersRepository = (): ProjectFoldersRepositoryStub => ({ get: sinon.stub(), - } as ProjectFoldersRepositoryStub); + }) as ProjectFoldersRepositoryStub; diff --git a/src/test/javascript/spec/module/domain/landscape/Landscape.fixture.ts b/src/test/javascript/spec/module/domain/landscape/Landscape.fixture.ts index 449c31383e0..f9681ff2ddf 100644 --- a/src/test/javascript/spec/module/domain/landscape/Landscape.fixture.ts +++ b/src/test/javascript/spec/module/domain/landscape/Landscape.fixture.ts @@ -29,7 +29,7 @@ export const defaultLandscape = (): Landscape => mandatoryBooleanPropertyDefinitionWithoutDefault(), mandatoryBooleanPropertyDefinitionWithDefault(), ], - [] + [], ), initialModule('prettier', 'Add prettier', [applicationBaseNamePropertyDefinition()], []), ], @@ -84,7 +84,7 @@ const initialModule = ( slug: string, operation: string, properties: ModulePropertyDefinition[], - dependencies: LandscapeElementId[] + dependencies: LandscapeElementId[], ): LandscapeModule => LandscapeModule.initialState({ slug: moduleSlug(slug), diff --git a/src/test/javascript/spec/module/primary/landscape/LandscapeComponent.spec.ts b/src/test/javascript/spec/module/primary/landscape/LandscapeComponent.spec.ts index 4adf2e295d2..57c0d3cc36e 100644 --- a/src/test/javascript/spec/module/primary/landscape/LandscapeComponent.spec.ts +++ b/src/test/javascript/spec/module/primary/landscape/LandscapeComponent.spec.ts @@ -12,7 +12,7 @@ import { ModulesRepositoryStub, projectHistoryWithInit, stubModulesRepository } import { ProjectFoldersRepositoryStub, stubProjectFoldersRepository } from '../../domain/ProjectFolders.fixture'; import { ModuleParametersRepositoryStub, stubModuleParametersRepository } from '../../domain/ModuleParameters.fixture'; import { stubWindow } from '../GlobalWindow.fixture'; -import { describe, it, expect, beforeAll, vi } from 'vitest'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; import { BodyCursorUpdater } from '@/common/primary/cursor/BodyCursorUpdater'; import { LandscapeScroller } from '@/module/primary/landscape/LandscapeScroller'; import { ModuleParametersRepository } from '@/module/domain/ModuleParametersRepository'; @@ -30,7 +30,7 @@ const stubBodyCursorUpdater = (): BodyCursorUpdaterStub => ({ set: sinon.stub(), reset: sinon.stub(), - } as BodyCursorUpdaterStub); + }) as BodyCursorUpdaterStub; const stubApplicationListener = (): ApplicationListenerStub => ({ addEventListener: sinon.stub(), @@ -924,7 +924,7 @@ const assertConnectorsCount = (wrapper: VueWrapper, cssClass: string, count: num wrapper .find(wrappedElement('landscape-connectors')) .findAll('path') - .filter(line => line.classes().includes(cssClass)).length + .filter(line => line.classes().includes(cssClass)).length, ).toBe(count); }; diff --git a/src/test/javascript/spec/module/primary/landscape/LandscapeScroller.spec.ts b/src/test/javascript/spec/module/primary/landscape/LandscapeScroller.spec.ts index 5252a437ebf..5985f602dc0 100644 --- a/src/test/javascript/spec/module/primary/landscape/LandscapeScroller.spec.ts +++ b/src/test/javascript/spec/module/primary/landscape/LandscapeScroller.spec.ts @@ -8,7 +8,7 @@ interface HTMLElementStub extends HTMLElement { const stubHtmlElement = (): HTMLElementStub => ({ scroll: sinon.stub(), - } as HTMLElementStub); + }) as HTMLElementStub; describe('LandscapeScroller', () => { it('should scroll', () => { diff --git a/src/test/javascript/spec/module/primary/modules-patch/ModulesPatchComponent.spec.ts b/src/test/javascript/spec/module/primary/modules-patch/ModulesPatchComponent.spec.ts index 82a413fcf99..a38bbe324dc 100644 --- a/src/test/javascript/spec/module/primary/modules-patch/ModulesPatchComponent.spec.ts +++ b/src/test/javascript/spec/module/primary/modules-patch/ModulesPatchComponent.spec.ts @@ -15,7 +15,7 @@ import { ProjectFoldersRepository } from '@/module/domain/ProjectFoldersReposito import { ProjectFoldersRepositoryStub, stubProjectFoldersRepository } from '../../domain/ProjectFolders.fixture'; import { ModuleParametersRepositoryStub, stubModuleParametersRepository } from '../../domain/ModuleParameters.fixture'; import { stubWindow } from '../GlobalWindow.fixture'; -import { describe, it, expect, beforeAll, vi } from 'vitest'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; import { Modules } from '@/module/domain/Modules'; import { Module } from '@/module/domain/Module'; import { ModuleParametersRepository } from '@/module/domain/ModuleParametersRepository'; @@ -584,7 +584,7 @@ describe('Modules', () => { name: 'Three filters', modules: tags.map(makeTaggedModule), }, - ]) + ]), ); const wrapper = wrap({ modules: repository }); await flushForm(wrapper); diff --git a/src/test/javascript/spec/module/secondary/RestModulesRepository.spec.ts b/src/test/javascript/spec/module/secondary/RestModulesRepository.spec.ts index ecf5388f450..d86acc94588 100644 --- a/src/test/javascript/spec/module/secondary/RestModulesRepository.spec.ts +++ b/src/test/javascript/spec/module/secondary/RestModulesRepository.spec.ts @@ -10,7 +10,7 @@ import { RestLandscapeFeature } from '@/module/secondary/RestLandscapeFeature'; import { ModuleSlug } from '@/module/domain/ModuleSlug'; import { RestModulePropertyDefinition } from '@/module/secondary/RestModulePropertyDefinition'; import { defaultLandscape } from '../domain/landscape/Landscape.fixture'; -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('Rest modules repository', () => { it('Should list modules using axios', async () => { @@ -215,7 +215,7 @@ const landscapeModule = ( slug: string, operation: string, properties: RestModulePropertiesDefinitions, - dependencies?: RestLandscapeDependency[] + dependencies?: RestLandscapeDependency[], ): RestLandscapeModule => ({ type: 'MODULE', slug, From 7becefce72c8089bb99b1ec335ef354df8a90249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sat, 8 Jul 2023 21:26:56 +0200 Subject: [PATCH 3/5] Use prettier 3 in generated applications --- src/main/resources/generator/dependencies/common/package.json | 4 ++-- src/main/resources/generator/prettier/.prettierrc.mustache | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/generator/dependencies/common/package.json b/src/main/resources/generator/dependencies/common/package.json index 6a881e67874..d7a4a6951b9 100644 --- a/src/main/resources/generator/dependencies/common/package.json +++ b/src/main/resources/generator/dependencies/common/package.json @@ -15,14 +15,14 @@ "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-cypress": "2.13.3", "eslint-plugin-import": "2.27.5", - "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", "jasmine-core": "5.0.1", "jest": "29.6.1", "lint-staged": "13.2.3", "node": "18.16.1", "npm": "9.8.0", - "prettier": "2.8.8", + "prettier": "3.0.0", "prettier-plugin-java": "2.2.0", "prettier-plugin-packagejson": "2.4.5", "ts-jest": "29.1.1", diff --git a/src/main/resources/generator/prettier/.prettierrc.mustache b/src/main/resources/generator/prettier/.prettierrc.mustache index eb46c50a5e3..48ffe7db9f9 100644 --- a/src/main/resources/generator/prettier/.prettierrc.mustache +++ b/src/main/resources/generator/prettier/.prettierrc.mustache @@ -6,6 +6,10 @@ tabWidth: {{indentSize}} useTabs: false endOfLine: "{{endOfLine}}" +plugins: + - '@prettier/plugin-xml' + - prettier-plugin-java + # js and ts rules: arrowParens: avoid From 5baf26270060706cd6873282577998e5973734bc Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 12 Jul 2023 19:13:54 +0200 Subject: [PATCH 4/5] Add config files to prettier processing --- .lintstagedrc.js | 5 ++--- package.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.lintstagedrc.js b/.lintstagedrc.js index d1957522cb5..8d42b71fd57 100644 --- a/.lintstagedrc.js +++ b/.lintstagedrc.js @@ -2,7 +2,6 @@ module.exports = { '{src/test/javascript,src/main/webapp}/**/*.{js,ts,tsx,vue}': ['eslint --fix'], 'src/main/style/**/*.{css,scss}': ['stylelint --fix'], 'src/main/style/**/*.pug': ['pug-lint'], - '{{src/**/,}*.{md,json,yml,html,vue,java,xml},*.{js,ts},src/{main/webapp,main/glyph,test/javascript}/**/*.{css,scss}}': [ - 'prettier --write', - ], + '{{src/**/,}*.{md,json,yml,html,vue,java,xml},*.{js,ts},.github/**/*.yml,documentation/**/*.md,src/{main/webapp,main/glyph,test/javascript}/**/*.{css,scss}}': + ['prettier --write'], }; diff --git a/package.json b/package.json index ab3b24105be..bcc7e0f6771 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "prepare": "husky install", "prettier:check": "npm run prettier:run -- --check", "prettier:format": "npm run prettier:run -- --write", - "prettier:run": "prettier \"{{src/**/,}*.{md,json,yml,html,vue,java,xml},*.{js,ts},src/{main/glyph,main/webapp,test/javascript}/**/*.{css,scss}}\"", + "prettier:run": "prettier \"{{src/**/,}*.{md,json,yml,html,vue,java,xml},*.{js,ts},.github/**/*.yml,documentation/**/*.md,src/{main/glyph,main/webapp,test/javascript}/**/*.{css,scss}}\"", "preview": "vite preview", "start": "npm run dev", "test": "npm run vitest -- run --coverage --", From a956c8c758440875a3cbf8208e8ad8562a9e16fc Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 12 Jul 2023 19:14:44 +0200 Subject: [PATCH 5/5] Apply prettier on files --- .github/dependabot.yml | 4 +- .github/workflows/docker-image-publish.yml | 4 +- .github/workflows/triage.yml | 2 +- documentation/module-creation.md | 61 ++++++++++++---------- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1a013df2cd8..b4decc5758e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -67,8 +67,8 @@ updates: labels: - 'area: dependencies' ignore: - - dependency-name: "node" - versions: ["15.x", "17.x", "19.x", "20.x"] + - dependency-name: 'node' + versions: ['15.x', '17.x', '19.x', '20.x'] - package-ecosystem: 'npm' directory: '/src/main/resources/generator/dependencies/vue' schedule: diff --git a/.github/workflows/docker-image-publish.yml b/.github/workflows/docker-image-publish.yml index fbdb525b75d..192748bcd2a 100644 --- a/.github/workflows/docker-image-publish.yml +++ b/.github/workflows/docker-image-publish.yml @@ -3,8 +3,8 @@ on: workflow_dispatch: push: # Avoid building on main branch - see https://github.com/jhipster/jhipster-lite/issues/5341 -# branches: -# - main + # branches: + # - main # Publish semver tags as releases. tags: - 'v*.*.*' diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 4fb5ec9c249..7b5b1f75c34 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -11,5 +11,5 @@ jobs: - name: initial labeling uses: andymckay/labeler@master with: - add-labels: "area: triage" + add-labels: 'area: triage' ignore-if-labeled: true diff --git a/documentation/module-creation.md b/documentation/module-creation.md index 510a37d7523..3cbd2e14aca 100644 --- a/documentation/module-creation.md +++ b/documentation/module-creation.md @@ -1,11 +1,11 @@ # Creating a JHLite module -So you want to create a JHLite module? Great! +So you want to create a JHLite module? Great! For that you'll need to provide 2 main parts: -* `JHipsterModuleResource`: describe the module organization, it is used to generate the APIs; -* `JHipsterModule`: describe the changes done by the module. +- `JHipsterModuleResource`: describe the module organization, it is used to generate the APIs; +- `JHipsterModule`: describe the changes done by the module. You can start by the element you prefer but to create a `JHipsterModuleResource` you'll need to be able to build a `JHipsterModule`. @@ -13,7 +13,7 @@ You can start by the element you prefer but to create a `JHipsterModuleResource` In fact, you don't just need to create one `JHipsterModule`, you'll need a factory able to create them since each instance depends on the properties chosen by the users. -So, as this is the business of JHLite you probably want to create a `tech.jhipster.lite.generator.my_module.domain` package. And you can start with a simple test: +So, as this is the business of JHLite you probably want to create a `tech.jhipster.lite.generator.my_module.domain` package. And you can start with a simple test: ```java import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.*; @@ -27,6 +27,7 @@ import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties; @UnitTest class MyModuleFactoryTest { + private static final MyModuleFactory factory = new MyModuleFactory(); @Test @@ -38,19 +39,19 @@ class MyModuleFactoryTest { JHipsterModule module = factory.buildModule(properties); - assertThatModule(module) - .hasPrefixedFiles("src/main/java/com/jhipster/test/my_package", "Dummy.java"); + assertThatModule(module).hasPrefixedFiles("src/main/java/com/jhipster/test/my_package", "Dummy.java"); } } + ``` -A few things to note here: +A few things to note here: -* We are expecting to have a `buildModule(...)` method in `MyModuleFactory`; -* The `JHipsterModulesAssertions.assertThatModule(...)` will really apply the module to a project and give you a fluent API to ensure some operations; -* Even if the feedback loops are not perfect on that they should be short enough to allow a decent TDD implementation of the factory (on eclipse with [infinitest](https://infinitest.github.io/) feedbacks are under a second). +- We are expecting to have a `buildModule(...)` method in `MyModuleFactory`; +- The `JHipsterModulesAssertions.assertThatModule(...)` will really apply the module to a project and give you a fluent API to ensure some operations; +- Even if the feedback loops are not perfect on that they should be short enough to allow a decent TDD implementation of the factory (on eclipse with [infinitest](https://infinitest.github.io/) feedbacks are under a second). -So, now that we have a first test we can do a simple implementation: +So, now that we have a first test we can do a simple implementation: ```java import static tech.jhipster.lite.module.domain.JHipsterModule.*; @@ -69,11 +70,12 @@ public class MyModuleFactory { //@formatter:on } } + ``` This implementation will take a file from `src/main/resources/generator/my-module` and put it in the generated project. -The file is a template named `Dummy.java.mustache` and can contains some mustache placeholders: +The file is a template named `Dummy.java.mustache` and can contains some mustache placeholders: ```java package {{packageName}}.my_package; @@ -92,24 +94,26 @@ And this is it for this part of the documentation... Of course you can do a lot ### Dependency resolution -* In the `src/main/resources/generator/dependencies` folder, different files are maintained to handle the dependencies for different tools/frameworks such as docker, maven, angular etc. -* You can add the dependencies required for your new module in the respective files in the `dependencies` folder. -* The dependency versions are then automatically managed by the dependabot. +- In the `src/main/resources/generator/dependencies` folder, different files are maintained to handle the dependencies for different tools/frameworks such as docker, maven, angular etc. +- You can add the dependencies required for your new module in the respective files in the `dependencies` folder. +- The dependency versions are then automatically managed by the dependabot. ### Overview of Version files/folders in this dependencies folder -* **Docker versions** - * You can add the docker images required for your module in the `src/main/resources/generator/dependencies/Dockerfile` - * These dependencies are resolved using the [FileSystemDockerImagesReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/docker/FileSystemDockerImagesReader.java), an implementation of the `DockerImagesReader` bean to read from a local file. +- **Docker versions** -* **Java versions** - * You can add the java dependencies required for your module in the `src/main/resources/generator/dependencies/pom.xml` - * These dependencies are resolved using [FileSystemJavaDependenciesReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/javadependency/FileSystemJavaDependenciesReader.java), an implementation of the `JavaDependenciesReader` bean to read from a local file. + - You can add the docker images required for your module in the `src/main/resources/generator/dependencies/Dockerfile` + - These dependencies are resolved using the [FileSystemDockerImagesReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/docker/FileSystemDockerImagesReader.java), an implementation of the `DockerImagesReader` bean to read from a local file. -* **NPM versions** - * Common npm dependencies can be added in the `src/main/resources/generator/dependencies/common/package.json` - * Framework specific npm dependencies can be added in the `package.json` of the respective framework folders. For eg: `src/main/resources/generator/dependencies/react/package.json` - * These dependencies are resolved using [FileSystemNpmVersionReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/npm/FileSystemNpmVersionReader.java), an implementation of the `NpmVersionsReader` bean to read from a local file. +- **Java versions** + + - You can add the java dependencies required for your module in the `src/main/resources/generator/dependencies/pom.xml` + - These dependencies are resolved using [FileSystemJavaDependenciesReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/javadependency/FileSystemJavaDependenciesReader.java), an implementation of the `JavaDependenciesReader` bean to read from a local file. + +- **NPM versions** + - Common npm dependencies can be added in the `src/main/resources/generator/dependencies/common/package.json` + - Framework specific npm dependencies can be added in the `package.json` of the respective framework folders. For eg: `src/main/resources/generator/dependencies/react/package.json` + - These dependencies are resolved using [FileSystemNpmVersionReader](https://github.com/jhipster/jhipster-lite/blob/main/src/main/java/tech/jhipster/lite/module/infrastructure/secondary/npm/FileSystemNpmVersionReader.java), an implementation of the `NpmVersionsReader` bean to read from a local file. ## Creating JHipsterModuleResource @@ -138,9 +142,7 @@ To be used by JHLite, the `JHipsterModuleResource` needs to be a Spring bean so, class MyModuleModuleConfiguration { @Bean - JHipsterModuleResource myModule( - MyModuleApplicationService myModules - ) { + JHipsterModuleResource myModule(MyModuleApplicationService myModules) { return JHipsterModuleResource .builder() .slug(JHLiteModuleSlug.MY_MODULE) @@ -151,9 +153,10 @@ class MyModuleModuleConfiguration { .factory(myModules::buildModule); } } + ``` -In fact, you don't really have choices here, the `JHipsterModuleResource.builder()` is fluent and will only let you go to the next possible step. +In fact, you don't really have choices here, the `JHipsterModuleResource.builder()` is fluent and will only let you go to the next possible step. The most confusing one may be the last one `.factory(myModules::buildModule)` which is, in fact, a method called to build the module. For this to work, we'll need to add a simple orchestration class in `tech.jhipster.lite.generator.my_module.application`: