From 4f7f107b95c599f42b5bf8acb25917912a75474d Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Thu, 1 Oct 2026 12:26:14 +0100 Subject: [PATCH 1/3] feat: allow forced deploy over remote conflicts --- .changeset/force-deploy-conflicts.md | 7 ++++++ .../__tests__/commands/deploy/index.test.ts | 23 ++++++++++++++++++- .../commands/hand-written-metadata.test.ts | 12 ++++++++++ .../src/__tests__/lib/deploy-context.test.ts | 20 ++++++++++++++++ .../src/__tests__/lib/deploy-input.test.ts | 1 + .../commands/_generated/_meta/commands.json | 8 +++++++ .../_meta/hand-written-commands.json | 8 +++++++ packages/cli/src/commands/deploy/index.ts | 7 ++++++ packages/cli/src/commands/deploy/meta.json | 8 +++++++ packages/cli/src/commands/deploy/shared.ts | 10 +++++++- packages/cli/src/lib/deploy-context.ts | 20 +++++++++++++--- packages/cli/src/lib/deploy-input.ts | 3 ++- 12 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 .changeset/force-deploy-conflicts.md create mode 100644 packages/cli/src/__tests__/lib/deploy-context.test.ts diff --git a/.changeset/force-deploy-conflicts.md b/.changeset/force-deploy-conflicts.md new file mode 100644 index 0000000000..4dae51e3d8 --- /dev/null +++ b/.changeset/force-deploy-conflicts.md @@ -0,0 +1,7 @@ +--- +"cf": minor +--- + +Add `--force` to `cf deploy` for CI conflict overrides + +Use `cf deploy --force` to upload a Worker when its last deployment came from the script API or its remote configuration conflicts with the local Build Output. Deploys remain strict by default. An aborted upload now exits without a success message, and the conflict error points to the supported `--force` option. diff --git a/packages/cli/src/__tests__/commands/deploy/index.test.ts b/packages/cli/src/__tests__/commands/deploy/index.test.ts index 83179415c7..a3d29c5278 100644 --- a/packages/cli/src/__tests__/commands/deploy/index.test.ts +++ b/packages/cli/src/__tests__/commands/deploy/index.test.ts @@ -1142,6 +1142,25 @@ describe("cf deploy", () => { }); describe("re-deploy existing worker", () => { + it("uploads an API-managed Worker in CI with --force", async () => { + const upload = mockWorkerUpload(); + mockExistingWorker({ lastDeployedFrom: "api" }); + await seed({ + ".cloudflare/output/v0/config.json": buildOutputRootConfig(), + ".cloudflare/output/v0/workers/default/worker.config.json": + workerConfig(), + ".cloudflare/output/v0/workers/default/bundle/index.js": + "export default { fetch() { return new Response('ok'); } }", + }); + + const { exitCode } = await runCf(["deploy", "--prebuilt", "--force"], { + CI: "true", + }); + + expect(exitCode).toBe(0); + expect(upload.metadata?.main_module).toBe("index.js"); + }); + it("aborts in strict mode when last deployed from api", async () => { const upload = mockWorkerUpload(); vi.stubEnv("WRANGLER_DOCKER_BIN", await seedDockerMock()); @@ -1188,11 +1207,13 @@ describe("cf deploy", () => { }), }); - await runCf(["deploy"]); + const { exitCode } = await runCf(["deploy"]); // strict mode + non-interactive rejects the overwrite; no upload happens + expect(exitCode).toBe(1); expect(upload.metadata).toBeUndefined(); expect(std.err).toContain("Aborting"); + expect(std.out + std.err).not.toContain("Deploy complete"); expect(readDockerCommands()).toEqual([]); }); }); diff --git a/packages/cli/src/__tests__/commands/hand-written-metadata.test.ts b/packages/cli/src/__tests__/commands/hand-written-metadata.test.ts index 6f46788a43..b1f48bd755 100644 --- a/packages/cli/src/__tests__/commands/hand-written-metadata.test.ts +++ b/packages/cli/src/__tests__/commands/hand-written-metadata.test.ts @@ -117,6 +117,18 @@ describe("hand-written command metadata", () => { }); }); + it("publishes the deploy force flag and its short alias", () => { + expect(commands.get("cf deploy")?.options).toContainEqual({ + name: "force", + alias: "f", + type: "boolean", + required: false, + description: + "Allow upload in CI despite conflicting remote Worker changes", + default: false, + }); + }); + it("publishes Preview prebuilt metadata", () => { expect(commands.get("cf previews deploy")?.options).toContainEqual({ name: "prebuilt", diff --git a/packages/cli/src/__tests__/lib/deploy-context.test.ts b/packages/cli/src/__tests__/lib/deploy-context.test.ts new file mode 100644 index 0000000000..9b2e991954 --- /dev/null +++ b/packages/cli/src/__tests__/lib/deploy-context.test.ts @@ -0,0 +1,20 @@ +import * as clack from "@clack/prompts"; +import { expect, it, vi } from "vitest"; +import { createDeployContext } from "../../lib/deploy-context.js"; + +it("points strict deploy aborts to the cf force flag", () => { + const error = vi.spyOn(clack.log, "error").mockImplementation(() => {}); + try { + const context = createDeployContext("test-token", "cf deploy --force"); + context.logger.error( + "Aborting the upload operation because of conflicts. To override and upload anyway, remove the `--strict` flag" + ); + + expect(error).toHaveBeenCalledWith( + "Aborting the upload operation because of conflicts. Rerun with `cf deploy --force` to override and upload anyway.", + { spacing: 0 } + ); + } finally { + error.mockRestore(); + } +}); diff --git a/packages/cli/src/__tests__/lib/deploy-input.test.ts b/packages/cli/src/__tests__/lib/deploy-input.test.ts index 58999d8a17..624f27766f 100644 --- a/packages/cli/src/__tests__/lib/deploy-input.test.ts +++ b/packages/cli/src/__tests__/lib/deploy-input.test.ts @@ -299,6 +299,7 @@ describe("transforms Build Output Specification into deploy input", () => { "dry-run": false, "secrets-file": undefined, prebuilt: false, + force: false, quiet: false, local: false, "persist-to": undefined, diff --git a/packages/cli/src/commands/_generated/_meta/commands.json b/packages/cli/src/commands/_generated/_meta/commands.json index 55a63965cc..7a709e3f0a 100644 --- a/packages/cli/src/commands/_generated/_meta/commands.json +++ b/packages/cli/src/commands/_generated/_meta/commands.json @@ -43177,6 +43177,14 @@ "description": "Deploy existing Build Output Specification files without building", "default": false }, + { + "name": "force", + "type": "boolean", + "required": false, + "description": "Allow upload in CI despite conflicting remote Worker changes", + "default": false, + "alias": "f" + }, { "name": "tag", "type": "string", diff --git a/packages/cli/src/commands/_generated/_meta/hand-written-commands.json b/packages/cli/src/commands/_generated/_meta/hand-written-commands.json index 45d89baf50..3a32850159 100644 --- a/packages/cli/src/commands/_generated/_meta/hand-written-commands.json +++ b/packages/cli/src/commands/_generated/_meta/hand-written-commands.json @@ -876,6 +876,14 @@ "description": "Deploy existing Build Output Specification files without building", "default": false }, + { + "name": "force", + "type": "boolean", + "required": false, + "description": "Allow upload in CI despite conflicting remote Worker changes", + "default": false, + "alias": "f" + }, { "name": "tag", "type": "string", diff --git a/packages/cli/src/commands/deploy/index.ts b/packages/cli/src/commands/deploy/index.ts index 7b16db14a0..281a918566 100644 --- a/packages/cli/src/commands/deploy/index.ts +++ b/packages/cli/src/commands/deploy/index.ts @@ -10,6 +10,13 @@ function builder(yargs: Argv) { "Automatically provision resources for bindings that need them", default: true, }) + .option("force", { + type: "boolean", + alias: "f", + description: + "Allow upload in CI despite conflicting remote Worker changes", + default: false, + }) .option("dispatch-namespace", { type: "string", description: diff --git a/packages/cli/src/commands/deploy/meta.json b/packages/cli/src/commands/deploy/meta.json index 1764501813..8f370ee52a 100644 --- a/packages/cli/src/commands/deploy/meta.json +++ b/packages/cli/src/commands/deploy/meta.json @@ -15,6 +15,14 @@ "description": "Deploy existing Build Output Specification files without building", "default": false }, + { + "name": "force", + "type": "boolean", + "required": false, + "description": "Allow upload in CI despite conflicting remote Worker changes", + "default": false, + "alias": "f" + }, { "name": "tag", "type": "string", diff --git a/packages/cli/src/commands/deploy/shared.ts b/packages/cli/src/commands/deploy/shared.ts index 05271cb438..a527d220db 100644 --- a/packages/cli/src/commands/deploy/shared.ts +++ b/packages/cli/src/commands/deploy/shared.ts @@ -23,6 +23,7 @@ import { validateBuildOutputMode, } from "../../lib/build-output.js"; import { getAccountId } from "../../lib/context.js"; +import { CliExit } from "../../lib/cli-exit.js"; import { createDeployContext } from "../../lib/deploy-context.js"; import { assembleBuildResult, @@ -80,6 +81,7 @@ export type SharedUploadArgs = InferArgs; type UploadCommand = { command: "Deploy" } | { command: "Version upload" }; type UploadArgs = SharedUploadArgs & { provision?: boolean; + force?: boolean; "preview-alias"?: string; "containers-rollout"?: "immediate" | "gradual" | "none"; }; @@ -146,7 +148,10 @@ async function uploadBuildOutput(argv: UploadArgs, ctx: UploadCommand) { }))); // Initialize the deploy-helpers context. - const deployContext = createDeployContext(authToken); + const deployContext = createDeployContext( + authToken, + ctx.command === "Deploy" ? "cf deploy --force" : undefined + ); initDeployHelpersContext(deployContext); initContainersSharedContext({ logger: deployContext.logger, @@ -205,6 +210,9 @@ async function uploadBuildOutput(argv: UploadArgs, ctx: UploadCommand) { analyseBundle: undefined, })); } + if (versionId === null && !argv["dry-run"]) { + throw new CliExit(1); + } if ( versionId !== null && diff --git a/packages/cli/src/lib/deploy-context.ts b/packages/cli/src/lib/deploy-context.ts index 28c4b0897c..8df3c541a5 100644 --- a/packages/cli/src/lib/deploy-context.ts +++ b/packages/cli/src/lib/deploy-context.ts @@ -10,6 +10,10 @@ import { confirm, prompt, select } from "./dialog.js"; import type { DeployHelpersContext } from "@cloudflare/deploy-helpers"; import type { Logger } from "@cloudflare/workers-utils"; +// deploy-helpers names Wrangler's --strict flag in this error; cf uses --force. +const STRICT_CONFLICT_ABORT = + "Aborting the upload operation because of conflicts. To override and upload anyway, remove the `--strict` flag"; + /** * Build the deploy-helpers context that `initDeployHelpersContext` needs. * @@ -21,7 +25,10 @@ import type { Logger } from "@cloudflare/workers-utils"; * credentials) args; the context-bound versions close over them so * deploy-helpers callers don't need to thread auth through every call. */ -export function createDeployContext(authToken: string): DeployHelpersContext { +export function createDeployContext( + authToken: string, + strictConflictOverrideCommand?: string +): DeployHelpersContext { const credentials = { apiToken: authToken }; const userAgent = USER_AGENT; @@ -59,8 +66,15 @@ export function createDeployContext(authToken: string): DeployHelpersContext { clack.log.message(args.join(" "), { spacing: 0 }), warn: (...args: unknown[]) => clack.log.warn(String(args.join(" ")), { spacing: 0 }), - error: (...args: unknown[]) => - clack.log.error(String(args.join(" ")), { spacing: 0 }), + error: (...args: unknown[]) => { + const message = String(args.join(" ")); + clack.log.error( + strictConflictOverrideCommand && message === STRICT_CONFLICT_ABORT + ? `Aborting the upload operation because of conflicts. Rerun with \`${strictConflictOverrideCommand}\` to override and upload anyway.` + : message, + { spacing: 0 } + ); + }, }; // The fetch closures capture auth credentials and user-agent, diff --git a/packages/cli/src/lib/deploy-input.ts b/packages/cli/src/lib/deploy-input.ts index 1a8867cf02..82c9eb1205 100644 --- a/packages/cli/src/lib/deploy-input.ts +++ b/packages/cli/src/lib/deploy-input.ts @@ -26,6 +26,7 @@ import type { type DeployUploadArgs = SharedUploadArgs & { provision?: boolean; + force?: boolean; "dispatch-namespace"?: string; "containers-rollout"?: "immediate" | "gradual" | "none"; }; @@ -116,7 +117,7 @@ export function createDeployProps( routes: resolveRoutes(config), logpush: config.logpush, dispatchNamespace: argv["dispatch-namespace"], - strict: true, + strict: !argv.force, legacyAssetPaths: undefined, oldAssetTtl: undefined, }; From 75d86af4bdd83e13f9d03d6767348a7d9cb133e6 Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Fri, 2 Oct 2026 12:27:08 +0100 Subject: [PATCH 2/3] fix: distinguish strict abort from null version deploy --- .../src/__tests__/commands/deploy/helpers.ts | 6 ++- .../__tests__/commands/deploy/index.test.ts | 49 ++++++++++++++----- packages/cli/src/commands/deploy/index.ts | 5 ++ packages/cli/src/commands/deploy/shared.ts | 3 +- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/packages/cli/src/__tests__/commands/deploy/helpers.ts b/packages/cli/src/__tests__/commands/deploy/helpers.ts index a7c220bc01..ee0b468f5d 100644 --- a/packages/cli/src/__tests__/commands/deploy/helpers.ts +++ b/packages/cli/src/__tests__/commands/deploy/helpers.ts @@ -309,6 +309,7 @@ export function mockWorkerUpload( captured: UploadCapture = {}, opts?: { dispatchNamespace?: string; + deploymentId?: string | null; onRequest?: (request: Request) => void; } ): UploadCapture { @@ -342,7 +343,10 @@ export function mockWorkerUpload( id: "test-script-id", etag: "test-etag", pipeline_hash: "test-pipeline-hash", - deployment_id: "test-version-id", + deployment_id: + opts?.deploymentId === undefined + ? "test-version-id" + : opts.deploymentId, tag: "test-tag", default_environment: { script: { diff --git a/packages/cli/src/__tests__/commands/deploy/index.test.ts b/packages/cli/src/__tests__/commands/deploy/index.test.ts index a3d29c5278..69e6502a03 100644 --- a/packages/cli/src/__tests__/commands/deploy/index.test.ts +++ b/packages/cli/src/__tests__/commands/deploy/index.test.ts @@ -160,6 +160,23 @@ describe("cf deploy", () => { expect(std.out).toContain("test-worker"); }); + it("accepts a successful upload without a version ID", async () => { + const upload = mockWorkerUpload({}, { deploymentId: null }); + await seed({ + ".cloudflare/output/v0/config.json": buildOutputRootConfig(), + ".cloudflare/output/v0/workers/default/worker.config.json": + workerConfig(), + ".cloudflare/output/v0/workers/default/bundle/index.js": + "export default { fetch() { return new Response('ok'); } }", + }); + + const { exitCode } = await runCf(["deploy", "--prebuilt"]); + + expect(exitCode).toBe(0); + expect(upload.metadata?.main_module).toBe("index.js"); + expect(std.out).toContain("Deployed"); + }); + it("deploys a standard Container from Build Output", async () => { vi.stubEnv("WRANGLER_DOCKER_BIN", await seedDockerMock()); const upload = mockWorkerUpload(); @@ -1256,21 +1273,27 @@ describe("cf deploy", () => { }); it("does not upload the worker", async () => { - const upload = mockWorkerUpload(); - await seed({ - ".cloudflare/output/v0/config.json": buildOutputRootConfig(), - ".cloudflare/output/v0/workers/default/worker.config.json": - workerConfig(), - ".cloudflare/output/v0/workers/default/bundle/index.js": - "export default { fetch() { return new Response('ok'); } }", - }); + const warn = vi.spyOn(clack.log, "warn").mockImplementation(() => {}); + try { + const upload = mockWorkerUpload(); + await seed({ + ".cloudflare/output/v0/config.json": buildOutputRootConfig(), + ".cloudflare/output/v0/workers/default/worker.config.json": + workerConfig(), + ".cloudflare/output/v0/workers/default/bundle/index.js": + "export default { fetch() { return new Response('ok'); } }", + }); - const { exitCode } = await runCf(["deploy", "--dry-run"]); + const { exitCode } = await runCf(["deploy", "--dry-run", "--force"]); - expect(exitCode).toBe(0); - expect(upload.metadata).toBeUndefined(); - expect(std.out).toContain("--dry-run: exiting now."); - expect(std.out).not.toContain("Deployed"); + expect(exitCode).toBe(0); + expect(upload.metadata).toBeUndefined(); + expect(std.out).toContain("--dry-run: exiting now."); + expect(std.out).not.toContain("Deployed"); + expect(warn).not.toHaveBeenCalled(); + } finally { + warn.mockRestore(); + } }); it("makes no API requests and needs no credentials", async () => { diff --git a/packages/cli/src/commands/deploy/index.ts b/packages/cli/src/commands/deploy/index.ts index 281a918566..a8a39ecc4d 100644 --- a/packages/cli/src/commands/deploy/index.ts +++ b/packages/cli/src/commands/deploy/index.ts @@ -37,6 +37,11 @@ const deployCommand: CommandModule = { describe: "Deploy a worker to Cloudflare", builder, handler: async (argv) => { + if (argv.force && !argv["dry-run"]) { + clack.log.warn( + "Using --force may overwrite conflicting remote Worker changes." + ); + } await runUpload(argv, { command: "Deploy" }); }, }; diff --git a/packages/cli/src/commands/deploy/shared.ts b/packages/cli/src/commands/deploy/shared.ts index a527d220db..4060fbec0b 100644 --- a/packages/cli/src/commands/deploy/shared.ts +++ b/packages/cli/src/commands/deploy/shared.ts @@ -210,7 +210,8 @@ async function uploadBuildOutput(argv: UploadArgs, ctx: UploadCommand) { analyseBundle: undefined, })); } - if (versionId === null && !argv["dry-run"]) { + // A successful upload can also return no version ID; strict-mode aborts set exitCode. + if (versionId === null && process.exitCode === 1 && !argv["dry-run"]) { throw new CliExit(1); } From c616bc58f9f5ac73a609339dae83294d878f0063 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Mon, 5 Oct 2026 09:44:43 +0100 Subject: [PATCH 3/3] fix: preserve reviewed deploy behavior after rebase --- .../__tests__/commands/deploy/index.test.ts | 37 ++++++++++++------- .../src/__tests__/lib/deploy-context.test.ts | 20 ---------- packages/cli/src/commands/deploy/index.ts | 1 + packages/cli/src/commands/deploy/shared.ts | 7 +--- packages/cli/src/lib/deploy-context.ts | 20 ++-------- 5 files changed, 29 insertions(+), 56 deletions(-) delete mode 100644 packages/cli/src/__tests__/lib/deploy-context.test.ts diff --git a/packages/cli/src/__tests__/commands/deploy/index.test.ts b/packages/cli/src/__tests__/commands/deploy/index.test.ts index 69e6502a03..a4184bce70 100644 --- a/packages/cli/src/__tests__/commands/deploy/index.test.ts +++ b/packages/cli/src/__tests__/commands/deploy/index.test.ts @@ -1,4 +1,5 @@ import { existsSync, readFileSync } from "node:fs"; +import * as clack from "@clack/prompts"; import { mockConsoleMethods, runInTempDir, @@ -1160,22 +1161,30 @@ describe("cf deploy", () => { describe("re-deploy existing worker", () => { it("uploads an API-managed Worker in CI with --force", async () => { - const upload = mockWorkerUpload(); - mockExistingWorker({ lastDeployedFrom: "api" }); - await seed({ - ".cloudflare/output/v0/config.json": buildOutputRootConfig(), - ".cloudflare/output/v0/workers/default/worker.config.json": - workerConfig(), - ".cloudflare/output/v0/workers/default/bundle/index.js": - "export default { fetch() { return new Response('ok'); } }", - }); + const warn = vi.spyOn(clack.log, "warn").mockImplementation(() => {}); + try { + const upload = mockWorkerUpload(); + mockExistingWorker({ lastDeployedFrom: "api" }); + await seed({ + ".cloudflare/output/v0/config.json": buildOutputRootConfig(), + ".cloudflare/output/v0/workers/default/worker.config.json": + workerConfig(), + ".cloudflare/output/v0/workers/default/bundle/index.js": + "export default { fetch() { return new Response('ok'); } }", + }); - const { exitCode } = await runCf(["deploy", "--prebuilt", "--force"], { - CI: "true", - }); + const { exitCode } = await runCf(["deploy", "--prebuilt", "--force"], { + CI: "true", + }); - expect(exitCode).toBe(0); - expect(upload.metadata?.main_module).toBe("index.js"); + expect(exitCode).toBe(0); + expect(upload.metadata?.main_module).toBe("index.js"); + expect(warn).toHaveBeenCalledWith( + "Using --force may overwrite conflicting remote Worker changes." + ); + } finally { + warn.mockRestore(); + } }); it("aborts in strict mode when last deployed from api", async () => { diff --git a/packages/cli/src/__tests__/lib/deploy-context.test.ts b/packages/cli/src/__tests__/lib/deploy-context.test.ts deleted file mode 100644 index 9b2e991954..0000000000 --- a/packages/cli/src/__tests__/lib/deploy-context.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as clack from "@clack/prompts"; -import { expect, it, vi } from "vitest"; -import { createDeployContext } from "../../lib/deploy-context.js"; - -it("points strict deploy aborts to the cf force flag", () => { - const error = vi.spyOn(clack.log, "error").mockImplementation(() => {}); - try { - const context = createDeployContext("test-token", "cf deploy --force"); - context.logger.error( - "Aborting the upload operation because of conflicts. To override and upload anyway, remove the `--strict` flag" - ); - - expect(error).toHaveBeenCalledWith( - "Aborting the upload operation because of conflicts. Rerun with `cf deploy --force` to override and upload anyway.", - { spacing: 0 } - ); - } finally { - error.mockRestore(); - } -}); diff --git a/packages/cli/src/commands/deploy/index.ts b/packages/cli/src/commands/deploy/index.ts index a8a39ecc4d..52399f4429 100644 --- a/packages/cli/src/commands/deploy/index.ts +++ b/packages/cli/src/commands/deploy/index.ts @@ -1,3 +1,4 @@ +import * as clack from "@clack/prompts"; import { runUpload, sharedUploadBuilder } from "./shared.js"; import type { CommonYargsOptions, InferArgs } from "../../lib/cli-types.js"; import type { Argv, CommandModule } from "yargs"; diff --git a/packages/cli/src/commands/deploy/shared.ts b/packages/cli/src/commands/deploy/shared.ts index 4060fbec0b..4afc059e6e 100644 --- a/packages/cli/src/commands/deploy/shared.ts +++ b/packages/cli/src/commands/deploy/shared.ts @@ -22,8 +22,8 @@ import { selectBuildOutputWorker, validateBuildOutputMode, } from "../../lib/build-output.js"; -import { getAccountId } from "../../lib/context.js"; import { CliExit } from "../../lib/cli-exit.js"; +import { getAccountId } from "../../lib/context.js"; import { createDeployContext } from "../../lib/deploy-context.js"; import { assembleBuildResult, @@ -148,10 +148,7 @@ async function uploadBuildOutput(argv: UploadArgs, ctx: UploadCommand) { }))); // Initialize the deploy-helpers context. - const deployContext = createDeployContext( - authToken, - ctx.command === "Deploy" ? "cf deploy --force" : undefined - ); + const deployContext = createDeployContext(authToken); initDeployHelpersContext(deployContext); initContainersSharedContext({ logger: deployContext.logger, diff --git a/packages/cli/src/lib/deploy-context.ts b/packages/cli/src/lib/deploy-context.ts index 8df3c541a5..28c4b0897c 100644 --- a/packages/cli/src/lib/deploy-context.ts +++ b/packages/cli/src/lib/deploy-context.ts @@ -10,10 +10,6 @@ import { confirm, prompt, select } from "./dialog.js"; import type { DeployHelpersContext } from "@cloudflare/deploy-helpers"; import type { Logger } from "@cloudflare/workers-utils"; -// deploy-helpers names Wrangler's --strict flag in this error; cf uses --force. -const STRICT_CONFLICT_ABORT = - "Aborting the upload operation because of conflicts. To override and upload anyway, remove the `--strict` flag"; - /** * Build the deploy-helpers context that `initDeployHelpersContext` needs. * @@ -25,10 +21,7 @@ const STRICT_CONFLICT_ABORT = * credentials) args; the context-bound versions close over them so * deploy-helpers callers don't need to thread auth through every call. */ -export function createDeployContext( - authToken: string, - strictConflictOverrideCommand?: string -): DeployHelpersContext { +export function createDeployContext(authToken: string): DeployHelpersContext { const credentials = { apiToken: authToken }; const userAgent = USER_AGENT; @@ -66,15 +59,8 @@ export function createDeployContext( clack.log.message(args.join(" "), { spacing: 0 }), warn: (...args: unknown[]) => clack.log.warn(String(args.join(" ")), { spacing: 0 }), - error: (...args: unknown[]) => { - const message = String(args.join(" ")); - clack.log.error( - strictConflictOverrideCommand && message === STRICT_CONFLICT_ABORT - ? `Aborting the upload operation because of conflicts. Rerun with \`${strictConflictOverrideCommand}\` to override and upload anyway.` - : message, - { spacing: 0 } - ); - }, + error: (...args: unknown[]) => + clack.log.error(String(args.join(" ")), { spacing: 0 }), }; // The fetch closures capture auth credentials and user-agent,