@flight-framework/core 0.3.2 → 0.4.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/LICENSE +21 -21
- package/README.md +541 -541
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.d.ts +138 -1
- package/dist/adapters/index.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-3UQJE3XZ.js → chunk-2F2QU6RC.js} +2 -2
- package/dist/chunk-2F2QU6RC.js.map +1 -0
- package/dist/{chunk-4U7CJVNQ.js → chunk-3KRBRSRJ.js} +2 -2
- package/dist/chunk-3KRBRSRJ.js.map +1 -0
- package/dist/{chunk-OZ3EXPLE.js → chunk-3QP3E7HS.js} +2 -2
- package/dist/chunk-3QP3E7HS.js.map +1 -0
- package/dist/{chunk-CKJHJPKQ.js → chunk-62C7LX2E.js} +2 -2
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/{chunk-YNTMYL36.js → chunk-6BDCTUQY.js} +3 -3
- package/dist/chunk-6BDCTUQY.js.map +1 -0
- package/dist/{chunk-KDEA64UX.js → chunk-EGB7C73X.js} +5 -5
- package/dist/chunk-EGB7C73X.js.map +1 -0
- package/dist/{chunk-2JVEH76V.js → chunk-FSJNOPYE.js} +3 -3
- package/dist/chunk-FSJNOPYE.js.map +1 -0
- package/dist/{chunk-ARBKF6VI.js → chunk-GCQZ4FHI.js} +2 -2
- package/dist/{chunk-ARBKF6VI.js.map → chunk-GCQZ4FHI.js.map} +1 -1
- package/dist/{chunk-EHVUAFNH.js → chunk-IXMD5QH2.js} +2 -2
- package/dist/chunk-IXMD5QH2.js.map +1 -0
- package/dist/{chunk-6GI6HFSQ.js → chunk-K2CQZPCG.js} +2 -2
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-K5NYYNFS.js +311 -0
- package/dist/chunk-K5NYYNFS.js.map +1 -0
- package/dist/{chunk-6IG6XIXU.js → chunk-LNV47HGV.js} +2 -2
- package/dist/chunk-LNV47HGV.js.map +1 -0
- package/dist/{chunk-65JYF3DJ.js → chunk-MDQNNIHH.js} +2 -2
- package/dist/chunk-MDQNNIHH.js.map +1 -0
- package/dist/{chunk-GNS2FGPC.js → chunk-MQQLYWZZ.js} +2 -2
- package/dist/chunk-MQQLYWZZ.js.map +1 -0
- package/dist/{chunk-LAKHYTHL.js → chunk-NWMJYTMB.js} +3 -3
- package/dist/chunk-NWMJYTMB.js.map +1 -0
- package/dist/{chunk-R7MEVVA4.js → chunk-OYF2OAKS.js} +2 -2
- package/dist/chunk-OYF2OAKS.js.map +1 -0
- package/dist/{chunk-FRAH5QNY.js → chunk-P6WSBVDT.js} +4 -4
- package/dist/chunk-P6WSBVDT.js.map +1 -0
- package/dist/{chunk-5XHOLZBJ.js → chunk-PDW5WCMW.js} +2 -2
- package/dist/chunk-PDW5WCMW.js.map +1 -0
- package/dist/{chunk-A2QRUBVE.js → chunk-PVUMB632.js} +2 -2
- package/dist/chunk-PVUMB632.js.map +1 -0
- package/dist/{chunk-LKOPJ3GS.js → chunk-R7SQAREQ.js} +2 -2
- package/dist/chunk-R7SQAREQ.js.map +1 -0
- package/dist/{chunk-CNY3ZUVG.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/{chunk-PAVI5W6M.js → chunk-T4Z4HM4W.js} +3 -3
- package/dist/chunk-T4Z4HM4W.js.map +1 -0
- package/dist/{chunk-HNPO6LFW.js → chunk-TASAT7KB.js} +2 -2
- package/dist/chunk-TASAT7KB.js.map +1 -0
- package/dist/{chunk-3N5ZBVZJ.js → chunk-VPFMHGEV.js} +2 -2
- package/dist/chunk-VPFMHGEV.js.map +1 -0
- package/dist/{chunk-A4TKWQBU.js → chunk-W6D62JCI.js} +2 -2
- package/dist/chunk-W6D62JCI.js.map +1 -0
- package/dist/{chunk-UFWGOJL7.js → chunk-WFAWAHJH.js} +2 -2
- package/dist/chunk-WFAWAHJH.js.map +1 -0
- package/dist/{chunk-NZS2YJ43.js → chunk-WOEIJWGJ.js} +2 -2
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/{chunk-VNO2YUVD.js → chunk-XOIYNY4I.js} +2 -2
- package/dist/chunk-XOIYNY4I.js.map +1 -0
- package/dist/{chunk-PO7IHPFF.js → chunk-XSY5AAXT.js} +2 -2
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/{chunk-OZBPR27I.js → chunk-YHEVHRLH.js} +2 -2
- package/dist/chunk-YHEVHRLH.js.map +1 -0
- package/dist/{chunk-XU6MRYG2.js → chunk-ZIE56LCA.js} +3 -3
- package/dist/chunk-ZIE56LCA.js.map +1 -0
- package/dist/{chunk-B2LPSCES.js → chunk-ZVC3ZWLM.js} +2 -2
- package/dist/chunk-ZVC3ZWLM.js.map +1 -0
- package/dist/client.js +8 -8
- package/dist/client.js.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/handlers/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/islands/index.js +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/router/index.js +1 -1
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/context.js +1 -1
- package/dist/rsc/index.js +11 -11
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/payload.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.js +3 -3
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/dist/server/index.js +4 -4
- package/dist/streaming/adapters/index.js +1 -1
- package/dist/streaming/conditional.js +1 -1
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2JVEH76V.js.map +0 -1
- package/dist/chunk-3N5ZBVZJ.js.map +0 -1
- package/dist/chunk-3UQJE3XZ.js.map +0 -1
- package/dist/chunk-4U7CJVNQ.js.map +0 -1
- package/dist/chunk-5XHOLZBJ.js.map +0 -1
- package/dist/chunk-65JYF3DJ.js.map +0 -1
- package/dist/chunk-6GI6HFSQ.js.map +0 -1
- package/dist/chunk-6IG6XIXU.js.map +0 -1
- package/dist/chunk-A2QRUBVE.js.map +0 -1
- package/dist/chunk-A4TKWQBU.js.map +0 -1
- package/dist/chunk-B2LPSCES.js.map +0 -1
- package/dist/chunk-CKJHJPKQ.js.map +0 -1
- package/dist/chunk-CNY3ZUVG.js.map +0 -1
- package/dist/chunk-EHVUAFNH.js.map +0 -1
- package/dist/chunk-FRAH5QNY.js.map +0 -1
- package/dist/chunk-GNS2FGPC.js.map +0 -1
- package/dist/chunk-HNPO6LFW.js.map +0 -1
- package/dist/chunk-KDEA64UX.js.map +0 -1
- package/dist/chunk-LAKHYTHL.js.map +0 -1
- package/dist/chunk-LKOPJ3GS.js.map +0 -1
- package/dist/chunk-NZS2YJ43.js.map +0 -1
- package/dist/chunk-OZ3EXPLE.js.map +0 -1
- package/dist/chunk-OZBPR27I.js.map +0 -1
- package/dist/chunk-PAVI5W6M.js.map +0 -1
- package/dist/chunk-PO7IHPFF.js.map +0 -1
- package/dist/chunk-QK6UEQ75.js +0 -13
- package/dist/chunk-QK6UEQ75.js.map +0 -1
- package/dist/chunk-R7MEVVA4.js.map +0 -1
- package/dist/chunk-UFWGOJL7.js.map +0 -1
- package/dist/chunk-VNO2YUVD.js.map +0 -1
- package/dist/chunk-XU6MRYG2.js.map +0 -1
- package/dist/chunk-YNTMYL36.js.map +0 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// src/adapters/handler.ts
|
|
2
|
+
function createUniversalHandler(options = {}) {
|
|
3
|
+
const {
|
|
4
|
+
manifest,
|
|
5
|
+
routeRules = {},
|
|
6
|
+
basePath = "",
|
|
7
|
+
onError = defaultErrorHandler,
|
|
8
|
+
onNotFound = defaultNotFoundHandler,
|
|
9
|
+
hooks = {}
|
|
10
|
+
} = options;
|
|
11
|
+
return {
|
|
12
|
+
/**
|
|
13
|
+
* Handle incoming request
|
|
14
|
+
*/
|
|
15
|
+
async fetch(request, env, ctx) {
|
|
16
|
+
try {
|
|
17
|
+
if (hooks.beforeHandle) {
|
|
18
|
+
const modifiedRequest = await hooks.beforeHandle(request);
|
|
19
|
+
if (modifiedRequest) request = modifiedRequest;
|
|
20
|
+
}
|
|
21
|
+
const url = new URL(request.url);
|
|
22
|
+
let pathname = url.pathname;
|
|
23
|
+
if (basePath && pathname.startsWith(basePath)) {
|
|
24
|
+
pathname = pathname.slice(basePath.length) || "/";
|
|
25
|
+
}
|
|
26
|
+
const rules = matchRouteRules(pathname, routeRules);
|
|
27
|
+
if (rules?.redirect) {
|
|
28
|
+
return handleRedirect(rules.redirect);
|
|
29
|
+
}
|
|
30
|
+
if (rules?.proxy) {
|
|
31
|
+
return handleProxy(request, rules.proxy);
|
|
32
|
+
}
|
|
33
|
+
if (request.method === "OPTIONS" && rules?.cors) {
|
|
34
|
+
return handleCorsPreFlight(rules.cors);
|
|
35
|
+
}
|
|
36
|
+
const route = manifest?.routes?.find((r) => matchPath(pathname, r.path));
|
|
37
|
+
if (!route) {
|
|
38
|
+
return await onNotFound(request);
|
|
39
|
+
}
|
|
40
|
+
const context = {
|
|
41
|
+
url,
|
|
42
|
+
params: extractParams(pathname, route.path),
|
|
43
|
+
headers: request.headers,
|
|
44
|
+
method: request.method
|
|
45
|
+
};
|
|
46
|
+
if (hooks.beforeRender) {
|
|
47
|
+
await hooks.beforeRender(context);
|
|
48
|
+
}
|
|
49
|
+
let response;
|
|
50
|
+
switch (route.mode) {
|
|
51
|
+
case "ssr":
|
|
52
|
+
case "isr":
|
|
53
|
+
response = await handleSSR(context, options);
|
|
54
|
+
break;
|
|
55
|
+
case "ssg":
|
|
56
|
+
response = await handleSSG(context, options);
|
|
57
|
+
break;
|
|
58
|
+
case "csr":
|
|
59
|
+
response = handleCSR(options);
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
response = await handleSSR(context, options);
|
|
63
|
+
}
|
|
64
|
+
if (rules?.cache) {
|
|
65
|
+
response = applyCacheHeaders(response, rules.cache);
|
|
66
|
+
}
|
|
67
|
+
if (rules?.cors) {
|
|
68
|
+
response = applyCorsHeaders(response, rules.cors, request);
|
|
69
|
+
}
|
|
70
|
+
if (rules?.headers) {
|
|
71
|
+
response = applyCustomHeaders(response, rules.headers);
|
|
72
|
+
}
|
|
73
|
+
if (hooks.afterHandle) {
|
|
74
|
+
const modifiedResponse = await hooks.afterHandle(request, response);
|
|
75
|
+
if (modifiedResponse) response = modifiedResponse;
|
|
76
|
+
}
|
|
77
|
+
return response;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
return onError(error, request);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* Check if this handler can handle the request
|
|
84
|
+
*/
|
|
85
|
+
canHandle(request) {
|
|
86
|
+
const url = new URL(request.url);
|
|
87
|
+
let pathname = url.pathname;
|
|
88
|
+
if (basePath && pathname.startsWith(basePath)) {
|
|
89
|
+
pathname = pathname.slice(basePath.length) || "/";
|
|
90
|
+
}
|
|
91
|
+
if (manifest?.routes) {
|
|
92
|
+
return manifest.routes.some((r) => matchPath(pathname, r.path));
|
|
93
|
+
}
|
|
94
|
+
return Object.keys(routeRules).some(
|
|
95
|
+
(pattern) => matchPath(pathname, pattern)
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function defaultErrorHandler(error, _request) {
|
|
101
|
+
console.error("[Flight] Request error:", error);
|
|
102
|
+
return new Response(
|
|
103
|
+
JSON.stringify({
|
|
104
|
+
error: "Internal Server Error",
|
|
105
|
+
message: process.env.NODE_ENV === "development" ? error.message : void 0
|
|
106
|
+
}),
|
|
107
|
+
{
|
|
108
|
+
status: 500,
|
|
109
|
+
headers: { "Content-Type": "application/json" }
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
function defaultNotFoundHandler(_request) {
|
|
114
|
+
return new Response("Not Found", { status: 404 });
|
|
115
|
+
}
|
|
116
|
+
function matchRouteRules(pathname, rules) {
|
|
117
|
+
for (const [pattern, config] of Object.entries(rules)) {
|
|
118
|
+
if (matchPath(pathname, pattern)) {
|
|
119
|
+
return config;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
function matchPath(pathname, pattern) {
|
|
125
|
+
if (pattern === pathname) return true;
|
|
126
|
+
if (pattern.endsWith("/**")) {
|
|
127
|
+
const prefix = pattern.slice(0, -3);
|
|
128
|
+
return pathname.startsWith(prefix);
|
|
129
|
+
}
|
|
130
|
+
if (pattern.endsWith("/*")) {
|
|
131
|
+
const prefix = pattern.slice(0, -2);
|
|
132
|
+
const rest = pathname.slice(prefix.length);
|
|
133
|
+
return pathname.startsWith(prefix) && !rest.includes("/");
|
|
134
|
+
}
|
|
135
|
+
const patternParts = pattern.split("/");
|
|
136
|
+
const pathParts = pathname.split("/");
|
|
137
|
+
if (patternParts.length !== pathParts.length) return false;
|
|
138
|
+
return patternParts.every((part, i) => {
|
|
139
|
+
if (part.startsWith("[") && part.endsWith("]")) return true;
|
|
140
|
+
if (part.startsWith(":")) return true;
|
|
141
|
+
return part === pathParts[i];
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function extractParams(pathname, pattern) {
|
|
145
|
+
const params = {};
|
|
146
|
+
const patternParts = pattern.split("/");
|
|
147
|
+
const pathParts = pathname.split("/");
|
|
148
|
+
patternParts.forEach((part, i) => {
|
|
149
|
+
if (part.startsWith("[") && part.endsWith("]")) {
|
|
150
|
+
const key = part.slice(1, -1).replace("...", "");
|
|
151
|
+
params[key] = pathParts[i] ?? "";
|
|
152
|
+
} else if (part.startsWith(":")) {
|
|
153
|
+
params[part.slice(1)] = pathParts[i] ?? "";
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return params;
|
|
157
|
+
}
|
|
158
|
+
function handleRedirect(redirect) {
|
|
159
|
+
const to = typeof redirect === "string" ? redirect : redirect.to;
|
|
160
|
+
const status = typeof redirect === "string" ? 302 : redirect.statusCode ?? 302;
|
|
161
|
+
return new Response(null, {
|
|
162
|
+
status,
|
|
163
|
+
headers: { Location: to }
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function handleProxy(request, target) {
|
|
167
|
+
const url = new URL(request.url);
|
|
168
|
+
const targetUrl = new URL(target);
|
|
169
|
+
targetUrl.pathname = url.pathname;
|
|
170
|
+
targetUrl.search = url.search;
|
|
171
|
+
const proxyRequest = new Request(targetUrl.toString(), {
|
|
172
|
+
method: request.method,
|
|
173
|
+
headers: request.headers,
|
|
174
|
+
body: request.body
|
|
175
|
+
});
|
|
176
|
+
return fetch(proxyRequest);
|
|
177
|
+
}
|
|
178
|
+
function handleCorsPreFlight(cors) {
|
|
179
|
+
const options = cors === true ? {} : cors || {};
|
|
180
|
+
return new Response(null, {
|
|
181
|
+
status: 204,
|
|
182
|
+
headers: {
|
|
183
|
+
"Access-Control-Allow-Origin": resolveOrigin(options.origin),
|
|
184
|
+
"Access-Control-Allow-Methods": (options.methods ?? ["GET", "POST", "PUT", "DELETE", "PATCH"]).join(", "),
|
|
185
|
+
"Access-Control-Allow-Headers": (options.allowedHeaders ?? ["Content-Type", "Authorization"]).join(", "),
|
|
186
|
+
"Access-Control-Max-Age": String(options.maxAge ?? 86400),
|
|
187
|
+
...options.credentials && { "Access-Control-Allow-Credentials": "true" }
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function resolveOrigin(origin) {
|
|
192
|
+
if (origin === true || origin === void 0) return "*";
|
|
193
|
+
if (origin === false) return "*";
|
|
194
|
+
if (Array.isArray(origin)) return origin[0] ?? "*";
|
|
195
|
+
return origin;
|
|
196
|
+
}
|
|
197
|
+
function applyCacheHeaders(response, cache) {
|
|
198
|
+
const headers = new Headers(response.headers);
|
|
199
|
+
let cacheControl = `public, max-age=${cache.maxAge ?? 0}`;
|
|
200
|
+
if (cache.swr) {
|
|
201
|
+
cacheControl += `, stale-while-revalidate=${cache.swr}`;
|
|
202
|
+
}
|
|
203
|
+
headers.set("Cache-Control", cacheControl);
|
|
204
|
+
return new Response(response.body, {
|
|
205
|
+
status: response.status,
|
|
206
|
+
statusText: response.statusText,
|
|
207
|
+
headers
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function applyCorsHeaders(response, cors, _request) {
|
|
211
|
+
const options = cors === true ? {} : cors || {};
|
|
212
|
+
const headers = new Headers(response.headers);
|
|
213
|
+
headers.set("Access-Control-Allow-Origin", resolveOrigin(options.origin));
|
|
214
|
+
if (options.credentials) {
|
|
215
|
+
headers.set("Access-Control-Allow-Credentials", "true");
|
|
216
|
+
}
|
|
217
|
+
if (options.exposedHeaders) {
|
|
218
|
+
headers.set("Access-Control-Expose-Headers", options.exposedHeaders.join(", "));
|
|
219
|
+
}
|
|
220
|
+
return new Response(response.body, {
|
|
221
|
+
status: response.status,
|
|
222
|
+
statusText: response.statusText,
|
|
223
|
+
headers
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
function applyCustomHeaders(response, customHeaders) {
|
|
227
|
+
const headers = new Headers(response.headers);
|
|
228
|
+
for (const [key, value] of Object.entries(customHeaders)) {
|
|
229
|
+
headers.set(key, value);
|
|
230
|
+
}
|
|
231
|
+
return new Response(response.body, {
|
|
232
|
+
status: response.status,
|
|
233
|
+
statusText: response.statusText,
|
|
234
|
+
headers
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
async function handleSSR(context, options) {
|
|
238
|
+
const { framework, hooks } = options;
|
|
239
|
+
if (!framework) {
|
|
240
|
+
return new Response(createPlaceholderHTML(context.url.pathname), {
|
|
241
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
let result = await framework.renderToString({}, context);
|
|
245
|
+
if (hooks?.afterRender) {
|
|
246
|
+
const modifiedResult = await hooks.afterRender(result);
|
|
247
|
+
if (modifiedResult) result = modifiedResult;
|
|
248
|
+
}
|
|
249
|
+
return new Response(result.html, {
|
|
250
|
+
status: result.status,
|
|
251
|
+
headers: result.headers
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async function handleSSG(context, options) {
|
|
255
|
+
return handleSSR(context, options);
|
|
256
|
+
}
|
|
257
|
+
function handleCSR(options) {
|
|
258
|
+
const html = `<!DOCTYPE html>
|
|
259
|
+
<html>
|
|
260
|
+
<head>
|
|
261
|
+
<meta charset="UTF-8">
|
|
262
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
263
|
+
<title>Flight App</title>
|
|
264
|
+
</head>
|
|
265
|
+
<body>
|
|
266
|
+
<div id="app"></div>
|
|
267
|
+
<script type="module" src="/assets/client.js"></script>
|
|
268
|
+
</body>
|
|
269
|
+
</html>`;
|
|
270
|
+
return new Response(html, {
|
|
271
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
function createPlaceholderHTML(pathname) {
|
|
275
|
+
return `<!DOCTYPE html>
|
|
276
|
+
<html>
|
|
277
|
+
<head>
|
|
278
|
+
<meta charset="UTF-8">
|
|
279
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
280
|
+
<title>Flight</title>
|
|
281
|
+
<style>
|
|
282
|
+
body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #0a0a0a; color: #fafafa; }
|
|
283
|
+
.container { text-align: center; }
|
|
284
|
+
h1 { font-size: 3rem; margin-bottom: 0.5rem; }
|
|
285
|
+
p { color: #888; }
|
|
286
|
+
code { background: #1a1a1a; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.875rem; }
|
|
287
|
+
</style>
|
|
288
|
+
</head>
|
|
289
|
+
<body>
|
|
290
|
+
<div class="container">
|
|
291
|
+
<h1>Flight</h1>
|
|
292
|
+
<p>Path: <code>${pathname}</code></p>
|
|
293
|
+
<p>Configure a UI framework adapter to enable SSR.</p>
|
|
294
|
+
</div>
|
|
295
|
+
</body>
|
|
296
|
+
</html>`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// src/adapters/index.ts
|
|
300
|
+
function createAdapter(options) {
|
|
301
|
+
return {
|
|
302
|
+
name: options.name,
|
|
303
|
+
adapt: options.adapt,
|
|
304
|
+
emulate: options.emulate,
|
|
305
|
+
supports: options.supports
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export { createAdapter, createUniversalHandler };
|
|
310
|
+
//# sourceMappingURL=chunk-K5NYYNFS.js.map
|
|
311
|
+
//# sourceMappingURL=chunk-K5NYYNFS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/handler.ts","../src/adapters/index.ts"],"names":[],"mappings":"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","file":"chunk-K5NYYNFS.js","sourcesContent":["/**\r\n * Flight Universal Handler - Platform-agnostic request handler\r\n * \r\n * This is the core abstraction that allows Flight applications to run anywhere.\r\n * Adapters can use this handler, or implement their own - zero lock-in.\r\n * \r\n * @module @flight-framework/core/adapters/handler\r\n */\r\n\r\nimport type { RenderContext, RenderResult, UIFrameworkAdapter } from '../render/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Route rules for per-path configuration\r\n * Similar to Nitro's routeRules - completely optional to use\r\n */\r\nexport interface RouteRules {\r\n [pattern: string]: RouteRuleConfig;\r\n}\r\n\r\nexport interface RouteRuleConfig {\r\n /** Cache configuration */\r\n cache?: {\r\n /** Max age in seconds */\r\n maxAge?: number;\r\n /** Stale-while-revalidate in seconds */\r\n swr?: number;\r\n /** Vary headers */\r\n vary?: string[];\r\n };\r\n\r\n /** CORS configuration */\r\n cors?: boolean | CorsOptions;\r\n\r\n /** Headers to add to response */\r\n headers?: Record<string, string>;\r\n\r\n /** Redirect configuration */\r\n redirect?: string | {\r\n to: string;\r\n statusCode?: 301 | 302 | 303 | 307 | 308;\r\n };\r\n\r\n /** Proxy to another URL */\r\n proxy?: string;\r\n\r\n /** Render mode override */\r\n render?: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n\r\n /** ISR revalidation time in seconds */\r\n isr?: number;\r\n\r\n /** Prerender at build time */\r\n prerender?: boolean;\r\n}\r\n\r\nexport interface CorsOptions {\r\n origin?: string | string[] | boolean;\r\n methods?: string[];\r\n allowedHeaders?: string[];\r\n exposedHeaders?: string[];\r\n credentials?: boolean;\r\n maxAge?: number;\r\n}\r\n\r\n/**\r\n * Handler options - all optional, user configures what they need\r\n */\r\nexport interface UniversalHandlerOptions {\r\n /** Route manifest from build */\r\n manifest?: RouteManifest;\r\n\r\n /** UI framework adapter (optional - for SSR) */\r\n framework?: UIFrameworkAdapter;\r\n\r\n /** Route rules (optional) */\r\n routeRules?: RouteRules;\r\n\r\n /** Static files directory (optional) */\r\n staticDir?: string;\r\n\r\n /** Base path (optional) */\r\n basePath?: string;\r\n\r\n /** Custom error handler (optional) */\r\n onError?: (error: Error, request: Request) => Response | Promise<Response>;\r\n\r\n /** Custom not found handler (optional) */\r\n onNotFound?: (request: Request) => Response | Promise<Response>;\r\n\r\n /** Hooks for extensibility (optional) */\r\n hooks?: HandlerHooks;\r\n}\r\n\r\n/**\r\n * Handler hooks for extensibility - all optional\r\n */\r\nexport interface HandlerHooks {\r\n /** Before handling request */\r\n beforeHandle?: (request: Request) => Request | Promise<Request> | void;\r\n\r\n /** After getting response, before sending */\r\n afterHandle?: (request: Request, response: Response) => Response | Promise<Response> | void;\r\n\r\n /** Before SSR render */\r\n beforeRender?: (context: RenderContext) => void | Promise<void>;\r\n\r\n /** After SSR render */\r\n afterRender?: (result: RenderResult) => RenderResult | Promise<RenderResult>;\r\n}\r\n\r\n/**\r\n * Route manifest from build\r\n */\r\nexport interface RouteManifest {\r\n routes: Array<{\r\n path: string;\r\n component: string;\r\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n handler?: string;\r\n }>;\r\n staticFiles?: string[];\r\n}\r\n\r\n/**\r\n * Universal handler interface\r\n */\r\nexport interface UniversalHandler {\r\n /** Handle a fetch request */\r\n fetch(request: Request, env?: unknown, ctx?: unknown): Promise<Response>;\r\n\r\n /** Check if this handler can handle the request */\r\n canHandle(request: Request): boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Handler Factory\r\n// ============================================================================\r\n\r\n/**\r\n * Create a universal request handler\r\n * \r\n * This is the main abstraction for handling requests.\r\n * Adapters can use this, extend it, or ignore it completely.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Using the handler (optional)\r\n * import { createUniversalHandler } from '@flight-framework/core/adapters';\r\n * \r\n * const handler = createUniversalHandler({\r\n * manifest: await import('./manifest.json'),\r\n * routeRules: {\r\n * '/api/**': { cors: true },\r\n * '/blog/**': { cache: { maxAge: 3600 } },\r\n * },\r\n * });\r\n * \r\n * // In your adapter\r\n * export default {\r\n * fetch: handler.fetch,\r\n * };\r\n * ```\r\n */\r\nexport function createUniversalHandler(options: UniversalHandlerOptions = {}): UniversalHandler {\r\n const {\r\n manifest,\r\n routeRules = {},\r\n basePath = '',\r\n onError = defaultErrorHandler,\r\n onNotFound = defaultNotFoundHandler,\r\n hooks = {},\r\n } = options;\r\n\r\n return {\r\n /**\r\n * Handle incoming request\r\n */\r\n async fetch(request: Request, env?: unknown, ctx?: unknown): Promise<Response> {\r\n try {\r\n // Run beforeHandle hook\r\n if (hooks.beforeHandle) {\r\n const modifiedRequest = await hooks.beforeHandle(request);\r\n if (modifiedRequest) request = modifiedRequest;\r\n }\r\n\r\n const url = new URL(request.url);\r\n let pathname = url.pathname;\r\n\r\n // Strip base path if present\r\n if (basePath && pathname.startsWith(basePath)) {\r\n pathname = pathname.slice(basePath.length) || '/';\r\n }\r\n\r\n // Apply route rules\r\n const rules = matchRouteRules(pathname, routeRules);\r\n\r\n // Handle redirect rules\r\n if (rules?.redirect) {\r\n return handleRedirect(rules.redirect);\r\n }\r\n\r\n // Handle proxy rules\r\n if (rules?.proxy) {\r\n return handleProxy(request, rules.proxy);\r\n }\r\n\r\n // Handle CORS preflight\r\n if (request.method === 'OPTIONS' && rules?.cors) {\r\n return handleCorsPreFlight(rules.cors);\r\n }\r\n\r\n // Find matching route from manifest\r\n const route = manifest?.routes?.find(r => matchPath(pathname, r.path));\r\n\r\n // No matching route - try static or return 404\r\n if (!route) {\r\n return await onNotFound(request);\r\n }\r\n\r\n // Build render context\r\n const context: RenderContext = {\r\n url,\r\n params: extractParams(pathname, route.path),\r\n headers: request.headers,\r\n method: request.method,\r\n };\r\n\r\n // Run beforeRender hook\r\n if (hooks.beforeRender) {\r\n await hooks.beforeRender(context);\r\n }\r\n\r\n // Generate response based on route mode\r\n let response: Response;\r\n\r\n switch (route.mode) {\r\n case 'ssr':\r\n case 'isr':\r\n response = await handleSSR(context, options);\r\n break;\r\n case 'ssg':\r\n response = await handleSSG(context, options);\r\n break;\r\n case 'csr':\r\n response = handleCSR(options);\r\n break;\r\n default:\r\n response = await handleSSR(context, options);\r\n }\r\n\r\n // Apply cache headers from route rules\r\n if (rules?.cache) {\r\n response = applyCacheHeaders(response, rules.cache);\r\n }\r\n\r\n // Apply CORS headers\r\n if (rules?.cors) {\r\n response = applyCorsHeaders(response, rules.cors, request);\r\n }\r\n\r\n // Apply custom headers\r\n if (rules?.headers) {\r\n response = applyCustomHeaders(response, rules.headers);\r\n }\r\n\r\n // Run afterHandle hook\r\n if (hooks.afterHandle) {\r\n const modifiedResponse = await hooks.afterHandle(request, response);\r\n if (modifiedResponse) response = modifiedResponse;\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n return onError(error as Error, request);\r\n }\r\n },\r\n\r\n /**\r\n * Check if this handler can handle the request\r\n */\r\n canHandle(request: Request): boolean {\r\n const url = new URL(request.url);\r\n let pathname = url.pathname;\r\n\r\n if (basePath && pathname.startsWith(basePath)) {\r\n pathname = pathname.slice(basePath.length) || '/';\r\n }\r\n\r\n // Check manifest routes\r\n if (manifest?.routes) {\r\n return manifest.routes.some(r => matchPath(pathname, r.path));\r\n }\r\n\r\n // Check route rules\r\n return Object.keys(routeRules).some(pattern =>\r\n matchPath(pathname, pattern)\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Internal Helpers\r\n// ============================================================================\r\n\r\nfunction defaultErrorHandler(error: Error, _request: Request): Response {\r\n console.error('[Flight] Request error:', error);\r\n\r\n return new Response(\r\n JSON.stringify({\r\n error: 'Internal Server Error',\r\n message: process.env.NODE_ENV === 'development' ? error.message : undefined,\r\n }),\r\n {\r\n status: 500,\r\n headers: { 'Content-Type': 'application/json' },\r\n }\r\n );\r\n}\r\n\r\nfunction defaultNotFoundHandler(_request: Request): Response {\r\n return new Response('Not Found', { status: 404 });\r\n}\r\n\r\nfunction matchRouteRules(pathname: string, rules: RouteRules): RouteRuleConfig | null {\r\n for (const [pattern, config] of Object.entries(rules)) {\r\n if (matchPath(pathname, pattern)) {\r\n return config;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction matchPath(pathname: string, pattern: string): boolean {\r\n // Handle exact match\r\n if (pattern === pathname) return true;\r\n\r\n // Handle wildcard patterns\r\n if (pattern.endsWith('/**')) {\r\n const prefix = pattern.slice(0, -3);\r\n return pathname.startsWith(prefix);\r\n }\r\n\r\n if (pattern.endsWith('/*')) {\r\n const prefix = pattern.slice(0, -2);\r\n const rest = pathname.slice(prefix.length);\r\n return pathname.startsWith(prefix) && !rest.includes('/');\r\n }\r\n\r\n // Handle dynamic params\r\n const patternParts = pattern.split('/');\r\n const pathParts = pathname.split('/');\r\n\r\n if (patternParts.length !== pathParts.length) return false;\r\n\r\n return patternParts.every((part, i) => {\r\n if (part.startsWith('[') && part.endsWith(']')) return true;\r\n if (part.startsWith(':')) return true;\r\n return part === pathParts[i];\r\n });\r\n}\r\n\r\nfunction extractParams(pathname: string, pattern: string): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n const patternParts = pattern.split('/');\r\n const pathParts = pathname.split('/');\r\n\r\n patternParts.forEach((part, i) => {\r\n if (part.startsWith('[') && part.endsWith(']')) {\r\n const key = part.slice(1, -1).replace('...', '');\r\n params[key] = pathParts[i] ?? '';\r\n } else if (part.startsWith(':')) {\r\n params[part.slice(1)] = pathParts[i] ?? '';\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\nfunction handleRedirect(redirect: string | { to: string; statusCode?: number }): Response {\r\n const to = typeof redirect === 'string' ? redirect : redirect.to;\r\n const status = typeof redirect === 'string' ? 302 : (redirect.statusCode ?? 302);\r\n\r\n return new Response(null, {\r\n status,\r\n headers: { Location: to },\r\n });\r\n}\r\n\r\nasync function handleProxy(request: Request, target: string): Promise<Response> {\r\n const url = new URL(request.url);\r\n const targetUrl = new URL(target);\r\n targetUrl.pathname = url.pathname;\r\n targetUrl.search = url.search;\r\n\r\n const proxyRequest = new Request(targetUrl.toString(), {\r\n method: request.method,\r\n headers: request.headers,\r\n body: request.body,\r\n });\r\n\r\n return fetch(proxyRequest);\r\n}\r\n\r\nfunction handleCorsPreFlight(cors: boolean | CorsOptions): Response {\r\n // Normalize CORS options - true means default options, object means custom\r\n const options: CorsOptions = cors === true ? {} : (cors || {});\r\n\r\n return new Response(null, {\r\n status: 204,\r\n headers: {\r\n 'Access-Control-Allow-Origin': resolveOrigin(options.origin),\r\n 'Access-Control-Allow-Methods': (options.methods ?? ['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).join(', '),\r\n 'Access-Control-Allow-Headers': (options.allowedHeaders ?? ['Content-Type', 'Authorization']).join(', '),\r\n 'Access-Control-Max-Age': String(options.maxAge ?? 86400),\r\n ...(options.credentials && { 'Access-Control-Allow-Credentials': 'true' }),\r\n },\r\n });\r\n}\r\n\r\nfunction resolveOrigin(origin?: string | string[] | boolean): string {\r\n if (origin === true || origin === undefined) return '*';\r\n if (origin === false) return '*';\r\n if (Array.isArray(origin)) return origin[0] ?? '*';\r\n return origin;\r\n}\r\n\r\nfunction applyCacheHeaders(response: Response, cache: { maxAge?: number; swr?: number }): Response {\r\n const headers = new Headers(response.headers);\r\n\r\n let cacheControl = `public, max-age=${cache.maxAge ?? 0}`;\r\n if (cache.swr) {\r\n cacheControl += `, stale-while-revalidate=${cache.swr}`;\r\n }\r\n\r\n headers.set('Cache-Control', cacheControl);\r\n\r\n return new Response(response.body, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers,\r\n });\r\n}\r\n\r\nfunction applyCorsHeaders(response: Response, cors: boolean | CorsOptions, _request: Request): Response {\r\n // Normalize CORS options\r\n const options: CorsOptions = cors === true ? {} : (cors || {});\r\n const headers = new Headers(response.headers);\r\n\r\n headers.set('Access-Control-Allow-Origin', resolveOrigin(options.origin));\r\n\r\n if (options.credentials) {\r\n headers.set('Access-Control-Allow-Credentials', 'true');\r\n }\r\n\r\n if (options.exposedHeaders) {\r\n headers.set('Access-Control-Expose-Headers', options.exposedHeaders.join(', '));\r\n }\r\n\r\n return new Response(response.body, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers,\r\n });\r\n}\r\n\r\nfunction applyCustomHeaders(response: Response, customHeaders: Record<string, string>): Response {\r\n const headers = new Headers(response.headers);\r\n\r\n for (const [key, value] of Object.entries(customHeaders)) {\r\n headers.set(key, value);\r\n }\r\n\r\n return new Response(response.body, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers,\r\n });\r\n}\r\n\r\nasync function handleSSR(context: RenderContext, options: UniversalHandlerOptions): Promise<Response> {\r\n const { framework, hooks } = options;\r\n\r\n // If no framework adapter, return placeholder\r\n if (!framework) {\r\n return new Response(createPlaceholderHTML(context.url.pathname), {\r\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\r\n });\r\n }\r\n\r\n // Render with framework adapter\r\n let result = await framework.renderToString({} as never, context);\r\n\r\n // Run afterRender hook\r\n if (hooks?.afterRender) {\r\n const modifiedResult = await hooks.afterRender(result);\r\n if (modifiedResult) result = modifiedResult;\r\n }\r\n\r\n return new Response(result.html, {\r\n status: result.status,\r\n headers: result.headers,\r\n });\r\n}\r\n\r\nasync function handleSSG(context: RenderContext, options: UniversalHandlerOptions): Promise<Response> {\r\n // For SSG, typically serve pre-rendered HTML\r\n // Fall back to SSR if not found\r\n return handleSSR(context, options);\r\n}\r\n\r\nfunction handleCSR(options: UniversalHandlerOptions): Response {\r\n const html = `<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Flight App</title>\r\n </head>\r\n <body>\r\n <div id=\"app\"></div>\r\n <script type=\"module\" src=\"/assets/client.js\"></script>\r\n </body>\r\n</html>`;\r\n\r\n return new Response(html, {\r\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\r\n });\r\n}\r\n\r\nfunction createPlaceholderHTML(pathname: string): string {\r\n return `<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Flight</title>\r\n <style>\r\n body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #0a0a0a; color: #fafafa; }\r\n .container { text-align: center; }\r\n h1 { font-size: 3rem; margin-bottom: 0.5rem; }\r\n p { color: #888; }\r\n code { background: #1a1a1a; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.875rem; }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"container\">\r\n <h1>Flight</h1>\r\n <p>Path: <code>${pathname}</code></p>\r\n <p>Configure a UI framework adapter to enable SSR.</p>\r\n </div>\r\n </body>\r\n</html>`;\r\n}\r\n\r\n// Note: All exports are at the point of definition (export interface, export function)\r\n","/**\r\n * Flight Adapters - Universal deployment adapters\r\n * \r\n * Adapters transform Flight's output for different deployment targets.\r\n * The user chooses where to deploy - Flight provides the adapters.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Build manifest containing all generated assets */\r\nexport interface BuildManifest {\r\n /** Entry points by name */\r\n entries: Record<string, string>;\r\n /** All generated files */\r\n files: string[];\r\n /** Route information */\r\n routes: RouteManifestEntry[];\r\n /** Server entry point (if applicable) */\r\n serverEntry?: string;\r\n /** Client entry point */\r\n clientEntry?: string;\r\n}\r\n\r\n/** Route information in manifest */\r\nexport interface RouteManifestEntry {\r\n /** Route path pattern */\r\n path: string;\r\n /** Render mode for this route */\r\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n /** Component/handler file path */\r\n component: string;\r\n /** Pre-rendered paths (for SSG/ISR) */\r\n prerendered?: string[];\r\n}\r\n\r\n/** Builder utilities passed to adapters */\r\nexport interface AdapterBuilder {\r\n /** Build manifest */\r\n manifest: BuildManifest;\r\n /** Project root directory */\r\n root: string;\r\n /** Build output directory */\r\n outDir: string;\r\n\r\n /** Read a file from the build output */\r\n readFile(path: string): Promise<string>;\r\n /** Write a file to the adapter output */\r\n writeFile(path: string, content: string): Promise<void>;\r\n /** Copy files from build to adapter output */\r\n copy(from: string, to: string): Promise<void>;\r\n /** Get all files matching a pattern */\r\n glob(pattern: string): Promise<string[]>;\r\n /** Compress files for production */\r\n compress?(files: string[]): Promise<void>;\r\n\r\n /** Log info message */\r\n log: {\r\n info(message: string): void;\r\n warn(message: string): void;\r\n error(message: string): void;\r\n };\r\n}\r\n\r\n/** Flight adapter interface */\r\nexport interface FlightAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** \r\n * Transform the build output for the target platform\r\n * This is called after Flight's build process completes\r\n */\r\n adapt(builder: AdapterBuilder): Promise<void>;\r\n\r\n /**\r\n * Optional: Start listening for requests (for Node.js/Bun adapters)\r\n */\r\n listen?(server: unknown, port: number): Promise<void>;\r\n\r\n /**\r\n * Optional: Emulate the platform during development\r\n * Useful for testing platform-specific behavior locally\r\n */\r\n emulate?(): {\r\n /** Platform-specific env vars */\r\n env?: Record<string, string>;\r\n /** Custom middleware for dev server */\r\n middleware?: unknown[];\r\n };\r\n\r\n /**\r\n * Optional: Declare what this adapter supports\r\n * Flight uses this to warn about incompatible features\r\n */\r\n supports?: {\r\n /** Can read files at runtime (for dynamic content) */\r\n read?: () => boolean;\r\n /** Supports streaming responses */\r\n streaming?: () => boolean;\r\n /** Supports WebSockets */\r\n websockets?: () => boolean;\r\n /** Supports edge runtime */\r\n edge?: () => boolean;\r\n /** Supports Node.js runtime */\r\n node?: () => boolean;\r\n };\r\n}\r\n\r\n\r\n// ============================================================================\r\n// Adapter Factory Helper\r\n// ============================================================================\r\n\r\nexport interface AdapterOptions {\r\n name: string;\r\n adapt: (builder: AdapterBuilder) => Promise<void>;\r\n emulate?: FlightAdapter['emulate'];\r\n supports?: FlightAdapter['supports'];\r\n}\r\n\r\n/**\r\n * Create a Flight adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createAdapter } from '@flight-framework/core/adapters';\r\n * \r\n * export default function myAdapter(options = {}) {\r\n * return createAdapter({\r\n * name: 'my-adapter',\r\n * async adapt(builder) {\r\n * // Transform build output for your platform\r\n * },\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport function createAdapter(options: AdapterOptions): FlightAdapter {\r\n return {\r\n name: options.name,\r\n adapt: options.adapt,\r\n emulate: options.emulate,\r\n supports: options.supports,\r\n };\r\n}\r\n\r\n// Re-export universal handler for adapters to use (optional)\r\nexport * from './handler.js';\r\n\r\n// ============================================================================\r\n// Agnostic Service Adapters (Interfaces)\r\n// ============================================================================\r\n\r\n/**\r\n * Storage Adapter Interface\r\n * \r\n * Implement this to use any storage provider:\r\n * S3, Supabase Storage, Cloudflare R2, local filesystem, etc.\r\n */\r\nexport interface StorageAdapter {\r\n name: string;\r\n\r\n /** Upload a file */\r\n upload(path: string, data: Buffer | Uint8Array | string, options?: {\r\n contentType?: string;\r\n metadata?: Record<string, string>;\r\n }): Promise<{ url: string; path: string }>;\r\n\r\n /** Download a file */\r\n download(path: string): Promise<Buffer>;\r\n\r\n /** Delete a file */\r\n delete(path: string): Promise<void>;\r\n\r\n /** List files with optional prefix */\r\n list(prefix?: string): Promise<string[]>;\r\n\r\n /** Get a signed URL for direct access */\r\n getSignedUrl?(path: string, options?: {\r\n expiresIn?: number;\r\n operation?: 'read' | 'write';\r\n }): Promise<string>;\r\n}\r\n\r\n/**\r\n * Auth Adapter Interface\r\n * \r\n * Implement this to use any auth provider:\r\n * Better Auth, Supabase Auth, Lucia, Auth.js, etc.\r\n */\r\nexport interface AuthAdapter {\r\n name: string;\r\n\r\n /** Get the current user from a request */\r\n getUser(request: Request): Promise<AuthUser | null>;\r\n\r\n /** Verify a session token */\r\n verifySession(token: string): Promise<AuthSession | null>;\r\n\r\n /** Optional middleware for handling auth-specific routes (e.g., /api/auth/*) */\r\n middleware?: (req: Request) => Promise<Response | null>;\r\n}\r\n\r\nexport interface AuthUser {\r\n id: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface AuthSession {\r\n user: AuthUser;\r\n expiresAt: Date;\r\n token: string;\r\n}\r\n\r\n/**\r\n * Email Adapter Interface\r\n * \r\n * Implement this to use any email provider:\r\n * Resend, SendGrid, Postmark, SMTP, etc.\r\n */\r\nexport interface EmailAdapter {\r\n name: string;\r\n\r\n /** Send an email */\r\n send(options: {\r\n to: string | string[];\r\n subject: string;\r\n html?: string;\r\n text?: string;\r\n from?: string;\r\n replyTo?: string;\r\n attachments?: Array<{\r\n filename: string;\r\n content: Buffer | string;\r\n contentType?: string;\r\n }>;\r\n }): Promise<{ id: string; success: boolean }>;\r\n}\r\n\r\n/**\r\n * Queue/Jobs Adapter Interface\r\n * \r\n * Implement this to use any job queue:\r\n * BullMQ, Quirrel, Inngest, custom, etc.\r\n */\r\nexport interface JobsAdapter {\r\n name: string;\r\n\r\n /** Add a job to the queue */\r\n enqueue<T>(jobName: string, data: T, options?: {\r\n delay?: number;\r\n priority?: number;\r\n retries?: number;\r\n }): Promise<{ id: string }>;\r\n\r\n /** Schedule a recurring job */\r\n schedule?(jobName: string, cron: string, data?: unknown): Promise<{ id: string }>;\r\n\r\n /** Cancel a job */\r\n cancel?(jobId: string): Promise<void>;\r\n}\r\n\r\n/**\r\n * Database Adapter Interface\r\n * \r\n * Note: This is intentionally minimal. \r\n * For databases, use your preferred ORM/query builder directly.\r\n * This interface is for Flight's internal use (sessions, cache, etc.)\r\n */\r\nexport interface DatabaseAdapter {\r\n name: string;\r\n\r\n /** Raw query execution */\r\n query<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;\r\n\r\n /** Execute a mutation */\r\n execute(sql: string, params?: unknown[]): Promise<{ rowsAffected: number }>;\r\n\r\n /** Transaction support */\r\n transaction?<T>(fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T>;\r\n}\r\n"]}
|
|
@@ -196,5 +196,5 @@ function isRedirectError(error) {
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, isNotFoundError, isRedirectError, notFound, redirect, revalidatePath, revalidateTag, serializeProps, serverFetch, withAsyncErrorBoundary, withErrorBoundary };
|
|
199
|
-
//# sourceMappingURL=chunk-
|
|
200
|
-
//# sourceMappingURL=chunk-
|
|
199
|
+
//# sourceMappingURL=chunk-LNV47HGV.js.map
|
|
200
|
+
//# sourceMappingURL=chunk-LNV47HGV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/legacy.ts"],"names":[],"mappings":"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","file":"chunk-LNV47HGV.js","sourcesContent":["/**\r\n * @flight-framework/core - Legacy RSC Support\r\n * \r\n * Backward compatibility module for the original RSC implementation.\r\n * Use the new API from './index.js' for new features.\r\n * \r\n * @deprecated Use the new RSC API instead\r\n * @module @flight-framework/core/rsc/legacy\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Component rendering context\r\n * @deprecated Use ServerContext from './context.js' instead\r\n */\r\nexport interface RenderContext {\r\n /** Current request */\r\n request: Request;\r\n /** Route params */\r\n params: Record<string, string>;\r\n /** Search params */\r\n searchParams: URLSearchParams;\r\n /** Request headers */\r\n headers: Headers;\r\n /** Cookies */\r\n cookies: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Server component definition\r\n * @deprecated Use ServerComponentFn from './index.js' instead\r\n */\r\nexport interface ServerComponent<P = unknown> {\r\n (props: P, context: RenderContext): Promise<string> | string;\r\n /** Mark as server component */\r\n __flight_server?: true;\r\n /** Dependencies for hydration */\r\n __flight_deps?: string[];\r\n}\r\n\r\n/**\r\n * Client component definition\r\n * @deprecated Use ClientReference from './boundaries.js' instead\r\n */\r\nexport interface ClientComponent<P = unknown> {\r\n (props: P): unknown;\r\n /** Mark as client component */\r\n __flight_client?: true;\r\n /** Client bundle path */\r\n __flight_bundle?: string;\r\n}\r\n\r\n/**\r\n * Component type detection\r\n */\r\nexport type ComponentType = 'server' | 'client' | 'hybrid';\r\n\r\n// ============================================================================\r\n// Server Component Execution\r\n// ============================================================================\r\n\r\n/**\r\n * Execute an async server component\r\n * @deprecated Use the new rendering pipeline instead\r\n */\r\nexport async function executeServerComponent<P>(\r\n component: ServerComponent<P>,\r\n props: P,\r\n context: RenderContext\r\n): Promise<string> {\r\n try {\r\n const result = await component(props, context);\r\n return result;\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a render context from a Request\r\n * @deprecated Use createServerContext from './context.js' instead\r\n */\r\nexport function createRenderContext(request: Request, params: Record<string, string> = {}): RenderContext {\r\n const url = new URL(request.url);\r\n\r\n // Parse cookies\r\n const cookies = new Map<string, string>();\r\n const cookieHeader = request.headers.get('cookie') || '';\r\n cookieHeader.split(';').forEach(cookie => {\r\n const [key, value] = cookie.trim().split('=');\r\n if (key && value) cookies.set(key, value);\r\n });\r\n\r\n return {\r\n request,\r\n params,\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Data Fetching Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Cache for server-side fetch requests\r\n */\r\nconst fetchCache = new Map<string, { data: unknown; timestamp: number }>();\r\n\r\n/**\r\n * Server-side fetch with automatic caching\r\n */\r\nexport async function serverFetch<T>(\r\n url: string,\r\n options: RequestInit & {\r\n revalidate?: number | false;\r\n tags?: string[];\r\n } = {}\r\n): Promise<T> {\r\n const { revalidate = 60, ...fetchOptions } = options;\r\n const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;\r\n\r\n // Check cache\r\n const cached = fetchCache.get(cacheKey);\r\n if (cached) {\r\n const age = Date.now() - cached.timestamp;\r\n if (revalidate === false || age < (revalidate * 1000)) {\r\n return cached.data as T;\r\n }\r\n }\r\n\r\n // Fetch fresh data\r\n const response = await fetch(url, fetchOptions);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Fetch failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Cache the result\r\n if (revalidate !== false) {\r\n fetchCache.set(cacheKey, {\r\n data,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n return data as T;\r\n}\r\n\r\n/**\r\n * Invalidate cache by tag\r\n */\r\nexport function revalidateTag(tag: string): void {\r\n console.log(`[Flight] Revalidating tag: ${tag}`);\r\n}\r\n\r\n/**\r\n * Invalidate cache by path\r\n */\r\nexport function revalidatePath(path: string): void {\r\n console.log(`[Flight] Revalidating path: ${path}`);\r\n}\r\n\r\n// ============================================================================\r\n// Component Serialization\r\n// ============================================================================\r\n\r\n/**\r\n * Serialize props for transmission to client\r\n * @deprecated Use serialize from './payload.js' instead\r\n */\r\nexport function serializeProps(props: unknown): string {\r\n function preProcess(value: unknown): unknown {\r\n if (value instanceof Date) {\r\n return { __type: 'Date', value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()).map(([k, v]) => [preProcess(k), preProcess(v)]) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value).map(preProcess) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n if (typeof value === 'function') {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(preProcess);\r\n }\r\n if (value && typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = preProcess(v);\r\n }\r\n return result;\r\n }\r\n return value;\r\n }\r\n\r\n return JSON.stringify(preProcess(props));\r\n}\r\n\r\n/**\r\n * Deserialize props on client\r\n * @deprecated Use deserialize from './payload.js' instead\r\n */\r\nexport function deserializeProps<T>(serialized: string): T {\r\n return JSON.parse(serialized, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.value);\r\n case 'Map':\r\n return new Map(value.value);\r\n case 'Set':\r\n return new Set(value.value);\r\n case 'BigInt':\r\n return BigInt(value.value);\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Client Component Boundary\r\n// ============================================================================\r\n\r\n/**\r\n * Create a client boundary placeholder\r\n * @deprecated Use clientRef from './payload.js' instead\r\n */\r\nexport function createClientBoundary(\r\n componentId: string,\r\n props: unknown,\r\n fallback?: string\r\n): string {\r\n const serializedProps = serializeProps(props);\r\n\r\n return `\r\n<!--flight-client:${componentId}-->\r\n<div data-flight-component=\"${componentId}\" data-flight-props='${serializedProps.replace(/'/g, \"'\")}'>\r\n ${fallback || '<div>Loading...</div>'}\r\n</div>\r\n<!--/flight-client-->\r\n<script type=\"module\">\r\n(async function() {\r\n const component = await import('/_flight/components/${componentId}.js');\r\n const props = JSON.parse('${serializedProps.replace(/'/g, \"\\\\'\")}');\r\n const container = document.querySelector('[data-flight-component=\"${componentId}\"]');\r\n if (container && component.default) {\r\n if (typeof component.hydrate === 'function') {\r\n component.hydrate(container, props);\r\n }\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n// ============================================================================\r\n// Async Component Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Helper to create an async server component\r\n * @deprecated Use async Server Components directly\r\n */\r\nexport function createAsyncComponent<P, T>(\r\n fetcher: (props: P, context: RenderContext) => Promise<T>,\r\n renderer: (data: T, props: P) => string\r\n): ServerComponent<P> {\r\n const component: ServerComponent<P> = async (props, context) => {\r\n const data = await fetcher(props, context);\r\n return renderer(data, props);\r\n };\r\n component.__flight_server = true;\r\n return component;\r\n}\r\n\r\n/**\r\n * Compose multiple server components\r\n * @deprecated Use Promise.all with async components\r\n */\r\nexport function composeComponents(\r\n ...components: Array<() => Promise<string> | string>\r\n): () => Promise<string> {\r\n return async () => {\r\n const results = await Promise.all(\r\n components.map(async (comp) => await comp())\r\n );\r\n return results.join('');\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Error Boundary for Server Components\r\n// ============================================================================\r\n\r\n/**\r\n * Options for async error boundary\r\n */\r\nexport interface AsyncErrorBoundaryOptions<P, R> {\r\n /** Fallback to render on error */\r\n fallback: (error: Error, props: P) => R;\r\n /** Optional callback when error occurs */\r\n onError?: (error: Error, props: P, context: RenderContext) => void;\r\n /** Whether to rethrow certain errors (e.g., redirects, not found) */\r\n rethrowNavigation?: boolean;\r\n}\r\n\r\n/**\r\n * Wrap an async server component with comprehensive error handling.\r\n *\r\n * @example\r\n * ```typescript\r\n * const SafeUserPage = withAsyncErrorBoundary(UserPage, {\r\n * fallback: (error, props) => `<div>Error loading user ${props.id}</div>`,\r\n * onError: (error, props) => console.error(`Failed to load user ${props.id}:`, error),\r\n * rethrowNavigation: true,\r\n * });\r\n * ```\r\n */\r\nexport function withAsyncErrorBoundary<P, R = string>(\r\n component: (props: P, context: RenderContext) => Promise<R> | R,\r\n options: AsyncErrorBoundaryOptions<P, R>\r\n): (props: P, context: RenderContext) => Promise<R> {\r\n const { fallback, onError, rethrowNavigation = true } = options;\r\n\r\n return async (props: P, context: RenderContext): Promise<R> => {\r\n try {\r\n return await component(props, context);\r\n } catch (error) {\r\n // Rethrow navigation errors if configured\r\n if (rethrowNavigation) {\r\n if (isNotFoundError(error)) {\r\n throw error;\r\n }\r\n if (isRedirectError(error)) {\r\n throw error;\r\n }\r\n }\r\n\r\n // Call error callback if provided\r\n if (onError) {\r\n try {\r\n onError(error as Error, props, context);\r\n } catch (callbackError) {\r\n console.error('[Flight] Error in onError callback:', callbackError);\r\n }\r\n }\r\n\r\n // Log error\r\n console.error('[Flight] Async component error:', error);\r\n\r\n // Return fallback\r\n return fallback(error as Error, props);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Wrap a server component with error handling\r\n * @deprecated Use withAsyncErrorBoundary instead\r\n */\r\nexport function withErrorBoundary<P>(\r\n component: ServerComponent<P>,\r\n errorFallback: (error: Error) => string\r\n): ServerComponent<P> {\r\n return async (props: P, context: RenderContext) => {\r\n try {\r\n return await component(props, context);\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n return errorFallback(error as Error);\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Not Found / Redirect Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Throw a not found error\r\n * @deprecated Use notFound from './context.js' instead\r\n */\r\nexport function notFound(): never {\r\n const error = new Error('Not Found');\r\n (error as Error & { __flight_not_found: boolean }).__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is not found\r\n * @deprecated Use isNotFoundError from './context.js' instead\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && (error as Error & { __flight_not_found?: boolean }).__flight_not_found === true;\r\n}\r\n\r\n/**\r\n * Server-side redirect\r\n * @deprecated Use redirect from './context.js' instead\r\n */\r\nexport function redirect(url: string, type: 'replace' | 'push' = 'replace'): never {\r\n const error = new Error(`Redirect: ${url}`);\r\n (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect = { url, type };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is redirect\r\n * @deprecated Use isRedirectError from './context.js' instead\r\n */\r\nexport function isRedirectError(error: unknown): { url: string; type: string } | null {\r\n if (error instanceof Error && (error as Error & { __flight_redirect?: unknown }).__flight_redirect) {\r\n return (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect;\r\n }\r\n return null;\r\n}\r\n"]}
|
|
@@ -225,5 +225,5 @@ function lazy(loader) {
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
export { createPreactAdapter, createPreactConsumer, lazy, markAsPreactClientComponent };
|
|
228
|
-
//# sourceMappingURL=chunk-
|
|
229
|
-
//# sourceMappingURL=chunk-
|
|
228
|
+
//# sourceMappingURL=chunk-MDQNNIHH.js.map
|
|
229
|
+
//# sourceMappingURL=chunk-MDQNNIHH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/adapters/preact.ts"],"names":[],"mappings":"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","file":"chunk-MDQNNIHH.js","sourcesContent":["/**\r\n * @flight-framework/core - Preact UI Adapter\r\n * \r\n * Adapter for using Preact with Flight Server Components.\r\n * Enables Flight to render Preact components without tight coupling.\r\n * \r\n * Philosophy: Zero lock-in - Preact is optional, user decides.\r\n * \r\n * @module @flight-framework/core/rsc/adapters/preact\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// Preact Symbols\r\n// ============================================================================\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal Preact VNode interface\r\n */\r\ninterface PreactVNode {\r\n type: unknown;\r\n props: Record<string, unknown>;\r\n key: string | number | null;\r\n ref: unknown;\r\n __?: unknown; // parent\r\n __k?: unknown[]; // children\r\n __b?: number; // depth\r\n __e?: unknown; // dom\r\n __c?: unknown; // component\r\n}\r\n\r\n/**\r\n * Preact dependencies (user provides these)\r\n */\r\nexport interface PreactDependencies {\r\n /** preact module */\r\n preact: {\r\n h: (type: unknown, props?: unknown, ...children: unknown[]) => PreactVNode;\r\n Fragment?: unknown;\r\n Component?: unknown;\r\n isValidElement?: (value: unknown) => boolean;\r\n cloneElement?: (vnode: PreactVNode, props?: unknown) => PreactVNode;\r\n };\r\n /** preact-render-to-string module (optional - for SSR) */\r\n renderToString?: (vnode: PreactVNode) => string;\r\n /** preact/hooks module (optional) */\r\n hooks?: {\r\n useState: <T>(initial: T) => [T, (v: T) => void];\r\n useEffect: (fn: () => void | (() => void), deps?: unknown[]) => void;\r\n useMemo: <T>(fn: () => T, deps: unknown[]) => T;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create Preact UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPreactAdapter } from '@flight-framework/core/rsc/adapters/preact';\r\n * import * as preact from 'preact';\r\n * import renderToString from 'preact-render-to-string';\r\n * \r\n * const adapter = createPreactAdapter({\r\n * preact,\r\n * renderToString,\r\n * });\r\n * \r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createPreactAdapter(deps?: PreactDependencies): UIAdapter {\r\n const { preact, renderToString } = deps || {};\r\n\r\n return {\r\n name: 'preact',\r\n\r\n isElement(value: unknown): boolean {\r\n if (preact?.isValidElement) {\r\n return preact.isValidElement(value);\r\n }\r\n // Fallback: check for VNode structure\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'type' in value &&\r\n 'props' in value\r\n );\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n const vnode = element as PreactVNode;\r\n const type = vnode.type;\r\n\r\n // Null type (text or null node)\r\n if (type === null) {\r\n const props = vnode.props;\r\n if (typeof props === 'string' || typeof props === 'number') {\r\n return { kind: 'text', value: String(props) };\r\n }\r\n return { kind: 'null' };\r\n }\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Fragment\r\n if (type === preact?.Fragment) {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n // Function component\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n\r\n // Check for class component (extends Component)\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\r\n if (preact?.Component && type.prototype instanceof (preact.Component as unknown as Function)) {\r\n return {\r\n kind: 'component',\r\n fn: (props) => {\r\n // Class components need instantiation\r\n const Component = type as new (props: unknown) => { render: () => unknown };\r\n const instance = new Component(props);\r\n return instance.render();\r\n },\r\n name: fn.displayName || fn.name || 'PreactComponent',\r\n };\r\n }\r\n\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'Component'\r\n };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n return (element as PreactVNode).props || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n const props = (element as PreactVNode).props;\r\n const children = props?.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n const key = (element as PreactVNode).key;\r\n return key !== null ? key : undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function') return false;\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Create a Preact VNode using h() if available\r\n if (preact?.h) {\r\n return preact.h(component, props);\r\n }\r\n\r\n // Fallback: create VNode structure directly\r\n return {\r\n type: component,\r\n props,\r\n key: null,\r\n ref: null,\r\n } as PreactVNode;\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (renderToString) {\r\n return renderToString(element as PreactVNode);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass preact-render-to-string when creating the adapter: ' +\r\n 'createPreactAdapter({ preact, renderToString })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Preact Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Preact consumer\r\n */\r\nexport interface PreactConsumerOptions {\r\n /** Registry of client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n}\r\n\r\n/**\r\n * Create a Preact client-side consumer for Flight payloads\r\n */\r\nexport function createPreactConsumer(\r\n deps: PreactDependencies,\r\n options: PreactConsumerOptions = {}\r\n) {\r\n const { preact } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to Preact VNodes\r\n */\r\n toPreactElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(\r\n element.tag,\r\n { ...element.props, key: element.key },\r\n ...children\r\n );\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'suspense': {\r\n // Preact doesn't have built-in Suspense, use fragment\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'client': {\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n // Create lazy loading wrapper\r\n // Preact doesn't have React.lazy, so we create a simple async loader\r\n const LazyWrapper = (props: Record<string, unknown>) => {\r\n // This is a simplified version - in production use @preact/signals\r\n // or a state management solution\r\n const loadedRef = { current: null as unknown };\r\n\r\n loader().then((mod: { default?: unknown }) => {\r\n loadedRef.current = mod.default ?? mod;\r\n });\r\n\r\n if (loadedRef.current) {\r\n return preact.h(loadedRef.current as string, props);\r\n }\r\n\r\n // Return SSR placeholder\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n\r\n return preact.h('div', { 'data-flight-loading': element.ref });\r\n };\r\n\r\n return preact.h(LazyWrapper, {});\r\n }\r\n\r\n case 'lazy': {\r\n if (element.fallback) {\r\n return this.toPreactElement(element.fallback);\r\n }\r\n return preact.h('div', { 'data-flight-pending': element.id });\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * Hydrate Flight payload into DOM\r\n */\r\n hydrate(\r\n chunks: import('../payload.js').FlightChunk[],\r\n container: Element,\r\n hydrateFn?: (vnode: unknown, container: Element) => void\r\n ): void {\r\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\r\n if (!rootChunk || rootChunk.type !== 'S') {\r\n throw new Error('[Flight] No root chunk found');\r\n }\r\n\r\n // Register client components\r\n for (const chunk of chunks) {\r\n if (chunk.type === 'C') {\r\n if (!registry.has(chunk.id)) {\r\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\r\n }\r\n }\r\n }\r\n\r\n const element = this.toPreactElement(rootChunk.tree);\r\n\r\n if (hydrateFn) {\r\n hydrateFn(element, container);\r\n } else {\r\n // Fallback: use preact.render (not ideal for SSR)\r\n const { render } = deps?.preact as { render?: (vnode: unknown, container: Element) => void } || {};\r\n if (render) {\r\n render(element, container);\r\n } else {\r\n throw new Error('[Flight] No hydrate or render function provided');\r\n }\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for Preact Server Component\r\n */\r\nexport type PreactServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<PreactVNode> | PreactVNode;\r\n\r\n/**\r\n * Mark a Preact component as a client component\r\n */\r\nexport function markAsPreactClientComponent<T extends (...args: unknown[]) => unknown>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n\r\n/**\r\n * Create a lazy-loading component for Preact\r\n */\r\nexport function lazy<T extends (...args: unknown[]) => unknown>(\r\n loader: () => Promise<{ default: T }>\r\n): T {\r\n let Component: T | null = null;\r\n let promise: Promise<{ default: T }> | null = null;\r\n\r\n const LazyComponent = ((props: unknown) => {\r\n if (Component) {\r\n return Component(props);\r\n }\r\n\r\n if (!promise) {\r\n promise = loader().then(mod => {\r\n Component = mod.default;\r\n return mod;\r\n });\r\n }\r\n\r\n throw promise; // Suspense-style\r\n }) as T;\r\n\r\n return LazyComponent;\r\n}\r\n"]}
|
|
@@ -284,5 +284,5 @@ function createStreamAdapter(framework, options) {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter };
|
|
287
|
-
//# sourceMappingURL=chunk-
|
|
288
|
-
//# sourceMappingURL=chunk-
|
|
287
|
+
//# sourceMappingURL=chunk-MQQLYWZZ.js.map
|
|
288
|
+
//# sourceMappingURL=chunk-MQQLYWZZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/streaming/adapters/index.ts"],"names":[],"mappings":"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","file":"chunk-MQQLYWZZ.js","sourcesContent":["/**\r\n * @flight-framework/core - Multi-Framework Streaming Adapters\r\n * \r\n * Streaming SSR adapters for React, Vue, Svelte, Solid, and HTMX.\r\n * Uses dependency injection pattern for optional framework dependencies.\r\n * \r\n * Best Practices 2026:\r\n * - Dependency injection for optional peer dependencies\r\n * - Support both Node.js and Edge runtimes \r\n * - Progressive hydration support\r\n * - Error boundary integration\r\n * \r\n * @example\r\n * ```typescript\r\n * // React adapter with your imports\r\n * import { renderToReadableStream } from 'react-dom/server';\r\n * \r\n * const adapter = createReactStreamAdapter({\r\n * renderToReadableStream,\r\n * bootstrapModules: ['/client.js'],\r\n * });\r\n * ```\r\n */\r\n\r\nimport type { StreamingRenderOptions, StreamingRenderResult } from '../index.js';\r\n\r\n// ============================================================================\r\n// Common Types\r\n// ============================================================================\r\n\r\n/**\r\n * Framework-specific streaming adapter\r\n */\r\nexport interface StreamingAdapter<TComponent = unknown> {\r\n /** Adapter name */\r\n readonly name: string;\r\n /** Framework version support */\r\n readonly framework: string;\r\n /** Runtime support */\r\n readonly runtime: 'universal' | 'node' | 'edge';\r\n\r\n /**\r\n * Create a streaming response from a component\r\n */\r\n stream(\r\n component: TComponent,\r\n options?: StreamingRenderOptions\r\n ): Promise<StreamingRenderResult>;\r\n\r\n /**\r\n * Render to static string (for comparison/fallback)\r\n */\r\n renderToString?(component: TComponent): Promise<string>;\r\n}\r\n\r\n/**\r\n * Common adapter options\r\n */\r\nexport interface AdapterOptions {\r\n /** Enable streaming (default: true) */\r\n streaming?: boolean;\r\n /** Scripts to bootstrap on client */\r\n bootstrapScripts?: string[];\r\n /** Modules to bootstrap on client */\r\n bootstrapModules?: string[];\r\n /** Error handling strategy */\r\n onError?: (error: Error) => void;\r\n /** Shell ready callback */\r\n onShellReady?: () => void;\r\n /** All content ready callback */\r\n onAllReady?: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// React Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * React streaming adapter options with required dependencies\r\n */\r\nexport interface ReactAdapterOptions extends AdapterOptions {\r\n /** React's renderToReadableStream (for Edge) */\r\n renderToReadableStream?: (\r\n element: unknown,\r\n options?: {\r\n bootstrapScripts?: string[];\r\n bootstrapModules?: string[];\r\n identifierPrefix?: string;\r\n signal?: AbortSignal;\r\n onError?: (error: unknown) => void;\r\n }\r\n ) => Promise<ReadableStream<Uint8Array> & { allReady: Promise<void> }>;\r\n\r\n /** React's renderToString (for static fallback) */\r\n renderToString?: (element: unknown) => string;\r\n\r\n /** Custom identifier prefix */\r\n identifierPrefix?: string;\r\n /** Abort signal */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/**\r\n * Create a React streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToReadableStream, renderToString } from 'react-dom/server';\r\n * \r\n * const adapter = createReactStreamAdapter({\r\n * renderToReadableStream,\r\n * renderToString,\r\n * bootstrapModules: ['/client.js'],\r\n * });\r\n * \r\n * const result = await adapter.stream(<App />);\r\n * ```\r\n */\r\nexport function createReactStreamAdapter(options: ReactAdapterOptions): StreamingAdapter {\r\n if (!options.renderToReadableStream) {\r\n throw new Error(\r\n '[Flight] createReactStreamAdapter requires renderToReadableStream. ' +\r\n 'Import it from react-dom/server and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'react',\r\n framework: 'react@18+',\r\n runtime: 'edge',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n const stream = await options.renderToReadableStream!(component, {\r\n bootstrapScripts: mergedOptions.bootstrapScripts,\r\n bootstrapModules: mergedOptions.bootstrapModules,\r\n identifierPrefix: mergedOptions.identifierPrefix,\r\n signal: mergedOptions.signal,\r\n onError: (error: unknown) => {\r\n mergedOptions.onError?.(error as Error);\r\n },\r\n });\r\n\r\n // Shell is ready when stream is created\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Track all ready via stream completion\r\n stream.allReady.then(() => {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { /* stream handles abort via signal */ },\r\n shellReady,\r\n allReady,\r\n };\r\n },\r\n\r\n async renderToString(component) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(component);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Vue Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Vue streaming adapter options\r\n */\r\nexport interface VueAdapterOptions extends AdapterOptions {\r\n /** Vue's renderToWebStream */\r\n renderToWebStream?: (app: unknown, context?: Record<string, unknown>) => ReadableStream;\r\n /** Vue's renderToString */\r\n renderToString?: (app: unknown) => Promise<string>;\r\n /** Vue app context */\r\n context?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Create a Vue 3 streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToWebStream, renderToString } from 'vue/server-renderer';\r\n * \r\n * const adapter = createVueStreamAdapter({\r\n * renderToWebStream,\r\n * renderToString,\r\n * });\r\n * \r\n * const result = await adapter.stream(createSSRApp(App));\r\n * ```\r\n */\r\nexport function createVueStreamAdapter(options: VueAdapterOptions): StreamingAdapter {\r\n if (!options.renderToWebStream) {\r\n throw new Error(\r\n '[Flight] createVueStreamAdapter requires renderToWebStream. ' +\r\n 'Import it from vue/server-renderer and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'vue',\r\n framework: 'vue@3+',\r\n runtime: 'universal',\r\n\r\n async stream(app, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n const stream = options.renderToWebStream!(app, mergedOptions.context);\r\n\r\n // Vue streams shell immediately\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Wrap to detect completion\r\n const reader = stream.getReader();\r\n\r\n const wrappedStream = new ReadableStream<Uint8Array>({\r\n async pull(controller) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n } else {\r\n controller.enqueue(value);\r\n }\r\n },\r\n });\r\n\r\n return {\r\n stream: wrappedStream,\r\n abort: () => reader.cancel(),\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(app) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(app);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Solid Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Solid streaming adapter options\r\n */\r\nexport interface SolidAdapterOptions extends AdapterOptions {\r\n /** Solid's renderToStream */\r\n renderToStream?: (\r\n fn: () => unknown,\r\n options?: {\r\n nonce?: string;\r\n onCompleteShell?: () => void;\r\n onCompleteAll?: () => void;\r\n }\r\n ) => { pipeTo: (writable: WritableStream) => void };\r\n /** Solid's renderToString */\r\n renderToString?: (fn: () => unknown) => string;\r\n /** Nonce for CSP */\r\n nonce?: string;\r\n}\r\n\r\n/**\r\n * Create a Solid.js streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToStream, renderToString } from 'solid-js/web';\r\n * \r\n * const adapter = createSolidStreamAdapter({\r\n * renderToStream,\r\n * renderToString,\r\n * });\r\n * \r\n * const result = await adapter.stream(() => <App />);\r\n * ```\r\n */\r\nexport function createSolidStreamAdapter(options: SolidAdapterOptions): StreamingAdapter {\r\n if (!options.renderToStream) {\r\n throw new Error(\r\n '[Flight] createSolidStreamAdapter requires renderToStream. ' +\r\n 'Import it from solid-js/web and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'solid',\r\n framework: 'solid-js@1+',\r\n runtime: 'universal',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>();\r\n\r\n // Solid's renderToStream with async options\r\n const result = options.renderToStream!(component as () => unknown, {\r\n nonce: mergedOptions.nonce,\r\n onCompleteShell: () => {\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n },\r\n onCompleteAll: () => {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n },\r\n });\r\n\r\n // Pipe to transform stream\r\n result.pipeTo(writable);\r\n\r\n return {\r\n stream: readable,\r\n abort: () => writable.abort(),\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(component) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(component as () => unknown);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Svelte Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Svelte streaming adapter options\r\n */\r\nexport interface SvelteAdapterOptions extends AdapterOptions {\r\n /** Svelte's render function */\r\n render?: (\r\n component: unknown,\r\n options?: { props?: Record<string, unknown> }\r\n ) => { body: string; head?: string };\r\n /** Props for the component */\r\n props?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Create a Svelte 5 streaming adapter\r\n * Note: Svelte's SSR is primarily string-based, streaming is simulated\r\n * \r\n * @example\r\n * ```typescript\r\n * import { render } from 'svelte/server';\r\n * \r\n * const adapter = createSvelteStreamAdapter({\r\n * render,\r\n * props: { name: 'World' },\r\n * });\r\n * \r\n * const result = await adapter.stream(App);\r\n * ```\r\n */\r\nexport function createSvelteStreamAdapter(options: SvelteAdapterOptions): StreamingAdapter {\r\n if (!options.render) {\r\n throw new Error(\r\n '[Flight] createSvelteStreamAdapter requires render. ' +\r\n 'Import it from svelte/server and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'svelte',\r\n framework: 'svelte@5+',\r\n runtime: 'universal',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n // Render to string first\r\n const result = options.render!(component, { props: mergedOptions.props || {} });\r\n const html = result.body;\r\n\r\n // Convert to stream\r\n const encoder = new TextEncoder();\r\n const stream = new ReadableStream<Uint8Array>({\r\n start(controller) {\r\n // Send head/css first\r\n if (result.head) {\r\n controller.enqueue(encoder.encode(result.head));\r\n }\r\n\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Send body\r\n controller.enqueue(encoder.encode(html));\r\n\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { },\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(component) {\r\n const result = options.render!(component, { props: options?.props || {} });\r\n return result.body;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HTMX Streaming Adapter (SSE-based)\r\n// ============================================================================\r\n\r\n/**\r\n * HTMX streaming adapter options\r\n */\r\nexport interface HTMXAdapterOptions extends AdapterOptions {\r\n /** Event name for SSE */\r\n eventName?: string;\r\n /** Retry interval for SSE */\r\n retryMs?: number;\r\n}\r\n\r\n/**\r\n * Create an HTMX SSE streaming adapter\r\n * Uses Server-Sent Events for progressive updates\r\n * \r\n * @example\r\n * ```typescript\r\n * const adapter = createHTMXStreamAdapter({\r\n * eventName: 'update',\r\n * retryMs: 3000,\r\n * });\r\n * \r\n * const result = await adapter.stream(['<div>Part 1</div>', '<div>Part 2</div>']);\r\n * ```\r\n */\r\nexport function createHTMXStreamAdapter(options?: HTMXAdapterOptions): StreamingAdapter<string[]> {\r\n return {\r\n name: 'htmx',\r\n framework: 'htmx@2+',\r\n runtime: 'universal',\r\n\r\n async stream(htmlChunks, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n const eventName = mergedOptions.eventName || 'message';\r\n const retryMs = mergedOptions.retryMs || 3000;\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n const encoder = new TextEncoder();\r\n let chunkIndex = 0;\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n start(controller) {\r\n // Send retry configuration\r\n controller.enqueue(encoder.encode(`retry: ${retryMs}\\n\\n`));\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n },\r\n\r\n async pull(controller) {\r\n if (chunkIndex >= htmlChunks.length) {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n return;\r\n }\r\n\r\n const chunk = htmlChunks[chunkIndex++];\r\n const sseData = `event: ${eventName}\\ndata: ${JSON.stringify(chunk)}\\n\\n`;\r\n controller.enqueue(encoder.encode(sseData));\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { },\r\n shellReady,\r\n allReady,\r\n };\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Factory\r\n// ============================================================================\r\n\r\nexport type FrameworkType = 'react' | 'vue' | 'solid' | 'svelte' | 'htmx';\r\n\r\n/**\r\n * Create a streaming adapter for any supported framework\r\n * Note: For react, vue, solid, svelte you need to pass the required dependencies\r\n */\r\nexport function createStreamAdapter(\r\n framework: FrameworkType,\r\n options?: AdapterOptions & Record<string, unknown>\r\n): StreamingAdapter {\r\n switch (framework) {\r\n case 'react':\r\n return createReactStreamAdapter(options as ReactAdapterOptions);\r\n case 'vue':\r\n return createVueStreamAdapter(options as VueAdapterOptions);\r\n case 'solid':\r\n return createSolidStreamAdapter(options as SolidAdapterOptions);\r\n case 'svelte':\r\n return createSvelteStreamAdapter(options as SvelteAdapterOptions);\r\n case 'htmx':\r\n return createHTMXStreamAdapter(options as HTMXAdapterOptions);\r\n default:\r\n throw new Error(`[Flight] Unknown framework: ${framework}`);\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-
|
|
1
|
+
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
|
|
2
2
|
|
|
3
3
|
// src/rsc/plugins/rollup.ts
|
|
4
4
|
function flightRSCRollup(options = {}) {
|
|
@@ -296,5 +296,5 @@ function extractExportNames(code) {
|
|
|
296
296
|
var rollup_default = flightRSCRollup;
|
|
297
297
|
|
|
298
298
|
export { flightRSCRollup, rollup_default };
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
300
|
-
//# sourceMappingURL=chunk-
|
|
299
|
+
//# sourceMappingURL=chunk-NWMJYTMB.js.map
|
|
300
|
+
//# sourceMappingURL=chunk-NWMJYTMB.js.map
|