diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/create-turbo/src/transforms | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'packages/create-turbo/src/transforms')
| -rw-r--r-- | packages/create-turbo/src/transforms/errors.ts | 17 | ||||
| -rw-r--r-- | packages/create-turbo/src/transforms/git-ignore.ts | 30 | ||||
| -rw-r--r-- | packages/create-turbo/src/transforms/index.ts | 13 | ||||
| -rw-r--r-- | packages/create-turbo/src/transforms/official-starter.ts | 73 | ||||
| -rw-r--r-- | packages/create-turbo/src/transforms/package-manager.ts | 26 | ||||
| -rw-r--r-- | packages/create-turbo/src/transforms/types.ts | 30 |
6 files changed, 189 insertions, 0 deletions
diff --git a/packages/create-turbo/src/transforms/errors.ts b/packages/create-turbo/src/transforms/errors.ts new file mode 100644 index 0000000..a5b8a7a --- /dev/null +++ b/packages/create-turbo/src/transforms/errors.ts @@ -0,0 +1,17 @@ +export type TransformErrorOptions = { + transform?: string; + fatal?: boolean; +}; + +export class TransformError extends Error { + public transform: string; + public fatal: boolean; + + constructor(message: string, opts?: TransformErrorOptions) { + super(message); + this.name = "TransformError"; + this.transform = opts?.transform ?? "unknown"; + this.fatal = opts?.fatal ?? true; + Error.captureStackTrace(this, TransformError); + } +} diff --git a/packages/create-turbo/src/transforms/git-ignore.ts b/packages/create-turbo/src/transforms/git-ignore.ts new file mode 100644 index 0000000..bb61ca7 --- /dev/null +++ b/packages/create-turbo/src/transforms/git-ignore.ts @@ -0,0 +1,30 @@ +import path from "path"; +import fs from "fs-extra"; +import { DEFAULT_IGNORE } from "../utils/git"; +import { TransformInput, TransformResult } from "./types"; +import { TransformError } from "./errors"; + +const meta = { + name: "git-ignore", +}; + +export async function transform(args: TransformInput): TransformResult { + const { prompts } = args; + const ignorePath = path.join(prompts.root, ".gitignore"); + try { + if (!fs.existsSync(ignorePath)) { + fs.writeFileSync(ignorePath, DEFAULT_IGNORE); + } else { + return { result: "not-applicable", ...meta }; + } + } catch (err) { + // existsSync cannot throw, so we don't need to narrow here and can + // assume this came from writeFileSync + throw new TransformError("Unable to write .gitignore", { + transform: meta.name, + fatal: false, + }); + } + + return { result: "success", ...meta }; +} diff --git a/packages/create-turbo/src/transforms/index.ts b/packages/create-turbo/src/transforms/index.ts new file mode 100644 index 0000000..1918ecc --- /dev/null +++ b/packages/create-turbo/src/transforms/index.ts @@ -0,0 +1,13 @@ +import { transform as packageManagerTransform } from "./package-manager"; +import { transform as officialStarter } from "./official-starter"; +import { transform as gitIgnoreTransform } from "./git-ignore"; +import type { TransformInput, TransformResult } from "./types"; + +/** + * In the future, we may want to support sourcing additional transforms from the templates themselves. + */ +export const transforms: Array<(args: TransformInput) => TransformResult> = [ + officialStarter, + gitIgnoreTransform, + packageManagerTransform, +]; diff --git a/packages/create-turbo/src/transforms/official-starter.ts b/packages/create-turbo/src/transforms/official-starter.ts new file mode 100644 index 0000000..1d71909 --- /dev/null +++ b/packages/create-turbo/src/transforms/official-starter.ts @@ -0,0 +1,73 @@ +import path from "path"; +import fs from "fs-extra"; +import semverPrerelease from "semver/functions/prerelease"; +import cliPkgJson from "../../package.json"; +import { isDefaultExample } from "../utils/isDefaultExample"; +import { TransformInput, TransformResult } from "./types"; +import { TransformError } from "./errors"; + +const meta = { + name: "official-starter", +}; + +// applied to "official starter" examples (those hosted within vercel/turbo/examples) +export async function transform(args: TransformInput): TransformResult { + const { prompts, example } = args; + + const defaultExample = isDefaultExample(example.name); + const isOfficialStarter = + !example.repo || + (example.repo?.username === "vercel" && example.repo?.name === "turbo"); + + if (!isOfficialStarter) { + return { result: "not-applicable", ...meta }; + } + + // paths + const rootPackageJsonPath = path.join(prompts.root, "package.json"); + const rootMetaJsonPath = path.join(prompts.root, "meta.json"); + const hasPackageJson = fs.existsSync(rootPackageJsonPath); + + // 1. remove meta file (used for generating the examples page on turbo.build) + try { + fs.rmSync(rootMetaJsonPath, { force: true }); + } catch (_err) {} + + if (hasPackageJson) { + let packageJsonContent; + try { + packageJsonContent = fs.readJsonSync(rootPackageJsonPath); + } catch { + throw new TransformError("Unable to read package.json", { + transform: meta.name, + fatal: false, + }); + } + + // if using the basic example, set the name to the project name (legacy behavior) + if (packageJsonContent) { + if (defaultExample) { + packageJsonContent.name = prompts.projectName; + } + + // if we're using a pre-release version of create-turbo, install turbo canary instead of latest + const shouldUsePreRelease = semverPrerelease(cliPkgJson.version) !== null; + if (shouldUsePreRelease && packageJsonContent?.devDependencies?.turbo) { + packageJsonContent.devDependencies.turbo = "canary"; + } + + try { + fs.writeJsonSync(rootPackageJsonPath, packageJsonContent, { + spaces: 2, + }); + } catch (err) { + throw new TransformError("Unable to write package.json", { + transform: meta.name, + fatal: false, + }); + } + } + } + + return { result: "success", ...meta }; +} diff --git a/packages/create-turbo/src/transforms/package-manager.ts b/packages/create-turbo/src/transforms/package-manager.ts new file mode 100644 index 0000000..9c0af24 --- /dev/null +++ b/packages/create-turbo/src/transforms/package-manager.ts @@ -0,0 +1,26 @@ +import { convert } from "@turbo/workspaces"; +import { TransformInput, TransformResult } from "./types"; + +const meta = { + name: "package-manager", +}; + +export async function transform(args: TransformInput): TransformResult { + const { project, prompts } = args; + const { root, packageManager } = prompts; + + if (packageManager && project.packageManager !== packageManager.name) { + await convert({ + root, + to: packageManager.name, + options: { + // skip install after conversion- we will do it later + skipInstall: true, + }, + }); + } else { + return { result: "not-applicable", ...meta }; + } + + return { result: "success", ...meta }; +} diff --git a/packages/create-turbo/src/transforms/types.ts b/packages/create-turbo/src/transforms/types.ts new file mode 100644 index 0000000..6a8e141 --- /dev/null +++ b/packages/create-turbo/src/transforms/types.ts @@ -0,0 +1,30 @@ +import { CreateCommandOptions } from "../commands/create/types"; +import { RepoInfo } from "../utils/examples"; +import type { Project, PackageManager } from "@turbo/workspaces"; + +export interface TransformInput { + example: { + repo: RepoInfo | undefined; + name: string; + }; + project: Project; + prompts: { + projectName: string; + root: string; + packageManager: + | { + name: PackageManager; + version: string | undefined; + } + | undefined; + }; + opts: CreateCommandOptions; +} + +export interface TransformResponse { + // errors should be thrown as instances of TransformError + result: "not-applicable" | "success"; + name: string; +} + +export type TransformResult = Promise<TransformResponse>; |
