@nestjs/schematics
Version:
Nest - modern, fast, powerful node.js web framework (@schematics)
65 lines (64 loc) • 2.41 kB
JavaScript
import { join, strings } from '@angular-devkit/core';
import { apply, branchAndMerge, chain, mergeWith, move, noop, template, url, } from '@angular-devkit/schematics';
import { formatFiles } from '../../utils/format-files.rule.js';
import { normalizeToKebabOrSnakeCase } from '../../utils/formatting.js';
import { ModuleDeclarator, } from '../../utils/module.declarator.js';
import { ModuleFinder } from '../../utils/module.finder.js';
import { NameParser } from '../../utils/name.parser.js';
import { isEsmProject, mergeSourceRoot, } from '../../utils/source-root.helpers.js';
export function main(options) {
options = transform(options);
return (tree, context) => {
options.isEsm = isEsmProject(tree);
return branchAndMerge(chain([
mergeSourceRoot(options),
addDeclarationToModule(options),
mergeWith(generate(options)),
options.format === true ? formatFiles() : noop(),
]))(tree, context);
};
}
function transform(source) {
const target = Object.assign({}, source);
target.metadata = 'imports';
target.type = 'module';
const location = new NameParser().parse(target);
target.name = normalizeToKebabOrSnakeCase(location.name);
target.path = normalizeToKebabOrSnakeCase(location.path);
target.language = target.language !== undefined ? target.language : 'ts';
target.path = target.flat
? target.path
: join(target.path, target.name);
return target;
}
function generate(options) {
return (context) => apply(url(join('./files', options.language)), [
template({
...strings,
...options,
}),
move(options.path),
])(context);
}
function addDeclarationToModule(options) {
return (tree) => {
if (options.skipImport !== undefined && options.skipImport) {
return tree;
}
options.module =
new ModuleFinder(tree).find({
name: options.name,
path: options.path,
}) ?? undefined;
if (!options.module) {
return tree;
}
const content = tree.read(options.module).toString();
const declarator = new ModuleDeclarator();
tree.overwrite(options.module, declarator.declare(content, {
...options,
isEsm: isEsmProject(tree),
}));
return tree;
};
}