@distilled.cloud/cloudflare-rolldown-plugin 0.11.2 → 0.12.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/dist/factory.d.ts CHANGED
@@ -1,19 +1,19 @@
1
1
  import type * as rolldown from "rolldown";
2
2
  import type * as vite from "vite";
3
- import type { CloudflarePluginOptions } from "./options.js";
3
+ import type { BasePluginOptions } from "./options.js";
4
4
  export interface PluginInput<A = any> {
5
5
  shared?: Omit<rolldown.Plugin<A>, "name">;
6
6
  rolldown?: Omit<rolldown.Plugin<A>, "name">;
7
7
  vite?: Omit<vite.Plugin<A>, "name">;
8
8
  }
9
9
  export interface NullablePluginOutput<A = any> {
10
- rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A> | null;
11
- vite: (options: CloudflarePluginOptions) => vite.Plugin<A> | null;
10
+ rolldown: (options: BasePluginOptions) => rolldown.Plugin<A> | null;
11
+ vite: (options: BasePluginOptions) => vite.Plugin<A> | null;
12
12
  }
13
13
  export interface PluginOutput<A = any> {
14
- rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A>;
15
- vite: (options: CloudflarePluginOptions) => vite.Plugin<A>;
14
+ rolldown: (options: BasePluginOptions) => rolldown.Plugin<A>;
15
+ vite: (options: BasePluginOptions) => vite.Plugin<A>;
16
16
  }
