diff --git a/.changeset/slimy-eels-wink.md b/.changeset/slimy-eels-wink.md new file mode 100644 index 000000000000..b773093ce934 --- /dev/null +++ b/.changeset/slimy-eels-wink.md @@ -0,0 +1,5 @@ +--- +"create-cloudflare": minor +--- + +use `wrangler types` to generate types instead of using the `@cloudflare/workers-types` package diff --git a/packages/create-cloudflare/e2e-tests/frameworks.test.ts b/packages/create-cloudflare/e2e-tests/frameworks.test.ts index 00f5aadaa7e6..bb3483849867 100644 --- a/packages/create-cloudflare/e2e-tests/frameworks.test.ts +++ b/packages/create-cloudflare/e2e-tests/frameworks.test.ts @@ -12,6 +12,7 @@ import { import { detectPackageManager } from "helpers/packageManagers"; import { retry } from "helpers/retry"; import { sleep } from "helpers/sleep"; +import * as jsonc from "jsonc-parser"; import { fetch } from "undici"; import { beforeAll, describe, expect } from "vitest"; import { deleteProject, deleteWorker } from "../scripts/common"; @@ -41,12 +42,9 @@ import type { Writable } from "stream"; type FrameworkTestConfig = RunnerConfig & { testCommitMessage: boolean; + nodeCompat: boolean; unsupportedPms?: string[]; unsupportedOSs?: string[]; - verifyBuildCfTypes?: { - outputFile: string; - envInterfaceName: string; - }; verifyBuild?: { outputDir: string; script: string; @@ -80,8 +78,12 @@ describe.concurrent( }); Object.entries(frameworkTests).forEach(([frameworkKey, testConfig]) => { - const frameworkConfig = getFrameworkConfig(frameworkKey); - + const frameworkConfig = { + workersTypes: "generated" as const, + typesPath: "worker-configuration.d.ts", + envInterfaceName: "Env", + ...getFrameworkConfig(frameworkKey), + }; test({ experimental }).runIf( shouldRunTest(frameworkConfig.id, testConfig), )( @@ -176,7 +178,8 @@ describe.concurrent( project.path, logStream, ); - await verifyBuildCfTypesScript(testConfig, project.path, logStream); + + await verifyTypes(testConfig, frameworkConfig, project.path); await verifyBuildScript(testConfig, project.path, logStream); } catch (e) { console.error("ERROR", e); @@ -352,57 +355,53 @@ const verifyPreviewScript = async ( } }; -const verifyBuildCfTypesScript = async ( - { verifyBuildCfTypes }: FrameworkTestConfig, +const verifyTypes = async ( + { nodeCompat }: FrameworkTestConfig, + { + workersTypes, + typesPath = "./worker-configuration.d.ts", + envInterfaceName = "Env", + }: TemplateConfig, projectPath: string, - logStream: Writable, ) => { - if (!verifyBuildCfTypes) { + if (workersTypes === "none") { return; } - const { outputFile, envInterfaceName } = verifyBuildCfTypes; - - const outputFileContentPre = readFile(join(projectPath, outputFile)); - const outputFileContentPreLines = outputFileContentPre.split("\n"); + const outputFileContent = readFile(join(projectPath, typesPath)).split("\n"); - // the file contains the "Generated by Wrangler" comment without a timestamp - expect(outputFileContentPreLines).toContain("// Generated by Wrangler"); - - // the file contains the env interface - // the file still contains the env interface - const hasEnvInterfacePre = outputFileContentPreLines.some( + const hasEnvInterface = outputFileContent.some( (line) => // old type gen - some framework templates pin older versions of wrangler line === `interface ${envInterfaceName} {` || // new after importable env change line === `interface ${envInterfaceName} extends Cloudflare.Env {}`, ); - expect(hasEnvInterfacePre).toBe(true); - - // Run the `cf-typegen` script to generate types for bindings in fixture - const buildTypesProc = spawnWithLogging( - [pm, "run", "cf-typegen"], - { cwd: projectPath }, - logStream, - ); - await waitForExit(buildTypesProc); - - const outputFileContentPost = readFile(join(projectPath, outputFile)); - const outputFileContentPostLines = outputFileContentPost.split("\n"); + expect(hasEnvInterface).toBe(true); - // the file doesn't contain the "Generated by Wrangler" comment anymore - expect(outputFileContentPostLines).not.toContain("// Generated by Wrangler"); + // if the runtime types were installed, they wont be in this file + if (workersTypes === "generated") { + expect(outputFileContent[2]).match( + /\/\/ Runtime types generated with workerd@1\.\d{8}\.\d \d{4}-\d{2}-\d{2} ([a-z_]+,?)*/, + ); + } - // the file still contains the env interface - const hasEnvInterfacePost = outputFileContentPostLines.some( - (line) => - // old type gen - some framework templates pin older versions of wrangler - line === `interface ${envInterfaceName} {` || - // new after importable env change - line === `interface ${envInterfaceName} extends Cloudflare.Env {}`, - ); - expect(hasEnvInterfacePost).toBe(true); + const tsconfigPath = join(projectPath, "tsconfig.json"); + const tsconfigTypes = jsonc.parse(readFile(tsconfigPath)).compilerOptions + ?.types; + if (workersTypes === "generated") { + expect(tsconfigTypes).toContain(typesPath); + } + if (workersTypes === "installed") { + expect( + tsconfigTypes.some((x: string) => + x.includes("@cloudflare/workers-types"), + ), + ).toBe(true); + } + if (nodeCompat) { + expect(tsconfigTypes).toContain(`node`); + } }; const verifyBuildScript = async ( diff --git a/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config-experimental.ts b/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config-experimental.ts index f2ba3b1f2bf9..c9bdf731b9e0 100644 --- a/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config-experimental.ts +++ b/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config-experimental.ts @@ -25,6 +25,7 @@ export default function getFrameworkTestConfigExperimental() { route: "/", expectedText: "Hello world", }, + nodeCompat: true, }, }; } diff --git a/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config.ts b/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config.ts index 505cfa343f71..997d47753b4b 100644 --- a/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config.ts +++ b/packages/create-cloudflare/e2e-tests/frameworks/framework-test-config.ts @@ -16,10 +16,7 @@ export default function getFrameworkTestConfig(pm: string) { expectedText: "Hello from Cloudflare", previewArgs: ["--host=127.0.0.1"], }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, + nodeCompat: false, flags: ["--no-install", "--no-git-init"], }, "astro:pages": { @@ -40,6 +37,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, + nodeCompat: true, flags: [ "--skip-houston", "--no-install", @@ -68,6 +66,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, + nodeCompat: true, flags: [ "--skip-houston", "--no-install", @@ -92,6 +91,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Dinosaurs are cool", }, + nodeCompat: false, flags: [`--package-manager`, pm], promptHandlers: [ // { @@ -118,6 +118,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Dinosaurs are cool", }, + nodeCompat: false, flags: [`--package-manager`, pm], promptHandlers: [ { @@ -142,16 +143,13 @@ export default function getFrameworkTestConfig(pm: string) { route: "/api/v1/test", expectedText: "C3_TEST", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, verifyBuild: { outputDir: "./dist/analog/public", script: "build", route: "/api/v1/test", expectedText: "C3_TEST", }, + nodeCompat: false, flags: ["--skipTailwind"], }, "angular:pages": { @@ -168,6 +166,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Congratulations! Your app is running.", }, + nodeCompat: false, flags: ["--style", "sass"], }, "angular:workers": { @@ -184,6 +183,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Congratulations! Your app is running.", }, + nodeCompat: false, flags: ["--style", "sass"], }, "gatsby:pages": { @@ -205,6 +205,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Gatsby!", }, + nodeCompat: false, }, "gatsby:workers": { argv: ["--platform", "workers"], @@ -225,6 +226,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Gatsby!", }, + nodeCompat: false, }, "hono:pages": { argv: ["--platform", "pages"], @@ -238,6 +240,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Hello!", }, + nodeCompat: false, promptHandlers: [ { matcher: /Do you want to install project dependencies\?/, @@ -257,6 +260,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/message", expectedText: "Hello Hono!", }, + nodeCompat: false, promptHandlers: [ { matcher: /Do you want to install project dependencies\?/, @@ -283,10 +287,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Welcome to Qwik", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, + nodeCompat: true, }, "qwik:workers": { argv: ["--platform", "workers"], @@ -308,10 +309,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Welcome to Qwik", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, + nodeCompat: true, }, "remix:pages": { argv: ["--platform", "pages"], @@ -327,16 +325,13 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, verifyBuild: { outputDir: "./build/client", script: "build", route: "/test", expectedText: "C3_TEST", }, + nodeCompat: false, flags: ["--typescript", "--no-install", "--no-git-init"], }, "remix:workers": { @@ -353,10 +348,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, + nodeCompat: false, flags: ["--typescript", "--no-install", "--no-git-init"], }, "next:pages": { @@ -370,10 +362,6 @@ export default function getFrameworkTestConfig(pm: string) { }, ], testCommitMessage: true, - verifyBuildCfTypes: { - outputFile: "env.d.ts", - envInterfaceName: "CloudflareEnv", - }, verifyDeploy: { route: "/", expectedText: "Create Next App", @@ -384,6 +372,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Create Next App", }, + nodeCompat: true, flags: [ "--typescript", "--no-install", @@ -410,10 +399,6 @@ export default function getFrameworkTestConfig(pm: string) { "@/*", "--src-dir", ], - verifyBuildCfTypes: { - outputFile: "cloudflare-env.d.ts", - envInterfaceName: "CloudflareEnv", - }, verifyPreview: { previewArgs: ["--"], route: "/test", @@ -423,6 +408,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Create Next App", }, + nodeCompat: true, // see https://github.com/cloudflare/next-on-pages/blob/main/packages/next-on-pages/docs/supported.md#operating-systems unsupportedOSs: ["win32"], unsupportedPms: [ @@ -447,14 +433,11 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Welcome to Nuxt!", }, + nodeCompat: false, verifyPreview: { route: "/test", expectedText: "C3_TEST", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, verifyBuild: { outputDir: "./dist", script: "build", @@ -482,10 +465,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, - verifyBuildCfTypes: { - outputFile: "worker-configuration.d.ts", - envInterfaceName: "Env", - }, + nodeCompat: false, }, "react:pages": { argv: ["--platform", "pages"], @@ -506,6 +486,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Vite + React", }, + nodeCompat: false, }, "react:workers": { argv: ["--platform", "workers"], @@ -534,6 +515,7 @@ export default function getFrameworkTestConfig(pm: string) { // not actually running the client side JS. expectedText: "Vite + React + TS", }, + nodeCompat: false, }, solid: { promptHandlers: [ @@ -558,6 +540,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Hello world", }, + nodeCompat: true, }, "svelte:pages": { argv: ["--platform", "pages"], @@ -586,6 +569,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, + nodeCompat: false, }, "svelte:workers": { argv: ["--platform", "workers"], @@ -608,6 +592,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/test", expectedText: "C3_TEST", }, + nodeCompat: false, }, "vue:pages": { argv: ["--platform", "pages"], @@ -621,6 +606,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Vite App", }, + nodeCompat: false, flags: ["--ts"], }, "vue:workers": { @@ -636,6 +622,7 @@ export default function getFrameworkTestConfig(pm: string) { route: "/", expectedText: "Vite App", }, + nodeCompat: false, }, }; } diff --git a/packages/create-cloudflare/src/__tests__/workers.test.ts b/packages/create-cloudflare/src/__tests__/workers.test.ts index b0b67a72f72f..4dde1445ab01 100644 --- a/packages/create-cloudflare/src/__tests__/workers.test.ts +++ b/packages/create-cloudflare/src/__tests__/workers.test.ts @@ -3,7 +3,7 @@ import { mockSpinner } from "helpers/__tests__/mocks"; import { getLatestTypesEntrypoint } from "helpers/compatDate"; import { readFile, writeFile } from "helpers/files"; import { beforeEach, describe, expect, test, vi } from "vitest"; -import { addWorkersTypesToTsConfig } from "../workers"; +import { updateTsConfig } from "../workers"; import { createTestContext } from "./helpers"; import type { C3Context } from "types"; @@ -18,12 +18,13 @@ beforeEach(() => { const mockCompatDate = "2024-01-17"; -describe("addWorkersTypesToTsConfig", () => { +describe("updateTsConfig", () => { let ctx: C3Context; beforeEach(() => { ctx = createTestContext(); ctx.args.ts = true; + ctx.template.workersTypes = "generated"; vi.mocked(existsSync).mockImplementation(() => true); vi.mocked(getLatestTypesEntrypoint).mockReturnValue(mockCompatDate); @@ -34,8 +35,10 @@ describe("addWorkersTypesToTsConfig", () => { ); }); - test("happy path", async () => { - await addWorkersTypesToTsConfig(ctx); + test("installing workers types", async () => { + ctx.template.workersTypes = "installed"; + + await updateTsConfig(ctx, { usesNodeCompat: false }); expect(writeFile).toHaveBeenCalled(); @@ -46,26 +49,65 @@ describe("addWorkersTypesToTsConfig", () => { test("tsconfig.json not found", async () => { vi.mocked(existsSync).mockImplementation(() => false); - await addWorkersTypesToTsConfig(ctx); + await updateTsConfig(ctx, { usesNodeCompat: false }); expect(writeFile).not.toHaveBeenCalled(); }); test("latest entrypoint not found", async () => { + ctx.template.workersTypes = "installed"; + vi.mocked(getLatestTypesEntrypoint).mockReturnValue(null); - await addWorkersTypesToTsConfig(ctx); + await updateTsConfig(ctx, { usesNodeCompat: false }); expect(writeFile).not.toHaveBeenCalled(); }); test("don't clobber existing entrypoints", async () => { + ctx.template.workersTypes = "installed"; vi.mocked(readFile).mockImplementation( () => `{ "compilerOptions": { "types" : ["@cloudflare/workers-types/2021-03-20"]} }`, ); - await addWorkersTypesToTsConfig(ctx); + await updateTsConfig(ctx, { usesNodeCompat: false }); + + expect(vi.mocked(writeFile).mock.calls[0][1]).toContain( + `"@cloudflare/workers-types/2021-03-20"`, + ); + }); + + test("will remove workers-types when generating types, if generated types include runtime types", async () => { + vi.mocked(readFile).mockImplementation((path) => { + if (path.includes("tsconfig.json")) { + return `{ "compilerOptions": { "types" : ["@cloudflare/workers-types/2021-03-20"]} }`; + } else { + return "// Runtime types generated with workerd"; + } + }); + await updateTsConfig(ctx, { usesNodeCompat: false }); + expect(vi.mocked(writeFile).mock.calls[0][1]).not.toContain( + `"@cloudflare/workers-types/2021-03-20"`, + ); + }); + + test("will NOT remove workers-types when generating types, if generated types don't include runtime types", async () => { + vi.mocked(readFile).mockImplementation((path) => { + if (path.includes("tsconfig.json")) { + return `{ "compilerOptions": { "types" : ["@cloudflare/workers-types/2021-03-20"]} }`; + } else { + return "no runtime types here"; + } + }); + await updateTsConfig(ctx, { usesNodeCompat: false }); expect(vi.mocked(writeFile).mock.calls[0][1]).toContain( `"@cloudflare/workers-types/2021-03-20"`, ); }); + + test("will add generated types file", async () => { + await updateTsConfig(ctx, { usesNodeCompat: false }); + expect(vi.mocked(writeFile).mock.calls[0][1]).toContain( + `./worker-configuration.d.ts`, + ); + }); }); diff --git a/packages/create-cloudflare/src/cli.ts b/packages/create-cloudflare/src/cli.ts index 8872387a49af..2ddfce1b6ebe 100644 --- a/packages/create-cloudflare/src/cli.ts +++ b/packages/create-cloudflare/src/cli.ts @@ -34,7 +34,7 @@ import { updatePackageScripts, } from "./templates"; import { validateProjectDirectory } from "./validators"; -import { installWorkersTypes } from "./workers"; +import { addTypes } from "./workers"; import { updateWranglerConfig } from "./wrangler/config"; import type { C3Args, C3Context } from "types"; @@ -154,7 +154,6 @@ const configure = async (ctx: C3Context) => { startSection("Configuring your application for Cloudflare", "Step 2 of 3"); await installWrangler(); - await installWorkersTypes(ctx); // Note: This _must_ be called before the configure phase since // pre-existing workers assume its presence in their configure phase @@ -169,6 +168,8 @@ const configure = async (ctx: C3Context) => { await updatePackageScripts(ctx); + await addTypes(ctx); + await offerGit(ctx); await gitCommit(ctx); diff --git a/packages/create-cloudflare/src/templates.ts b/packages/create-cloudflare/src/templates.ts index fcb8f52be662..f0d332c431c5 100644 --- a/packages/create-cloudflare/src/templates.ts +++ b/packages/create-cloudflare/src/templates.ts @@ -142,10 +142,23 @@ export type TemplateConfig = { /** The key of the package.json "scripts" entry for previewing the project. Defaults to undefined (there might not be such script) */ previewScript?: string; + /** The path to the generated types file. Defaults to `worker-configuration.d.ts` */ + typesPath?: string; + /** The name of the Env type generated by wrangler types. Defaults to `Env`*/ + envInterfaceName?: string; + /** The file path of the template. This is used internally and isn't a user facing config value.*/ path?: string; bindings?: Record; + + /** + * Source for runtime types: + * "generated" = types are generated by wrangler types. Default. + * "installed" = types are installed from @cloudflare/workers-types. + * "none" = no runtime types are provided (e.g. framework for purely static sites). + */ + workersTypes?: "generated" | "installed" | "none"; }; type CopyFiles = (StaticFileMap | VariantInfo) & { @@ -557,6 +570,13 @@ export const createContext = async ( } } + template = { + workersTypes: "generated", + typesPath: "worker-configuration.d.ts", + envInterfaceName: "Env", + ...template, + }; + const path = resolve(projectName); const languageVariants = template.copyFiles && diff --git a/packages/create-cloudflare/src/workers.ts b/packages/create-cloudflare/src/workers.ts index 30d73c24e2c4..b784d66b24a5 100644 --- a/packages/create-cloudflare/src/workers.ts +++ b/packages/create-cloudflare/src/workers.ts @@ -2,73 +2,155 @@ import { existsSync } from "fs"; import { join } from "path"; import { warn } from "@cloudflare/cli"; import { brandColor, dim } from "@cloudflare/cli/colors"; -import { spinner } from "@cloudflare/cli/interactive"; +import TOML from "@iarna/toml"; +import { runCommand } from "helpers/command"; import { getLatestTypesEntrypoint } from "helpers/compatDate"; -import { readFile, usesTypescript, writeFile } from "helpers/files"; +import { readFile, readJSON, usesTypescript, writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packageManagers"; import { installPackages } from "helpers/packages"; import * as jsonc from "jsonc-parser"; -import type { C3Context } from "types"; +import { + readWranglerJson, + readWranglerToml, + wranglerJsonExists, + wranglerTomlExists, +} from "./wrangler/config"; +import type { C3Context, PackageJson } from "types"; + +export async function addTypes(ctx: C3Context) { + if (!usesTypescript(ctx) || ctx.template.workersTypes === "none") { + return; + } + const { npm } = detectPackageManager(); + + if (ctx.template.workersTypes === "installed") { + await installWorkersTypes(npm); + } else if (ctx.template.workersTypes === "generated") { + await generateWorkersTypes(ctx, npm); + } + const usesNodeCompat = await maybeInstallNodeTypes(ctx, npm); + await updateTsConfig(ctx, { usesNodeCompat }); +} /** - * Installs the latest version of the `@cloudflare/workers-types` package - * and updates the .tsconfig file to use the latest entrypoint version. + * Generate types using the `cf-typegen` script and update tsconfig */ -export async function installWorkersTypes(ctx: C3Context) { - const { npm } = detectPackageManager(); - if (!usesTypescript(ctx)) { +async function generateWorkersTypes(ctx: C3Context, npm: string) { + const packageJsonPath = join(ctx.project.path, "package.json"); + if (!existsSync(packageJsonPath)) { + return; + } + const packageManifest = readJSON(packageJsonPath) as PackageJson; + if (!packageManifest.scripts?.["cf-typegen"]) { return; } - await installPackages(["@cloudflare/workers-types"], { - dev: true, - startText: "Installing @cloudflare/workers-types", - doneText: `${brandColor("installed")} ${dim(`via ${npm}`)}`, + const typesCmd = [npm, "run", "cf-typegen"]; + + await runCommand(typesCmd, { + cwd: ctx.project.path, + silent: true, + startText: "Generating types for your application", + doneText: `${brandColor("generated")} ${dim(`to \`${ctx.template.typesPath}\` via \`${typesCmd.join(" ")}\``)}`, }); - await addWorkersTypesToTsConfig(ctx); + + if (packageManifest["devDependencies"]?.["@cloudflare/workers-types"]) { + delete packageManifest["devDependencies"]?.["@cloudflare/workers-types"]; + writeFile(packageJsonPath, JSON.stringify(packageManifest, null, 2)); + } } -export async function addWorkersTypesToTsConfig(ctx: C3Context) { - const tsconfigPath = join(ctx.project.path, "tsconfig.json"); - if (!existsSync(tsconfigPath)) { - return; +const maybeInstallNodeTypes = async (ctx: C3Context, npm: string) => { + let parsedConfig: Record = {}; + if (wranglerJsonExists(ctx)) { + const wranglerJsonStr = readWranglerJson(ctx); + parsedConfig = jsonc.parse(wranglerJsonStr, undefined, { + allowTrailingComma: true, + }); + } else if (wranglerTomlExists(ctx)) { + const wranglerTomlStr = readWranglerToml(ctx); + parsedConfig = TOML.parse(wranglerTomlStr); } - const s = spinner(); - s.start("Adding latest types to `tsconfig.json`"); + const compatibilityFlags = Array.isArray(parsedConfig["compatibility_flags"]) + ? parsedConfig["compatibility_flags"] + : []; - const tsconfig = readFile(tsconfigPath); - const entrypointVersion = getLatestTypesEntrypoint(ctx); - if (entrypointVersion === null) { - s.stop( - `${brandColor( - "skipped", - )} couldn't find latest compatible version of @cloudflare/workers-types`, - ); - return; + if ( + compatibilityFlags.includes("nodejs_compat") || + compatibilityFlags.includes("nodejs_compat_v2") + ) { + await installPackages(["@types/node"], { + dev: true, + startText: "Installing @types/node", + doneText: `${brandColor("installed")} ${dim(`via ${npm}`)}`, + }); + return true; } + return false; +}; - const typesEntrypoint = `@cloudflare/workers-types/${entrypointVersion}`; - +/** + * update `types` in tsconfig: + * - set workers-types to latest entrypoint if installed + * - remove workers-types if runtime types have been generated + * - add generated types file if types were generated + * - add node if node compat + */ +export async function updateTsConfig( + ctx: C3Context, + { usesNodeCompat }: { usesNodeCompat: boolean }, +) { + const tsconfigPath = join(ctx.project.path, "tsconfig.json"); + if (!existsSync(tsconfigPath)) { + return; + } + const tsconfig = readFile(tsconfigPath); try { const config = jsonc.parse(tsconfig); const currentTypes = config.compilerOptions?.types ?? []; - - const explicitEntrypoint = (currentTypes as string[]).some((t) => - t.match(/@cloudflare\/workers-types\/\d{4}-\d{2}-\d{2}/), - ); - - // If a type declaration with an explicit entrypoint exists, leave the types as is - // Otherwise, add the latest entrypoint - const newTypes = explicitEntrypoint - ? [...currentTypes] - : [ - ...currentTypes.filter( - (t: string) => t !== "@cloudflare/workers-types", - ), - typesEntrypoint, - ]; + let newTypes: string[] = [...currentTypes]; + if (ctx.template.workersTypes === "installed") { + const entrypointVersion = getLatestTypesEntrypoint(ctx); + if (entrypointVersion === null) { + return; + } + const typesEntrypoint = `@cloudflare/workers-types/${entrypointVersion}`; + const explicitEntrypoint = (currentTypes as string[]).some((t) => + t.match(/@cloudflare\/workers-types\/\d{4}-\d{2}-\d{2}/), + ); + // If a type declaration with an explicit entrypoint exists, leave the types as is. + // Otherwise, add the latest entrypoint + if (!explicitEntrypoint) { + newTypes = newTypes.filter( + (t: string) => t !== "@cloudflare/workers-types", + ); + newTypes.push(typesEntrypoint); + } + } else if (ctx.template.workersTypes === "generated") { + newTypes.push(ctx.template.typesPath ?? "./worker-configuration.d.ts"); + // if generated types include runtime types, remove @cloudflare/workers-types + const typegen = readFile( + ctx.template.typesPath ?? "./worker-configuration.d.ts", + ).split("\n"); + if ( + typegen.some((line) => + line.includes("// Runtime types generated with workerd"), + ) + ) { + newTypes = newTypes.filter( + (t: string) => !t.startsWith("@cloudflare/workers-types"), + ); + } + } + // add node types if nodejs_compat is enabled + if (usesNodeCompat) { + newTypes.push("node"); + } + if (newTypes.sort() === currentTypes.sort()) { + return; + } // If we detect any tabs, use tabs, otherwise use spaces. // We need to pass an explicit value here in order to preserve formatting properly. @@ -86,10 +168,19 @@ export async function addWorkersTypesToTsConfig(ctx: C3Context) { const updated = jsonc.applyEdits(tsconfig, edits); writeFile(tsconfigPath, updated); } catch (error) { - warn( - "Failed to update `tsconfig.json` with latest `@cloudflare/workers-types` entrypoint.", - ); + warn("Failed to update `tsconfig.json`."); } +} - s.stop(`${brandColor("added")} ${dim(typesEntrypoint)}`); +/** + * TODO: delete if/when qwik and remix move to wrangler v4 + * Installs the latest version of the `@cloudflare/workers-types` package + * and updates the .tsconfig file to use the latest entrypoint version. + */ +async function installWorkersTypes(npm: string) { + await installPackages(["@cloudflare/workers-types"], { + dev: true, + startText: "Installing @cloudflare/workers-types", + doneText: `${brandColor("installed")} ${dim(`via ${npm}`)}`, + }); } diff --git a/packages/create-cloudflare/templates-experimental/solid/c3.ts b/packages/create-cloudflare/templates-experimental/solid/c3.ts index 088774a570f0..ca7f71603325 100644 --- a/packages/create-cloudflare/templates-experimental/solid/c3.ts +++ b/packages/create-cloudflare/templates-experimental/solid/c3.ts @@ -84,6 +84,7 @@ const config: TemplateConfig = { scripts: { preview: `${npm} run build && npx wrangler dev`, deploy: `${npm} run build && wrangler deploy`, + "cf-typegen": `wrangler types`, }, }), compatibilityFlags: ["nodejs_compat"], diff --git a/packages/create-cloudflare/templates/analog/c3.ts b/packages/create-cloudflare/templates/analog/c3.ts index 1df940eb00ae..1b6fdada7cf2 100644 --- a/packages/create-cloudflare/templates/analog/c3.ts +++ b/packages/create-cloudflare/templates/analog/c3.ts @@ -3,8 +3,6 @@ import { brandColor, dim } from "@cloudflare/cli/colors"; import { spinner } from "@cloudflare/cli/interactive"; import { runFrameworkGenerator } from "frameworks/index"; import { loadTemplateSnippets, transformFile } from "helpers/codemod"; -import { getLatestTypesEntrypoint } from "helpers/compatDate"; -import { readFile, writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packageManagers"; import { installPackages } from "helpers/packages"; import * as recast from "recast"; @@ -40,28 +38,6 @@ const configure = async (ctx: C3Context) => { } updateViteConfig(ctx); - updateEnvTypes(ctx); -}; - -const updateEnvTypes = (ctx: C3Context) => { - const filepath = "env.d.ts"; - - const s = spinner(); - s.start(`Updating ${filepath}`); - - let file = readFile(filepath); - - let typesEntrypoint = `@cloudflare/workers-types`; - const latestEntrypoint = getLatestTypesEntrypoint(ctx); - if (latestEntrypoint) { - typesEntrypoint += `/${latestEntrypoint}`; - } - - // Replace placeholder with actual types entrypoint - file = file.replace("WORKERS_TYPES_ENTRYPOINT", typesEntrypoint); - writeFile("env.d.ts", file); - - s.stop(`${brandColor(`updated`)} ${dim(`\`${filepath}\``)}`); }; const updateViteConfig = (ctx: C3Context) => { diff --git a/packages/create-cloudflare/templates/analog/templates/env.d.ts b/packages/create-cloudflare/templates/analog/templates/env.d.ts index adbc5cbd9fa6..d56c6a19b136 100644 --- a/packages/create-cloudflare/templates/analog/templates/env.d.ts +++ b/packages/create-cloudflare/templates/analog/templates/env.d.ts @@ -1,4 +1,4 @@ -/// +/// declare module "h3" { interface H3EventContext { diff --git a/packages/create-cloudflare/templates/analog/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/analog/templates/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/analog/templates/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/angular/pages/c3.ts b/packages/create-cloudflare/templates/angular/pages/c3.ts index 456e33590f51..ea13e5673e74 100644 --- a/packages/create-cloudflare/templates/angular/pages/c3.ts +++ b/packages/create-cloudflare/templates/angular/pages/c3.ts @@ -3,7 +3,6 @@ import { logRaw } from "@cloudflare/cli"; import { brandColor, dim } from "@cloudflare/cli/colors"; import { spinner } from "@cloudflare/cli/interactive"; import { runFrameworkGenerator } from "frameworks/index"; -import { compatDateFlag } from "helpers/compatDate"; import { readFile, readJSON, writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packageManagers"; import { installPackages } from "helpers/packages"; @@ -107,10 +106,11 @@ const config: TemplateConfig = { configure, transformPackageJson: async () => ({ scripts: { - start: `${npm} run build && wrangler pages dev dist/cloudflare ${await compatDateFlag()}`, + start: `${npm} run build && wrangler pages dev`, build: `ng build && ${npm} run process`, process: "node ./tools/copy-files.mjs", - deploy: `${npm} run build && wrangler pages deploy dist/cloudflare`, + deploy: `${npm} run build && wrangler pages deploy`, + "cf-typegen": `wrangler types`, }, }), }; diff --git a/packages/create-cloudflare/templates/angular/pages/templates/wrangler.jsonc b/packages/create-cloudflare/templates/angular/pages/templates/wrangler.jsonc new file mode 100644 index 000000000000..61c73b85f831 --- /dev/null +++ b/packages/create-cloudflare/templates/angular/pages/templates/wrangler.jsonc @@ -0,0 +1,5 @@ +{ + "name": "", + "compatibility_date": "", + "pages_build_output_dir": "./dist/cloudflare" + } diff --git a/packages/create-cloudflare/templates/angular/workers/c3.ts b/packages/create-cloudflare/templates/angular/workers/c3.ts index 98f73e30de61..4e19a678caa5 100644 --- a/packages/create-cloudflare/templates/angular/workers/c3.ts +++ b/packages/create-cloudflare/templates/angular/workers/c3.ts @@ -106,6 +106,7 @@ const config: TemplateConfig = { start: `${npm} run build && wrangler dev`, build: `ng build`, deploy: `${npm} run build && wrangler deploy`, + "cf-typegen": `wrangler types`, }, }), }; diff --git a/packages/create-cloudflare/templates/astro/workers/templates/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/astro/workers/templates/ts/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/astro/workers/templates/ts/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/common/ts/tsconfig.json b/packages/create-cloudflare/templates/common/ts/tsconfig.json index b8633da91901..b5dd586e4ce2 100644 --- a/packages/create-cloudflare/templates/common/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/common/ts/tsconfig.json @@ -16,9 +16,6 @@ /* Enable importing .json files */ "resolveJsonModule": true, - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], - /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ "allowJs": true, /* Enable error reporting in type-checked JavaScript files. */ diff --git a/packages/create-cloudflare/templates/common/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/common/ts/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/common/ts/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/docusaurus/pages/c3.ts b/packages/create-cloudflare/templates/docusaurus/pages/c3.ts index cdd0e5358ee5..f37ff3355f63 100644 --- a/packages/create-cloudflare/templates/docusaurus/pages/c3.ts +++ b/packages/create-cloudflare/templates/docusaurus/pages/c3.ts @@ -27,5 +27,6 @@ const config: TemplateConfig = { devScript: "preview", deployScript: "deploy", previewScript: "preview", + workersTypes: "none", }; export default config; diff --git a/packages/create-cloudflare/templates/docusaurus/workers/c3.ts b/packages/create-cloudflare/templates/docusaurus/workers/c3.ts index 1bf70ac2cccf..50da496aa880 100644 --- a/packages/create-cloudflare/templates/docusaurus/workers/c3.ts +++ b/packages/create-cloudflare/templates/docusaurus/workers/c3.ts @@ -29,5 +29,6 @@ const config: TemplateConfig = { devScript: "start", deployScript: "deploy", previewScript: "preview", + workersTypes: "none", }; export default config; diff --git a/packages/create-cloudflare/templates/gatsby/pages/c3.ts b/packages/create-cloudflare/templates/gatsby/pages/c3.ts index 9cf83507cc1d..17820fa592af 100644 --- a/packages/create-cloudflare/templates/gatsby/pages/c3.ts +++ b/packages/create-cloudflare/templates/gatsby/pages/c3.ts @@ -47,5 +47,6 @@ const config: TemplateConfig = { devScript: "develop", deployScript: "deploy", previewScript: "preview", + workersTypes: "none", }; export default config; diff --git a/packages/create-cloudflare/templates/gatsby/workers/c3.ts b/packages/create-cloudflare/templates/gatsby/workers/c3.ts index c079a1d7ed57..71f5dd2b1784 100644 --- a/packages/create-cloudflare/templates/gatsby/workers/c3.ts +++ b/packages/create-cloudflare/templates/gatsby/workers/c3.ts @@ -49,5 +49,6 @@ const config: TemplateConfig = { devScript: "develop", deployScript: "deploy", previewScript: "preview", + workersTypes: "none", }; export default config; diff --git a/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/tsconfig.json b/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/tsconfig.json index 26376384f509..2e3a41447194 100644 --- a/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "node", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/worker-configuration.d.ts deleted file mode 100644 index 7dd159f208a0..000000000000 --- a/packages/create-cloudflare/templates/hello-world-durable-object-with-assets/ts/worker-configuration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 24be54e90498ce3774054fcb8bb2bc1a) -declare namespace Cloudflare { - interface Env { - MY_DURABLE_OBJECT: DurableObjectNamespace; - ASSETS: Fetcher; - } -} -interface Env extends Cloudflare.Env {} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json b/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json index cb0ed78a428c..3aedb947da23 100644 --- a/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "node", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/hello-world-durable-object/ts/worker-configuration.d.ts deleted file mode 100644 index b1b571eacb32..000000000000 --- a/packages/create-cloudflare/templates/hello-world-durable-object/ts/worker-configuration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 4c81d17e8de07f650cddf73ce751ba8d) -declare namespace Cloudflare { - interface Env { - MY_DURABLE_OBJECT: DurableObjectNamespace; - } -} -interface Env extends Cloudflare.Env {} diff --git a/packages/create-cloudflare/templates/hello-world-with-assets/c3.ts b/packages/create-cloudflare/templates/hello-world-with-assets/c3.ts index ffe12542727d..64bc1e4edeb8 100644 --- a/packages/create-cloudflare/templates/hello-world-with-assets/c3.ts +++ b/packages/create-cloudflare/templates/hello-world-with-assets/c3.ts @@ -21,5 +21,6 @@ const config: TemplateConfig = { }, }, }, + compatibilityFlags: ["nodejs_compat"], }; export default config; diff --git a/packages/create-cloudflare/templates/hello-world-with-assets/ts/test/tsconfig.json b/packages/create-cloudflare/templates/hello-world-with-assets/ts/test/tsconfig.json index 7fc4362899ec..978ecd87b7ce 100644 --- a/packages/create-cloudflare/templates/hello-world-with-assets/ts/test/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world-with-assets/ts/test/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "types": ["@cloudflare/workers-types/experimental", "@cloudflare/vitest-pool-workers"] + "types": ["@cloudflare/vitest-pool-workers"] }, "include": ["./**/*.ts", "../worker-configuration.d.ts"], "exclude": [] diff --git a/packages/create-cloudflare/templates/hello-world-with-assets/ts/tsconfig.json b/packages/create-cloudflare/templates/hello-world-with-assets/ts/tsconfig.json index c9aae166737a..d2f8744883d7 100644 --- a/packages/create-cloudflare/templates/hello-world-with-assets/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world-with-assets/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "Bundler", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/hello-world-with-assets/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/hello-world-with-assets/ts/worker-configuration.d.ts deleted file mode 100644 index 46fbe93fc125..000000000000 --- a/packages/create-cloudflare/templates/hello-world-with-assets/ts/worker-configuration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 187132f48ddf0f604882ba8213fe386f) -declare namespace Cloudflare { - interface Env { - ASSETS: Fetcher; - } -} -interface Env extends Cloudflare.Env {} diff --git a/packages/create-cloudflare/templates/hello-world/ts/test/index.spec.ts b/packages/create-cloudflare/templates/hello-world/ts/test/index.spec.ts index fbee335d71cd..519729651a56 100644 --- a/packages/create-cloudflare/templates/hello-world/ts/test/index.spec.ts +++ b/packages/create-cloudflare/templates/hello-world/ts/test/index.spec.ts @@ -1,4 +1,3 @@ -// test/index.spec.ts import { env, createExecutionContext, waitOnExecutionContext, SELF } from 'cloudflare:test'; import { describe, it, expect } from 'vitest'; import worker from '../src/index'; diff --git a/packages/create-cloudflare/templates/hello-world/ts/test/tsconfig.json b/packages/create-cloudflare/templates/hello-world/ts/test/tsconfig.json index 7fc4362899ec..978ecd87b7ce 100644 --- a/packages/create-cloudflare/templates/hello-world/ts/test/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world/ts/test/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "types": ["@cloudflare/workers-types/experimental", "@cloudflare/vitest-pool-workers"] + "types": ["@cloudflare/vitest-pool-workers"] }, "include": ["./**/*.ts", "../worker-configuration.d.ts"], "exclude": [] diff --git a/packages/create-cloudflare/templates/hello-world/ts/tsconfig.json b/packages/create-cloudflare/templates/hello-world/ts/tsconfig.json index ce321858be20..877b0cf7eb98 100644 --- a/packages/create-cloudflare/templates/hello-world/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/hello-world/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "Bundler", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/hello-world/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/hello-world/ts/worker-configuration.d.ts deleted file mode 100644 index 07966391f81b..000000000000 --- a/packages/create-cloudflare/templates/hello-world/ts/worker-configuration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 2905fd8e181cd2f4083a615fa51f1913) -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -declare namespace Cloudflare { - // eslint-disable-next-line @typescript-eslint/no-empty-interface,@typescript-eslint/no-empty-object-type - interface Env { - } -} -interface Env extends Cloudflare.Env {} diff --git a/packages/create-cloudflare/templates/hono/pages/c3.ts b/packages/create-cloudflare/templates/hono/pages/c3.ts index 857cea6d92a9..7af984988205 100644 --- a/packages/create-cloudflare/templates/hono/pages/c3.ts +++ b/packages/create-cloudflare/templates/hono/pages/c3.ts @@ -19,6 +19,8 @@ const generate = async (ctx: C3Context) => { logRaw(""); // newline }; +const envInterfaceName = "CloudflareBindings"; + const config: TemplateConfig = { configVersion: 1, id: "hono", @@ -33,12 +35,13 @@ const config: TemplateConfig = { generate, transformPackageJson: async () => ({ scripts: { - "cf-typegen": "wrangler types --env-interface CloudflareBindings", + "cf-typegen": `wrangler types --env-interface ${envInterfaceName}`, preview: "vite build && wrangler pages dev", }, }), devScript: "dev", deployScript: "deploy", previewScript: "preview", + envInterfaceName, }; export default config; diff --git a/packages/create-cloudflare/templates/hono/pages/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/hono/pages/templates/worker-configuration.d.ts deleted file mode 100644 index c943da4ceacb..000000000000 --- a/packages/create-cloudflare/templates/hono/pages/templates/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface CloudflareBindings { -} diff --git a/packages/create-cloudflare/templates/hono/workers/c3.ts b/packages/create-cloudflare/templates/hono/workers/c3.ts index 2b544aa3717e..95cbfd1577ed 100644 --- a/packages/create-cloudflare/templates/hono/workers/c3.ts +++ b/packages/create-cloudflare/templates/hono/workers/c3.ts @@ -19,6 +19,7 @@ const generate = async (ctx: C3Context) => { logRaw(""); // newline }; +const envInterfaceName = "CloudflareBindings"; const config: TemplateConfig = { configVersion: 1, id: "hono", @@ -32,11 +33,12 @@ const config: TemplateConfig = { generate, transformPackageJson: async () => ({ scripts: { - "cf-typegen": "wrangler types --env-interface CloudflareBindings", + "cf-typegen": `wrangler types --env-interface ${envInterfaceName}`, }, }), devScript: "dev", deployScript: "deploy", previewScript: "dev", + envInterfaceName, }; export default config; diff --git a/packages/create-cloudflare/templates/hono/workers/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/hono/workers/templates/worker-configuration.d.ts deleted file mode 100644 index c943da4ceacb..000000000000 --- a/packages/create-cloudflare/templates/hono/workers/templates/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface CloudflareBindings { -} diff --git a/packages/create-cloudflare/templates/next/pages/c3.ts b/packages/create-cloudflare/templates/next/pages/c3.ts index ea3f5a381e13..15afef64864d 100644 --- a/packages/create-cloudflare/templates/next/pages/c3.ts +++ b/packages/create-cloudflare/templates/next/pages/c3.ts @@ -145,7 +145,6 @@ export const writeEslintrc = async (ctx: C3Context): Promise => { const addDevDependencies = async (installEslintPlugin: boolean) => { const packages = [ "@cloudflare/next-on-pages@1", - "@cloudflare/workers-types", "vercel", ...(installEslintPlugin ? ["eslint-plugin-next-on-pages"] : []), ]; @@ -156,6 +155,9 @@ const addDevDependencies = async (installEslintPlugin: boolean) => { }); }; +const envInterfaceName = "CloudflareEnv"; +const typesPath = "./env.d.ts"; + export default { configVersion: 1, id: "next", @@ -213,7 +215,7 @@ export default { preview: `${pagesBuildRunCommand} && wrangler pages dev`, deploy: `${pagesBuildRunCommand} && wrangler pages deploy`, ...(usesTypescript(ctx) && { - "cf-typegen": `wrangler types --env-interface CloudflareEnv env.d.ts`, + "cf-typegen": `wrangler types --env-interface ${envInterfaceName} ${typesPath}`, }), }, }; @@ -222,4 +224,6 @@ export default { previewScript: "preview", deployScript: "deploy", compatibilityFlags: ["nodejs_compat"], + typesPath, + envInterfaceName, } as TemplateConfig; diff --git a/packages/create-cloudflare/templates/next/pages/env.d.ts b/packages/create-cloudflare/templates/next/pages/env.d.ts deleted file mode 100644 index 68a2a989df06..000000000000 --- a/packages/create-cloudflare/templates/next/pages/env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by Wrangler -// by running `wrangler types --env-interface CloudflareEnv env.d.ts` - -interface CloudflareEnv { -} diff --git a/packages/create-cloudflare/templates/next/workers/c3.ts b/packages/create-cloudflare/templates/next/workers/c3.ts index f334db22823d..04ce5a1ac68e 100644 --- a/packages/create-cloudflare/templates/next/workers/c3.ts +++ b/packages/create-cloudflare/templates/next/workers/c3.ts @@ -42,13 +42,15 @@ const updateNextConfig = (usesTs: boolean) => { s.stop(`${brandColor(`updated`)} ${dim(`\`${configFile}\``)}`); }; +const envInterfaceName = "CloudflareBindings"; +const typesPath = "./cloudflare-env.d.ts"; export default { configVersion: 1, id: "next", frameworkCli: "create-next-app", frameworkCliPinnedVersion: "~15.3.0", platform: "workers", - displayName: "Next.js (using Node.js compat + Workers Assets)", + displayName: "Next.js", path: "templates/next/workers", copyFiles: { path: "./templates", @@ -59,11 +61,13 @@ export default { scripts: { deploy: `opennextjs-cloudflare build && opennextjs-cloudflare deploy`, preview: `opennextjs-cloudflare build && opennextjs-cloudflare preview`, - "cf-typegen": `wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts`, + "cf-typegen": `wrangler types --env-interface ${envInterfaceName} ${typesPath}`, }, }), devScript: "dev", previewScript: "preview", deployScript: "deploy", + typesPath, + envInterfaceName, compatibilityFlags: ["nodejs_compat"], } as TemplateConfig; diff --git a/packages/create-cloudflare/templates/next/workers/templates/cloudflare-env.d.ts b/packages/create-cloudflare/templates/next/workers/templates/cloudflare-env.d.ts deleted file mode 100644 index cdfc25f8e42c..000000000000 --- a/packages/create-cloudflare/templates/next/workers/templates/cloudflare-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by Wrangler -// by running `wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts` - -interface CloudflareEnv { -} diff --git a/packages/create-cloudflare/templates/nuxt/pages/c3.ts b/packages/create-cloudflare/templates/nuxt/pages/c3.ts index ea9945d95916..2221dcb09058 100644 --- a/packages/create-cloudflare/templates/nuxt/pages/c3.ts +++ b/packages/create-cloudflare/templates/nuxt/pages/c3.ts @@ -3,8 +3,7 @@ import { brandColor, dim } from "@cloudflare/cli/colors"; import { spinner } from "@cloudflare/cli/interactive"; import { runFrameworkGenerator } from "frameworks/index"; import { mergeObjectProperties, transformFile } from "helpers/codemod"; -import { getLatestTypesEntrypoint } from "helpers/compatDate"; -import { readFile, writeFile } from "helpers/files"; +import { writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packageManagers"; import { installPackages } from "helpers/packages"; import * as recast from "recast"; @@ -30,7 +29,7 @@ const generate = async (ctx: C3Context) => { logRaw(""); // newline }; -const configure = async (ctx: C3Context) => { +const configure = async () => { const packages = ["nitro-cloudflare-dev"]; // When using pnpm, explicitly add h3 package so the H3Event type declaration can be updated. @@ -45,29 +44,6 @@ const configure = async (ctx: C3Context) => { doneText: `${brandColor("installed")} ${dim(`via \`${npm} install\``)}`, }); updateNuxtConfig(); - - updateEnvTypes(ctx); -}; - -const updateEnvTypes = (ctx: C3Context) => { - const filepath = "env.d.ts"; - - const s = spinner(); - s.start(`Updating ${filepath}`); - - let file = readFile(filepath); - - let typesEntrypoint = `@cloudflare/workers-types`; - const latestEntrypoint = getLatestTypesEntrypoint(ctx); - if (latestEntrypoint) { - typesEntrypoint += `/${latestEntrypoint}`; - } - - // Replace placeholder with actual types entrypoint - file = file.replace("WORKERS_TYPES_ENTRYPOINT", typesEntrypoint); - writeFile("env.d.ts", file); - - s.stop(`${brandColor(`updated`)} ${dim(`\`${filepath}\``)}`); }; const updateNuxtConfig = () => { diff --git a/packages/create-cloudflare/templates/nuxt/pages/templates/env.d.ts b/packages/create-cloudflare/templates/nuxt/pages/templates/env.d.ts index dda21a4ab105..43e222ef2138 100644 --- a/packages/create-cloudflare/templates/nuxt/pages/templates/env.d.ts +++ b/packages/create-cloudflare/templates/nuxt/pages/templates/env.d.ts @@ -1,4 +1,4 @@ -/// +/// declare module "h3" { interface H3EventContext { diff --git a/packages/create-cloudflare/templates/nuxt/pages/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/nuxt/pages/templates/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/nuxt/pages/templates/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/nuxt/workers/c3.ts b/packages/create-cloudflare/templates/nuxt/workers/c3.ts index 022c4920da7c..a89af1fe71a8 100644 --- a/packages/create-cloudflare/templates/nuxt/workers/c3.ts +++ b/packages/create-cloudflare/templates/nuxt/workers/c3.ts @@ -3,8 +3,7 @@ import { brandColor, dim } from "@cloudflare/cli/colors"; import { spinner } from "@cloudflare/cli/interactive"; import { runFrameworkGenerator } from "frameworks/index"; import { mergeObjectProperties, transformFile } from "helpers/codemod"; -import { getLatestTypesEntrypoint } from "helpers/compatDate"; -import { readFile, writeFile } from "helpers/files"; +import { writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packageManagers"; import { installPackages } from "helpers/packages"; import * as recast from "recast"; @@ -30,7 +29,7 @@ const generate = async (ctx: C3Context) => { logRaw(""); // newline }; -const configure = async (ctx: C3Context) => { +const configure = async () => { const packages = ["nitro-cloudflare-dev", "nitropack"]; // When using pnpm, explicitly add h3 package so the H3Event type declaration can be updated. @@ -45,29 +44,6 @@ const configure = async (ctx: C3Context) => { doneText: `${brandColor("installed")} ${dim(`via \`${npm} install\``)}`, }); updateNuxtConfig(); - - updateEnvTypes(ctx); -}; - -const updateEnvTypes = (ctx: C3Context) => { - const filepath = "env.d.ts"; - - const s = spinner(); - s.start(`Updating ${filepath}`); - - let file = readFile(filepath); - - let typesEntrypoint = `@cloudflare/workers-types`; - const latestEntrypoint = getLatestTypesEntrypoint(ctx); - if (latestEntrypoint) { - typesEntrypoint += `/${latestEntrypoint}`; - } - - // Replace placeholder with actual types entrypoint - file = file.replace("WORKERS_TYPES_ENTRYPOINT", typesEntrypoint); - writeFile("env.d.ts", file); - - s.stop(`${brandColor(`updated`)} ${dim(`\`${filepath}\``)}`); }; const updateNuxtConfig = () => { diff --git a/packages/create-cloudflare/templates/nuxt/workers/templates/env.d.ts b/packages/create-cloudflare/templates/nuxt/workers/templates/env.d.ts index dda21a4ab105..43e222ef2138 100644 --- a/packages/create-cloudflare/templates/nuxt/workers/templates/env.d.ts +++ b/packages/create-cloudflare/templates/nuxt/workers/templates/env.d.ts @@ -1,4 +1,4 @@ -/// +/// declare module "h3" { interface H3EventContext { diff --git a/packages/create-cloudflare/templates/nuxt/workers/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/nuxt/workers/templates/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/nuxt/workers/templates/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/openapi/ts/tsconfig.json b/packages/create-cloudflare/templates/openapi/ts/tsconfig.json index 4784966fb66c..2995bd1b4296 100644 --- a/packages/create-cloudflare/templates/openapi/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/openapi/ts/tsconfig.json @@ -22,7 +22,6 @@ "types": [ "@types/node", "@types/service-worker-mock", - "@cloudflare/workers-types" ] }, "exclude": ["node_modules", "dist", "tests"], diff --git a/packages/create-cloudflare/templates/openapi/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/openapi/ts/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/openapi/ts/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/queues/ts/tsconfig.json b/packages/create-cloudflare/templates/queues/ts/tsconfig.json index 26376384f509..2e3a41447194 100644 --- a/packages/create-cloudflare/templates/queues/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/queues/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "node", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/queues/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/queues/ts/worker-configuration.d.ts deleted file mode 100644 index 83fed320a334..000000000000 --- a/packages/create-cloudflare/templates/queues/ts/worker-configuration.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { - MY_QUEUE: Queue; -} diff --git a/packages/create-cloudflare/templates/qwik/pages/c3.ts b/packages/create-cloudflare/templates/qwik/pages/c3.ts index a0f8c2720c93..8e9a84f14936 100644 --- a/packages/create-cloudflare/templates/qwik/pages/c3.ts +++ b/packages/create-cloudflare/templates/qwik/pages/c3.ts @@ -146,5 +146,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + workersTypes: "installed", }; export default config; diff --git a/packages/create-cloudflare/templates/qwik/workers/c3.ts b/packages/create-cloudflare/templates/qwik/workers/c3.ts index c2be839c9dbd..5ca426c1b740 100644 --- a/packages/create-cloudflare/templates/qwik/workers/c3.ts +++ b/packages/create-cloudflare/templates/qwik/workers/c3.ts @@ -148,5 +148,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + workersTypes: "installed", }; export default config; diff --git a/packages/create-cloudflare/templates/react-router/c3.ts b/packages/create-cloudflare/templates/react-router/c3.ts index 7d506fd247b8..def8b91062e7 100644 --- a/packages/create-cloudflare/templates/react-router/c3.ts +++ b/packages/create-cloudflare/templates/react-router/c3.ts @@ -19,24 +19,12 @@ const generate = async (ctx: C3Context) => { logRaw(""); // newline }; -// TODO: Uncomment this once @react-router/dev updates its peer dependency to Wrangler v4 -// const configure = async () => { -// await installPackages(["wrangler@latest"], { -// dev: true, -// startText: "Updating the Wrangler version", -// doneText: `${brandColor(`updated`)} ${dim("wrangler@latest")}`, -// }); -// }; - const config: TemplateConfig = { configVersion: 1, id: "react-router", platform: "workers", frameworkCli: "create-react-router", displayName: "React Router (formerly Remix)", - copyFiles: { - path: "./templates", - }, generate, // configure, transformPackageJson: async () => ({ diff --git a/packages/create-cloudflare/templates/react-router/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/react-router/templates/worker-configuration.d.ts deleted file mode 100644 index 3400629ce87e..000000000000 --- a/packages/create-cloudflare/templates/react-router/templates/worker-configuration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -declare namespace Cloudflare { - interface Env { - VALUE_FROM_CLOUDFLARE: "Hello from Cloudflare"; - } -} -interface Env extends Cloudflare.Env {} \ No newline at end of file diff --git a/packages/create-cloudflare/templates/react/pages/c3.ts b/packages/create-cloudflare/templates/react/pages/c3.ts index 181b95fac6c4..e2b2a9ead021 100644 --- a/packages/create-cloudflare/templates/react/pages/c3.ts +++ b/packages/create-cloudflare/templates/react/pages/c3.ts @@ -49,11 +49,13 @@ const config: TemplateConfig = { platform: "pages", hidden: true, path: "templates/react/pages", + copyFiles: { path: "./templates" }, generate, transformPackageJson: async () => ({ scripts: { - deploy: `${npm} run build && wrangler pages deploy ./dist`, - preview: `${npm} run build && wrangler pages dev ./dist`, + deploy: `${npm} run build && wrangler pages deploy`, + preview: `${npm} run build && wrangler pages dev`, + "cf-typegen": `wrangler types`, }, }), devScript: "dev", diff --git a/packages/create-cloudflare/templates/react/pages/templates/wrangler.jsonc b/packages/create-cloudflare/templates/react/pages/templates/wrangler.jsonc new file mode 100644 index 000000000000..9fb9c7262e8b --- /dev/null +++ b/packages/create-cloudflare/templates/react/pages/templates/wrangler.jsonc @@ -0,0 +1,5 @@ +{ + "name": "", + "compatibility_date": "", + "pages_build_output_dir": "./dist" + } diff --git a/packages/create-cloudflare/templates/react/workers/ts/tsconfig.worker.json b/packages/create-cloudflare/templates/react/workers/ts/tsconfig.worker.json index 5a170fd149f1..2acc852185d1 100644 --- a/packages/create-cloudflare/templates/react/workers/ts/tsconfig.worker.json +++ b/packages/create-cloudflare/templates/react/workers/ts/tsconfig.worker.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.node.json", "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.worker.tsbuildinfo", - "types": ["@cloudflare/workers-types/2023-07-01", "vite/client"] + "types": ["./worker-configuration.d.ts", "vite/client"], }, "include": ["./worker-configuration.d.ts", "./worker"] } diff --git a/packages/create-cloudflare/templates/react/workers/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/react/workers/ts/worker-configuration.d.ts deleted file mode 100644 index 1f0a97cb3ae0..000000000000 --- a/packages/create-cloudflare/templates/react/workers/ts/worker-configuration.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { - ASSETS: Fetcher; -} diff --git a/packages/create-cloudflare/templates/remix/pages/c3.ts b/packages/create-cloudflare/templates/remix/pages/c3.ts index e803a54cafcf..7c11e41db704 100644 --- a/packages/create-cloudflare/templates/remix/pages/c3.ts +++ b/packages/create-cloudflare/templates/remix/pages/c3.ts @@ -65,5 +65,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + workersTypes: "installed", }; export default config; diff --git a/packages/create-cloudflare/templates/remix/pages/templates/worker-configuration.d.ts b/packages/create-cloudflare/templates/remix/pages/templates/worker-configuration.d.ts index a0b76efdd358..5b2319b3f29f 100644 --- a/packages/create-cloudflare/templates/remix/pages/templates/worker-configuration.d.ts +++ b/packages/create-cloudflare/templates/remix/pages/templates/worker-configuration.d.ts @@ -1,4 +1,4 @@ // Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` +// After adding bindings to `wrangler.toml`, regenerate this interface via `npm run cf-typegen` interface Env { } diff --git a/packages/create-cloudflare/templates/remix/workers/c3.ts b/packages/create-cloudflare/templates/remix/workers/c3.ts index e92dd2357228..1b201a0f2ec6 100644 --- a/packages/create-cloudflare/templates/remix/workers/c3.ts +++ b/packages/create-cloudflare/templates/remix/workers/c3.ts @@ -48,5 +48,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + workersTypes: "installed", }; export default config; diff --git a/packages/create-cloudflare/templates/scheduled/ts/tsconfig.json b/packages/create-cloudflare/templates/scheduled/ts/tsconfig.json index 26376384f509..2e3a41447194 100644 --- a/packages/create-cloudflare/templates/scheduled/ts/tsconfig.json +++ b/packages/create-cloudflare/templates/scheduled/ts/tsconfig.json @@ -13,8 +13,6 @@ "module": "es2022", /* Specify how TypeScript looks up a file from a given module specifier. */ "moduleResolution": "node", - /* Specify type package names to be included without being referenced in a source file. */ - "types": ["@cloudflare/workers-types"], /* Enable importing .json files */ "resolveJsonModule": true, diff --git a/packages/create-cloudflare/templates/scheduled/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/scheduled/ts/worker-configuration.d.ts deleted file mode 100644 index a0b76efdd358..000000000000 --- a/packages/create-cloudflare/templates/scheduled/ts/worker-configuration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Generated by Wrangler -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` -interface Env { -} diff --git a/packages/create-cloudflare/templates/solid/c3.ts b/packages/create-cloudflare/templates/solid/c3.ts index e406ad86e30d..8ee4fc2239b8 100644 --- a/packages/create-cloudflare/templates/solid/c3.ts +++ b/packages/create-cloudflare/templates/solid/c3.ts @@ -77,6 +77,7 @@ const config: TemplateConfig = { scripts: { preview: `${npm} run build && npx wrangler pages dev`, deploy: `${npm} run build && wrangler pages deploy`, + "cf-typegen": `wrangler types`, }, }), compatibilityFlags: ["nodejs_compat"], diff --git a/packages/create-cloudflare/templates/svelte/pages/c3.ts b/packages/create-cloudflare/templates/svelte/pages/c3.ts index 9aa0858f2d4d..7c2b6fa17a92 100644 --- a/packages/create-cloudflare/templates/svelte/pages/c3.ts +++ b/packages/create-cloudflare/templates/svelte/pages/c3.ts @@ -1,5 +1,4 @@ import { existsSync } from "node:fs"; -import { platform } from "node:os"; import { logRaw, updateStatus } from "@cloudflare/cli"; import { blue, brandColor, dim } from "@cloudflare/cli/colors"; import { runFrameworkGenerator } from "frameworks/index"; @@ -124,6 +123,7 @@ const updateTypeDefinitions = (ctx: C3Context) => { }); }; +const typesPath = "src/worker-configuration.d.ts"; const config: TemplateConfig = { configVersion: 1, id: "svelte", @@ -144,10 +144,9 @@ const config: TemplateConfig = { }; if (usesTypescript(ctx)) { - const mv = platform() === "win32" ? "move" : "mv"; scripts = { ...scripts, - "cf-typegen": `wrangler types && ${mv} worker-configuration.d.ts src/`, + "cf-typegen": `wrangler types ${typesPath}`, }; } @@ -156,5 +155,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + typesPath, }; export default config; diff --git a/packages/create-cloudflare/templates/svelte/workers/c3.ts b/packages/create-cloudflare/templates/svelte/workers/c3.ts index a251fccbb856..cda88ca08784 100644 --- a/packages/create-cloudflare/templates/svelte/workers/c3.ts +++ b/packages/create-cloudflare/templates/svelte/workers/c3.ts @@ -1,4 +1,3 @@ -import { platform } from "node:os"; import { logRaw, updateStatus } from "@cloudflare/cli"; import { blue, brandColor, dim } from "@cloudflare/cli/colors"; import { runFrameworkGenerator } from "frameworks/index"; @@ -94,6 +93,7 @@ const updateTypeDefinitions = (ctx: C3Context) => { }); }; +const typesPath = "./src/worker-configuration.d.ts"; const config: TemplateConfig = { configVersion: 1, id: "svelte", @@ -113,10 +113,9 @@ const config: TemplateConfig = { }; if (usesTypescript(ctx)) { - const mv = platform() === "win32" ? "move" : "mv"; scripts = { ...scripts, - "cf-typegen": `wrangler types && ${mv} worker-configuration.d.ts src/`, + "cf-typegen": `wrangler types ${typesPath}`, }; } @@ -125,5 +124,6 @@ const config: TemplateConfig = { devScript: "dev", deployScript: "deploy", previewScript: "preview", + typesPath, }; export default config; diff --git a/packages/create-cloudflare/templates/vue/pages/c3.ts b/packages/create-cloudflare/templates/vue/pages/c3.ts index 24d1931567a1..60dad473557c 100644 --- a/packages/create-cloudflare/templates/vue/pages/c3.ts +++ b/packages/create-cloudflare/templates/vue/pages/c3.ts @@ -16,12 +16,14 @@ const config: TemplateConfig = { displayName: "Vue", platform: "pages", hidden: true, - path: "templates/pages/vue", + path: "templates/vue/pages", + copyFiles: { path: "./templates" }, generate, transformPackageJson: async () => ({ scripts: { - deploy: `${npm} run build && wrangler pages deploy ./dist`, - preview: `${npm} run build && wrangler pages dev ./dist`, + deploy: `${npm} run build && wrangler pages deploy`, + preview: `${npm} run build && wrangler pages dev`, + "cf-typegen": `wrangler types`, }, }), devScript: "dev", diff --git a/packages/create-cloudflare/templates/vue/pages/templates/wrangler.jsonc b/packages/create-cloudflare/templates/vue/pages/templates/wrangler.jsonc new file mode 100644 index 000000000000..9fb9c7262e8b --- /dev/null +++ b/packages/create-cloudflare/templates/vue/pages/templates/wrangler.jsonc @@ -0,0 +1,5 @@ +{ + "name": "", + "compatibility_date": "", + "pages_build_output_dir": "./dist" + } diff --git a/packages/create-cloudflare/templates/vue/workers/ts/tsconfig.worker.json b/packages/create-cloudflare/templates/vue/workers/ts/tsconfig.worker.json index 533fb11bead3..b48c4245e9f7 100644 --- a/packages/create-cloudflare/templates/vue/workers/ts/tsconfig.worker.json +++ b/packages/create-cloudflare/templates/vue/workers/ts/tsconfig.worker.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.node.json", "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.worker.tsbuildinfo", - "types": ["@cloudflare/workers-types/2023-07-01", "./worker-configuration.d.ts","vite/client"], + "types": [ "./worker-configuration.d.ts","vite/client"], }, "include": ["server"], } diff --git a/packages/create-cloudflare/templates/vue/workers/ts/worker-configuration.d.ts b/packages/create-cloudflare/templates/vue/workers/ts/worker-configuration.d.ts deleted file mode 100644 index c34b3b6621d0..000000000000 --- a/packages/create-cloudflare/templates/vue/workers/ts/worker-configuration.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Generated by Wrangler by running `wrangler types` -// After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen` - -interface Env { - ASSETS: Fetcher; -}