/* * @Author: ferried * @Email: harlancui@outlook.com * @Date: 2021-03-04 09:54:09 * @LastEditTime: 2021-04-12 09:46:08 * @LastEditors: cuihaonan * @Description: Basic description * @FilePath: /stars/projects/stars/src/schematics/ng-add/index.ts * @LICENSE: NONE */ import { apply, chain, MergeStrategy, mergeWith, move, Rule, SchematicContext, template, Tree, url, } from '@angular-devkit/schematics'; import { getProjectFromWorkspace } from '@angular/cdk/schematics'; import { getWorkspace } from '@schematics/angular/utility/config'; import { addPackageJsonDependency, NodeDependency, NodeDependencyType, } from '@schematics/angular/utility/dependencies'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; import { Schema } from './schema'; const dependencies: NodeDependency[] = [ { type: NodeDependencyType.Default, version: '0.0.19', name: '@yunzai/stars', }, { type: NodeDependencyType.Default, version: '8.5.1', name: 'ng-zorro-antd' }, { type: NodeDependencyType.Default, version: '11.0.1', name: '@ngx-translate/core', }, { type: NodeDependencyType.Default, version: '7.2.0', name: '@stomp/ng2-stompjs', }, { type: NodeDependencyType.Default, version: '1.19.4', name: '@worktile/planet-postcss-prefixwrap', }, { type: NodeDependencyType.Default, version: '3.1.1', name: 'webpack-assets-manifest', }, { type: NodeDependencyType.Default, version: '8.4.1', name: '@angular-builders/custom-webpack', }, ]; export default function (_options: Schema): Rule { return (_tree: Tree, _context: SchematicContext) => { return chain([ // 生成依赖 generatePackageToPackageJson(_context), // 生成scripts sonar hooks generateScriptsSonarHooks(_context, _options), // 删除 removeOrginalFiles(_options), // 创建 addFiles(_tree, _context, _options), // 下载所有包 downLoadAllPackages(_context), ]); }; } export function generatePackageToPackageJson(_context: SchematicContext): Rule { return (host: Tree) => { dependencies.forEach((dependency) => { addPackageJsonDependency(host, dependency); _context.logger.log( 'info', `️Added "${dependency.name}" into ${dependency.type}` ); }); return host; }; } export function generateScriptsSonarHooks( _context: SchematicContext, options: Schema ): Rule { return (host: Tree) => { if (host.exists('package.json')) { // @ts-ignore const sourceText = host.read('package.json').toString('utf-8'); const json = JSON.parse(sourceText); if (!json.scripts) { json.scripts = {}; } else { json.scripts['rm'] = 'node ./scripts/rm.js'; json.scripts['cp'] = 'node ./scripts/cp.js'; json.scripts[ 'start' ] = `ng serve --deploy-url=/static/${options.project}/pc`; json.scripts[ 'build:local' ] = `ng build --prod --deploy-url=/${options.project}/static/pc/ --base-href=/${options.project}/page/pc`; json.scripts[ 'build:server' ] = `npm run rm .git & ng build --prod --deploy-url=/backstage/${options.project}/static/pc/ --base-href=/backstage/${options.project}/page/pc`; } host.overwrite('package.json', JSON.stringify(json, null, 2)); } return host; }; } export function downLoadAllPackages(_context: SchematicContext): Rule { return (host: Tree) => { _context.addTask(new NodePackageInstallTask()); return host; }; } function removeOrginalFiles(options: Schema) { return (host: Tree) => { const workspace = getWorkspace(host); const project = getProjectFromWorkspace(workspace, options.project); [ `${project.root}/angular.json`, `${project.root}/extra-webpack.config.js`, `${project.root}/postcss.config.js`, `${project.sourceRoot}/components.less`, `${project.sourceRoot}/index.html`, `${project.sourceRoot}/main.ts`, `${project.sourceRoot}/overlay.ts`, `${project.sourceRoot}/styles.less`, `${project.sourceRoot}/app/app.module.ts`, `${project.sourceRoot}/app/app.component.ts`, `${project.sourceRoot}/app/app.component.html`, `${project.sourceRoot}/app/app.component.less`, `${project.sourceRoot}/app/app-routing.module.ts`, `${project.sourceRoot}/common/act.guard.ts`, `${project.sourceRoot}/common/index.ts`, `${project.sourceRoot}/common/overlay-container.service.ts`, `${project.sourceRoot}/index/index.component.html`, `${project.sourceRoot}/index/index.component.less`, `${project.sourceRoot}/index/index.component.ts`, `${project.sourceRoot}/app/display-index/display-index.component.html`, `${project.sourceRoot}/app/display-index/display-index.component.less`, `${project.sourceRoot}/app/display-index/display-index.component.ts`, `${project.sourceRoot}/assets/img/default.png`, `${project.sourceRoot}/assets/img/intro.png`, `${project.sourceRoot}/assets/errorpage/bg404.svg`, `${project.sourceRoot}/assets/errorpage/simpleErrorBack.jpg`, `${project.sourceRoot}/environments/environment.prod.ts`, `${project.sourceRoot}/environments/environment.ts`, ] .filter((p) => host.exists(p)) .forEach((p) => host.delete(p)); return host; }; } function addFiles(_tree: Tree, _context: SchematicContext, options: Schema) { const workspace = getWorkspace(_tree); const project = getProjectFromWorkspace(workspace, options.project); return chain([ mergeWith( apply(url('./files'), [ template({ ...options, }), move(project.root as string), ]), MergeStrategy.Overwrite ), ]); }