@chuckcchen/vite-plugin 1.0.12 → 1.0.14

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.
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Server Wrapper Presets
3
+ *
4
+ * Built-in presets and utilities for extending presets
5
+ */
6
+ /**
7
+ * Server wrapper preset configuration
8
+ */
9
+ export interface ServerWrapperPreset {
10
+ imports?: string;
11
+ handlerSetup: string;
12
+ handlerCall: string;
13
+ requiresHtmlTemplate?: boolean;
14
+ }
15
+ /**
16
+ * Handler detection path configuration
17
+ *
18
+ * Supported path formats:
19
+ * - "default" - Check if default export is a function
20
+ * - "default.fetch" - Check if default export has a fetch method
21
+ * - "handler" - Check serverExports.handler
22
+ * - "app.fetch" - Check serverExports.app.fetch (Hono style)
23
+ * - "server.fetch" - Check serverExports.server.fetch (TanStack Start)
24
+ */
25
+ export type HandlerDetectPath = string;
26
+ /**
27
+ * Default handler detection paths for webHandler preset
28
+ */
29
+ export declare const DEFAULT_HANDLER_DETECT_PATHS: HandlerDetectPath[];
30
+ /**
31
+ * Create a webHandler preset with custom detection paths
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * // TanStack Start - only check server.fetch
36
+ * const preset = createWebHandlerPreset(["default.fetch", "server.fetch"]);
37
+ *
38
+ * // Custom framework
39
+ * const preset = createWebHandlerPreset(["default", "myHandler", "app.handle"]);
40
+ * ```
41
+ */
42
+ export declare function createWebHandlerPreset(detectPaths?: HandlerDetectPath[]): ServerWrapperPreset;
43
+ /**
44
+ * Built-in server wrapper presets (generic, framework-agnostic)
45
+ *
46
+ * Note: All presets use `serverBuild` (namespace import) and `serverExports` (rest exports)
47
+ * which are automatically provided by generateServerWrapperCode()
48
+ *
49
+ * Framework-specific presets should be defined in their respective adapter packages.
50
+ */
51
+ export declare const SERVER_WRAPPER_PRESETS: {
52
+ /**
53
+ * Web Handler - Request/Response pattern
54
+ *
55
+ * Supports multiple export patterns (configurable via createWebHandlerPreset):
56
+ * - default export function
57
+ * - default.fetch (app object with fetch method)
58
+ * - named `handler` export
59
+ * - named `fetch` export
60
+ * - `app.fetch` pattern (Hono style)
61
+ * - `server.fetch` pattern (TanStack Start)
62
+ */
63
+ readonly webHandler: ServerWrapperPreset;
64
+ /**
65
+ * HTML Render - render function returning {head, html}
66
+ *
67
+ * Standard Vite SSR pattern where render(url) returns HTML fragments
68
+ * that are injected into the HTML template.
69
+ */
70
+ readonly htmlRender: {
71
+ readonly requiresHtmlTemplate: true;
72
+ readonly handlerSetup: string;
73
+ readonly handlerCall: "handleSSRRequest(webRequest)";
74
+ };
75
+ };
76
+ /**
77
+ * Result of extending server wrapper presets
78
+ */
79
+ export interface ExtendedPresetsResult<TCustom extends Record<string, ServerWrapperPreset>> {
80
+ /** Extended presets object (core + custom) */
81
+ presets: typeof SERVER_WRAPPER_PRESETS & TCustom;
82
+ /** Type-safe preset resolver function */
83
+ resolvePreset: (preset: keyof (typeof SERVER_WRAPPER_PRESETS & TCustom) | ServerWrapperPreset) => ServerWrapperPreset;
84
+ /** Get all available preset names */
85
+ getPresetNames: () => (keyof (typeof SERVER_WRAPPER_PRESETS & TCustom))[];
86
+ }
87
+ /**
88
+ * Create a server wrapper preset
89
+ *
90
+ * Helper function to create a properly typed preset with validation and normalization.
91
+ * Automatically trims handlerSetup and validates required fields.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const myPreset = createServerWrapperPreset({
96
+ * imports: `import { handler } from 'my-framework';`,
97
+ * handlerSetup: `const requestHandler = handler(serverExports);`,
98
+ * handlerCall: "requestHandler(webRequest)",
99
+ * });
100
+ * ```
101
+ */
102
+ export declare function createServerWrapperPreset(config: ServerWrapperPreset): ServerWrapperPreset;
103
+ /**
104
+ * Extend core server wrapper presets with custom presets
105
+ *
106
+ * This utility provides a standardized way for adapters to:
107
+ * 1. Add framework-specific presets while keeping core presets
108
+ * 2. Get a type-safe resolver function
109
+ * 3. Export extended presets for external use
110
+ *
111
+ * Custom presets are automatically validated and normalized using createServerWrapperPreset().
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * // In vite-adapter - can pass raw config, will be validated automatically
116
+ * const { presets, resolvePreset } = extendServerWrapperPresets({
117
+ * vike: {
118
+ * imports: `import { renderPage } from 'vike/server';`,
119
+ * handlerSetup: `...`,
120
+ * handlerCall: "handleVikeRequest(webRequest)",
121
+ * },
122
+ * });
123
+ *
124
+ * export const SERVER_WRAPPER_PRESETS = presets;
125
+ * export type ServerWrapperPresetName = keyof typeof presets;
126
+ *
127
+ * // Use in adapter
128
+ * const resolved = resolvePreset(options.serverWrapper || "htmlRender");
129
+ * ```
130
+ */
131
+ export declare function extendServerWrapperPresets<TCustom extends Record<string, ServerWrapperPreset>>(customPresets: TCustom): ExtendedPresetsResult<TCustom>;
132
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/factory/presets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAMD;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,EAO3D,CAAC;AAkCF;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,GAAE,iBAAiB,EAAiC,GAC9D,mBAAmB,CAKrB;AAMD;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC;;;;;;;;;;OAUG;;IAGH;;;;;OAKG;;;;;;CAoCK,CAAC;AAMX;;GAEG;AACH,MAAM,WAAW,qBAAqB,CACpC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAEnD,8CAA8C;IAC9C,OAAO,EAAE,OAAO,sBAAsB,GAAG,OAAO,CAAC;IACjD,yCAAyC;IACzC,aAAa,EAAE,CACb,MAAM,EAAE,MAAM,CAAC,OAAO,sBAAsB,GAAG,OAAO,CAAC,GAAG,mBAAmB,KAC1E,mBAAmB,CAAC;IACzB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,sBAAsB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAC3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAarB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnD,aAAa,EAAE,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAwCxD"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Server Wrapper Presets
3
+ *
4
+ * Built-in presets and utilities for extending presets
5
+ */
6
+ /**
7
+ * Default handler detection paths for webHandler preset
8
+ */
9
+ export const DEFAULT_HANDLER_DETECT_PATHS = [
10
+ "default", // export default handler
11
+ "default.fetch", // export default { fetch } (app object)
12
+ "handler", // export { handler }
13
+ "fetch", // export { fetch }
14
+ "app.fetch", // export { app } (Hono)
15
+ "server.fetch", // export { server } (TanStack Start)
16
+ ];
17
+ /**
18
+ * Generate check code for a single detection path
19
+ */
20
+ function generateDetectCheck(path) {
21
+ if (path === "default") {
22
+ return ` if (typeof defaultExport === 'function') return defaultExport;`;
23
+ }
24
+ if (path === "default.fetch") {
25
+ return ` if (typeof defaultExport === 'object' && defaultExport !== null && typeof defaultExport.fetch === 'function') return defaultExport.fetch.bind(defaultExport);`;
26
+ }
27
+ if (path.includes(".")) {
28
+ const [obj, method] = path.split(".");
29
+ return ` if (typeof serverExports.${obj} === 'object' && serverExports.${obj} !== null && typeof serverExports.${obj}.${method} === 'function') return serverExports.${obj}.${method}.bind(serverExports.${obj});`;
30
+ }
31
+ return ` if (typeof serverExports.${path} === 'function') return serverExports.${path};`;
32
+ }
33
+ /**
34
+ * Generate handler setup code from detection paths
35
+ */
36
+ function generateHandlerSetup(detectPaths) {
37
+ const checks = detectPaths.map(generateDetectCheck).join("\n");
38
+ const expectedList = detectPaths.join(", ");
39
+ return `
40
+ const getHandler = () => {
41
+ ${checks}
42
+ throw new Error('No handler found. Expected: ${expectedList}');
43
+ };
44
+ const handler = getHandler();`.trim();
45
+ }
46
+ /**
47
+ * Create a webHandler preset with custom detection paths
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * // TanStack Start - only check server.fetch
52
+ * const preset = createWebHandlerPreset(["default.fetch", "server.fetch"]);
53
+ *
54
+ * // Custom framework
55
+ * const preset = createWebHandlerPreset(["default", "myHandler", "app.handle"]);
56
+ * ```
57
+ */
58
+ export function createWebHandlerPreset(detectPaths = DEFAULT_HANDLER_DETECT_PATHS) {
59
+ return {
60
+ handlerSetup: generateHandlerSetup(detectPaths),
61
+ handlerCall: "handler(webRequest, ...args)",
62
+ };
63
+ }
64
+ // ============================================================================
65
+ // Built-in Presets
66
+ // ============================================================================
67
+ /**
68
+ * Built-in server wrapper presets (generic, framework-agnostic)
69
+ *
70
+ * Note: All presets use `serverBuild` (namespace import) and `serverExports` (rest exports)
71
+ * which are automatically provided by generateServerWrapperCode()
72
+ *
73
+ * Framework-specific presets should be defined in their respective adapter packages.
74
+ */
75
+ export const SERVER_WRAPPER_PRESETS = {
76
+ /**
77
+ * Web Handler - Request/Response pattern
78
+ *
79
+ * Supports multiple export patterns (configurable via createWebHandlerPreset):
80
+ * - default export function
81
+ * - default.fetch (app object with fetch method)
82
+ * - named `handler` export
83
+ * - named `fetch` export
84
+ * - `app.fetch` pattern (Hono style)
85
+ * - `server.fetch` pattern (TanStack Start)
86
+ */
87
+ webHandler: createWebHandlerPreset(),
88
+ /**
89
+ * HTML Render - render function returning {head, html}
90
+ *
91
+ * Standard Vite SSR pattern where render(url) returns HTML fragments
92
+ * that are injected into the HTML template.
93
+ */
94
+ htmlRender: {
95
+ requiresHtmlTemplate: true,
96
+ handlerSetup: `
97
+ const renderFn = typeof serverExports.render === 'function'
98
+ ? serverExports.render
99
+ : (typeof defaultExport === 'function' ? defaultExport : null);
100
+
101
+ if (!renderFn) {
102
+ throw new Error('No render function found in server build. Expected export: render(url)');
103
+ }
104
+
105
+ async function handleSSRRequest(request) {
106
+ const url = new URL(request.url);
107
+ const pathname = url.pathname;
108
+
109
+ try {
110
+ const rendered = await renderFn(pathname);
111
+ let html = __HTML_TEMPLATE__
112
+ .replace('<!--app-head-->', rendered.head ?? '')
113
+ .replace('<!--app-html-->', rendered.html ?? '');
114
+
115
+ return new Response(html, {
116
+ status: 200,
117
+ headers: { 'Content-Type': 'text/html; charset=utf-8' }
118
+ });
119
+ } catch (error) {
120
+ console.error('SSR render error:', error);
121
+ return new Response('Internal Server Error: ' + error.message, {
122
+ status: 500,
123
+ headers: { 'Content-Type': 'text/plain' }
124
+ });
125
+ }
126
+ }`.trim(),
127
+ handlerCall: "handleSSRRequest(webRequest)",
128
+ },
129
+ };
130
+ /**
131
+ * Create a server wrapper preset
132
+ *
133
+ * Helper function to create a properly typed preset with validation and normalization.
134
+ * Automatically trims handlerSetup and validates required fields.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * const myPreset = createServerWrapperPreset({
139
+ * imports: `import { handler } from 'my-framework';`,
140
+ * handlerSetup: `const requestHandler = handler(serverExports);`,
141
+ * handlerCall: "requestHandler(webRequest)",
142
+ * });
143
+ * ```
144
+ */
145
+ export function createServerWrapperPreset(config) {
146
+ if (!config.handlerSetup) {
147
+ throw new Error("Server wrapper preset must have handlerSetup");
148
+ }
149
+ if (!config.handlerCall) {
150
+ throw new Error("Server wrapper preset must have handlerCall");
151
+ }
152
+ return {
153
+ imports: config.imports,
154
+ handlerSetup: config.handlerSetup.trim(),
155
+ handlerCall: config.handlerCall,
156
+ requiresHtmlTemplate: config.requiresHtmlTemplate,
157
+ };
158
+ }
159
+ /**
160
+ * Extend core server wrapper presets with custom presets
161
+ *
162
+ * This utility provides a standardized way for adapters to:
163
+ * 1. Add framework-specific presets while keeping core presets
164
+ * 2. Get a type-safe resolver function
165
+ * 3. Export extended presets for external use
166
+ *
167
+ * Custom presets are automatically validated and normalized using createServerWrapperPreset().
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * // In vite-adapter - can pass raw config, will be validated automatically
172
+ * const { presets, resolvePreset } = extendServerWrapperPresets({
173
+ * vike: {
174
+ * imports: `import { renderPage } from 'vike/server';`,
175
+ * handlerSetup: `...`,
176
+ * handlerCall: "handleVikeRequest(webRequest)",
177
+ * },
178
+ * });
179
+ *
180
+ * export const SERVER_WRAPPER_PRESETS = presets;
181
+ * export type ServerWrapperPresetName = keyof typeof presets;
182
+ *
183
+ * // Use in adapter
184
+ * const resolved = resolvePreset(options.serverWrapper || "htmlRender");
185
+ * ```
186
+ */
187
+ export function extendServerWrapperPresets(customPresets) {
188
+ // Validate and normalize all custom presets
189
+ const normalizedCustomPresets = {};
190
+ for (const [key, preset] of Object.entries(customPresets)) {
191
+ normalizedCustomPresets[key] =
192
+ createServerWrapperPreset(preset);
193
+ }
194
+ const extendedPresets = {
195
+ ...SERVER_WRAPPER_PRESETS,
196
+ ...normalizedCustomPresets,
197
+ };
198
+ function resolvePreset(preset) {
199
+ if (typeof preset === "string") {
200
+ const resolved = extendedPresets[preset];
201
+ if (!resolved) {
202
+ throw new Error(`Unknown server wrapper preset: "${preset}". Available presets: ${Object.keys(extendedPresets).join(", ")}`);
203
+ }
204
+ return resolved;
205
+ }
206
+ // Validate and normalize inline preset
207
+ return createServerWrapperPreset(preset);
208
+ }
209
+ function getPresetNames() {
210
+ return Object.keys(extendedPresets);
211
+ }
212
+ return {
213
+ presets: extendedPresets,
214
+ resolvePreset,
215
+ getPresetNames,
216
+ };
217
+ }
218
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/factory/presets.ts"],"names":[],"mappings":"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"}
package/dist/factory.d.ts CHANGED
@@ -108,6 +108,62 @@ export declare function createFrameworkAdapter(config: AdapterFactoryConfig, opt
108
108
  * Create a stateful adapter (for complex adapters needing shared state)
109
109
  */
110
110
  export declare function createStatefulAdapter<TState extends object>(initialState: TState, factory: (state: TState) => FrameworkAdapter): FrameworkAdapter;
111
+ /**
112
+ * Result of extending server wrapper presets
113
+ */
114
+ export interface ExtendedPresetsResult<TCustom extends Record<string, ServerWrapperPreset>> {
115
+ /** Extended presets object (core + custom) */
116
+ presets: typeof SERVER_WRAPPER_PRESETS & TCustom;
117
+ /** Type-safe preset resolver function */
118
+ resolvePreset: (preset: keyof (typeof SERVER_WRAPPER_PRESETS & TCustom) | ServerWrapperPreset) => ServerWrapperPreset;
119
+ /** Get all available preset names */
120
+ getPresetNames: () => (keyof (typeof SERVER_WRAPPER_PRESETS & TCustom))[];
121
+ }
122
+ /**
123
+ * Create a server wrapper preset
124
+ *
125
+ * Helper function to create a properly typed preset with validation and normalization.
126
+ * Automatically trims handlerSetup and validates required fields.
127
+ *
128
+ * @example
129
+ * ```ts
130
+ * const myPreset = createServerWrapperPreset({
131
+ * imports: `import { handler } from 'my-framework';`,
132
+ * handlerSetup: `const requestHandler = handler(serverExports);`,
133
+ * handlerCall: "requestHandler(webRequest)",
134
+ * });
135
+ * ```
136
+ */
137
+ export declare function createServerWrapperPreset(config: ServerWrapperPreset): ServerWrapperPreset;
138
+ /**
139
+ * Extend core server wrapper presets with custom presets
140
+ *
141
+ * This utility provides a standardized way for adapters to:
142
+ * 1. Add framework-specific presets while keeping core presets
143
+ * 2. Get a type-safe resolver function
144
+ * 3. Export extended presets for external use
145
+ *
146
+ * Custom presets are automatically validated and normalized using createServerWrapperPreset().
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * // In vite-adapter - can pass raw config, will be validated automatically
151
+ * const { presets, resolvePreset } = extendServerWrapperPresets({
152
+ * vike: {
153
+ * imports: `import { renderPage } from 'vike/server';`,
154
+ * handlerSetup: `...`,
155
+ * handlerCall: "handleVikeRequest(webRequest)",
156
+ * },
157
+ * });
158
+ *
159
+ * export const SERVER_WRAPPER_PRESETS = presets;
160
+ * export type ServerWrapperPresetName = keyof typeof presets;
161
+ *
162
+ * // Use in adapter
163
+ * const resolved = resolvePreset(options.serverWrapper || "viteSSR");
164
+ * ```
165
+ */
166
+ export declare function extendServerWrapperPresets<TCustom extends Record<string, ServerWrapperPreset>>(customPresets: TCustom): ExtendedPresetsResult<TCustom>;
111
167
  /**
112
168
  * Combine multiple detector functions (returns true if any matches)
113
169
  */
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,YAAY,EAEZ,SAAS,EAET,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAcpB,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC,0DAA0D;;;;;IAa1D,sCAAsC;;;;;IAetC,wDAAwD;;;;;;CAoChD,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC;IAC7D,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,OAAO,sBAAsB,GAAG,mBAAmB,CAAC;IAC1E,sCAAsC;IACtC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AA4QD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,qBAA0B,EACnC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAoDlB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,EACzD,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,gBAAgB,GAC3C,gBAAgB,CAElB;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB,CACpC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAEnD,8CAA8C;IAC9C,OAAO,EAAE,OAAO,sBAAsB,GAAG,OAAO,CAAC;IACjD,yCAAyC;IACzC,aAAa,EAAE,CACb,MAAM,EAAE,MAAM,CAAC,OAAO,sBAAsB,GAAG,OAAO,CAAC,GAAG,mBAAmB,KAC1E,mBAAmB,CAAC;IACzB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,sBAAsB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAC3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAarB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnD,aAAa,EAAE,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAwCxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,IAEzD,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAC1C,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAC1C,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,IAC/C,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAAC,CAcvD"}
package/dist/factory.js CHANGED
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import path from "path";
7
7
  import { pathExists, readFile, detectConfigFile, detectBuildDir, detectServerEntry, generateServerWrapperCode, createDefaultMeta, logBuildArtifacts, } from "./utils.js";
8
+ import { ViteConfigParser, } from "./vite-config-parser.js";
8
9
  import { parseRoutesFromSources, } from "./route-parser.js";
9
10
  /**
10
11
  * Built-in server wrapper presets (generic, framework-agnostic)
@@ -92,11 +93,23 @@ function createDefaultDetector(configFiles) {
92
93
  }
93
94
  /**
94
95
  * Create default getBuildArtifacts function
96
+ * Uses ViteConfigParser for comprehensive Vite config support:
97
+ * - build.outDir: custom output directory
98
+ * - build.assetsDir: static assets directory name
99
+ * - build.ssr: SSR entry point
100
+ * - build.manifest: manifest.json generation
101
+ * - base: public base path
102
+ * - rollupOptions.input: entry file(s)
103
+ * - rollupOptions.output.dir: output directory override
104
+ * - rollupOptions.output.entryFileNames: output filename pattern
105
+ * - rollupOptions.output.assetFileNames: asset filename pattern
106
+ * - rollupOptions.output.chunkFileNames: chunk filename pattern
95
107
  */
96
108
  function createDefaultBuildArtifactsGetter(name, buildDirs, serverEntryFiles, options) {
97
109
  const { clientBuildDir, serverBuildDir, serverEntry } = options;
98
110
  return async (context) => {
99
- const { projectRoot, isSSR, logger } = context;
111
+ const { projectRoot, isSSR, logger, viteConfig } = context;
112
+ // Resolve client directory
100
113
  let clientDir = null;
101
114
  if (clientBuildDir) {
102
115
  clientDir = path.join(projectRoot, clientBuildDir);
@@ -107,17 +120,61 @@ function createDefaultBuildArtifactsGetter(name, buildDirs, serverEntryFiles, op
107
120
  let serverDir = null;
108
121
  let serverEntryPath = null;
109
122
  if (isSSR && buildDirs.server) {
110
- if (serverBuildDir) {
111
- serverDir = path.join(projectRoot, serverBuildDir);
123
+ // Use ViteConfigParser for comprehensive config support
124
+ if (viteConfig) {
125
+ const configParser = new ViteConfigParser(viteConfig, projectRoot, {
126
+ logger,
127
+ serverEntryCandidates: serverEntryFiles,
128
+ });
129
+ // Priority 1: Explicit serverBuildDir option
130
+ if (serverBuildDir) {
131
+ serverDir = path.join(projectRoot, serverBuildDir);
132
+ }
133
+ else {
134
+ // Priority 2: Get from Vite config using parser
135
+ serverDir = configParser.getServerDir();
136
+ }
137
+ // Priority 3: Fall back to predefined build directories
138
+ if (!serverDir) {
139
+ serverDir = await detectBuildDir(projectRoot, buildDirs.server);
140
+ }
141
+ // Find server entry
142
+ if (serverEntry) {
143
+ // Explicit server entry path provided
144
+ serverEntryPath = path.join(projectRoot, serverEntry);
145
+ }
146
+ else if (serverDir) {
147
+ // Priority 1: Try to get server entry from Vite config using parser
148
+ serverEntryPath = await configParser.findServerEntry(serverDir);
149
+ if (serverEntryPath) {
150
+ logger.verbose(`Using server entry from Vite config: ${serverEntryPath}`);
151
+ }
152
+ // Priority 2: Fall back to file detection with recursive search
153
+ if (!serverEntryPath) {
154
+ serverEntryPath = await detectServerEntry(serverDir, serverEntryFiles, {
155
+ recursive: true,
156
+ logger,
157
+ });
158
+ }
159
+ }
112
160
  }
113
161
  else {
114
- serverDir = await detectBuildDir(projectRoot, buildDirs.server);
115
- }
116
- if (serverEntry) {
117
- serverEntryPath = path.join(projectRoot, serverEntry);
118
- }
119
- else if (serverDir) {
120
- serverEntryPath = await detectServerEntry(serverDir, serverEntryFiles);
162
+ // No Vite config available, use fallback detection
163
+ if (serverBuildDir) {
164
+ serverDir = path.join(projectRoot, serverBuildDir);
165
+ }
166
+ else {
167
+ serverDir = await detectBuildDir(projectRoot, buildDirs.server);
168
+ }
169
+ if (serverEntry) {
170
+ serverEntryPath = path.join(projectRoot, serverEntry);
171
+ }
172
+ else if (serverDir) {
173
+ serverEntryPath = await detectServerEntry(serverDir, serverEntryFiles, {
174
+ recursive: true,
175
+ logger,
176
+ });
177
+ }
121
178
  }
122
179
  }
123
180
  logBuildArtifacts(logger, name, {
@@ -285,6 +342,94 @@ export function createFrameworkAdapter(config, options = {}, overrides) {
285
342
  export function createStatefulAdapter(initialState, factory) {
286
343
  return factory({ ...initialState });
287
344
  }
345
+ /**
346
+ * Create a server wrapper preset
347
+ *
348
+ * Helper function to create a properly typed preset with validation and normalization.
349
+ * Automatically trims handlerSetup and validates required fields.
350
+ *
351
+ * @example
352
+ * ```ts
353
+ * const myPreset = createServerWrapperPreset({
354
+ * imports: `import { handler } from 'my-framework';`,
355
+ * handlerSetup: `const requestHandler = handler(serverExports);`,
356
+ * handlerCall: "requestHandler(webRequest)",
357
+ * });
358
+ * ```
359
+ */
360
+ export function createServerWrapperPreset(config) {
361
+ if (!config.handlerSetup) {
362
+ throw new Error("Server wrapper preset must have handlerSetup");
363
+ }
364
+ if (!config.handlerCall) {
365
+ throw new Error("Server wrapper preset must have handlerCall");
366
+ }
367
+ return {
368
+ imports: config.imports,
369
+ handlerSetup: config.handlerSetup.trim(),
370
+ handlerCall: config.handlerCall,
371
+ requiresHtmlTemplate: config.requiresHtmlTemplate,
372
+ };
373
+ }
374
+ /**
375
+ * Extend core server wrapper presets with custom presets
376
+ *
377
+ * This utility provides a standardized way for adapters to:
378
+ * 1. Add framework-specific presets while keeping core presets
379
+ * 2. Get a type-safe resolver function
380
+ * 3. Export extended presets for external use
381
+ *
382
+ * Custom presets are automatically validated and normalized using createServerWrapperPreset().
383
+ *
384
+ * @example
385
+ * ```ts
386
+ * // In vite-adapter - can pass raw config, will be validated automatically
387
+ * const { presets, resolvePreset } = extendServerWrapperPresets({
388
+ * vike: {
389
+ * imports: `import { renderPage } from 'vike/server';`,
390
+ * handlerSetup: `...`,
391
+ * handlerCall: "handleVikeRequest(webRequest)",
392
+ * },
393
+ * });
394
+ *
395
+ * export const SERVER_WRAPPER_PRESETS = presets;
396
+ * export type ServerWrapperPresetName = keyof typeof presets;
397
+ *
398
+ * // Use in adapter
399
+ * const resolved = resolvePreset(options.serverWrapper || "viteSSR");
400
+ * ```
401
+ */
402
+ export function extendServerWrapperPresets(customPresets) {
403
+ // Validate and normalize all custom presets
404
+ const normalizedCustomPresets = {};
405
+ for (const [key, preset] of Object.entries(customPresets)) {
406
+ normalizedCustomPresets[key] =
407
+ createServerWrapperPreset(preset);
408
+ }
409
+ const extendedPresets = {
410
+ ...SERVER_WRAPPER_PRESETS,
411
+ ...normalizedCustomPresets,
412
+ };
413
+ function resolvePreset(preset) {
414
+ if (typeof preset === "string") {
415
+ const resolved = extendedPresets[preset];
416
+ if (!resolved) {
417
+ throw new Error(`Unknown server wrapper preset: "${preset}". Available presets: ${Object.keys(extendedPresets).join(", ")}`);
418
+ }
419
+ return resolved;
420
+ }
421
+ // Validate and normalize inline preset
422
+ return createServerWrapperPreset(preset);
423
+ }
424
+ function getPresetNames() {
425
+ return Object.keys(extendedPresets);
426
+ }
427
+ return {
428
+ presets: extendedPresets,
429
+ resolvePreset,
430
+ getPresetNames,
431
+ };
432
+ }
288
433
  /**
289
434
  * Combine multiple detector functions (returns true if any matches)
290
435
  */