85 lines
2.7 KiB
JavaScript
85 lines
2.7 KiB
JavaScript
/**
|
|
* Generador de módulos ERP
|
|
* - module: bounded context (carpeta en modules/)
|
|
* - name: agregado principal (usa placeholders en plantillas)
|
|
* - plural: rutas/tabla (override del plural generado)
|
|
*/
|
|
|
|
import {
|
|
camelCase,
|
|
capitalCase,
|
|
constantCase,
|
|
dotCase,
|
|
kebabCase,
|
|
pascalCase,
|
|
snakeCase,
|
|
} from "change-case";
|
|
|
|
/**
|
|
* Generador de módulos ERP
|
|
* @remarks
|
|
* - `module` -> bounded context (carpeta en `modules/`)
|
|
* - `name` -> agregado principal (singular)
|
|
* - `plural` -> plural del agregado para rutas/tablas (override manual si hace falta)
|
|
* - Helpers -> registrados con los nombres usados en las plantillas (.hbs)
|
|
*/
|
|
export default function (plop) {
|
|
/** Helpers de casing para usar en hbs */
|
|
plop.setHelper("kebabCase", (s) => kebabCase(String(s || "")));
|
|
plop.setHelper("camelCase", (s) => camelCase(String(s || "")));
|
|
plop.setHelper("pascalCase", (s) => pascalCase(String(s || "")));
|
|
plop.setHelper("snakeCase", (s) => snakeCase(String(s || "")));
|
|
plop.setHelper("constantCase", (s) => constantCase(String(s || "")));
|
|
plop.setHelper("capitalCase", (s) => capitalCase(String(s || "")));
|
|
plop.setHelper("dotCase", (s) => dotCase(String(s || "")));
|
|
|
|
/** Validadores simples */
|
|
const isKebab = (v) =>
|
|
(!!v && /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(v)) ||
|
|
"Usa kebab-case (empieza por letra; letras/números/guiones).";
|
|
|
|
plop.setGenerator("module", {
|
|
description: "Crea un nuevo módulo (bounded context) con un agregado principal",
|
|
prompts: [
|
|
{
|
|
type: "input",
|
|
name: "module",
|
|
message: "Bounded context (kebab-case, p.ej. 'customer-payments'):",
|
|
validate: isKebab,
|
|
filter: (v) => kebabCase(v),
|
|
},
|
|
{
|
|
type: "input",
|
|
name: "name",
|
|
message: "Agregado principal (kebab-case, p.ej. 'customer-payment'):",
|
|
validate: isKebab,
|
|
filter: (v) => kebabCase(v),
|
|
},
|
|
{
|
|
type: "input",
|
|
name: "plural",
|
|
message: "Plural del agregado (kebab-case) — ENTER para sufijo 's':",
|
|
filter: (v, answers) => (v?.trim() ? kebabCase(v) : `${kebabCase(answers.name)}s`),
|
|
validate: isKebab,
|
|
},
|
|
],
|
|
actions: (answers) => {
|
|
const dest = `modules/${kebabCase(answers.module)}`;
|
|
/**
|
|
* addMany copiará la plantilla completa en la carpeta del bounded context
|
|
* usando los placeholders de las plantillas existentes (name/plural).
|
|
*/
|
|
const actions = [
|
|
{
|
|
type: "addMany",
|
|
destination: dest,
|
|
base: "templates/new-module",
|
|
templateFiles: "templates/new-module/**",
|
|
abortOnFail: true,
|
|
},
|
|
];
|
|
return actions;
|
|
},
|
|
});
|
|
}
|