17
- export declare function createPlugin<TName extends string, A = any>(pluginName: TName, make: (options: CloudflarePluginOptions) => PluginInput<A>): PluginOutput<A>;
18
- export declare function createPlugin<TName extends string, A = any>(pluginName: TName, make: (options: CloudflarePluginOptions) => PluginInput<A> | undefined): NullablePluginOutput<A>;
17
+ export declare function createPlugin<TName extends string, A = any>(pluginName: TName, make: (options: BasePluginOptions) => PluginInput<A>): PluginOutput<A>;
18
+ export declare function createPlugin<TName extends string, A = any>(pluginName: TName, make: (options: BasePluginOptions) => PluginInput<A> | undefined): NullablePluginOutput<A>;
19
19
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,KAAK,IAAI,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,GAAG;IAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1E,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5D;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EACxD,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,WAAW,CAAC,CAAC,CAAC,GACzD,YAAY,CAAC,CAAC,CAAC,CAAC;AAEnB,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EACxD,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,GACrE,oBAAoB,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,KAAK,IAAI,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,GAAG;IAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACpE,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CACtD;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EACxD,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,WAAW,CAAC,CAAC,CAAC,GACnD,YAAY,CAAC,CAAC,CAAC,CAAC;AAEnB,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EACxD,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,GAC/D,oBAAoB,CAAC,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,YAAY,CAC1B,UAAiB,EACjB,IAAsE;IAEtE,MAAM,IAAI,GAAG,wBAAwB,UAAU,EAAE,CAAC;IAClD,OAAO;QACL,QAAQ,EAAE,CAAC,OAAgC,EAAE,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO;gBACL,IAAI;gBACJ,GAAG,MAAM,CAAC,MAAM;gBAChB,GAAG,MAAM,CAAC,QAAQ;aACnB,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC,OAAgC,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO;gBACL,IAAI;gBACJ,iBAAiB,EAAE,IAAI;gBACvB,kBAAkB,CAAC,WAAW;oBAC5B,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACvC,CAAC;gBACD,GAAG,MAAM,CAAC,MAAM;gBAChB,GAAG,MAAM,CAAC,IAAI;aACA,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,YAAY,CAC1B,UAAiB,EACjB,IAAgE;IAEhE,MAAM,IAAI,GAAG,wBAAwB,UAAU,EAAE,CAAC;IAClD,OAAO;QACL,QAAQ,EAAE,CAAC,OAA0B,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO;gBACL,IAAI;gBACJ,GAAG,MAAM,CAAC,MAAM;gBAChB,GAAG,MAAM,CAAC,QAAQ;aACnB,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC,OAA0B,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO;gBACL,IAAI;gBACJ,iBAAiB,EAAE,IAAI;gBACvB,kBAAkB,CAAC,WAAW;oBAC5B,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACvC,CAAC;gBACD,GAAG,MAAM,CAAC,MAAM;gBAChB,GAAG,MAAM,CAAC,IAAI;aACA,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/options.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export interface CloudflarePluginOptions {
1
+ export interface BasePluginOptions {
2
2
  /**
3
3
  * The main entry point to use.
4
4
  * Defaults to the one from your Rolldown configuration.
@@ -28,5 +28,22 @@ export interface CloudflarePluginOptions {
28
28
  * ```
29
29
  */
30
30
  exports?: Array<string>;
31
+ /**
32
+ * Which Vite environment hosts the Worker, and any child environments it
33
+ * loads at runtime. Defaults to the single `ssr` environment.
34
+ *
35
+ * `@vitejs/plugin-rsc` apps run the Worker in the `rsc` environment (resolved
36
+ * with the `react-server` condition) and load the `ssr` environment from it,
37
+ * so they set `{ name: "rsc", childEnvironments: ["ssr"] }`. Every named
38
+ * environment is given the Worker treatment (workerd resolve conditions,
39
+ * dependency pre-bundling) and a module runner in dev.
40
+ *
41
+ * @default { entry: "ssr", children: [] }
42
+ */
43
+ viteEnvironments?: {
44
+ entry?: string;
45
+ children?: Array<string>;
46
+ };
31
47
  }
48
+ export declare const parseViteEnvironments: (options: BasePluginOptions) => [string, ...Array<string>];
32
49
  //# sourceMappingURL=options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACzB"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC;CACH;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,iBAAiB,KAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAwB3F,CAAC"}
package/dist/options.js CHANGED
@@ -1 +1,20 @@
1
+ export const parseViteEnvironments = (options) => {
2
+ const entry = options.viteEnvironments?.entry ?? "ssr";
3
+ if (entry === "client") {
4
+ throw new Error('The "client" environment cannot be used as a worker environment because it is reserved for the browser.');
5
+ }
6
+ const children = (options.viteEnvironments?.children ?? []).map((name, index, self) => {
7
+ if (name === "client") {
8
+ throw new Error('The "client" environment cannot be used as a worker environment because it is reserved for the browser.');
9
+ }
10
+ else if (self.indexOf(name) !== index) {
11
+ throw new Error(`The name "${name}" appears more than once in the Vite environment list. Worker environment names must be unique.`);
12
+ }
13
+ else if (name === entry) {
14
+ throw new Error(`The child environment "${name}" cannot have the same name as the entry environment "${entry}".`);
15
+ }
16
+ return name;
17
+ });
18
+ return [entry, ...children];
19
+ };
1
20
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAgDA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAA0B,EAA8B,EAAE;IAC9F,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,KAAK,IAAI,KAAK,CAAC;IACvD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,iGAAiG,CACnH,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,yDAAyD,KAAK,IAAI,CACjG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;AAC9B,CAAC,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type * as rolldown from "rolldown";
2
- import type { CloudflarePluginOptions } from "./options.js";
3
- export type CloudflarePlugin = (options?: CloudflarePluginOptions) => Array<rolldown.Plugin | null>;
4
- declare const cloudflare: CloudflarePlugin;
2
+ import type { BasePluginOptions } from "./options.js";
3
+ export type RolldownPluginOptions = Omit<BasePluginOptions, "viteEnvironment">;
4
+ export type RolldownPlugin = (options?: RolldownPluginOptions) => Array<rolldown.Plugin | null>;
5
+ declare const cloudflare: RolldownPlugin;
5
6
  export default cloudflare;
6
7
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAY5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,EAAE,uBAAuB,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEpG,QAAA,MAAM,UAAU,EAAE,gBAWjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AAE/E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEhG,QAAA,MAAM,UAAU,EAAE,cAWjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAI5B,MAAM,UAAU,GAAqB,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;IACpD,OAAO;QACL,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/B,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3C,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3C,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAM5B,MAAM,UAAU,GAAmB,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;IAClD,OAAO;QACL,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/B,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3C,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3C,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,aAAa,kDAoIxB,CAAC"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,aAAa,kDAsKxB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { createPlugin } from "../factory.js";
3
+ import { parseViteEnvironments } from "../options.js";
3
4
  import { hasNodejsCompat } from "../utils.js";
4
5
  import { WORKER_ENTRY_PREFIX } from "./virtual-modules.js";
5
6
  const DEFAULT_RESOLVE_CONDITION_NAMES = ["workerd", "worker", "module", "browser"];
@@ -46,104 +47,144 @@ export const optionsPlugin = createPlugin("options", (pluginOptions) => {
46
47
  async config(userConfig) {
47
48
  const vite = await import("vite");
48
49
  const isRolldown = "rolldownVersion" in this.meta;
49
- input = normalizeInput(pluginOptions.main ??
50
- userConfig.environments?.ssr?.build?.rolldownOptions?.input ??
51
- userConfig.environments?.ssr?.build?.rollupOptions?.input ??
52
- {});
50
+ const environmentNames = parseViteEnvironments(pluginOptions);
51
+ input = normalizeInput(pluginOptions.main ?? defaultEnvironmentEntries(environmentNames[0], userConfig) ?? {});
53
52
  const rollupOptions = {
54
53
  input: wrapInput(input),
55
54
  preserveEntrySignatures: "strict",
56
55
  };
57
56
  const define = getDefine(pluginOptions, process.env.NODE_ENV || userConfig.mode || "production");
58
- const appType = userConfig.appType ?? (Object.keys(input).length === 0 ? "spa" : "custom");
59
- return {
60
- appType,
61
- ssr: {
62
- noExternal: true,
57
+ const makeEnvironment = ({ name, isEntry, }) => {
58
+ const entries = isEntry
59
+ ? (pluginOptions.main ?? defaultEnvironmentEntries(name, userConfig))
60
+ : (defaultEnvironmentEntries(name, userConfig) ?? pluginOptions.main);
61
+ return {
62
+ // Bake `process.env.NODE_ENV` (and friends) into the worker build.
63
+ // workerd has no value for it at runtime, so without this libraries
64
+ // like React fall back to their development builds. Setting `define`
65
+ // at the environment level applies it even though `keepProcessEnv`
66
+ // stays `true` (so other `process.env` access is preserved at
67
+ // runtime for `nodejs_compat`).
68
+ define,
63
69
  resolve: {
70
+ noExternal: true,
64
71
  conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
65
72
  },
66
- },
73
+ optimizeDeps: {
74
+ noDiscovery: false,
75
+ ignoreOutdatedRequests: true,
76
+ entries: asArray(entries)?.map(vite.normalizePath),
77
+ ...(isRolldown
78
+ ? {
79
+ rolldownOptions: {
80
+ platform: "neutral",
81
+ resolve: {
82
+ conditionNames: [
83
+ ...DEFAULT_RESOLVE_CONDITION_NAMES,
84
+ "development|production",
85
+ ],
86
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
87
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
88
+ },
89
+ transform: {
90
+ target: TARGET,
91
+ define,
92
+ },
93
+ },
94
+ }
95
+ : {
96
+ esbuildOptions: {
97
+ platform: "neutral",
98
+ conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
99
+ resolveExtensions: DEFAULT_RESOLVE_EXTENSIONS,
100
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
101
+ target: TARGET,
102
+ define,
103
+ },
104
+ }),
105
+ },
106
+ keepProcessEnv: true,
107
+ // The entry environment owns the Worker's build input and server
108
+ // output directory; children (e.g. `ssr`) keep their own build config
109
+ // from the framework plugin (`@vitejs/plugin-rsc`).
110
+ ...(isEntry
111
+ ? {
112
+ build: {
113
+ ssr: true,
114
+ target: TARGET,
115
+ emitAssets: true,
116
+ copyPublicDir: false,
117
+ outDir: getOutputDirectory(userConfig, name),
118
+ ...(isRolldown
119
+ ? {
120
+ rolldownOptions: {
121
+ ...rollupOptions,
122
+ platform: "neutral",
123
+ resolve: {
124
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
125
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
126
+ },
127
+ },
128
+ }
129
+ : { rollupOptions }),
130
+ },
131
+ }
132
+ : {}),
133
+ };
134
+ };
135
+ const appType = userConfig.appType ?? (Object.keys(input).length === 0 ? "spa" : "custom");
136
+ return {
137
+ appType,
67
138
  builder: appType === "spa"
68
139
  ? undefined
69
140
  : {
70
- buildApp: async (app) => {
71
- for (const environment of Object.values(app.environments)) {
72
- await app.build(environment);
141
+ // We need to include this for `builder.buildApp()` to work
142
+ // because not all frameworks provide it...
143
+ buildApp: async (builder) => {
144
+ for (const environment of Object.values(builder.environments)) {
145
+ // ...however, if your framework does provide a `buildApp` hook,
146
+ // this check prevents us from building the environment twice.
147
+ if (environment.isBuilt)
148
+ continue;
149
+ await builder.build(environment);
73
150
  }
74
151
  },
75
152
  },
153
+ ssr: {
154
+ noExternal: true,
155
+ resolve: {
156
+ conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
157
+ },
158
+ },
76
159
  environments: {
77
160
  client: {
78
161
  build: {
79
162
  outDir: getOutputDirectory(userConfig, "client"),
80
163
  },
81
164
  },
82
- ssr: {
83
- resolve: {
84
- noExternal: true,
85
- conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
86
- },
87
- build: {
88
- ssr: true,
89
- target: TARGET,
90
- emitAssets: true,
91
- copyPublicDir: false,
92
- outDir: getOutputDirectory(userConfig, "server"),
93
- ...(isRolldown
94
- ? {
95
- rolldownOptions: {
96
- ...rollupOptions,
97
- platform: "neutral",
98
- resolve: {
99
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
100
- extensions: DEFAULT_RESOLVE_EXTENSIONS,
101
- },
102
- },
103
- }
104
- : { rollupOptions }),
105
- },
106
- optimizeDeps: {
107
- noDiscovery: false,
108
- ignoreOutdatedRequests: true,
109
- entries: pluginOptions.main ? vite.normalizePath(pluginOptions.main) : undefined,
110
- ...(isRolldown
111
- ? {
112
- rolldownOptions: {
113
- platform: "neutral",
114
- resolve: {
115
- conditionNames: [
116
- ...DEFAULT_RESOLVE_CONDITION_NAMES,
117
- "development|production",
118
- ],
119
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
120
- extensions: DEFAULT_RESOLVE_EXTENSIONS,
121
- },
122
- transform: {
123
- target: TARGET,
124
- define,
125
- },
126
- },
127
- }
128
- : {
129
- esbuildOptions: {
130
- platform: "neutral",
131
- conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
132
- resolveExtensions: DEFAULT_RESOLVE_EXTENSIONS,
133
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
134
- target: TARGET,
135
- define,
136
- },
137
- }),
138
- },
139
- keepProcessEnv: true,
140
- },
165
+ ...Object.fromEntries(environmentNames.map((name, index) => [
166
+ name,
167
+ makeEnvironment({ name, isEntry: index === 0 }),
168
+ ])),
141
169
  },
142
170
  };
143
171
  },
144
172
  },
145
173
  };
146
174
  });
175
+ const defaultEnvironmentEntries = (environmentName, userConfig) => {
176
+ const environment = userConfig.environments?.[environmentName];
177
+ return environment?.build?.rolldownOptions?.input ?? environment?.build?.rollupOptions?.input;
178
+ };
179
+ const asArray = (input) => {
180
+ if (!input)
181
+ return;
182
+ if (typeof input === "string")
183
+ return [input];
184
+ if (Array.isArray(input) && input.length > 0)
185
+ return input;
186
+ return Object.values(input);
187
+ };
147
188
  const normalizeInput = (input) => {
148
189
  if (typeof input === "string") {
149
190
  return { [path.parse(input).name || "index"]: input };
@@ -156,7 +197,7 @@ const normalizeInput = (input) => {
156
197
  }
157
198
  };
158
199
  const wrapInput = (input) => Object.fromEntries(Object.entries(input).map(([key, id]) => [key, `${WORKER_ENTRY_PREFIX}${id}`]));
159
- function getDefine(options, nodeEnv) {
200
+ const getDefine = (options, nodeEnv) => {
160
201
  return {
161
202
  "process.env.NODE_ENV": JSON.stringify(nodeEnv),
162
203
  "global.process.env.NODE_ENV": JSON.stringify(nodeEnv),
@@ -179,10 +220,10 @@ function getDefine(options, nodeEnv) {
179
220
  }
180
221
  : {}),
181
222
  };
182
- }
183
- function getOutputDirectory(userConfig, environmentName) {
223
+ };
224
+ const getOutputDirectory = (userConfig, environmentName) => {
184
225
  const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
185
226
  return (userConfig.environments?.[environmentName]?.build?.outDir ??
186
227
  path.join(rootOutputDirectory, environmentName));
187
- }
228
+ };
188
229
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/plugins/options.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@distilled.cloud/cloudflare-rolldown-plugin",
3
- "version": "0.11.2",
3
+ "version": "0.12.0",
4
4
  "description": "Rolldown plugin for Cloudflare Workers.",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -67,7 +67,7 @@
67
67
  "unenv": "^2.0.0-rc.24"
68
68
  },
69
69
  "devDependencies": {
70
- "@cloudflare/workers-types": "^4.20260310.1",
70
+ "@cloudflare/workers-types": "^4.20260617.1",
71
71
  "@distilled.cloud/test-utils": "0.0.0",
72
72
  "mysql2": "^3.22.3",
73
73
  "vite": "^8.0.3",
package/src/factory.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type * as rolldown from "rolldown";
2
2
  import type * as vite from "vite";
3
- import type { CloudflarePluginOptions } from "./options.js";
3
+ import type { BasePluginOptions } from "./options.js";
4
4
 
5
5
  export interface PluginInput<A = any> {
6
6
  shared?: Omit<rolldown.Plugin<A>, "name">;
@@ -9,32 +9,32 @@ export interface PluginInput<A = any> {
9
9
  }
10
10
 
11
11
  export interface NullablePluginOutput<A = any> {
12
- rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A> | null;
13
- vite: (options: CloudflarePluginOptions) => vite.Plugin<A> | null;
12
+ rolldown: (options: BasePluginOptions) => rolldown.Plugin<A> | null;
13
+ vite: (options: BasePluginOptions) => vite.Plugin<A> | null;
14
14
  }
15
15
 
16
16
  export interface PluginOutput<A = any> {
17
- rolldown: (options: CloudflarePluginOptions) => rolldown.Plugin<A>;
18
- vite: (options: CloudflarePluginOptions) => vite.Plugin<A>;
17
+ rolldown: (options: BasePluginOptions) => rolldown.Plugin<A>;
18
+ vite: (options: BasePluginOptions) => vite.Plugin<A>;
19
19
  }
20
20
 
21
21
  export function createPlugin<TName extends string, A = any>(
22
22
  pluginName: TName,
23
- make: (options: CloudflarePluginOptions) => PluginInput<A>,
23
+ make: (options: BasePluginOptions) => PluginInput<A>,
24
24
  ): PluginOutput<A>;
25
25
 
26
26
  export function createPlugin<TName extends string, A = any>(
27
27
  pluginName: TName,
28
- make: (options: CloudflarePluginOptions) => PluginInput<A> | undefined,
28
+ make: (options: BasePluginOptions) => PluginInput<A> | undefined,
29
29
  ): NullablePluginOutput<A>;
30
30
 
31
31
  export function createPlugin<TName extends string, A = any>(
32
32
  pluginName: TName,
33
- make: (options: CloudflarePluginOptions) => PluginInput<A> | undefined,
33
+ make: (options: BasePluginOptions) => PluginInput<A> | undefined,
34
34
  ): PluginOutput<A> | NullablePluginOutput<A> {
35
35
  const name = `distilled-cloudflare:${pluginName}`;
36
36
  return {
37
- rolldown: (options: CloudflarePluginOptions) => {
37
+ rolldown: (options: BasePluginOptions) => {
38
38
  const plugin = make(options);
39
39
  if (!plugin) return null;
40
40
  return {
@@ -43,7 +43,7 @@ export function createPlugin<TName extends string, A = any>(
43
43
  ...plugin.rolldown,
44
44
  };
45
45
  },
46
- vite: (options: CloudflarePluginOptions) => {
46
+ vite: (options: BasePluginOptions) => {
47
47
  const plugin = make(options);
48
48
  if (!plugin) return null;
49
49
  return {
package/src/options.ts CHANGED
@@ -1,4 +1,4 @@
1
- export interface CloudflarePluginOptions {
1
+ export interface BasePluginOptions {
2
2
  /**
3
3
  * The main entry point to use.
4
4
  * Defaults to the one from your Rolldown configuration.
@@ -28,4 +28,46 @@ export interface CloudflarePluginOptions {
28
28
  * ```
29
29
  */
30
30
  exports?: Array<string>;
31
+ /**
32
+ * Which Vite environment hosts the Worker, and any child environments it
33
+ * loads at runtime. Defaults to the single `ssr` environment.
34
+ *
35
+ * `@vitejs/plugin-rsc` apps run the Worker in the `rsc` environment (resolved
36
+ * with the `react-server` condition) and load the `ssr` environment from it,
37
+ * so they set `{ name: "rsc", childEnvironments: ["ssr"] }`. Every named
38
+ * environment is given the Worker treatment (workerd resolve conditions,
39
+ * dependency pre-bundling) and a module runner in dev.
40
+ *
41
+ * @default { entry: "ssr", children: [] }
42
+ */
43
+ viteEnvironments?: {
44
+ entry?: string;
45
+ children?: Array<string>;
46
+ };
31
47
  }
48
+
49
+ export const parseViteEnvironments = (options: BasePluginOptions): [string, ...Array<string>] => {
50
+ const entry = options.viteEnvironments?.entry ?? "ssr";
51
+ if (entry === "client") {
52
+ throw new Error(
53
+ 'The "client" environment cannot be used as a worker environment because it is reserved for the browser.',
54
+ );
55
+ }
56
+ const children = (options.viteEnvironments?.children ?? []).map((name, index, self) => {
57
+ if (name === "client") {
58
+ throw new Error(
59
+ 'The "client" environment cannot be used as a worker environment because it is reserved for the browser.',
60
+ );
61
+ } else if (self.indexOf(name) !== index) {
62
+ throw new Error(
63
+ `The name "${name}" appears more than once in the Vite environment list. Worker environment names must be unique.`,
64
+ );
65
+ } else if (name === entry) {
66
+ throw new Error(
67
+ `The child environment "${name}" cannot have the same name as the entry environment "${entry}".`,
68
+ );
69
+ }
70
+ return name;
71
+ });
72
+ return [entry, ...children];
73
+ };
package/src/plugin.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type * as rolldown from "rolldown";
2
- import type { CloudflarePluginOptions } from "./options.js";
2
+ import type { BasePluginOptions } from "./options.js";
3
3
  import {
4
4
  additionalModulesPlugin,
5
5
  cloudflareExternalsPlugin,
@@ -11,9 +11,11 @@ import {
11
11
  wasmInitPlugin,
12
12
  } from "./plugins/index.js";
13
13
 
14
- export type CloudflarePlugin = (options?: CloudflarePluginOptions) => Array<rolldown.Plugin | null>;
14
+ export type RolldownPluginOptions = Omit<BasePluginOptions, "viteEnvironment">;
15
15
 
16
- const cloudflare: CloudflarePlugin = (options = {}) => {
16
+ export type RolldownPlugin = (options?: RolldownPluginOptions) => Array<rolldown.Plugin | null>;
17
+
18
+ const cloudflare: RolldownPlugin = (options = {}) => {
17
19
  return [
18
20
  optionsPlugin.rolldown(options),
19
21
  cloudflareExternalsPlugin.rolldown(options),
@@ -1,7 +1,7 @@
1
1
  import path from "node:path";
2
2
  import type * as vite from "vite";
3
3
  import { createPlugin } from "../factory.js";
4
- import type { CloudflarePluginOptions } from "../options.js";
4
+ import { parseViteEnvironments, type BasePluginOptions } from "../options.js";
5
5
  import { hasNodejsCompat } from "../utils.js";
6
6
  import { WORKER_ENTRY_PREFIX } from "./virtual-modules.js";
7
7
 
@@ -55,11 +55,9 @@ export const optionsPlugin = createPlugin<"options", OptionsApi>("options", (plu
55
55
  async config(userConfig) {
56
56
  const vite = await import("vite");
57
57
  const isRolldown = "rolldownVersion" in this.meta;
58
+ const environmentNames = parseViteEnvironments(pluginOptions);
58
59
  input = normalizeInput(
59
- pluginOptions.main ??
60
- userConfig.environments?.ssr?.build?.rolldownOptions?.input ??
61
- userConfig.environments?.ssr?.build?.rollupOptions?.input ??
62
- {},
60
+ pluginOptions.main ?? defaultEnvironmentEntries(environmentNames[0], userConfig) ?? {},
63
61
  );
64
62
  const rollupOptions: vite.Rollup.RollupOptions = {
65
63
  input: wrapInput(input),
@@ -69,90 +67,126 @@ export const optionsPlugin = createPlugin<"options", OptionsApi>("options", (plu
69
67
  pluginOptions,
70
68
  process.env.NODE_ENV || userConfig.mode || "production",
71
69
  );
72
- const appType = userConfig.appType ?? (Object.keys(input).length === 0 ? "spa" : "custom");
73
- return {
74
- appType,
75
- ssr: {
76
- noExternal: true,
70
+ const makeEnvironment = ({
71
+ name,
72
+ isEntry,
73
+ }: {
74
+ name: string;
75
+ isEntry: boolean;
76
+ }): vite.EnvironmentOptions => {
77
+ const entries = isEntry
78
+ ? (pluginOptions.main ?? defaultEnvironmentEntries(name, userConfig))
79
+ : (defaultEnvironmentEntries(name, userConfig) ?? pluginOptions.main);
80
+ return {
81
+ // Bake `process.env.NODE_ENV` (and friends) into the worker build.
82
+ // workerd has no value for it at runtime, so without this libraries
83
+ // like React fall back to their development builds. Setting `define`
84
+ // at the environment level applies it even though `keepProcessEnv`
85
+ // stays `true` (so other `process.env` access is preserved at
86
+ // runtime for `nodejs_compat`).
87
+ define,
77
88
  resolve: {
89
+ noExternal: true,
78
90
  conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
79
91
  },
80
- },
92
+ optimizeDeps: {
93
+ noDiscovery: false,
94
+ ignoreOutdatedRequests: true,
95
+ entries: asArray(entries)?.map(vite.normalizePath),
96
+ ...(isRolldown
97
+ ? {
98
+ rolldownOptions: {
99
+ platform: "neutral",
100
+ resolve: {
101
+ conditionNames: [
102
+ ...DEFAULT_RESOLVE_CONDITION_NAMES,
103
+ "development|production",
104
+ ],
105
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
106
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
107
+ },
108
+ transform: {
109
+ target: TARGET,
110
+ define,
111
+ },
112
+ },
113
+ }
114
+ : {
115
+ esbuildOptions: {
116
+ platform: "neutral",
117
+ conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
118
+ resolveExtensions: DEFAULT_RESOLVE_EXTENSIONS,
119
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
120
+ target: TARGET,
121
+ define,
122
+ },
123
+ }),
124
+ },
125
+ keepProcessEnv: true,
126
+ // The entry environment owns the Worker's build input and server
127
+ // output directory; children (e.g. `ssr`) keep their own build config
128
+ // from the framework plugin (`@vitejs/plugin-rsc`).
129
+ ...(isEntry
130
+ ? {
131
+ build: {
132
+ ssr: true,
133
+ target: TARGET,
134
+ emitAssets: true,
135
+ copyPublicDir: false,
136
+ outDir: getOutputDirectory(userConfig, name),
137
+ ...(isRolldown
138
+ ? {
139
+ rolldownOptions: {
140
+ ...rollupOptions,
141
+ platform: "neutral",
142
+ resolve: {
143
+ mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
144
+ extensions: DEFAULT_RESOLVE_EXTENSIONS,
145
+ },
146
+ },
147
+ }
148
+ : { rollupOptions }),
149
+ },
150
+ }
151
+ : {}),
152
+ };
153
+ };
154
+ const appType = userConfig.appType ?? (Object.keys(input).length === 0 ? "spa" : "custom");
155
+ return {
156
+ appType,
81
157
  builder:
82
158
  appType === "spa"
83
159
  ? undefined
84
160
  : {
85
- buildApp: async (app) => {
86
- for (const environment of Object.values(app.environments)) {
87
- await app.build(environment);
161
+ // We need to include this for `builder.buildApp()` to work
162
+ // because not all frameworks provide it...
163
+ buildApp: async (builder) => {
164
+ for (const environment of Object.values(builder.environments)) {
165
+ // ...however, if your framework does provide a `buildApp` hook,
166
+ // this check prevents us from building the environment twice.
167
+ if (environment.isBuilt) continue;
168
+ await builder.build(environment);
88
169
  }
89
170
  },
90
171
  },
172
+ ssr: {
173
+ noExternal: true,
174
+ resolve: {
175
+ conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
176
+ },
177
+ },
91
178
  environments: {
92
179
  client: {
93
180
  build: {
94
181
  outDir: getOutputDirectory(userConfig, "client"),
95
182
  },
96
183
  },
97
- ssr: {
98
- resolve: {
99
- noExternal: true,
100
- conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
101
- },
102
- build: {
103
- ssr: true,
104
- target: TARGET,
105
- emitAssets: true,
106
- copyPublicDir: false,
107
- outDir: getOutputDirectory(userConfig, "server"),
108
- ...(isRolldown
109
- ? {
110
- rolldownOptions: {
111
- ...rollupOptions,
112
- platform: "neutral",
113
- resolve: {
114
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
115
- extensions: DEFAULT_RESOLVE_EXTENSIONS,
116
- },
117
- },
118
- }
119
- : { rollupOptions }),
120
- },
121
- optimizeDeps: {
122
- noDiscovery: false,
123
- ignoreOutdatedRequests: true,
124
- entries: pluginOptions.main ? vite.normalizePath(pluginOptions.main) : undefined,
125
- ...(isRolldown
126
- ? {
127
- rolldownOptions: {
128
- platform: "neutral",
129
- resolve: {
130
- conditionNames: [
131
- ...DEFAULT_RESOLVE_CONDITION_NAMES,
132
- "development|production",
133
- ],
134
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
135
- extensions: DEFAULT_RESOLVE_EXTENSIONS,
136
- },
137
- transform: {
138
- target: TARGET,
139
- define,
140
- },
141
- },
142
- }
143
- : {
144
- esbuildOptions: {
145
- platform: "neutral",
146
- conditions: [...DEFAULT_RESOLVE_CONDITION_NAMES, "development|production"],
147
- resolveExtensions: DEFAULT_RESOLVE_EXTENSIONS,
148
- mainFields: DEFAULT_RESOLVE_MAIN_FIELDS,
149
- target: TARGET,
150
- define,
151
- },
152
- }),
153
- },
154
- keepProcessEnv: true,
155
- },
184
+ ...Object.fromEntries(
185
+ environmentNames.map((name, index) => [
186
+ name,
187
+ makeEnvironment({ name, isEntry: index === 0 }),
188
+ ]),
189
+ ),
156
190
  },
157
191
  };
158
192
  },
@@ -160,6 +194,23 @@ export const optionsPlugin = createPlugin<"options", OptionsApi>("options", (plu
160
194
  };
161
195
  });
162
196
 
197
+ const defaultEnvironmentEntries = (
198
+ environmentName: string,
199
+ userConfig: vite.UserConfig,
200
+ ): vite.Rolldown.InputOption | undefined => {
201
+ const environment = userConfig.environments?.[environmentName];
202
+ return environment?.build?.rolldownOptions?.input ?? environment?.build?.rollupOptions?.input;
203
+ };
204
+
205
+ const asArray = (
206
+ input: string | Array<string> | Record<string, string> | undefined,
207
+ ): Array<string> | undefined => {
208
+ if (!input) return;
209
+ if (typeof input === "string") return [input];
210
+ if (Array.isArray(input) && input.length > 0) return input;
211
+ return Object.values(input);
212
+ };
213
+
163
214
  const normalizeInput = (
164
215
  input: string | Array<string> | Record<string, string>,
165
216
  ): Record<string, string> => {
@@ -177,7 +228,7 @@ const wrapInput = (input: Record<string, string>) =>
177
228
  Object.entries(input).map(([key, id]) => [key, `${WORKER_ENTRY_PREFIX}${id}` as const]),
178
229
  );
179
230
 
180
- function getDefine(options: CloudflarePluginOptions, nodeEnv: string): Record<string, string> {
231
+ const getDefine = (options: BasePluginOptions, nodeEnv: string): Record<string, string> => {
181
232
  return {
182
233
  "process.env.NODE_ENV": JSON.stringify(nodeEnv),
183
234
  "global.process.env.NODE_ENV": JSON.stringify(nodeEnv),
@@ -200,13 +251,13 @@ function getDefine(options: CloudflarePluginOptions, nodeEnv: string): Record<st
200
251
  }
201
252
  : {}),
202
253
  };
203
- }
254
+ };
204
255
 
205
- function getOutputDirectory(userConfig: vite.UserConfig, environmentName: string) {
256
+ const getOutputDirectory = (userConfig: vite.UserConfig, environmentName: string) => {
206
257
  const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
207
258
 
208
259
  return (
209
260
  userConfig.environments?.[environmentName]?.build?.outDir ??
210
261
  path.join(rootOutputDirectory, environmentName)
211
262
  );
212
- }
263
+ };