@distilled.cloud/cloudflare-rolldown-plugin 0.3.0 → 0.4.1-beta.1

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 (71) hide show
  1. package/dist/factory.d.ts +19 -0
  2. package/dist/factory.d.ts.map +1 -0
  3. package/dist/factory.js +30 -0
  4. package/dist/factory.js.map +1 -0
  5. package/dist/options.d.ts +32 -0
  6. package/dist/options.d.ts.map +1 -0
  7. package/dist/options.js +1 -0
  8. package/dist/options.js.map +1 -0
  9. package/dist/plugin.d.ts +3 -6
  10. package/dist/plugin.d.ts.map +1 -1
  11. package/dist/plugin.js +10 -11
  12. package/dist/plugin.js.map +1 -1
  13. package/dist/plugins/additional-modules.d.ts +11 -2
  14. package/dist/plugins/additional-modules.d.ts.map +1 -1
  15. package/dist/plugins/additional-modules.js +68 -54
  16. package/dist/plugins/additional-modules.js.map +1 -1
  17. package/dist/plugins/cloudflare-externals.d.ts +1 -2
  18. package/dist/plugins/cloudflare-externals.d.ts.map +1 -1
  19. package/dist/plugins/cloudflare-externals.js +37 -15
  20. package/dist/plugins/cloudflare-externals.js.map +1 -1
  21. package/dist/plugins/dev.d.ts +2 -0
  22. package/dist/plugins/dev.d.ts.map +1 -0
  23. package/dist/plugins/dev.js +1 -0
  24. package/dist/plugins/dev.js.map +1 -0
  25. package/dist/plugins/index.d.ts +7 -0
  26. package/dist/plugins/index.d.ts.map +1 -0
  27. package/dist/plugins/index.js +7 -0
  28. package/dist/plugins/index.js.map +1 -0
  29. package/dist/plugins/nodejs-als.d.ts +2 -0
  30. package/dist/plugins/nodejs-als.d.ts.map +1 -0
  31. package/dist/plugins/nodejs-als.js +32 -0
  32. package/dist/plugins/nodejs-als.js.map +1 -0
  33. package/dist/plugins/nodejs-compat.d.ts +9 -3
  34. package/dist/plugins/nodejs-compat.d.ts.map +1 -1
  35. package/dist/plugins/nodejs-compat.js +187 -115
  36. package/dist/plugins/nodejs-compat.js.map +1 -1
  37. package/dist/plugins/nodejs-import-warning.d.ts +2 -0
  38. package/dist/plugins/nodejs-import-warning.d.ts.map +1 -0
  39. package/dist/plugins/nodejs-import-warning.js +62 -0
  40. package/dist/plugins/nodejs-import-warning.js.map +1 -0
  41. package/dist/plugins/nodejs-unenv.d.ts +8 -0
  42. package/dist/plugins/nodejs-unenv.d.ts.map +1 -0
  43. package/dist/plugins/nodejs-unenv.js +133 -0
  44. package/dist/plugins/nodejs-unenv.js.map +1 -0
  45. package/dist/plugins/options.d.ts +1 -5
  46. package/dist/plugins/options.d.ts.map +1 -1
  47. package/dist/plugins/options.js +155 -23
  48. package/dist/plugins/options.js.map +1 -1
  49. package/dist/plugins/virtual-modules.d.ts +3 -0
  50. package/dist/plugins/virtual-modules.d.ts.map +1 -0
  51. package/dist/plugins/virtual-modules.js +126 -0
  52. package/dist/plugins/virtual-modules.js.map +1 -0
  53. package/dist/plugins/wasm-init.d.ts +1 -2
  54. package/dist/plugins/wasm-init.d.ts.map +1 -1
  55. package/dist/plugins/wasm-init.js +18 -13
  56. package/dist/plugins/wasm-init.js.map +1 -1
  57. package/dist/plugins/wasm-init.plugin.d.ts +2 -0
  58. package/dist/plugins/wasm-init.plugin.d.ts.map +1 -0
  59. package/dist/plugins/wasm-init.plugin.js +20 -0
  60. package/dist/plugins/wasm-init.plugin.js.map +1 -0
  61. package/package.json +16 -1
  62. package/src/factory.ts +60 -0
  63. package/src/options.ts +31 -0
  64. package/src/plugin.ts +22 -18
  65. package/src/plugins/additional-modules.ts +90 -56
  66. package/src/plugins/cloudflare-externals.ts +37 -16
  67. package/src/plugins/index.ts +6 -0
  68. package/src/plugins/nodejs-compat.ts +206 -140
  69. package/src/plugins/options.ts +172 -26
  70. package/src/plugins/virtual-modules.ts +137 -0
  71. package/src/plugins/wasm-init.ts +18 -14
