hotshot-mod-manager
Version:
97 lines (80 loc) • 2.67 kB
JavaScript
import inquirer from "inquirer";
import fs from "node:fs";
import path from "node:path";
import { cleanupString, configPath, getConfig, nameFixer } from "../main.js";
export async function generateServiceTrigger() {
const { routerModules } = await getConfig();
if (routerModules?.length === 0) {
throw new Error("No router modules found.");
}
const { serviceName, routerModule } = await inquirer.prompt([
{
type: "list",
name: "routerModule",
message: "Select a router module:",
choices: routerModules.map((m) => m.name),
validate: (input) =>
input.trim() ? true : "Router module cannot be empty.",
},
{
type: "input",
name: "serviceName",
message: "Enter the name of the service:",
validate: (input) =>
input.trim() ? true : "Service name cannot be empty.",
},
]);
if (serviceName) {
await generateService(routerModule, cleanupString(serviceName));
}
}
export async function generateService(modName, serviceName) {
const config = await getConfig();
const routerModule = config.routerModules.find((m) => m.name === modName);
if (!routerModule) {
throw new Error(`Router Module '${modName}' not found.`);
}
if (routerModule.services.includes(`${serviceName}_service`)) {
throw new Error(`Service '${serviceName}' already exists.`);
}
const serviceContent = serviceContents(serviceName);
/*
|-----------------------------------------------------------------------
| File System IO
|-----------------------------------------------------------------------
*/
const serviceDirPath = path.join(
process.cwd(),
"src",
"router_modules",
`${modName}_module`,
);
fs.writeFileSync(
path.join(serviceDirPath, `${serviceName}_services.ts`),
serviceContent,
);
/*
|-----------------------------------------------------------------------
| Config Update
|-----------------------------------------------------------------------
*/
routerModule.services.push(`${serviceName}_services`);
const updatedConfigContent = JSON.stringify(config, null, 2);
fs.writeFileSync(configPath, updatedConfigContent);
}
/*
|-----------------------------------------------------------------------
| Service Contents
|-----------------------------------------------------------------------
*/
function serviceContents(serviceName) {
const serviceClassName = `${nameFixer(serviceName, true)}Services`;
return `
import {response} from "@a4arpon/hotshot";
export class ${serviceClassName} {
async ${serviceName}() {
return response("Hi from ${serviceName}!");
}
}
`;
}