UNPKG

generator-fedhipster

Version:

Spring Boot + Angular/React in one handy generator

586 lines (581 loc) 27.6 kB
/** * 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. */ const mkdirp = require('mkdirp'); const constants = require('../generator-constants'); /* Constants use throughout */ const MAIN_SRC_DIR = constants.CLIENT_MAIN_SRC_DIR; const TEST_SRC_DIR = constants.CLIENT_TEST_SRC_DIR; const ANGULAR_DIR = constants.ANGULAR_DIR; /** * 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 */ const files = { common: [ { templates: [ 'package.json', 'proxy.conf.json', 'tsconfig.json', 'tsconfig-aot.json', 'tslint.json', 'angular.json', 'webpack/utils.js', 'webpack/webpack.common.js', 'webpack/webpack.dev.js', 'webpack/webpack.prod.js', 'postcss.config.js', ] }, { condition: generator => generator.styleLibrary === 'bootstrap', templates: [{ file: 'webpack/logo-jhipster.png', method: 'copy' }] }, { condition: generator => !generator.skipCommitHook, templates: ['.huskyrc'] } ], sass: [ { path: MAIN_SRC_DIR, templates: ['content/scss/global.scss', 'content/scss/vendor.scss'] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: MAIN_SRC_DIR, templates: ['content/scss/_bootstrap-variables.scss'] }, { condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', path: MAIN_SRC_DIR, templates: [{ file: 'content/uswds', method: 'copy', noEjs: true }] }, { condition: generator => generator.enableI18nRTL, path: MAIN_SRC_DIR, templates: ['content/scss/rtl.scss'] } ], image: [ { path: MAIN_SRC_DIR, condition: generator => generator.styleLibrary === 'bootstrap', templates: [ { file: 'content/images/jhipster_family_member_0.svg', method: 'copy' }, { file: 'content/images/jhipster_family_member_1.svg', method: 'copy' }, { file: 'content/images/jhipster_family_member_2.svg', method: 'copy' }, { file: 'content/images/jhipster_family_member_3.svg', method: 'copy' }, { file: 'content/images/jhipster_family_member_0_head-192.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_1_head-192.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_2_head-192.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_3_head-192.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_0_head-256.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_1_head-256.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_2_head-256.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_3_head-256.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_0_head-384.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_1_head-384.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_2_head-384.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_3_head-384.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_0_head-512.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_1_head-512.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_2_head-512.png', method: 'copy' }, { file: 'content/images/jhipster_family_member_3_head-512.png', method: 'copy' }, { file: 'content/images/logo-jhipster.png', method: 'copy' } ] }, { path: MAIN_SRC_DIR, condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', templates: [ { file: 'content/images/uswds', method: 'copy', noEjs: true }, { file: 'content/js/uswds.min.js', method: 'copy', noEjs: true }, { file: 'content/js/uswds.min.js.map', method: 'copy', noEjs: true } ] } ], swagger: [ { path: MAIN_SRC_DIR, templates: ['swagger-ui/index.html', { file: 'swagger-ui/dist/images/throbber.gif', method: 'copy' }] } ], commonWeb: [ { path: MAIN_SRC_DIR, templates: ['WEB-INF/web.xml', 'robots.txt', '404.html', 'index.html', 'manifest.webapp'] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: MAIN_SRC_DIR, templates: [{ file: 'favicon.ico', method: 'copy' }] }, { condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', path: MAIN_SRC_DIR, templates: [{ file: 'favicon-uswds.ico', method: 'copy', renameTo: generator => 'favicon.ico' }] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: MAIN_SRC_DIR, templates: ['content/css/loading.css'] }, { condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', path: MAIN_SRC_DIR, templates: [ { file: 'content/css/loading-uswds.css', method: 'copy', renameTo: generator => 'content/css/loading.css' } ] }, ], angularApp: [ { path: ANGULAR_DIR, templates: [ 'app.main.ts', 'app.module.ts', 'app-routing.module.ts', 'app.constants.ts', 'polyfills.ts', 'vendor.ts', 'blocks/config/prod.config.ts', // interceptors 'blocks/interceptor/errorhandler.interceptor.ts', 'blocks/interceptor/notification.interceptor.ts', 'blocks/interceptor/auth-expired.interceptor.ts' ] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: ANGULAR_DIR, templates: ['blocks/config/uib-pagination.config.ts'] }, { condition: generator => generator.authenticationType === 'jwt', path: ANGULAR_DIR, templates: ['blocks/interceptor/auth.interceptor.ts'] } ], angularMain: [ { path: ANGULAR_DIR, templates: [ // entities 'entities/entity.module.ts', // home module 'home/index.ts', { file: 'home/home.module.ts', method: 'processJs' }, { file: 'home/home.route.ts', method: 'processJs' }, { file: 'home/home.component.ts', method: 'processJs' }, { file: 'home/home.component.html', method: 'processHtml' }, // layouts 'layouts/index.ts', 'layouts/profiles/page-ribbon.component.ts', 'layouts/profiles/profile.service.ts', 'layouts/profiles/profile-info.model.ts', 'layouts/main/main.component.ts', 'layouts/main/main.component.html', 'layouts/footer/footer.component.ts', { file: 'layouts/footer/footer.component.html', method: 'processHtml' }, { file: 'layouts/error/error.route.ts', method: 'processJs' }, { file: 'layouts/error/error.component.ts', method: 'processJs' }, { file: 'layouts/error/error.component.html', method: 'processHtml' } ] }, { condition: generator => generator.enableTranslation && generator.styleLibrary === 'bootstrap', path: ANGULAR_DIR, templates: ['layouts/navbar/active-menu.directive.ts'] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: ANGULAR_DIR, templates: [ { file: 'layouts/navbar/navbar.component.ts', method: 'processJs' }, { file: 'layouts/navbar/navbar.component.html', method: 'processHtml' }, 'layouts/navbar/navbar.route.ts' ] }, { condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', path: ANGULAR_DIR, templates: [ { file: 'layouts/header/header.component.ts', method: 'processJs' }, { file: 'layouts/header/header.route.ts', method: 'processJs' }, { file: 'layouts/header/header.component.html', method: 'processHtml' }, { file: 'layouts/banner/banner.component.ts', method: 'processJs' }, { file: 'layouts/banner/banner.component.html', method: 'processHtml' } ] }, { path: ANGULAR_DIR, templates: ['layouts/profiles/page-ribbon.scss', 'home/home.scss'] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: ANGULAR_DIR, templates: ['layouts/navbar/navbar.scss'] }, { condition: generator => generator.styleLibrary === 'uswds' || generator.styleLibrary === 'octo', path: ANGULAR_DIR, templates: ['layouts/header/header.scss', 'layouts/banner/banner.scss'] } ], angularAccountModule: [ { path: ANGULAR_DIR, condition: generator => generator.authenticationType !== 'oauth2', templates: [ 'account/index.ts', { file: 'account/account.route.ts', method: 'processJs' }, 'account/account.module.ts', { file: 'account/activate/activate.route.ts', method: 'processJs' }, { file: 'account/activate/activate.component.ts', method: 'processJs' }, { file: 'account/activate/activate.component.html', method: 'processHtml' }, 'account/activate/activate.service.ts', { file: 'account/password/password.route.ts', method: 'processJs' }, 'account/password/password-strength-bar.component.ts', { file: 'account/password/password.component.ts', method: 'processJs' }, { file: 'account/password/password.component.html', method: 'processHtml' }, 'account/password/password.service.ts', { file: 'account/register/register.route.ts', method: 'processJs' }, { file: 'account/register/register.component.ts', method: 'processJs' }, { file: 'account/register/register.component.html', method: 'processHtml' }, 'account/register/register.service.ts', { file: 'account/password-reset/init/password-reset-init.route.ts', method: 'processJs' }, { file: 'account/password-reset/init/password-reset-init.component.ts', method: 'processJs' }, { file: 'account/password-reset/init/password-reset-init.component.html', method: 'processHtml' }, 'account/password-reset/init/password-reset-init.service.ts', { file: 'account/password-reset/finish/password-reset-finish.route.ts', method: 'processJs' }, { file: 'account/password-reset/finish/password-reset-finish.component.ts', method: 'processJs' }, { file: 'account/password-reset/finish/password-reset-finish.component.html', method: 'processHtml' }, 'account/password-reset/finish/password-reset-finish.service.ts', { file: 'account/settings/settings.route.ts', method: 'processJs' }, { file: 'account/settings/settings.component.ts', method: 'processJs' }, { file: 'account/settings/settings.component.html', method: 'processHtml' } ] }, { condition: generator => generator.authenticationType === 'session', path: ANGULAR_DIR, templates: [ { file: 'account/sessions/sessions.route.ts', method: 'processJs' }, 'account/sessions/session.model.ts', { file: 'account/sessions/sessions.component.ts', method: 'processJs' }, { file: 'account/sessions/sessions.component.html', method: 'processHtml' }, 'account/sessions/sessions.service.ts' ] }, { condition: generator => generator.authenticationType !== 'oauth2', path: ANGULAR_DIR, templates: ['account/password/password-strength-bar.scss'] } ], angularAdminModule: [ { path: ANGULAR_DIR, templates: [ 'admin/index.ts', { file: 'admin/admin.route.ts', method: 'processJs' }, 'admin/admin.module.ts', // admin modules { file: 'admin/configuration/configuration.route.ts', method: 'processJs' }, { file: 'admin/configuration/configuration.component.ts', method: 'processJs' }, { file: 'admin/configuration/configuration.component.html', method: 'processHtml' }, 'admin/configuration/configuration.service.ts', { file: 'admin/docs/docs.route.ts', method: 'processJs' }, { file: 'admin/docs/docs.component.ts', method: 'processJs' }, 'admin/docs/docs.component.html', { file: 'admin/health/health.route.ts', method: 'processJs' }, { file: 'admin/health/health.component.ts', method: 'processJs' }, { file: 'admin/health/health.component.html', method: 'processHtml' }, 'admin/health/health-modal.component.ts', { file: 'admin/health/health-modal.component.html', method: 'processHtml' }, 'admin/health/health.service.ts', { file: 'admin/logs/logs.route.ts', method: 'processJs' }, 'admin/logs/log.model.ts', { file: 'admin/logs/logs.component.ts', method: 'processJs' }, { file: 'admin/logs/logs.component.html', method: 'processHtml' }, 'admin/logs/logs.service.ts', 'admin/metrics/index.ts', { file: 'admin/metrics/jhi-jvm-memory.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-jvm-threads.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-cache.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-datasource.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-endpoints-requests.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-garbagecollector.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-modal-threads.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-request.component.ts', method: 'processJs' }, { file: 'admin/metrics/jhi-metrics-system.component.ts', method: 'processJs' }, { file: 'admin/metrics/metrics.route.ts', method: 'processJs' }, { file: 'admin/metrics/metrics.component.ts', method: 'processJs' }, { file: 'admin/metrics/metrics.component.html', method: 'processHtml', template: true }, 'admin/metrics/metrics.service.ts' ] }, { condition: generator => generator.databaseType !== 'no' && generator.databaseType !== 'cassandra', path: ANGULAR_DIR, templates: [ { file: 'admin/audits/audits.route.ts', method: 'processJs' }, 'admin/audits/audit-data.model.ts', 'admin/audits/audit.model.ts', { file: 'admin/audits/audits.component.ts', method: 'processJs' }, { file: 'admin/audits/audits.component.html', method: 'processHtml' }, 'admin/audits/audits.service.ts' ] }, { condition: generator => generator.websocket === 'spring-websocket', path: ANGULAR_DIR, templates: [ { file: 'admin/tracker/tracker.route.ts', method: 'processJs' }, { file: 'admin/tracker/tracker.component.ts', method: 'processJs' }, { file: 'admin/tracker/tracker.component.html', method: 'processHtml' }, 'core/tracker/tracker.service.ts' ] }, { condition: generator => !generator.skipUserManagement, path: ANGULAR_DIR, templates: [ { file: 'admin/user-management/user-management.route.ts', method: 'processJs' }, { file: 'admin/user-management/user-management.component.ts', method: 'processJs' }, { file: 'admin/user-management/user-management.component.html', method: 'processHtml' }, { file: 'admin/user-management/user-management-detail.component.ts', method: 'processJs' }, { file: 'admin/user-management/user-management-detail.component.html', method: 'processHtml' }, { file: 'admin/user-management/user-management-update.component.ts', method: 'processJs' }, { file: 'admin/user-management/user-management-update.component.html', method: 'processHtml' }, { file: 'admin/user-management/user-management-delete-dialog.component.ts', method: 'processJs' }, { file: 'admin/user-management/user-management-delete-dialog.component.html', method: 'processHtml' } ] }, { condition: generator => generator.applicationType === 'gateway' && generator.serviceDiscoveryType, path: ANGULAR_DIR, templates: [ { file: 'admin/gateway/gateway.route.ts', method: 'processJs' }, 'admin/gateway/gateway-route.model.ts', { file: 'admin/gateway/gateway.component.ts', method: 'processJs' }, { file: 'admin/gateway/gateway.component.html', method: 'processHtml' }, 'admin/gateway/gateway-routes.service.ts' ] } ], angularCore: [ { path: ANGULAR_DIR, templates: [ 'core/index.ts', 'core/core.module.ts', // login 'core/login/login.service.ts', 'core/user/account.model.ts' ] }, { path: ANGULAR_DIR, condition: generator => generator.authenticationType !== 'oauth2', templates: [ // login 'core/login/login-modal.service.ts' ] }, { condition: generator => !generator.skipUserManagement || generator.authenticationType === 'oauth2', path: ANGULAR_DIR, templates: ['core/user/user.service.ts', 'core/user/user.model.ts'] }, { condition: generator => generator.enableTranslation, path: ANGULAR_DIR, templates: ['core/language/language.constants.ts', 'core/language/language.helper.ts'] } ], angularShared: [ { path: ANGULAR_DIR, templates: [ 'shared/index.ts', 'shared/shared.module.ts', 'shared/shared-libs.module.ts', 'shared/shared-common.module.ts', 'shared/constants/error.constants.ts', 'shared/constants/input.constants.ts', 'shared/constants/pagination.constants.ts', // models 'shared/util/request-util.ts', // alert service code 'shared/alert/alert.component.ts', 'shared/alert/alert-error.component.ts', ] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: ANGULAR_DIR, templates: ['shared/util/datepicker-adapter.ts'] }, { path: ANGULAR_DIR, condition: generator => generator.authenticationType !== 'oauth2', templates: [ // login 'shared/login/login.component.ts', { file: 'shared/login/login.component.html', method: 'processHtml' } ] }, { condition: generator => generator.enableTranslation, path: ANGULAR_DIR, templates: ['shared/language/find-language-from-key.pipe.ts'] } ], angularAuthService: [ { path: ANGULAR_DIR, templates: [ 'core/auth/csrf.service.ts', 'core/auth/state-storage.service.ts', 'shared/auth/has-any-authority.directive.ts', 'core/auth/account.service.ts', 'core/auth/user-route-access-service.ts' ] }, { condition: generator => generator.authenticationType === 'jwt' || generator.authenticationType === 'uaa', path: ANGULAR_DIR, templates: ['core/auth/auth-jwt.service.ts'] }, { condition: generator => generator.authenticationType === 'session' || generator.authenticationType === 'oauth2', path: ANGULAR_DIR, templates: ['core/auth/auth-session.service.ts'] } ], clientTestFw: [ { path: TEST_SRC_DIR, templates: [ 'jest.conf.js', 'jest.ts', 'jest-global-mocks.ts', 'spec/test.module.ts', 'spec/app/admin/configuration/configuration.component.spec.ts', 'spec/app/admin/configuration/configuration.service.spec.ts', 'spec/app/admin/health/health.component.spec.ts', 'spec/app/admin/logs/logs.component.spec.ts', 'spec/app/admin/logs/logs.service.spec.ts', 'spec/app/admin/metrics/metrics.component.spec.ts', 'spec/app/admin/metrics/metrics.service.spec.ts', 'spec/app/core/user/account.service.spec.ts', 'spec/helpers/spyobject.ts', 'spec/helpers/mock-account.service.ts', 'spec/helpers/mock-route.service.ts', 'spec/helpers/mock-login.service.ts', 'spec/helpers/mock-event-manager.service.ts', 'spec/helpers/mock-state-storage.service.ts', 'spec/helpers/mock-alert.service.ts' ] }, { condition: generator => generator.styleLibrary === 'bootstrap', path: TEST_SRC_DIR, templates: ['spec/helpers/mock-active-modal.service.ts'] }, { condition: generator => generator.authenticationType !== 'oauth2', path: TEST_SRC_DIR, templates: [ 'spec/app/account/activate/activate.component.spec.ts', 'spec/app/account/password/password.component.spec.ts', 'spec/app/account/password/password-strength-bar.component.spec.ts', 'spec/app/account/password-reset/init/password-reset-init.component.spec.ts', 'spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts', 'spec/app/account/register/register.component.spec.ts', 'spec/app/account/settings/settings.component.spec.ts', // login component tests 'spec/app/shared/login/login.component.spec.ts', 'spec/app/shared/alert/alert-error.component.spec.ts' ] }, { condition: generator => generator.databaseType !== 'no' && generator.databaseType !== 'cassandra', path: TEST_SRC_DIR, templates: ['spec/app/admin/audits/audits.component.spec.ts', 'spec/app/admin/audits/audits.service.spec.ts'] }, { condition: generator => !generator.skipUserManagement, path: TEST_SRC_DIR, templates: [ 'spec/app/admin/user-management/user-management.component.spec.ts', 'spec/app/admin/user-management/user-management-detail.component.spec.ts', 'spec/app/admin/user-management/user-management-update.component.spec.ts', 'spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts', // user service tests 'spec/app/core/user/user.service.spec.ts' ] }, { condition: generator => generator.authenticationType === 'session', path: TEST_SRC_DIR, templates: ['spec/app/account/sessions/sessions.component.spec.ts'] }, { condition: generator => generator.enableTranslation, path: TEST_SRC_DIR, templates: ['spec/helpers/mock-language.service.ts'] }, { condition: generator => generator.websocket === 'spring-websocket', path: TEST_SRC_DIR, templates: ['spec/helpers/mock-tracker.service.ts'] }, { condition: generator => generator.protractorTests, path: TEST_SRC_DIR, templates: [ 'e2e/account/account.spec.ts', 'e2e/admin/administration.spec.ts', 'e2e/page-objects/jhi-page-objects.ts', 'protractor.conf.js' ] }, { condition: generator => generator.authenticationType === 'oauth2', path: TEST_SRC_DIR, templates: ['spec/app/layouts/main/main.component.spec.ts'] } ] }; module.exports = { writeFiles, files }; function writeFiles() { mkdirp(MAIN_SRC_DIR); // write angular 2.x and above files this.writeFilesToDisk(files, this, false, this.fetchFromInstalledJHipster('client/templates/angular')); }