From b8ab8093b9011b5d7d47bcd31fa69cefa6c8fe2a Mon Sep 17 00:00:00 2001 From: emily-shen <69125074+emily-shen@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:26:55 +0100 Subject: [PATCH] fix: better errors for workers commands in pages projects (#6996) * error for delete * error for deploy * error for dev * error for secret * error for tail * changeset * update messaging --- .changeset/nine-cougars-repeat.md | 7 ++ .../wrangler/src/__tests__/delete.test.ts | 11 +++ .../wrangler/src/__tests__/deploy.test.ts | 15 ++++ packages/wrangler/src/__tests__/dev.test.ts | 10 +++ .../wrangler/src/__tests__/secret.test.ts | 76 +++++++++++++++++++ packages/wrangler/src/__tests__/tail.test.ts | 16 ++++ packages/wrangler/src/delete.ts | 6 ++ packages/wrangler/src/deploy/index.ts | 7 ++ .../wrangler/src/deployment-bundle/entry.ts | 6 ++ packages/wrangler/src/secret/index.ts | 24 ++++++ packages/wrangler/src/tail/index.ts | 6 ++ 11 files changed, 184 insertions(+) create mode 100644 .changeset/nine-cougars-repeat.md diff --git a/.changeset/nine-cougars-repeat.md b/.changeset/nine-cougars-repeat.md new file mode 100644 index 000000000000..62a34c13ea58 --- /dev/null +++ b/.changeset/nine-cougars-repeat.md @@ -0,0 +1,7 @@ +--- +"wrangler": patch +--- + +fix: improve error messaging when accidentally using Workers commands in Pages project + +If we detect a Workers command used with a Pages project (i.e. wrangler.toml contains `pages_output_build_dir`), error with Pages version of command rather than "missing entry-point" etc. diff --git a/packages/wrangler/src/__tests__/delete.test.ts b/packages/wrangler/src/__tests__/delete.test.ts index 90a124a43de7..d661ff57629f 100644 --- a/packages/wrangler/src/__tests__/delete.test.ts +++ b/packages/wrangler/src/__tests__/delete.test.ts @@ -229,6 +229,17 @@ describe("delete", () => { `); }); + it("should error helpfully if pages_build_output_dir is set", async () => { + writeWranglerToml({ pages_build_output_dir: "dist", name: "test" }); + await expect( + runWrangler("delete") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages project delete\` instead.] + ` + ); + }); describe("force deletes", () => { it("should prompt for extra confirmation when service is depended on and use force", async () => { mockConfirm({ diff --git a/packages/wrangler/src/__tests__/deploy.test.ts b/packages/wrangler/src/__tests__/deploy.test.ts index 12509a8fb850..75d00f8a8480 100644 --- a/packages/wrangler/src/__tests__/deploy.test.ts +++ b/packages/wrangler/src/__tests__/deploy.test.ts @@ -377,6 +377,21 @@ describe("deploy", () => { `); }); + it("should error helpfully if pages_build_output_dir is set in wrangler.toml", async () => { + writeWranglerToml({ + pages_build_output_dir: "public", + name: "test-name", + }); + await expect( + runWrangler("deploy") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages deploy\` instead.] + ` + ); + }); + describe("output additional script information", () => { it("for first party workers, it should print worker information at log level", async () => { setIsTTY(false); diff --git a/packages/wrangler/src/__tests__/dev.test.ts b/packages/wrangler/src/__tests__/dev.test.ts index a482956b8b50..acdc55fa49cb 100644 --- a/packages/wrangler/src/__tests__/dev.test.ts +++ b/packages/wrangler/src/__tests__/dev.test.ts @@ -1886,6 +1886,16 @@ describe.sequential("wrangler dev", () => { ); }); }); + + it("should error helpfully if pages_build_output_dir is set", async () => { + writeWranglerToml({ pages_build_output_dir: "dist", name: "test" }); + await expect(runWrangler("dev")).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages dev\` instead.] + ` + ); + }); }); function mockGetZones(domain: string, zones: { id: string }[] = []) { diff --git a/packages/wrangler/src/__tests__/secret.test.ts b/packages/wrangler/src/__tests__/secret.test.ts index 8b24a09d614b..ea6fdba22ee8 100644 --- a/packages/wrangler/src/__tests__/secret.test.ts +++ b/packages/wrangler/src/__tests__/secret.test.ts @@ -83,6 +83,25 @@ describe("wrangler secret", () => { ); } + it("should error helpfully if pages_build_output_dir is set", async () => { + fs.writeFileSync( + "wrangler.toml", + TOML.stringify({ + pages_build_output_dir: "public", + name: "script-name", + }), + "utf-8" + ); + await expect( + runWrangler("secret put secret-name") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages secret put\` instead.] + ` + ); + }); + describe("interactive", () => { beforeEach(() => { setIsTTY(true); @@ -389,6 +408,25 @@ describe("wrangler secret", () => { ); } + it("should error helpfully if pages_build_output_dir is set", async () => { + fs.writeFileSync( + "wrangler.toml", + TOML.stringify({ + pages_build_output_dir: "public", + name: "script-name", + }), + "utf-8" + ); + await expect( + runWrangler("secret delete secret-name") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages secret delete\` instead.] + ` + ); + }); + it("should delete a secret", async () => { mockDeleteRequest({ scriptName: "script-name", secretName: "the-key" }); mockConfirm({ @@ -499,6 +537,25 @@ describe("wrangler secret", () => { ); } + it("should error helpfully if pages_build_output_dir is set", async () => { + fs.writeFileSync( + "wrangler.toml", + TOML.stringify({ + pages_build_output_dir: "public", + name: "script-name", + }), + "utf-8" + ); + await expect( + runWrangler("secret list") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages secret list\` instead.] + ` + ); + }); + it("should list secrets", async () => { mockListRequest({ scriptName: "script-name" }); await runWrangler("secret list --name script-name"); @@ -565,6 +622,25 @@ describe("wrangler secret", () => { }); describe("bulk", () => { + it("should error helpfully if pages_build_output_dir is set", async () => { + fs.writeFileSync( + "wrangler.toml", + TOML.stringify({ + pages_build_output_dir: "public", + name: "script-name", + }), + "utf-8" + ); + await expect( + runWrangler("secret bulk") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages secret bulk\` instead.] + ` + ); + }); + it("should fail secret bulk w/ no pipe or JSON input", async () => { vi.spyOn(readline, "createInterface").mockImplementation( () => null as unknown as Interface diff --git a/packages/wrangler/src/__tests__/tail.test.ts b/packages/wrangler/src/__tests__/tail.test.ts index 56edb3644bfb..d56e34aac13e 100644 --- a/packages/wrangler/src/__tests__/tail.test.ts +++ b/packages/wrangler/src/__tests__/tail.test.ts @@ -10,6 +10,7 @@ import { MockWebSocket } from "./helpers/mock-web-socket"; import { createFetchResult, msw, mswSucessScriptHandlers } from "./helpers/msw"; import { runInTempDir } from "./helpers/run-in-tmp"; import { runWrangler } from "./helpers/run-wrangler"; +import { writeWranglerToml } from "./helpers/write-wrangler-toml"; import type { AlarmEvent, EmailEvent, @@ -843,6 +844,21 @@ describe("tail", () => { await api.closeHelper(); }); }); + + it("should error helpfully if pages_build_output_dir is set in wrangler.toml", async () => { + writeWranglerToml({ + pages_build_output_dir: "public", + name: "test-name", + }); + await expect( + runWrangler("tail") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: It looks like you've run a Workers-specific command in a Pages project. + For Pages, please run \`wrangler pages deployment tail\` instead.] + ` + ); + }); }); /* helpers */ diff --git a/packages/wrangler/src/delete.ts b/packages/wrangler/src/delete.ts index 0fc79fb4834d..f4adeb990c72 100644 --- a/packages/wrangler/src/delete.ts +++ b/packages/wrangler/src/delete.ts @@ -97,6 +97,12 @@ export async function deleteHandler(args: DeleteArgs) { const configPath = args.config || (args.script && findWranglerToml(path.dirname(args.script))); const config = readConfig(configPath, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages project delete` instead." + ); + } await metrics.sendMetricsEvent( "delete worker script", {}, diff --git a/packages/wrangler/src/deploy/index.ts b/packages/wrangler/src/deploy/index.ts index 5797def1e47f..052b252b280b 100644 --- a/packages/wrangler/src/deploy/index.ts +++ b/packages/wrangler/src/deploy/index.ts @@ -254,6 +254,13 @@ export async function deployHandler(args: DeployArgs) { args.config || (args.script && findWranglerToml(path.dirname(args.script))); const projectRoot = configPath && path.dirname(configPath); const config = readConfig(configPath, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages deploy` instead." + ); + } + const entry = await getEntry(args, config, "deploy"); if (args.public) { diff --git a/packages/wrangler/src/deployment-bundle/entry.ts b/packages/wrangler/src/deployment-bundle/entry.ts index 8547ff368584..ad877b5b1cb6 100644 --- a/packages/wrangler/src/deployment-bundle/entry.ts +++ b/packages/wrangler/src/deployment-bundle/entry.ts @@ -66,6 +66,12 @@ export async function getEntry( ) { paths = resolveEntryWithAssets(); } else { + if (config.pages_build_output_dir && command === "dev") { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages dev` instead." + ); + } throw new UserError( `Missing entry-point: The entry-point should be specified via the command line (e.g. \`wrangler ${command} path/to/script\`) or the \`main\` config field.` ); diff --git a/packages/wrangler/src/secret/index.ts b/packages/wrangler/src/secret/index.ts index 9dee2548351b..3dd1c202b6a3 100644 --- a/packages/wrangler/src/secret/index.ts +++ b/packages/wrangler/src/secret/index.ts @@ -144,6 +144,12 @@ export const secret = (secretYargs: CommonYargsArgv) => { async (args) => { await printWranglerBanner(); const config = readConfig(args.config, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages secret put` instead." + ); + } const scriptName = getLegacyScriptName(args, config); if (!scriptName) { @@ -243,6 +249,12 @@ export const secret = (secretYargs: CommonYargsArgv) => { }, async (args) => { const config = readConfig(args.config, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages secret delete` instead." + ); + } const scriptName = getLegacyScriptName(args, config); if (!scriptName) { @@ -299,6 +311,12 @@ export const secret = (secretYargs: CommonYargsArgv) => { }, async (args) => { const config = readConfig(args.config, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages secret list` instead." + ); + } const scriptName = getLegacyScriptName(args, config); if (!scriptName) { @@ -360,6 +378,12 @@ type SecretBulkArgs = StrictYargsOptionsToInterface; export const secretBulkHandler = async (secretBulkArgs: SecretBulkArgs) => { await printWranglerBanner(); const config = readConfig(secretBulkArgs.config, secretBulkArgs); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages secret bulk` instead." + ); + } if (secretBulkArgs._.includes("secret:bulk")) { logger.warn( diff --git a/packages/wrangler/src/tail/index.ts b/packages/wrangler/src/tail/index.ts index 70dbd2efacf6..f4e051eb769a 100644 --- a/packages/wrangler/src/tail/index.ts +++ b/packages/wrangler/src/tail/index.ts @@ -93,6 +93,12 @@ export async function tailHandler(args: TailArgs) { await printWranglerBanner(); } const config = readConfig(args.config, args); + if (config.pages_build_output_dir) { + throw new UserError( + "It looks like you've run a Workers-specific command in a Pages project.\n" + + "For Pages, please run `wrangler pages deployment tail` instead." + ); + } await metrics.sendMetricsEvent("begin log stream", { sendMetrics: config.send_metrics, });