From dd84b9d64fb98746a230cd24233ff50a562c39c9 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Fri, 28 Apr 2023 01:36:44 +0800 Subject: --- packages/turbo-codemod/src/utils/checkGitStatus.ts | 40 ++++++++++++++++++ packages/turbo-codemod/src/utils/directoryInfo.ts | 10 +++++ .../turbo-codemod/src/utils/getPackageManager.ts | 42 +++++++++++++++++++ .../src/utils/getPackageManagerVersion.ts | 16 ++++++++ .../src/utils/getTransformerHelpers.ts | 23 +++++++++++ .../turbo-codemod/src/utils/loadTransformers.ts | 27 +++++++++++++ packages/turbo-codemod/src/utils/logger.ts | 47 ++++++++++++++++++++++ packages/turbo-codemod/src/utils/looksLikeRepo.ts | 12 ++++++ packages/turbo-codemod/src/utils/notifyUpdate.ts | 35 ++++++++++++++++ 9 files changed, 252 insertions(+) create mode 100644 packages/turbo-codemod/src/utils/checkGitStatus.ts create mode 100644 packages/turbo-codemod/src/utils/directoryInfo.ts create mode 100644 packages/turbo-codemod/src/utils/getPackageManager.ts create mode 100644 packages/turbo-codemod/src/utils/getPackageManagerVersion.ts create mode 100644 packages/turbo-codemod/src/utils/getTransformerHelpers.ts create mode 100644 packages/turbo-codemod/src/utils/loadTransformers.ts create mode 100644 packages/turbo-codemod/src/utils/logger.ts create mode 100644 packages/turbo-codemod/src/utils/looksLikeRepo.ts create mode 100644 packages/turbo-codemod/src/utils/notifyUpdate.ts (limited to 'packages/turbo-codemod/src/utils') 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 { + 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 { + 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 + } +} -- cgit v1.2.3-70-g09d2