devui-admin-test
Version:
Schematics for ng-devui-admin
74 lines (64 loc) • 2.71 kB
text/typescript
import { apply, chain, Rule, Tree, url, applyTemplates, move, mergeWith, schematic, SchematicsException } from '@angular-devkit/schematics';
import { strings } from '@angular-devkit/core';
import { Schema as ViewOptions } from './schema';
import { findModule, buildRelativePath } from '@schematics/angular/utility/find-module';
import { addDeclaration, addRouteToNgModule, getModuleName, getRoutingModule, insertTSArray } from '../utils';
function genAddMaterialsRules(blocks: string[], options: ViewOptions): Rule {
let rules: Rule[] = [];
blocks.forEach((block) => {
rules.push(
schematic('blocks', {
blockName: block,
dirPath: `${options.dirPath}/${strings.dasherize(options.viewName)}`,
importWay: options.importWay,
})
);
});
return chain(rules);
}
function buildPageRoute(options: ViewOptions, modulePath: string): string {
return `{ title: '${strings.classify(options.viewName)}', link: '/pages/${getModuleName(modulePath)}/${options.routePath}' },`;
}
export default function (options: ViewOptions): Rule {
return (tree: Tree) => {
const templateSource = apply(url('./files'), [
applyTemplates({
viewName: options.viewName,
style: options.style,
selector: options.selector,
dasherize: strings.dasherize,
classify: strings.classify,
}),
move(options.dirPath),
]);
// 创建空页面啊后,在插入的module中引入页面的declaration
const modulePath = findModule(tree, options.dirPath);
const componentName = `${strings.classify(options.viewName)}Component`;
const relativePath = buildRelativePath(
modulePath,
`/${options.dirPath}/${strings.dasherize(options.viewName)}/${strings.dasherize(options.viewName)}.component`
);
let routingModulePath = getRoutingModule(tree, modulePath);
if (routingModulePath) {
addRouteToNgModule(tree, routingModulePath, options.viewName, options.routePath, relativePath);
if (options.addToNav) {
insertTSArray(tree, '/src/app/pages/pages.component.ts', buildPageRoute(options, modulePath), 'this.menu', 'end');
}
} else {
throw new SchematicsException('Please make sure a routing module is existed.');
}
let blocks: string[] = [];
if (options.blocks) {
blocks = options.blocks.split(' ');
}
if (blocks.length > 0) {
return chain([
mergeWith(templateSource),
addDeclaration(componentName, modulePath, relativePath),
genAddMaterialsRules(blocks, options),
]);
} else {
return chain([mergeWith(templateSource), addDeclaration(componentName, modulePath, relativePath)]);
}
};
}