@cloudflare/vite-plugin 2.0.0-beta.v.0 → 2.0.0-beta.v.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -50144,7 +50144,7 @@ function mapWorkerMetadataBindings(bindings) {
50144
50144
  }, {});
50145
50145
  }
50146
50146
  __name$3(mapWorkerMetadataBindings, "mapWorkerMetadataBindings");
50147
- var DEFAULT_COMPAT_DATE = "2026-10-12";
50147
+ var DEFAULT_COMPAT_DATE = "2026-10-19";
50148
50148
  function constructWranglerConfig(config$3) {
50149
50149
  const mappedBindings = mapWorkerMetadataBindings(config$3.bindings);
50150
50150
  const durableObjectClassNames = config$3.bindings.filter((binding) => binding.type === "durable_object_namespace" && binding.script_name === config$3.name).map((durableObject) => durableObject.class_name);
@@ -52249,50 +52249,6 @@ The local dev server started at ${origin.href}
52249
52249
  return new Error(errorMessage);
52250
52250
  }
52251
52251
  __name$3(createTunnelStartupError, "createTunnelStartupError");
52252
- var WRANGLER_COMMANDS = {
52253
- deploy: "wrangler deploy",
52254
- preview: "wrangler preview",
52255
- versionsUpload: "wrangler versions upload",
52256
- versionsDeploy: "wrangler versions deploy",
52257
- versionsDeployAt: /* @__PURE__ */ __name$3((n2) => `wrangler versions deploy <new-version-id>@${n2}%`, "versionsDeployAt"),
52258
- triggersDeploy: "wrangler triggers deploy",
52259
- d1List: "wrangler d1 list",
52260
- d1Delete: "wrangler d1 delete",
52261
- queuesCreate: "wrangler queues create",
52262
- secretPut: "wrangler secret put",
52263
- versionsSecretPut: "wrangler versions secret put",
52264
- containerRegistryConfigure: "wrangler containers registries configure"
52265
- };
52266
- var WRANGLER_CONFIG_FIELDS = {
52267
- workersDev: "workers_dev",
52268
- containerObservabilityTargetPercentage: "target_instance_percentage",
52269
- containerObservabilityTargetCount: "target_instance_count"
52270
- };
52271
- var WRANGLER_CLI_PRESENTATION = {
52272
- cliName: "wrangler",
52273
- displayName: "Wrangler",
52274
- displayConfigFileName: "Wrangler config file",
52275
- configFieldAssignmentSeparator: " = ",
52276
- commands: WRANGLER_COMMANDS,
52277
- configFields: WRANGLER_CONFIG_FIELDS
52278
- };
52279
- function resolveCliPresentation(overrides) {
52280
- return {
52281
- cliName: overrides?.cliName ?? WRANGLER_CLI_PRESENTATION.cliName,
52282
- displayName: overrides?.displayName ?? WRANGLER_CLI_PRESENTATION.displayName,
52283
- displayConfigFileName: overrides?.displayConfigFileName ?? WRANGLER_CLI_PRESENTATION.displayConfigFileName,
52284
- configFieldAssignmentSeparator: overrides?.configFieldAssignmentSeparator ?? WRANGLER_CLI_PRESENTATION.configFieldAssignmentSeparator,
52285
- commands: {
52286
- ...WRANGLER_COMMANDS,
52287
- ...overrides?.commands
52288
- },
52289
- configFields: {
52290
- ...WRANGLER_CONFIG_FIELDS,
52291
- ...overrides?.configFields
52292
- }
52293
- };
52294
- }
52295
- __name$3(resolveCliPresentation, "resolveCliPresentation");
52296
52252
  var UPDATE_CHECK_TIMEOUT_MS = 3e3;
52297
52253
  var CACHE_TTL_MS = 3600 * 1e3;
52298
52254
  var NPM_REGISTRY_URL = "https://registry.npmjs.org/";
