@cloudflare/vite-plugin 0.0.0-e39a45ffa → 0.0.0-e44afaf79

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.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
@@ -13257,7 +13257,7 @@ import { unstable_readConfig } from "wrangler";
13257
13257
  function getDeployConfigPath(root) {
13258
13258
  return path5.resolve(root, ".wrangler", "deploy", "config.json");
13259
13259
  }
13260
- function getWorkerConfigs(root) {
13260
+ function getWorkerConfigs(root, mixedModeEnabled) {
13261
13261
  const deployConfigPath = getDeployConfigPath(root);
13262
13262
  const deployConfig = JSON.parse(
13263
13263
  fs2.readFileSync(deployConfigPath, "utf-8")
@@ -13270,7 +13270,10 @@ function getWorkerConfigs(root) {
13270
13270
  path5.dirname(deployConfigPath),
13271
13271
  configPath
13272
13272
  );
13273
- return unstable_readConfig({ config: resolvedConfigPath });
13273
+ return unstable_readConfig(
13274
+ { config: resolvedConfigPath },
13275
+ { experimental: { mixedModeEnabled } }
13276
+ );
13274
13277
  });
13275
13278
  }
13276
13279
  function getRelativePathToWorkerConfig(deployConfigDirectory, root, outputDirectory) {
@@ -13337,6 +13340,7 @@ import * as fsp from "node:fs/promises";
13337
13340
  import * as path6 from "node:path";
13338
13341
  import { fileURLToPath as fileURLToPath2 } from "node:url";
13339
13342
  import {
13343
+ getDefaultDevRegistryPath,
13340
13344
  kCurrentWorker,
13341
13345
  Log,
13342
13346
  LogLevel,
@@ -13345,7 +13349,12 @@ import {
13345
13349
  import colors2 from "picocolors";
13346
13350
  import { globSync } from "tinyglobby";
13347
13351
  import "vite";
13348
- import { unstable_getMiniflareWorkerOptions } from "wrangler";
13352
+ import {
13353
+ experimental_pickRemoteBindings,
13354
+ experimental_startMixedModeSession,
13355
+ unstable_convertConfigBindingsToStartWorkerBindings,
13356
+ unstable_getMiniflareWorkerOptions
13357
+ } from "wrangler";
13349
13358
  function getPersistenceRoot(root, persistState) {
13350
13359
  if (persistState === false) {
13351
13360
  return;
@@ -13440,30 +13449,29 @@ function getEntryWorkerConfig(resolvedPluginConfig) {
13440
13449
  }
13441
13450
  return resolvedPluginConfig.workers[resolvedPluginConfig.entryWorkerEnvironmentName];
13442
13451
  }
13443
- function filterTails(tails, userWorkers, log) {
13444
- return tails?.filter((tailService) => {
13452
+ function logUnknownTails(tails, userWorkers, log) {
13453
+ for (const tailService of tails ?? []) {
13445
13454
  let name;
13446
13455
  if (typeof tailService === "string") {
13447
13456
  name = tailService;
13448
13457
  } else if (typeof tailService === "object" && "name" in tailService && typeof tailService.name === "string") {
13449
13458
  name = tailService.name;
13450
13459
  } else {
13451
- return true;
13460
+ continue;
13452
13461
  }
13453
13462
  const found = userWorkers.some((w) => w.name === name);
13454
13463
  if (!found) {
13455
13464
  log(
13456
13465
  colors2.dim(
13457
13466
  colors2.yellow(
13458
- `Tail consumer "${name}" was not found in your config. Make sure you add it if you'd like to simulate receiving tail events locally.`
13467
+ `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.`
13459
13468
  )
13460
13469
  )
13461
13470
  );
13462
13471
  }
13463
- return found;
13464
- });
13472
+ }
13465
13473
  }
13466
- function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13474
+ async function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13467
13475
  const resolvedViteConfig = viteDevServer.config;
13468
13476
  const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig);
13469
13477
  const assetsConfig = getAssetsConfig(
@@ -13539,53 +13547,64 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13539
13547
  }
13540
13548
  }
13541
13549
  ];
13542
- const workersFromConfig = resolvedPluginConfig.type === "workers" ? Object.entries(resolvedPluginConfig.workers).map(
13543
- ([environmentName, workerConfig]) => {
13544
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13545
- {
13546
- ...workerConfig,
13547
- assets: void 0
13548
- },
13549
- resolvedPluginConfig.cloudflareEnv
13550
- );
13551
- const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13552
- const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13553
- return {
13554
- externalWorkers: externalWorkers2,
13555
- worker: {
13556
- ...workerOptions,
13557
- name: workerOptions.name ?? workerConfig.name,
13558
- unsafeInspectorProxy: inspectorPort !== false,
13559
- modulesRoot: miniflareModulesRoot,
13560
- unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13561
- serviceBindings: {
13562
- ...workerOptions.serviceBindings,
13563
- ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13564
- [workerConfig.assets.binding]: ASSET_WORKER_NAME
13565
- } : {},
13566
- __VITE_INVOKE_MODULE__: async (request) => {
13567
- const payload = await request.json();
13568
- const invokePayloadData = payload.data;
13569
- assert6(
13570
- invokePayloadData.name === "fetchModule",
13571
- `Invalid invoke event: ${invokePayloadData.name}`
13572
- );
13573
- const [moduleId] = invokePayloadData.data;
13574
- if (additionalModuleRE.test(moduleId)) {
13575
- const result2 = {
13576
- externalize: moduleId,
13577
- type: "module"
13578
- };
13579
- 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]: ASSET_WORKER_NAME
13583
+ } : {},
13584
+ __VITE_INVOKE_MODULE__: async (request) => {
13585
+ const payload = await request.json();
13586
+ const invokePayloadData = payload.data;
13587
+ assert6(
13588
+ invokePayloadData.name === "fetchModule",
13589
+ `Invalid invoke event: ${invokePayloadData.name}`
13590
+ );
13591
+ const [moduleId] = invokePayloadData.data;
13592
+ if (additionalModuleRE.test(moduleId)) {
13593
+ const result2 = {
13594
+ externalize: moduleId,
13595
+ type: "module"
13596
+ };
13597
+ return MiniflareResponse.json({ result: result2 });
13598
+ }
13599
+ const devEnvironment = viteDevServer.environments[environmentName];
13600
+ const result = await devEnvironment.hot.handleInvoke(payload);
13601
+ return MiniflareResponse.json(result);
13580
13602
  }
13581
- const devEnvironment = viteDevServer.environments[environmentName];
13582
- const result = await devEnvironment.hot.handleInvoke(payload);
13583
- return MiniflareResponse.json(result);
13584
13603
  }
13585
13604
  }
13586
- }
13587
- };
13588
- }
13605
+ };
13606
+ }
13607
+ )
13589
13608
  ) : [];
