aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-codemod/src/commands/transform/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-codemod/src/commands/transform/index.ts')
-rw-r--r--packages/turbo-codemod/src/commands/transform/index.ts101
1 files changed, 101 insertions, 0 deletions
diff --git a/packages/turbo-codemod/src/commands/transform/index.ts b/packages/turbo-codemod/src/commands/transform/index.ts
new file mode 100644
index 0000000..e3b86aa
--- /dev/null
+++ b/packages/turbo-codemod/src/commands/transform/index.ts
@@ -0,0 +1,101 @@
+import chalk from "chalk";
+import inquirer from "inquirer";
+
+import loadTransformers from "../../utils/loadTransformers";
+import checkGitStatus from "../../utils/checkGitStatus";
+import directoryInfo from "../../utils/directoryInfo";
+import type {
+ TransformCommandOptions,
+ TransformCommandArgument,
+} from "./types";
+import { Runner } from "../../runner";
+
+export default async function transform(
+ transform: TransformCommandArgument,
+ directory: TransformCommandArgument,
+ options: TransformCommandOptions
+) {
+ const transforms = loadTransformers();
+ if (options.list) {
+ console.log(
+ transforms
+ .map((transform) => `- ${chalk.cyan(transform.value)}`)
+ .join("\n")
+ );
+ return process.exit(0);
+ }
+
+ // check git status
+ if (!options.dry) {
+ checkGitStatus({ directory, force: options.force });
+ }
+
+ const answers = await inquirer.prompt<{
+ directoryInput?: string;
+ transformerInput?: string;
+ }>([
+ {
+ type: "input",
+ name: "directoryInput",
+ message: "Where is the root of the repo where the transform should run?",
+ when: !directory,
+ default: ".",
+ validate: (directory: string) => {
+ const { exists, absolute } = directoryInfo({ directory });
+ if (exists) {
+ return true;
+ } else {
+ return `Directory ${chalk.dim(`(${absolute})`)} does not exist`;
+ }
+ },
+ filter: (directory: string) => directory.trim(),
+ },
+ {
+ type: "list",
+ name: "transformerInput",
+ message: "Which transform would you like to apply?",
+ when: !transform,
+ pageSize: transforms.length,
+ choices: transforms,
+ },
+ ]);
+
+ const {
+ directoryInput: selectedDirectory = directory as string,
+ transformerInput: selectedTransformer = transform as string,
+ } = answers;
+ const { exists, absolute: root } = directoryInfo({
+ directory: selectedDirectory,
+ });
+ if (!exists) {
+ console.error(`Directory ${chalk.dim(`(${root})`)} does not exist`);
+ return process.exit(1);
+ }
+
+ const transformKeys = transforms.map((transform) => transform.value);
+ const transformData = transforms.find(
+ (transform) => transform.value === selectedTransformer
+ );
+
+ // validate transforms
+ if (!transformData) {
+ console.error(
+ `Invalid transform choice ${chalk.dim(`(${transform})`)}, pick one of:`
+ );
+ console.error(transformKeys.map((key) => `- ${key}`).join("\n"));
+ return process.exit(1);
+ }
+
+ // run the transform
+ const result = transformData.transformer({
+ root,
+ options,
+ });
+
+ if (result.fatalError) {
+ // Runner already logs this, so we can just exit
+ return process.exit(1);
+ }
+
+ Runner.logResults(result);
+}