@cloudflare/vite-plugin 0.0.0-d0d62e6e4 → 0.0.0-d1a1787b2

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.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
@@ -1571,6 +1571,7 @@ var ADDITIONAL_MODULE_TYPES = [
1571
1571
  "Text"
1572
1572
  ];
1573
1573
  var DEFAULT_INSPECTOR_PORT = 9229;
1574
+ var kRequestType = Symbol("kRequestType");
1574
1575
 
1575
1576
  // src/additional-modules.ts
1576
1577
  var moduleRules = [
@@ -1589,7 +1590,7 @@ function matchAdditionalModule(source) {
1589
1590
  return null;
1590
1591
  }
1591
1592
  function createModuleReference(type, id) {
1592
- return `__CLOUDFLARE_MODULE__${type}__${id}__`;
1593
+ return `__CLOUDFLARE_MODULE__${type}__${id}__CLOUDFLARE_MODULE__`;
1593
1594
  }
1594
1595
 
1595
1596
  // src/asset-config.ts
@@ -12648,8 +12649,8 @@ function packageResolve(specifier, base, conditions) {
12648
12649
  let packageJsonPath = fileURLToPath$1(packageJsonUrl);
12649
12650
  let lastPath;
12650
12651
  do {
12651
- const stat = tryStatSync(packageJsonPath.slice(0, -13));
12652
- if (!stat || !stat.isDirectory()) {
12652
+ const stat2 = tryStatSync(packageJsonPath.slice(0, -13));
12653
+ if (!stat2 || !stat2.isDirectory()) {
12653
12654
  lastPath = packageJsonPath;
12654
12655
  packageJsonUrl = new URL$1(
12655
12656
  (isScoped ? "../../../../node_modules/" : "../../../node_modules/") + packageName + "/package.json",
@@ -12779,8 +12780,8 @@ function _resolve(id, options = {}) {
12779
12780
  }
12780
12781
  if (isAbsolute(id)) {
12781
12782
  try {
12782
- const stat = statSync(id);
12783
- if (stat.isFile()) {
12783
+ const stat2 = statSync(id);
12784
+ if (stat2.isFile()) {
12784
12785
  return pathToFileURL(id);
12785
12786
  }
12786
12787
  } catch (error) {
@@ -12993,7 +12994,7 @@ var NodeJsCompatWarnings = class {
12993
12994
  // src/shared.ts
12994
12995
  var UNKNOWN_HOST = "http://localhost";
12995
12996
  var INIT_PATH = "/__vite_plugin_cloudflare_init__";
12996
- var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__`;
12997
+ var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__CLOUDFLARE_MODULE__`;
12997
12998
  var additionalModuleRE = new RegExp(ADDITIONAL_MODULE_PATTERN);
12998
12999
  var additionalModuleGlobalRE = new RegExp(
12999
13000
  ADDITIONAL_MODULE_PATTERN,
@@ -13010,9 +13011,6 @@ function getOutputDirectory(userConfig, environmentName) {
13010
13011
  const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
13011
13012
  return userConfig.environments?.[environmentName]?.build?.outDir ?? path4.join(rootOutputDirectory, environmentName);
13012
13013
  }
13013
- function getRouterWorker(miniflare2) {
13014
- return miniflare2.getWorker(ROUTER_WORKER_NAME);
13015
- }
13016
13014
  function toMiniflareRequest(request) {
13017
13015
  const host = request.headers.get("Host");
13018
13016
  if (host) {
@@ -13029,19 +13027,6 @@ function toMiniflareRequest(request) {
13029
13027
  duplex: "half"
13030
13028
  });
13031
13029
  }
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
13030
  var postfixRE = /[?#].*$/;
13046
13031
  function cleanUrl(url) {
13047
13032
  return url.replace(postfixRE, "");
@@ -13270,7 +13255,7 @@ import { unstable_readConfig } from "wrangler";
13270
13255
  function getDeployConfigPath(root) {
13271
13256
  return path5.resolve(root, ".wrangler", "deploy", "config.json");
13272
13257
  }
13273
- function getWorkerConfigs(root) {
13258
+ function getWorkerConfigs(root, mixedModeEnabled) {
13274
13259
  const deployConfigPath = getDeployConfigPath(root);
13275
13260
  const deployConfig = JSON.parse(
13276
13261
  fs2.readFileSync(deployConfigPath, "utf-8")
@@ -13283,7 +13268,10 @@ function getWorkerConfigs(root) {
13283
13268
  path5.dirname(deployConfigPath),
13284
13269
  configPath
13285
13270
  );
13286
- return unstable_readConfig({ config: resolvedConfigPath });
13271
+ return unstable_readConfig(
13272
+ { config: resolvedConfigPath },
13273
+ { experimental: { mixedModeEnabled } }
13274
+ );
13287
13275
  });
13288
13276
  }
13289
13277
  function getRelativePathToWorkerConfig(deployConfigDirectory, root, outputDirectory) {
@@ -13350,6 +13338,7 @@ import * as fsp from "node:fs/promises";
13350
13338
  import * as path6 from "node:path";
13351
13339
  import { fileURLToPath as fileURLToPath2 } from "node:url";
13352
13340
  import {
13341
+ getDefaultDevRegistryPath,
13353
13342
  kCurrentWorker,
13354
13343
  Log,
13355
13344
  LogLevel,
@@ -13358,10 +13347,15 @@ import {
13358
13347
  import colors2 from "picocolors";
13359
13348
  import { globSync } from "tinyglobby";
13360
13349
  import "vite";
13361
- import { unstable_getMiniflareWorkerOptions } from "wrangler";
13362
- function getPersistence(root, persistState) {
13350
+ import {
13351
+ experimental_pickRemoteBindings,
13352
+ experimental_startMixedModeSession,
13353
+ unstable_convertConfigBindingsToStartWorkerBindings,
13354
+ unstable_getMiniflareWorkerOptions
13355
+ } from "wrangler";
13356
+ function getPersistenceRoot(root, persistState) {
13363
13357
  if (persistState === false) {
13364
- return {};
13358
+ return;
13365
13359
  }
13366
13360
  const defaultPersistPath = ".wrangler/state";
13367
13361
  const persistPath = path6.resolve(
@@ -13369,14 +13363,7 @@ function getPersistence(root, persistState) {
13369
13363
  typeof persistState === "object" ? persistState.path : defaultPersistPath,
13370
13364
  "v3"
13371
13365
  );
13372
- return {
13373
- cachePersist: path6.join(persistPath, "cache"),
13374
- d1Persist: path6.join(persistPath, "d1"),
13375
- durableObjectsPersist: path6.join(persistPath, "do"),
13376
- kvPersist: path6.join(persistPath, "kv"),
13377
- r2Persist: path6.join(persistPath, "r2"),
13378
- workflowsPersist: path6.join(persistPath, "workflows")
13379
- };
13366
+ return persistPath;
13380
13367
  }
13381
13368
  function missingWorkerErrorMessage(workerName) {
13382
13369
  return `${workerName} does not match a worker name.`;
@@ -13460,30 +13447,29 @@ function getEntryWorkerConfig(resolvedPluginConfig) {
13460
13447
  }
13461
13448
  return resolvedPluginConfig.workers[resolvedPluginConfig.entryWorkerEnvironmentName];
13462
13449
  }
13463
- function filterTails(tails, userWorkers, log) {
13464
- return tails?.filter((tailService) => {
13450
+ function logUnknownTails(tails, userWorkers, log) {
13451
+ for (const tailService of tails ?? []) {
13465
13452
  let name;
13466
13453
  if (typeof tailService === "string") {
13467
13454
  name = tailService;
13468
13455
  } else if (typeof tailService === "object" && "name" in tailService && typeof tailService.name === "string") {
13469
13456
  name = tailService.name;
13470
13457
  } else {
13471
- return true;
13458
+ continue;
13472
13459
  }
13473
13460
  const found = userWorkers.some((w) => w.name === name);
13474
13461
  if (!found) {
13475
13462
  log(
13476
13463
  colors2.dim(
13477
13464
  colors2.yellow(
13478
- `Tail consumer "${name}" was not found in your config. Make sure you add it if you'd like to simulate receiving tail events locally.`
13465
+ `Tail consumer "${name}" was not found in your config. Make sure you add it to the config or run it in another dev session if you'd like to simulate receiving tail events locally.`
13479
13466
  )
13480
13467
  )
13481
13468
  );
13482
13469
  }
13483
- return found;
13484
- });
13470
+ }
13485
13471
  }
13486
- function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13472
+ async function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13487
13473
  const resolvedViteConfig = viteDevServer.config;
13488
13474
  const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig);
13489
13475
  const assetsConfig = getAssetsConfig(
@@ -13534,12 +13520,14 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13534
13520
  serviceBindings: {
13535
13521
  __VITE_ASSET_EXISTS__: async (request) => {
13536
13522
  const { pathname } = new URL(request.url);
13537
- const filePath = path6.join(resolvedViteConfig.root, pathname);
13538
- let exists;
13539
- try {
13540
- exists = fs3.statSync(filePath).isFile();
13541
- } catch (error) {
13542
- exists = false;
13523
+ let exists = false;
13524
+ if (pathname.endsWith(".html")) {
13525
+ try {
13526
+ const filePath = path6.join(resolvedViteConfig.root, pathname);
13527
+ const stats = await fsp.stat(filePath);
13528
+ exists = stats.isFile();
13529
+ } catch (error) {
13530
+ }
13543
13531
  }
13544
13532
  return MiniflareResponse.json(exists);
13545
13533
  },
@@ -13553,59 +13541,75 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13553
13541
  headers: { "Content-Type": "text/html" }
13554
13542
  });
13555
13543
  } catch (error) {
13556
- throw new Error(`Unexpected error. Failed to load ${pathname}`);
13544
+ throw new Error(`Unexpected error. Failed to load "${pathname}".`);
13557
13545
  }
13558
13546
  }
13559
13547
  }
13560
13548
  }
13561
13549
  ];
13562
- const workersFromConfig = resolvedPluginConfig.type === "workers" ? Object.entries(resolvedPluginConfig.workers).map(
13563
- ([environmentName, workerConfig]) => {
13564
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13565
- {
13566
- ...workerConfig,
13567
- assets: void 0
13568
- },
13569
- resolvedPluginConfig.cloudflareEnv
13570
- );
13571
- const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13572
- const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13573
- return {
13574
- externalWorkers: externalWorkers2,
13575
- worker: {
13576
- ...workerOptions,
13577
- name: workerOptions.name ?? workerConfig.name,
13578
- unsafeInspectorProxy: inspectorPort !== false,
13579
- modulesRoot: miniflareModulesRoot,
13580
- unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13581
- serviceBindings: {
13582
- ...workerOptions.serviceBindings,
13583
- ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13584
- [workerConfig.assets.binding]: ASSET_WORKER_NAME
13585
- } : {},
13586
- __VITE_INVOKE_MODULE__: async (request) => {
13587
- const payload = await request.json();
13588
- const invokePayloadData = payload.data;
13589
- assert6(
13590
- invokePayloadData.name === "fetchModule",
13591
- `Invalid invoke event: ${invokePayloadData.name}`
13592
- );
13593
- const [moduleId] = invokePayloadData.data;
13594
- if (additionalModuleRE.test(moduleId)) {
13595
- const result2 = {
13596
- externalize: moduleId,
13597
- type: "module"
13598
- };
13599
- return MiniflareResponse.json({ result: result2 });
13550
+ const workersFromConfig = resolvedPluginConfig.type === "workers" ? await Promise.all(
13551
+ Object.entries(resolvedPluginConfig.workers).map(
13552
+ async ([environmentName, workerConfig]) => {
13553
+ const mixedModeSession = resolvedPluginConfig.experimental.mixedMode ? await maybeStartOrUpdateMixedModeSession(workerConfig) : void 0;
13554
+ const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13555
+ {
13556
+ ...workerConfig,
13557
+ assets: void 0
13558
+ },
13559
+ resolvedPluginConfig.cloudflareEnv,
13560
+ {
13561
+ mixedModeConnectionString: mixedModeSession?.mixedModeConnectionString,
13562
+ mixedModeEnabled: resolvedPluginConfig.experimental.mixedMode
13563
+ }
13564
+ );
13565
+ const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13566
+ const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13567
+ return {
13568
+ externalWorkers: externalWorkers2,
13569
+ worker: {
13570
+ ...workerOptions,
13571
+ name: workerOptions.name ?? workerConfig.name,
13572
+ unsafeInspectorProxy: inspectorPort !== false,
13573
+ unsafeDirectSockets: environmentName === resolvedPluginConfig.entryWorkerEnvironmentName ? (
13574
+ // Expose the default entrypoint of the entry worker on the dev registry
13575
+ [{ entrypoint: void 0, proxy: true }]
13576
+ ) : [],
13577
+ modulesRoot: miniflareModulesRoot,
13578
+ unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13579
+ serviceBindings: {
13580
+ ...workerOptions.serviceBindings,
13581
+ ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13582
+ [workerConfig.assets.binding]: {
13583
+ node: (req, res) => {
13584
+ req[kRequestType] = "asset";
13585
+ viteDevServer.middlewares(req, res);
13586
+ }
13587
+ }
13588
+ } : {},
13589
+ __VITE_INVOKE_MODULE__: async (request) => {
13590
+ const payload = await request.json();
13591
+ const invokePayloadData = payload.data;
13592
+ assert6(
13593
+ invokePayloadData.name === "fetchModule",
13594
+ `Invalid invoke event: ${invokePayloadData.name}`
13595
+ );
13596
+ const [moduleId] = invokePayloadData.data;
13597
+ if (additionalModuleRE.test(moduleId)) {
13598
+ const result2 = {
13599
+ externalize: moduleId,
13600
+ type: "module"
13601
+ };
13602
+ return MiniflareResponse.json({ result: result2 });
13603
+ }
13604
+ const devEnvironment = viteDevServer.environments[environmentName];
13605
+ const result = await devEnvironment.hot.handleInvoke(payload);
13606
+ return MiniflareResponse.json(result);
13600
13607
  }
13601
- const devEnvironment = viteDevServer.environments[environmentName];
13602
- const result = await devEnvironment.hot.handleInvoke(payload);
13603
- return MiniflareResponse.json(result);
13604
13608
  }
13605
13609
  }
13606
- }
13607
- };
13608
- }
13610
+ };
13611
+ }
13612
+ )
13609
13613
  ) : [];
13610
13614
  const userWorkers = workersFromConfig.map((options) => options.worker);
13611
13615
  const externalWorkers = workersFromConfig.flatMap(
@@ -13617,8 +13621,10 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13617
13621
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13618
13622
  return {
13619
13623
  log: logger,
13624
+ logRequests: false,
13620
13625
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13621
13626
  unsafeInspectorProxy: inspectorPort !== false,
13627
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13622
13628
  handleRuntimeStdio(stdout, stderr) {
13623
13629
  const decoder = new TextDecoder();
13624
13630
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13626,7 +13632,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13626
13632
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13627
13633
  );
13628
13634
  },
13629
- ...getPersistence(
13635
+ defaultPersistRoot: getPersistenceRoot(
13630
13636
  resolvedViteConfig.root,
13631
13637
  resolvedPluginConfig.persistState
13632
13638
  ),
@@ -13672,13 +13678,13 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13672
13678
  `export const ${className} = createWorkflowEntrypointWrapper('${className}');`
13673
13679
  );
13674
13680
  }
13681
+ logUnknownTails(
13682
+ workerOptions.tails,
13683
+ userWorkers,
13684
+ viteDevServer.config.logger.warn
13685
+ );
13675
13686
  return {
13676
13687
  ...workerOptions,
13677
- tails: filterTails(
13678
- workerOptions.tails,
13679
- userWorkers,
13680
- viteDevServer.config.logger.warn
13681
- ),
13682
13688
  modules: [
13683
13689
  {
13684
13690
  type: "ESModule",
@@ -13760,32 +13766,48 @@ function getPreviewModules(main, modulesRules) {
13760
13766
  ]
13761
13767
  };
13762
13768
  }
13763
- function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, inspectorPort) {
13769
+ async function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, mixedModeEnabled, inspectorPort) {
13764
13770
  const resolvedViteConfig = vitePreviewServer.config;
13765
- const workers = workerConfigs.flatMap((config) => {
13766
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(config);
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 ?? config.name,
13778
- unsafeInspectorProxy: inspectorPort !== false,
13779
- ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13780
- },
13781
- ...externalWorkers
13782
- ];
13783
- });
13771
+ const workers = (await Promise.all(
13772
+ workerConfigs.map(async (workerConfig, i) => {
13773
+ const mixedModeSession = mixedModeEnabled ? await maybeStartOrUpdateMixedModeSession(workerConfig) : void 0;
13774
+ const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13775
+ workerConfig,
13776
+ void 0,
13777
+ {
13778
+ mixedModeConnectionString: mixedModeSession?.mixedModeConnectionString,
13779
+ mixedModeEnabled
13780
+ }
13781
+ );
13782
+ const { externalWorkers } = miniflareWorkerOptions;
13783
+ const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13784
+ logUnknownTails(
13785
+ workerOptions.tails,
13786
+ workerConfigs,
13787
+ vitePreviewServer.config.logger.warn
13788
+ );
13789
+ return [
13790
+ {
13791
+ ...workerOptions,
13792
+ name: workerOptions.name ?? workerConfig.name,
13793
+ unsafeInspectorProxy: inspectorPort !== false,
13794
+ unsafeDirectSockets: (
13795
+ // This exposes the default entrypoint of the entry worker on the dev registry
13796
+ // Assuming that the first worker config to be the entry worker.
13797
+ i === 0 ? [{ entrypoint: void 0, proxy: true }] : []
13798
+ ),
13799
+ ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13800
+ },
13801
+ ...externalWorkers
13802
+ ];
13803
+ })
13804
+ )).flat();
13784
13805
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13785
13806
  return {
13786
13807
  log: logger,
13787
13808
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13788
13809
  unsafeInspectorProxy: inspectorPort !== false,
13810
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13789
13811
  handleRuntimeStdio(stdout, stderr) {
13790
13812
  const decoder = new TextDecoder();
13791
13813
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13793,11 +13815,13 @@ function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistSta
13793
13815
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13794
13816
  );
13795
13817
  },
13796
- ...getPersistence(resolvedViteConfig.root, persistState),
13818
+ defaultPersistRoot: getPersistenceRoot(
13819
+ resolvedViteConfig.root,
13820
+ persistState
13821
+ ),
13797
13822
  workers
13798
13823
  };
13799
13824
  }
13800
- var removedMessages = [/^Ready on http/, /^Updated and ready on http/];
13801
13825
  var ViteMiniflareLogger = class extends Log {
13802
13826
  logger;
13803
13827
  constructor(config) {
@@ -13805,11 +13829,6 @@ var ViteMiniflareLogger = class extends Log {
13805
13829
  this.logger = config.logger;
13806
13830
  }
13807
13831
  logWithLevel(level, message) {
13808
- for (const removedMessage of removedMessages) {
13809
- if (removedMessage.test(message)) {
13810
- return;
13811
- }
13812
- }
13813
13832
  switch (level) {
13814
13833
  case LogLevel.ERROR:
13815
13834
  return this.logger.error(message);
@@ -13819,6 +13838,8 @@ var ViteMiniflareLogger = class extends Log {
13819
13838
  return this.logger.info(message);
13820
13839
  }
13821
13840
  }
13841
+ logReady() {
13842
+ }
13822
13843
  };
13823
13844
  function miniflareLogLevelFromViteLogLevel(level = "info") {
13824
13845
  switch (level) {
@@ -13832,6 +13853,24 @@ function miniflareLogLevelFromViteLogLevel(level = "info") {
13832
13853
  return LogLevel.NONE;
13833
13854
  }
13834
13855
  }
13856
+ var mixedModeSessionsMap = /* @__PURE__ */ new Map();
13857
+ async function maybeStartOrUpdateMixedModeSession(workerConfig) {
13858
+ const workerRemoteBindings = experimental_pickRemoteBindings(
13859
+ unstable_convertConfigBindingsToStartWorkerBindings(workerConfig) ?? {}
13860
+ );
13861
+ assert6(workerConfig.name, "Found workerConfig without a name");
13862
+ let mixedModeSession = mixedModeSessionsMap.get(workerConfig.name);
13863
+ if (mixedModeSession === void 0) {
13864
+ if (Object.keys(workerRemoteBindings).length > 0) {
13865
+ mixedModeSession = await experimental_startMixedModeSession(workerRemoteBindings);
13866
+ mixedModeSessionsMap.set(workerConfig.name, mixedModeSession);
13867
+ }
13868
+ } else {
13869
+ await mixedModeSession.updateBindings(workerRemoteBindings);
13870
+ }
13871
+ await mixedModeSession?.ready;
13872
+ return mixedModeSession;
13873
+ }
13835
13874
 
13836
13875
  // src/plugin-config.ts
13837
13876
  import assert8 from "node:assert";
@@ -13886,12 +13925,15 @@ var nullableNonApplicable = [
13886
13925
  "site",
13887
13926
  "tsconfig"
13888
13927
  ];
13889
- function readWorkerConfig(configPath, env2) {
13928
+ function readWorkerConfig(configPath, env2, mixedModeEnabled) {
13890
13929
  const nonApplicable = {
13891
13930
  replacedByVite: /* @__PURE__ */ new Set(),
13892
13931
  notRelevant: /* @__PURE__ */ new Set()
13893
13932
  };
13894
- const config = unstable_readConfig2({ config: configPath, env: env2 }, {});
13933
+ const config = unstable_readConfig2(
13934
+ { config: configPath, env: env2 },
13935
+ { experimental: { mixedModeEnabled } }
13936
+ );
13895
13937
  const raw = structuredClone(config);
13896
13938
  nullableNonApplicable.forEach((prop) => {
13897
13939
  if (config[prop] !== void 0) {
@@ -13986,11 +14028,15 @@ function isNotRelevant(configName) {
13986
14028
  function missingFieldErrorMessage(field, configPath, env2) {
13987
14029
  return `No ${field} field provided in '${configPath}'${env2 ? ` for '${env2}' environment` : ""}`;
13988
14030
  }
13989
- function getWorkerConfig(configPath, env2, opts) {
14031
+ function getWorkerConfig(configPath, env2, mixedModeEnabled, opts) {
13990
14032
  if (opts?.visitedConfigPaths?.has(configPath)) {
13991
14033
  throw new Error(`Duplicate Wrangler config path found: ${configPath}`);
13992
14034
  }
13993
- const { raw, config, nonApplicable } = readWorkerConfig(configPath, env2);
14035
+ const { raw, config, nonApplicable } = readWorkerConfig(
14036
+ configPath,
14037
+ env2,
14038
+ mixedModeEnabled
14039
+ );
13994
14040
  opts?.visitedConfigPaths?.add(configPath);
13995
14041
  if (!config.name) {
13996
14042
  throw new Error(missingFieldErrorMessage(`'name'`, configPath, env2));
@@ -14115,6 +14161,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14115
14161
  const entryWorkerResolvedConfig = getWorkerConfig(
14116
14162
  entryWorkerConfigPath,
14117
14163
  cloudflareEnv,
14164
+ pluginConfig.experimental?.mixedMode ?? false,
14118
14165
  {
14119
14166
  visitedConfigPaths: configPaths,
14120
14167
  isEntryWorker: true
@@ -14148,6 +14195,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14148
14195
  const workerResolvedConfig = getWorkerConfig(
14149
14196
  workerConfigPath,
14150
14197
  cloudflareEnv,
14198
+ pluginConfig.experimental?.mixedMode ?? false,
14151
14199
  {
14152
14200
  visitedConfigPaths: configPaths
14153
14201
  }
@@ -14182,6 +14230,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14182
14230
  }
14183
14231
 
14184
14232
  // src/websockets.ts
14233
+ import { createHeaders } from "@mjackson/node-fetch-server";
14185
14234
  import { coupleWebSocket } from "miniflare";
14186
14235
  import { WebSocketServer } from "ws";
14187
14236
  function handleWebSocket(httpServer, getFetcher) {
@@ -14193,7 +14242,7 @@ function handleWebSocket(httpServer, getFetcher) {
14193
14242
  if (request.headers["sec-websocket-protocol"]?.startsWith("vite")) {
14194
14243
  return;
14195
14244
  }
14196
- const headers = nodeHeadersToWebHeaders(request.headers);
14245
+ const headers = createHeaders(request);
14197
14246
  const fetcher = await getFetcher();
14198
14247
  const response = await fetcher(url, {
14199
14248
  headers,
@@ -14464,75 +14513,89 @@ function cloudflare2(pluginConfig = {}) {
14464
14513
  pluginConfig,
14465
14514
  viteDevServer
14466
14515
  );
14516
+ const miniflareDevOptions = await getDevMiniflareOptions(
14517
+ resolvedPluginConfig,
14518
+ viteDevServer,
14519
+ inputInspectorPort
14520
+ );
14467
14521
  if (!miniflare) {
14468
- miniflare = new Miniflare(
14469
- getDevMiniflareOptions(
14470
- resolvedPluginConfig,
14471
- viteDevServer,
14472
- inputInspectorPort
14473
- )
14474
- );
14522
+ miniflare = new Miniflare(miniflareDevOptions);
14475
14523
  } else {
14476
- await miniflare.setOptions(
14477
- getDevMiniflareOptions(
14478
- resolvedPluginConfig,
14479
- viteDevServer,
14480
- inputInspectorPort
14481
- )
14482
- );
14524
+ await miniflare.setOptions(miniflareDevOptions);
14483
14525
  }
14484
14526
  await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
14485
- const middleware = createMiddleware(
14486
- async ({ request }) => {
14487
- assert10(miniflare, `Miniflare not defined`);
14488
- const routerWorker = await getRouterWorker(miniflare);
14489
- return routerWorker.fetch(toMiniflareRequest(request), {
14490
- redirect: "manual"
14491
- });
14492
- },
14493
- { alwaysCallNext: false }
14494
- );
14495
14527
  if (viteDevServer.httpServer) {
14496
14528
  handleWebSocket(viteDevServer.httpServer, async () => {
14497
14529
  assert10(miniflare, `Miniflare not defined`);
14498
- const routerWorker = await getRouterWorker(miniflare);
14530
+ const routerWorker = await miniflare.getWorker(ROUTER_WORKER_NAME);
14499
14531
  return routerWorker.fetch;
14500
14532
  });
14501
14533
  }
14502
14534
  return () => {
14503
- viteDevServer.middlewares.use((req, res, next) => {
14504
- middleware(req, res, next);
14535
+ viteDevServer.middlewares.use(async (req, res, next) => {
14536
+ try {
14537
+ assert10(miniflare, `Miniflare not defined`);
14538
+ const request = createRequest(req, res);
14539
+ let response;
14540
+ if (req[kRequestType] === "asset") {
14541
+ const assetWorker = await miniflare.getWorker(ASSET_WORKER_NAME);
14542
+ response = await assetWorker.fetch(
14543
+ toMiniflareRequest(request),
14544
+ { redirect: "manual" }
14545
+ );
14546
+ } else {
14547
+ const routerWorker = await miniflare.getWorker(ROUTER_WORKER_NAME);
14548
+ response = await routerWorker.fetch(
14549
+ toMiniflareRequest(request),
14550
+ { redirect: "manual" }
14551
+ );
14552
+ }
14553
+ if (req.httpVersionMajor === 2) {
14554
+ response.headers.delete("transfer-encoding");
14555
+ }
14556
+ await sendResponse(res, response);
14557
+ } catch (error) {
14558
+ next(error);
14559
+ }
14505
14560
  });
14506
14561
  };
14507
14562
  },
14508
14563
  async configurePreviewServer(vitePreviewServer) {
14509
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14564
+ const workerConfigs = getWorkerConfigs(
14565
+ vitePreviewServer.config.root,
14566
+ pluginConfig.experimental?.mixedMode ?? false
14567
+ );
14510
14568
  const inputInspectorPort = await getInputInspectorPortOption(
14511
14569
  pluginConfig,
14512
14570
  vitePreviewServer
14513
14571
  );
14514
14572
  const miniflare2 = new Miniflare(
14515
- getPreviewMiniflareOptions(
14573
+ await getPreviewMiniflareOptions(
14516
14574
  vitePreviewServer,
14517
14575
  workerConfigs,
14518
14576
  pluginConfig.persistState ?? true,
14577
+ !!pluginConfig.experimental?.mixedMode,
14519
14578
  inputInspectorPort
14520
14579
  )
14521
14580
  );
14522
- const middleware = createMiddleware(
14523
- ({ request }) => {
14524
- return miniflare2.dispatchFetch(toMiniflareRequest(request), {
14525
- redirect: "manual"
14526
- });
14527
- },
14528
- { alwaysCallNext: false }
14529
- );
14530
14581
  handleWebSocket(
14531
14582
  vitePreviewServer.httpServer,
14532
14583
  () => miniflare2.dispatchFetch
14533
14584
  );
14534
- vitePreviewServer.middlewares.use((req, res, next) => {
14535
- middleware(req, res, next);
14585
+ vitePreviewServer.middlewares.use(async (req, res, next) => {
14586
+ try {
14587
+ const request = createRequest(req, res);
14588
+ const response = await miniflare2.dispatchFetch(
14589
+ toMiniflareRequest(request),
14590
+ { redirect: "manual" }
14591
+ );
14592
+ if (req.httpVersionMajor === 2) {
14593
+ response.headers.delete("transfer-encoding");
14594
+ }
14595
+ await sendResponse(res, response);
14596
+ } catch (error) {
14597
+ next(error);
14598
+ }
14536
14599
  });
14537
14600
  }
14538
14601
  },
@@ -14768,7 +14831,10 @@ function cloudflare2(pluginConfig = {}) {
14768
14831
  });
14769
14832
  },
14770
14833
  async configurePreviewServer(vitePreviewServer) {
14771
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14834
+ const workerConfigs = getWorkerConfigs(
14835
+ vitePreviewServer.config.root,
14836
+ pluginConfig.experimental?.mixedMode ?? false
14837
+ );
14772
14838
  if (workerConfigs.length >= 1 && pluginConfig.inspectorPort !== false) {
14773
14839
  addDebugToVitePrintUrls(vitePreviewServer);
14774
14840
  }