@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.
- package/dist/factory/detectors.d.ts +23 -0
- package/dist/factory/detectors.d.ts.map +1 -0
- package/dist/factory/detectors.js +60 -0
- package/dist/factory/detectors.js.map +1 -0
- package/dist/factory/hooks.d.ts +84 -0
- package/dist/factory/hooks.d.ts.map +1 -0
- package/dist/factory/hooks.js +227 -0
- package/dist/factory/hooks.js.map +1 -0
- package/dist/factory/index.d.ts +68 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +92 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/factory/presets.d.ts +132 -0
- package/dist/factory/presets.d.ts.map +1 -0
- package/dist/factory/presets.js +218 -0
- package/dist/factory/presets.js.map +1 -0
- package/dist/factory.d.ts +56 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +155 -10
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +9 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +35 -1
- package/dist/utils.js.map +1 -1
- package/dist/vite-config-parser.d.ts +203 -0
- package/dist/vite-config-parser.d.ts.map +1 -0
- package/dist/vite-config-parser.js +465 -0
- package/dist/vite-config-parser.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;GAIG;AA4BH;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAwB;IAC/D,SAAS,EAAS,yBAAyB;IAC3C,eAAe,EAAG,wCAAwC;IAC1D,SAAS,EAAS,qBAAqB;IACvC,OAAO,EAAW,mBAAmB;IACrC,WAAW,EAAO,wBAAwB;IAC1C,cAAc,EAAI,qCAAqC;CACxD,CAAC;AAEF;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,kEAAkE,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7B,OAAO,iKAAiK,CAAC;IAC3K,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,8BAA8B,GAAG,kCAAkC,GAAG,qCAAqC,GAAG,IAAI,MAAM,yCAAyC,GAAG,IAAI,MAAM,uBAAuB,GAAG,IAAI,CAAC;IACtN,CAAC;IACD,OAAO,8BAA8B,IAAI,yCAAyC,IAAI,GAAG,CAAC;AAC5F,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,WAAgC;IAC5D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,OAAO;;EAEP,MAAM;iDACyC,YAAY;;8BAE/B,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,cAAmC,4BAA4B;IAE/D,OAAO;QACL,YAAY,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC/C,WAAW,EAAE,8BAA8B;KAC5C,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC;;;;;;;;;;OAUG;IACH,UAAU,EAAE,sBAAsB,EAAE;IAEpC;;;;;OAKG;IACH,UAAU,EAAE;QACV,oBAAoB,EAAE,IAAI;QAC1B,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BhB,CAAC,IAAI,EAAE;QACL,WAAW,EAAE,8BAA8B;KAC5C;CACO,CAAC;AAsBX;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QACxC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,0BAA0B,CAExC,aAAsB;IACtB,4CAA4C;IAC5C,MAAM,uBAAuB,GAAG,EAAa,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzD,uBAA+D,CAAC,GAAG,CAAC;YACnE,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,eAAe,GAAG;QACtB,GAAG,sBAAsB;QACzB,GAAG,uBAAuB;KACgB,CAAC;IAI7C,SAAS,aAAa,CACpB,MAAwC;QAExC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAsC,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,mCAAmC,MAAM,yBAAyB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5G,CAAC;YACJ,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,uCAAuC;QACvC,OAAO,yBAAyB,CAAC,MAA6B,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,cAAc;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAiB,CAAC;IACtD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,aAAa;QACb,cAAc;KACf,CAAC;AACJ,CAAC"}
|
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
|
*/
|
package/dist/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
*/
|