这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,34 @@ const getTestTurboConfig = (
};

describe("migrate-env-var-dependencies", () => {
it("skips when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateConfig(config as any);

expect(doneConfig).toEqual(config);
});

describe("hasLegacyEnvVarDependencies - utility", () => {
it("finds env keys in legacy turbo.json - has keys", () => {
const config = getTestTurboConfig();
Expand Down
36 changes: 34 additions & 2 deletions packages/turbo-codemod/__tests__/set-default-outputs.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,45 @@
import { setupTestFixtures } from "@turbo/test-utils";
import { type Schema } from "@turbo/types";
import { SchemaV2, type Schema } from "@turbo/types";
import { describe, it, expect } from "@jest/globals";
import { transformer } from "../src/transforms/set-default-outputs";
import {
transformer,
migrateConfig,
} from "../src/transforms/set-default-outputs";

describe("set-default-outputs", () => {
const { useFixture } = setupTestFixtures({
directory: __dirname,
test: "set-default-outputs",
});

it("skips when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateConfig(config as any);

expect(doneConfig).toEqual(config);
});

it("migrates turbo.json outputs - basic", () => {
// load the fixture for the test
const { root, read } = useFixture({
Expand Down
63 changes: 62 additions & 1 deletion packages/turbo-codemod/__tests__/stabilize-env-mode.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,74 @@
import { setupTestFixtures } from "@turbo/test-utils";
import { describe, it, expect } from "@jest/globals";
import { transformer } from "../src/transforms/stabilize-env-mode";
import type { SchemaV2 } from "@turbo/types";
import {
transformer,
migrateRootConfig,
migrateTaskConfigs,
} from "../src/transforms/stabilize-env-mode";

describe("stabilize-env-mode", () => {
const { useFixture } = setupTestFixtures({
directory: __dirname,
test: "stabilize-env-mode",
});

it("skips migrateRootConfig when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateRootConfig(config as any);

expect(doneConfig).toEqual(config);
});

it("skips migrateTaskConfigs when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateTaskConfigs(config as any);

expect(doneConfig).toEqual(config);
});

it("migrates env-mode has-both", () => {
// load the fixture for the test
const { root, read } = useFixture({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,74 @@
import { setupTestFixtures } from "@turbo/test-utils";
import { describe, it, expect } from "@jest/globals";
import { transformer } from "../src/transforms/transform-env-literals-to-wildcards";
import type { SchemaV2 } from "@turbo/types";
import {
transformer,
migrateTaskConfigs,
migrateRootConfig,
} from "../src/transforms/transform-env-literals-to-wildcards";

describe.only("transform-env-literals-to-wildcards", () => {
const { useFixture } = setupTestFixtures({
directory: __dirname,
test: "transform-env-literals-to-wildcards",
});

it("skips migrateTaskConfigs when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateTaskConfigs(config as any);

expect(doneConfig).toEqual(config);
});

it("skips migrateRootConfigs when no pipeline key", () => {
const config: SchemaV2 = {
$schema: "./docs/public/schema.json",
globalDependencies: ["$GLOBAL_ENV_KEY"],
tasks: {
test: {
outputs: ["coverage/**/*"],
dependsOn: ["^build"],
},
lint: {
outputs: [],
},
dev: {
cache: false,
},
build: {
outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"],
dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"],
},
},
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument -- Testing a situation outside of types that users can get themselves into at runtime
const doneConfig = migrateRootConfig(config as any);

expect(doneConfig).toEqual(config);
});

it("migrates wildcards has-empty", () => {
// load the fixture for the test
const { root, read } = useFixture({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getTransformerHelpers } from "../utils/getTransformerHelpers";
import type { TransformerResults } from "../runner";
import type { Transformer, TransformerArgs } from "../types";
import { loadTurboJson } from "../utils/loadTurboJson";
import { isPipelineKeyMissing } from "../utils/is-pipeline-key-missing";

// transformer details
const TRANSFORMER = "migrate-env-var-dependencies";
Expand All @@ -14,6 +15,10 @@ const DESCRIPTION =
const INTRODUCED_IN = "1.5.0";

export function hasLegacyEnvVarDependencies(config: SchemaV1) {
if (isPipelineKeyMissing(config)) {
return { hasKeys: false };
}

const dependsOn = [
"extends" in config ? [] : config.globalDependencies,
Object.values(config.pipeline).flatMap(
Expand Down Expand Up @@ -93,6 +98,10 @@ export function migrateGlobal(config: SchemaV1) {
}

export function migrateConfig(config: SchemaV1) {
if (isPipelineKeyMissing(config)) {
return config;
}

const migratedConfig = migrateGlobal(config);
Object.keys(config.pipeline).forEach((pipelineKey) => {
config.pipeline;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type { Transformer, TransformerArgs } from "../types";
import { getTransformerHelpers } from "../utils/getTransformerHelpers";
import type { TransformerResults } from "../runner";
import { loadTurboJson } from "../utils/loadTurboJson";
import { isPipelineKeyMissing } from "../utils/is-pipeline-key-missing";

const DEFAULT_OUTPUTS = ["dist/**", "build/**"];

Expand All @@ -16,7 +17,11 @@ const DESCRIPTION =
const INTRODUCED_IN = "1.7.0";
const IDEMPOTENT = false;

function migrateConfig(config: SchemaV1) {
export function migrateConfig(config: SchemaV1) {
if (isPipelineKeyMissing(config)) {
return config;
}

for (const [_, taskDef] of Object.entries(config.pipeline)) {
if (taskDef.cache !== false) {
if (!taskDef.outputs) {
Expand Down
13 changes: 11 additions & 2 deletions packages/turbo-codemod/src/transforms/stabilize-env-mode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type { Transformer, TransformerArgs } from "../types";
import { getTransformerHelpers } from "../utils/getTransformerHelpers";
import type { TransformerResults } from "../runner";
import { loadTurboJson } from "../utils/loadTurboJson";
import { isPipelineKeyMissing } from "../utils/is-pipeline-key-missing";

// transformer details
const TRANSFORMER = "stabilize-env-mode";
Expand All @@ -26,7 +27,11 @@ type ExperimentalSchema = Omit<SchemaV1, "pipeline"> & {
pipeline: Record<string, ExperimentalPipeline>;
};

function migrateRootConfig(config: ExperimentalRootSchema) {
export function migrateRootConfig(config: ExperimentalRootSchema) {
if (isPipelineKeyMissing(config)) {
return config;
}

const oldConfig = config.experimentalGlobalPassThroughEnv;
const newConfig = config.globalPassThroughEnv;
// Set to an empty array is meaningful, so we have undefined as an option here.
Expand Down Expand Up @@ -58,7 +63,11 @@ function migrateRootConfig(config: ExperimentalRootSchema) {
return migrateTaskConfigs(config);
}

function migrateTaskConfigs(config: ExperimentalSchema) {
export function migrateTaskConfigs(config: ExperimentalSchema) {
if (isPipelineKeyMissing(config)) {
return config;
}

for (const [_, taskDef] of Object.entries(config.pipeline)) {
const oldConfig = taskDef.experimentalPassThroughEnv;
const newConfig = taskDef.passThroughEnv;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type { Transformer, TransformerArgs } from "../types";
import { getTransformerHelpers } from "../utils/getTransformerHelpers";
import type { TransformerResults } from "../runner";
import { loadTurboJson } from "../utils/loadTurboJson";
import { isPipelineKeyMissing } from "../utils/is-pipeline-key-missing";

// transformer details
const TRANSFORMER = "transform-env-literals-to-wildcards";
Expand All @@ -27,7 +28,11 @@ function transformEnvVarName(envVarName: string): EnvWildcard {
return output;
}

function migrateRootConfig(config: RootSchemaV1) {
export function migrateRootConfig(config: RootSchemaV1) {
if (isPipelineKeyMissing(config)) {
return config;
}

const { globalEnv, globalPassThroughEnv } = config;

if (Array.isArray(globalEnv)) {
Expand All @@ -40,7 +45,11 @@ function migrateRootConfig(config: RootSchemaV1) {
return migrateTaskConfigs(config);
}

function migrateTaskConfigs(config: SchemaV1) {
export function migrateTaskConfigs(config: SchemaV1) {
if (isPipelineKeyMissing(config)) {
return config;
}

for (const [_, taskDef] of Object.entries(config.pipeline)) {
const { env, passThroughEnv } = taskDef;

Expand Down
14 changes: 14 additions & 0 deletions packages/turbo-codemod/src/utils/is-pipeline-key-missing.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { PipelineV1, SchemaV1 } from "@turbo/types";

/** This utility allows us to check that the "pipeline" key exists,
* and early exit if it does not.
*
* Codemods for v1 assume that the "pipeline" key is present.
* However, this isn't a safe assumption.
* A user could run the codemod that changes the "pipeline" key to "tasks"
* and end up failing on a codemod that comes later. Later attempts to run the codemods would fail.
*
* See https://github.com/vercel/turborepo/issues/8495. */
export const isPipelineKeyMissing = (config: SchemaV1) => {
return !config.pipeline as unknown as PipelineV1 | undefined;
};
Loading