13590
13609
  const userWorkers = workersFromConfig.map((options) => options.worker);
13591
13610
  const externalWorkers = workersFromConfig.flatMap(
@@ -13600,6 +13619,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13600
13619
  logRequests: false,
13601
13620
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13602
13621
  unsafeInspectorProxy: inspectorPort !== false,
13622
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13603
13623
  handleRuntimeStdio(stdout, stderr) {
13604
13624
  const decoder = new TextDecoder();
13605
13625
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13653,13 +13673,13 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13653
13673
  `export const ${className} = createWorkflowEntrypointWrapper('${className}');`
13654
13674
  );
13655
13675
  }
13676
+ logUnknownTails(
13677
+ workerOptions.tails,
13678
+ userWorkers,
13679
+ viteDevServer.config.logger.warn
13680
+ );
13656
13681
  return {
13657
13682
  ...workerOptions,
13658
- tails: filterTails(
13659
- workerOptions.tails,
13660
- userWorkers,
13661
- viteDevServer.config.logger.warn
13662
- ),
13663
13683
  modules: [
13664
13684
  {
13665
13685
  type: "ESModule",
@@ -13741,32 +13761,48 @@ function getPreviewModules(main, modulesRules) {
13741
13761
  ]
13742
13762
  };
13743
13763
  }
13744
- function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, inspectorPort) {
13764
+ async function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, mixedModeEnabled, inspectorPort) {
13745
13765
  const resolvedViteConfig = vitePreviewServer.config;
13746
- const workers = workerConfigs.flatMap((config) => {
13747
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(config);
13748
- const { externalWorkers } = miniflareWorkerOptions;
13749
- const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13750
- return [
13751
- {
13752
- ...workerOptions,
13753
- tails: filterTails(
13754
- workerOptions.tails,
13755
- workerConfigs,
13756
- vitePreviewServer.config.logger.warn
13757
- ),
13758
- name: workerOptions.name ?? config.name,
13759
- unsafeInspectorProxy: inspectorPort !== false,
13760
- ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13761
- },
13762
- ...externalWorkers
13763
- ];
13764
- });
13766
+ const workers = (await Promise.all(
13767
+ workerConfigs.map(async (workerConfig, i) => {
13768
+ const mixedModeSession = mixedModeEnabled ? await maybeStartOrUpdateMixedModeSession(workerConfig) : void 0;
13769
+ const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13770
+ workerConfig,
13771
+ void 0,
13772
+ {
13773
+ mixedModeConnectionString: mixedModeSession?.mixedModeConnectionString,
13774
+ mixedModeEnabled
13775
+ }
13776
+ );
13777
+ const { externalWorkers } = miniflareWorkerOptions;
13778
+ const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13779
+ logUnknownTails(
13780
+ workerOptions.tails,
13781
+ workerConfigs,
13782
+ vitePreviewServer.config.logger.warn
13783
+ );
13784
+ return [
13785
+ {
13786
+ ...workerOptions,
13787
+ name: workerOptions.name ?? workerConfig.name,
13788
+ unsafeInspectorProxy: inspectorPort !== false,
13789
+ unsafeDirectSockets: (
13790
+ // This exposes the default entrypoint of the entry worker on the dev registry
13791
+ // Assuming that the first worker config to be the entry worker.
13792
+ i === 0 ? [{ entrypoint: void 0, proxy: true }] : []
13793
+ ),
13794
+ ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13795
+ },
13796
+ ...externalWorkers
13797
+ ];
13798
+ })
13799
+ )).flat();
13765
13800
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13766
13801
  return {
13767
13802
  log: logger,
13768
13803
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13769
13804
  unsafeInspectorProxy: inspectorPort !== false,
13805
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13770
13806
  handleRuntimeStdio(stdout, stderr) {
13771
13807
  const decoder = new TextDecoder();
13772
13808
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13812,6 +13848,24 @@ function miniflareLogLevelFromViteLogLevel(level = "info") {
13812
13848
  return LogLevel.NONE;
13813
13849
  }
13814
13850
  }
13851
+ var mixedModeSessionsMap = /* @__PURE__ */ new Map();
13852
+ async function maybeStartOrUpdateMixedModeSession(workerConfig) {
13853
+ const workerRemoteBindings = experimental_pickRemoteBindings(
13854
+ unstable_convertConfigBindingsToStartWorkerBindings(workerConfig) ?? {}
13855
+ );
13856
+ assert6(workerConfig.name, "Found workerConfig without a name");
13857
+ let mixedModeSession = mixedModeSessionsMap.get(workerConfig.name);
13858
+ if (mixedModeSession === void 0) {
13859
+ if (Object.keys(workerRemoteBindings).length > 0) {
13860
+ mixedModeSession = await experimental_startMixedModeSession(workerRemoteBindings);
13861
+ mixedModeSessionsMap.set(workerConfig.name, mixedModeSession);
13862
+ }
13863
+ } else {
13864
+ await mixedModeSession.updateBindings(workerRemoteBindings);
13865
+ }
13866
+ await mixedModeSession?.ready;
13867
+ return mixedModeSession;
13868
+ }
13815
13869
 
13816
13870
  // src/plugin-config.ts
13817
13871
  import assert8 from "node:assert";
@@ -13866,12 +13920,15 @@ var nullableNonApplicable = [
13866
13920
  "site",
13867
13921
  "tsconfig"
13868
13922
  ];
13869
- function readWorkerConfig(configPath, env2) {
13923
+ function readWorkerConfig(configPath, env2, mixedModeEnabled) {
13870
13924
  const nonApplicable = {
13871
13925
  replacedByVite: /* @__PURE__ */ new Set(),
13872
13926
  notRelevant: /* @__PURE__ */ new Set()
13873
13927
  };
13874
- const config = unstable_readConfig2({ config: configPath, env: env2 }, {});
13928
+ const config = unstable_readConfig2(
13929
+ { config: configPath, env: env2 },
13930
+ { experimental: { mixedModeEnabled } }
13931
+ );
13875
13932
  const raw = structuredClone(config);
13876
13933
  nullableNonApplicable.forEach((prop) => {
13877
13934
  if (config[prop] !== void 0) {
@@ -13966,11 +14023,15 @@ function isNotRelevant(configName) {
13966
14023
  function missingFieldErrorMessage(field, configPath, env2) {
13967
14024
  return `No ${field} field provided in '${configPath}'${env2 ? ` for '${env2}' environment` : ""}`;
13968
14025
  }
13969
- function getWorkerConfig(configPath, env2, opts) {
14026
+ function getWorkerConfig(configPath, env2, mixedModeEnabled, opts) {
13970
14027
  if (opts?.visitedConfigPaths?.has(configPath)) {
13971
14028
  throw new Error(`Duplicate Wrangler config path found: ${configPath}`);
13972
14029
  }
13973
- const { raw, config, nonApplicable } = readWorkerConfig(configPath, env2);
14030
+ const { raw, config, nonApplicable } = readWorkerConfig(
14031
+ configPath,
14032
+ env2,
14033
+ mixedModeEnabled
14034
+ );
13974
14035
  opts?.visitedConfigPaths?.add(configPath);
13975
14036
  if (!config.name) {
13976
14037
  throw new Error(missingFieldErrorMessage(`'name'`, configPath, env2));
@@ -14095,6 +14156,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14095
14156
  const entryWorkerResolvedConfig = getWorkerConfig(
14096
14157
  entryWorkerConfigPath,
14097
14158
  cloudflareEnv,
14159
+ pluginConfig.experimental?.mixedMode ?? false,
14098
14160
  {
14099
14161
  visitedConfigPaths: configPaths,
14100
14162
  isEntryWorker: true
@@ -14128,6 +14190,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14128
14190
  const workerResolvedConfig = getWorkerConfig(
14129
14191
  workerConfigPath,
14130
14192
  cloudflareEnv,
14193
+ pluginConfig.experimental?.mixedMode ?? false,
14131
14194
  {
14132
14195
  visitedConfigPaths: configPaths
14133
14196
  }
@@ -14445,22 +14508,15 @@ function cloudflare2(pluginConfig = {}) {
14445
14508
  pluginConfig,
14446
14509
  viteDevServer
14447
14510
  );
14511
+ const miniflareDevOptions = await getDevMiniflareOptions(
14512
+ resolvedPluginConfig,
14513
+ viteDevServer,
14514
+ inputInspectorPort
14515
+ );
14448
14516
  if (!miniflare) {
14449
- miniflare = new Miniflare(
14450
- getDevMiniflareOptions(
14451
- resolvedPluginConfig,
14452
- viteDevServer,
14453
- inputInspectorPort
14454
- )
14455
- );
14517
+ miniflare = new Miniflare(miniflareDevOptions);
14456
14518
  } else {
14457
- await miniflare.setOptions(
14458
- getDevMiniflareOptions(
14459
- resolvedPluginConfig,
14460
- viteDevServer,
14461
- inputInspectorPort
14462
- )
14463
- );
14519
+ await miniflare.setOptions(miniflareDevOptions);
14464
14520
  }
14465
14521
  await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
14466
14522
  if (viteDevServer.httpServer) {
@@ -14493,16 +14549,20 @@ function cloudflare2(pluginConfig = {}) {
14493
14549
  };
14494
14550
  },
14495
14551
  async configurePreviewServer(vitePreviewServer) {
14496
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14552
+ const workerConfigs = getWorkerConfigs(
14553
+ vitePreviewServer.config.root,
14554
+ pluginConfig.experimental?.mixedMode ?? false
14555
+ );
14497
14556
  const inputInspectorPort = await getInputInspectorPortOption(
14498
14557
  pluginConfig,
14499
14558
  vitePreviewServer
14500
14559
  );
14501
14560
  const miniflare2 = new Miniflare(
14502
- getPreviewMiniflareOptions(
14561
+ await getPreviewMiniflareOptions(
14503
14562
  vitePreviewServer,
14504
14563
  workerConfigs,
14505
14564
  pluginConfig.persistState ?? true,
14565
+ !!pluginConfig.experimental?.mixedMode,
14506
14566
  inputInspectorPort
14507
14567
  )
14508
14568
  );
@@ -14759,7 +14819,10 @@ function cloudflare2(pluginConfig = {}) {
14759
14819
  });
14760
14820
  },
14761
14821
  async configurePreviewServer(vitePreviewServer) {
14762
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14822
+ const workerConfigs = getWorkerConfigs(
14823
+ vitePreviewServer.config.root,
14824
+ pluginConfig.experimental?.mixedMode ?? false
14825
+ );
14763
14826
  if (workerConfigs.length >= 1 && pluginConfig.inspectorPort !== false) {
14764
14827
  addDebugToVitePrintUrls(vitePreviewServer);
14765
14828
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/vite-plugin",
3
- "version": "0.0.0-e39a45ffa",
3
+ "version": "0.0.0-e44afaf79",
4
4
  "description": "Cloudflare plugin for Vite",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -41,8 +41,8 @@
41
41
  "tinyglobby": "^0.2.12",
42
42
  "unenv": "2.0.0-rc.17",
43
43
  "ws": "8.18.0",
44
- "miniflare": "0.0.0-e39a45ffa",
45
- "wrangler": "0.0.0-e39a45ffa"
44
+ "miniflare": "0.0.0-e44afaf79",
45
+ "wrangler": "0.0.0-e44afaf79"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@cloudflare/workers-types": "^4.20250525.0",
@@ -55,9 +55,9 @@
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-e44afaf79",
58
59
  "@cloudflare/mock-npm-registry": "0.0.0",
59
- "@cloudflare/workers-tsconfig": "0.0.0",
60
- "@cloudflare/workers-shared": "0.0.0-e39a45ffa"
60
+ "@cloudflare/workers-tsconfig": "0.0.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "vite": "^6.1.0",