@mongez/gnz
Version:
Generator Z, the next generation of scaffolding tools.
95 lines (91 loc) • 4.47 kB
JavaScript
import {ensureDirectory,putFile}from'@mongez/fs';import {toKebabCase,toCamelCase}from'@mongez/reinforcements';import chalk from'chalk';import path from'path';import pluralize from'pluralize';import {generateWarlockHandler}from'../generate-warlock-controller-handler/index.js';import {generateWarlockOutput}from'../generate-warlock-output/index.js';import {generateWarlockRepository}from'../generate-warlock-repository/index.js';import {generateWarlockRestful}from'../generate-warlock-restful-controller/index.js';import {gnz}from'../../../main.js';import {generateMongoDBModel}from'../../generate-mongodb-model/index.js';import {getLocalesContent,generateSubModuleRoutesContent,generateModuleRoutesContent}from'./template.js';const generate = async (options) => {
const now = Date.now();
options.saveTo = options.subModule
? options.saveTo
: path.resolve(options.saveTo, toKebabCase(options.name));
const { name, saveTo } = options;
ensureDirectory(saveTo);
// generate output
const outputOptions = await gnz.execute(generateWarlockOutput.execute({
name: pluralize(options.name, 1),
saveTo: saveTo + "/output",
outputKeys: options.columns,
}));
// generate model
const modelOptions = await gnz.execute(generateMongoDBModel.execute({
collection: pluralize(options.name),
saveTo: saveTo + "/models",
outputClass: outputOptions.name,
outputClassPath: "./../../output/" + outputOptions.fileName,
columns: options.columns,
}));
// generate repository
const repositoryOptions = await gnz.execute(generateWarlockRepository.execute({
name: options.name,
saveTo: saveTo + "/repositories",
model: modelOptions.name,
}));
// generate restful controller
await gnz.execute(generateWarlockRestful.execute({
name: options.name,
saveTo: saveTo + "/controllers",
model: modelOptions.name,
repository: repositoryOptions.exportName,
repositoryPath: "./../repositories/" + repositoryOptions.fileName,
}));
// generate the list controller
await gnz.execute(generateWarlockHandler.execute({
name: "list-" + options.name,
saveTo: saveTo + "/controllers",
imports: [
`import { ${repositoryOptions.exportName} } from "../repositories/${repositoryOptions.fileName}";`,
],
content: `
const {documents: ${toCamelCase(pluralize(options.name))}, paginationInfo} = await ${repositoryOptions.exportName}.listActive(request.all());
return response.success({
${toCamelCase(pluralize(options.name))},
paginationInfo,
});
`,
}));
// generate the get controller
await gnz.execute(generateWarlockHandler.execute({
name: "get-" + options.name,
saveTo: saveTo + "/controllers",
imports: [
`import { ${repositoryOptions.exportName} } from "../repositories/${repositoryOptions.fileName}";`,
],
content: `
const ${toCamelCase(pluralize(options.name, 1))} = await ${repositoryOptions.exportName}.getActive(request.int("id"));
if (!${toCamelCase(pluralize(options.name, 1))}) {
return response.notFound();
}
return response.success({
${toCamelCase(pluralize(options.name, 1))},
});
`,
}));
if (options.withEvents) {
ensureDirectory(saveTo + "/events");
}
// create a utils directory
ensureDirectory(saveTo + "/utils");
// create a flags file
putFile(path.join(saveTo + "/utils", `flags.ts`), `// flags list`);
// create a types file
putFile(path.join(saveTo + "/utils", `types.ts`), `// types list`);
if (options.withLocales) {
putFile(path.join(saveTo + "/utils/locales.ts"), await getLocalesContent(options));
}
// routes file
const routesPath = path.join(saveTo + "/routes.ts");
if (options.subModule) {
putFile(routesPath, await generateSubModuleRoutesContent(options, routesPath));
}
else {
putFile(routesPath, await generateModuleRoutesContent(options));
}
console.log(` ${chalk.green(name)} module has been generated successfully in ${chalk.cyan(path
.relative(process.cwd(), path.join(path.resolve(saveTo), name))
.replaceAll("\\", "/"))} ${chalk.gray(`(${Date.now() - now}ms)`)}`);
};export{generate};//# sourceMappingURL=generator.js.map