diff --git a/.changeset/rich-tips-yell.md b/.changeset/rich-tips-yell.md new file mode 100644 index 000000000000..42f8392e375e --- /dev/null +++ b/.changeset/rich-tips-yell.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +Prevents uploads with both cron triggers and smart placement enabled diff --git a/packages/wrangler/src/__tests__/configuration.test.ts b/packages/wrangler/src/__tests__/configuration.test.ts index d1c631ea49fa..3b2a87b4d382 100644 --- a/packages/wrangler/src/__tests__/configuration.test.ts +++ b/packages/wrangler/src/__tests__/configuration.test.ts @@ -960,7 +960,7 @@ describe("normalizeAndValidateConfig()", () => { first_party_worker: true, logpush: true, placement: { - mode: "smart", + mode: "off", }, }; @@ -4547,6 +4547,60 @@ describe("normalizeAndValidateConfig()", () => { }); }); + describe("[placement]", () => { + it("should error if both placement and triggers are configured", () => { + const { diagnostics } = normalizeAndValidateConfig( + { + triggers: { + crons: [1111], + }, + placement: { mode: "smart" }, + } as unknown as RawConfig, + undefined, + { env: undefined } + ); + + expect(diagnostics.hasWarnings()).toBe(false); + expect(diagnostics.renderErrors()).toMatchInlineSnapshot(` + "Processing wrangler configuration: + - You cannot configure both [triggers] and [placement] in your wrangler.toml. Placement is not supported with cron triggers." + `); + }); + it("should not error if triggers are configured and placement is set off", () => { + const { diagnostics } = normalizeAndValidateConfig( + { + triggers: { + crons: [1111], + }, + placement: { mode: "off" }, + } as unknown as RawConfig, + undefined, + { env: undefined } + ); + + expect(diagnostics.hasWarnings()).toBe(false); + expect(diagnostics.hasErrors()).toBe(false); + }); + it("should not error if placement is configured and triggers is empty array", () => { + const expectedConfig: RawEnvironment = { + triggers: { crons: [] }, + placement: { + mode: "smart", + }, + }; + const { config, diagnostics } = normalizeAndValidateConfig( + expectedConfig, + undefined, + { env: undefined } + ); + + expect(config).toEqual(expect.objectContaining({ ...expectedConfig })); + + expect(diagnostics.hasWarnings()).toBe(false); + expect(diagnostics.hasErrors()).toBe(false); + }); + }); + describe("(deprecated)", () => { it("should remove and warn about deprecated properties", () => { const environment: RawEnvironment = { diff --git a/packages/wrangler/src/config/validation-helpers.ts b/packages/wrangler/src/config/validation-helpers.ts index 0ecf579306c6..265079c89a2b 100644 --- a/packages/wrangler/src/config/validation-helpers.ts +++ b/packages/wrangler/src/config/validation-helpers.ts @@ -533,6 +533,27 @@ export const validateAdditionalProperties = ( return true; }; +/** + * Add a diagnostic error for any configurations that include both cron triggers and smart placement + */ +export const validateSmartPlacementConfig = ( + diagnostics: Diagnostics, + placement: { mode: "off" | "smart" } | undefined, + triggers: + | { + crons: string[]; + } + | undefined +): boolean => { + if (placement?.mode === "smart" && !!triggers?.crons?.length) { + diagnostics.errors.push( + `You cannot configure both [triggers] and [placement] in your wrangler.toml. Placement is not supported with cron triggers.` + ); + return false; + } + return true; +}; + /** * Get the names of the bindings collection in `value`. * diff --git a/packages/wrangler/src/config/validation.ts b/packages/wrangler/src/config/validation.ts index ff29abf48cbe..3c3c51405762 100644 --- a/packages/wrangler/src/config/validation.ts +++ b/packages/wrangler/src/config/validation.ts @@ -26,6 +26,7 @@ import { appendEnvName, getBindingNames, isValidName, + validateSmartPlacementConfig, } from "./validation-helpers"; import type { Config, DevConfig, RawConfig, RawDevConfig } from "./config"; import type { @@ -237,6 +238,8 @@ export function normalizeAndValidateConfig( [...Object.keys(config), "env"] ); + validateSmartPlacementConfig(diagnostics, config.placement, config.triggers); + experimental(diagnostics, rawConfig, "assets"); return { config, diagnostics };