@cloudflare/vite-plugin 0.1.2 → 0.1.3

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.
Files changed (2) hide show
  1. package/dist/index.js +75 -76
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import assert9 from "node:assert";
3
3
  import * as fs5 from "node:fs";
4
+ import { builtinModules as builtinModules2 } from "node:module";
4
5
  import * as path7 from "node:path";
5
6
  import { createMiddleware } from "@hattip/adapter-node";
6
7
 
@@ -1088,13 +1089,9 @@ var INIT_PATH = "/__vite_plugin_cloudflare_init__";
1088
1089
  var MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${MODULE_TYPES.join("|")})__(.*?)__`;
1089
1090
 
1090
1091
  // src/utils.ts
1091
- import { builtinModules } from "node:module";
1092
1092
  import * as path from "node:path";
1093
1093
  import { Request as MiniflareRequest } from "miniflare";
1094
1094
  import "vite";
1095
- var nodeBuiltInModules = new Set(
1096
- builtinModules.concat(builtinModules.map((m) => `node:${m}`))
1097
- );
1098
1095
  function getOutputDirectory(userConfig, environmentName) {
1099
1096
  const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
1100
1097
  return userConfig.environments?.[environmentName]?.build?.outDir ?? path.join(rootOutputDirectory, environmentName);
@@ -1212,9 +1209,7 @@ function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmen
1212
1209
  // We want to use `workerd` package exports if available (e.g. for postgres).
1213
1210
  conditions: [...defaultConditions, "development|production"],
1214
1211
  // The Cloudflare ones are proper builtins in the environment
1215
- builtins: [...cloudflareBuiltInModules],
1216
- // The Node.js ones are no proper builtins in the environment since we also polyfill them using unenv
1217
- external: [...nodeBuiltInModules]
1212
+ builtins: [...cloudflareBuiltInModules]
1218
1213
  },
1219
1214
  dev: {
1220
1215
  createEnvironment(name2, config) {
@@ -1243,10 +1238,6 @@ function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmen
1243
1238
  // Note: ssr pre-bundling is opt-in and we need to enable it by setting `noDiscovery` to false
1244
1239
  noDiscovery: false,
1245
1240
  entries: workerConfig.main,
1246
- exclude: [
1247
- // we have to exclude all node modules to work in dev-mode not just the unenv externals...
1248
- ...nodeBuiltInModules
1249
- ],
1250
1241
  esbuildOptions: {
1251
1242
  platform: "neutral",
1252
1243
  conditions: [...defaultConditions, "development"],
@@ -1592,8 +1583,7 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer) {
1592
1583
  const moduleRE = new RegExp(MODULE_PATTERN);
1593
1584
  const shouldExternalize = (
1594
1585
  // Worker modules (CompiledWasm, Text, Data)
1595
- moduleRE.test(moduleId) || // Node.js builtin node modules (they will be resolved to unenv aliases)
1596
- nodeBuiltInModules.has(moduleId)
1586
+ moduleRE.test(moduleId)
1597
1587
  );
1598
1588
  if (shouldExternalize) {
1599
1589
  const result2 = {
@@ -7313,7 +7303,7 @@ Parser.acorn = {
7313
7303
  };
7314
7304
 
7315
7305
  // ../../node_modules/.pnpm/mlly@1.7.4/node_modules/mlly/dist/index.mjs
7316
- import { builtinModules as builtinModules2, createRequire } from "node:module";
7306
+ import { builtinModules, createRequire } from "node:module";
7317
7307
  import fs3, { realpathSync, statSync as statSync2, promises } from "node:fs";
7318
7308
 
7319
7309
  // ../../node_modules/.pnpm/ufo@1.5.4/node_modules/ufo/dist/index.mjs
@@ -7376,7 +7366,7 @@ import process$1 from "node:process";
7376
7366
  import path4, { dirname as dirname3 } from "node:path";
7377
7367
  import v8 from "node:v8";
7378
7368
  import { format as format2, inspect } from "node:util";
7379
- var BUILTIN_MODULES = new Set(builtinModules2);
7369
+ var BUILTIN_MODULES = new Set(builtinModules);
7380
7370
  function normalizeSlash(path8) {
7381
7371
  return path8.replace(/\\/g, "/");
7382
7372
  }
@@ -8490,7 +8480,7 @@ function parsePackageName(specifier, base) {
8490
8480
  return { packageName, packageSubpath, isScoped };
8491
8481
  }
8492
8482
  function packageResolve(specifier, base, conditions) {
8493
- if (builtinModules2.includes(specifier)) {
8483
+ if (builtinModules.includes(specifier)) {
8494
8484
  return new URL$1("node:" + specifier);
8495
8485
  }
8496
8486
  const { packageName, packageSubpath, isScoped } = parsePackageName(
@@ -8577,7 +8567,7 @@ function moduleResolve(specifier, base, conditions, preserveSymlinks) {
8577
8567
  try {
8578
8568
  resolved = new URL$1(specifier);
8579
8569
  } catch (error_) {
8580
- if (isRemote && !builtinModules2.includes(specifier)) {
8570
+ if (isRemote && !builtinModules.includes(specifier)) {
8581
8571
  const error = new ERR_UNSUPPORTED_RESOLVE_REQUEST(specifier, base);
8582
8572
  error.cause = error_;
8583
8573
  throw error;
@@ -8722,7 +8712,6 @@ var { env } = defineEnv({
8722
8712
  nodeCompat: true,
8723
8713
  presets: [cloudflare]
8724
8714
  });
8725
- var CLOUDFLARE_VIRTUAL_PREFIX = "\0__CLOUDFLARE_NODEJS_COMPAT__";
8726
8715
  function isNodeCompat(workerConfig) {
8727
8716
  if (workerConfig === void 0) {
8728
8717
  return false;
@@ -8746,16 +8735,39 @@ function isNodeCompat(workerConfig) {
8746
8735
  }
8747
8736
  return false;
8748
8737
  }
8738
+ function getNodeCompatEntries() {
8739
+ const entries = new Set(Object.values(env.alias));
8740
+ for (const globalInject of Object.values(env.inject)) {
8741
+ if (typeof globalInject === "string") {
8742
+ entries.add(globalInject);
8743
+ } else {
8744
+ assert6(
8745
+ globalInject[0] !== void 0,
8746
+ "Expected first element of globalInject to be defined"
8747
+ );
8748
+ entries.add(globalInject[0]);
8749
+ }
8750
+ }
8751
+ for (const external of env.external) {
8752
+ entries.delete(external);
8753
+ }
8754
+ return entries;
8755
+ }
8749
8756
  function injectGlobalCode(id, code) {
8750
8757
  const injectedCode = Object.entries(env.inject).map(([globalName, globalInject]) => {
8751
8758
  if (typeof globalInject === "string") {
8752
8759
  const moduleSpecifier2 = globalInject;
8753
- return `import var_${globalName} from "${CLOUDFLARE_VIRTUAL_PREFIX}${moduleSpecifier2}";
8760
+ return `import var_${globalName} from "${moduleSpecifier2}";
8754
8761
  globalThis.${globalName} = var_${globalName};
8755
8762
  `;
