From 9cd7adb15e30fa03a11830091eebf15d9742fb6e Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 28 Oct 2026 16:21:06 -0700 Subject: [PATCH 1/2] Allow builds to skip source generation Avoid unnecessary generator work when building with existing generated sources. --- Herebyfile.mjs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Herebyfile.mjs b/Herebyfile.mjs index 3ecad38769fd5..9af5809bf1fd8 100644 --- a/Herebyfile.mjs +++ b/Herebyfile.mjs @@ -102,6 +102,7 @@ const { values: rawOptions } = parseArgs({ tests: { type: "string", short: "t" }, fix: { type: "boolean" }, force: { type: "boolean", default: parseEnvBoolean("FORCE") }, + skipGenerate: { type: "boolean" }, api: { type: "boolean" }, all: { type: "boolean" }, debug: { type: "boolean" }, @@ -783,10 +784,12 @@ export const generate = task({ run: runGenerate, }); +const generateDependencies = options.skipGenerate ? [] : [generate]; + export const tscBuild = task({ name: "tsc:build", - description: "Generates sources and builds the tsc binary.", - dependencies: [generate], + description: "Generates sources and builds the tsc binary. Pass --skipGenerate to use existing generated sources.", + dependencies: generateDependencies, run: async () => { await buildTsc({ extraFlags: options.release ? getReleaseBuildFlags() : [] }); }, @@ -823,7 +826,9 @@ export const buildWatch = task({ await watchDebounced("build:watch", async (_paths, abortSignal) => { abortSignal.throwIfAborted(); invalidateFileFingerprints(); - await runGenerate(); + if (!options.skipGenerate) { + await runGenerate(); + } abortSignal.throwIfAborted(); await generateLibs(builtLocal); abortSignal.throwIfAborted(); @@ -1105,7 +1110,7 @@ export const testCodegen = task({ export const buildAPI = task({ name: "build:api", description: "Builds @typescript/typescript JS API.", - dependencies: [generate], + dependencies: generateDependencies, run: async () => { await run("npm", ["run", "-w", "@typescript/typescript", "build"]); }, @@ -1129,7 +1134,7 @@ async function runBuildAPITests() { export const buildAPITests = task({ name: "build:api:test", description: "Builds the @typescript/typescript JS API tests.", - dependencies: [generate], + dependencies: generateDependencies, run: runBuildAPITests, }); @@ -2335,7 +2340,7 @@ function stripConditionsFromValue(value) { export const buildNativePreviewPackages = task({ name: "typescript:build", description: "Builds TypeScript npm packages for the current platform. Pass --respectGoEnv to preserve caller-provided Go build settings.", - dependencies: usePublishedPlatformPackagesForVsix ? undefined : [generate], + dependencies: usePublishedPlatformPackagesForVsix ? undefined : generateDependencies, run: runBuildNativePreviewPackages, }); @@ -3198,7 +3203,7 @@ export const vscodeTypescriptRelease = task({ export const nativePreviewRelease = task({ name: "typescript:release", hiddenFromTaskList: true, - dependencies: [generate], + dependencies: generateDependencies, run: async () => { if (releaseVscodeTypescript) { throw new Error("typescript:release cannot be used with --vscodeTypescriptRelease; use vscode-typescript:release"); From cfce82e3ab56bead0c36f7a90131440fde21c391 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 5 Nov 2026 16:22:41 -0800 Subject: [PATCH 2/2] Disable automatic source generation in CI by default CI builds can use the generated sources already checked in without running generators again. Keep an explicit override for workflows that need generation and local builds that want to skip it. --- Herebyfile.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Herebyfile.mjs b/Herebyfile.mjs index 49d2059794b51..9a294063a7459 100644 --- a/Herebyfile.mjs +++ b/Herebyfile.mjs @@ -103,7 +103,7 @@ const { values: rawOptions } = parseArgs({ tests: { type: "string", short: "t" }, fix: { type: "boolean" }, force: { type: "boolean", default: parseEnvBoolean("FORCE") }, - skipGenerate: { type: "boolean" }, + generate: { type: "boolean", default: !isCI }, api: { type: "boolean" }, all: { type: "boolean" }, debug: { type: "boolean" }, @@ -785,11 +785,11 @@ export const generate = task({ run: runGenerate, }); -const generateDependencies = options.skipGenerate ? [] : [generate]; +const generateDependencies = options.generate ? [generate] : []; export const tscBuild = task({ name: "tsc:build", - description: "Generates sources and builds the tsc binary. Pass --skipGenerate to use existing generated sources.", + description: "Builds the tsc binary, generating sources by default outside CI. Pass --generate or --no-generate to override.", dependencies: generateDependencies, run: async () => { await buildTsc({ extraFlags: options.release ? getReleaseBuildFlags() : [] }); @@ -827,7 +827,7 @@ export const buildWatch = task({ await watchDebounced("build:watch", async (_paths, abortSignal) => { abortSignal.throwIfAborted(); invalidateFileFingerprints(); - if (!options.skipGenerate) { + if (options.generate) { await runGenerate(); } abortSignal.throwIfAborted();