@@ -1,5 +1,17 @@
1
+ import path from "node:path";
2
+ import { createPlugin } from "../factory.js";
1
3
  import { hasNodejsCompat } from "../utils.js";
2
- const DEFAULT_RESOLVE_CONDITION_NAMES = ["workerd", "worker", "module", "browser", "production"];
4
+ import { WORKER_ENTRY_PREFIX } from "./virtual-modules.js";
5
+ function getConditions(options) {
6
+ return hasNodejsCompat(options.compatibilityFlags)
7
+ ? ["workerd", "worker", "node", "module"]
8
+ : ["workerd", "worker", "module", "browser"];
9
+ }
10
+ function getMainFields(options) {
11
+ return hasNodejsCompat(options.compatibilityFlags)
12
+ ? ["module", "main", "jsnext:main", "jsnext"]
13
+ : ["browser", "module", "jsnext:main", "jsnext"];
14
+ }
3
15
  const DEFAULT_RESOLVE_EXTENSIONS = [
4
16
  ".mjs",
5
17
  ".js",
@@ -12,36 +24,156 @@ const DEFAULT_RESOLVE_EXTENSIONS = [
12
24
  ".cts",
13
25
  ".ctx",
14
26
  ];
15
- export function makeOptionsPlugin(pluginOptions) {
16
- return {
17
- name: "rolldown-plugin-cloudflare:options",
27
+ const TARGET = "es2024";
28
+ export const optionsPlugin = createPlugin("options", (pluginOptions) => ({
29
+ rolldown: {
18
30
  options(options) {
31
+ options.input = wrapEntryInput(pluginOptions.main ?? options.input ?? {});
32
+ options.preserveEntrySignatures ??= "strict";
19
33
  options.platform ??= "neutral";
20
34
  options.resolve ??= {};
21
- options.resolve.conditionNames ??= DEFAULT_RESOLVE_CONDITION_NAMES;
35
+ options.resolve.conditionNames ??= [...getConditions(pluginOptions), "production"];
36
+ options.resolve.mainFields ??= getMainFields(pluginOptions);
22
37
  options.resolve.extensions ??= DEFAULT_RESOLVE_EXTENSIONS;
23
38
  options.transform ??= {};
24
- options.transform.target ??= "es2024";
39
+ options.transform.target ??= TARGET;
25
40
  options.transform.define ??= {};
26
- Object.assign(options.transform.define, {
27
- "process.env.NODE_ENV": '"production"',
28
- "global.process.env.NODE_ENV": '"production"',
29
- "globalThis.process.env.NODE_ENV": '"production"',
30
- ...(hasNodejsCompat(pluginOptions.compatibilityFlags)
31
- ? {}
32
- : {
33
- "process.env": "{}",
34
- "global.process.env": "{}",
35
- "globalThis.process.env": "{}",
36
- }),
37
- ...(pluginOptions.compatibilityDate && pluginOptions.compatibilityDate >= "2022-03-21"
38
- ? {
39
- "navigator.userAgent": '"Cloudflare-Workers"',
40
- }
41
- : {}),
42
- });
41
+ Object.assign(options.transform.define, getDefine(pluginOptions, "production"));
43
42
  return options;
44
43
  },
44
+ },
45
+ vite: {
46
+ async config(userConfig) {
47
+ const vite = await import("vite");
48
+ const isRolldown = "rolldownVersion" in this.meta;
49
+ const input = pluginOptions.main ??
50
+ userConfig.environments?.ssr?.build?.rolldownOptions?.input ??
51
+ userConfig.environments?.ssr?.build?.rollupOptions?.input;
52
+ const rollupOptions = {
53
+ input: wrapEntryInput(input ?? {}),
54
+ preserveEntrySignatures: "strict",
55
+ };
56
+ const define = getDefine(pluginOptions, process.env.NODE_ENV || userConfig.mode || "production");
57
+ const conditions = getConditions(pluginOptions);
58
+ const mainFields = getMainFields(pluginOptions);
59
+ return {
60
+ appType: "custom",
61
+ ssr: {
62
+ noExternal: true,
63
+ resolve: {
64
+ conditions: [...conditions, "development|production"],
65
+ },
66
+ },
67
+ builder: {
68
+ buildApp: async (app) => {
69
+ await app.build(app.environments.ssr);
70
+ await app.build(app.environments.client);
71
+ },
72
+ },
73
+ environments: {
74
+ client: {
75
+ build: {
76
+ outDir: getOutputDirectory(userConfig, "client"),
77
+ },
78
+ },
79
+ ssr: {
80
+ resolve: {
81
+ noExternal: true,
82
+ conditions: [...conditions, "development|production"],
83
+ },
84
+ build: {
85
+ ssr: true,
86
+ target: TARGET,
87
+ emitAssets: true,
88
+ copyPublicDir: false,
89
+ outDir: getOutputDirectory(userConfig, "ssr"),
90
+ ...(isRolldown
91
+ ? {
92
+ rolldownOptions: {
93
+ ...rollupOptions,
94
+ platform: "neutral",
95
+ resolve: {
96
+ mainFields,
97
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
98
+ },
99
+ },
100
+ }
101
+ : { rollupOptions }),
102
+ },
103
+ optimizeDeps: {
104
+ noDiscovery: false,
105
+ ignoreOutdatedRequests: true,
106
+ entries: pluginOptions.main ? vite.normalizePath(pluginOptions.main) : undefined,
107
+ ...(isRolldown
108
+ ? {
109
+ rolldownOptions: {
110
+ platform: "neutral",
111
+ resolve: {
112
+ conditionNames: [...conditions, "development|production"],
113
+ mainFields,
114
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
115
+ },
116
+ transform: {
117
+ target: TARGET,
118
+ define,
119
+ },
120
+ },
121
+ }
122
+ : {
123
+ esbuildOptions: {
124
+ platform: "neutral",
125
+ conditions: [...conditions, "development|production"],
126
+ resolveExtensions: DEFAULT_RESOLVE_EXTENSIONS,
127
+ mainFields,
128
+ target: TARGET,
129
+ define,
130
+ },
131
+ }),
132
+ },
133
+ keepProcessEnv: true,
134
+ },
135
+ },
136
+ };
137
+ },
138
+ },
139
+ }));
140
+ function wrapEntryInput(input) {
141
+ const virtualEntryId = (id) => `${WORKER_ENTRY_PREFIX}${id}`;
142
+ if (typeof input === "string") {
143
+ return { [path.parse(input).name || "index"]: virtualEntryId(input) };
144
+ }
145
+ if (Array.isArray(input)) {
146
+ return Object.fromEntries(input.map((p) => [path.parse(p).name, virtualEntryId(p)]));
147
+ }
148
+ return Object.fromEntries(Object.entries(input).map(([key, value]) => [key, virtualEntryId(value)]));
149
+ }
150
+ function getDefine(options, nodeEnv) {
151
+ return {
152
+ "process.env.NODE_ENV": JSON.stringify(nodeEnv),
153
+ "global.process.env.NODE_ENV": JSON.stringify(nodeEnv),
154
+ "globalThis.process.env.NODE_ENV": JSON.stringify(nodeEnv),
155
+ ...(hasNodejsCompat(options.compatibilityFlags)
156
+ ? {}
157
+ : {
158
+ "process.env": "{}",
159
+ "global.process.env": "{}",
160
+ "globalThis.process.env": "{}",
161
+ }),
162
+ ...(options.compatibilityDate && options.compatibilityDate >= "2022-03-21"
163
+ ? {
164
+ "navigator.userAgent": '"Cloudflare-Workers"',
165
+ }
166
+ : {}),
167
+ ...(nodeEnv === "production"
168
+ ? {
169
+ "import.meta.hot": "false",
170
+ }
171
+ : {}),
45
172
  };
46
173
  }
174
+ function getOutputDirectory(userConfig, environmentName) {
175
+ const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
176
+ return (userConfig.environments?.[environmentName]?.build?.outDir ??
177
+ path.join(rootOutputDirectory, environmentName));
178
+ }
47
179
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,+BAA+B,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAEjG,MAAM,0BAA0B,GAAG;IACjC,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,aAAsC;IACtE,OAAO;QACL,IAAI,EAAE,oCAAoC;QAC1C,OAAO,CAAC,OAAO;YACb,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;YAC/B,OAAO,CAAC,OAAO,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,cAAc,KAAK,+BAA+B,CAAC;YACnE,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,0BAA0B,CAAC;YAC1D,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC;YACtC,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE;gBACtC,sBAAsB,EAAE,cAAc;gBACtC,6BAA6B,EAAE,cAAc;gBAC7C,iCAAiC,EAAE,cAAc;gBACjD,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC;oBACnD,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE,aAAa,EAAE,IAAI;wBACnB,oBAAoB,EAAE,IAAI;wBAC1B,wBAAwB,EAAE,IAAI;qBAC/B,CAAC;gBACN,GAAG,CAAC,aAAa,CAAC,iBAAiB,IAAI,aAAa,CAAC,iBAAiB,IAAI,YAAY;oBACpF,CAAC,CAAC;wBACE,qBAAqB,EAAE,sBAAsB;qBAC9C;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC;KACe,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const WORKER_ENTRY_PREFIX: "\0distilled:worker-entry:";
2
+ export declare const virtualModulesPlugin: import("../factory.js").PluginOutput<any>;
3
+ //# sourceMappingURL=virtual-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-modules.d.ts","sourceRoot":"","sources":["../../src/plugins/virtual-modules.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,mBAAmB,EAAG,2BAAoC,CAAC;AAKxE,eAAO,MAAM,oBAAoB,2CA4H/B,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { createPlugin } from "../factory.js";
2
+ // oxlint-disable-next-line no-control-regex
3
+ const VIRTUAL_MODULE_REGEXP = /^\0distilled:.*$/;
4
+ export const WORKER_ENTRY_PREFIX = "\0distilled:worker-entry:";
5
+ const USER_ENTRY_PREFIX = "\0distilled:user-entry:";
6
+ const INJECT_PREFIX = "\0distilled:inject:";
7
+ const EXPORT_TYPES_ID = "\0distilled:export-types";
8
+ export const virtualModulesPlugin = createPlugin("virtual-modules", (options) => {
9
+ let unenvApi;
10
+ const inject = () => {
11
+ if (!unenvApi)
12
+ return [];
13
+ return [
14
+ ...unenvApi.polyfill.map((module) => `import "${module}";`),
15
+ ...Object.keys(unenvApi.inject).map((injectedName) => `import "${INJECT_PREFIX}${injectedName}";`),
16
+ ];
17
+ };
18
+ return {
19
+ vite: {
20
+ enforce: "pre",
21
+ },
22
+ shared: {
23
+ buildStart({ plugins }) {
24
+ unenvApi = plugins.find((plugin) => "name" in plugin && plugin.name === "distilled-cloudflare:nodejs-unenv")?.api;
25
+ },
26
+ resolveId: {
27
+ filter: { id: VIRTUAL_MODULE_REGEXP },
28
+ handler(id) {
29
+ if (id.startsWith(WORKER_ENTRY_PREFIX) ||
30
+ id.startsWith(INJECT_PREFIX) ||
31
+ id === EXPORT_TYPES_ID) {
32
+ return { id };
33
+ }
34
+ if (id.startsWith(USER_ENTRY_PREFIX)) {
35
+ return this.resolve(id.slice(USER_ENTRY_PREFIX.length), undefined, {
36
+ isEntry: false,
37
+ kind: "import-statement",
38
+ });
39
+ }
40
+ },
41
+ },
42
+ load: {
43
+ filter: { id: VIRTUAL_MODULE_REGEXP },
44
+ handler(id) {
45
+ if (id.startsWith(WORKER_ENTRY_PREFIX)) {
46
+ const userEntryId = id.replace(WORKER_ENTRY_PREFIX, USER_ENTRY_PREFIX);
47
+ return [
48
+ ...inject(),
49
+ ...(options.exports
50
+ ? [`export { ${options.exports.join(", ")} } from "${userEntryId}";`]
51
+ : [
52
+ `import * as userEntry from "${userEntryId}";`,
53
+ `export * from "${userEntryId}";`,
54
+ `export default userEntry.default ?? {};`,
55
+ ]),
56
+ "if (import.meta.hot) {",
57
+ ` const { getExportTypes } = await import("${EXPORT_TYPES_ID}");`,
58
+ " import.meta.hot.accept((module) => {",
59
+ " const exportTypes = getExportTypes(module);",
60
+ ' import.meta.hot.send("distilled-cloudflare:worker-export-types", exportTypes);',
61
+ " });",
62
+ "}",
63
+ ].join("\n");
64
+ }
65
+ if (id === EXPORT_TYPES_ID) {
66
+ return `
67
+ import {
68
+ WorkerEntrypoint,
69
+ DurableObject,
70
+ WorkflowEntrypoint,
71
+ } from "cloudflare:workers";
72
+
73
+ const baseClasses = new Map([
74
+ ["WorkerEntrypoint", WorkerEntrypoint],
75
+ ["DurableObject", DurableObject],
76
+ ["WorkflowEntrypoint", WorkflowEntrypoint],
77
+ ]);
78
+
79
+ export function getExportTypes(module) {
80
+ const exportTypes = {};
81
+
82
+ for (const [key, value] of Object.entries(module)) {
83
+ if (key === "default") {
84
+ continue;
85
+ }
86
+
87
+ let exportType;
88
+
89
+ if (typeof value === "function") {
90
+ for (const [type, baseClass] of baseClasses) {
91
+ if (baseClass.prototype.isPrototypeOf(value.prototype)) {
92
+ exportType = type;
93
+ break;
94
+ }
95
+ }
96
+
97
+ if (!exportType) {
98
+ exportType = "DurableObject";
99
+ }
100
+ } else if (typeof value === "object" && value !== null) {
101
+ exportType = "WorkerEntrypoint";
102
+ }
103
+
104
+ exportTypes[key] = exportType;
105
+ }
106
+
107
+ return exportTypes;
108
+ }`;
109
+ }
110
+ if (id.startsWith(INJECT_PREFIX)) {
111
+ const injectedName = id.slice(INJECT_PREFIX.length);
112
+ const moduleSpecifier = unenvApi?.inject[injectedName];
113
+ if (!moduleSpecifier) {
114
+ throw new Error(`Expected module specifier for "${injectedName}" to be defined`);
115
+ }
116
+ return [
117
+ `import ${injectedName} from "${moduleSpecifier}";`,
118
+ `globalThis.${injectedName} = ${injectedName};`,
119
+ ].join("\n");
120
+ }
121
+ },
122
+ },
123
+ },
124
+ };
125
+ });
126
+ //# sourceMappingURL=virtual-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-modules.js","sourceRoot":"","sources":["../../src/plugins/virtual-modules.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,2 @@
1
- import type { Plugin } from "rolldown";
2
- export declare const wasmInitPlugin: Plugin;
1
+ export declare const wasmInitPlugin: import("../factory.js").PluginOutput<any>;
3
2
  //# sourceMappingURL=wasm-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-init.d.ts","sourceRoot":"","sources":["../../src/plugins/wasm-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKvC,eAAO,MAAM,cAAc,EAAE,MAc5B,CAAC"}
1
+ {"version":3,"file":"wasm-init.d.ts","sourceRoot":"","sources":["../../src/plugins/wasm-init.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,2CAkBxB,CAAC"}
@@ -1,18 +1,23 @@
1
+ import { createPlugin } from "../factory.js";
1
2
  import { sanitizePath } from "../utils.js";
2
3
  const WASM_INIT_QUERY = /\.wasm\?init$/;
3
- export const wasmInitPlugin = {
4
- name: "rolldown-plugin-cloudflare:wasm-init",
5
- load: {
6
- filter: { id: WASM_INIT_QUERY },
7
- handler(id) {
8
- return [
9
- `import wasmModule from "${sanitizePath(id)}";`,
10
- `export default async (imports) => {`,
11
- ` const result = await WebAssembly.instantiate(wasmModule, imports);`,
12
- ` return "instance" in result ? result.instance : result;`,
13
- `};`,
14
- ].join("\n");
4
+ export const wasmInitPlugin = createPlugin("wasm-init", () => ({
5
+ vite: {
6
+ enforce: "pre",
7
+ },
8
+ shared: {
9
+ load: {
10
+ filter: { id: WASM_INIT_QUERY },
11
+ handler(id) {
12
+ return [
13
+ `import wasmModule from "${sanitizePath(id)}";`,
14
+ `export default async (imports) => {`,
15
+ ` const result = await WebAssembly.instantiate(wasmModule, imports);`,
16
+ ` return "instance" in result ? result.instance : result;`,
17
+ `};`,
18
+ ].join("\n");
19
+ },
15
20
  },
16
21
  },
17
- };
22
+ }));
18
23
  //# sourceMappingURL=wasm-init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-init.js","sourceRoot":"","sources":["../../src/plugins/wasm-init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,sCAAsC;IAC5C,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE;QAC/B,OAAO,CAAC,EAAE;YACR,OAAO;gBACL,2BAA2B,YAAY,CAAC,EAAE,CAAC,IAAI;gBAC/C,qCAAqC;gBACrC,sEAAsE;gBACtE,2DAA2D;gBAC3D,IAAI;aACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"wasm-init.js","sourceRoot":"","sources":["../../src/plugins/wasm-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE;YAC/B,OAAO,CAAC,EAAE;gBACR,OAAO;oBACL,2BAA2B,YAAY,CAAC,EAAE,CAAC,IAAI;oBAC/C,qCAAqC;oBACrC,sEAAsE;oBACtE,2DAA2D;oBAC3D,IAAI;iBACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;SACF;KACF;CACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const wasmInitPlugin: import("../factory.js").PluginOutput<any>;
2
+ //# sourceMappingURL=wasm-init.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-init.plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/wasm-init.plugin.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,2CAexB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { createPlugin } from "../factory.js";
2
+ import { sanitizePath } from "../utils.js";
3
+ const WASM_INIT_QUERY = /\.wasm\?init$/;
4
+ export const wasmInitPlugin = createPlugin("wasm-init", () => ({
5
+ shared: {
6
+ load: {
7
+ filter: { id: WASM_INIT_QUERY },
8
+ handler(id) {
9
+ return [
10
+ `import wasmModule from "${sanitizePath(id)}";`,
11
+ `export default async (imports) => {`,
12
+ ` const result = await WebAssembly.instantiate(wasmModule, imports);`,
13
+ ` return "instance" in result ? result.instance : result;`,
14
+ `};`,
15
+ ].join("\n");
16
+ },
17
+ },
18
+ },
19
+ }));
20
+ //# sourceMappingURL=wasm-init.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-init.plugin.js","sourceRoot":"","sources":["../../src/plugins/wasm-init.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE;YAC/B,OAAO,CAAC,EAAE;gBACR,OAAO;oBACL,2BAA2B,YAAY,CAAC,EAAE,CAAC,IAAI;oBAC/C,qCAAqC;oBACrC,sEAAsE;oBACtE,2DAA2D;oBAC3D,IAAI;iBACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;SACF;KACF;CACF,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@distilled.cloud/cloudflare-rolldown-plugin",
3
- "version": "0.3.0",
3
+ "version": "0.4.1-beta.1",
4
4
  "description": "Rolldown plugin for Cloudflare Workers.",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -35,6 +35,14 @@
35
35
  "bun": "./src/plugin.ts",
36
36
  "types": "./dist/plugin.d.ts",
37
37
  "import": "./dist/plugin.js"
38
+ },
39
+ "./plugins": {
40
+ "types": "./dist/plugins/index.d.ts",
41
+ "import": "./dist/plugins/index.js"
42
+ },
43
+ "./options": {
44
+ "types": "./dist/options.d.ts",
45
+ "import": "./dist/options.js"
38
46
  }
39
47
  },
40
48
  "publishConfig": {
@@ -51,14 +59,21 @@
51
59
  },
52
60
  "dependencies": {
53
61
  "@cloudflare/unenv-preset": "^2.16.0",
62
+ "magic-string": "^0.30.21",
54
63
  "unenv": "^2.0.0-rc.24"
55
64
  },
56
65
  "devDependencies": {
57
66
  "@cloudflare/workers-types": "^4.20260310.1",
58
67
  "@distilled.cloud/test-utils": "0.0.0",
68
+ "vite": "^8.0.3",
59
69
  "vitest": "^4.1.1"
60
70
  },
61
71
  "peerDependencies": {
62
72
  "rolldown": "^1.0.0-rc.9"
73
+ },
74
+ "peerDependenciesMeta": {
75
+ "rolldown": {
76
+ "optional": true
77
+ }
63
78
  }
64
79
  }
package/src/factory.ts ADDED
@@ -0,0 +1,60 @@
1
+ import type * as rolldown from "rolldown";
2
+ import type * as vite from "vite";
3
+ import type { CloudflarePluginOptions } from "./options.js";
4
+
5
+ export interface PluginInput<A = any> {
6
+ shared?: Omit<rolldown.Plugin<A>, "name">;
7
+ rolldown?: Omit<rolldown.Plugin<A>, "name">;
8
+ vite?: Omit<vite.Plugin<A>, "name">;
9
+ }
10
+
11
+ export interface NullablePluginOutput<A = any> {
12
+ rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A> | null;
13
+ vite: (options: CloudflarePluginOptions) => vite.Plugin<A> | null;
14
+ }
15
+
16
+ export interface PluginOutput<A = any> {
17
+ rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A>;
18
+ vite: (options: CloudflarePluginOptions) => vite.Plugin<A>;
19
+ }
20
+
21
+ export function createPlugin<TName extends string, A = any>(
22
+ pluginName: TName,
23
+ make: (options: CloudflarePluginOptions) => PluginInput<A>,
24
+ ): PluginOutput<A>;
25
+
26
+ export function createPlugin<TName extends string, A = any>(
27
+ pluginName: TName,
28
+ make: (options: CloudflarePluginOptions) => PluginInput<A> | undefined,
29
+ ): NullablePluginOutput<A>;
30
+
31
+ export function createPlugin<TName extends string, A = any>(
32
+ pluginName: TName,
33
+ make: (options: CloudflarePluginOptions) => PluginInput<A> | undefined,
34
+ ): PluginOutput<A> | NullablePluginOutput<A> {
35
+ const name = `distilled-cloudflare:${pluginName}`;
36
+ return {
37
+ rolldown: (options: CloudflarePluginOptions) => {
38
+ const plugin = make(options);
39
+ if (!plugin) return null;
40
+ return {
41
+ name,
42
+ ...plugin.shared,
43
+ ...plugin.rolldown,
44
+ };
45
+ },
46
+ vite: (options: CloudflarePluginOptions) => {
47
+ const plugin = make(options);
48
+ if (!plugin) return null;
49
+ return {
50
+ name,
51
+ sharedDuringBuild: true,
52
+ applyToEnvironment(environment) {
53
+ return environment.name !== "client";
54
+ },
55
+ ...plugin.shared,
56
+ ...plugin.vite,
57
+ } as vite.Plugin;
58
+ },
59
+ };
60
+ }
package/src/options.ts ADDED
@@ -0,0 +1,31 @@
1
+ export interface CloudflarePluginOptions {
2
+ /**
3
+ * The main entry point to use.
4
+ * Defaults to the one from your Rolldown configuration.
5
+ * @default undefined
6
+ */
7
+ main?: string;
8
+ /**
9
+ * The compatibility date to use. This is optional, but should be defined to avoid unexpected behavior.
10
+ * @default undefined
11
+ */
12
+ compatibilityDate?: string;
13
+ /**
14
+ * The compatibility flags to enable.
15
+ * @default []
16
+ * @example
17
+ * ```ts
18
+ * cloudflare({ compatibilityDate: "2026-04-01", compatibilityFlags: ["nodejs_compat"] });
19
+ * ```
20
+ */
21
+ compatibilityFlags?: Array<string>;
22
+ /**
23
+ * The exports to include in the bundle.
24
+ * By default, all exports are included. However, if you only want to include certain exports, you can use this option.
25
+ * @example
26
+ * ```ts
27
+ * cloudflare({ exports: ["default"] });
28
+ * ```
29
+ */
30
+ exports?: Array<string>;
31
+ }
package/src/plugin.ts CHANGED
@@ -1,24 +1,28 @@
1
- import type { RolldownPluginOption } from "rolldown";
2
- import { makeAdditionalModulesPlugin } from "./plugins/additional-modules.js";
3
- import { cloudflareExternalsPlugin } from "./plugins/cloudflare-externals.js";
4
- import { makeNodejsCompatPlugin } from "./plugins/nodejs-compat.js";
5
- import { makeOptionsPlugin } from "./plugins/options.js";
6
- import { wasmInitPlugin } from "./plugins/wasm-init.js";
1
+ import type * as rolldown from "rolldown";
2
+ import type { CloudflarePluginOptions } from "./options.js";
3
+ import {
4
+ additionalModulesPlugin,
5
+ cloudflareExternalsPlugin,
6
+ nodejsAlsPlugin,
7
+ nodejsImportWarningPlugin,
8
+ nodejsUnenvPlugin,
9
+ optionsPlugin,
10
+ virtualModulesPlugin,
11
+ wasmInitPlugin,
12
+ } from "./plugins/index.js";
7
13
 
8
- export interface CloudflarePluginOptions {
9
- compatibilityDate?: string;
10
- compatibilityFlags?: Array<string>;
11
- }
14
+ export type CloudflarePlugin = (options?: CloudflarePluginOptions) => Array<rolldown.Plugin | null>;
12
15
 
13
- export type CloudflarePlugin = (options?: CloudflarePluginOptions) => RolldownPluginOption;
14
-
15
- const cloudflare: CloudflarePlugin = async (options = {}) => {
16
+ const cloudflare: CloudflarePlugin = (options = {}) => {
16
17
  return [
17
- makeOptionsPlugin(options),
18
- cloudflareExternalsPlugin,
19
- makeNodejsCompatPlugin(options),
20
- wasmInitPlugin,
21
- makeAdditionalModulesPlugin(),
18
+ optionsPlugin.rolldown(options),
19
+ cloudflareExternalsPlugin.rolldown(options),
20
+ nodejsAlsPlugin.rolldown(options),
21
+ nodejsImportWarningPlugin.rolldown(options),
22
+ nodejsUnenvPlugin.rolldown(options),
23
+ virtualModulesPlugin.rolldown(options),
24
+ wasmInitPlugin.rolldown(options),
25
+ additionalModulesPlugin.rolldown(options),
22
26
  ];
23
27
  };
24
28