gen-jhipster
Version:
Spring Boot + Angular/React/Vue in one handy generator
253 lines (252 loc) • 10.5 kB
JavaScript
/**
* Copyright 2013-2024 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 applicationTypes from './application-types.js';
import authenticationTypes from './authentication-types.js';
import databaseTypes from './database-types.js';
import applicationOptions from './application-options.js';
import cacheTypes from './cache-types.js';
import serviceDiscoveryTypes from './service-discovery-types.js';
import clientFrameworkTypes from './client-framework-types.js';
import buildToolTypes from './build-tool-types.js';
const { MONOLITH, MICROSERVICE, GATEWAY } = applicationTypes;
const { CONSUL } = serviceDiscoveryTypes;
const { SQL, POSTGRESQL } = databaseTypes;
const { OptionNames, OptionValues } = applicationOptions;
const { JWT, OAUTH2 } = authenticationTypes;
const { ANGULAR, NO: NO_CLIENT_FRAMEWORK } = clientFrameworkTypes;
const { EHCACHE, HAZELCAST } = cacheTypes;
const { NO: NO_CACHE_PROVIDER, MEMCACHED } = cacheTypes;
const NO_SERVICE_DISCOVERY = serviceDiscoveryTypes.NO;
const { MAVEN } = buildToolTypes;
const { APPLICATION_TYPE, AUTHENTICATION_TYPE, BASE_NAME, BUILD_TOOL, CACHE_PROVIDER, CLIENT_FRAMEWORK, CLIENT_THEME, CLIENT_THEME_VARIANT, WITH_ADMIN_UI, DATABASE_TYPE, DEV_DATABASE_TYPE, DTO_SUFFIX, ENABLE_HIBERNATE_CACHE, ENABLE_SWAGGER_CODEGEN, ENABLE_TRANSLATION, ENTITY_SUFFIX, JHI_PREFIX, LANGUAGES, NATIVE_LANGUAGE, PACKAGE_FOLDER, PACKAGE_NAME, PROD_DATABASE_TYPE, REACTIVE, SEARCH_ENGINE, SERVER_PORT, SERVICE_DISCOVERY_TYPE, SKIP_CLIENT, SKIP_USER_MANAGEMENT, TEST_FRAMEWORKS, WEBSOCKET, ENABLE_GRADLE_ENTERPRISE, GRADLE_ENTERPRISE_HOST, ENABLE_GRPC, } = OptionNames;
const commonDefaultOptions = {
[AUTHENTICATION_TYPE]: JWT,
[BUILD_TOOL]: MAVEN,
[DTO_SUFFIX]: OptionValues[DTO_SUFFIX],
[ENABLE_SWAGGER_CODEGEN]: OptionValues[ENABLE_SWAGGER_CODEGEN],
[ENABLE_TRANSLATION]: OptionValues[ENABLE_TRANSLATION],
[ENTITY_SUFFIX]: OptionValues[ENTITY_SUFFIX],
[JHI_PREFIX]: OptionValues[JHI_PREFIX],
messageBroker: 'no',
[SEARCH_ENGINE]: OptionValues[SEARCH_ENGINE].no,
[WEBSOCKET]: OptionValues[WEBSOCKET].no,
[ENABLE_GRPC]: OptionValues[ENABLE_GRPC],
grpcPort: '9090',
};
export function getConfigWithDefaults(customOptions = {}) {
const applicationType = customOptions.applicationType;
if (applicationType === GATEWAY) {
return getConfigForGatewayApplication(customOptions);
}
if (applicationType === MICROSERVICE) {
return getConfigForMicroserviceApplication(customOptions);
}
return getConfigForMonolithApplication(customOptions);
}
export function getConfigForClientApplication(options = {}) {
if (options[SKIP_CLIENT]) {
options[CLIENT_FRAMEWORK] = NO_CLIENT_FRAMEWORK;
}
const clientFramework = options[CLIENT_FRAMEWORK];
if (clientFramework === NO_CLIENT_FRAMEWORK) {
return options;
}
if (options[OptionNames.MICROFRONTEND] === undefined) {
options[OptionNames.MICROFRONTEND] = Boolean(options[OptionNames.MICROFRONTENDS]?.length);
}
if (!options[CLIENT_THEME]) {
options[CLIENT_THEME] = OptionValues[CLIENT_THEME];
options[CLIENT_THEME_VARIANT] = '';
}
else if (options[CLIENT_THEME] !== OptionValues[CLIENT_THEME] && !options[CLIENT_THEME_VARIANT]) {
options[CLIENT_THEME_VARIANT] = 'primary';
}
if (clientFramework === 'vue') {
options.clientBundler ??= options.microfrontend || options.applicationType === 'microservice' ? 'webpack' : 'vite';
options.devServerPort ??= options.clientBundler === 'webpack' ? 9060 : 9000;
}
else if (clientFramework === 'react') {
options.clientBundler ??= 'webpack';
options.devServerPort ??= 9060;
}
else if (clientFramework === 'angular') {
options.clientBundler ??= 'webpack';
options.devServerPort ??= 4200;
}
else {
options.devServerPort ??= 9060;
}
options.devServerPortProxy ??= options.clientBundler === 'webpack' ? 9000 : undefined;
return options;
}
export function getConfigForAuthenticationType(options = {}) {
if (typeof options[SKIP_USER_MANAGEMENT] !== 'boolean') {
if (options[AUTHENTICATION_TYPE] === OAUTH2) {
options[SKIP_USER_MANAGEMENT] = true;
}
else {
options[SKIP_USER_MANAGEMENT] = OptionValues[SKIP_USER_MANAGEMENT];
}
}
return options;
}
export function getConfigForPackageName(options = {}) {
if (!options[PACKAGE_NAME] && !options[PACKAGE_FOLDER]) {
options[PACKAGE_FOLDER] = OptionValues[PACKAGE_FOLDER];
}
if (!options[PACKAGE_NAME] && options[PACKAGE_FOLDER]) {
options[PACKAGE_NAME] = options[PACKAGE_FOLDER].replace(/\//g, '.');
}
if (!options[PACKAGE_FOLDER] && options[PACKAGE_NAME]) {
options[PACKAGE_FOLDER] = options[PACKAGE_NAME].replace(/\./g, '/');
}
return options;
}
export function getConfigForCacheProvider(options = {}) {
if (options[REACTIVE] || options[CACHE_PROVIDER] === undefined) {
options[CACHE_PROVIDER] = NO_CACHE_PROVIDER;
}
options[ENABLE_HIBERNATE_CACHE] ??=
options[DATABASE_TYPE] === SQL && !options[REACTIVE] && ![NO_CACHE_PROVIDER, MEMCACHED].includes(options[CACHE_PROVIDER]);
return options;
}
export function getConfigForReactive(options = {}) {
if (options[REACTIVE] === undefined) {
options[REACTIVE] = false;
}
return options;
}
export function getConfigForTranslation(options = {}) {
if (options[ENABLE_TRANSLATION] === undefined) {
options[ENABLE_TRANSLATION] = true;
}
if (options[NATIVE_LANGUAGE] === undefined) {
options[NATIVE_LANGUAGE] = 'en';
}
if (options[ENABLE_TRANSLATION] && options[LANGUAGES] === undefined) {
options[LANGUAGES] = [];
}
return options;
}
export function getConfigForDatabaseType(options = {}) {
if (options[DATABASE_TYPE] === undefined) {
options[DATABASE_TYPE] = SQL;
}
if (options[DATABASE_TYPE] === SQL) {
if (options[PROD_DATABASE_TYPE] === undefined) {
options[PROD_DATABASE_TYPE] = POSTGRESQL;
}
if (options[DEV_DATABASE_TYPE] === undefined) {
options[DEV_DATABASE_TYPE] = options[PROD_DATABASE_TYPE];
}
}
options.databaseMigration ??= options.databaseType === SQL ? 'liquibase' : 'no';
return options;
}
export function getServerConfigForMonolithApplication(customOptions = {}) {
const options = {
...commonDefaultOptions,
[CACHE_PROVIDER]: EHCACHE,
[CLIENT_FRAMEWORK]: ANGULAR,
[SERVER_PORT]: OptionValues[SERVER_PORT],
[SERVICE_DISCOVERY_TYPE]: NO_SERVICE_DISCOVERY,
[WITH_ADMIN_UI]: true,
...customOptions,
};
return {
...options,
[APPLICATION_TYPE]: MONOLITH,
};
}
export function getConfigForMonolithApplication(customOptions = {}) {
let options = getServerConfigForMonolithApplication(customOptions);
options = getConfigForClientApplication(options);
options = getConfigForPackageName(options);
options = getConfigForDatabaseType(options);
options = getConfigForCacheProvider(options);
options = getConfigForReactive(options);
options = getConfigForTranslation(options);
return getConfigForAuthenticationType(options);
}
export function getServerConfigForGatewayApplication(customOptions = {}) {
const options = {
...commonDefaultOptions,
[CLIENT_FRAMEWORK]: ANGULAR,
[SERVER_PORT]: OptionValues[SERVER_PORT],
[SERVICE_DISCOVERY_TYPE]: CONSUL,
[WITH_ADMIN_UI]: true,
...customOptions,
};
options[CACHE_PROVIDER] = NO_CACHE_PROVIDER;
options[ENABLE_HIBERNATE_CACHE] = false;
return {
[REACTIVE]: true,
...options,
[APPLICATION_TYPE]: GATEWAY,
};
}
export function getConfigForGatewayApplication(customOptions = {}) {
let options = getServerConfigForGatewayApplication(customOptions);
options = getConfigForClientApplication(options);
options = getConfigForPackageName(options);
options = getConfigForDatabaseType(options);
options = getConfigForCacheProvider(options);
options = getConfigForReactive(options);
options = getConfigForTranslation(options);
return getConfigForAuthenticationType(options);
}
export function getServerConfigForMicroserviceApplication(customOptions = {}) {
const DEFAULT_SERVER_PORT = 8081;
const options = {
...commonDefaultOptions,
[CACHE_PROVIDER]: HAZELCAST,
[SERVER_PORT]: DEFAULT_SERVER_PORT,
[SERVICE_DISCOVERY_TYPE]: CONSUL,
[SKIP_USER_MANAGEMENT]: true,
[CLIENT_FRAMEWORK]: NO_CLIENT_FRAMEWORK,
...customOptions,
};
options[WITH_ADMIN_UI] = false;
return {
...options,
[APPLICATION_TYPE]: MICROSERVICE,
};
}
export function getConfigForMicroserviceApplication(customOptions = {}) {
let options = getServerConfigForMicroserviceApplication(customOptions);
options = getConfigForClientApplication(options);
options = getConfigForPackageName(options);
options = getConfigForDatabaseType(options);
options = getConfigForCacheProvider(options);
options = getConfigForReactive(options);
options = getConfigForTranslation(options);
return getConfigForAuthenticationType(options);
}
export function getDefaultConfigForNewApplication(customOptions = {}) {
const options = {
...commonDefaultOptions,
[BASE_NAME]: OptionValues[BASE_NAME],
[LANGUAGES]: OptionValues[LANGUAGES],
[TEST_FRAMEWORKS]: [],
[ENABLE_GRADLE_ENTERPRISE]: OptionValues[ENABLE_GRADLE_ENTERPRISE],
[GRADLE_ENTERPRISE_HOST]: OptionValues[GRADLE_ENTERPRISE_HOST],
...customOptions,
};
return getConfigWithDefaults(options);
}