From b7c2d549d8937e5dccdcf7a06733dc0d5311ad5f Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Tue, 3 Oct 2023 08:20:58 -0300 Subject: [PATCH] move entities and enums to the java generator --- generators/base-core/generator.mts | 4 +- generators/base/api.d.mts | 5 +- .../__snapshots__/generator.spec.mts.snap | 18 + generators/java/command.mts | 19 + generators/java/entity-files.mts | 48 ++ generators/java/generator.mts | 50 +- generators/java/generator.spec.mts | 94 ++- .../field_validators.ejs | 0 .../domain/_persistClass_.java.jhi.ejs | 0 ...sistClass_.java.jhi.jakarta_validation.ejs | 2 +- .../domain/enumeration/_enumName_.java.ejs} | 0 .../domain/_persistClass_Test.java.ejs | 0 .../__snapshots__/generator.spec.mjs.snap | 551 ++++++++++++++++++ generators/server/entity-files.mjs | 59 +- generators/server/generator.spec.mjs | 18 + .../service/dto/_dtoClass_.java.ejs | 2 +- lib/internal/config-def.mts | 15 +- 17 files changed, 816 insertions(+), 69 deletions(-) create mode 100644 generators/java/entity-files.mts rename generators/{server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_ => java/templates/_global_partials_entity_}/field_validators.ejs (100%) rename generators/{server => java}/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs (100%) rename generators/{server => java}/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs (95%) rename generators/{server/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/Enum.java.ejs => java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs} (100%) rename generators/{server => java}/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs (100%) diff --git a/generators/base-core/generator.mts b/generators/base-core/generator.mts index 5fbc45056552..915debf791e4 100644 --- a/generators/base-core/generator.mts +++ b/generators/base-core/generator.mts @@ -290,7 +290,7 @@ export default class CoreGenerator extends YeomanGenerator [name, convertConfigToOption(name, def)])) + .concat(Object.entries(configs).map(([name, def]) => [name, convertConfigToOption(name, def)]) as any) .forEach(([optionName, optionDesc]) => { if (!optionDesc?.type || !optionDesc.scope || (common && optionDesc.scope === 'generator')) return; let optionValue; @@ -314,6 +314,8 @@ export default class CoreGenerator extends YeomanGenerator = { } ); +export type JHispterChoices = string[] | { value: string; name: string }[]; + export type JHipsterOption = SetOptional & { name?: string; scope?: 'storage' | 'blueprint' | 'control' | 'generator'; env?: string; + choices?: JHispterChoices; }; export type ValidationResult = { @@ -185,7 +188,7 @@ export type JHipsterArgumentConfig = SetOptional & { scope export type ConfigSpec = { description?: string; - choices?: string[] | { value: string; name: string }[]; + choices?: JHispterChoices; cli?: SetOptional; argument?: JHipsterArgumentConfig; diff --git a/generators/java/__snapshots__/generator.spec.mts.snap b/generators/java/__snapshots__/generator.spec.mts.snap index 72a6926b1fd7..a0eb8db9441e 100644 --- a/generators/java/__snapshots__/generator.spec.mts.snap +++ b/generators/java/__snapshots__/generator.spec.mts.snap @@ -2,14 +2,32 @@ exports[`generator - java with default config should match files snapshot 1`] = ` { + ".jhipster/Foo.json": { + "stateCleared": "modified", + }, ".yo-rc.json": { "stateCleared": "modified", }, "src/main/java/com/mycompany/myapp/GeneratedByJHipster.java": { "stateCleared": "modified", }, + "src/main/java/com/mycompany/myapp/domain/Foo.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/enumeration/MyEnum.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/enumeration/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/package-info.java": { + "stateCleared": "modified", + }, "src/main/java/com/mycompany/myapp/package-info.java": { "stateCleared": "modified", }, + "src/test/java/com/mycompany/myapp/domain/FooTest.java": { + "stateCleared": "modified", + }, } `; diff --git a/generators/java/command.mts b/generators/java/command.mts index da1894f3e8fb..d4e2588c613b 100644 --- a/generators/java/command.mts +++ b/generators/java/command.mts @@ -28,6 +28,25 @@ const command: JHipsterCommandDefinition = { packageInfoFile: { description: 'write package-info.java file for every package', type: Boolean, + default: true, + scope: 'generator', + hide: true, + }, + generateEntities: { + type: Boolean, + default: true, + scope: 'generator', + hide: true, + }, + useJakartaValidation: { + type: Boolean, + default: true, + scope: 'generator', + hide: true, + }, + generateEnums: { + type: Boolean, + default: true, scope: 'generator', hide: true, }, diff --git a/generators/java/entity-files.mts b/generators/java/entity-files.mts new file mode 100644 index 000000000000..81ba42e610a3 --- /dev/null +++ b/generators/java/entity-files.mts @@ -0,0 +1,48 @@ +/** + * Copyright 2013-2023 the original author or authors from the JHipster project. + * + * This file is part of the JHipster project, see https://www.jhipster.tech/ + * for more information. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { WriteFileSection } from '../base/api.mjs'; +import { javaMainPackageTemplatesBlock, javaTestPackageTemplatesBlock } from './support/index.mjs'; + +export const entityServerFiles: WriteFileSection = { + model: [ + javaMainPackageTemplatesBlock({ + templates: ['_entityPackage_/domain/_persistClass_.java.jhi'], + }), + ], + modelTestFiles: [ + javaTestPackageTemplatesBlock({ + templates: ['_entityPackage_/domain/_persistClass_Test.java'], + }), + ], + server: [ + javaMainPackageTemplatesBlock({ + condition: ctx => ctx.useJakartaValidation, + templates: ['_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation'], + }), + ], +}; + +export const enumFiles: WriteFileSection = { + enumFiles: [ + javaMainPackageTemplatesBlock({ + renameTo: (data, filepath) => filepath.replace('_enumName_', data.enumName), + templates: ['_entityPackage_/domain/enumeration/_enumName_.java'], + }), + ], +}; diff --git a/generators/java/generator.mts b/generators/java/generator.mts index 41c9e0afe22e..8c4d6b7b28ca 100644 --- a/generators/java/generator.mts +++ b/generators/java/generator.mts @@ -29,12 +29,17 @@ import { GenericSourceTypeDefinition } from '../base/tasks.mjs'; import command from './command.mjs'; import { JAVA_COMPATIBLE_VERSIONS } from '../generator-constants.mjs'; import { matchMainJavaFiles } from './support/package-info-transform.mjs'; +import { entityServerFiles, enumFiles } from './entity-files.mjs'; +import { getEnumInfo } from '../base-application/support/index.mjs'; export type ApplicationDefinition = GenericApplicationDefinition; export type GeneratorDefinition = BaseApplicationGeneratorDefinition; export default class JavaGenerator extends BaseApplicationGenerator { - packageInfoFile = true; + packageInfoFile!: boolean; + generateEntities!: boolean; + useJakartaValidation!: boolean; + generateEnums!: boolean; async beforeQueue() { if (!this.fromBlueprint) { @@ -49,7 +54,7 @@ export default class JavaGenerator extends BaseApplicationGenerator this.writing); } + get writingEntities() { + return this.asWritingEntitiesTaskGroup({ + async writeServerFiles({ application, entities }) { + if (!this.generateEntities) return; + + const { useJakartaValidation } = this; + for (const entity of entities.filter(entity => !entity.skipServer && !entity.builtIn)) { + await this.writeFiles({ + sections: entityServerFiles, + context: { ...application, ...entity, useJakartaValidation }, + }); + } + }, + + async writeEnumFiles({ application, entities }) { + if (!this.generateEnums || !this.generateEntities) return; + + for (const entity of entities.filter(entity => !entity.skipServer)) { + for (const field of entity.fields.filter(field => field.fieldIsEnum)) { + const enumInfo = { + ...getEnumInfo(field, (entity as any).clientRootFolder), + frontendAppName: (entity as any).frontendAppName, + packageName: application.packageName, + javaPackageSrcDir: application.javaPackageSrcDir, + entityJavaPackageFolder: (entity as any).entityJavaPackageFolder, + entityAbsolutePackage: (entity as any).entityAbsolutePackage || application.packageName, + }; + await this.writeFiles({ + sections: enumFiles, + context: enumInfo, + }); + } + } + }, + }); + } + + get [BaseApplicationGenerator.WRITING_ENTITIES]() { + return this.delegateTasksToBlueprint(() => this.writingEntities); + } + /** * Check if a supported Java is installed * diff --git a/generators/java/generator.spec.mts b/generators/java/generator.spec.mts index 4fda49efedc2..60d44040baa1 100644 --- a/generators/java/generator.spec.mts +++ b/generators/java/generator.spec.mts @@ -25,11 +25,103 @@ describe(`generator - ${generator}`, () => { describe('with default config', () => { before(async () => { - await helpers.runJHipster(GENERATOR_JAVA).withJHipsterConfig(); + await helpers.runJHipster(GENERATOR_JAVA).withJHipsterConfig({}, [ + { + name: 'Foo', + fields: [ + { fieldName: 'name', fieldType: 'String', fieldValidateRules: ['required'] }, + { fieldName: 'myEnum', fieldType: 'MyEnum', fieldValues: 'FRENCH,ENGLISH' }, + ], + }, + ]); }); it('should match files snapshot', () => { expect(result.getStateSnapshot()).toMatchSnapshot(); }); + + it('should generate entities containing jakarta', () => { + result.assertFileContent('src/main/java/com/mycompany/myapp/domain/Foo.java.jhi', 'jakarta'); + }); + + it('should write enum files', () => { + result.assertFile('src/main/java/com/mycompany/myapp/domain/enumeration/MyEnum.java'); + expect(Object.keys(result.getStateSnapshot('**/enumeration/**')).length).toBe(2); + }); + + it('should have options defaults set', () => { + expect(result.generator.generateEntities).toBe(true); + expect(result.generator.generateEnums).toBe(true); + expect(result.generator.useJakartaValidation).toBe(true); + }); + }); + + describe('with jakarta and enums disabled', () => { + before(async () => { + await helpers + .runJHipster(GENERATOR_JAVA) + .withJHipsterConfig({}, [ + { + name: 'Foo', + fields: [ + { fieldName: 'name', fieldType: 'String', fieldValidateRules: ['required'] }, + { fieldName: 'myEnum', fieldType: 'MyEnum', fieldValues: 'FRENCH,ENGLISH' }, + ], + }, + ]) + .withOptions({ useJakartaValidation: false, generateEnums: false }); + }); + + it('should generate entities not containing jakarta', () => { + result.assertNoFileContent('src/main/java/com/mycompany/myapp/domain/Foo.java.jhi', 'jakarta'); + }); + + it('should not write enum files', () => { + expect(Object.keys(result.getStateSnapshot('**/enumeration/**')).length).toBe(0); + }); + }); + + describe('with entities disabled', () => { + before(async () => { + await helpers + .runJHipster(GENERATOR_JAVA) + .withJHipsterConfig({}, [ + { + name: 'Foo', + fields: [ + { fieldName: 'name', fieldType: 'String', fieldValidateRules: ['required'] }, + { fieldName: 'myEnum', fieldType: 'MyEnum', fieldValues: 'FRENCH,ENGLISH' }, + ], + }, + ]) + .withOptions({ generateEntities: false }); + }); + + it('should not contain jakarta', () => { + result.assertNoFile('src/main/java/com/mycompany/myapp/domain/Foo.java.jhi'); + }); + + it('should not write enum files', () => { + expect(Object.keys(result.getStateSnapshot('**/enumeration/**')).length).toBe(0); + }); + }); + + describe('with custom properties values', () => { + before(async () => { + await helpers + .runJHipster(GENERATOR_JAVA) + .withJHipsterConfig({}) + .onGenerator(generator => { + generator.generateEntities = false; + generator.generateEnums = false; + generator.useJakartaValidation = false; + }); + }); + + it('should not override custom values', () => { + expect(result.generator.generateEntities).toBe(false); + expect(result.generator.generateEnums).toBe(false); + expect(result.generator.useJakartaValidation).toBe(false); + }); }); }); diff --git a/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/field_validators.ejs b/generators/java/templates/_global_partials_entity_/field_validators.ejs similarity index 100% rename from generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/field_validators.ejs rename to generators/java/templates/_global_partials_entity_/field_validators.ejs diff --git a/generators/server/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs b/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs similarity index 100% rename from generators/server/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs rename to generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs diff --git a/generators/server/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs b/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs similarity index 95% rename from generators/server/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs rename to generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs index 79ec4efff245..7487ff860b9e 100644 --- a/generators/server/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs +++ b/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jakarta_validation.ejs @@ -32,7 +32,7 @@ import jakarta.validation.constraints.*; <%_ for (const field of fields) { _%> <&_ if (fragment.field<%- field.fieldNameCapitalized %>AnnotationSection) { -&> <%_ if (field.fieldValidate === true) { -%> - <%- include('../_partials_entity_/field_validators', {field, reactive}); -%> + <%- include('/_global_partials_entity_/field_validators', {field, reactive}); -%> <%_ } _%> <&_ } -&> <%_ } -%> diff --git a/generators/server/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/Enum.java.ejs b/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs similarity index 100% rename from generators/server/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/Enum.java.ejs rename to generators/java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs diff --git a/generators/server/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs b/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs similarity index 100% rename from generators/server/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs rename to generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs diff --git a/generators/server/__snapshots__/generator.spec.mjs.snap b/generators/server/__snapshots__/generator.spec.mjs.snap index 74dcdfbd34d8..7a22445b4ae4 100644 --- a/generators/server/__snapshots__/generator.spec.mjs.snap +++ b/generators/server/__snapshots__/generator.spec.mjs.snap @@ -683,3 +683,554 @@ exports[`generator - server composing databaseType option no with session should }, } `; + +exports[`generator - server with entities should match files snapshot 1`] = ` +{ + ".devcontainer/Dockerfile": { + "stateCleared": "modified", + }, + ".devcontainer/devcontainer.json": { + "stateCleared": "modified", + }, + ".editorconfig": { + "stateCleared": "modified", + }, + ".gitattributes": { + "stateCleared": "modified", + }, + ".gitignore": { + "stateCleared": "modified", + }, + ".husky/pre-commit": { + "stateCleared": "modified", + }, + ".jhipster/Bar.json": { + "stateCleared": "modified", + }, + ".jhipster/Foo.json": { + "stateCleared": "modified", + }, + ".lintstagedrc.js": { + "stateCleared": "modified", + }, + ".mvn/jvm.config": { + "stateCleared": "modified", + }, + ".mvn/wrapper/maven-wrapper.jar": { + "stateCleared": "modified", + }, + ".mvn/wrapper/maven-wrapper.properties": { + "stateCleared": "modified", + }, + ".prettierignore": { + "stateCleared": "modified", + }, + ".prettierrc": { + "stateCleared": "modified", + }, + ".yo-rc.json": { + "stateCleared": "modified", + }, + "README.md": { + "stateCleared": "modified", + }, + "checkstyle.xml": { + "stateCleared": "modified", + }, + "mvnw": { + "stateCleared": "modified", + }, + "mvnw.cmd": { + "stateCleared": "modified", + }, + "package.json": { + "stateCleared": "modified", + }, + "pom.xml": { + "stateCleared": "modified", + }, + "sonar-project.properties": { + "stateCleared": "modified", + }, + "src/main/docker/app.yml": { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/dashboards/JVM.json": { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/dashboards/dashboard.yml": { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/datasources/datasource.yml": { + "stateCleared": "modified", + }, + "src/main/docker/jhipster-control-center.yml": { + "stateCleared": "modified", + }, + "src/main/docker/jib/entrypoint.sh": { + "stateCleared": "modified", + }, + "src/main/docker/monitoring.yml": { + "stateCleared": "modified", + }, + "src/main/docker/postgresql.yml": { + "stateCleared": "modified", + }, + "src/main/docker/prometheus/prometheus.yml": { + "stateCleared": "modified", + }, + "src/main/docker/services.yml": { + "stateCleared": "modified", + }, + "src/main/docker/sonar.yml": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/ApplicationWebXml.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/GeneratedByJHipster.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/JhipsterApp.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/aop/logging/LoggingAspect.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/aop/logging/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/ApplicationProperties.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/AsyncConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/CRLFLogConverter.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/CacheConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/Constants.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/DatabaseConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/DateTimeFormatConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/JacksonConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LiquibaseConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LocaleConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LoggingAspectConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LoggingConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/SecurityConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/SecurityJwtConfiguration.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/WebConfigurer.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/AbstractAuditingEntity.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/Authority.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/Bar.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/Foo.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/User.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/management/SecurityMetersService.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/management/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/AuthorityRepository.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/BarRepository.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/FooRepository.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/UserRepository.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/AuthoritiesConstants.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/DomainUserDetailsService.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/SecurityUtils.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/SpringSecurityAuditorAware.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/UserNotActivatedException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/EmailAlreadyUsedException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/InvalidPasswordException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/MailService.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/UserService.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/UsernameAlreadyUsedException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/AdminUserDTO.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/BarDTO.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/PasswordChangeDTO.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/UserDTO.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/BarMapper.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/EntityMapper.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/UserMapper.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/AccountResource.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/AuthenticateController.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/BarResource.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/FooResource.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/PublicUserResource.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/UserResource.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/BadRequestAlertException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/EmailAlreadyUsedException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/ErrorConstants.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslator.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/FieldErrorVM.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/InvalidPasswordException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/LoginAlreadyUsedException.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/package-info.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/KeyAndPasswordVM.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/LoginVM.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/ManagedUserVM.java": { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/package-info.java": { + "stateCleared": "modified", + }, + "src/main/resources/banner.txt": { + "stateCleared": "modified", + }, + "src/main/resources/config/application-dev.yml": { + "stateCleared": "modified", + }, + "src/main/resources/config/application-prod.yml": { + "stateCleared": "modified", + }, + "src/main/resources/config/application-tls.yml": { + "stateCleared": "modified", + }, + "src/main/resources/config/application.yml": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/changelog/20160926101210_added_entity_Foo.xml": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/changelog/20160926101211_added_entity_Bar.xml": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/authority.csv": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/user.csv": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/user_authority.csv": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/fake-data/bar.csv": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/fake-data/foo.csv": { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/master.xml": { + "stateCleared": "modified", + }, + "src/main/resources/config/tls/keystore.p12": { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages.properties": { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_en.properties": { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_fr.properties": { + "stateCleared": "modified", + }, + "src/main/resources/logback-spring.xml": { + "stateCleared": "modified", + }, + "src/main/resources/templates/error.html": { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/activationEmail.html": { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/creationEmail.html": { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/passwordResetEmail.html": { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/global.json": { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/global.json": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/IntegrationTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/TechnicalStructureTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/AsyncSyncConfiguration.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/EmbeddedSQL.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/PostgreSqlTestContainer.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/SpringBootTestClassOrderer.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/SqlTestContainer.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/SqlTestContainersSpringContextCustomizerFactory.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/WebConfigurerTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/WebConfigurerTestController.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/timezone/HibernateTimeZoneIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/domain/BarTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/domain/FooTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/management/SecurityMetersServiceTests.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/repository/timezone/DateTimeWrapper.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/repository/timezone/DateTimeWrapperRepository.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/DomainUserDetailsServiceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/SecurityUtilsUnitTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/AuthenticationIntegrationTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/JwtAuthenticationTestUtils.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/TokenAuthenticationIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/TokenAuthenticationSecurityMetersIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/MailServiceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/UserServiceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/dto/BarDTOTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/mapper/BarMapperTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/mapper/UserMapperTest.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/AccountResourceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/AuthenticateControllerIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/BarResourceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/FooResourceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/PublicUserResourceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/TestUtil.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/UserResourceIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/WithUnauthenticatedMockUser.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslatorIT.java": { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslatorTestController.java": { + "stateCleared": "modified", + }, + "src/test/resources/META-INF/spring.factories": { + "stateCleared": "modified", + }, + "src/test/resources/config/application-testdev.yml": { + "stateCleared": "modified", + }, + "src/test/resources/config/application-testprod.yml": { + "stateCleared": "modified", + }, + "src/test/resources/config/application.yml": { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_en.properties": { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_fr.properties": { + "stateCleared": "modified", + }, + "src/test/resources/junit-platform.properties": { + "stateCleared": "modified", + }, + "src/test/resources/logback.xml": { + "stateCleared": "modified", + }, + "src/test/resources/templates/mail/activationEmail.html": { + "stateCleared": "modified", + }, + "src/test/resources/templates/mail/creationEmail.html": { + "stateCleared": "modified", + }, + "src/test/resources/templates/mail/passwordResetEmail.html": { + "stateCleared": "modified", + }, + "src/test/resources/templates/mail/testEmail.html": { + "stateCleared": "modified", + }, +} +`; diff --git a/generators/server/entity-files.mjs b/generators/server/entity-files.mjs index f1585010304c..64f5d7f9d2de 100644 --- a/generators/server/entity-files.mjs +++ b/generators/server/entity-files.mjs @@ -21,43 +21,14 @@ import _ from 'lodash'; import chalk from 'chalk'; import { cleanupOldFiles } from './entity-cleanup.mjs'; import { moveToJavaPackageSrcDir, javaMainPackageTemplatesBlock, javaTestPackageTemplatesBlock } from './support/index.mjs'; -import { SERVER_MAIN_SRC_DIR, SERVER_TEST_SRC_DIR } from '../generator-constants.mjs'; +import { SERVER_TEST_SRC_DIR } from '../generator-constants.mjs'; import { databaseTypes, entityOptions } from '../../jdl/jhipster/index.mjs'; -import { getEnumInfo } from '../base-application/support/index.mjs'; const { COUCHBASE, MONGODB, NEO4J, SQL } = databaseTypes; const { MapperTypes, ServiceTypes } = entityOptions; const { MAPSTRUCT } = MapperTypes; const { SERVICE_CLASS, SERVICE_IMPL } = ServiceTypes; -export const modelFiles = { - model: [ - { - ...javaMainPackageTemplatesBlock('_entityPackage_/'), - templates: ['domain/_persistClass_.java.jhi'], - }, - ], - modelTestFiles: [ - { - ...javaTestPackageTemplatesBlock('_entityPackage_/'), - templates: ['domain/_persistClass_Test.java'], - }, - ], -}; - -/** - * The default is to use a file path string. It implies use of the template method. - * For any other config an object { file:.., method:.., template:.. } can be used - */ -export const entityFiles = { - server: [ - { - ...javaMainPackageTemplatesBlock('_entityPackage_/'), - templates: ['domain/_persistClass_.java.jhi.jakarta_validation'], - }, - ], -}; - export const restFiles = { restFiles: [ { @@ -210,8 +181,6 @@ const userFiles = { }; export const serverFiles = { - ...modelFiles, - ...entityFiles, ...restFiles, ...filteringFiles, ...filteringReactiveFiles, @@ -238,35 +207,11 @@ export function writeFiles() { } else if (!entity.builtIn) { await this.writeFiles({ sections: serverFiles, - rootTemplatesPath: application.reactive ? ['reactive', ''] : '', + rootTemplatesPath: application.reactive ? ['reactive', '', '../../java/templates/'] : ['', '../../java/templates/'], context: { ...application, ...entity }, }); } } }, - - async writeEnumFiles({ application, entities }) { - for (const entity of entities.filter(entity => !entity.skipServer)) { - for (const field of entity.fields.filter(field => field.fieldIsEnum)) { - const fieldType = field.fieldType; - const enumInfo = { - ...getEnumInfo(field, entity.clientRootFolder), - frontendAppName: application.frontendAppName, - packageName: application.packageName, - entityAbsolutePackage: entity.entityAbsolutePackage || application.packageName, - }; - await this.writeFiles({ - templates: [ - { - sourceFile: `${SERVER_MAIN_SRC_DIR}_package_/_entityPackage_/domain/enumeration/Enum.java.ejs`, - destinationFile: `${SERVER_MAIN_SRC_DIR}${entity.entityAbsoluteFolder}/domain/enumeration/${fieldType}.java`, - }, - ], - rootTemplatesPath: application.reactive ? ['reactive', ''] : '', - context: enumInfo, - }); - } - } - }, }; } diff --git a/generators/server/generator.spec.mjs b/generators/server/generator.spec.mjs index e70c86590aeb..21e06c328fe5 100644 --- a/generators/server/generator.spec.mjs +++ b/generators/server/generator.spec.mjs @@ -196,4 +196,22 @@ describe(`generator - ${generator}`, () => { }); }); }); + + describe('with entities', () => { + before(async () => { + await helpers.runJHipster(GENERATOR_SERVER).withJHipsterConfig({ skipClient: true }, [ + { name: 'Foo', changelogDate: '20160926101210', fields: [{ fieldName: 'name', fieldType: 'String' }] }, + { + name: 'Bar', + changelogDate: '20160926101211', + dto: 'mapstruct', + fields: [{ fieldName: 'name', fieldType: 'String', fieldValidateRules: ['required'] }], + }, + ]); + }); + + it('should match files snapshot', () => { + expect(runResult.getStateSnapshot()).toMatchSnapshot(); + }); + }); }); diff --git a/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs b/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs index f99e3c2d6f8a..999ca4f8942b 100644 --- a/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs +++ b/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs @@ -80,7 +80,7 @@ _%> const required = field && field.fieldValidate && field.fieldValidationRequired; if (field) { if (field.fieldValidate ) { _%> - <%- include('../../_partials_entity_/field_validators', {field, reactive}); -%> + <%- include('/_global_partials_entity_/field_validators', {field, reactive}); -%> <%_ } } _%> <%_ if (reference.doc) { _%> diff --git a/lib/internal/config-def.mts b/lib/internal/config-def.mts index 264f8e21d379..76ece69887ed 100644 --- a/lib/internal/config-def.mts +++ b/lib/internal/config-def.mts @@ -1,20 +1,25 @@ -import type { JHipsterConfigs } from '../../generators/base/api.mjs'; +import type { ConfigSpec, JHipsterConfigs, JHipsterOption } from '../../generators/base/api.mjs'; import type CoreGenerator from '../../generators/base-core/index.mjs'; import { upperFirstCamelCase } from '../../generators/base/support/string.mjs'; -export const convertConfigToOption = (name, config) => { +export const convertConfigToOption = (name: string, config?: ConfigSpec): JHipsterOption | undefined => { if (!config?.cli?.type) return undefined; - const choices = config.choices?.map(choice => (typeof choice === 'string' ? choice : choice.value)); + const choices = config.choices?.map(choice => (typeof choice === 'string' ? choice : choice.value)) as any; return { name, description: config.description, choices, - scope: 'storage', + scope: config.scope ?? 'storage', + ...(config.prompt && typeof config.default !== 'function' ? {} : { default: config.default }), ...config.cli, }; }; -export function loadConfig(this: CoreGenerator | void, configsDef: JHipsterConfigs | undefined, { application, config }) { +export function loadConfig( + this: CoreGenerator | void, + configsDef: JHipsterConfigs | undefined, + { application, config }: { application: any; config?: any }, +) { if (configsDef) { for (const [name, def] of Object.entries(configsDef)) { let value = application[name];