From b519be88a6eef11b25dd6a12082149215745297e Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Tue, 30 Sep 2025 16:58:43 +0100 Subject: [PATCH 1/4] Support containers in auxiliary Vite Workers --- .../containers/entry.wrangler.jsonc | 11 + .../playground/containers/src/entry.ts | 5 + .../playground/containers/vite.config.ts | 9 +- .../vite-plugin-cloudflare/src/containers.ts | 69 +--- packages/vite-plugin-cloudflare/src/index.ts | 76 ++-- .../src/miniflare-options.ts | 386 ++++++++++-------- 6 files changed, 281 insertions(+), 275 deletions(-) create mode 100644 packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc create mode 100644 packages/vite-plugin-cloudflare/playground/containers/src/entry.ts diff --git a/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc b/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc new file mode 100644 index 000000000000..731ea7166ffc --- /dev/null +++ b/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc @@ -0,0 +1,11 @@ +{ + "name": "entryp", + "main": "./src/entry.ts", + "compatibility_date": "2025-04-03", + "services": [ + { + "binding": "APP", + "service": "container-app", + }, + ], +} diff --git a/packages/vite-plugin-cloudflare/playground/containers/src/entry.ts b/packages/vite-plugin-cloudflare/playground/containers/src/entry.ts new file mode 100644 index 000000000000..214ecbe07324 --- /dev/null +++ b/packages/vite-plugin-cloudflare/playground/containers/src/entry.ts @@ -0,0 +1,5 @@ +export default { + async fetch(request, env): Promise { + return env.APP.fetch(request); + }, +} satisfies ExportedHandler; diff --git a/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts b/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts index 9c6b158cb564..faab3d5303eb 100644 --- a/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts +++ b/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts @@ -2,5 +2,12 @@ import { cloudflare } from "@cloudflare/vite-plugin"; import { defineConfig } from "vite"; export default defineConfig({ - plugins: [cloudflare({ inspectorPort: false, persistState: false })], + plugins: [ + cloudflare({ + inspectorPort: false, + persistState: false, + configPath: "entry.wrangler.jsonc", + auxiliaryWorkers: [{ configPath: "wrangler.jsonc" }], + }), + ], }); diff --git a/packages/vite-plugin-cloudflare/src/containers.ts b/packages/vite-plugin-cloudflare/src/containers.ts index ea33fa64081d..7fe4d8cd6026 100644 --- a/packages/vite-plugin-cloudflare/src/containers.ts +++ b/packages/vite-plugin-cloudflare/src/containers.ts @@ -22,20 +22,14 @@ export function getDockerPath(): string { * with image tag set to well-known dev format, or undefined if * containers are not enabled or not configured. */ -async function getContainerOptions(options: { +export function getContainerOptions(options: { containersConfig: WorkerConfig["containers"]; - isContainersEnabled: boolean; containerBuildId: string; configPath?: string; }) { - const { - containersConfig, - isContainersEnabled, - containerBuildId, - configPath, - } = options; + const { containersConfig, containerBuildId, configPath } = options; - if (!containersConfig?.length || isContainersEnabled === false) { + if (!containersConfig?.length) { return undefined; } @@ -64,60 +58,3 @@ async function getContainerOptions(options: { } }); } - -/** - * Builds or pulls the container images for local development, and returns the - * corresponding list of image tags - * - * @param options.containersConfig The configured containers - * @param options.containerBuildId The container build id - * @param options.isContainersEnabled Whether containers is enabled for this Worker - * @param options.dockerPath The path to the Docker executable - * @param options.configPath The path of the wrangler configuration file - * @returns The list of image tags corresponding to the built/pulled container images - */ -export async function prepareContainerImages(options: { - containersConfig: WorkerConfig["containers"]; - containerBuildId?: string; - isContainersEnabled: boolean; - dockerPath: string; - configPath?: string; -}): Promise> { - assert( - options.containerBuildId, - "Build ID should be set if containers are enabled and defined" - ); - - const { - containersConfig, - isContainersEnabled, - dockerPath, - containerBuildId, - configPath, - } = options; - const uniqueImageTags = new Set(); - - // Assemble container options and build if necessary - const containerOptions = await getContainerOptions({ - containersConfig, - containerBuildId, - isContainersEnabled, - configPath, - }); - - if (containerOptions) { - // keep track of them so we can clean up later - for (const container of containerOptions) { - uniqueImageTags.add(container.image_tag); - } - - await prepareContainerImagesForDev({ - dockerPath, - containerOptions, - onContainerImagePreparationStart: () => {}, - onContainerImagePreparationEnd: () => {}, - }); - } - - return uniqueImageTags; -} diff --git a/packages/vite-plugin-cloudflare/src/index.ts b/packages/vite-plugin-cloudflare/src/index.ts index dc00b58025ca..c30436c6287f 100644 --- a/packages/vite-plugin-cloudflare/src/index.ts +++ b/packages/vite-plugin-cloudflare/src/index.ts @@ -1,5 +1,6 @@ import assert from "node:assert"; import * as util from "node:util"; +import { prepareContainerImagesForDev } from "@cloudflare/containers-shared"; import { cleanupContainers, generateContainerBuildId, @@ -234,23 +235,14 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { const entryWorkerConfig = getEntryWorkerConfig( ctx.resolvedPluginConfig ); - const hasDevContainers = - entryWorkerConfig?.containers?.length && - entryWorkerConfig.dev.enable_containers; - const dockerPath = getDockerPath(); - - if (hasDevContainers) { - containerBuildId = generateContainerBuildId(); - entryWorkerConfig.dev.container_engine = - resolveDockerHost(dockerPath); - } - const miniflareDevOptions = await getDevMiniflareOptions({ - resolvedPluginConfig: ctx.resolvedPluginConfig, - viteDevServer, - inspectorPort: inputInspectorPort, - containerBuildId, - }); + const { config: miniflareDevOptions, allContainerOptions } = + await getDevMiniflareOptions({ + resolvedPluginConfig: ctx.resolvedPluginConfig, + viteDevServer, + inspectorPort: inputInspectorPort, + containerBuildId, + }); if (!miniflare) { debuglog("Creating new Miniflare instance"); @@ -318,7 +310,7 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { }; } - if (hasDevContainers) { + if (allContainerOptions.size > 0) { viteDevServer.config.logger.info( colors.dim( colors.yellow( @@ -326,13 +318,14 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { ) ) ); - containerImageTagsSeen = await prepareContainerImages({ - containersConfig: entryWorkerConfig.containers, - containerBuildId, - isContainersEnabled: entryWorkerConfig.dev.enable_containers, - dockerPath, - configPath: entryWorkerConfig.configPath, + await prepareContainerImagesForDev({ + dockerPath: getDockerPath(), + containerOptions: [...allContainerOptions.values()], + onContainerImagePreparationStart: () => {}, + onContainerImagePreparationEnd: () => {}, }); + + containerImageTagsSeen = new Set(allContainerOptions.keys()); viteDevServer.config.logger.info( colors.dim( colors.yellow( @@ -356,8 +349,8 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { * */ process.on("exit", async () => { - if (containerImageTagsSeen.size) { - cleanupContainers(dockerPath, containerImageTagsSeen); + if (allContainerOptions.size > 0) { + cleanupContainers(getDockerPath(), containerImageTagsSeen); } }); } @@ -415,27 +408,15 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { vitePreviewServer ); - // first Worker in the Array is always the entry Worker - const entryWorkerConfig = ctx.resolvedPluginConfig.workers[0]; - const hasDevContainers = - entryWorkerConfig?.containers?.length && - entryWorkerConfig.dev.enable_containers; - let containerBuildId: string | undefined; - - if (hasDevContainers) { - containerBuildId = generateContainerBuildId(); - } - - miniflare = new Miniflare( + const { config: miniflareOptions, allContainerOptions } = await getPreviewMiniflareOptions({ resolvedPluginConfig: ctx.resolvedPluginConfig, vitePreviewServer, inspectorPort: inputInspectorPort, - containerBuildId, - }) - ); + }); + miniflare = new Miniflare(miniflareOptions); - if (hasDevContainers) { + if (allContainerOptions.size > 0) { const dockerPath = getDockerPath(); vitePreviewServer.config.logger.info( @@ -445,13 +426,14 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] { ) ) ); - containerImageTagsSeen = await prepareContainerImages({ - containersConfig: entryWorkerConfig.containers, - containerBuildId, - isContainersEnabled: entryWorkerConfig.dev.enable_containers, - dockerPath, - configPath: entryWorkerConfig.configPath, + await prepareContainerImagesForDev({ + dockerPath: getDockerPath(), + containerOptions: [...allContainerOptions.values()], + onContainerImagePreparationStart: () => {}, + onContainerImagePreparationEnd: () => {}, }); + containerImageTagsSeen = new Set(allContainerOptions.keys()); + vitePreviewServer.config.logger.info( colors.dim(colors.yellow("\n⚡️ Containers successfully built.\n")) ); diff --git a/packages/vite-plugin-cloudflare/src/miniflare-options.ts b/packages/vite-plugin-cloudflare/src/miniflare-options.ts index 2690016f1d36..cb85cdce7af2 100644 --- a/packages/vite-plugin-cloudflare/src/miniflare-options.ts +++ b/packages/vite-plugin-cloudflare/src/miniflare-options.ts @@ -3,6 +3,10 @@ import * as fs from "node:fs"; import * as fsp from "node:fs/promises"; import * as path from "node:path"; import { fileURLToPath } from "node:url"; +import { + generateContainerBuildId, + resolveDockerHost, +} from "@cloudflare/containers-shared"; import { getDefaultDevRegistryPath, kCurrentWorker, @@ -26,6 +30,7 @@ import { ROUTER_WORKER_NAME, VITE_PROXY_WORKER_NAME, } from "./constants"; +import { getContainerOptions, getDockerPath } from "./containers"; import { additionalModuleRE } from "./plugins/additional-modules"; import { withTrailingSlash } from "./utils"; import type { CloudflareDevEnvironment } from "./cloudflare-environment"; @@ -242,13 +247,14 @@ export async function getDevMiniflareOptions(config: { viteDevServer: vite.ViteDevServer; inspectorPort: number | false; containerBuildId?: string; -}): Promise { - const { - resolvedPluginConfig, - viteDevServer, - inspectorPort, - containerBuildId, - } = config; +}): Promise<{ + config: Extract; + allContainerOptions: Map< + string, + NonNullable>[number] + >; +}> { + const { resolvedPluginConfig, viteDevServer, inspectorPort } = config; const resolvedViteConfig = viteDevServer.config; const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig); @@ -384,6 +390,11 @@ export async function getDevMiniflareOptions(config: { }, ]; + let allContainerOptions = new Map< + string, + NonNullable>[number] + >(); + const workersFromConfig = resolvedPluginConfig.type === "workers" ? await Promise.all( @@ -416,6 +427,26 @@ export async function getDevMiniflareOptions(config: { ); } + let containerBuildId: string | undefined; + if ( + workerConfig.containers?.length && + workerConfig.dev.enable_containers + ) { + const dockerPath = getDockerPath(); + workerConfig.dev.container_engine = + resolveDockerHost(dockerPath); + containerBuildId = generateContainerBuildId(); + + const options = await getContainerOptions({ + containersConfig: workerConfig.containers, + containerBuildId, + configPath: workerConfig.configPath, + }); + for (const option of options ?? []) { + allContainerOptions.set(option.image_tag, option); + } + } + const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions( { ...workerConfig, @@ -530,153 +561,158 @@ export async function getDevMiniflareOptions(config: { const logger = new ViteMiniflareLogger(resolvedViteConfig); return { - log: logger, - logRequests: false, - inspectorPort: inspectorPort === false ? undefined : inspectorPort, - unsafeInspectorProxy: inspectorPort !== false, - unsafeDevRegistryPath: getDefaultDevRegistryPath(), - unsafeTriggerHandlers: true, - handleRuntimeStdio(stdout, stderr) { - const decoder = new TextDecoder(); - stdout.forEach((data) => logger.info(decoder.decode(data))); - stderr.forEach((error) => - logger.logWithLevel(LogLevel.ERROR, decoder.decode(error)) - ); - }, - defaultPersistRoot: getPersistenceRoot( - resolvedViteConfig.root, - resolvedPluginConfig.persistState - ), - workers: [ - ...assetWorkers, - ...externalWorkers, - ...userWorkers.map((workerOptions) => { - const wrappers = [ - `import { createWorkerEntrypointWrapper, createDurableObjectWrapper, createWorkflowEntrypointWrapper } from '${RUNNER_PATH}';`, - `export { __VITE_RUNNER_OBJECT__ } from '${RUNNER_PATH}';`, - `export default createWorkerEntrypointWrapper('default');`, - ]; - - const workerEntrypointNames = workerToWorkerEntrypointNamesMap.get( - workerOptions.name + config: { + log: logger, + logRequests: false, + inspectorPort: inspectorPort === false ? undefined : inspectorPort, + unsafeInspectorProxy: inspectorPort !== false, + unsafeDevRegistryPath: getDefaultDevRegistryPath(), + unsafeTriggerHandlers: true, + handleRuntimeStdio(stdout, stderr) { + const decoder = new TextDecoder(); + stdout.forEach((data) => logger.info(decoder.decode(data))); + stderr.forEach((error) => + logger.logWithLevel(LogLevel.ERROR, decoder.decode(error)) ); - assert( - workerEntrypointNames, - `WorkerEntrypoint names not found for worker ${workerOptions.name}` - ); - - for (const entrypointName of [...workerEntrypointNames].sort()) { - wrappers.push( - `export const ${entrypointName} = createWorkerEntrypointWrapper('${entrypointName}');` + }, + defaultPersistRoot: getPersistenceRoot( + resolvedViteConfig.root, + resolvedPluginConfig.persistState + ), + workers: [ + ...assetWorkers, + ...externalWorkers, + ...userWorkers.map((workerOptions) => { + const wrappers = [ + `import { createWorkerEntrypointWrapper, createDurableObjectWrapper, createWorkflowEntrypointWrapper } from '${RUNNER_PATH}';`, + `export { __VITE_RUNNER_OBJECT__ } from '${RUNNER_PATH}';`, + `export default createWorkerEntrypointWrapper('default');`, + ]; + + const workerEntrypointNames = workerToWorkerEntrypointNamesMap.get( + workerOptions.name + ); + assert( + workerEntrypointNames, + `WorkerEntrypoint names not found for worker ${workerOptions.name}` ); - } - const durableObjectClassNames = workerToDurableObjectClassNamesMap.get( - workerOptions.name - ); - assert( - durableObjectClassNames, - `DurableObject class names not found for worker ${workerOptions.name}` - ); + for (const entrypointName of [...workerEntrypointNames].sort()) { + wrappers.push( + `export const ${entrypointName} = createWorkerEntrypointWrapper('${entrypointName}');` + ); + } - for (const className of [...durableObjectClassNames].sort()) { - wrappers.push( - `export const ${className} = createDurableObjectWrapper('${className}');` + const durableObjectClassNames = + workerToDurableObjectClassNamesMap.get(workerOptions.name); + assert( + durableObjectClassNames, + `DurableObject class names not found for worker ${workerOptions.name}` ); - } - const workflowEntrypointClassNames = - workerToWorkflowEntrypointClassNamesMap.get(workerOptions.name); - assert( - workflowEntrypointClassNames, - `WorkflowEntrypoint class names not found for worker: ${workerOptions.name}` - ); + for (const className of [...durableObjectClassNames].sort()) { + wrappers.push( + `export const ${className} = createDurableObjectWrapper('${className}');` + ); + } - for (const className of [...workflowEntrypointClassNames].sort()) { - wrappers.push( - `export const ${className} = createWorkflowEntrypointWrapper('${className}');` + const workflowEntrypointClassNames = + workerToWorkflowEntrypointClassNamesMap.get(workerOptions.name); + assert( + workflowEntrypointClassNames, + `WorkflowEntrypoint class names not found for worker: ${workerOptions.name}` ); - } - logUnknownTails( - workerOptions.tails, - userWorkers, - viteDevServer.config.logger.warn - ); - - return { - ...workerOptions, - durableObjects: { - ...workerOptions.durableObjects, - __VITE_RUNNER_OBJECT__: { - className: "__VITE_RUNNER_OBJECT__", - unsafeUniqueKey: kUnsafeEphemeralUniqueKey, - unsafePreventEviction: true, - }, - }, - modules: [ - { - type: "ESModule", - path: path.join(miniflareModulesRoot, WRAPPER_PATH), - contents: wrappers.join("\n"), - }, - { - type: "ESModule", - path: path.join(miniflareModulesRoot, RUNNER_PATH), - contents: fs.readFileSync( - fileURLToPath(new URL(RUNNER_PATH, import.meta.url)) - ), - }, - ], - unsafeUseModuleFallbackService: true, - } satisfies WorkerOptions; - }), - ], - async unsafeModuleFallbackService(request) { - const url = new URL(request.url); - const rawSpecifier = url.searchParams.get("rawSpecifier"); - assert( - rawSpecifier, - `Unexpected error: no specifier in request to module fallback service.` - ); + for (const className of [...workflowEntrypointClassNames].sort()) { + wrappers.push( + `export const ${className} = createWorkflowEntrypointWrapper('${className}');` + ); + } - const match = additionalModuleRE.exec(rawSpecifier); - assert(match, `Unexpected error: no match for module: ${rawSpecifier}.`); - const [full, moduleType, modulePath] = match; - assert( - moduleType, - `Unexpected error: module type not found in reference: ${full}.` - ); - assert( - modulePath, - `Unexpected error: module path not found in reference: ${full}.` - ); + logUnknownTails( + workerOptions.tails, + userWorkers, + viteDevServer.config.logger.warn + ); - let contents: Buffer; + return { + ...workerOptions, + durableObjects: { + ...workerOptions.durableObjects, + __VITE_RUNNER_OBJECT__: { + className: "__VITE_RUNNER_OBJECT__", + unsafeUniqueKey: kUnsafeEphemeralUniqueKey, + unsafePreventEviction: true, + }, + }, + modules: [ + { + type: "ESModule", + path: path.join(miniflareModulesRoot, WRAPPER_PATH), + contents: wrappers.join("\n"), + }, + { + type: "ESModule", + path: path.join(miniflareModulesRoot, RUNNER_PATH), + contents: fs.readFileSync( + fileURLToPath(new URL(RUNNER_PATH, import.meta.url)) + ), + }, + ], + unsafeUseModuleFallbackService: true, + } satisfies WorkerOptions; + }), + ], + async unsafeModuleFallbackService(request) { + const url = new URL(request.url); + const rawSpecifier = url.searchParams.get("rawSpecifier"); + assert( + rawSpecifier, + `Unexpected error: no specifier in request to module fallback service.` + ); - try { - contents = await fsp.readFile(modulePath); - } catch (error) { - throw new Error( - `Import "${modulePath}" not found. Does the file exist?` + const match = additionalModuleRE.exec(rawSpecifier); + assert( + match, + `Unexpected error: no match for module: ${rawSpecifier}.` + ); + const [full, moduleType, modulePath] = match; + assert( + moduleType, + `Unexpected error: module type not found in reference: ${full}.` + ); + assert( + modulePath, + `Unexpected error: module path not found in reference: ${full}.` ); - } - switch (moduleType) { - case "CompiledWasm": { - return MiniflareResponse.json({ wasm: Array.from(contents) }); - } - case "Data": { - return MiniflareResponse.json({ data: Array.from(contents) }); - } - case "Text": { - return MiniflareResponse.json({ text: contents.toString() }); + let contents: Buffer; + + try { + contents = await fsp.readFile(modulePath); + } catch (error) { + throw new Error( + `Import "${modulePath}" not found. Does the file exist?` + ); } - default: { - return MiniflareResponse.error(); + + switch (moduleType) { + case "CompiledWasm": { + return MiniflareResponse.json({ wasm: Array.from(contents) }); + } + case "Data": { + return MiniflareResponse.json({ data: Array.from(contents) }); + } + case "Text": { + return MiniflareResponse.json({ text: contents.toString() }); + } + default: { + return MiniflareResponse.error(); + } } - } + }, }, + allContainerOptions, }; } @@ -709,15 +745,21 @@ export async function getPreviewMiniflareOptions(config: { resolvedPluginConfig: PreviewResolvedConfig; vitePreviewServer: vite.PreviewServer; inspectorPort: number | false; - containerBuildId?: string; -}): Promise { - const { - resolvedPluginConfig, - vitePreviewServer, - inspectorPort, - containerBuildId, - } = config; +}): Promise<{ + config: Extract; + allContainerOptions: Map< + string, + NonNullable>[number] + >; +}> { + const { resolvedPluginConfig, vitePreviewServer, inspectorPort } = config; const resolvedViteConfig = vitePreviewServer.config; + + let allContainerOptions = new Map< + string, + NonNullable>[number] + >(); + const workers: Array = ( await Promise.all( resolvedPluginConfig.workers.map(async (workerConfig, i) => { @@ -746,6 +788,25 @@ export async function getPreviewMiniflareOptions(config: { ); } + let containerBuildId: string | undefined; + if ( + workerConfig.containers?.length && + workerConfig.dev.enable_containers + ) { + const dockerPath = getDockerPath(); + workerConfig.dev.container_engine = resolveDockerHost(dockerPath); + containerBuildId = generateContainerBuildId(); + + const options = await getContainerOptions({ + containersConfig: workerConfig.containers, + containerBuildId, + configPath: workerConfig.configPath, + }); + for (const option of options ?? []) { + allContainerOptions.set(option.image_tag, option); + } + } + const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions( workerConfig, undefined, @@ -791,23 +852,26 @@ export async function getPreviewMiniflareOptions(config: { const logger = new ViteMiniflareLogger(resolvedViteConfig); return { - log: logger, - inspectorPort: inspectorPort === false ? undefined : inspectorPort, - unsafeInspectorProxy: inspectorPort !== false, - unsafeDevRegistryPath: getDefaultDevRegistryPath(), - unsafeTriggerHandlers: true, - handleRuntimeStdio(stdout, stderr) { - const decoder = new TextDecoder(); - stdout.forEach((data) => logger.info(decoder.decode(data))); - stderr.forEach((error) => - logger.logWithLevel(LogLevel.ERROR, decoder.decode(error)) - ); + config: { + log: logger, + inspectorPort: inspectorPort === false ? undefined : inspectorPort, + unsafeInspectorProxy: inspectorPort !== false, + unsafeDevRegistryPath: getDefaultDevRegistryPath(), + unsafeTriggerHandlers: true, + handleRuntimeStdio(stdout, stderr) { + const decoder = new TextDecoder(); + stdout.forEach((data) => logger.info(decoder.decode(data))); + stderr.forEach((error) => + logger.logWithLevel(LogLevel.ERROR, decoder.decode(error)) + ); + }, + defaultPersistRoot: getPersistenceRoot( + resolvedViteConfig.root, + resolvedPluginConfig.persistState + ), + workers, }, - defaultPersistRoot: getPersistenceRoot( - resolvedViteConfig.root, - resolvedPluginConfig.persistState - ), - workers, + allContainerOptions, }; } From 5531c04f6ec9d9964c7090d46d69ffd12c63c7d8 Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Tue, 30 Sep 2025 17:16:04 +0100 Subject: [PATCH 2/4] Address typechecking --- .../playground/containers/vite.config.ts | 1 - packages/vite-plugin-cloudflare/src/containers.ts | 2 -- packages/vite-plugin-cloudflare/src/index.ts | 8 ++------ packages/vite-plugin-cloudflare/src/miniflare-options.ts | 2 -- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts b/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts index faab3d5303eb..881e2c40c538 100644 --- a/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts +++ b/packages/vite-plugin-cloudflare/playground/containers/vite.config.ts @@ -4,7 +4,6 @@ import { defineConfig } from "vite"; export default defineConfig({ plugins: [ cloudflare({ - inspectorPort: false, persistState: false, configPath: "entry.wrangler.jsonc", auxiliaryWorkers: [{ configPath: "wrangler.jsonc" }], diff --git a/packages/vite-plugin-cloudflare/src/containers.ts b/packages/vite-plugin-cloudflare/src/containers.ts index 7fe4d8cd6026..06198ce5868e 100644 --- a/packages/vite-plugin-cloudflare/src/containers.ts +++ b/packages/vite-plugin-cloudflare/src/containers.ts @@ -1,6 +1,4 @@ -import assert from "node:assert"; import path from "node:path"; -import { prepareContainerImagesForDev } from "@cloudflare/containers-shared/src/images"; import { getDevContainerImageName } from "@cloudflare/containers-shared/src/knobs"; import { isDockerfile } from "@cloudflare/containers-shared/src/utils"; import type { WorkerConfig } from "./plugin-config"; diff --git a/packages/vite-plugin-cloudflare/src/index.ts b/packages/vite-plugin-cloudflare/src/index.ts index c30436c6287f..b704061e3019 100644 --- a/packages/vite-plugin-cloudflare/src/index.ts +++ b/packages/vite-plugin-cloudflare/src/index.ts @@ -1,11 +1,7 @@ import assert from "node:assert"; import * as util from "node:util"; import { prepareContainerImagesForDev } from "@cloudflare/containers-shared"; -import { - cleanupContainers, - generateContainerBuildId, - resolveDockerHost, -} from "@cloudflare/containers-shared/src/utils"; +import { cleanupContainers } from "@cloudflare/containers-shared/src/utils"; import { generateStaticRoutingRuleMatcher } from "@cloudflare/workers-shared/asset-worker/src/utils/rules-engine"; import { CoreHeaders, Miniflare } from "miniflare"; import colors from "picocolors"; @@ -22,7 +18,7 @@ import { kRequestType, ROUTER_WORKER_NAME, } from "./constants"; -import { getDockerPath, prepareContainerImages } from "./containers"; +import { getDockerPath } from "./containers"; import { addDebugToVitePrintUrls, DEBUG_PATH, diff --git a/packages/vite-plugin-cloudflare/src/miniflare-options.ts b/packages/vite-plugin-cloudflare/src/miniflare-options.ts index cb85cdce7af2..f744e49c52ad 100644 --- a/packages/vite-plugin-cloudflare/src/miniflare-options.ts +++ b/packages/vite-plugin-cloudflare/src/miniflare-options.ts @@ -565,7 +565,6 @@ export async function getDevMiniflareOptions(config: { log: logger, logRequests: false, inspectorPort: inspectorPort === false ? undefined : inspectorPort, - unsafeInspectorProxy: inspectorPort !== false, unsafeDevRegistryPath: getDefaultDevRegistryPath(), unsafeTriggerHandlers: true, handleRuntimeStdio(stdout, stderr) { @@ -855,7 +854,6 @@ export async function getPreviewMiniflareOptions(config: { config: { log: logger, inspectorPort: inspectorPort === false ? undefined : inspectorPort, - unsafeInspectorProxy: inspectorPort !== false, unsafeDevRegistryPath: getDefaultDevRegistryPath(), unsafeTriggerHandlers: true, handleRuntimeStdio(stdout, stderr) { From a8f658df7df29f3735733de1504744306948cb4e Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Tue, 30 Sep 2025 17:17:15 +0100 Subject: [PATCH 3/4] add changeset --- .changeset/neat-eyes-roll.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-eyes-roll.md diff --git a/.changeset/neat-eyes-roll.md b/.changeset/neat-eyes-roll.md new file mode 100644 index 000000000000..6379535da769 --- /dev/null +++ b/.changeset/neat-eyes-roll.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/vite-plugin": patch +--- + +Support containers defined for Vite auxiliary Workers From c3b9ecd921b50587a398383f89cefb4b56793ba8 Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Tue, 30 Sep 2025 17:21:01 +0100 Subject: [PATCH 4/4] typo --- .../playground/containers/entry.wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc b/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc index 731ea7166ffc..f288369062ac 100644 --- a/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc +++ b/packages/vite-plugin-cloudflare/playground/containers/entry.wrangler.jsonc @@ -1,5 +1,5 @@ { - "name": "entryp", + "name": "entry", "main": "./src/entry.ts", "compatibility_date": "2025-04-03", "services": [