generator-fedhipster
Version:
Spring Boot + Angular/React in one handy generator
436 lines (395 loc) • 18.5 kB
JavaScript
/**
* Copyright 2013-2019 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
*
* http://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.
*/
/* eslint-disable consistent-return */
const chalk = require('chalk');
const _ = require('lodash');
const BaseBlueprintGenerator = require('../generator-base-blueprint');
const prompts = require('./prompts');
const writeAngularFiles = require('./files-angular').writeFiles;
const writeReactFiles = require('./files-react').writeFiles;
const packagejs = require('../../package.json');
const constants = require('../generator-constants');
const statistics = require('../statistics');
let useBlueprint;
module.exports = class extends BaseBlueprintGenerator {
constructor(args, opts) {
super(args, opts);
this.configOptions = this.options.configOptions || {};
// This adds support for a `--from-cli` flag
this.option('from-cli', {
desc: 'Indicates the command is run from JHipster CLI',
type: Boolean,
defaults: false
});
// This adds support for a `--auth` flag
this.option('auth', {
desc: 'Provide authentication type for the application',
type: String
});
// This adds support for a `--skip-commit-hook` flag
this.option('skip-commit-hook', {
desc: 'Skip adding husky commit hooks',
type: Boolean,
defaults: false
});
// This adds support for a `--experimental` flag which can be used to enable experimental features
this.option('experimental', {
desc:
'Enable experimental features. Please note that these features may be unstable and may undergo breaking changes at any time',
type: Boolean,
defaults: false
});
this.setupClientOptions(this);
const blueprint = this.options.blueprint || this.configOptions.blueprint || this.config.get('blueprint');
// use global variable since getters dont have access to instance property
if (!opts.fromBlueprint) {
useBlueprint = this.composeBlueprint(blueprint, 'client', {
...this.options,
configOptions: this.configOptions
});
} else {
useBlueprint = false;
}
}
// Public API method used by the getter and also by Blueprints
_initializing() {
return {
validateFromCli() {
this.checkInvocationFromCLI();
},
displayLogo() {
if (this.logo) {
this.printJHipsterLogo();
}
},
setupClientconsts() {
// Make constants available in templates
this.MAIN_SRC_DIR = constants.CLIENT_MAIN_SRC_DIR;
this.TEST_SRC_DIR = constants.CLIENT_TEST_SRC_DIR;
const configuration = this.getAllJhipsterConfig(this, true);
this.serverPort = configuration.get('serverPort') || this.configOptions.serverPort || 8080;
this.applicationType = configuration.get('applicationType') || this.configOptions.applicationType;
if (!this.applicationType) {
this.applicationType = 'monolith';
}
this.clientFramework = configuration.get('clientFramework');
if (!this.clientFramework) {
/* for backward compatibility */
this.clientFramework = 'angularX';
}
if (this.clientFramework === 'angular' || this.clientFramework === 'angular2') {
/* for backward compatibility */
this.clientFramework = 'angularX';
}
this.styleLibrary = configuration.get('styleLibrary');
this.clientTheme = configuration.get('clientTheme');
if (!this.clientTheme) {
this.clientTheme = 'none';
}
this.clientThemeVariant = configuration.get('clientThemeVariant');
this.enableTranslation = configuration.get('enableTranslation'); // this is enabled by default to avoid conflicts for existing applications
this.nativeLanguage = configuration.get('nativeLanguage');
this.languages = configuration.get('languages');
this.enableI18nRTL = this.isI18nRTLSupportNecessary(this.languages);
this.messageBroker = configuration.get('messageBroker');
this.packagejs = packagejs;
const baseName = configuration.get('baseName');
if (baseName) {
this.baseName = baseName;
}
this.serviceDiscoveryType =
configuration.get('serviceDiscoveryType') === 'no'
? false
: configuration.get('serviceDiscoveryType') || this.configOptions.serviceDiscoveryType;
if (this.serviceDiscoveryType === undefined) {
this.serviceDiscoveryType = false;
}
const clientConfigFound = this.enableTranslation !== undefined;
if (clientConfigFound) {
// If translation is not defined, it is enabled by default
if (this.enableTranslation === undefined) {
this.enableTranslation = true;
}
if (this.nativeLanguage === undefined) {
this.nativeLanguage = 'en';
}
if (this.languages === undefined) {
this.languages = ['en', 'fr'];
}
this.existingProject = true;
}
this.useNpm = this.configOptions.useNpm = !this.options.yarn;
this.useYarn = !this.useNpm;
if (!this.clientPackageManager) {
if (this.useNpm) {
this.clientPackageManager = 'npm';
} else {
this.clientPackageManager = 'yarn';
}
}
},
validateSkipServer() {
if (this.skipServer && !(this.databaseType && this.devDatabaseType && this.prodDatabaseType && this.authenticationType)) {
this.error(
`When using skip-server flag, you must pass a database option and authentication type using ${chalk.yellow(
'--db'
)} and ${chalk.yellow('--auth')} flags`
);
}
if (this.skipServer && this.authenticationType === 'uaa' && !this.uaaBaseName) {
this.error(
`When using skip-server flag and UAA as authentication method, you must pass a UAA base name using ${chalk.yellow(
'--uaa-base-name'
)} flag`
);
}
}
};
}
get initializing() {
if (useBlueprint) return;
return this._initializing();
}
// Public API method used by the getter and also by Blueprints
_prompting() {
return {
askForModuleName: prompts.askForModuleName,
askForClient: prompts.askForClient,
askForStyleLibrary: prompts.askForStyleLibrary,
askFori18n: prompts.askFori18n,
askForClientTheme: prompts.askForClientTheme,
askForClientThemeVariant: prompts.askForClientThemeVariant,
setSharedConfigOptions() {
this.configOptions.clientFramework = this.clientFramework;
this.configOptions.clientTheme = this.clientTheme;
this.configOptions.clientThemeVariant = this.clientThemeVariant;
}
};
}
get prompting() {
if (useBlueprint) return;
return this._prompting();
}
// Public API method used by the getter and also by Blueprints
_configuring() {
return {
insight() {
statistics.sendSubGenEvent('generator', 'client', {
app: {
clientFramework: this.clientFramework,
styleLibrary: this.styleLibrary,
enableTranslation: this.enableTranslation,
nativeLanguage: this.nativeLanguage,
languages: this.languages
}
});
},
configureGlobal() {
// Application name modified, using each technology's conventions
this.camelizedBaseName = _.camelCase(this.baseName);
this.angularAppName = this.getAngularAppName();
this.angularXAppName = this.getAngularXAppName();
this.hipster = this.getHipster(this.baseName);
this.capitalizedBaseName = _.upperFirst(this.baseName);
this.dasherizedBaseName = _.kebabCase(this.baseName);
this.lowercaseBaseName = this.baseName.toLowerCase();
if (!this.nativeLanguage) {
// set to english when translation is set to false
this.nativeLanguage = 'en';
}
},
saveConfig() {
const config = {
jhipsterVersion: packagejs.version,
applicationType: this.applicationType,
baseName: this.baseName,
clientFramework: this.clientFramework,
styleLibrary: this.styleLibrary,
clientTheme: this.clientTheme,
clientThemeVariant: this.clientThemeVariant,
useSass: true,
enableTranslation: this.enableTranslation,
skipCommitHook: this.skipCommitHook,
clientPackageManager: this.clientPackageManager
};
if (this.enableTranslation && !this.configOptions.skipI18nQuestion) {
config.nativeLanguage = this.nativeLanguage;
config.languages = this.languages;
}
if (this.skipServer) {
this.authenticationType && (config.authenticationType = this.authenticationType);
this.uaaBaseName && (config.uaaBaseName = this.uaaBaseName);
this.cacheProvider && (config.cacheProvider = this.cacheProvider);
this.enableHibernateCache && (config.enableHibernateCache = this.enableHibernateCache);
this.websocket && (config.websocket = this.websocket);
this.databaseType && (config.databaseType = this.databaseType);
this.devDatabaseType && (config.devDatabaseType = this.devDatabaseType);
this.prodDatabaseType && (config.prodDatabaseType = this.prodDatabaseType);
this.searchEngine && (config.searchEngine = this.searchEngine);
this.buildTool && (config.buildTool = this.buildTool);
}
this.config.set(config);
}
};
}
get configuring() {
if (useBlueprint) return;
return this._configuring();
}
// Public API method used by the getter and also by Blueprints
_default() {
return {
getSharedConfigOptions() {
if (this.configOptions.cacheProvider) {
this.cacheProvider = this.configOptions.cacheProvider;
}
if (this.configOptions.enableHibernateCache) {
this.enableHibernateCache = this.configOptions.enableHibernateCache;
}
if (this.configOptions.websocket !== undefined) {
this.websocket = this.configOptions.websocket;
}
if (this.configOptions.clientFramework) {
this.clientFramework = this.configOptions.clientFramework;
}
if (this.configOptions.styleLibrary) {
this.styleLibrary = this.configOptions.styleLibrary;
}
if (this.configOptions.databaseType) {
this.databaseType = this.configOptions.databaseType;
}
if (this.configOptions.devDatabaseType) {
this.devDatabaseType = this.configOptions.devDatabaseType;
}
if (this.configOptions.prodDatabaseType) {
this.prodDatabaseType = this.configOptions.prodDatabaseType;
}
if (this.configOptions.messageBroker !== undefined) {
this.messageBroker = this.configOptions.messageBroker;
}
if (this.configOptions.searchEngine !== undefined) {
this.searchEngine = this.configOptions.searchEngine;
}
if (this.configOptions.buildTool) {
this.buildTool = this.configOptions.buildTool;
}
if (this.configOptions.authenticationType) {
this.authenticationType = this.configOptions.authenticationType;
}
if (this.configOptions.otherModules) {
this.otherModules = this.configOptions.otherModules;
}
if (this.configOptions.testFrameworks) {
this.testFrameworks = this.configOptions.testFrameworks;
}
this.protractorTests = this.testFrameworks.includes('protractor');
if (this.configOptions.enableTranslation !== undefined) {
this.enableTranslation = this.configOptions.enableTranslation;
}
if (this.configOptions.nativeLanguage !== undefined) {
this.nativeLanguage = this.configOptions.nativeLanguage;
}
if (this.configOptions.languages !== undefined) {
this.languages = this.configOptions.languages;
this.enableI18nRTL = this.isI18nRTLSupportNecessary(this.languages);
}
if (this.configOptions.uaaBaseName !== undefined) {
this.uaaBaseName = this.configOptions.uaaBaseName;
}
// Make dist dir available in templates
this.BUILD_DIR = this.getBuildDirectoryForBuildTool(this.configOptions.buildTool);
this.styleSheetExt = 'scss';
this.pkType = this.getPkType(this.databaseType);
this.apiUaaPath = `${this.authenticationType === 'uaa' ? `services/${this.uaaBaseName.toLowerCase()}/` : ''}`;
this.DIST_DIR = this.getResourceBuildDirectoryForBuildTool(this.configOptions.buildTool) + constants.CLIENT_DIST_DIR;
this.AOT_DIR = `${this.getResourceBuildDirectoryForBuildTool(this.configOptions.buildTool)}aot`;
this.CLIENT_MAIN_SRC_DIR = constants.CLIENT_MAIN_SRC_DIR;
},
composeLanguages() {
if (this.configOptions.skipI18nQuestion) return;
this.composeLanguagesSub(this, this.configOptions, 'client');
}
};
}
get default() {
if (useBlueprint) return;
return this._default();
}
// Public API method used by the getter and also by Blueprints
_writing() {
return {
write() {
switch (this.clientFramework) {
case 'react':
return writeReactFiles.call(this, useBlueprint);
default:
return writeAngularFiles.call(this, useBlueprint);
}
}
};
}
get writing() {
if (useBlueprint) return;
return this._writing();
}
// Public API method used by the getter and also by Blueprints
_install() {
return {
installing() {
const logMsg = `To install your dependencies manually, run: ${chalk.yellow.bold(`${this.clientPackageManager} install`)}`;
const installConfig = {
bower: false,
npm: this.clientPackageManager !== 'yarn',
yarn: this.clientPackageManager === 'yarn'
};
if (this.options['skip-install']) {
this.log(logMsg);
} else {
try {
this.installDependencies(installConfig);
} catch (e) {
this.warning('Install of dependencies failed!');
this.log(logMsg);
}
}
}
};
}
get install() {
if (useBlueprint) return;
return this._install();
}
// Public API method used by the getter and also by Blueprints
_end() {
return {
end() {
this.log(chalk.green.bold('\nClient application generated successfully.\n'));
const logMsg = `Start your Webpack development server with:\n ${chalk.yellow.bold(`${this.clientPackageManager} start`)}\n`;
this.log(chalk.green(logMsg));
if (!this.options['skip-install']) {
this.spawnCommandSync(this.clientPackageManager, ['run', 'cleanup']);
}
}
};
}
get end() {
if (useBlueprint) return;
return this._end();
}
};