UNPKG

devui-admin-test

Version:

Schematics for ng-devui-admin

170 lines (151 loc) 5.23 kB
import { apply, applyTemplates, chain, mergeWith, move, Rule, SchematicContext, SchematicsException, Tree, url, } from '@angular-devkit/schematics'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; import { addPackage, modifyAngularJson, PACKAGE_JSON_PATH, ANGULAR_JSON_PATH, PACKAGES_I18N, STYLES, PACKAGES } from '../utils'; import * as fs from 'fs'; import * as path from 'path'; import { Schema as AddOptions } from './schema'; let projectWorkspace: { root: string; sourceRoot: string; defaultProject: string; }; function getWorkSpace(tree: Tree) { let angularJSON; if (tree.read(ANGULAR_JSON_PATH)) { angularJSON = JSON.parse(tree.read(ANGULAR_JSON_PATH)?.toString() as string); } else { throw new SchematicsException('Please make sure the project is an Angular project.'); } let defaultProject = angularJSON.defaultProject; projectWorkspace = { root: '/', sourceRoot: angularJSON.projects[defaultProject].sourceRoot, defaultProject, }; return projectWorkspace; } function removeOriginalFiles() { return (tree: Tree) => { [ `${projectWorkspace.root}/README.md`, `${projectWorkspace.root}/tslint.json`, `${projectWorkspace.sourceRoot}/main.ts`, `${projectWorkspace.sourceRoot}/index.html`, `${projectWorkspace.sourceRoot}/styles.scss`, `${projectWorkspace.sourceRoot}/styles.css`, `${projectWorkspace.sourceRoot}/favicon.ico`, `${projectWorkspace.sourceRoot}/app/app.module.ts`, `${projectWorkspace.sourceRoot}/app/app.component.spec.ts`, `${projectWorkspace.sourceRoot}/app/app.component.ts`, `${projectWorkspace.sourceRoot}/app/app.component.html`, `${projectWorkspace.sourceRoot}/app/app.component.scss`, `${projectWorkspace.sourceRoot}/app/app.component.css`, `${projectWorkspace.sourceRoot}/app/app-routing.module.ts`, ] .filter((f) => tree.exists(f)) .forEach((f) => tree.delete(f)); }; } function modifyTsConfig(): Rule { return (tree: Tree) => { const configPath = path.join(__dirname, '..', '..', '..', '..', 'tsconfig.json'); let content = fs.readFileSync(configPath, 'utf-8'); let strContent; if (content) { strContent = JSON.parse(content.replace(/\/\*(.*?)\*\//, '')); strContent.compilerOptions['strict'] = false; strContent.compilerOptions['noImplicitReturns'] = false; strContent.angularCompilerOptions['strictPropertyInitialization'] = false; } else { throw new SchematicsException('Please make sure there is a tsconfig.json.'); } tree.overwrite('tsconfig.json', JSON.stringify(strContent, null, 2)); return tree; }; } function addDependencies(options: AddOptions): Rule { return (tree: Tree) => { const packages = options.i18n ? PACKAGES_I18N : PACKAGES; addPackage(tree, packages, 'dependencies'); }; } function addLintFiles(options: AddOptions, tree: Tree): Rule { if (options.eslintFile) { addLintScripts(tree); return chain([mergeWith(apply(url('./files/lint-files'), [move(projectWorkspace.root)]))]); } else { return chain([]); } } function addLintScripts(tree: Tree) { let packageJson; if (tree.read(PACKAGE_JSON_PATH)) { packageJson = JSON.parse(tree.read(PACKAGE_JSON_PATH)?.toString() as string); } else { throw new SchematicsException('Please make sure there is a package.json file in your project.'); } packageJson.scripts['prettier'] = 'prettier --config ./.prettierrc --write "src/app/pages/**/**/*.html"'; packageJson.scripts['stylelint'] = 'stylelint "src/app/pages/**/**/*.{scss,css}" --config ./.stylelintrc.json --fix'; packageJson.scripts['tslint'] = 'tslint --fix -c ./tslint.json "src/**/*{.ts}"'; tree.overwrite(PACKAGE_JSON_PATH, JSON.stringify(packageJson, null, 2)); } function addSourceFiles(options: AddOptions): Rule { return chain([ mergeWith( apply(url('./files/src'), [ applyTemplates({ defaultLanguage: options.defaultLanguage, i18n: options.i18n, mock: options.mock, }), move(projectWorkspace.sourceRoot), ]) ), ]); } function addI18nFiles(options: AddOptions): Rule { if (options.i18n) { return chain([mergeWith(apply(url('./files/i18n'), [move(`${projectWorkspace.sourceRoot}/assets/i18n`)]))]); } else { return chain([]); } } function addMockFiles(options: AddOptions): Rule { if (options.mock) { return chain([mergeWith(apply(url('./files/mock-files'), [move(`${projectWorkspace.sourceRoot}/app/@core`)]))]); } else { return chain([]); } } function installPackages(): Rule { return (_tree: Tree, context: SchematicContext) => { context.addTask(new NodePackageInstallTask()); }; } export default function (options: AddOptions): Rule { return (tree: Tree) => { getWorkSpace(tree); return chain([ removeOriginalFiles(), modifyAngularJson(STYLES, projectWorkspace.defaultProject), modifyTsConfig(), addDependencies(options), addLintFiles(options, tree), addSourceFiles(options), addI18nFiles(options), addMockFiles(options), installPackages(), ]); }; }