@flight-framework/core 0.1.0 → 0.2.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 -0
- package/dist/{chunk-5KF3QQWZ.js → chunk-3AY23FZP.js} +5 -19
- package/dist/chunk-3AY23FZP.js.map +1 -0
- package/dist/chunk-4F77J5TY.js +324 -0
- package/dist/chunk-4F77J5TY.js.map +1 -0
- package/dist/chunk-5GUCB2CG.js +300 -0
- package/dist/chunk-5GUCB2CG.js.map +1 -0
- package/dist/chunk-62C7LX2E.js +205 -0
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/chunk-63SCEXD7.js +3 -0
- package/dist/chunk-63SCEXD7.js.map +1 -0
- package/dist/{chunk-YIOQC3DC.js → chunk-6BDCTUQY.js} +3 -3
- package/dist/{chunk-YIOQC3DC.js.map → chunk-6BDCTUQY.js.map} +1 -1
- package/dist/chunk-6CD5FIYI.js +252 -0
- package/dist/chunk-6CD5FIYI.js.map +1 -0
- package/dist/chunk-6XZQPPYC.js +285 -0
- package/dist/chunk-6XZQPPYC.js.map +1 -0
- package/dist/chunk-BJIMTO2I.js +213 -0
- package/dist/chunk-BJIMTO2I.js.map +1 -0
- package/dist/chunk-CLZSB5QD.js +258 -0
- package/dist/chunk-CLZSB5QD.js.map +1 -0
- package/dist/chunk-K2CQZPCG.js +257 -0
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-MRLCNFSD.js +341 -0
- package/dist/chunk-MRLCNFSD.js.map +1 -0
- package/dist/chunk-PSJPMEQK.js +212 -0
- package/dist/chunk-PSJPMEQK.js.map +1 -0
- package/dist/chunk-Q62ZQ6FM.js +218 -0
- package/dist/chunk-Q62ZQ6FM.js.map +1 -0
- package/dist/{chunk-6WSPUG5L.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/chunk-T3S5YC7L.js +256 -0
- package/dist/chunk-T3S5YC7L.js.map +1 -0
- package/dist/{chunk-OBNYNJB5.js → chunk-WOEIJWGJ.js} +6 -8
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/{chunk-I2B4WSHC.js → chunk-XSY5AAXT.js} +3 -4
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/chunk-Y22AMGTM.js +3 -0
- package/dist/chunk-Y22AMGTM.js.map +1 -0
- package/dist/file-router/streaming-hints.d.ts +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/rsc/adapters/index.d.ts +8 -0
- package/dist/rsc/adapters/index.js +7 -0
- package/dist/rsc/adapters/index.js.map +1 -0
- package/dist/rsc/adapters/preact.d.ts +97 -0
- package/dist/rsc/adapters/preact.js +3 -0
- package/dist/rsc/adapters/preact.js.map +1 -0
- package/dist/rsc/adapters/react.d.ts +82 -0
- package/dist/rsc/adapters/react.js +3 -0
- package/dist/rsc/adapters/react.js.map +1 -0
- package/dist/rsc/adapters/solid.d.ts +84 -0
- package/dist/rsc/adapters/solid.js +3 -0
- package/dist/rsc/adapters/solid.js.map +1 -0
- package/dist/rsc/adapters/vue.d.ts +80 -0
- package/dist/rsc/adapters/vue.js +3 -0
- package/dist/rsc/adapters/vue.js.map +1 -0
- package/dist/rsc/boundaries.d.ts +182 -0
- package/dist/rsc/boundaries.js +3 -0
- package/dist/rsc/boundaries.js.map +1 -0
- package/dist/rsc/context.d.ts +201 -0
- package/dist/rsc/context.js +3 -0
- package/dist/rsc/context.js.map +1 -0
- package/dist/rsc/index.d.ts +20 -124
- package/dist/rsc/index.js +13 -1
- package/dist/rsc/legacy.d.ts +131 -0
- package/dist/rsc/legacy.js +3 -0
- package/dist/rsc/legacy.js.map +1 -0
- package/dist/rsc/payload.d.ts +262 -0
- package/dist/rsc/payload.js +3 -0
- package/dist/rsc/payload.js.map +1 -0
- package/dist/rsc/plugins/esbuild.d.ts +124 -0
- package/dist/rsc/plugins/esbuild.js +4 -0
- package/dist/rsc/plugins/esbuild.js.map +1 -0
- package/dist/rsc/plugins/index.d.ts +4 -0
- package/dist/rsc/plugins/index.js +6 -0
- package/dist/rsc/plugins/index.js.map +1 -0
- package/dist/rsc/plugins/rollup.d.ts +103 -0
- package/dist/rsc/plugins/rollup.js +4 -0
- package/dist/rsc/plugins/rollup.js.map +1 -0
- package/dist/rsc/renderer.d.ts +160 -0
- package/dist/rsc/renderer.js +5 -0
- package/dist/rsc/renderer.js.map +1 -0
- package/dist/rsc/stream.d.ts +129 -0
- package/dist/rsc/stream.js +3 -0
- package/dist/rsc/stream.js.map +1 -0
- package/dist/rsc/vite-plugin.d.ts +78 -0
- package/dist/rsc/vite-plugin.js +4 -0
- package/dist/rsc/vite-plugin.js.map +1 -0
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/package.json +180 -124
- package/dist/chunk-5KF3QQWZ.js.map +0 -1
- package/dist/chunk-6WSPUG5L.js.map +0 -1
- package/dist/chunk-I2B4WSHC.js.map +0 -1
- package/dist/chunk-OBNYNJB5.js.map +0 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-CLZSB5QD.js';
|
|
2
|
+
|
|
3
|
+
// src/rsc/plugins/rollup.ts
|
|
4
|
+
function flightRSCRollup(options = {}) {
|
|
5
|
+
const {
|
|
6
|
+
include = /\.(tsx?|jsx?)$/,
|
|
7
|
+
exclude = /node_modules/,
|
|
8
|
+
actionsEndpoint = "/_flight/action",
|
|
9
|
+
clientManifest = ".flight/client-manifest.json",
|
|
10
|
+
serverManifest = ".flight/server-manifest.json",
|
|
11
|
+
ssr = false,
|
|
12
|
+
dev = false
|
|
13
|
+
} = options;
|
|
14
|
+
const state = {
|
|
15
|
+
clientModules: /* @__PURE__ */ new Map(),
|
|
16
|
+
serverActions: /* @__PURE__ */ new Map()
|
|
17
|
+
};
|
|
18
|
+
const shouldInclude = (id) => {
|
|
19
|
+
if (typeof include === "function") return include(id);
|
|
20
|
+
return include.test(id);
|
|
21
|
+
};
|
|
22
|
+
const shouldExclude = (id) => {
|
|
23
|
+
if (typeof exclude === "function") return exclude(id);
|
|
24
|
+
return exclude.test(id);
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
name: "flight-rsc",
|
|
28
|
+
// ================================================================
|
|
29
|
+
// buildStart: Reset state
|
|
30
|
+
// ================================================================
|
|
31
|
+
buildStart() {
|
|
32
|
+
state.clientModules.clear();
|
|
33
|
+
state.serverActions.clear();
|
|
34
|
+
if (dev) {
|
|
35
|
+
console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
// ================================================================
|
|
39
|
+
// transform: Analyze and transform modules
|
|
40
|
+
// ================================================================
|
|
41
|
+
transform(code, id) {
|
|
42
|
+
if (!shouldInclude(id) || shouldExclude(id)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const analysis = analyzeModule(code, id);
|
|
46
|
+
const moduleId = createModuleId(id);
|
|
47
|
+
if (analysis.fileDirective === "client") {
|
|
48
|
+
state.clientModules.set(id, {
|
|
49
|
+
id: moduleId,
|
|
50
|
+
file: id,
|
|
51
|
+
exports: analysis.clientComponents
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (analysis.fileDirective === "server" || analysis.serverActions.length > 0) {
|
|
55
|
+
state.serverActions.set(id, {
|
|
56
|
+
id: moduleId,
|
|
57
|
+
file: id,
|
|
58
|
+
exports: analysis.serverActions.length > 0 ? analysis.serverActions : extractExportNames(code)
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (ssr) {
|
|
62
|
+
if (hasUseClientDirective(code)) {
|
|
63
|
+
return {
|
|
64
|
+
code: transformClientForSSR(code, moduleId),
|
|
65
|
+
map: null
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
if (hasUseServerDirective(code)) {
|
|
70
|
+
return {
|
|
71
|
+
code: transformServerForClient(code, moduleId, actionsEndpoint),
|
|
72
|
+
map: null
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const inlineActions = detectInlineServerActions(code);
|
|
76
|
+
if (inlineActions.length > 0) {
|
|
77
|
+
return {
|
|
78
|
+
code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),
|
|
79
|
+
map: null
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
},
|
|
85
|
+
// ================================================================
|
|
86
|
+
// generateBundle: Emit manifests
|
|
87
|
+
// ================================================================
|
|
88
|
+
generateBundle() {
|
|
89
|
+
if (state.clientModules.size > 0) {
|
|
90
|
+
const manifest = Object.fromEntries(state.clientModules);
|
|
91
|
+
this.emitFile({
|
|
92
|
+
type: "asset",
|
|
93
|
+
fileName: clientManifest,
|
|
94
|
+
source: JSON.stringify(manifest, null, 2)
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (state.serverActions.size > 0) {
|
|
98
|
+
const manifest = Object.fromEntries(state.serverActions);
|
|
99
|
+
this.emitFile({
|
|
100
|
+
type: "asset",
|
|
101
|
+
fileName: serverManifest,
|
|
102
|
+
source: JSON.stringify(manifest, null, 2)
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (dev) {
|
|
106
|
+
console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);
|
|
107
|
+
console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
// ================================================================
|
|
111
|
+
// buildEnd: Cleanup
|
|
112
|
+
// ================================================================
|
|
113
|
+
buildEnd(error) {
|
|
114
|
+
if (error && dev) {
|
|
115
|
+
console.error("[Flight RSC Rollup] Build failed:", error.message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function transformClientForSSR(code, moduleId) {
|
|
121
|
+
const exports$1 = extractExportNames(code);
|
|
122
|
+
let transformed = `
|
|
123
|
+
// Flight RSC: Client Component Reference (Rollup)
|
|
124
|
+
// Original module: ${moduleId}
|
|
125
|
+
|
|
126
|
+
const __flight_module_id = ${JSON.stringify(moduleId)};
|
|
127
|
+
|
|
128
|
+
`;
|
|
129
|
+
for (const exportName of exports$1) {
|
|
130
|
+
if (exportName === "default") {
|
|
131
|
+
transformed += `
|
|
132
|
+
const __flight_default = Object.assign(
|
|
133
|
+
function() {
|
|
134
|
+
throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
$$typeof: Symbol.for('flight.client.reference'),
|
|
138
|
+
$$id: __flight_module_id + '#default',
|
|
139
|
+
$$async: false,
|
|
140
|
+
__flight_client: true,
|
|
141
|
+
__flight_module: __flight_module_id,
|
|
142
|
+
__flight_export: 'default',
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
export default __flight_default;
|
|
146
|
+
`;
|
|
147
|
+
} else {
|
|
148
|
+
transformed += `
|
|
149
|
+
export const ${exportName} = Object.assign(
|
|
150
|
+
function() {
|
|
151
|
+
throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
$$typeof: Symbol.for('flight.client.reference'),
|
|
155
|
+
$$id: __flight_module_id + '#${exportName}',
|
|
156
|
+
$$async: false,
|
|
157
|
+
__flight_client: true,
|
|
158
|
+
__flight_module: __flight_module_id,
|
|
159
|
+
__flight_export: '${exportName}',
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return transformed;
|
|
166
|
+
}
|
|
167
|
+
function transformServerForClient(code, moduleId, endpoint) {
|
|
168
|
+
const exports$1 = extractExportNames(code);
|
|
169
|
+
let transformed = `
|
|
170
|
+
// Flight RSC: Server Actions RPC Proxies (Rollup)
|
|
171
|
+
// Original module: ${moduleId}
|
|
172
|
+
|
|
173
|
+
const __flight_endpoint = ${JSON.stringify(endpoint)};
|
|
174
|
+
const __flight_module_id = ${JSON.stringify(moduleId)};
|
|
175
|
+
|
|
176
|
+
async function __flight_rpc(actionId, args) {
|
|
177
|
+
const response = await fetch(__flight_endpoint, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
'X-Flight-Action': actionId,
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({ actionId, args }),
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
const error = await response.json().catch(() => ({ message: 'Server action failed' }));
|
|
188
|
+
throw new Error(error.message || 'Server action failed');
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return response.json();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
`;
|
|
195
|
+
for (const exportName of exports$1) {
|
|
196
|
+
const actionId = `${moduleId}#${exportName}`;
|
|
197
|
+
if (exportName === "default") {
|
|
198
|
+
transformed += `
|
|
199
|
+
export default async function(...args) {
|
|
200
|
+
return __flight_rpc(${JSON.stringify(actionId)}, args);
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
} else {
|
|
204
|
+
transformed += `
|
|
205
|
+
export async function ${exportName}(...args) {
|
|
206
|
+
return __flight_rpc(${JSON.stringify(actionId)}, args);
|
|
207
|
+
}
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return transformed;
|
|
212
|
+
}
|
|
213
|
+
function transformInlineActions(code, moduleId, actions, endpoint) {
|
|
214
|
+
let transformed = code;
|
|
215
|
+
const rpcHelper = `
|
|
216
|
+
// Flight RSC: Inline Server Action Helpers (Rollup)
|
|
217
|
+
const __flight_inline_endpoint = ${JSON.stringify(endpoint)};
|
|
218
|
+
async function __flight_inline_rpc(actionId, args) {
|
|
219
|
+
const response = await fetch(__flight_inline_endpoint, {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },
|
|
222
|
+
body: JSON.stringify({ actionId, args }),
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) throw new Error('Server action failed');
|
|
225
|
+
return response.json();
|
|
226
|
+
}
|
|
227
|
+
`;
|
|
228
|
+
const lastImportMatch = code.match(/^import\s.+$/gm);
|
|
229
|
+
if (lastImportMatch) {
|
|
230
|
+
const lastImport = lastImportMatch[lastImportMatch.length - 1] || "";
|
|
231
|
+
const insertPos = code.indexOf(lastImport) + lastImport.length;
|
|
232
|
+
transformed = code.slice(0, insertPos) + "\n" + rpcHelper + code.slice(insertPos);
|
|
233
|
+
} else {
|
|
234
|
+
transformed = rpcHelper + code;
|
|
235
|
+
}
|
|
236
|
+
for (const actionName of actions) {
|
|
237
|
+
const actionId = `${moduleId}#${actionName}`;
|
|
238
|
+
const patterns = [
|
|
239
|
+
new RegExp(
|
|
240
|
+
`async\\s+function\\s+${actionName}\\s*\\([^)]*\\)\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
|
|
241
|
+
"g"
|
|
242
|
+
),
|
|
243
|
+
new RegExp(
|
|
244
|
+
`const\\s+${actionName}\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
|
|
245
|
+
"g"
|
|
246
|
+
)
|
|
247
|
+
];
|
|
248
|
+
for (const pattern of patterns) {
|
|
249
|
+
transformed = transformed.replace(
|
|
250
|
+
pattern,
|
|
251
|
+
`async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return transformed;
|
|
256
|
+
}
|
|
257
|
+
function createModuleId(filePath) {
|
|
258
|
+
let id = filePath.replace(/\\/g, "/");
|
|
259
|
+
const prefixes = ["/src/", "src/", "packages/", "/packages/"];
|
|
260
|
+
for (const prefix of prefixes) {
|
|
261
|
+
const idx = id.indexOf(prefix);
|
|
262
|
+
if (idx !== -1) {
|
|
263
|
+
id = id.slice(idx);
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!id.startsWith("/")) {
|
|
268
|
+
id = "/" + id;
|
|
269
|
+
}
|
|
270
|
+
return id;
|
|
271
|
+
}
|
|
272
|
+
function extractExportNames(code) {
|
|
273
|
+
const exports$1 = [];
|
|
274
|
+
if (/export\s+default\s+/.test(code)) {
|
|
275
|
+
exports$1.push("default");
|
|
276
|
+
}
|
|
277
|
+
const namedPattern = /export\s+(?:async\s+)?(?:function|const|let|var|class)\s+(\w+)/g;
|
|
278
|
+
let match;
|
|
279
|
+
while ((match = namedPattern.exec(code)) !== null) {
|
|
280
|
+
if (match[1] && match[1] !== "default") {
|
|
281
|
+
exports$1.push(match[1]);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const bracketPattern = /export\s*\{\s*([^}]+)\s*\}/g;
|
|
285
|
+
while ((match = bracketPattern.exec(code)) !== null) {
|
|
286
|
+
if (match[1]) {
|
|
287
|
+
const names = match[1].split(",").map((n) => {
|
|
288
|
+
const parts = n.trim().split(/\s+as\s+/);
|
|
289
|
+
return parts[parts.length - 1]?.trim() || "";
|
|
290
|
+
});
|
|
291
|
+
exports$1.push(...names.filter((n) => n && n !== "default"));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return [...new Set(exports$1)];
|
|
295
|
+
}
|
|
296
|
+
var rollup_default = flightRSCRollup;
|
|
297
|
+
|
|
298
|
+
export { flightRSCRollup, rollup_default };
|
|
299
|
+
//# sourceMappingURL=chunk-5GUCB2CG.js.map
|
|
300
|
+
//# sourceMappingURL=chunk-5GUCB2CG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/plugins/rollup.ts"],"names":["exports"],"mappings":"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","file":"chunk-5GUCB2CG.js","sourcesContent":["/**\r\n * @flight-framework/core - Rollup Plugin for RSC\r\n * \r\n * Rollup plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - Rollup is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/rollup\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Rollup Plugin interface (minimal)\r\n * We define our own to avoid requiring rollup as dependency\r\n */\r\nexport interface RollupPlugin {\r\n name: string;\r\n buildStart?: (options: unknown) => void | Promise<void>;\r\n resolveId?: (\r\n source: string,\r\n importer: string | undefined,\r\n options: { isEntry: boolean }\r\n ) => string | null | undefined | { id: string; external?: boolean } | Promise<string | null | undefined | { id: string; external?: boolean }>;\r\n load?: (id: string) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n transform?: (\r\n code: string,\r\n id: string\r\n ) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n generateBundle?: (\r\n options: unknown,\r\n bundle: Record<string, unknown>\r\n ) => void | Promise<void>;\r\n buildEnd?: (error?: Error) => void | Promise<void>;\r\n}\r\n\r\nexport interface RollupPluginContext {\r\n emitFile: (file: { type: 'asset' | 'chunk'; fileName?: string; source?: string; id?: string }) => string;\r\n warn: (message: string) => void;\r\n error: (message: string) => never;\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightRollupPluginOptions {\r\n /** Include patterns (regex or function) */\r\n include?: RegExp | ((id: string) => boolean);\r\n\r\n /** Exclude patterns (regex or function) */\r\n exclude?: RegExp | ((id: string) => boolean);\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Client manifest filename */\r\n clientManifest?: string;\r\n\r\n /** Server manifest filename */\r\n serverManifest?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC Rollup Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // rollup.config.js\r\n * import { flightRSCRollup } from '@flight-framework/core/rsc/plugins/rollup';\r\n * \r\n * export default {\r\n * input: 'src/index.tsx',\r\n * output: { dir: 'dist', format: 'esm' },\r\n * plugins: [\r\n * flightRSCRollup({\r\n * ssr: true,\r\n * actionsEndpoint: '/_flight/action',\r\n * }),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function flightRSCRollup(options: FlightRollupPluginOptions = {}): RollupPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n clientManifest = '.flight/client-manifest.json',\r\n serverManifest = '.flight/server-manifest.json',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n };\r\n\r\n const shouldInclude = (id: string): boolean => {\r\n if (typeof include === 'function') return include(id);\r\n return include.test(id);\r\n };\r\n\r\n const shouldExclude = (id: string): boolean => {\r\n if (typeof exclude === 'function') return exclude(id);\r\n return exclude.test(id);\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n // ================================================================\r\n // buildStart: Reset state\r\n // ================================================================\r\n buildStart() {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // transform: Analyze and transform modules\r\n // ================================================================\r\n transform(code: string, id: string) {\r\n // Skip non-matching files\r\n if (!shouldInclude(id) || shouldExclude(id)) {\r\n return null;\r\n }\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, id);\r\n const moduleId = createModuleId(id);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.serverActions.length > 0\r\n ? analysis.serverActions\r\n : extractExportNames(code),\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n code: transformClientForSSR(code, moduleId),\r\n map: null,\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n code: transformServerForClient(code, moduleId, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // ================================================================\r\n // generateBundle: Emit manifests\r\n // ================================================================\r\n generateBundle(this: RollupPluginContext) {\r\n // Emit client manifest\r\n if (state.clientModules.size > 0) {\r\n const manifest = Object.fromEntries(state.clientModules);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: clientManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n // Emit server manifest\r\n if (state.serverActions.size > 0) {\r\n const manifest = Object.fromEntries(state.serverActions);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: serverManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // buildEnd: Cleanup\r\n // ================================================================\r\n buildEnd(error?: Error) {\r\n if (error && dev) {\r\n console.error('[Flight RSC Rollup] Build failed:', error.message);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers (Rollup)\r\nconst __flight_inline_endpoint = ${JSON.stringify(endpoint)};\r\nasync function __flight_inline_rpc(actionId, args) {\r\n const response = await fetch(__flight_inline_endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Insert after imports\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform action functions\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n const patterns = [\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n const prefixes = ['/src/', 'src/', 'packages/', '/packages/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCRollup;\r\n"]}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// src/rsc/context.ts
|
|
2
|
+
function createServerContext(request, options = {}) {
|
|
3
|
+
const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;
|
|
4
|
+
const url = new URL(request.url);
|
|
5
|
+
let parsedCookies = null;
|
|
6
|
+
const parseCookies = () => {
|
|
7
|
+
if (parsedCookies !== null) return parsedCookies;
|
|
8
|
+
parsedCookies = {};
|
|
9
|
+
const cookieHeader = request.headers.get("cookie");
|
|
10
|
+
if (cookieHeader) {
|
|
11
|
+
for (const cookie of cookieHeader.split(";")) {
|
|
12
|
+
const trimmed = cookie.trim();
|
|
13
|
+
const eqIndex = trimmed.indexOf("=");
|
|
14
|
+
if (eqIndex > 0) {
|
|
15
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
16
|
+
const value = trimmed.slice(eqIndex + 1).trim();
|
|
17
|
+
try {
|
|
18
|
+
parsedCookies[key] = decodeURIComponent(value);
|
|
19
|
+
} catch {
|
|
20
|
+
parsedCookies[key] = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return parsedCookies;
|
|
26
|
+
};
|
|
27
|
+
const cookies = {
|
|
28
|
+
get(name) {
|
|
29
|
+
return parseCookies()[name];
|
|
30
|
+
},
|
|
31
|
+
getAll() {
|
|
32
|
+
return Object.freeze({ ...parseCookies() });
|
|
33
|
+
},
|
|
34
|
+
has(name) {
|
|
35
|
+
return name in parseCookies();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const contextExtensions = {
|
|
39
|
+
get(key) {
|
|
40
|
+
return extensions[key];
|
|
41
|
+
},
|
|
42
|
+
has(key) {
|
|
43
|
+
return key in extensions;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const responseHeaders = new Headers(initHeaders);
|
|
47
|
+
return Object.freeze({
|
|
48
|
+
request,
|
|
49
|
+
params: Object.freeze({ ...params }),
|
|
50
|
+
searchParams: url.searchParams,
|
|
51
|
+
headers: request.headers,
|
|
52
|
+
cookies,
|
|
53
|
+
responseHeaders,
|
|
54
|
+
signal: request.signal,
|
|
55
|
+
url,
|
|
56
|
+
method: request.method,
|
|
57
|
+
extensions: contextExtensions
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function getHeader(ctx, name) {
|
|
61
|
+
return ctx.headers.get(name);
|
|
62
|
+
}
|
|
63
|
+
function getHeaders(ctx) {
|
|
64
|
+
const headers = {};
|
|
65
|
+
ctx.headers.forEach((value, key) => {
|
|
66
|
+
headers[key] = value;
|
|
67
|
+
});
|
|
68
|
+
return headers;
|
|
69
|
+
}
|
|
70
|
+
function isMutationRequest(ctx) {
|
|
71
|
+
return ["POST", "PUT", "PATCH", "DELETE"].includes(ctx.method);
|
|
72
|
+
}
|
|
73
|
+
function acceptsJson(ctx) {
|
|
74
|
+
const accept = ctx.headers.get("accept") || "";
|
|
75
|
+
return accept.includes("application/json") || accept.includes("*/*");
|
|
76
|
+
}
|
|
77
|
+
function isAjaxRequest(ctx) {
|
|
78
|
+
return ctx.headers.get("x-requested-with")?.toLowerCase() === "xmlhttprequest" || ctx.headers.has("x-flight-action");
|
|
79
|
+
}
|
|
80
|
+
function isBotRequest(ctx) {
|
|
81
|
+
const ua = ctx.headers.get("user-agent")?.toLowerCase() || "";
|
|
82
|
+
const botPatterns = [
|
|
83
|
+
"bot",
|
|
84
|
+
"crawler",
|
|
85
|
+
"spider",
|
|
86
|
+
"scraper",
|
|
87
|
+
"googlebot",
|
|
88
|
+
"bingbot",
|
|
89
|
+
"yandexbot",
|
|
90
|
+
"duckduckbot",
|
|
91
|
+
"slurp",
|
|
92
|
+
"baiduspider",
|
|
93
|
+
"facebookexternalhit",
|
|
94
|
+
"twitterbot",
|
|
95
|
+
"linkedinbot",
|
|
96
|
+
"embedly",
|
|
97
|
+
"quora",
|
|
98
|
+
"outbrain",
|
|
99
|
+
"pinterest",
|
|
100
|
+
"slack",
|
|
101
|
+
"vkshare",
|
|
102
|
+
"w3c_validator",
|
|
103
|
+
"lighthouse",
|
|
104
|
+
"pagespeed"
|
|
105
|
+
];
|
|
106
|
+
return botPatterns.some((pattern) => ua.includes(pattern));
|
|
107
|
+
}
|
|
108
|
+
function supportsStreaming(ctx) {
|
|
109
|
+
const noStream = ctx.searchParams.get("_nostream");
|
|
110
|
+
if (noStream === "1" || noStream === "true") return false;
|
|
111
|
+
if (isBotRequest(ctx)) return false;
|
|
112
|
+
const connection = ctx.headers.get("downlink") || ctx.headers.get("ect");
|
|
113
|
+
if (connection === "slow-2g" || connection === "2g") return false;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
function getPreferredLanguage(ctx, available) {
|
|
117
|
+
const acceptLang = ctx.headers.get("accept-language");
|
|
118
|
+
if (!acceptLang) return available[0];
|
|
119
|
+
const languages = acceptLang.split(",").map((lang) => {
|
|
120
|
+
const [code, q = "q=1"] = lang.trim().split(";");
|
|
121
|
+
const quality = parseFloat(q.replace("q=", "")) || 1;
|
|
122
|
+
return { code: code.trim().toLowerCase(), quality };
|
|
123
|
+
}).sort((a, b) => b.quality - a.quality);
|
|
124
|
+
for (const { code } of languages) {
|
|
125
|
+
const exact = available.find((a) => a.toLowerCase() === code);
|
|
126
|
+
if (exact) return exact;
|
|
127
|
+
const baseCode = code.split("-")[0];
|
|
128
|
+
const partial = available.find((a) => a.toLowerCase().startsWith(baseCode));
|
|
129
|
+
if (partial) return partial;
|
|
130
|
+
}
|
|
131
|
+
return available[0];
|
|
132
|
+
}
|
|
133
|
+
function setCookie(ctx, name, value, options = {}) {
|
|
134
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
|
|
135
|
+
if (options.maxAge !== void 0) {
|
|
136
|
+
parts.push(`Max-Age=${options.maxAge}`);
|
|
137
|
+
}
|
|
138
|
+
if (options.expires) {
|
|
139
|
+
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
140
|
+
}
|
|
141
|
+
if (options.path) {
|
|
142
|
+
parts.push(`Path=${options.path}`);
|
|
143
|
+
}
|
|
144
|
+
if (options.domain) {
|
|
145
|
+
parts.push(`Domain=${options.domain}`);
|
|
146
|
+
}
|
|
147
|
+
if (options.secure) {
|
|
148
|
+
parts.push("Secure");
|
|
149
|
+
}
|
|
150
|
+
if (options.httpOnly) {
|
|
151
|
+
parts.push("HttpOnly");
|
|
152
|
+
}
|
|
153
|
+
if (options.sameSite) {
|
|
154
|
+
parts.push(`SameSite=${options.sameSite}`);
|
|
155
|
+
}
|
|
156
|
+
ctx.responseHeaders.append("Set-Cookie", parts.join("; "));
|
|
157
|
+
}
|
|
158
|
+
function deleteCookie(ctx, name, options = {}) {
|
|
159
|
+
setCookie(ctx, name, "", {
|
|
160
|
+
...options,
|
|
161
|
+
maxAge: 0,
|
|
162
|
+
expires: /* @__PURE__ */ new Date(0)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function setCacheControl(ctx, options) {
|
|
166
|
+
const parts = [];
|
|
167
|
+
if (options.public) parts.push("public");
|
|
168
|
+
if (options.private) parts.push("private");
|
|
169
|
+
if (options.noCache) parts.push("no-cache");
|
|
170
|
+
if (options.noStore) parts.push("no-store");
|
|
171
|
+
if (options.maxAge !== void 0) parts.push(`max-age=${options.maxAge}`);
|
|
172
|
+
if (options.sMaxAge !== void 0) parts.push(`s-maxage=${options.sMaxAge}`);
|
|
173
|
+
if (options.staleWhileRevalidate !== void 0) {
|
|
174
|
+
parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);
|
|
175
|
+
}
|
|
176
|
+
if (options.staleIfError !== void 0) {
|
|
177
|
+
parts.push(`stale-if-error=${options.staleIfError}`);
|
|
178
|
+
}
|
|
179
|
+
if (options.mustRevalidate) parts.push("must-revalidate");
|
|
180
|
+
if (options.immutable) parts.push("immutable");
|
|
181
|
+
ctx.responseHeaders.set("Cache-Control", parts.join(", "));
|
|
182
|
+
}
|
|
183
|
+
function notFound(message = "Not Found") {
|
|
184
|
+
const error = new Error(message);
|
|
185
|
+
error.__flight_not_found = true;
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
function isNotFoundError(error) {
|
|
189
|
+
return error instanceof Error && "__flight_not_found" in error;
|
|
190
|
+
}
|
|
191
|
+
function redirect(url, status = 307) {
|
|
192
|
+
const error = new Error(`Redirect: ${url}`);
|
|
193
|
+
error.__flight_redirect = { url, status };
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
function isRedirectError(error) {
|
|
197
|
+
return error instanceof Error && "__flight_redirect" in error;
|
|
198
|
+
}
|
|
199
|
+
function getRedirectInfo(error) {
|
|
200
|
+
return error.__flight_redirect;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { acceptsJson, createServerContext, deleteCookie, getHeader, getHeaders, getPreferredLanguage, getRedirectInfo, isAjaxRequest, isBotRequest, isMutationRequest, isNotFoundError, isRedirectError, notFound, redirect, setCacheControl, setCookie, supportsStreaming };
|
|
204
|
+
//# sourceMappingURL=chunk-62C7LX2E.js.map
|
|
205
|
+
//# sourceMappingURL=chunk-62C7LX2E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/context.ts"],"names":[],"mappings":"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","file":"chunk-62C7LX2E.js","sourcesContent":["/**\r\n * @flight-framework/core - Server Context\r\n * \r\n * API de contexto para Server Components.\r\n * Provee acceso a datos del request de forma explícita y type-safe.\r\n * \r\n * Filosofía Flight:\r\n * - Contexto EXPLÍCITO (no magia con AsyncLocalStorage)\r\n * - Pasado como argumento (testeable, predecible)\r\n * - Extensible con adapters custom\r\n * - Inmutable por defecto\r\n * \r\n * @module @flight-framework/core/rsc/context\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Contexto del servidor disponible en Server Components\r\n */\r\nexport interface ServerContext {\r\n /** Request actual (Web API Request) */\r\n readonly request: Request;\r\n\r\n /** Parámetros de ruta */\r\n readonly params: Readonly<Record<string, string>>;\r\n\r\n /** Search params de la URL */\r\n readonly searchParams: URLSearchParams;\r\n\r\n /** Headers del request */\r\n readonly headers: Headers;\r\n\r\n /** Accessor de cookies */\r\n readonly cookies: CookieAccessor;\r\n\r\n /** Headers de respuesta (mutables) */\r\n readonly responseHeaders: Headers;\r\n\r\n /** Signal para cancelación */\r\n readonly signal: AbortSignal;\r\n\r\n /** URL parseada */\r\n readonly url: URL;\r\n\r\n /** Método HTTP */\r\n readonly method: string;\r\n\r\n /** Context extensions (para adapters) */\r\n readonly extensions: ContextExtensions;\r\n}\r\n\r\n/**\r\n * Accessor para cookies con lazy parsing\r\n */\r\nexport interface CookieAccessor {\r\n /** Obtiene el valor de una cookie */\r\n get(name: string): string | undefined;\r\n\r\n /** Obtiene todas las cookies */\r\n getAll(): Readonly<Record<string, string>>;\r\n\r\n /** Verifica si existe una cookie */\r\n has(name: string): boolean;\r\n}\r\n\r\n/**\r\n * Extensiones del contexto para adapters\r\n */\r\nexport interface ContextExtensions {\r\n /** Obtiene una extensión */\r\n get<T>(key: string): T | undefined;\r\n\r\n /** Verifica si existe una extensión */\r\n has(key: string): boolean;\r\n}\r\n\r\n/**\r\n * Opciones para crear ServerContext\r\n */\r\nexport interface ServerContextOptions {\r\n /** Parámetros de ruta */\r\n params?: Record<string, string>;\r\n\r\n /** Extensiones custom */\r\n extensions?: Record<string, unknown>;\r\n\r\n /** Headers de respuesta iniciales */\r\n responseHeaders?: HeadersInit;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea un ServerContext a partir de un Request\r\n * \r\n * @example\r\n * ```typescript\r\n * const ctx = createServerContext(request, { \r\n * params: { id: '123' } \r\n * });\r\n * \r\n * // En un Server Component\r\n * async function UserPage(props, ctx: ServerContext) {\r\n * const userId = ctx.params.id;\r\n * const user = await db.users.get(userId);\r\n * return <UserProfile user={user} />;\r\n * }\r\n * ```\r\n */\r\nexport function createServerContext(\r\n request: Request,\r\n options: ServerContextOptions = {}\r\n): ServerContext {\r\n const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;\r\n\r\n // Parse URL\r\n const url = new URL(request.url);\r\n\r\n // Lazy cookie parsing\r\n let parsedCookies: Record<string, string> | null = null;\r\n\r\n const parseCookies = (): Record<string, string> => {\r\n if (parsedCookies !== null) return parsedCookies;\r\n\r\n parsedCookies = {};\r\n const cookieHeader = request.headers.get('cookie');\r\n\r\n if (cookieHeader) {\r\n for (const cookie of cookieHeader.split(';')) {\r\n const trimmed = cookie.trim();\r\n const eqIndex = trimmed.indexOf('=');\r\n\r\n if (eqIndex > 0) {\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n const value = trimmed.slice(eqIndex + 1).trim();\r\n\r\n // Decode URL-encoded values\r\n try {\r\n parsedCookies[key] = decodeURIComponent(value);\r\n } catch {\r\n parsedCookies[key] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return parsedCookies;\r\n };\r\n\r\n // Cookie accessor\r\n const cookies: CookieAccessor = {\r\n get(name: string): string | undefined {\r\n return parseCookies()[name];\r\n },\r\n getAll(): Readonly<Record<string, string>> {\r\n return Object.freeze({ ...parseCookies() });\r\n },\r\n has(name: string): boolean {\r\n return name in parseCookies();\r\n },\r\n };\r\n\r\n // Extensions accessor\r\n const contextExtensions: ContextExtensions = {\r\n get<T>(key: string): T | undefined {\r\n return extensions[key] as T | undefined;\r\n },\r\n has(key: string): boolean {\r\n return key in extensions;\r\n },\r\n };\r\n\r\n // Response headers (mutable)\r\n const responseHeaders = new Headers(initHeaders);\r\n\r\n return Object.freeze({\r\n request,\r\n params: Object.freeze({ ...params }),\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n responseHeaders,\r\n signal: request.signal,\r\n url,\r\n method: request.method,\r\n extensions: contextExtensions,\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Context Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Obtiene un header del request\r\n */\r\nexport function getHeader(ctx: ServerContext, name: string): string | null {\r\n return ctx.headers.get(name);\r\n}\r\n\r\n/**\r\n * Obtiene todos los headers como objeto\r\n */\r\nexport function getHeaders(ctx: ServerContext): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n ctx.headers.forEach((value, key) => {\r\n headers[key] = value;\r\n });\r\n return headers;\r\n}\r\n\r\n/**\r\n * Verifica si el request es un POST/PUT/PATCH/DELETE (mutation request)\r\n */\r\nexport function isMutationRequest(ctx: ServerContext): boolean {\r\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(ctx.method);\r\n}\r\n\r\n/**\r\n * Verifica si el request acepta JSON\r\n */\r\nexport function acceptsJson(ctx: ServerContext): boolean {\r\n const accept = ctx.headers.get('accept') || '';\r\n return accept.includes('application/json') || accept.includes('*/*');\r\n}\r\n\r\n/**\r\n * Verifica si el request es AJAX/fetch\r\n */\r\nexport function isAjaxRequest(ctx: ServerContext): boolean {\r\n return ctx.headers.get('x-requested-with')?.toLowerCase() === 'xmlhttprequest' ||\r\n ctx.headers.has('x-flight-action');\r\n}\r\n\r\n/**\r\n * Verifica si el request viene de un bot\r\n */\r\nexport function isBotRequest(ctx: ServerContext): boolean {\r\n const ua = ctx.headers.get('user-agent')?.toLowerCase() || '';\r\n const botPatterns = [\r\n 'bot', 'crawler', 'spider', 'scraper',\r\n 'googlebot', 'bingbot', 'yandexbot', 'duckduckbot',\r\n 'slurp', 'baiduspider', 'facebookexternalhit',\r\n 'twitterbot', 'linkedinbot', 'embedly', 'quora',\r\n 'outbrain', 'pinterest', 'slack', 'vkshare',\r\n 'w3c_validator', 'lighthouse', 'pagespeed',\r\n ];\r\n return botPatterns.some(pattern => ua.includes(pattern));\r\n}\r\n\r\n/**\r\n * Verifica si el cliente soporta streaming\r\n */\r\nexport function supportsStreaming(ctx: ServerContext): boolean {\r\n // Check for no-stream preference\r\n const noStream = ctx.searchParams.get('_nostream');\r\n if (noStream === '1' || noStream === 'true') return false;\r\n\r\n // Bots typically don't support streaming well\r\n if (isBotRequest(ctx)) return false;\r\n\r\n // Check for slow connection hints\r\n const connection = ctx.headers.get('downlink') || ctx.headers.get('ect');\r\n if (connection === 'slow-2g' || connection === '2g') return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Obtiene el idioma preferido del cliente\r\n */\r\nexport function getPreferredLanguage(ctx: ServerContext, available: string[]): string | undefined {\r\n const acceptLang = ctx.headers.get('accept-language');\r\n if (!acceptLang) return available[0];\r\n\r\n // Parse Accept-Language header\r\n const languages = acceptLang\r\n .split(',')\r\n .map(lang => {\r\n const [code, q = 'q=1'] = lang.trim().split(';');\r\n const quality = parseFloat(q.replace('q=', '')) || 1;\r\n return { code: code!.trim().toLowerCase(), quality };\r\n })\r\n .sort((a, b) => b.quality - a.quality);\r\n\r\n // Find best match\r\n for (const { code } of languages) {\r\n // Exact match\r\n const exact = available.find(a => a.toLowerCase() === code);\r\n if (exact) return exact;\r\n\r\n // Language-only match (e.g., 'es' matches 'es-AR')\r\n const baseCode = code.split('-')[0];\r\n const partial = available.find(a => a.toLowerCase().startsWith(baseCode!));\r\n if (partial) return partial;\r\n }\r\n\r\n return available[0];\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Sets a cookie in the response\r\n */\r\nexport function setCookie(\r\n ctx: ServerContext,\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {}\r\n): void {\r\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\r\n\r\n if (options.maxAge !== undefined) {\r\n parts.push(`Max-Age=${options.maxAge}`);\r\n }\r\n if (options.expires) {\r\n parts.push(`Expires=${options.expires.toUTCString()}`);\r\n }\r\n if (options.path) {\r\n parts.push(`Path=${options.path}`);\r\n }\r\n if (options.domain) {\r\n parts.push(`Domain=${options.domain}`);\r\n }\r\n if (options.secure) {\r\n parts.push('Secure');\r\n }\r\n if (options.httpOnly) {\r\n parts.push('HttpOnly');\r\n }\r\n if (options.sameSite) {\r\n parts.push(`SameSite=${options.sameSite}`);\r\n }\r\n\r\n ctx.responseHeaders.append('Set-Cookie', parts.join('; '));\r\n}\r\n\r\n/**\r\n * Deletes a cookie\r\n */\r\nexport function deleteCookie(ctx: ServerContext, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\r\n setCookie(ctx, name, '', {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n\r\n/**\r\n * Cookie options\r\n */\r\nexport interface CookieOptions {\r\n /** Max age in seconds */\r\n maxAge?: number;\r\n /** Expiration date */\r\n expires?: Date;\r\n /** Cookie path */\r\n path?: string;\r\n /** Cookie domain */\r\n domain?: string;\r\n /** HTTPS only */\r\n secure?: boolean;\r\n /** Not accessible via JavaScript */\r\n httpOnly?: boolean;\r\n /** SameSite attribute */\r\n sameSite?: 'Strict' | 'Lax' | 'None';\r\n}\r\n\r\n/**\r\n * Sets cache control headers\r\n */\r\nexport function setCacheControl(ctx: ServerContext, options: CacheControlOptions): void {\r\n const parts: string[] = [];\r\n\r\n if (options.public) parts.push('public');\r\n if (options.private) parts.push('private');\r\n if (options.noCache) parts.push('no-cache');\r\n if (options.noStore) parts.push('no-store');\r\n if (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`);\r\n if (options.sMaxAge !== undefined) parts.push(`s-maxage=${options.sMaxAge}`);\r\n if (options.staleWhileRevalidate !== undefined) {\r\n parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\r\n }\r\n if (options.staleIfError !== undefined) {\r\n parts.push(`stale-if-error=${options.staleIfError}`);\r\n }\r\n if (options.mustRevalidate) parts.push('must-revalidate');\r\n if (options.immutable) parts.push('immutable');\r\n\r\n ctx.responseHeaders.set('Cache-Control', parts.join(', '));\r\n}\r\n\r\n/**\r\n * Cache control options\r\n */\r\nexport interface CacheControlOptions {\r\n public?: boolean;\r\n private?: boolean;\r\n noCache?: boolean;\r\n noStore?: boolean;\r\n maxAge?: number;\r\n sMaxAge?: number;\r\n staleWhileRevalidate?: number;\r\n staleIfError?: number;\r\n mustRevalidate?: boolean;\r\n immutable?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Error Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Not found error - triggers 404 handling\r\n */\r\nexport function notFound(message = 'Not Found'): never {\r\n const error = new Error(message) as Error & { __flight_not_found: true };\r\n error.__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a not found error\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && '__flight_not_found' in error;\r\n}\r\n\r\n/**\r\n * Redirect error - triggers redirect handling\r\n */\r\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 307): never {\r\n const error = new Error(`Redirect: ${url}`) as Error & {\r\n __flight_redirect: { url: string; status: number }\r\n };\r\n error.__flight_redirect = { url, status };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a redirect error\r\n */\r\nexport function isRedirectError(error: unknown): error is Error & {\r\n __flight_redirect: { url: string; status: number }\r\n} {\r\n return error instanceof Error && '__flight_redirect' in error;\r\n}\r\n\r\n/**\r\n * Get redirect info from error\r\n */\r\nexport function getRedirectInfo(error: Error & { __flight_redirect: { url: string; status: number } }): { url: string; status: number } {\r\n return error.__flight_redirect;\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-63SCEXD7.js"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createStreamingSSR } from './chunk-
|
|
1
|
+
import { createStreamingSSR } from './chunk-RSVA2EYO.js';
|
|
2
2
|
|
|
3
3
|
// src/streaming/observability.ts
|
|
4
4
|
function generateStreamId() {
|
|
@@ -278,5 +278,5 @@ function createHttpObserver(endpoint, options) {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver };
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
281
|
+
//# sourceMappingURL=chunk-6BDCTUQY.js.map
|
|
282
|
+
//# sourceMappingURL=chunk-6BDCTUQY.js.map
|