@cloudflare/vite-plugin 0.0.0-91d0c408c → 0.0.0-92719a535

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
@@ -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, "");
@@ -13358,10 +13345,15 @@ import {
13358
13345
  import colors2 from "picocolors";
13359
13346
  import { globSync } from "tinyglobby";
13360
13347
  import "vite";
13361
- import { unstable_getMiniflareWorkerOptions } from "wrangler";
13362
- 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) {
13363
13355
  if (persistState === false) {
13364
- return {};
13356
+ return;
13365
13357
  }
13366
13358
  const defaultPersistPath = ".wrangler/state";
13367
13359
  const persistPath = path6.resolve(
@@ -13369,14 +13361,7 @@ function getPersistence(root, persistState) {
13369
13361
  typeof persistState === "object" ? persistState.path : defaultPersistPath,
13370
13362
  "v3"
13371
13363
  );
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
- };
13364
+ return persistPath;
13380
13365
  }
13381
13366
  function missingWorkerErrorMessage(workerName) {
13382
13367
  return `${workerName} does not match a worker name.`;
@@ -13483,7 +13468,7 @@ function filterTails(tails, userWorkers, log) {
13483
13468
  return found;
13484
13469
  });
13485
13470
  }
13486
- function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13471
+ async function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13487
13472
  const resolvedViteConfig = viteDevServer.config;
13488
13473
  const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig);
13489
13474
  const assetsConfig = getAssetsConfig(
@@ -13559,53 +13544,59 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13559
13544
  }
13560
13545
  }
13561
13546
  ];
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 });
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);
13600
13594
  }
13601
- const devEnvironment = viteDevServer.environments[environmentName];
13602
- const result = await devEnvironment.hot.handleInvoke(payload);
13603
- return MiniflareResponse.json(result);
13604
13595
  }
13605
13596
  }
13606
- }
13607
- };
13608
- }
13597
+ };
13598
+ }
13599
+ )
13609
13600
  ) : [];
13610
13601
  const userWorkers = workersFromConfig.map((options) => options.worker);
13611
13602
  const externalWorkers = workersFromConfig.flatMap(
@@ -13617,6 +13608,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13617
13608
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13618
13609
  return {
13619
13610
  log: logger,
13611
+ logRequests: false,
13620
13612
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13621
13613
  unsafeInspectorProxy: inspectorPort !== false,
13622
13614
  handleRuntimeStdio(stdout, stderr) {
@@ -13626,7 +13618,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13626
13618
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13627
13619
  );
13628
13620
  },
13629
- ...getPersistence(
13621
+ defaultPersistRoot: getPersistenceRoot(
13630
13622
  resolvedViteConfig.root,
13631
13623
  resolvedPluginConfig.persistState
13632
13624
  ),
@@ -13760,27 +13752,36 @@ function getPreviewModules(main, modulesRules) {
13760
13752
  ]
13761
13753
  };
13762
13754
  }
13763
- function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, inspectorPort) {
13755
+ async function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, mixedModeEnabled, inspectorPort) {
13764
13756
  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
- });
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();
13784
13785
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13785
13786
  return {
13786
13787
  log: logger,
@@ -13793,11 +13794,13 @@ function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistSta
13793
13794
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13794
13795
  );
13795
13796
  },
13796
- ...getPersistence(resolvedViteConfig.root, persistState),
13797
+ defaultPersistRoot: getPersistenceRoot(
13798
+ resolvedViteConfig.root,
13799
+ persistState
13800
+ ),
13797
13801
  workers
13798
13802
  };
13799
13803
  }
