@distilled.cloud/cloudflare-rolldown-plugin 0.1.2 → 0.3.0

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/README.md CHANGED
@@ -5,7 +5,7 @@ Rolldown plugin for Cloudflare Workers.
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- bun add -d @distilled.cloud/cloudflare-rolldown-plugin rolldown
8
+ bun add @distilled.cloud/cloudflare-rolldown-plugin rolldown
9
9
  ```
10
10
 
11
11
  ## Usage
@@ -1,4 +1,4 @@
1
- import type { RolldownPluginOption } from "rolldown";
1
+ import type { Plugin } from "rolldown";
2
2
  import type { CloudflarePluginOptions } from "../plugin.js";
3
- export declare function makeNodejsCompatPlugin(options: CloudflarePluginOptions): RolldownPluginOption;
3
+ export declare function makeNodejsCompatPlugin(options: CloudflarePluginOptions): Plugin | Array<Plugin>;
4
4
  //# sourceMappingURL=nodejs-compat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodejs-compat.d.ts","sourceRoot":"","sources":["../../src/plugins/nodejs-compat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAM5D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,oBAAoB,CAK7F"}
1
+ {"version":3,"file":"nodejs-compat.d.ts","sourceRoot":"","sources":["../../src/plugins/nodejs-compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAM5D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAQ/F"}
@@ -1,15 +1,19 @@
1
1
  import { getCloudflarePreset, nonPrefixedNodeModules } from "@cloudflare/unenv-preset";
2
2
  import assert from "node:assert";
3
3
  import { createRequire } from "node:module";
4
+ import path from "node:path";
4
5
  import { esmExternalRequirePlugin } from "rolldown/plugins";
5
6
  import { defineEnv } from "unenv";
6
- import { hasNodejsCompat } from "../utils.js";
7
+ import { hasNodejsAls, hasNodejsCompat } from "../utils.js";
7
8
  const NODE_BUILTIN_MODULES_REGEXP = new RegExp(`^(${nonPrefixedNodeModules.join("|")}|node:.+)$`);
8
9
  const VIRTUAL_MODULE_ID_REGEXP = /^virtual:nodejs-global-inject\/.+$/;
9
10
  export function makeNodejsCompatPlugin(options) {
10
11
  if (hasNodejsCompat(options.compatibilityFlags)) {
11
12
  return makeUnenvPlugin(options);
12
13
  }
14
+ if (hasNodejsAls(options.compatibilityFlags)) {
15
+ return makeNodeJsAlsPlugin();
16
+ }
13
17
  return makeNodeJsImportWarningPlugin();
14
18
  }
15
19
  function makeUnenvPlugin(options) {
@@ -89,23 +93,37 @@ function makeUnenvPlugin(options) {
89
93
  },
90
94
  ];
91
95
  }
96
+ function makeNodeJsAlsPlugin() {
97
+ return {
98
+ name: "rolldown-plugin-cloudflare:nodejs-als",
99
+ resolveId: {
100
+ filter: { id: /^(node:)?async_hooks$/ },
101
+ handler(id) {
102
+ return { id, external: true };
103
+ },
104
+ },
105
+ };
106
+ }
92
107
  function makeNodeJsImportWarningPlugin() {
93
108
  const imports = new Map();
109
+ let root = process.cwd();
94
110
  return {
95
- name: "rolldown-plugin-cloudflare:nodejs-compat:import-warnings",
111
+ name: "rolldown-plugin-cloudflare:nodejs-import-warnings",
112
+ options(options) {
113
+ if (options.cwd) {
114
+ root = options.cwd;
115
+ }
116
+ },
96
117
  resolveId: {
97
118
  filter: { id: NODE_BUILTIN_MODULES_REGEXP },
98
- async handler(id, importer, options) {
99
- const resolved = await this.resolve(id, importer, options);
100
- if (!resolved) {
101
- if (importer) {
102
- if (!imports.has(id)) {
103
- imports.set(id, new Set());
104
- }
105
- imports.get(id)?.add(importer);
119
+ async handler(id, importer) {
120
+ if (importer) {
121
+ if (!imports.has(id)) {
122
+ imports.set(id, new Set());
106
123
  }
107
- return { id, external: true };
124
+ imports.get(id)?.add(importer);
108
125
  }
126
+ return { id, external: true };
109
127
  },
110
128
  },
111
129
  buildStart() {
@@ -113,12 +131,15 @@ function makeNodeJsImportWarningPlugin() {
113
131
  },
114
132
  buildEnd() {
115
133
  if (imports.size > 0) {
134
+ let message = `Unexpected Node.js imports. ` +
135
+ `Do you need to enable the "nodejs_compat" compatibility flag? ` +
136
+ "Refer to https://developers.cloudflare.com/workers/runtime-apis/nodejs/ for more details.\n";
116
137
  for (const [id, importers] of imports.entries()) {
117
- this.warn([
118
- `Node.js built-in module "${id}" was imported without \`nodejs_compat\`. Imported from:`,
119
- ...Array.from(importers).map((importer) => `- ${importer}`),
120
- ].join("\n"));
138
+ for (const importer of importers) {
139
+ message += ` - "${id}" imported from "${path.relative(root, importer)}"\n`;
140
+ }
121
141
  }
