aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/create-turbo/src/transforms
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
commitdd84b9d64fb98746a230cd24233ff50a562c39c9 (patch)
treeb583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/create-turbo/src/transforms
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'packages/create-turbo/src/transforms')
-rw-r--r--packages/create-turbo/src/transforms/errors.ts17
-rw-r--r--packages/create-turbo/src/transforms/git-ignore.ts30
-rw-r--r--packages/create-turbo/src/transforms/index.ts13
-rw-r--r--packages/create-turbo/src/transforms/official-starter.ts73
-rw-r--r--packages/create-turbo/src/transforms/package-manager.ts26
-rw-r--r--packages/create-turbo/src/transforms/types.ts30
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>;