@@ -75691,9 +75647,7 @@ var fetchResult$1 = /* @__PURE__ */ __name$2(() => {
75691
75647
  var fetchPagedListResult = /* @__PURE__ */ __name$2(() => {
75692
75648
  throw new Error("initContainersSharedContext() must be called first");
75693
75649
  }, "fetchPagedListResult");
75694
- var cliPresentation = resolveCliPresentation();
75695
75650
  function initContainersSharedContext(ctx) {
75696
- cliPresentation = resolveCliPresentation(ctx.cliPresentation);
75697
75651
  logger$1 = ctx.logger;
75698
75652
  fetchResult$1 = ctx.fetchResult;
75699
75653
  if (ctx.fetchPagedListResult !== void 0) fetchPagedListResult = ctx.fetchPagedListResult;
@@ -75950,7 +75904,7 @@ async function pullEgressInterceptorImage(dockerPath) {
75950
75904
  await runDockerCmd(dockerPath, args);
75951
75905
  }
75952
75906
  __name$2(pullEgressInterceptorImage, "pullEgressInterceptorImage");
75953
- async function pullImage(dockerPath, options, logger2, complianceConfig) {
75907
+ async function pullImage(dockerPath, options, logger2, complianceConfig, registryConfigureCommand) {
75954
75908
  const domain$1 = new URL(`http://${options.image_uri}`).hostname;
75955
75909
  const isExternalRegistry = domain$1 !== getCloudflareContainerRegistry(complianceConfig);
75956
75910
  try {
@@ -75958,7 +75912,7 @@ async function pullImage(dockerPath, options, logger2, complianceConfig) {
75958
75912
  } catch (e) {
75959
75913
  if (!isExternalRegistry) throw e;
75960
75914
  logger2?.warn(`Unable to retrieve configured registry credentials from Cloudflare.
75961
- Unless this is a public image, you will need to run \`${cliPresentation.commands.containerRegistryConfigure}\` before deploying.
75915
+ Unless this is a public image, you will need to run \`${registryConfigureCommand}\` before deploying.
75962
75916
  Attempting to pull image anyway...`);
75963
75917
  }
75964
75918
  const pull = runDockerCmd(dockerPath, [
@@ -75991,7 +75945,7 @@ async function prepareContainerImagesForDev(args) {
75991
75945
  dockerPath,
75992
75946
  operation: "running dev",
75993
75947
  imageNoun: containerOptions.length !== 1 ? "the configured images" : "the configured image",
75994
- hint: `To suppress this error if you do not intend on triggering any container instances, set dev.enable_containers to false in your ${cliPresentation.displayConfigFileName} or pass --enable-containers=false.`
75948
+ hint: `To suppress this error if you do not intend on triggering any container instances, set dev.enable_containers to false in your ${args.configFileName} or pass --enable-containers=false.`
75995
75949
  });
75996
75950
  for (const options of containerOptions) {
75997
75951
  if ("dockerfile" in options) {
@@ -76016,7 +75970,7 @@ async function prepareContainerImagesForDev(args) {
76016
75970
  await build.ready;
76017
75971
  onContainerImagePreparationEnd({ containerOptions: options });
76018
75972
  } else {
76019
- const pull = await pullImage(dockerPath, options, args.logger, args.complianceConfig);
75973
+ const pull = await pullImage(dockerPath, options, args.logger, args.complianceConfig, args.registryConfigureCommand);
76020
75974
  onContainerImagePreparationStart({
76021
75975
  containerOptions: options,
76022
75976
  abort: /* @__PURE__ */ __name$2(() => {
@@ -77134,7 +77088,7 @@ function createDurableObjectNamespaceResolver(config$3, { versionId, accountId,
77134
77088
  };
77135
77089
  }
77136
77090
  __name$2(createDurableObjectNamespaceResolver, "createDurableObjectNamespaceResolver");
77137
- async function deployContainers(config$3, containerDeployments, { versionId, accountId, scriptName, dispatchNamespace }) {
77091
+ async function deployContainers(config$3, containerDeployments, { versionId, accountId, scriptName, dispatchNamespace, configFileName: configFileName$1, observabilityTargetPercentageField, observabilityTargetCountField }) {
77138
77092
  const resolveNamespaceId = createDurableObjectNamespaceResolver(config$3, {
77139
77093
  versionId,
77140
77094
  accountId,
@@ -77143,7 +77097,10 @@ async function deployContainers(config$3, containerDeployments, { versionId, acc
77143
77097
  });
77144
77098
  for (const { container, imageRef } of containerDeployments) await apply({
77145
77099
  imageRef,
77146
- durable_object_namespace_id: await resolveNamespaceId(container.class_name)
77100
+ durable_object_namespace_id: await resolveNamespaceId(container.class_name),
77101
+ configFileName: configFileName$1,
77102
+ observabilityTargetPercentageField,
77103
+ observabilityTargetCountField
77147
77104
  }, container, config$3, accountId);
77148
77105
  }
77149
77106
  __name$2(deployContainers, "deployContainers");
@@ -77287,10 +77244,10 @@ function buildApplicationObservabilityPatch(observability, writeTarget, prevApp)
77287
77244
  return nextTopLevelObservability !== void 0 ? { observability: nextTopLevelObservability } : {};
77288
77245
  }
77289
77246
  __name$2(buildApplicationObservabilityPatch, "buildApplicationObservabilityPatch");
77290
- function assertCanUseApplicationObservabilityTargeting(prevApp, containerConfig) {
77247
+ function assertCanUseApplicationObservabilityTargeting(prevApp, containerConfig, options) {
77291
77248
  if (!hasTopLevelOnlyObservabilityFields(containerConfig.observability)) return;
77292
77249
  if (!hasLegacyRolloutObservabilityEnabled(prevApp)) return;
77293
- throw new UserError(`Application-level observability targeting cannot be enabled for container ${containerConfig.name} while it still uses legacy rollout-based observability. Set containers[].observability.enabled = false in your ${cliPresentation.displayConfigFileName} and deploy once, then deploy again with ${cliPresentation.configFields.containerObservabilityTargetPercentage} or ${cliPresentation.configFields.containerObservabilityTargetCount}.`, { telemetryMessage: "containers deploy observability migration blocked" });
77250
+ throw new UserError(`Application-level observability targeting cannot be enabled for container ${containerConfig.name} while it still uses legacy rollout-based observability. Set containers[].observability.enabled = false in your ${options.configFileName} and deploy once, then deploy again with ${options.observabilityTargetPercentageField} or ${options.observabilityTargetCountField}.`, { telemetryMessage: "containers deploy observability migration blocked" });
77294
77251
  }
77295
77252
  __name$2(assertCanUseApplicationObservabilityTargeting, "assertCanUseApplicationObservabilityTargeting");
77296
77253
  function hasRolloutDiff(prevApp, nextApp) {
@@ -77363,7 +77320,7 @@ async function apply(args, containerConfig, config$3, accountId) {
77363
77320
  }
77364
77321
  }
77365
77322
  const observabilityWriteTarget = selectObservabilityWriteTarget(prevApp);
77366
- if (prevApp !== void 0) assertCanUseApplicationObservabilityTargeting(prevApp, containerConfig);
77323
+ if (prevApp !== void 0) assertCanUseApplicationObservabilityTargeting(prevApp, containerConfig, args);
77367
77324
  const appConfig = stripUndefined(mergeIfUnsafe(config$3, containerConfigToCreateRequest(accountId, containerConfig, imageRef, args.durable_object_namespace_id, config$3, observabilityWriteTarget, prevApp), containerConfig.name));
77368
77325
  if (prevApp !== void 0 && prevApp !== null) {
77369
77326
  const normalisedPrevApp = sortObjectRecursive(stripUndefined(cleanApplicationFromAPI(prevApp, containerConfig, accountId, observabilityWriteTarget, config$3)));
@@ -77726,7 +77683,7 @@ __toESM(require_sender());
77726
77683
  __toESM(require_subprotocol());
77727
77684
  var import_websocket = __toESM(require_websocket());
77728
77685
  __toESM(require_websocket_server());
77729
- async function sshCommand(sshArgs) {
77686
+ async function sshCommand(sshArgs, userAgent) {
77730
77687
  const useStdio = shouldUseStdio(sshArgs);
77731
77688
  let sshResponse;
77732
77689
  try {
@@ -77743,7 +77700,7 @@ async function sshCommand(sshArgs) {
77743
77700
  }
77744
77701
  const ws = new import_websocket.default(sshResponse.url, { headers: {
77745
77702
  authorization: `Bearer ${sshResponse.token}`,
77746
- "user-agent": cliPresentation.cliName
77703
+ "user-agent": userAgent
77747
77704
  } });
77748
77705
  ws.binaryType = "arraybuffer";
77749
77706
  if (useStdio) {
@@ -87604,7 +87561,9 @@ async function prepareContainerImagesForVite(options) {
87604
87561
  onContainerImagePreparationStart: () => {},
87605
87562
  onContainerImagePreparationEnd: () => {},
87606
87563
  logger: options.logger,
87607
- complianceConfig
87564
+ complianceConfig,
87565
+ configFileName: "cloudflare.config.ts",
87566
+ registryConfigureCommand: options.cliDisplayName === "cf" ? "cf containers registries create" : "wrangler containers registries configure"
87608
87567
  });
87609
87568
  }
87610
87569
 
@@ -88427,7 +88386,7 @@ __name(createWorkerUploadForm, "createWorkerUploadForm");
88427
88386
  //#endregion
88428
88387
  //#region ../remote-bindings/dist/index.mjs
88429
88388
  var import_undici = require_undici();
88430
- var version$1 = "0.0.48";
88389
+ var version$1 = "0.0.50";
88431
88390
  var NoDefaultValueProvided = class extends UserError {
88432
88391
  constructor() {
88433
88392
  super("This command cannot be run in a non-interactive context", { telemetryMessage: "remote bindings prompt default missing" });
@@ -88482,7 +88441,7 @@ let logger;
88482
88441
  function initLogger(value) {
88483
88442
  logger = value;
88484
88443
  }
88485
- var ProxyWorker_default = "// src/startDevWorker/utils.ts\nimport assert from \"node:assert\";\nvar PREVIEW_TOKEN_REFRESH_INTERVAL = 50 * 60 * 1e3;\nfunction createDeferred(previousDeferred) {\n let resolve, reject;\n const newPromise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n assert(resolve);\n assert(reject);\n previousDeferred?.resolve(newPromise);\n return {\n promise: newPromise,\n resolve,\n reject\n };\n}\nfunction urlFromParts(parts, base = \"http://localhost\") {\n const url = new URL(base);\n Object.assign(url, parts);\n return url;\n}\nfunction rewriteUrlInHeaderValue(value, from, to) {\n return value.replace(\n /(https?:\\/\\/[^/?#\\s,;\"']+)([^\\s,;\"']*)/gi,\n (match, origin, rest) => {\n let url;\n try {\n url = new URL(origin);\n } catch {\n return match;\n }\n if (url.host !== from.host) {\n return match;\n }\n return to.origin + rest;\n }\n );\n}\n\n// templates/startDevWorker/ProxyWorker.ts\nvar ProxyWorker_default = {\n fetch(req, env) {\n const singleton = env.DURABLE_OBJECT.idFromName(\"\");\n const inspectorProxy = env.DURABLE_OBJECT.get(singleton);\n return inspectorProxy.fetch(req);\n }\n};\nvar ProxyWorker = class {\n constructor(_state, env) {\n this.env = env;\n }\n env;\n proxyData;\n requestQueue = /* @__PURE__ */ new Map();\n requestRetryQueue = /* @__PURE__ */ new Map();\n fetch(request) {\n if (isRequestFromProxyController(request, this.env)) {\n return this.processProxyControllerRequest(request);\n }\n const deferred = createDeferred();\n this.requestQueue.set(request, deferred);\n this.processQueue();\n return deferred.promise;\n }\n processProxyControllerRequest(request) {\n const event = request.cf?.hostMetadata;\n switch (event?.type) {\n case \"pause\":\n this.proxyData = void 0;\n break;\n case \"play\":\n this.proxyData = event.proxyData;\n this.processQueue();\n break;\n }\n return new Response(null, { status: 204 });\n }\n /**\n * Process requests that are being retried first, then process newer requests.\n * Requests that are being retried are, by definition, older than requests which haven't been processed yet.\n * We don't need to be more accurate than this re ordering, since the requests are being fired off synchronously.\n */\n *getOrderedQueue() {\n yield* this.requestRetryQueue;\n yield* this.requestQueue;\n }\n processQueue() {\n const { proxyData } = this;\n if (proxyData === void 0) {\n return;\n }\n for (const [request, deferredResponse] of this.getOrderedQueue()) {\n this.requestRetryQueue.delete(request);\n this.requestQueue.delete(request);\n const outerUrl = new URL(request.url);\n const headers = new Headers(request.headers);\n const userWorkerUrl = new URL(request.url);\n Object.assign(userWorkerUrl, proxyData.userWorkerUrl);\n const innerUrl = urlFromParts(\n proxyData.userWorkerInnerUrlOverrides ?? {},\n request.url\n );\n const encoding = request.cf?.clientAcceptEncoding;\n if (encoding !== void 0) {\n headers.set(\"Accept-Encoding\", encoding);\n }\n rewriteUrlRelatedHeaders(headers, outerUrl, innerUrl);\n headers.set(\"MF-Original-URL\", innerUrl.href);\n for (const [key, value] of Object.entries(proxyData.headers ?? {})) {\n if (value === void 0) {\n continue;\n }\n if (key.toLowerCase() === \"cookie\") {\n const existing = request.headers.get(\"cookie\") ?? \"\";\n headers.set(\"cookie\", `${existing};${value}`);\n } else {\n headers.set(key, value);\n }\n }\n void fetch(userWorkerUrl, new Request(request, { headers })).then(async (res) => {\n res = new Response(res.body, res);\n rewriteUrlRelatedHeaders(res.headers, innerUrl, outerUrl);\n await checkForPreviewTokenError(res, this.env, proxyData);\n deferredResponse.resolve(res);\n }).catch((error) => {\n const newUserWorkerUrl = this.proxyData && urlFromParts(this.proxyData.userWorkerUrl);\n if (userWorkerUrl.href === newUserWorkerUrl?.href) {\n void sendMessageToProxyController(this.env, {\n type: \"error\",\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause: error.cause\n }\n });\n deferredResponse.reject(error);\n } else if (request.method === \"GET\" || request.method === \"HEAD\") {\n this.requestRetryQueue.set(request, deferredResponse);\n } else {\n deferredResponse.resolve(\n new Response(\n \"Your worker restarted mid-request. Please try sending the request again. Only GET or HEAD requests are retried automatically.\",\n {\n status: 503,\n headers: { \"Retry-After\": \"0\" }\n }\n )\n );\n }\n });\n }\n }\n};\nfunction isRequestFromProxyController(req, env) {\n return req.headers.get(\"Authorization\") === env.PROXY_CONTROLLER_AUTH_SECRET;\n}\nfunction sendMessageToProxyController(env, message) {\n return env.PROXY_CONTROLLER.fetch(\"http://dummy\", {\n method: \"POST\",\n body: JSON.stringify(message)\n });\n}\nasync function checkForPreviewTokenError(response, env, proxyData) {\n if (response.status !== 400) {\n return;\n }\n const clone = response.clone();\n const text = await clone.text();\n if (text.includes(\"Invalid Workers Preview configuration\") || text.includes(\"error code: 1031\")) {\n void sendMessageToProxyController(env, {\n type: \"previewTokenExpired\",\n proxyData\n });\n }\n}\nfunction rewriteUrlRelatedHeaders(headers, from, to) {\n const setCookie = headers.getAll(\"Set-Cookie\");\n headers.delete(\"Set-Cookie\");\n headers.forEach((value, key) => {\n if (typeof value === \"string\" && value.includes(from.host)) {\n headers.set(key, rewriteUrlInHeaderValue(value, from, to));\n }\n });\n for (const cookie of setCookie) {\n headers.append(\n \"Set-Cookie\",\n cookie.replace(\n new RegExp(`Domain=${from.hostname}($|;|,)`),\n `Domain=${to.hostname}$1`\n )\n );\n }\n}\nexport {\n ProxyWorker,\n ProxyWorker_default as default\n};\n";
88444
+ var ProxyWorker_default = "// src/startDevWorker/utils.ts\nimport assert from \"node:assert\";\nvar PREVIEW_TOKEN_REFRESH_INTERVAL = 50 * 60 * 1e3;\nvar PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL = 60 * 1e3;\nfunction createDeferred(previousDeferred) {\n let resolve, reject;\n const newPromise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n assert(resolve);\n assert(reject);\n previousDeferred?.resolve(newPromise);\n return {\n promise: newPromise,\n resolve,\n reject\n };\n}\nfunction urlFromParts(parts, base = \"http://localhost\") {\n const url = new URL(base);\n Object.assign(url, parts);\n return url;\n}\nfunction rewriteUrlInHeaderValue(value, from, to) {\n return value.replace(\n /(https?:\\/\\/[^/?#\\s,;\"']+)([^\\s,;\"']*)/gi,\n (match, origin, rest) => {\n let url;\n try {\n url = new URL(origin);\n } catch {\n return match;\n }\n if (url.host !== from.host) {\n return match;\n }\n return to.origin + rest;\n }\n );\n}\n\n// templates/startDevWorker/ProxyWorker.ts\nvar ProxyWorker_default = {\n fetch(req, env) {\n const singleton = env.DURABLE_OBJECT.idFromName(\"\");\n const inspectorProxy = env.DURABLE_OBJECT.get(singleton);\n return inspectorProxy.fetch(req);\n }\n};\nvar ProxyWorker = class {\n constructor(_state, env) {\n this.env = env;\n }\n env;\n proxyData;\n requestQueue = /* @__PURE__ */ new Map();\n requestRetryQueue = /* @__PURE__ */ new Map();\n fetch(request) {\n if (isRequestFromProxyController(request, this.env)) {\n return this.processProxyControllerRequest(request);\n }\n const deferred = createDeferred();\n this.requestQueue.set(request, deferred);\n this.processQueue();\n return deferred.promise;\n }\n processProxyControllerRequest(request) {\n const event = request.cf?.hostMetadata;\n switch (event?.type) {\n case \"pause\":\n this.proxyData = void 0;\n break;\n case \"play\":\n this.proxyData = event.proxyData;\n this.processQueue();\n break;\n }\n return new Response(null, { status: 204 });\n }\n /**\n * Process requests that are being retried first, then process newer requests.\n * Requests that are being retried are, by definition, older than requests which haven't been processed yet.\n * We don't need to be more accurate than this re ordering, since the requests are being fired off synchronously.\n */\n *getOrderedQueue() {\n yield* this.requestRetryQueue;\n yield* this.requestQueue;\n }\n processQueue() {\n const { proxyData } = this;\n if (proxyData === void 0) {\n return;\n }\n for (const [request, deferredResponse] of this.getOrderedQueue()) {\n this.requestRetryQueue.delete(request);\n this.requestQueue.delete(request);\n const outerUrl = new URL(request.url);\n const headers = new Headers(request.headers);\n const userWorkerUrl = new URL(request.url);\n Object.assign(userWorkerUrl, proxyData.userWorkerUrl);\n const innerUrl = urlFromParts(\n proxyData.userWorkerInnerUrlOverrides ?? {},\n request.url\n );\n const encoding = request.cf?.clientAcceptEncoding;\n if (encoding !== void 0) {\n headers.set(\"Accept-Encoding\", encoding);\n }\n rewriteUrlRelatedHeaders(headers, outerUrl, innerUrl);\n headers.set(\"MF-Original-URL\", innerUrl.href);\n for (const [key, value] of Object.entries(proxyData.headers ?? {})) {\n if (value === void 0) {\n continue;\n }\n if (key.toLowerCase() === \"cookie\") {\n const existing = request.headers.get(\"cookie\") ?? \"\";\n headers.set(\"cookie\", `${existing};${value}`);\n } else {\n headers.set(key, value);\n }\n }\n void fetch(userWorkerUrl, new Request(request, { headers })).then(async (res) => {\n res = new Response(res.body, res);\n rewriteUrlRelatedHeaders(res.headers, innerUrl, outerUrl);\n await checkForPreviewTokenError(res, this.env, proxyData);\n deferredResponse.resolve(res);\n }).catch((error) => {\n const newUserWorkerUrl = this.proxyData && urlFromParts(this.proxyData.userWorkerUrl);\n if (userWorkerUrl.href === newUserWorkerUrl?.href) {\n void sendMessageToProxyController(this.env, {\n type: \"error\",\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause: error.cause\n }\n });\n deferredResponse.reject(error);\n } else if (request.method === \"GET\" || request.method === \"HEAD\") {\n this.requestRetryQueue.set(request, deferredResponse);\n } else {\n deferredResponse.resolve(\n new Response(\n \"Your worker restarted mid-request. Please try sending the request again. Only GET or HEAD requests are retried automatically.\",\n {\n status: 503,\n headers: { \"Retry-After\": \"0\" }\n }\n )\n );\n }\n });\n }\n }\n};\nfunction isRequestFromProxyController(req, env) {\n return req.headers.get(\"Authorization\") === env.PROXY_CONTROLLER_AUTH_SECRET;\n}\nfunction sendMessageToProxyController(env, message) {\n return env.PROXY_CONTROLLER.fetch(\"http://dummy\", {\n method: \"POST\",\n body: JSON.stringify(message)\n });\n}\nasync function checkForPreviewTokenError(response, env, proxyData) {\n if (response.status !== 400) {\n return;\n }\n const clone = response.clone();\n const text = await clone.text();\n if (text.includes(\"Invalid Workers Preview configuration\") || text.includes(\"error code: 1031\")) {\n void sendMessageToProxyController(env, {\n type: \"previewTokenExpired\",\n proxyData\n });\n }\n}\nfunction rewriteUrlRelatedHeaders(headers, from, to) {\n const setCookie = headers.getAll(\"Set-Cookie\");\n headers.delete(\"Set-Cookie\");\n headers.forEach((value, key) => {\n if (typeof value === \"string\" && value.includes(from.host)) {\n headers.set(key, rewriteUrlInHeaderValue(value, from, to));\n }\n });\n for (const cookie of setCookie) {\n headers.append(\n \"Set-Cookie\",\n cookie.replace(\n new RegExp(`Domain=${from.hostname}($|;|,)`),\n `Domain=${to.hostname}$1`\n )\n );\n }\n}\nexport {\n ProxyWorker,\n ProxyWorker_default as default\n};\n";
88486
88445
  function castLogLevel(level) {
88487
88446
  let key = level.toUpperCase();
88488
88447
  if (key === "LOG") key = "INFO";
@@ -88515,6 +88474,15 @@ function castErrorCause(cause) {
88515
88474
  * Preview tokens expire after 1 hour (hardcoded in the Workers control plane), so we retry after 50 mins.
88516
88475
  */
88517
88476
  const PREVIEW_TOKEN_REFRESH_INTERVAL = 3e3 * 1e3;
88477
+ /**
88478
+ * How soon to try again after a proactive preview token refresh fails (e.g.
88479
+ * the machine is offline). A failed refresh must not give up the retry cycle
88480
+ * for good — otherwise a network outage longer than the API's own few quick
88481
+ * retries (see `retryOnAPIFailure`) permanently strands the session even
88482
+ * after connectivity returns, since nothing else re-triggers a refresh
88483
+ * attempt for a long-lived session like `getPlatformProxy()`'s.
88484
+ */
88485
+ const PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL = 60 * 1e3;
88518
88486
  function createDeferred(previousDeferred) {
88519
88487
  let resolve$3, reject;
88520
88488
  const newPromise = new Promise((_resolve$1, _reject) => {
@@ -88930,6 +88898,7 @@ var RemoteRuntimeController = class {
88930
88898
  #latestBundle;
88931
88899
  #latestProxyData;
88932
88900
  #refreshTimer;
88901
+ #sessionCreatedAt;
88933
88902
  #tearingDown = false;
88934
88903
  constructor(onError$1, onReloadComplete) {
88935
88904
  this.onError = onError$1;
@@ -88937,7 +88906,9 @@ var RemoteRuntimeController = class {
88937
88906
  }
88938
88907
  async #previewSession(props) {
88939
88908
  try {
88940
- return await retryOnAPIFailure(() => createPreviewSession(props.complianceConfig, props, this.#abortController.signal, props.name, props.cliDisplayName), logger, void 0, void 0, this.#abortController.signal);
88909
+ const session = await retryOnAPIFailure(() => createPreviewSession(props.complianceConfig, props, this.#abortController.signal, props.name, props.cliDisplayName), logger, void 0, void 0, this.#abortController.signal);
88910
+ if (session) this.#sessionCreatedAt = Date.now();
88911
+ return session;
88941
88912
  } catch (err) {
88942
88913
  if (err instanceof Error && err.name == "AbortError") return;
88943
88914
  handlePreviewSessionCreationError(err, props.accountId);
@@ -89042,9 +89013,13 @@ var RemoteRuntimeController = class {
89042
89013
  }
89043
89014
  #scheduleRefresh(interval) {
89044
89015
  clearTimeout(this.#refreshTimer);
89016
+ const delay = interval === PREVIEW_TOKEN_REFRESH_INTERVAL && this.#sessionCreatedAt !== void 0 ? Math.max(0, PREVIEW_TOKEN_REFRESH_INTERVAL - (Date.now() - this.#sessionCreatedAt)) : interval;
89045
89017
  this.#refreshTimer = setTimeout(() => {
89018
+ this.#refreshTimer = void 0;
89046
89019
  if (this.#latestProxyData) this.onPreviewTokenExpired();
89047
- }, interval);
89020
+ else if (!this.#tearingDown) this.#scheduleRefresh(PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL);
89021
+ }, delay);
89022
+ this.#refreshTimer.unref?.();
89048
89023
  }
89049
89024
  async #onBundleComplete({ config: config$3, bundle }, id) {
89050
89025
  if (id !== this.#currentBundleId) return;
@@ -89072,10 +89047,14 @@ var RemoteRuntimeController = class {
89072
89047
  logger.warn("Cannot refresh preview token: missing config or bundle data");
89073
89048
  return;
89074
89049
  }
89050
+ const bundleId = this.#currentBundleId;
89051
+ const abortSignal = this.#abortController.signal;
89052
+ const shouldRetry = () => bundleId === this.#currentBundleId && !abortSignal.aborted && !this.#tearingDown;
89075
89053
  try {
89076
89054
  const auth = await unwrapHook(this.#latestConfig.auth);
89077
89055
  this.#session = await this.#getPreviewSession(this.#latestConfig, auth);
89078
- if (await this.#updatePreviewToken(this.#latestConfig, this.#latestBundle, auth, this.#currentBundleId)) logger.log(source_default.green("✔ Preview token refreshed successfully"));
89056
+ if (await this.#updatePreviewToken(this.#latestConfig, this.#latestBundle, auth, bundleId)) logger.log(source_default.green("✔ Preview token refreshed successfully"));
89057
+ else if (shouldRetry()) this.#scheduleRefresh(PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL);
89079
89058
  } catch (error$3) {
89080
89059
  if (error$3 instanceof Error && error$3.name == "AbortError") return;
89081
89060
  this.emitErrorEvent({
@@ -89085,12 +89064,13 @@ var RemoteRuntimeController = class {
89085
89064
  source: "RemoteRuntimeController",
89086
89065
  data: void 0
89087
89066
  });
89067
+ if (shouldRetry()) this.#scheduleRefresh(PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL);
89088
89068
  }
89089
89069
  }
89090
89070
  onUpdateStart() {
89091
89071
  this.#abortController.abort();
89092
89072
  this.#abortController = new AbortController();
89093
- clearTimeout(this.#refreshTimer);
89073
+ if (!this.#refreshTimer && this.#latestProxyData && !this.#tearingDown) this.#scheduleRefresh(PREVIEW_TOKEN_REFRESH_RETRY_INTERVAL);
89094
89074
  }
89095
89075
  onBundleComplete(ev) {
89096
89076
  const id = ++this.#currentBundleId;
@@ -89695,7 +89675,7 @@ function createRemoteBindingsLogger(logger$2) {
89695
89675
  }
89696
89676
  function getWorkerZone(config$3) {
89697
89677
  const domain$1 = config$3.domains?.[0];
89698
- if (domain$1 !== void 0) return getZoneFromRoute(domain$1);
89678
+ if (domain$1 !== void 0) return getZoneFromRoute(typeof domain$1 === "string" ? domain$1 : domain$1.hostname);
89699
89679
  const fetchTrigger = config$3.triggers?.find((trigger) => trigger.type === "fetch");
89700
89680
  if (fetchTrigger?.type !== "fetch") return;
89701
89681
  return getZoneFromRoute(fetchTrigger.zone?.includes(".") ? {
@@ -90342,7 +90322,8 @@ const devPlugin = createPlugin("dev", (ctx) => {
90342
90322
  dockerPath,
90343
90323
  containerOptions,
90344
90324
  settings: ctx.resolvedPluginConfig.settings,
90345
- logger: viteDevServer.config.logger
90325
+ logger: viteDevServer.config.logger,
90326
+ cliDisplayName: ctx.resolvedPluginConfig.cliDisplayName
90346
90327
  });
90347
90328
  containerCleanup.track(dockerPath, containerOptions.map(({ image_tag }) => image_tag));
90348
90329
  viteDevServer.config.logger.info(import_picocolors$2.default.dim(import_picocolors$2.default.yellow("\n⚡️ Containers successfully built. To rebuild your containers during development, restart the Vite dev server (r + enter).")));
@@ -90488,7 +90469,8 @@ const previewPlugin = createPlugin("preview", (ctx) => {
90488
90469
  dockerPath: getDockerPath(),
90489
90470
  containerOptions,
90490
90471
  settings: ctx.resolvedPluginConfig.settings,
90491
- logger: vitePreviewServer.config.logger
90472
+ logger: vitePreviewServer.config.logger,
90473
+ cliDisplayName: ctx.resolvedPluginConfig.cliDisplayName
90492
90474
  });
90493
90475
  }
90494
90476
  if (vitePreviewServer.httpServer) vitePreviewServer.httpServer.on("listening", () => {
@@ -1,7 +1,7 @@
1
1
  //#region package.json
2
2
  var package_default = {
3
3
  name: "@cloudflare/vite-plugin",
4
- version: "2.0.0-beta.v.0",
4
+ version: "2.0.0-beta.v.2",
5
5
  description: "Cloudflare plugin for Vite",
6
6
  keywords: [
7
7
  "cloudflare",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/vite-plugin",
3
- "version": "2.0.0-beta.v.0",
3
+ "version": "2.0.0-beta.v.2",
4
4
  "description": "Cloudflare plugin for Vite",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -42,14 +42,14 @@
42
42
  "dependencies": {
43
43
  "unenv": "2.0.0-rc.24",
44
44
  "ws": "8.21.0",
45
- "@cloudflare/build-output-utils": "0.9.2",
46
- "@cloudflare/config": "0.26.0",
47
- "@cloudflare/runtime-types": "0.1.11",
48
- "@cloudflare/unenv-preset": "2.16.2",
49
- "miniflare": "5.20261012.0-beta"
45
+ "@cloudflare/build-output-utils": "0.9.3",
46
+ "@cloudflare/runtime-types": "0.1.13",
47
+ "@cloudflare/config": "0.27.0",
48
+ "miniflare": "5.20261019.0-beta",
49
+ "@cloudflare/unenv-preset": "2.16.2"
50
50
  },
51
51
  "devDependencies": {
52
- "@cloudflare/workers-types": "^5.20261006.1",
52
+ "@cloudflare/workers-types": "^5.20261019.1",
53
53
  "@remix-run/node-fetch-server": "^0.8.0",
54
54
  "@types/node": "22.15.17",
55
55
  "@types/semver": "^7.5.1",
@@ -71,9 +71,9 @@
71
71
  "vite-legacy": "npm:vite@7.1.12",
72
72
  "vitest": "4.1.0",
73
73
  "@cloudflare/cli-shared-helpers": "0.2.6",
74
- "@cloudflare/containers-shared": "0.22.0",
74
+ "@cloudflare/containers-shared": "0.23.0",
75
75
  "@cloudflare/mock-npm-registry": "0.0.0",
76
- "@cloudflare/remote-bindings": "0.0.48",
76
+ "@cloudflare/remote-bindings": "0.0.50",
77
77
  "@cloudflare/workers-auth": "0.14.0",
78
78
  "@cloudflare/workers-shared": "0.20.1",
79
79
  "@cloudflare/workers-tsconfig": "0.0.0",