142
+ this.warn(message);
122
143
  }
123
144
  },
124
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"nodejs-compat.js","sourceRoot":"","sources":["../../src/plugins/nodejs-compat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodejs-compat.js","sourceRoot":"","sources":["../../src/plugins/nodejs-compat.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export declare function sanitizePath(path: string): string;
2
2
  export declare function hasNodejsCompat(flags?: ReadonlyArray<string>): boolean;
3
+ export declare function hasNodejsAls(flags?: ReadonlyArray<string>): boolean;
3
4
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtE;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAEnE"}
package/dist/utils.js CHANGED
@@ -5,4 +5,7 @@ export function sanitizePath(path) {
5
5
  export function hasNodejsCompat(flags) {
6
6
  return flags?.some((flag) => flag === "nodejs_compat" || flag === "nodejs_compat_v2") ?? false;
7
7
  }
8
+ export function hasNodejsAls(flags) {
9
+ return flags?.some((flag) => flag === "nodejs_als") ?? false;
10
+ }
8
11
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAA6B;IAC3D,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,kBAAkB,CAAC,IAAI,KAAK,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAA6B;IAC3D,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,kBAAkB,CAAC,IAAI,KAAK,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA6B;IACxD,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,KAAK,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@distilled.cloud/cloudflare-rolldown-plugin",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "description": "Rolldown plugin for Cloudflare Workers.",
5
5
  "keywords": [
6
6
  "cloudflare",
7
7
  "rolldown",
8
8
  "workers"
9
9
  ],
10
- "homepage": "https://github.com/alchemy-run/cloudflare-tools/tree/main/packages/rolldown-plugin-cloudflare#readme",
10
+ "homepage": "https://github.com/alchemy-run/cloudflare-tools/tree/main/packages/cloudflare-rolldown-plugin#readme",
11
11
  "bugs": {
12
12
  "url": "https://github.com/alchemy-run/cloudflare-tools/issues"
13
13
  },
@@ -43,6 +43,7 @@
43
43
  "scripts": {
44
44
  "build": "tsc",
45
45
  "clean": "rm -rf dist tsconfig.tsbuildinfo",
46
+ "dev": "tsc --watch",
46
47
  "test": "vitest run",
47
48
  "test:watch": "vitest",
48
49
  "typecheck": "tsc --noEmit",
@@ -53,9 +54,9 @@
53
54
  "unenv": "^2.0.0-rc.24"
54
55
  },
55
56
  "devDependencies": {
56
- "@cloudflare/workers-types": "catalog:",
57
- "miniflare": "^4.20260329.0",
58
- "vitest": "catalog:"
57
+ "@cloudflare/workers-types": "^4.20260310.1",
58
+ "@distilled.cloud/test-utils": "0.0.0",
59
+ "vitest": "^4.1.1"
59
60
  },
60
61
  "peerDependencies": {
61
62
  "rolldown": "^1.0.0-rc.9"
@@ -1,23 +1,27 @@
1
1
  import { getCloudflarePreset, nonPrefixedNodeModules } from "@cloudflare/unenv-preset";
2
2
  import assert from "node:assert";
3
3
  import { createRequire } from "node:module";
4
- import type { Plugin, RolldownPluginOption } from "rolldown";
4
+ import path from "node:path";
5
+ import type { Plugin } from "rolldown";
5
6
  import { esmExternalRequirePlugin } from "rolldown/plugins";
6
7
  import { defineEnv } from "unenv";
7
8
  import type { CloudflarePluginOptions } from "../plugin.js";
8
- import { hasNodejsCompat } from "../utils.js";
9
+ import { hasNodejsAls, hasNodejsCompat } from "../utils.js";
9
10
 
10
11
  const NODE_BUILTIN_MODULES_REGEXP = new RegExp(`^(${nonPrefixedNodeModules.join("|")}|node:.+)$`);
11
12
  const VIRTUAL_MODULE_ID_REGEXP = /^virtual:nodejs-global-inject\/.+$/;
12
13
 
13
- export function makeNodejsCompatPlugin(options: CloudflarePluginOptions): RolldownPluginOption {
14
+ export function makeNodejsCompatPlugin(options: CloudflarePluginOptions): Plugin | Array<Plugin> {
14
15
  if (hasNodejsCompat(options.compatibilityFlags)) {
15
16
  return makeUnenvPlugin(options);
16
17
  }
18
+ if (hasNodejsAls(options.compatibilityFlags)) {
19
+ return makeNodeJsAlsPlugin();
20
+ }
17
21
  return makeNodeJsImportWarningPlugin();
18
22
  }
19
23
 
20
- function makeUnenvPlugin(options: CloudflarePluginOptions): RolldownPluginOption {
24
+ function makeUnenvPlugin(options: CloudflarePluginOptions): Array<Plugin> {
21
25
  const { alias, inject, external, polyfill } = defineEnv({
22
26
  presets: [
23
27
  getCloudflarePreset({
@@ -96,23 +100,38 @@ function makeUnenvPlugin(options: CloudflarePluginOptions): RolldownPluginOption
96
100
  ];
97
101
  }
98
102
 
99
- function makeNodeJsImportWarningPlugin(): RolldownPluginOption {
103
+ function makeNodeJsAlsPlugin(): Plugin {
104
+ return {
105
+ name: "rolldown-plugin-cloudflare:nodejs-als",
106
+ resolveId: {
107
+ filter: { id: /^(node:)?async_hooks$/ },
108
+ handler(id) {
109
+ return { id, external: true };
110
+ },
111
+ },
112
+ };
113
+ }
114
+
115
+ function makeNodeJsImportWarningPlugin(): Plugin {
100
116
  const imports = new Map<string, Set<string>>();
117
+ let root = process.cwd();
101
118
  return {
102
- name: "rolldown-plugin-cloudflare:nodejs-compat:import-warnings",
119
+ name: "rolldown-plugin-cloudflare:nodejs-import-warnings",
120
+ options(options) {
121
+ if (options.cwd) {
122
+ root = options.cwd;
123
+ }
124
+ },
103
125
  resolveId: {
104
126
  filter: { id: NODE_BUILTIN_MODULES_REGEXP },
105
- async handler(id, importer, options) {
106
- const resolved = await this.resolve(id, importer, options);
107
- if (!resolved) {
108
- if (importer) {
109
- if (!imports.has(id)) {
110
- imports.set(id, new Set());
111
- }
112
- imports.get(id)?.add(importer);
127
+ async handler(id, importer) {
128
+ if (importer) {
129
+ if (!imports.has(id)) {
130
+ imports.set(id, new Set());
113
131
  }
114
- return { id, external: true };
132
+ imports.get(id)?.add(importer);
115
133
  }
134
+ return { id, external: true };
116
135
  },
117
136
  },
118
137
  buildStart() {
@@ -120,14 +139,16 @@ function makeNodeJsImportWarningPlugin(): RolldownPluginOption {
120
139
  },
121
140
  buildEnd() {
122
141
  if (imports.size > 0) {
142
+ let message =
143
+ `Unexpected Node.js imports. ` +
144
+ `Do you need to enable the "nodejs_compat" compatibility flag? ` +
145
+ "Refer to https://developers.cloudflare.com/workers/runtime-apis/nodejs/ for more details.\n";
123
146
  for (const [id, importers] of imports.entries()) {
124
- this.warn(
125
- [
126
- `Node.js built-in module "${id}" was imported without \`nodejs_compat\`. Imported from:`,
127
- ...Array.from(importers).map((importer) => `- ${importer}`),
128
- ].join("\n"),
129
- );
147
+ for (const importer of importers) {
148
+ message += ` - "${id}" imported from "${path.relative(root, importer)}"\n`;
149
+ }
130
150
  }
151
+ this.warn(message);
131
152
  }
132
153
  },
133
154
  };
package/src/utils.ts CHANGED
@@ -7,3 +7,7 @@ export function sanitizePath(path: string): string {
7
7
  export function hasNodejsCompat(flags?: ReadonlyArray<string>): boolean {
8
8
  return flags?.some((flag) => flag === "nodejs_compat" || flag === "nodejs_compat_v2") ?? false;
9
9
  }
10
+
11
+ export function hasNodejsAls(flags?: ReadonlyArray<string>): boolean {
12
+ return flags?.some((flag) => flag === "nodejs_als") ?? false;
13
+ }