@cloudflare/vite-plugin 0.0.0-d34ef3d5b → 0.0.0-d3a6eb30e

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.
@@ -2476,7 +2476,7 @@ var ADDITIONAL_MODULE_TYPES = [
2476
2476
 
2477
2477
  // src/shared.ts
2478
2478
  var UNKNOWN_HOST = "http://localhost";
2479
- var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__`;
2479
+ var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__CLOUDFLARE_MODULE__`;
2480
2480
  var additionalModuleRE = new RegExp(ADDITIONAL_MODULE_PATTERN);
2481
2481
  var additionalModuleGlobalRE = new RegExp(
2482
2482
  ADDITIONAL_MODULE_PATTERN,
package/dist/index.d.ts CHANGED
@@ -21,6 +21,8 @@ interface PluginConfig extends EntryWorkerConfig {
21
21
  experimental?: {
22
22
  /** Experimental support for handling the _headers and _redirects files during Vite dev mode. */
23
23
  headersAndRedirectsDevModeSupport?: boolean;
24
+ /** Experimental support for mixed mode (where bindings configured with `remote: true` access remote resources). */
25
+ mixedMode?: boolean;
24
26
  };
25
27
  }
26
28
 
package/dist/index.js CHANGED
@@ -489,7 +489,7 @@ import assert10 from "node:assert";
489
489
  import * as fs5 from "node:fs";
490
490
  import * as fsp2 from "node:fs/promises";
491
491
  import * as path9 from "node:path";
492
- import { createMiddleware } from "@hattip/adapter-node";
492
+ import { createRequest, sendResponse } from "@mjackson/node-fetch-server";
493
493
  import replace from "@rollup/plugin-replace";
494
494
 
495
495
  // ../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
@@ -1558,7 +1558,7 @@ var MagicString = class _MagicString {
1558
1558
 
1559
1559
  // src/index.ts
1560
1560
  import { Miniflare } from "miniflare";
1561
- import colors2 from "picocolors";
1561
+ import colors3 from "picocolors";
1562
1562
  import * as vite7 from "vite";
1563
1563
 
1564
1564
  // src/constants.ts
@@ -1589,7 +1589,7 @@ function matchAdditionalModule(source) {
1589
1589
  return null;
1590
1590
  }
1591
1591
  function createModuleReference(type, id) {
1592
- return `__CLOUDFLARE_MODULE__${type}__${id}__`;
1592
+ return `__CLOUDFLARE_MODULE__${type}__${id}__CLOUDFLARE_MODULE__`;
1593
1593
  }
1594
1594
 
1595
1595
  // src/asset-config.ts
@@ -12993,7 +12993,7 @@ var NodeJsCompatWarnings = class {
12993
12993
  // src/shared.ts
12994
12994
  var UNKNOWN_HOST = "http://localhost";
12995
12995
  var INIT_PATH = "/__vite_plugin_cloudflare_init__";
12996
- var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__`;
12996
+ var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__CLOUDFLARE_MODULE__`;
12997
12997
  var additionalModuleRE = new RegExp(ADDITIONAL_MODULE_PATTERN);
12998
12998
  var additionalModuleGlobalRE = new RegExp(
12999
12999
  ADDITIONAL_MODULE_PATTERN,
@@ -13029,19 +13029,6 @@ function toMiniflareRequest(request) {
13029
13029
  duplex: "half"
13030
13030
  });
13031
13031
  }
13032
- function nodeHeadersToWebHeaders(nodeHeaders) {
13033
- const headers = new Headers();
13034
- for (const [key, value] of Object.entries(nodeHeaders)) {
13035
- if (typeof value === "string") {
13036
- headers.append(key, value);
13037
- } else if (Array.isArray(value)) {
13038
- for (const item of value) {
13039
- headers.append(key, item);
13040
- }
13041
- }
13042
- }
13043
- return headers;
13044
- }
13045
13032
  var postfixRE = /[?#].*$/;
13046
13033
  function cleanUrl(url) {
13047
13034
  return url.replace(postfixRE, "");
@@ -13355,12 +13342,18 @@ import {
13355
13342
  LogLevel,
13356
13343
  Response as MiniflareResponse
13357
13344
  } from "miniflare";
13345
+ import colors2 from "picocolors";
13358
13346
  import { globSync } from "tinyglobby";
13359
13347
  import "vite";
13360
- import { unstable_getMiniflareWorkerOptions } from "wrangler";
13361
- function getPersistence(root, persistState) {
13348
+ import {
13349
+ experimental_pickRemoteBindings,
13350
+ experimental_startMixedModeSession,
13351
+ unstable_convertConfigBindingsToStartWorkerBindings,
13352
+ unstable_getMiniflareWorkerOptions
13353
+ } from "wrangler";
13354
+ function getPersistenceRoot(root, persistState) {
13362
13355
  if (persistState === false) {
13363
- return {};
13356
+ return;
13364
13357
  }
13365
13358
  const defaultPersistPath = ".wrangler/state";
13366
13359
  const persistPath = path6.resolve(
@@ -13368,14 +13361,7 @@ function getPersistence(root, persistState) {
13368
13361
  typeof persistState === "object" ? persistState.path : defaultPersistPath,
13369
13362
  "v3"
13370
13363
  );
13371
- return {
13372
- cachePersist: path6.join(persistPath, "cache"),
13373
- d1Persist: path6.join(persistPath, "d1"),
13374
- durableObjectsPersist: path6.join(persistPath, "do"),
13375
- kvPersist: path6.join(persistPath, "kv"),
13376
- r2Persist: path6.join(persistPath, "r2"),
13377
- workflowsPersist: path6.join(persistPath, "workflows")
13378
- };
13364
+ return persistPath;
13379
13365
  }
13380
13366
  function missingWorkerErrorMessage(workerName) {
13381
13367
  return `${workerName} does not match a worker name.`;
@@ -13459,7 +13445,30 @@ function getEntryWorkerConfig(resolvedPluginConfig) {
13459
13445
  }
13460
13446
  return resolvedPluginConfig.workers[resolvedPluginConfig.entryWorkerEnvironmentName];
13461
13447
  }
13462
- function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13448
+ function filterTails(tails, userWorkers, log) {
13449
+ return tails?.filter((tailService) => {
13450
+ let name;
13451
+ if (typeof tailService === "string") {
13452
+ name = tailService;
13453
+ } else if (typeof tailService === "object" && "name" in tailService && typeof tailService.name === "string") {
13454
+ name = tailService.name;
13455
+ } else {
13456
+ return true;
13457
+ }
13458
+ const found = userWorkers.some((w) => w.name === name);
13459
+ if (!found) {
13460
+ log(
13461
+ colors2.dim(
13462
+ colors2.yellow(
13463
+ `Tail consumer "${name}" was not found in your config. Make sure you add it if you'd like to simulate receiving tail events locally.`
13464
+ )
13465
+ )
13466
+ );
13467
+ }
13468
+ return found;
13469
+ });
13470
+ }
13471
+ async function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13463
13472
  const resolvedViteConfig = viteDevServer.config;
13464
13473
  const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig);
13465
13474
  const assetsConfig = getAssetsConfig(
@@ -13535,53 +13544,59 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13535
13544
  }
13536
13545
  }
13537
13546
  ];
13538
- const workersFromConfig = resolvedPluginConfig.type === "workers" ? Object.entries(resolvedPluginConfig.workers).map(
13539
- ([environmentName, workerConfig]) => {
13540
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13541
- {
13542
- ...workerConfig,
13543
- assets: void 0
13544
- },
13545
- resolvedPluginConfig.cloudflareEnv
13546
- );
13547
- const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13548
- const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13549
- return {
13550
- externalWorkers: externalWorkers2,
13551
- worker: {
13552
- ...workerOptions,
13553
- name: workerOptions.name ?? workerConfig.name,
13554
- unsafeInspectorProxy: inspectorPort !== false,
13555
- modulesRoot: miniflareModulesRoot,
13556
- unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13557
- serviceBindings: {
13558
- ...workerOptions.serviceBindings,
13559
- ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13560
- [workerConfig.assets.binding]: ASSET_WORKER_NAME
13561
- } : {},
13562
- __VITE_INVOKE_MODULE__: async (request) => {
13563
- const payload = await request.json();
13564
- const invokePayloadData = payload.data;
13565
- assert6(
13566
- invokePayloadData.name === "fetchModule",
13567
- `Invalid invoke event: ${invokePayloadData.name}`
13568
- );
13569
- const [moduleId] = invokePayloadData.data;
13570
- if (additionalModuleRE.test(moduleId)) {
13571
- const result2 = {
13572
- externalize: moduleId,
13573
- type: "module"
13574
- };
13575
- return MiniflareResponse.json({ result: result2 });
13547
+ const workersFromConfig = resolvedPluginConfig.type === "workers" ? await Promise.all(
13548
+ Object.entries(resolvedPluginConfig.workers).map(
13549
+ async ([environmentName, workerConfig]) => {
13550
+ const mixedModeSession = resolvedPluginConfig.experimental.mixedMode ? await maybeStartOrUpdateMixedModeSession(workerConfig) : void 0;
13551
+ const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13552
+ {
13553
+ ...workerConfig,
13554
+ assets: void 0
13555
+ },
13556
+ resolvedPluginConfig.cloudflareEnv,
13557
+ {
13558
+ mixedModeConnectionString: mixedModeSession?.mixedModeConnectionString
13559
+ }
13560
+ );
13561
+ const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13562
+ const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13563
+ return {
13564
+ externalWorkers: externalWorkers2,
13565
+ worker: {
13566
+ ...workerOptions,
13567
+ name: workerOptions.name ?? workerConfig.name,
13568
+ unsafeInspectorProxy: inspectorPort !== false,
13569
+ modulesRoot: miniflareModulesRoot,
13570
+ unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13571
+ serviceBindings: {
13572
+ ...workerOptions.serviceBindings,
13573
+ ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13574
+ [workerConfig.assets.binding]: ASSET_WORKER_NAME
13575
+ } : {},
13576
+ __VITE_INVOKE_MODULE__: async (request) => {
13577
+ const payload = await request.json();
13578
+ const invokePayloadData = payload.data;
13579
+ assert6(
13580
+ invokePayloadData.name === "fetchModule",
13581
+ `Invalid invoke event: ${invokePayloadData.name}`
13582
+ );
13583
+ const [moduleId] = invokePayloadData.data;
13584
+ if (additionalModuleRE.test(moduleId)) {
13585
+ const result2 = {
13586
+ externalize: moduleId,
13587
+ type: "module"
13588
+ };
13589
+ return MiniflareResponse.json({ result: result2 });
13590
+ }
13591
+ const devEnvironment = viteDevServer.environments[environmentName];
13592
+ const result = await devEnvironment.hot.handleInvoke(payload);
13593
+ return MiniflareResponse.json(result);
13576
13594
  }
13577
- const devEnvironment = viteDevServer.environments[environmentName];
13578
- const result = await devEnvironment.hot.handleInvoke(payload);
13579
- return MiniflareResponse.json(result);
13580
13595
  }
13581
13596
  }
13582
- }
13583
- };
13584
- }
13597
+ };
13598
+ }
13599
+ )
13585
13600
  ) : [];
13586
13601
  const userWorkers = workersFromConfig.map((options) => options.worker);
13587
13602
  const externalWorkers = workersFromConfig.flatMap(
@@ -13593,6 +13608,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13593
13608
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13594
13609
  return {
13595
13610
  log: logger,
13611
+ logRequests: false,
13596
13612
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13597
13613
  unsafeInspectorProxy: inspectorPort !== false,
13598
13614
  handleRuntimeStdio(stdout, stderr) {
@@ -13602,7 +13618,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13602
13618
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13603
13619
  );
13604
13620
  },
13605
- ...getPersistence(
13621
+ defaultPersistRoot: getPersistenceRoot(
13606
13622
  resolvedViteConfig.root,
13607
13623
  resolvedPluginConfig.persistState
13608
13624
  ),
@@ -13650,6 +13666,11 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13650
13666
  }
13651
13667
  return {
13652
13668
  ...workerOptions,
13669
+ tails: filterTails(
13670
+ workerOptions.tails,
13671
+ userWorkers,
13672
+ viteDevServer.config.logger.warn
13673
+ ),
13653
13674
  modules: [
13654
13675
  {
13655
13676
  type: "ESModule",
@@ -13731,22 +13752,36 @@ function getPreviewModules(main, modulesRules) {
13731
13752
  ]
13732
13753
  };
13733
13754
  }
13734
- function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, inspectorPort) {
13755
+ async function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, mixedModeEnabled, inspectorPort) {
13735
13756
  const resolvedViteConfig = vitePreviewServer.config;
13736
- const workers = workerConfigs.flatMap((config) => {
13737
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(config);
13738
- const { externalWorkers } = miniflareWorkerOptions;
13739
- const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13740
- return [
13741
- {
13742
- ...workerOptions,
13743
- name: workerOptions.name ?? config.name,
13744
- unsafeInspectorProxy: inspectorPort !== false,
13745
- ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13746
- },
13747
- ...externalWorkers
13748
- ];
13749
- });
13757
+ const workers = (await Promise.all(
13758
+ workerConfigs.map(async (workerConfig) => {
13759
+ const mixedModeSession = mixedModeEnabled ? await maybeStartOrUpdateMixedModeSession(workerConfig) : void 0;
13760
+ const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13761
+ workerConfig,
13762
+ void 0,
13763
+ {
13764
+ mixedModeConnectionString: mixedModeSession?.mixedModeConnectionString
13765
+ }
13766
+ );
13767
+ const { externalWorkers } = miniflareWorkerOptions;
13768
+ const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13769
+ return [
13770
+ {
13771
+ ...workerOptions,
13772
+ tails: filterTails(
13773
+ workerOptions.tails,
13774
+ workerConfigs,
13775
+ vitePreviewServer.config.logger.warn
13776
+ ),
13777
+ name: workerOptions.name ?? workerConfig.name,
13778
+ unsafeInspectorProxy: inspectorPort !== false,
13779
+ ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13780
+ },
13781
+ ...externalWorkers
13782
+ ];
13783
+ })
13784
+ )).flat();
13750
13785
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13751
13786
  return {
13752
13787
  log: logger,
@@ -13759,11 +13794,13 @@ function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistSta
13759
13794
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13760
13795
  );
13761
13796
  },
13762
- ...getPersistence(resolvedViteConfig.root, persistState),
13797
+ defaultPersistRoot: getPersistenceRoot(
13798
+ resolvedViteConfig.root,
13799
+ persistState
13800
+ ),
13763
13801
  workers
13764
13802
  };
13765
13803
  }
13766
- var removedMessages = [/^Ready on http/, /^Updated and ready on http/];
13767
13804
  var ViteMiniflareLogger = class extends Log {
13768
13805
  logger;
13769
13806
  constructor(config) {
@@ -13771,11 +13808,6 @@ var ViteMiniflareLogger = class extends Log {
13771
13808
  this.logger = config.logger;
13772
13809
  }
13773
13810
  logWithLevel(level, message) {
13774
- for (const removedMessage of removedMessages) {
13775
- if (removedMessage.test(message)) {
13776
- return;
13777
- }
13778
- }
13779
13811
  switch (level) {
13780
13812
  case LogLevel.ERROR:
13781
13813
  return this.logger.error(message);
@@ -13785,6 +13817,8 @@ var ViteMiniflareLogger = class extends Log {
13785
13817
  return this.logger.info(message);
13786
13818
  }
13787
13819
  }
13820
+ logReady() {
13821
+ }
13788
13822
  };
13789
13823
  function miniflareLogLevelFromViteLogLevel(level = "info") {
13790
13824
  switch (level) {
@@ -13798,6 +13832,24 @@ function miniflareLogLevelFromViteLogLevel(level = "info") {
13798
13832
  return LogLevel.NONE;
13799
13833
  }
13800
13834
  }
13835
+ var mixedModeSessionsMap = /* @__PURE__ */ new Map();
13836
+ async function maybeStartOrUpdateMixedModeSession(workerConfig) {
13837
+ const workerRemoteBindings = experimental_pickRemoteBindings(
13838
+ unstable_convertConfigBindingsToStartWorkerBindings(workerConfig) ?? {}
13839
+ );
13840
+ assert6(workerConfig.name, "Found workerConfig without a name");
13841
+ let mixedModeSession = mixedModeSessionsMap.get(workerConfig.name);
13842
+ if (mixedModeSession === void 0) {
13843
+ if (Object.keys(workerRemoteBindings).length > 0) {
13844
+ mixedModeSession = await experimental_startMixedModeSession(workerRemoteBindings);
13845
+ mixedModeSessionsMap.set(workerConfig.name, mixedModeSession);
13846
+ }
13847
+ } else {
13848
+ await mixedModeSession.updateBindings(workerRemoteBindings);
13849
+ }
13850
+ await mixedModeSession?.ready;
13851
+ return mixedModeSession;
13852
+ }
13801
13853
 
13802
13854
  // src/plugin-config.ts
13803
13855
  import assert8 from "node:assert";
@@ -14148,6 +14200,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14148
14200
  }
14149
14201
 
14150
14202
  // src/websockets.ts
14203
+ import { createHeaders } from "@mjackson/node-fetch-server";
14151
14204
  import { coupleWebSocket } from "miniflare";
14152
14205
  import { WebSocketServer } from "ws";
14153
14206
  function handleWebSocket(httpServer, getFetcher) {
@@ -14159,7 +14212,7 @@ function handleWebSocket(httpServer, getFetcher) {
14159
14212
  if (request.headers["sec-websocket-protocol"]?.startsWith("vite")) {
14160
14213
  return;
14161
14214
  }
14162
- const headers = nodeHeadersToWebHeaders(request.headers);
14215
+ const headers = createHeaders(request);
14163
14216
  const fetcher = await getFetcher();
14164
14217
  const response = await fetcher(url, {
14165
14218
  headers,
@@ -14426,50 +14479,47 @@ function cloudflare2(pluginConfig = {}) {
14426
14479
  }
14427
14480
  },
14428
14481
  async configureServer(viteDevServer) {
14429
- assert10(
14430
- viteDevServer.httpServer,
14431
- "Unexpected error: No Vite HTTP server"
14432
- );
14433
14482
  const inputInspectorPort = await getInputInspectorPortOption(
14434
14483
  pluginConfig,
14435
14484
  viteDevServer
14436
14485
  );
14486
+ const miniflareDevOptions = await getDevMiniflareOptions(
14487
+ resolvedPluginConfig,
14488
+ viteDevServer,
14489
+ inputInspectorPort
14490
+ );
14437
14491
  if (!miniflare) {
14438
- miniflare = new Miniflare(
14439
- getDevMiniflareOptions(
14440
- resolvedPluginConfig,
14441
- viteDevServer,
14442
- inputInspectorPort
14443
- )
14444
- );
14492
+ miniflare = new Miniflare(miniflareDevOptions);
14445
14493
  } else {
14446
- await miniflare.setOptions(
14447
- getDevMiniflareOptions(
14448
- resolvedPluginConfig,
14449
- viteDevServer,
14450
- inputInspectorPort
14451
- )
14452
- );
14494
+ await miniflare.setOptions(miniflareDevOptions);
14453
14495
  }
14454
14496
  await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
14455
- const middleware = createMiddleware(
14456
- async ({ request }) => {
14497
+ if (viteDevServer.httpServer) {
14498
+ handleWebSocket(viteDevServer.httpServer, async () => {
14457
14499
  assert10(miniflare, `Miniflare not defined`);
14458
14500
  const routerWorker = await getRouterWorker(miniflare);
14459
- return routerWorker.fetch(toMiniflareRequest(request), {
14460
- redirect: "manual"
14461
- });
14462
- },
14463
- { alwaysCallNext: false }
14464
- );
14465
- handleWebSocket(viteDevServer.httpServer, async () => {
14466
- assert10(miniflare, `Miniflare not defined`);
14467
- const routerWorker = await getRouterWorker(miniflare);
14468
- return routerWorker.fetch;
14469
- });
14501
+ return routerWorker.fetch;
14502
+ });
14503
+ }
14470
14504
  return () => {
14471
- viteDevServer.middlewares.use((req, res, next) => {
14472
- middleware(req, res, next);
14505
+ viteDevServer.middlewares.use(async (req, res, next) => {
14506
+ try {
14507
+ assert10(miniflare, `Miniflare not defined`);
14508
+ const routerWorker = await getRouterWorker(miniflare);
14509
+ const request = createRequest(req, res);
14510
+ const response = await routerWorker.fetch(
14511
+ toMiniflareRequest(request),
14512
+ {
14513
+ redirect: "manual"
14514
+ }
14515
+ );
14516
+ if (req.httpVersionMajor === 2) {
14517
+ response.headers.delete("transfer-encoding");
14518
+ }
14519
+ await sendResponse(res, response);
14520
+ } catch (error) {
14521
+ next(error);
14522
+ }
14473
14523
  });
14474
14524
  };
14475
14525
  },
@@ -14480,27 +14530,32 @@ function cloudflare2(pluginConfig = {}) {
14480
14530
  vitePreviewServer
14481
14531
  );
14482
14532
  const miniflare2 = new Miniflare(
14483
- getPreviewMiniflareOptions(
14533
+ await getPreviewMiniflareOptions(
14484
14534
  vitePreviewServer,
14485
14535
  workerConfigs,
14486
14536
  pluginConfig.persistState ?? true,
14537
+ !!pluginConfig.experimental?.mixedMode,
14487
14538
  inputInspectorPort
14488
14539
  )
14489
14540
  );
14490
- const middleware = createMiddleware(
14491
- ({ request }) => {
14492
- return miniflare2.dispatchFetch(toMiniflareRequest(request), {
14493
- redirect: "manual"
14494
- });
14495
- },
14496
- { alwaysCallNext: false }
14497
- );
14498
14541
  handleWebSocket(
14499
14542
  vitePreviewServer.httpServer,
14500
14543
  () => miniflare2.dispatchFetch
14501
14544
  );
14502
- vitePreviewServer.middlewares.use((req, res, next) => {
14503
- middleware(req, res, next);
14545
+ vitePreviewServer.middlewares.use(async (req, res, next) => {
14546
+ try {
14547
+ const request = createRequest(req, res);
14548
+ const response = await miniflare2.dispatchFetch(
14549
+ toMiniflareRequest(request),
14550
+ { redirect: "manual" }
14551
+ );
14552
+ if (req.httpVersionMajor === 2) {
14553
+ response.headers.delete("transfer-encoding");
14554
+ }
14555
+ await sendResponse(res, response);
14556
+ } catch (error) {
14557
+ next(error);
14558
+ }
14504
14559
  });
14505
14560
  }
14506
14561
  },
@@ -14839,7 +14894,7 @@ async function getInputInspectorPortOption(pluginConfig, viteServer) {
14839
14894
  const inputInspectorPort = pluginConfig.inspectorPort ?? await getFirstAvailablePort(DEFAULT_INSPECTOR_PORT);
14840
14895
  if (pluginConfig.inspectorPort === void 0 && inputInspectorPort !== DEFAULT_INSPECTOR_PORT) {
14841
14896
  viteServer.config.logger.warn(
14842
- colors2.dim(
14897
+ colors3.dim(
14843
14898
  `Default inspector port ${DEFAULT_INSPECTOR_PORT} not available, using ${inputInspectorPort} instead
14844
14899
  `
14845
14900
  )
@@ -15,7 +15,7 @@ var ADDITIONAL_MODULE_TYPES = [
15
15
  // src/shared.ts
16
16
  var UNKNOWN_HOST = "http://localhost";
17
17
  var INIT_PATH = "/__vite_plugin_cloudflare_init__";
18
- var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__`;
18
+ var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__CLOUDFLARE_MODULE__`;
19
19
  var additionalModuleRE = new RegExp(ADDITIONAL_MODULE_PATTERN);
20
20
  var additionalModuleGlobalRE = new RegExp(
21
21
  ADDITIONAL_MODULE_PATTERN,
@@ -29,7 +29,7 @@ function stripInternalEnv(internalEnv) {
29
29
  return userEnv;
30
30
  }
31
31
 
32
- // ../../node_modules/.pnpm/vite@6.1.0_@types+node@18.19.76_jiti@2.4.2_lightningcss@1.29.2/node_modules/vite/dist/node/module-runner.js
32
+ // ../../node_modules/.pnpm/vite@6.1.0_@types+node@20.17.32_jiti@2.4.2_lightningcss@1.29.2/node_modules/vite/dist/node/module-runner.js
33
33
  var VALID_ID_PREFIX = "/@id/";
34
34
  var NULL_BYTE_PLACEHOLDER = "__x00__";
35
35
  var SOURCEMAPPING_URL = "sourceMa";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/vite-plugin",
3
- "version": "0.0.0-d34ef3d5b",
3
+ "version": "0.0.0-d3a6eb30e",
4
4
  "description": "Cloudflare plugin for Vite",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -33,19 +33,19 @@
33
33
  "dist"
34
34
  ],
35
35
  "dependencies": {
36
- "@hattip/adapter-node": "^0.0.49",
36
+ "@cloudflare/unenv-preset": "2.3.2",
37
+ "@mjackson/node-fetch-server": "^0.6.1",
37
38
  "@rollup/plugin-replace": "^6.0.1",
38
39
  "get-port": "^7.1.0",
39
40
  "picocolors": "^1.1.1",
40
41
  "tinyglobby": "^0.2.12",
41
- "unenv": "2.0.0-rc.15",
42
+ "unenv": "2.0.0-rc.17",
42
43
  "ws": "8.18.0",
43
- "@cloudflare/unenv-preset": "0.0.0-d34ef3d5b",
44
- "miniflare": "0.0.0-d34ef3d5b",
45
- "wrangler": "0.0.0-d34ef3d5b"
44
+ "miniflare": "0.0.0-d3a6eb30e",
45
+ "wrangler": "0.0.0-d3a6eb30e"
46
46
  },
47
47
  "devDependencies": {
48
- "@cloudflare/workers-types": "^4.20250424.0",
48
+ "@cloudflare/workers-types": "^4.20250525.0",
49
49
  "@types/node": "^22.10.1",
50
50
  "@types/ws": "^8.5.13",
51
51
  "magic-string": "^0.30.12",
@@ -55,8 +55,8 @@
55
55
  "undici": "^5.28.5",
56
56
  "vite": "^6.1.0",
57
57
  "vitest": "~3.1.1",
58
- "@cloudflare/workers-shared": "0.0.0-d34ef3d5b",
59
58
  "@cloudflare/mock-npm-registry": "0.0.0",
59
+ "@cloudflare/workers-shared": "0.0.0-d3a6eb30e",
60
60
  "@cloudflare/workers-tsconfig": "0.0.0"
61
61
  },
62
62
  "peerDependencies": {