8756
8763
  }
8757
8764
  const [moduleSpecifier, exportName] = globalInject;
8758
- return `import var_${globalName} from "${CLOUDFLARE_VIRTUAL_PREFIX}${moduleSpecifier}";
8765
+ assert6(
8766
+ moduleSpecifier !== void 0,
8767
+ "Expected moduleSpecifier to be defined"
8768
+ );
8769
+ assert6(exportName !== void 0, "Expected exportName to be defined");
8770
+ return `import var_${globalName} from "${moduleSpecifier}";
8759
8771
  globalThis.${globalName} = var_${globalName}.${exportName};
8760
8772
  `;
8761
8773
  }).join("\n");
@@ -8766,37 +8778,17 @@ globalThis.${globalName} = var_${globalName}.${exportName};
8766
8778
  map: modified.generateMap({ hires: "boundary", source: id })
8767
8779
  };
8768
8780
  }
8769
- function getNodeCompatAliases() {
8770
- const aliases = {};
8771
- Object.keys(env.alias).forEach((key) => {
8772
- if (!env.external.includes(key)) {
8773
- aliases[key] = CLOUDFLARE_VIRTUAL_PREFIX + key;
8774
- }
8775
- });
8776
- return aliases;
8777
- }
8778
8781
  function getNodeCompatExternals() {
8779
8782
  return env.external;
8780
8783
  }
8781
- function maybeStripNodeJsVirtualPrefix(source) {
8782
- return source.startsWith(CLOUDFLARE_VIRTUAL_PREFIX) ? source.slice(CLOUDFLARE_VIRTUAL_PREFIX.length) : void 0;
8783
- }
8784
8784
  function resolveNodeJSImport(source) {
8785
8785
  const alias = env.alias[source];
8786
8786
  if (alias) {
8787
- assert6(
8788
- !env.external.includes(alias),
8789
- `Unexpected unenv alias to external module: ${source} -> ${alias}`
8790
- );
8791
- source = alias;
8787
+ return {
8788
+ unresolved: alias,
8789
+ resolved: resolvePathSync(alias, { url: import.meta.url })
8790
+ };
8792
8791
  }
8793
- const resolved = resolvePathSync(source, {
8794
- url: import.meta.url
8795
- });
8796
- return {
8797
- unresolved: source,
8798
- resolved
8799
- };
8800
8792
  }
8801
8793
 
8802
8794
  // src/plugin-config.ts
@@ -9465,49 +9457,56 @@ function cloudflare2(pluginConfig = {}) {
9465
9457
  apply(_config, env2) {
9466
9458
  return !env2.isPreview;
9467
9459
  },
9468
- config() {
9469
- return {
9470
- resolve: {
9471
- alias: getNodeCompatAliases()
9472
- }
9473
- };
9474
- },
9475
- configEnvironment(environmentName) {
9476
- const workerConfig = getWorkerConfig2(environmentName);
9477
- if (isNodeCompat(workerConfig)) {
9460
+ configEnvironment(name2) {
9461
+ if (isNodeCompat(getWorkerConfig2(name2))) {
9478
9462
  return {
9479
- build: {
9480
- rollupOptions: {
9481
- external: getNodeCompatExternals()
9482
- }
9463
+ resolve: {
9464
+ builtins: getNodeCompatExternals()
9465
+ },
9466
+ optimizeDeps: {
9467
+ // This is a list of dependency entry-points that should be pre-bundled.
9468
+ // In this case we provide a list of all the possible polyfills so that they are pre-bundled,
9469
+ // ready ahead the first request to the dev server.
9470
+ // Without this the dependency optimizer will try to bundle them on-the-fly in the middle of the first request,
9471
+ // which can potentially cause problems if it leads to previous pre-bundling to become stale and needing to be reloaded.
9472
+ include: [...getNodeCompatEntries()],
9473
+ // This is a list of module specifiers that the dependency optimizer should not follow when doing import analysis.
9474
+ // In this case we provide a list of all the Node.js modules, both those built-in to workerd and those that will be polyfilled.
9475
+ // Obviously we don't want/need the optimizer to try to process modules that are built-in;
9476
+ // But also we want to avoid following the ones that are polyfilled since the dependency-optimizer import analyzer does not
9477
+ // resolve these imports using our `resolveId()` hook causing the optimization step to fail.
9478
+ exclude: [
9479
+ ...builtinModules2,
9480
+ ...builtinModules2.map((m) => `node:${m}`)
9481
+ ]
9483
9482
  }
9484
9483
  };
9485
9484
  }
9486
9485
  },
9486
+ applyToEnvironment(environment) {
9487
+ return isNodeCompat(getWorkerConfig2(environment.name));
9488
+ },
9489
+ // We need the resolver from this plugin to run before built-in ones, otherwise Vite's built-in
9490
+ // resolver will try to externalize the Node.js module imports (e.g. `perf_hooks` and `node:tty`)
9491
+ // rather than allowing the resolve hook here to alias then to polyfills.
9492
+ enforce: "pre",
9487
9493
  async resolveId(source, importer, options) {
9488
- const strippedSource = maybeStripNodeJsVirtualPrefix(source);
9489
- if (!strippedSource) {
9490
- return;
9491
- }
9492
- const workerConfig = getWorkerConfig2(this.environment.name);
9493
- if (!isNodeCompat(workerConfig)) {
9494
- return this.resolve(strippedSource, importer, options);
9494
+ const result = resolveNodeJSImport(source);
9495
+ if (!result) {
9496
+ return this.resolve(source, importer, options);
9495
9497
  }
9496
- const { unresolved, resolved } = resolveNodeJSImport(strippedSource);
9497
- if (this.environment.mode === "dev" && this.environment.depsOptimizer) {
9498
- const optimized = this.environment.depsOptimizer.registerMissingImport(
9499
- unresolved,
9500
- resolved
9501
- ).id;
9502
- return this.resolve(optimized, importer, options);
9498
+ if (this.environment.mode === "dev") {
9499
+ assert9(
9500
+ this.environment.depsOptimizer,
9501
+ "depsOptimizer is required in dev mode"
9502
+ );
9503
+ return this.resolve(result.unresolved, importer, options);
9503
9504
  }
9504
- return this.resolve(resolved, importer, options);
9505
+ return this.resolve(result.resolved, importer, options);
9505
9506
  },
9506
9507
  async transform(code, id) {
9507
9508
  const workerConfig = getWorkerConfig2(this.environment.name);
9508
- if (!isNodeCompat(workerConfig)) {
9509
- return;
9510
- }
9509
+ assert9(workerConfig, "Expected a worker config");
9511
9510
  const resolvedId = await this.resolve(workerConfig.main);
9512
9511
  if (id === resolvedId?.id) {
9513
9512
  return injectGlobalCode(id, code);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/vite-plugin",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Cloudflare plugin for Vite",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -51,9 +51,9 @@
51
51
  "vite": "^6.1.0",
52
52
  "vitest": "~3.0.5",
53
53
  "@cloudflare/mock-npm-registry": "0.0.0",
54
- "@cloudflare/workers-shared": "0.14.3",
55
54
  "@cloudflare/workers-tsconfig": "0.0.0",
56
- "wrangler": "3.109.2"
55
+ "wrangler": "3.109.2",
56
+ "@cloudflare/workers-shared": "0.14.3"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "vite": "^6.1.0",