@cloudflare/vite-plugin 0.0.0-4c6873d11 → 0.0.0-4d2235829

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,8 @@ 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
+ import replace from "@rollup/plugin-replace";
493
494
 
494
495
  // ../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
495
496
  var comma = ",".charCodeAt(0);
@@ -1557,7 +1558,7 @@ var MagicString = class _MagicString {
1557
1558
 
1558
1559
  // src/index.ts
1559
1560
  import { Miniflare } from "miniflare";
1560
- import colors2 from "picocolors";
1561
+ import colors3 from "picocolors";
1561
1562
  import * as vite7 from "vite";
1562
1563
 
1563
1564
  // src/constants.ts
@@ -1588,7 +1589,7 @@ function matchAdditionalModule(source) {
1588
1589
  return null;
1589
1590
  }
1590
1591
  function createModuleReference(type, id) {
1591
- return `__CLOUDFLARE_MODULE__${type}__${id}__`;
1592
+ return `__CLOUDFLARE_MODULE__${type}__${id}__CLOUDFLARE_MODULE__`;
1592
1593
  }
1593
1594
 
1594
1595
  // src/asset-config.ts
@@ -5783,7 +5784,8 @@ var z = /* @__PURE__ */ Object.freeze({
5783
5784
  // ../workers-shared/utils/types.ts
5784
5785
  var InternalConfigSchema = z.object({
5785
5786
  account_id: z.number().optional(),
5786
- script_id: z.number().optional()
5787
+ script_id: z.number().optional(),
5788
+ debug: z.boolean().optional()
5787
5789
  });
5788
5790
  var RouterConfigSchema = z.object({
5789
5791
  invoke_user_worker_ahead_of_assets: z.boolean().optional(),
@@ -5831,14 +5833,14 @@ var AssetConfigSchema = z.object({
5831
5833
  });
5832
5834
 
5833
5835
  // src/asset-config.ts
5834
- function hasAssetsConfigChanged(resolvedPluginConfig, resolvedViteConfig, changedFile) {
5836
+ function hasAssetsConfigChanged(resolvedPluginConfig, resolvedViteConfig, changedFilePath) {
5835
5837
  if (!resolvedPluginConfig.experimental?.headersAndRedirectsDevModeSupport) {
5836
5838
  return false;
5837
5839
  }
5838
5840
  return [
5839
5841
  getRedirectsConfigPath(resolvedViteConfig),
5840
5842
  getHeadersConfigPath(resolvedViteConfig)
5841
- ].includes(path.resolve(changedFile));
5843
+ ].includes(changedFilePath);
5842
5844
  }
5843
5845
  function getAssetsConfig(resolvedPluginConfig, entryWorkerConfig, resolvedConfig) {
5844
5846
  const assetsConfig = resolvedPluginConfig.type === "assets-only" ? resolvedPluginConfig.config.assets : entryWorkerConfig?.assets;
@@ -12879,6 +12881,15 @@ function isNodeCompat(workerConfig) {
12879
12881
  }
12880
12882
  return false;
12881
12883
  }
12884
+ function isNodeAls(workerConfig) {
12885
+ return workerConfig !== void 0 && getNodeCompat(
12886
+ workerConfig.compatibility_date,
12887
+ workerConfig.compatibility_flags ?? []
12888
+ ).mode === "als";
12889
+ }
12890
+ function isNodeAlsModule(path10) {
12891
+ return /^(node:)?async_hooks$/.test(path10);
12892
+ }
12882
12893
  function injectGlobalCode(id, code) {
12883
12894
  const injectedCode = Object.entries(env.inject).map(([globalName, globalInject]) => {
12884
12895
  if (typeof globalInject === "string") {
@@ -12909,7 +12920,7 @@ globalThis.${globalName} = var_${globalName}.${exportName};
12909
12920
  }
12910
12921
  function resolveNodeJSImport(source) {
12911
12922
  const alias = env.alias[source];
12912
- if (alias) {
12923
+ if (alias && !nodeCompatExternals.has(alias)) {
12913
12924
  return {
12914
12925
  unresolved: alias,
12915
12926
  resolved: resolvePathSync(alias, { url: import.meta.url })
@@ -12982,7 +12993,7 @@ var NodeJsCompatWarnings = class {
12982
12993
  // src/shared.ts
12983
12994
  var UNKNOWN_HOST = "http://localhost";
12984
12995
  var INIT_PATH = "/__vite_plugin_cloudflare_init__";
12985
- var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__`;
12996
+ var ADDITIONAL_MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${ADDITIONAL_MODULE_TYPES.join("|")})__(.*?)__CLOUDFLARE_MODULE__`;
12986
12997
  var additionalModuleRE = new RegExp(ADDITIONAL_MODULE_PATTERN);
12987
12998
  var additionalModuleGlobalRE = new RegExp(
12988
12999
  ADDITIONAL_MODULE_PATTERN,
@@ -13018,19 +13029,6 @@ function toMiniflareRequest(request) {
13018
13029
  duplex: "half"
13019
13030
  });
13020
13031
  }
13021
- function nodeHeadersToWebHeaders(nodeHeaders) {
13022
- const headers = new Headers();
13023
- for (const [key, value] of Object.entries(nodeHeaders)) {
13024
- if (typeof value === "string") {
13025
- headers.append(key, value);
13026
- } else if (Array.isArray(value)) {
13027
- for (const item of value) {
13028
- headers.append(key, item);
13029
- }
13030
- }
13031
- }
13032
- return headers;
13033
- }
13034
13032
  var postfixRE = /[?#].*$/;
13035
13033
  function cleanUrl(url) {
13036
13034
  return url.replace(postfixRE, "");
@@ -13259,7 +13257,7 @@ import { unstable_readConfig } from "wrangler";
13259
13257
  function getDeployConfigPath(root) {
13260
13258
  return path5.resolve(root, ".wrangler", "deploy", "config.json");
13261
13259
  }
13262
- function getWorkerConfigs(root) {
13260
+ function getWorkerConfigs(root, mixedModeEnabled) {
13263
13261
  const deployConfigPath = getDeployConfigPath(root);
13264
13262
  const deployConfig = JSON.parse(
13265
13263
  fs2.readFileSync(deployConfigPath, "utf-8")
@@ -13272,7 +13270,10 @@ function getWorkerConfigs(root) {
13272
13270
  path5.dirname(deployConfigPath),
13273
13271
  configPath
13274
13272
  );
13275
- return unstable_readConfig({ config: resolvedConfigPath });
13273
+ return unstable_readConfig(
13274
+ { config: resolvedConfigPath },
13275
+ { experimental: { mixedModeEnabled } }
13276
+ );
13276
13277
  });
13277
13278
  }
13278
13279
  function getRelativePathToWorkerConfig(deployConfigDirectory, root, outputDirectory) {
@@ -13339,17 +13340,24 @@ import * as fsp from "node:fs/promises";
13339
13340
  import * as path6 from "node:path";
13340
13341
  import { fileURLToPath as fileURLToPath2 } from "node:url";
13341
13342
  import {
13343
+ getDefaultDevRegistryPath,
13342
13344
  kCurrentWorker,
13343
13345
  Log,
13344
13346
  LogLevel,
13345
13347
  Response as MiniflareResponse
13346
13348
  } from "miniflare";
13349
+ import colors2 from "picocolors";
13347
13350
  import { globSync } from "tinyglobby";
13348
13351
  import "vite";
13349
- import { unstable_getMiniflareWorkerOptions } from "wrangler";
13350
- function getPersistence(root, persistState) {
13352
+ import {
13353
+ experimental_pickRemoteBindings,
13354
+ experimental_startMixedModeSession,
13355
+ unstable_convertConfigBindingsToStartWorkerBindings,
13356
+ unstable_getMiniflareWorkerOptions
13357
+ } from "wrangler";
13358
+ function getPersistenceRoot(root, persistState) {
13351
13359
  if (persistState === false) {
13352
- return {};
13360
+ return;
13353
13361
  }
13354
13362
  const defaultPersistPath = ".wrangler/state";
13355
13363
  const persistPath = path6.resolve(
@@ -13357,14 +13365,7 @@ function getPersistence(root, persistState) {
13357
13365
  typeof persistState === "object" ? persistState.path : defaultPersistPath,
13358
13366
  "v3"
13359
13367
  );
13360
- return {
13361
- cachePersist: path6.join(persistPath, "cache"),
13362
- d1Persist: path6.join(persistPath, "d1"),
13363
- durableObjectsPersist: path6.join(persistPath, "do"),
13364
- kvPersist: path6.join(persistPath, "kv"),
13365
- r2Persist: path6.join(persistPath, "r2"),
13366
- workflowsPersist: path6.join(persistPath, "workflows")
13367
- };
13368
+ return persistPath;
13368
13369
  }
13369
13370
  function missingWorkerErrorMessage(workerName) {
13370
13371
  return `${workerName} does not match a worker name.`;
@@ -13448,7 +13449,29 @@ function getEntryWorkerConfig(resolvedPluginConfig) {
13448
13449
  }
13449
13450
  return resolvedPluginConfig.workers[resolvedPluginConfig.entryWorkerEnvironmentName];
13450
13451
  }
13451
- function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13452
+ function logUnknownTails(tails, userWorkers, log) {
13453
+ for (const tailService of tails ?? []) {
13454
+ let name;
13455
+ if (typeof tailService === "string") {
13456
+ name = tailService;
13457
+ } else if (typeof tailService === "object" && "name" in tailService && typeof tailService.name === "string") {
13458
+ name = tailService.name;
13459
+ } else {
13460
+ continue;
13461
+ }
13462
+ const found = userWorkers.some((w) => w.name === name);
13463
+ if (!found) {
13464
+ log(
13465
+ colors2.dim(
13466
+ colors2.yellow(
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.`
13468
+ )
13469
+ )
13470
+ );
13471
+ }
13472
+ }
13473
+ }
13474
+ async function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPort) {
13452
13475
  const resolvedViteConfig = viteDevServer.config;
13453
13476
  const entryWorkerConfig = getEntryWorkerConfig(resolvedPluginConfig);
13454
13477
  const assetsConfig = getAssetsConfig(
@@ -13524,53 +13547,64 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13524
13547
  }
13525
13548
  }
13526
13549
  ];
13527
- const workersFromConfig = resolvedPluginConfig.type === "workers" ? Object.entries(resolvedPluginConfig.workers).map(
13528
- ([environmentName, workerConfig]) => {
13529
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
13530
- {
13531
- ...workerConfig,
13532
- assets: void 0
13533
- },
13534
- resolvedPluginConfig.cloudflareEnv
13535
- );
13536
- const { externalWorkers: externalWorkers2 } = miniflareWorkerOptions;
13537
- const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13538
- return {
13539
- externalWorkers: externalWorkers2,
13540
- worker: {
13541
- ...workerOptions,
13542
- name: workerOptions.name ?? workerConfig.name,
13543
- unsafeInspectorProxy: inspectorPort !== false,
13544
- modulesRoot: miniflareModulesRoot,
13545
- unsafeEvalBinding: "__VITE_UNSAFE_EVAL__",
13546
- serviceBindings: {
13547
- ...workerOptions.serviceBindings,
13548
- ...environmentName === resolvedPluginConfig.entryWorkerEnvironmentName && workerConfig.assets?.binding ? {
13549
- [workerConfig.assets.binding]: ASSET_WORKER_NAME
13550
- } : {},
13551
- __VITE_INVOKE_MODULE__: async (request) => {
13552
- const payload = await request.json();
13553
- const invokePayloadData = payload.data;
13554
- assert6(
13555
- invokePayloadData.name === "fetchModule",
13556
- `Invalid invoke event: ${invokePayloadData.name}`
13557
- );
13558
- const [moduleId] = invokePayloadData.data;
13559
- if (additionalModuleRE.test(moduleId)) {
13560
- const result2 = {
13561
- externalize: moduleId,
13562
- type: "module"
13563
- };
13564
- 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);
13565
13602
  }
13566
- const devEnvironment = viteDevServer.environments[environmentName];
13567
- const result = await devEnvironment.hot.handleInvoke(payload);
13568
- return MiniflareResponse.json(result);
13569
13603
  }
13570
13604
  }
13571
- }
13572
- };
13573
- }
13605
+ };
13606
+ }
13607
+ )
13574
13608
  ) : [];
13575
13609
  const userWorkers = workersFromConfig.map((options) => options.worker);
13576
13610
  const externalWorkers = workersFromConfig.flatMap(
@@ -13582,8 +13616,10 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13582
13616
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13583
13617
  return {
13584
13618
  log: logger,
13619
+ logRequests: false,
13585
13620
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13586
13621
  unsafeInspectorProxy: inspectorPort !== false,
13622
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13587
13623
  handleRuntimeStdio(stdout, stderr) {
13588
13624
  const decoder = new TextDecoder();
13589
13625
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13591,7 +13627,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13591
13627
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13592
13628
  );
13593
13629
  },
13594
- ...getPersistence(
13630
+ defaultPersistRoot: getPersistenceRoot(
13595
13631
  resolvedViteConfig.root,
13596
13632
  resolvedPluginConfig.persistState
13597
13633
  ),
@@ -13637,6 +13673,11 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer, inspectorPo
13637
13673
  `export const ${className} = createWorkflowEntrypointWrapper('${className}');`
13638
13674
  );
13639
13675
  }
13676
+ logUnknownTails(
13677
+ workerOptions.tails,
13678
+ userWorkers,
13679
+ viteDevServer.config.logger.warn
13680
+ );
13640
13681
  return {
13641
13682
  ...workerOptions,
13642
13683
  modules: [
@@ -13720,27 +13761,48 @@ function getPreviewModules(main, modulesRules) {
13720
13761
  ]
13721
13762
  };
13722
13763
  }
13723
- function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, inspectorPort) {
13764
+ async function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistState, mixedModeEnabled, inspectorPort) {
13724
13765
  const resolvedViteConfig = vitePreviewServer.config;
13725
- const workers = workerConfigs.flatMap((config) => {
13726
- const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(config);
13727
- const { externalWorkers } = miniflareWorkerOptions;
13728
- const { ratelimits, modulesRules, ...workerOptions } = miniflareWorkerOptions.workerOptions;
13729
- return [
13730
- {
13731
- ...workerOptions,
13732
- name: workerOptions.name ?? config.name,
13733
- unsafeInspectorProxy: inspectorPort !== false,
13734
- ...miniflareWorkerOptions.main ? getPreviewModules(miniflareWorkerOptions.main, modulesRules) : { modules: true, script: "" }
13735
- },
13736
- ...externalWorkers
13737
- ];
13738
- });
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();
13739
13800
  const logger = new ViteMiniflareLogger(resolvedViteConfig);
13740
13801
  return {
13741
13802
  log: logger,
13742
13803
  inspectorPort: inspectorPort === false ? void 0 : inspectorPort,
13743
13804
  unsafeInspectorProxy: inspectorPort !== false,
13805
+ unsafeDevRegistryPath: getDefaultDevRegistryPath(),
13744
13806
  handleRuntimeStdio(stdout, stderr) {
13745
13807
  const decoder = new TextDecoder();
13746
13808
  stdout.forEach((data2) => logger.info(decoder.decode(data2)));
@@ -13748,11 +13810,13 @@ function getPreviewMiniflareOptions(vitePreviewServer, workerConfigs, persistSta
13748
13810
  (error) => logger.logWithLevel(LogLevel.ERROR, decoder.decode(error))
13749
13811
  );
13750
13812
  },
13751
- ...getPersistence(resolvedViteConfig.root, persistState),
13813
+ defaultPersistRoot: getPersistenceRoot(
13814
+ resolvedViteConfig.root,
13815
+ persistState
13816
+ ),
13752
13817
  workers
13753
13818
  };
13754
13819
  }
13755
- var removedMessages = [/^Ready on http/, /^Updated and ready on http/];
13756
13820
  var ViteMiniflareLogger = class extends Log {
13757
13821
  logger;
13758
13822
  constructor(config) {
@@ -13760,11 +13824,6 @@ var ViteMiniflareLogger = class extends Log {
13760
13824
  this.logger = config.logger;
13761
13825
  }
13762
13826
  logWithLevel(level, message) {
13763
- for (const removedMessage of removedMessages) {
13764
- if (removedMessage.test(message)) {
13765
- return;
13766
- }
13767
- }
13768
13827
  switch (level) {
13769
13828
  case LogLevel.ERROR:
13770
13829
  return this.logger.error(message);
@@ -13774,6 +13833,8 @@ var ViteMiniflareLogger = class extends Log {
13774
13833
  return this.logger.info(message);
13775
13834
  }
13776
13835
  }
13836
+ logReady() {
13837
+ }
13777
13838
  };
13778
13839
  function miniflareLogLevelFromViteLogLevel(level = "info") {
13779
13840
  switch (level) {
@@ -13787,6 +13848,24 @@ function miniflareLogLevelFromViteLogLevel(level = "info") {
13787
13848
  return LogLevel.NONE;
13788
13849
  }
13789
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
+ }
13790
13869
 
13791
13870
  // src/plugin-config.ts
13792
13871
  import assert8 from "node:assert";
@@ -13828,8 +13907,7 @@ var nonApplicableWorkerConfigs = {
13828
13907
  "preserve_file_names",
13829
13908
  "rules",
13830
13909
  "site",
13831
- "tsconfig",
13832
- "upload_source_maps"
13910
+ "tsconfig"
13833
13911
  ]
13834
13912
  };
13835
13913
  var nullableNonApplicable = [
@@ -13840,15 +13918,17 @@ var nullableNonApplicable = [
13840
13918
  "no_bundle",
13841
13919
  "preserve_file_names",
13842
13920
  "site",
13843
- "tsconfig",
13844
- "upload_source_maps"
13921
+ "tsconfig"
13845
13922
  ];
13846
- function readWorkerConfig(configPath, env2) {
13923
+ function readWorkerConfig(configPath, env2, mixedModeEnabled) {
13847
13924
  const nonApplicable = {
13848
13925
  replacedByVite: /* @__PURE__ */ new Set(),
13849
13926
  notRelevant: /* @__PURE__ */ new Set()
13850
13927
  };
13851
- const config = unstable_readConfig2({ config: configPath, env: env2 }, {});
13928
+ const config = unstable_readConfig2(
13929
+ { config: configPath, env: env2 },
13930
+ { experimental: { mixedModeEnabled } }
13931
+ );
13852
13932
  const raw = structuredClone(config);
13853
13933
  nullableNonApplicable.forEach((prop) => {
13854
13934
  if (config[prop] !== void 0) {
@@ -13943,11 +14023,15 @@ function isNotRelevant(configName) {
13943
14023
  function missingFieldErrorMessage(field, configPath, env2) {
13944
14024
  return `No ${field} field provided in '${configPath}'${env2 ? ` for '${env2}' environment` : ""}`;
13945
14025
  }
13946
- function getWorkerConfig(configPath, env2, opts) {
14026
+ function getWorkerConfig(configPath, env2, mixedModeEnabled, opts) {
13947
14027
  if (opts?.visitedConfigPaths?.has(configPath)) {
13948
14028
  throw new Error(`Duplicate Wrangler config path found: ${configPath}`);
13949
14029
  }
13950
- const { raw, config, nonApplicable } = readWorkerConfig(configPath, env2);
14030
+ const { raw, config, nonApplicable } = readWorkerConfig(
14031
+ configPath,
14032
+ env2,
14033
+ mixedModeEnabled
14034
+ );
13951
14035
  opts?.visitedConfigPaths?.add(configPath);
13952
14036
  if (!config.name) {
13953
14037
  throw new Error(missingFieldErrorMessage(`'name'`, configPath, env2));
@@ -14072,6 +14156,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14072
14156
  const entryWorkerResolvedConfig = getWorkerConfig(
14073
14157
  entryWorkerConfigPath,
14074
14158
  cloudflareEnv,
14159
+ pluginConfig.experimental?.mixedMode ?? false,
14075
14160
  {
14076
14161
  visitedConfigPaths: configPaths,
14077
14162
  isEntryWorker: true
@@ -14105,6 +14190,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14105
14190
  const workerResolvedConfig = getWorkerConfig(
14106
14191
  workerConfigPath,
14107
14192
  cloudflareEnv,
14193
+ pluginConfig.experimental?.mixedMode ?? false,
14108
14194
  {
14109
14195
  visitedConfigPaths: configPaths
14110
14196
  }
@@ -14139,6 +14225,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
14139
14225
  }
14140
14226
 
14141
14227
  // src/websockets.ts
14228
+ import { createHeaders } from "@mjackson/node-fetch-server";
14142
14229
  import { coupleWebSocket } from "miniflare";
14143
14230
  import { WebSocketServer } from "ws";
14144
14231
  function handleWebSocket(httpServer, getFetcher) {
@@ -14150,7 +14237,7 @@ function handleWebSocket(httpServer, getFetcher) {
14150
14237
  if (request.headers["sec-websocket-protocol"]?.startsWith("vite")) {
14151
14238
  return;
14152
14239
  }
14153
- const headers = nodeHeadersToWebHeaders(request.headers);
14240
+ const headers = createHeaders(request);
14154
14241
  const fetcher = await getFetcher();
14155
14242
  const response = await fetcher(url, {
14156
14243
  headers,
@@ -14182,12 +14269,15 @@ function validateWorkerEnvironmentsResolvedConfigs(resolvedPluginConfig, resolve
14182
14269
  for (const envName of workersEnvironmentNames) {
14183
14270
  const workerEnvConfig = resolvedViteConfig.environments[envName];
14184
14271
  assert9(workerEnvConfig, `Missing environment config for "${envName}"`);
14185
- const { optimizeDeps, resolve: resolve8 } = workerEnvConfig;
14272
+ const { optimizeDeps, resolve: resolve7 } = workerEnvConfig;
14186
14273
  const disallowedConfig = {};
14187
14274
  const disallowedOptimizeDepsExcludeEntries = (optimizeDeps.exclude ?? []).filter((entry) => {
14188
14275
  if (cloudflareBuiltInModules.includes(entry)) {
14189
14276
  return false;
14190
14277
  }
14278
+ if (isNodeAlsModule(entry) && isNodeAls(resolvedPluginConfig.workers[envName])) {
14279
+ return false;
14280
+ }
14191
14281
  if (NODEJS_MODULES_RE.test(entry) && isNodeCompat(resolvedPluginConfig.workers[envName])) {
14192
14282
  return false;
14193
14283
  }
@@ -14196,8 +14286,8 @@ function validateWorkerEnvironmentsResolvedConfigs(resolvedPluginConfig, resolve
14196
14286
  if (disallowedOptimizeDepsExcludeEntries.length > 0) {
14197
14287
  disallowedConfig.optimizeDepsExclude = disallowedOptimizeDepsExcludeEntries;
14198
14288
  }
14199
- if (resolve8.external === true || resolve8.external.length > 0) {
14200
- disallowedConfig.resolveExternal = resolve8.external;
14289
+ if (resolve7.external === true || resolve7.external.length > 0) {
14290
+ disallowedConfig.resolveExternal = resolve7.external;
14201
14291
  }
14202
14292
  if (Object.keys(disallowedConfig).length > 0) {
14203
14293
  disallowedEnvsConfigs.set(envName, disallowedConfig);
@@ -14403,94 +14493,97 @@ function cloudflare2(pluginConfig = {}) {
14403
14493
  }
14404
14494
  },
14405
14495
  hotUpdate(options) {
14406
- if (
14407
- // Vite normalizes `options.file` so we use `path.resolve` for Windows compatibility
14408
- resolvedPluginConfig.configPaths.has(path9.resolve(options.file)) || hasAssetsConfigChanged(
14409
- resolvedPluginConfig,
14410
- resolvedViteConfig,
14411
- options.file
14412
- )
14413
- ) {
14496
+ const changedFilePath = path9.resolve(options.file);
14497
+ if (resolvedPluginConfig.configPaths.has(changedFilePath) || hasDotDevDotVarsFileChanged(resolvedPluginConfig, changedFilePath) || hasAssetsConfigChanged(
14498
+ resolvedPluginConfig,
14499
+ resolvedViteConfig,
14500
+ changedFilePath
14501
+ )) {
14414
14502
  options.server.restart();
14415
14503
  return [];
14416
14504
  }
14417
14505
  },
14418
14506
  async configureServer(viteDevServer) {
14419
- assert10(
14420
- viteDevServer.httpServer,
14421
- "Unexpected error: No Vite HTTP server"
14422
- );
14423
14507
  const inputInspectorPort = await getInputInspectorPortOption(
14424
14508
  pluginConfig,
14425
14509
  viteDevServer
14426
14510
  );
14427
- if (miniflare) {
14428
- await miniflare.setOptions(
14429
- getDevMiniflareOptions(
14430
- resolvedPluginConfig,
14431
- viteDevServer,
14432
- inputInspectorPort
14433
- )
14434
- );
14511
+ const miniflareDevOptions = await getDevMiniflareOptions(
14512
+ resolvedPluginConfig,
14513
+ viteDevServer,
14514
+ inputInspectorPort
14515
+ );
14516
+ if (!miniflare) {
14517
+ miniflare = new Miniflare(miniflareDevOptions);
14435
14518
  } else {
14436
- miniflare = new Miniflare(
14437
- getDevMiniflareOptions(
14438
- resolvedPluginConfig,
14439
- viteDevServer,
14440
- inputInspectorPort
14441
- )
14442
- );
14519
+ await miniflare.setOptions(miniflareDevOptions);
14443
14520
  }
14444
14521
  await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
14445
- const middleware = createMiddleware(
14446
- async ({ request }) => {
14522
+ if (viteDevServer.httpServer) {
14523
+ handleWebSocket(viteDevServer.httpServer, async () => {
14447
14524
  assert10(miniflare, `Miniflare not defined`);
14448
14525
  const routerWorker = await getRouterWorker(miniflare);
14449
- return routerWorker.fetch(toMiniflareRequest(request), {
14450
- redirect: "manual"
14451
- });
14452
- },
14453
- { alwaysCallNext: false }
14454
- );
14455
- handleWebSocket(viteDevServer.httpServer, async () => {
14456
- assert10(miniflare, `Miniflare not defined`);
14457
- const routerWorker = await getRouterWorker(miniflare);
14458
- return routerWorker.fetch;
14459
- });
14526
+ return routerWorker.fetch;
14527
+ });
14528
+ }
14460
14529
  return () => {
14461
- viteDevServer.middlewares.use((req, res, next) => {
14462
- middleware(req, res, next);
14530
+ viteDevServer.middlewares.use(async (req, res, next) => {
14531
+ try {
14532
+ assert10(miniflare, `Miniflare not defined`);
14533
+ const routerWorker = await getRouterWorker(miniflare);
14534
+ const request = createRequest(req, res);
14535
+ const response = await routerWorker.fetch(
14536
+ toMiniflareRequest(request),
14537
+ {
14538
+ redirect: "manual"
14539
+ }
14540
+ );
14541
+ if (req.httpVersionMajor === 2) {
14542
+ response.headers.delete("transfer-encoding");
14543
+ }
14544
+ await sendResponse(res, response);
14545
+ } catch (error) {
14546
+ next(error);
14547
+ }
14463
14548
  });
14464
14549
  };
14465
14550
  },
14466
14551
  async configurePreviewServer(vitePreviewServer) {
14467
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14552
+ const workerConfigs = getWorkerConfigs(
14553
+ vitePreviewServer.config.root,
14554
+ pluginConfig.experimental?.mixedMode ?? false
14555
+ );
14468
14556
  const inputInspectorPort = await getInputInspectorPortOption(
14469
14557
  pluginConfig,
14470
14558
  vitePreviewServer
14471
14559
  );
14472
14560
  const miniflare2 = new Miniflare(
14473
- getPreviewMiniflareOptions(
14561
+ await getPreviewMiniflareOptions(
14474
14562
  vitePreviewServer,
14475
14563
  workerConfigs,
14476
14564
  pluginConfig.persistState ?? true,
14565
+ !!pluginConfig.experimental?.mixedMode,
14477
14566
  inputInspectorPort
14478
14567
  )
14479
14568
  );
14480
- const middleware = createMiddleware(
14481
- ({ request }) => {
14482
- return miniflare2.dispatchFetch(toMiniflareRequest(request), {
14483
- redirect: "manual"
14484
- });
14485
- },
14486
- { alwaysCallNext: false }
14487
- );
14488
14569
  handleWebSocket(
14489
14570
  vitePreviewServer.httpServer,
14490
14571
  () => miniflare2.dispatchFetch
14491
14572
  );
14492
- vitePreviewServer.middlewares.use((req, res, next) => {
14493
- middleware(req, res, next);
14573
+ vitePreviewServer.middlewares.use(async (req, res, next) => {
14574
+ try {
14575
+ const request = createRequest(req, res);
14576
+ const response = await miniflare2.dispatchFetch(
14577
+ toMiniflareRequest(request),
14578
+ { redirect: "manual" }
14579
+ );
14580
+ if (req.httpVersionMajor === 2) {
14581
+ response.headers.delete("transfer-encoding");
14582
+ }
14583
+ await sendResponse(res, response);
14584
+ } catch (error) {
14585
+ next(error);
14586
+ }
14494
14587
  });
14495
14588
  }
14496
14589
  },
@@ -14599,6 +14692,18 @@ function cloudflare2(pluginConfig = {}) {
14599
14692
  configEnvironment(name) {
14600
14693
  if (isNodeCompat(getWorkerConfig2(name))) {
14601
14694
  return {
14695
+ build: {
14696
+ rollupOptions: {
14697
+ plugins: [
14698
+ replace({
14699
+ "process.env.NODE_ENV": JSON.stringify(
14700
+ process.env.NODE_ENV ?? "production"
14701
+ ),
14702
+ preventAssignment: true
14703
+ })
14704
+ ]
14705
+ }
14706
+ },
14602
14707
  resolve: {
14603
14708
  builtins: [...nodeCompatExternals]
14604
14709
  },
@@ -14640,7 +14745,9 @@ function cloudflare2(pluginConfig = {}) {
14640
14745
  },
14641
14746
  async transform(code, id) {
14642
14747
  const workerConfig = getWorkerConfig2(this.environment.name);
14643
- assert10(workerConfig, "Expected a worker config");
14748
+ if (!workerConfig) {
14749
+ return;
14750
+ }
14644
14751
  const resolvedId = await this.resolve(workerConfig.main);
14645
14752
  if (id === resolvedId?.id) {
14646
14753
  return injectGlobalCode(id, code);
@@ -14669,6 +14776,25 @@ function cloudflare2(pluginConfig = {}) {
14669
14776
  );
14670
14777
  }
14671
14778
  },
14779
+ // Plugin that handles Node.js Async Local Storage (ALS) compatibility support for Vite Environments that are hosted in Cloudflare Workers.
14780
+ {
14781
+ name: "vite-plugin-cloudflare:nodejs-als",
14782
+ apply(_config, env2) {
14783
+ return !env2.isPreview;
14784
+ },
14785
+ configEnvironment(name, config) {
14786
+ if (isNodeAls(getWorkerConfig2(name))) {
14787
+ return {
14788
+ resolve: {
14789
+ builtins: ["async_hooks", "node:async_hooks"]
14790
+ },
14791
+ optimizeDeps: {
14792
+ exclude: ["async_hooks", "node:async_hooks"]
14793
+ }
14794
+ };
14795
+ }
14796
+ }
14797
+ },
14672
14798
  // Plugin that provides an __debug path for debugging the Cloudflare Workers.
14673
14799
  {
14674
14800
  name: "vite-plugin-cloudflare:debug",
@@ -14693,7 +14819,10 @@ function cloudflare2(pluginConfig = {}) {
14693
14819
  });
14694
14820
  },
14695
14821
  async configurePreviewServer(vitePreviewServer) {
14696
- const workerConfigs = getWorkerConfigs(vitePreviewServer.config.root);
14822
+ const workerConfigs = getWorkerConfigs(
14823
+ vitePreviewServer.config.root,
14824
+ pluginConfig.experimental?.mixedMode ?? false
14825
+ );
14697
14826
  if (workerConfigs.length >= 1 && pluginConfig.inspectorPort !== false) {
14698
14827
  addDebugToVitePrintUrls(vitePreviewServer);
14699
14828
  }
@@ -14734,6 +14863,9 @@ function cloudflare2(pluginConfig = {}) {
14734
14863
  build.onResolve(
14735
14864
  { filter: NODEJS_MODULES_RE },
14736
14865
  ({ path: path10, importer }) => {
14866
+ if (isNodeAls(workerConfig) && isNodeAlsModule(path10)) {
14867
+ return;
14868
+ }
14737
14869
  const nodeJsCompatWarnings = nodeJsCompatWarningsMap.get(workerConfig);
14738
14870
  nodeJsCompatWarnings?.registerImport(path10, importer);
14739
14871
  return { path: path10, external: true };
@@ -14763,6 +14895,9 @@ function cloudflare2(pluginConfig = {}) {
14763
14895
  async resolveId(source, importer) {
14764
14896
  const workerConfig = getWorkerConfig2(this.environment.name);
14765
14897
  if (workerConfig && !isNodeCompat(workerConfig)) {
14898
+ if (isNodeAls(workerConfig) && isNodeAlsModule(source)) {
14899
+ return;
14900
+ }
14766
14901
  const nodeJsCompatWarnings = nodeJsCompatWarningsMap.get(workerConfig);
14767
14902
  if (nodejsBuiltins.has(source)) {
14768
14903
  nodeJsCompatWarnings?.registerImport(source, importer);
@@ -14781,10 +14916,16 @@ function cloudflare2(pluginConfig = {}) {
14781
14916
  }
14782
14917
  }
14783
14918
  async function getInputInspectorPortOption(pluginConfig, viteServer) {
14919
+ if (pluginConfig.inspectorPort === void 0 || pluginConfig.inspectorPort === 0) {
14920
+ const resolvedInspectorPort = await getResolvedInspectorPort(pluginConfig);
14921
+ if (resolvedInspectorPort !== null) {
14922
+ return resolvedInspectorPort;
14923
+ }
14924
+ }
14784
14925
  const inputInspectorPort = pluginConfig.inspectorPort ?? await getFirstAvailablePort(DEFAULT_INSPECTOR_PORT);
14785
14926
  if (pluginConfig.inspectorPort === void 0 && inputInspectorPort !== DEFAULT_INSPECTOR_PORT) {
14786
14927
  viteServer.config.logger.warn(
14787
- colors2.dim(
14928
+ colors3.dim(
14788
14929
  `Default inspector port ${DEFAULT_INSPECTOR_PORT} not available, using ${inputInspectorPort} instead
14789
14930
  `
14790
14931
  )
@@ -14810,6 +14951,19 @@ function getDotDevDotVarsContent(configPath, cloudflareEnv) {
14810
14951
  }
14811
14952
  return null;
14812
14953
  }
14954
+ function hasDotDevDotVarsFileChanged(resolvedPluginConfig, changedFilePath) {
14955
+ return [...resolvedPluginConfig.configPaths].some((configPath) => {
14956
+ const dotDevDotVars = path9.join(path9.dirname(configPath), ".dev.vars");
14957
+ if (dotDevDotVars === changedFilePath) {
14958
+ return true;
14959
+ }
14960
+ if (resolvedPluginConfig.cloudflareEnv) {
14961
+ const dotDevDotVarsForEnv = `${dotDevDotVars}.${resolvedPluginConfig.cloudflareEnv}`;
14962
+ return dotDevDotVarsForEnv === changedFilePath;
14963
+ }
14964
+ return false;
14965
+ });
14966
+ }
14813
14967
  export {
14814
14968
  cloudflare2 as cloudflare
14815
14969
  };