@ng-zen/cli
Version:
Angular UI components generator – Zen UI Kit CLI for schematics-based creation of customizable components like alert, avatar, button, card, checkbox, dialog, divider, form-control, icon, input, popover, radio, skeleton, switch, textarea with Storybook dem
51 lines (39 loc) • 1.87 kB
text/typescript
import { join, normalize, Path } from '@angular-devkit/core';
import { chain, Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
import { buildDefaultPath, getWorkspace } from '@schematics/angular/utility/workspace';
import { applyFileTemplateUtil } from '../../utils';
import { Schema as UiOptions, UiType } from './schema';
const DEFAULT_GENERATION_PATH = 'ui'; // src/app/ui
const FORM_CONTROL_DEPS: ReadonlySet<UiType> = new Set(['input', 'checkbox', 'switch', 'radio']);
function resolveFormControlDependency(
tree: Tree,
logger: SchematicContext['logger'],
ui: UiType[],
workingDirectory: Path
): void {
if (!ui.some(u => FORM_CONTROL_DEPS.has(u))) return;
const fcPath = normalize(`${workingDirectory}/form-control/form-control.ts`);
if (tree.exists(fcPath)) {
logger.info('ℹ form-control skipped — already exists');
} else {
ui.push('form-control');
logger.info('✔ form-control included (auto-included for form components)');
}
}
export function uiGenerator({ ui: selected, project, ...options }: UiOptions): Rule {
return async (tree: Tree, context: SchematicContext) => {
const workspace = await getWorkspace(tree);
const projectName = project || (workspace.extensions['defaultProject'] as string);
const projectObj = workspace.projects.get(projectName);
if (!projectObj) {
throw new Error(`Project "${projectName}" not found in workspace.`);
}
if (options.path === undefined) {
options.path = (buildDefaultPath(projectObj) + '/' + DEFAULT_GENERATION_PATH) as Path;
}
const workingDirectory = normalize(join(options.currentDirectory, options.path));
const ui = [...selected];
resolveFormControlDependency(tree, context.logger, ui, workingDirectory);
return chain([...applyFileTemplateUtil(ui, { ...options, path: workingDirectory })]);
};
}