aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-codemod/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-codemod/src/utils')
-rw-r--r--packages/turbo-codemod/src/utils/checkGitStatus.ts40
-rw-r--r--packages/turbo-codemod/src/utils/directoryInfo.ts10
-rw-r--r--packages/turbo-codemod/src/utils/getPackageManager.ts42
-rw-r--r--packages/turbo-codemod/src/utils/getPackageManagerVersion.ts16
-rw-r--r--packages/turbo-codemod/src/utils/getTransformerHelpers.ts23
-rw-r--r--packages/turbo-codemod/src/utils/loadTransformers.ts27
-rw-r--r--packages/turbo-codemod/src/utils/logger.ts47
-rw-r--r--packages/turbo-codemod/src/utils/looksLikeRepo.ts12
-rw-r--r--packages/turbo-codemod/src/utils/notifyUpdate.ts35
9 files changed, 252 insertions, 0 deletions
diff --git a/packages/turbo-codemod/src/utils/checkGitStatus.ts b/packages/turbo-codemod/src/utils/checkGitStatus.ts
new file mode 100644
index 0000000..68d39ae
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/checkGitStatus.ts
@@ -0,0 +1,40 @@
+import chalk from "chalk";
+import isGitClean from "is-git-clean";
+
+export default function checkGitStatus({
+ directory,
+ force,
+}: {
+ directory?: string;
+ force: boolean;
+}) {
+ let clean = false;
+ let errorMessage = "Unable to determine if git directory is clean";
+ try {
+ clean = isGitClean.sync(directory || process.cwd());
+ errorMessage = "Git directory is not clean";
+ } catch (err: any) {
+ if (err && err.stderr && err.stderr.indexOf("not a git repository") >= 0) {
+ clean = true;
+ }
+ }
+
+ if (!clean) {
+ if (force) {
+ console.log(
+ `${chalk.yellow("WARNING")}: ${errorMessage}. Forcibly continuing...`
+ );
+ } else {
+ console.log("Thank you for using @turbo/codemod!");
+ console.log(
+ chalk.yellow(
+ "\nBut before we continue, please stash or commit your git changes."
+ )
+ );
+ console.log(
+ "\nYou may use the --force flag to override this safety check."
+ );
+ process.exit(1);
+ }
+ }
+}
diff --git a/packages/turbo-codemod/src/utils/directoryInfo.ts b/packages/turbo-codemod/src/utils/directoryInfo.ts
new file mode 100644
index 0000000..7cb3594
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/directoryInfo.ts
@@ -0,0 +1,10 @@
+import path from "path";
+import fs from "fs";
+
+export default function directoryInfo({ directory }: { directory: string }) {
+ const dir = path.isAbsolute(directory)
+ ? directory
+ : path.join(process.cwd(), directory);
+
+ return { exists: fs.existsSync(dir), absolute: dir };
+}
diff --git a/packages/turbo-codemod/src/utils/getPackageManager.ts b/packages/turbo-codemod/src/utils/getPackageManager.ts
new file mode 100644
index 0000000..1df0acc
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/getPackageManager.ts
@@ -0,0 +1,42 @@
+import findUp from "find-up";
+import path from "path";
+
+export type PackageManager = "yarn" | "pnpm" | "npm";
+
+const cache: { [cwd: string]: PackageManager } = {};
+
+export default function getPackageManager({
+ directory,
+}: { directory?: string } = {}): PackageManager | undefined {
+ const cwd = directory || process.cwd();
+ if (cache[cwd]) {
+ return cache[cwd];
+ }
+
+ const lockFile = findUp.sync(
+ ["yarn.lock", "pnpm-lock.yaml", "package-lock.json"],
+ {
+ cwd,
+ }
+ );
+
+ if (!lockFile) {
+ return;
+ }
+
+ switch (path.basename(lockFile)) {
+ case "yarn.lock":
+ cache[cwd] = "yarn";
+ break;
+
+ case "pnpm-lock.yaml":
+ cache[cwd] = "pnpm";
+ break;
+
+ case "package-lock.json":
+ cache[cwd] = "npm";
+ break;
+ }
+
+ return cache[cwd];
+}
diff --git a/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts b/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts
new file mode 100644
index 0000000..54a572a
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts
@@ -0,0 +1,16 @@
+import { execSync } from "child_process";
+import type { PackageManager } from "./getPackageManager";
+
+export default function getPackageManagerVersion(
+ packageManager: PackageManager,
+ root: string
+): string {
+ switch (packageManager) {
+ case "yarn":
+ return execSync("yarn --version", { cwd: root }).toString().trim();
+ case "pnpm":
+ return execSync("pnpm --version", { cwd: root }).toString().trim();
+ case "npm":
+ return execSync("npm --version", { cwd: root }).toString().trim();
+ }
+}
diff --git a/packages/turbo-codemod/src/utils/getTransformerHelpers.ts b/packages/turbo-codemod/src/utils/getTransformerHelpers.ts
new file mode 100644
index 0000000..e37da6e
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/getTransformerHelpers.ts
@@ -0,0 +1,23 @@
+import { TransformerOptions } from "../types";
+import { Runner } from "../runner";
+import Logger from "./logger";
+
+export default function getTransformerHelpers({
+ transformer,
+ rootPath,
+ options,
+}: {
+ transformer: string;
+ rootPath: string;
+ options: TransformerOptions;
+}) {
+ const utilArgs = {
+ transformer,
+ rootPath,
+ ...options,
+ };
+ const log = new Logger(utilArgs);
+ const runner = new Runner(utilArgs);
+
+ return { log, runner };
+}
diff --git a/packages/turbo-codemod/src/utils/loadTransformers.ts b/packages/turbo-codemod/src/utils/loadTransformers.ts
new file mode 100644
index 0000000..9ba5ca1
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/loadTransformers.ts
@@ -0,0 +1,27 @@
+import path from "path";
+import fs from "fs-extra";
+import type { Transformer } from "../types";
+
+// transforms/ is a sibling when built in in dist/
+export const transformerDirectory =
+ process.env.NODE_ENV === "test"
+ ? path.join(__dirname, "../transforms")
+ : path.join(__dirname, "./transforms");
+
+export default function loadTransformers(): Array<Transformer> {
+ const transformerFiles = fs.readdirSync(transformerDirectory);
+ return transformerFiles
+ .map((transformerFilename) => {
+ const transformerPath = path.join(
+ transformerDirectory,
+ transformerFilename
+ );
+ try {
+ return require(transformerPath).default;
+ } catch (e) {
+ // we ignore this error because it's likely that the file is not a transformer (README, etc)
+ return undefined;
+ }
+ })
+ .filter(Boolean);
+}
diff --git a/packages/turbo-codemod/src/utils/logger.ts b/packages/turbo-codemod/src/utils/logger.ts
new file mode 100644
index 0000000..123a836
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/logger.ts
@@ -0,0 +1,47 @@
+import chalk from "chalk";
+import { UtilityArgs } from "../types";
+
+export default class Logger {
+ transform: string;
+ dry: boolean;
+
+ constructor(args: UtilityArgs) {
+ this.transform = args.transformer;
+ this.dry = args.dry;
+ }
+ modified(...args: any[]) {
+ console.log(
+ chalk.green(` MODIFIED `),
+ ...args,
+ this.dry ? chalk.dim(`(dry run)`) : ""
+ );
+ }
+ unchanged(...args: any[]) {
+ console.log(
+ chalk.gray(` UNCHANGED `),
+ ...args,
+ this.dry ? chalk.dim(`(dry run)`) : ""
+ );
+ }
+ skipped(...args: any[]) {
+ console.log(
+ chalk.yellow(` SKIPPED `),
+ ...args,
+ this.dry ? chalk.dim(`(dry run)`) : ""
+ );
+ }
+ error(...args: any[]) {
+ console.log(
+ chalk.red(` ERROR `),
+ ...args,
+ this.dry ? chalk.dim(`(dry run)`) : ""
+ );
+ }
+ info(...args: any[]) {
+ console.log(
+ chalk.bold(` INFO `),
+ ...args,
+ this.dry ? chalk.dim(`(dry run)`) : ""
+ );
+ }
+}
diff --git a/packages/turbo-codemod/src/utils/looksLikeRepo.ts b/packages/turbo-codemod/src/utils/looksLikeRepo.ts
new file mode 100644
index 0000000..77f0e5c
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/looksLikeRepo.ts
@@ -0,0 +1,12 @@
+import path from "path";
+import { existsSync } from "fs-extra";
+
+const HINTS = ["package.json", "turbo.json", ".git"];
+
+export default function looksLikeRepo({
+ directory,
+}: {
+ directory: string;
+}): boolean {
+ return HINTS.some((hint) => existsSync(path.join(directory, hint)));
+}
diff --git a/packages/turbo-codemod/src/utils/notifyUpdate.ts b/packages/turbo-codemod/src/utils/notifyUpdate.ts
new file mode 100644
index 0000000..634ffd8
--- /dev/null
+++ b/packages/turbo-codemod/src/utils/notifyUpdate.ts
@@ -0,0 +1,35 @@
+import chalk from "chalk";
+import checkForUpdate from "update-check";
+
+import cliPkgJson from "../../package.json";
+import getWorkspaceImplementation from "./getPackageManager";
+
+const update = checkForUpdate(cliPkgJson).catch(() => null);
+
+export default async function notifyUpdate(): Promise<void> {
+ try {
+ const res = await update;
+ if (res?.latest) {
+ const ws = getWorkspaceImplementation();
+
+ console.log();
+ console.log(
+ chalk.yellow.bold("A new version of `@turbo/codemod` is available!")
+ );
+ console.log(
+ "You can update by running: " +
+ chalk.cyan(
+ ws === "yarn"
+ ? "yarn global add @turbo/codemod"
+ : ws === "pnpm"
+ ? "pnpm i -g @turbo/codemod"
+ : "npm i -g @turbo/codemod"
+ )
+ );
+ console.log();
+ }
+ process.exit();
+ } catch (_e: any) {
+ // ignore error
+ }
+}