UNPKG

@compas/cli

Version:

CLI containing utilities and simple script runner

113 lines (99 loc) 2.94 kB
import { isNil } from "@compas/stdlib"; import { codeModMap } from "../../code-mod/constants.js"; const codeModNameFlagValidator = (value) => { const isValid = !isNil(codeModMap[value]); if (isValid) { return { isValid, }; } return { isValid, error: { message: `The available names are:\n${Object.keys(codeModMap).join( ", ", )}\n\nTo get more details of a specific code-mod run 'compas code-mod list'.`, }, }; }; /** * @type {import("../../generated/common/types.js").CliCommandDefinitionInput} */ export const cliDefinition = { name: "code-mod", shortDescription: "Execute code-mods to help migrating to new Compas versions.", longDescription: `Since Compas generates quite a bit of boilerplate, this command can help you migrate to new Compas versions that have breaking changes in generated code. By detecting usage patterns of the generated output of a previous Compas version, it can migrate (most of) your usages to whatever the new version brings.`, modifiers: { isCosmetic: true, }, subCommands: [ { name: "list", shortDescription: "List the available code-mods.", }, { name: "exec", shortDescription: "Execute the specified code-mod.", flags: [ { name: "codeModName", rawName: "--name", description: "The code-mod name to execute.", modifiers: { isRequired: true, }, value: { specification: "string", validator: codeModNameFlagValidator, completions: () => { return { completions: Object.entries(codeModMap).map(([key, value]) => ({ type: "completion", name: key, description: value.description, })), }; }, }, }, ], }, ], executor: cliExecutor, }; /** * * @param {import("@compas/stdlib").Logger} logger * @param {import("../../cli/types.js").CliExecutorState} state * @returns {Promise<import("../../cli/types.js").CliResult>} */ export async function cliExecutor(logger, state) { if (state.command.includes("list")) { let str = `Available code-mods:\n`; for (const [key, value] of Object.entries(codeModMap)) { str += `- ${key}: ${value.description} Execute with '${state.cli.name} code-mod exec --name ${key}' `; } logger.info(str); return { exitStatus: "passed", }; } if (state.command.includes("exec")) { /** @type {string} */ // @ts-ignore const codeModName = state.flags.codeModName; const selectedCodeMod = codeModMap[codeModName]; logger.info(`Executing '${codeModName}' code-mod.\n`); await Promise.resolve(selectedCodeMod.exec(logger)); return { exitStatus: "passed", }; } return { exitStatus: "passed", }; }