13800
- var removedMessages = [/^Ready on http/, /^Updated and ready on http/];
13801
13804
  var ViteMiniflareLogger = class extends Log {
13802
13805
  logger;
13803
13806
  constructor(config) {
@@ -13805,11 +13808,6 @@ var ViteMiniflareLogger = class extends Log {
13805
13808
  this.logger = config.logger;
13806
13809
  }
13807
13810
  logWithLevel(level, message) {
13808
- for (const removedMessage of removedMessages) {
13809
- if (removedMessage.test(message)) {
13810
- return;
13811
- }
13812
- }
13813
13811
  switch (level) {
13814
13812
  case LogLevel.ERROR:
13815
13813
  return this.logger.error(message);
@@ -13819,6 +13817,8 @@ var ViteMiniflareLogger = class extends Log {
13819
13817
  return this.logger.info(message);
13820
13818
  }
13821
13819
  }
13820
+ logReady() {
13821
+ }
13822
13822
  };
13823
13823
  function miniflareLogLevelFromViteLogLevel(level = "info") {
13824
13824
  switch (level) {
@@ -13832,6 +13832,24 @@ function miniflareLogLevelFromViteLogLevel(level = "info") {
13832
13832
  return LogLevel.NONE;
13833
13833
  }
13834
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
+ }
13835
13853
 
13836
13854
  // src/plugin-config.ts
13837
13855
  import assert8 from "node:assert";
@@ -14182,6 +14200,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14182
14200
  }
14183
14201
 
14184
14202
  // src/websockets.ts
14203
+ import { createHeaders } from "@mjackson/node-fetch-server";
14185
14204
  import { coupleWebSocket } from "miniflare";
14186
14205
  import { WebSocketServer } from "ws";
14187
14206
  function handleWebSocket(httpServer, getFetcher) {
@@ -14193,7 +14212,7 @@ function handleWebSocket(httpServer, getFetcher) {
14193
14212
  if (request.headers["sec-websocket-protocol"]?.startsWith("vite")) {
14194
14213
  return;
14195
14214
  }
14196
- const headers = nodeHeadersToWebHeaders(request.headers);
14215
+ const headers = createHeaders(request);
14197
14216
  const fetcher = await getFetcher();
14198
14217
  const response = await fetcher(url, {
14199
14218
  headers,
@@ -14464,22 +14483,15 @@ function cloudflare2(pluginConfig = {}) {
14464
14483
  pluginConfig,
14465
14484
  viteDevServer
14466
14485
  );
14486
+ const miniflareDevOptions = await getDevMiniflareOptions(
14487
+ resolvedPluginConfig,
14488
+ viteDevServer,
14489
+ inputInspectorPort
14490
+ );
14467
14491
  if (!miniflare) {
14468
- miniflare = new Miniflare(
14469
- getDevMiniflareOptions(
14470
- resolvedPluginConfig,
14471
- viteDevServer,
14472
- inputInspectorPort
14473
- )
14474
- );
14492
+ miniflare = new Miniflare(miniflareDevOptions);
14475
14493
  } else {
14476
- await miniflare.setOptions(
14477
- getDevMiniflareOptions(
14478
- resolvedPluginConfig,
14479
- viteDevServer,
14480
- inputInspectorPort
14481
- )
14482
- );
14494
+ await miniflare.setOptions(miniflareDevOptions);
14483
14495
  }
14484
14496
  await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
14485
14497
  if (viteDevServer.httpServer) {
@@ -14518,10 +14530,11 @@ function cloudflare2(pluginConfig = {}) {
14518
14530
  vitePreviewServer
14519
14531
  );
14520
14532
  const miniflare2 = new Miniflare(
14521
- getPreviewMiniflareOptions(
14533
+ await getPreviewMiniflareOptions(
14522
14534
  vitePreviewServer,
14523
14535
  workerConfigs,
14524
14536
  pluginConfig.persistState ?? true,
14537
+ !!pluginConfig.experimental?.mixedMode,
14525
14538
  inputInspectorPort
14526
14539
  )
14527
14540
  );
@@ -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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/vite-plugin",
3
- "version": "0.0.0-91d0c408c",
3
+ "version": "0.0.0-92719a535",
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
+ "@cloudflare/unenv-preset": "2.3.2",
36
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-91d0c408c",
44
- "miniflare": "0.0.0-91d0c408c",
45
- "wrangler": "0.0.0-91d0c408c"
44
+ "wrangler": "0.0.0-92719a535",
45
+ "miniflare": "0.0.0-92719a535"
46
46
  },
47
47
  "devDependencies": {
48
- "@cloudflare/workers-types": "^4.20250508.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",
@@ -56,8 +56,8 @@
56
56
  "vite": "^6.1.0",
57
57
  "vitest": "~3.1.1",
58
58
  "@cloudflare/mock-npm-registry": "0.0.0",
59
- "@cloudflare/workers-shared": "0.0.0-91d0c408c",
60
- "@cloudflare/workers-tsconfig": "0.0.0"
59
+ "@cloudflare/workers-tsconfig": "0.0.0",
60
+ "@cloudflare/workers-shared": "0.0.0-92719a535"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "vite": "^6.1.0",