@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,258 @@
|
|
|
1
|
+
// src/rsc/boundaries.ts
|
|
2
|
+
var CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for("flight.client.reference");
|
|
3
|
+
var SERVER_REFERENCE = /* @__PURE__ */ Symbol.for("flight.server.reference");
|
|
4
|
+
var PATTERNS = {
|
|
5
|
+
// 'use client'; o "use client";
|
|
6
|
+
USE_CLIENT: /^['"]use client['"];?\s*$/,
|
|
7
|
+
// 'use server'; o "use server";
|
|
8
|
+
USE_SERVER: /^['"]use server['"];?\s*$/};
|
|
9
|
+
function hasUseClientDirective(source) {
|
|
10
|
+
const lines = source.trim().split("\n");
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
const trimmed = line.trim();
|
|
13
|
+
if (trimmed === "" || trimmed.startsWith("//") || trimmed.startsWith("/*")) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
return PATTERNS.USE_CLIENT.test(trimmed);
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function hasUseServerDirective(source) {
|
|
21
|
+
const lines = source.trim().split("\n");
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (trimmed === "" || trimmed.startsWith("//") || trimmed.startsWith("/*")) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
return PATTERNS.USE_SERVER.test(trimmed);
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
function detectBoundaryType(source) {
|
|
32
|
+
if (hasUseClientDirective(source)) return "client";
|
|
33
|
+
if (hasUseServerDirective(source)) return "server";
|
|
34
|
+
return "shared";
|
|
35
|
+
}
|
|
36
|
+
function detectInlineServerActions(source) {
|
|
37
|
+
const actions = [];
|
|
38
|
+
const functionPatterns = [
|
|
39
|
+
// async function name() { 'use server';
|
|
40
|
+
/async\s+function\s+(\w+)\s*\([^)]*\)\s*\{[\s\n]*['"]use server['"]/g,
|
|
41
|
+
// const name = async () => { 'use server';
|
|
42
|
+
/(?:const|let|var)\s+(\w+)\s*=\s*async\s*\([^)]*\)\s*=>\s*\{[\s\n]*['"]use server['"]/g,
|
|
43
|
+
// const name = async function() { 'use server';
|
|
44
|
+
/(?:const|let|var)\s+(\w+)\s*=\s*async\s+function\s*\([^)]*\)\s*\{[\s\n]*['"]use server['"]/g
|
|
45
|
+
];
|
|
46
|
+
for (const pattern of functionPatterns) {
|
|
47
|
+
let match;
|
|
48
|
+
while ((match = pattern.exec(source)) !== null) {
|
|
49
|
+
if (match[1]) {
|
|
50
|
+
actions.push(match[1]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return [...new Set(actions)];
|
|
55
|
+
}
|
|
56
|
+
function detectAsyncComponents(source) {
|
|
57
|
+
const components = [];
|
|
58
|
+
const patterns = [
|
|
59
|
+
// export async function ComponentName
|
|
60
|
+
/export\s+(?:default\s+)?async\s+function\s+(\w+)/g,
|
|
61
|
+
// export const ComponentName = async
|
|
62
|
+
/export\s+(?:const|let)\s+(\w+)\s*=\s*async/g
|
|
63
|
+
];
|
|
64
|
+
for (const pattern of patterns) {
|
|
65
|
+
let match;
|
|
66
|
+
while ((match = pattern.exec(source)) !== null) {
|
|
67
|
+
if (match[1] && /^[A-Z]/.test(match[1])) {
|
|
68
|
+
components.push(match[1]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return [...new Set(components)];
|
|
73
|
+
}
|
|
74
|
+
function analyzeModule(source, moduleId) {
|
|
75
|
+
const boundaries = [];
|
|
76
|
+
const serverActions = [];
|
|
77
|
+
const clientComponents = [];
|
|
78
|
+
let fileDirective;
|
|
79
|
+
if (hasUseClientDirective(source)) {
|
|
80
|
+
fileDirective = "client";
|
|
81
|
+
} else if (hasUseServerDirective(source)) {
|
|
82
|
+
fileDirective = "server";
|
|
83
|
+
}
|
|
84
|
+
if (fileDirective === "client") {
|
|
85
|
+
boundaries.push({
|
|
86
|
+
type: "client",
|
|
87
|
+
moduleId,
|
|
88
|
+
exportName: "*",
|
|
89
|
+
line: 1
|
|
90
|
+
});
|
|
91
|
+
const exports$1 = extractExports(source);
|
|
92
|
+
clientComponents.push(...exports$1);
|
|
93
|
+
}
|
|
94
|
+
if (fileDirective === "server") {
|
|
95
|
+
boundaries.push({
|
|
96
|
+
type: "server",
|
|
97
|
+
moduleId,
|
|
98
|
+
exportName: "*",
|
|
99
|
+
line: 1
|
|
100
|
+
});
|
|
101
|
+
const exports$1 = extractExports(source);
|
|
102
|
+
serverActions.push(...exports$1);
|
|
103
|
+
}
|
|
104
|
+
if (fileDirective !== "client") {
|
|
105
|
+
const inlineActions = detectInlineServerActions(source);
|
|
106
|
+
for (const action of inlineActions) {
|
|
107
|
+
if (!serverActions.includes(action)) {
|
|
108
|
+
serverActions.push(action);
|
|
109
|
+
boundaries.push({
|
|
110
|
+
type: "server",
|
|
111
|
+
moduleId,
|
|
112
|
+
exportName: action,
|
|
113
|
+
inline: true
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const asyncComponents = detectAsyncComponents(source);
|
|
119
|
+
return {
|
|
120
|
+
moduleId,
|
|
121
|
+
fileDirective,
|
|
122
|
+
boundaries,
|
|
123
|
+
serverActions,
|
|
124
|
+
clientComponents,
|
|
125
|
+
hasAsyncComponents: asyncComponents.length > 0
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function extractExports(source) {
|
|
129
|
+
const exports$1 = [];
|
|
130
|
+
const patterns = [
|
|
131
|
+
// export function/const/let/class Name
|
|
132
|
+
/export\s+(?:async\s+)?(?:function|const|let|var|class)\s+(\w+)/g,
|
|
133
|
+
// export default function Name
|
|
134
|
+
/export\s+default\s+(?:async\s+)?(?:function|class)\s+(\w+)/g,
|
|
135
|
+
// export { name }
|
|
136
|
+
/export\s*\{\s*([^}]+)\s*\}/g
|
|
137
|
+
];
|
|
138
|
+
for (const pattern of patterns) {
|
|
139
|
+
let match;
|
|
140
|
+
while ((match = pattern.exec(source)) !== null) {
|
|
141
|
+
if (match[1]) {
|
|
142
|
+
const names = match[1].split(",").map((n) => n.trim().split(/\s+as\s+/).pop().trim());
|
|
143
|
+
exports$1.push(...names.filter((n) => n && n !== "default"));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (/export\s+default\s+/.test(source)) {
|
|
148
|
+
exports$1.push("default");
|
|
149
|
+
}
|
|
150
|
+
return [...new Set(exports$1)];
|
|
151
|
+
}
|
|
152
|
+
function createClientReference(moduleId, exportName, isAsync = false) {
|
|
153
|
+
const id = `${moduleId}#${exportName}`;
|
|
154
|
+
const reference = function(_props) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`Attempted to call Client Component "${exportName}" from "${moduleId}" on the server. Client Components can only be rendered on the client.`
|
|
157
|
+
);
|
|
158
|
+
};
|
|
159
|
+
reference.$$typeof = CLIENT_REFERENCE;
|
|
160
|
+
reference.$$id = id;
|
|
161
|
+
reference.$$async = isAsync;
|
|
162
|
+
reference.__flight_client = true;
|
|
163
|
+
reference.__flight_module = moduleId;
|
|
164
|
+
reference.__flight_export = exportName;
|
|
165
|
+
return reference;
|
|
166
|
+
}
|
|
167
|
+
function createServerReference(actionId, boundArgs) {
|
|
168
|
+
const reference = async function(...args) {
|
|
169
|
+
throw new Error(
|
|
170
|
+
`Server Action "${actionId}" was called but no RPC handler is configured. Make sure the Flight bundler plugin is properly configured.`
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
reference.$$typeof = SERVER_REFERENCE;
|
|
174
|
+
reference.$$id = actionId;
|
|
175
|
+
reference.$$bound = boundArgs ?? null;
|
|
176
|
+
reference.__flight_server = true;
|
|
177
|
+
reference.__flight_action = actionId;
|
|
178
|
+
return reference;
|
|
179
|
+
}
|
|
180
|
+
function isClientReference(value) {
|
|
181
|
+
return typeof value === "function" && "$$typeof" in value && value.$$typeof === CLIENT_REFERENCE;
|
|
182
|
+
}
|
|
183
|
+
function isServerReference(value) {
|
|
184
|
+
return typeof value === "function" && "$$typeof" in value && value.$$typeof === SERVER_REFERENCE;
|
|
185
|
+
}
|
|
186
|
+
function getReferenceId(ref) {
|
|
187
|
+
return ref.$$id;
|
|
188
|
+
}
|
|
189
|
+
var BoundaryRegistry = class {
|
|
190
|
+
clientModules = /* @__PURE__ */ new Map();
|
|
191
|
+
serverActions = /* @__PURE__ */ new Map();
|
|
192
|
+
/**
|
|
193
|
+
* Registra un Client Component
|
|
194
|
+
*/
|
|
195
|
+
registerClient(id, loader) {
|
|
196
|
+
this.clientModules.set(id, loader);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Registra una Server Action
|
|
200
|
+
*/
|
|
201
|
+
registerServer(id, action) {
|
|
202
|
+
this.serverActions.set(id, action);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Obtiene un Client Component loader
|
|
206
|
+
*/
|
|
207
|
+
getClient(id) {
|
|
208
|
+
return this.clientModules.get(id);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Obtiene una Server Action
|
|
212
|
+
*/
|
|
213
|
+
getServer(id) {
|
|
214
|
+
return this.serverActions.get(id);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Verifica si un client module está registrado
|
|
218
|
+
*/
|
|
219
|
+
hasClient(id) {
|
|
220
|
+
return this.clientModules.has(id);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Verifica si una server action está registrada
|
|
224
|
+
*/
|
|
225
|
+
hasServer(id) {
|
|
226
|
+
return this.serverActions.has(id);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Obtiene todos los IDs de client modules
|
|
230
|
+
*/
|
|
231
|
+
getClientIds() {
|
|
232
|
+
return [...this.clientModules.keys()];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Obtiene todos los IDs de server actions
|
|
236
|
+
*/
|
|
237
|
+
getServerIds() {
|
|
238
|
+
return [...this.serverActions.keys()];
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Limpia el registry
|
|
242
|
+
*/
|
|
243
|
+
clear() {
|
|
244
|
+
this.clientModules.clear();
|
|
245
|
+
this.serverActions.clear();
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
var globalRegistry = new BoundaryRegistry();
|
|
249
|
+
function registerClientComponent(id, loader) {
|
|
250
|
+
globalRegistry.registerClient(id, loader);
|
|
251
|
+
}
|
|
252
|
+
function registerServerAction(id, action) {
|
|
253
|
+
globalRegistry.registerServer(id, action);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export { BoundaryRegistry, CLIENT_REFERENCE, SERVER_REFERENCE, analyzeModule, createClientReference, createServerReference, detectAsyncComponents, detectBoundaryType, detectInlineServerActions, getReferenceId, globalRegistry, hasUseClientDirective, hasUseServerDirective, isClientReference, isServerReference, registerClientComponent, registerServerAction };
|
|
257
|
+
//# sourceMappingURL=chunk-CLZSB5QD.js.map
|
|
258
|
+
//# sourceMappingURL=chunk-CLZSB5QD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/boundaries.ts"],"names":["exports"],"mappings":"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","file":"chunk-CLZSB5QD.js","sourcesContent":["/**\r\n * @flight-framework/core - Component Boundary Detection\r\n * \r\n * Sistema de detección de boundaries client/server para Server Components.\r\n * Soporta directivas 'use client' y 'use server' tanto a nivel de archivo\r\n * como inline en funciones.\r\n * \r\n * Filosofía Flight:\r\n * - Detección en build-time (no runtime overhead)\r\n * - Soporte para directivas estándar de React\r\n * - Extensible para otros frameworks\r\n * - Zero dependencies\r\n * \r\n * @module @flight-framework/core/rsc/boundaries\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Tipo de boundary de componente\r\n */\r\nexport type BoundaryType = 'server' | 'client' | 'shared';\r\n\r\n/**\r\n * Información de un boundary detectado\r\n */\r\nexport interface ComponentBoundary {\r\n /** Tipo de boundary */\r\n type: BoundaryType;\r\n /** ID del módulo (path relativo o absoluto) */\r\n moduleId: string;\r\n /** Nombre del export */\r\n exportName: string;\r\n /** Línea donde se detectó la directiva */\r\n line?: number;\r\n /** Es una directiva inline (dentro de función) */\r\n inline?: boolean;\r\n /** Metadata adicional */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Resultado del análisis de un módulo\r\n */\r\nexport interface ModuleAnalysis {\r\n /** Path del módulo */\r\n moduleId: string;\r\n /** Directiva a nivel de archivo ('use client' o 'use server') */\r\n fileDirective?: 'client' | 'server';\r\n /** Boundaries detectados */\r\n boundaries: ComponentBoundary[];\r\n /** Exports que son Server Actions */\r\n serverActions: string[];\r\n /** Exports que son Client Components */\r\n clientComponents: string[];\r\n /** El módulo tiene componentes async */\r\n hasAsyncComponents: boolean;\r\n}\r\n\r\n/**\r\n * Referencia a un Client Component\r\n */\r\nexport interface ClientReference<T = unknown> {\r\n $$typeof: symbol;\r\n $$id: string;\r\n $$async: boolean;\r\n __flight_client: true;\r\n __flight_module: string;\r\n __flight_export: string;\r\n // Type-safe component signature\r\n (props: T extends (props: infer P) => unknown ? P : unknown): unknown;\r\n}\r\n\r\n/**\r\n * Referencia a una Server Function (Action)\r\n */\r\nexport interface ServerReference<T extends (...args: unknown[]) => unknown = (...args: unknown[]) => unknown> {\r\n $$typeof: symbol;\r\n $$id: string;\r\n $$bound: unknown[] | null;\r\n __flight_server: true;\r\n __flight_action: string;\r\n // Type-safe function signature\r\n (...args: Parameters<T>): Promise<ReturnType<T>>;\r\n}\r\n\r\n// Symbols for reference detection\r\nexport const CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\nexport const SERVER_REFERENCE = Symbol.for('flight.server.reference');\r\n\r\n// ============================================================================\r\n// Directive Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Regex patterns para detección de directivas\r\n */\r\nconst PATTERNS = {\r\n // 'use client'; o \"use client\";\r\n USE_CLIENT: /^['\"]use client['\"];?\\s*$/,\r\n // 'use server'; o \"use server\";\r\n USE_SERVER: /^['\"]use server['\"];?\\s*$/,\r\n // Inline 'use server' dentro de función\r\n INLINE_USE_SERVER: /['\"]use server['\"];?/,\r\n // Detección de función async\r\n ASYNC_FUNCTION: /(?:^|\\s)async\\s+function\\s+(\\w+)/,\r\n // Detección de arrow function async\r\n ASYNC_ARROW: /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s*(?:\\([^)]*\\)|[^=])\\s*=>/,\r\n // Export statement\r\n EXPORT: /export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|const|let|class)\\s+(\\w+)/g,\r\n // Export default\r\n EXPORT_DEFAULT: /export\\s+default\\s+/,\r\n} as const;\r\n\r\n/**\r\n * Detecta si un archivo tiene la directiva 'use client'\r\n */\r\nexport function hasUseClientDirective(source: string): boolean {\r\n const lines = source.trim().split('\\n');\r\n // Check first non-empty, non-comment line\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('/*')) {\r\n continue;\r\n }\r\n return PATTERNS.USE_CLIENT.test(trimmed);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Detecta si un archivo tiene la directiva 'use server' a nivel de archivo\r\n */\r\nexport function hasUseServerDirective(source: string): boolean {\r\n const lines = source.trim().split('\\n');\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('/*')) {\r\n continue;\r\n }\r\n return PATTERNS.USE_SERVER.test(trimmed);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Detecta el tipo de componente basado en directivas\r\n */\r\nexport function detectBoundaryType(source: string): BoundaryType {\r\n if (hasUseClientDirective(source)) return 'client';\r\n if (hasUseServerDirective(source)) return 'server';\r\n return 'shared';\r\n}\r\n\r\n/**\r\n * Detecta Server Actions inline en el código\r\n * Busca funciones que contienen 'use server' dentro de su cuerpo\r\n */\r\nexport function detectInlineServerActions(source: string): string[] {\r\n const actions: string[] = [];\r\n\r\n // Regex para encontrar funciones con 'use server' inline\r\n // Soporta:\r\n // - async function name() { 'use server'; ... }\r\n // - const name = async () => { 'use server'; ... }\r\n // - const name = async function() { 'use server'; ... }\r\n\r\n const functionPatterns = [\r\n // async function name() { 'use server';\r\n /async\\s+function\\s+(\\w+)\\s*\\([^)]*\\)\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n // const name = async () => { 'use server';\r\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n // const name = async function() { 'use server';\r\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s+function\\s*\\([^)]*\\)\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n ];\r\n\r\n for (const pattern of functionPatterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1]) {\r\n actions.push(match[1]);\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(actions)]; // Deduplicar\r\n}\r\n\r\n/**\r\n * Detecta componentes async (Server Components potenciales)\r\n */\r\nexport function detectAsyncComponents(source: string): string[] {\r\n const components: string[] = [];\r\n\r\n // Buscar exports de funciones async\r\n const patterns = [\r\n // export async function ComponentName\r\n /export\\s+(?:default\\s+)?async\\s+function\\s+(\\w+)/g,\r\n // export const ComponentName = async\r\n /export\\s+(?:const|let)\\s+(\\w+)\\s*=\\s*async/g,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1] && /^[A-Z]/.test(match[1])) { // PascalCase = component\r\n components.push(match[1]);\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(components)];\r\n}\r\n\r\n/**\r\n * Análisis completo de un módulo\r\n */\r\nexport function analyzeModule(source: string, moduleId: string): ModuleAnalysis {\r\n const boundaries: ComponentBoundary[] = [];\r\n const serverActions: string[] = [];\r\n const clientComponents: string[] = [];\r\n\r\n // Detectar directiva a nivel de archivo\r\n let fileDirective: 'client' | 'server' | undefined;\r\n if (hasUseClientDirective(source)) {\r\n fileDirective = 'client';\r\n } else if (hasUseServerDirective(source)) {\r\n fileDirective = 'server';\r\n }\r\n\r\n // Si es 'use client', todo el módulo es client\r\n if (fileDirective === 'client') {\r\n boundaries.push({\r\n type: 'client',\r\n moduleId,\r\n exportName: '*',\r\n line: 1,\r\n });\r\n\r\n // Buscar todos los exports como client components\r\n const exports = extractExports(source);\r\n clientComponents.push(...exports);\r\n }\r\n\r\n // Si es 'use server' a nivel de archivo, todos los exports son server actions\r\n if (fileDirective === 'server') {\r\n boundaries.push({\r\n type: 'server',\r\n moduleId,\r\n exportName: '*',\r\n line: 1,\r\n });\r\n\r\n const exports = extractExports(source);\r\n serverActions.push(...exports);\r\n }\r\n\r\n // Detectar server actions inline (incluso en módulos sin directiva de archivo)\r\n if (fileDirective !== 'client') {\r\n const inlineActions = detectInlineServerActions(source);\r\n for (const action of inlineActions) {\r\n if (!serverActions.includes(action)) {\r\n serverActions.push(action);\r\n boundaries.push({\r\n type: 'server',\r\n moduleId,\r\n exportName: action,\r\n inline: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Detectar async components\r\n const asyncComponents = detectAsyncComponents(source);\r\n\r\n return {\r\n moduleId,\r\n fileDirective,\r\n boundaries,\r\n serverActions,\r\n clientComponents,\r\n hasAsyncComponents: asyncComponents.length > 0,\r\n };\r\n}\r\n\r\n/**\r\n * Extrae nombres de exports de un módulo\r\n */\r\nfunction extractExports(source: string): string[] {\r\n const exports: string[] = [];\r\n\r\n const patterns = [\r\n // export function/const/let/class Name\r\n /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g,\r\n // export default function Name\r\n /export\\s+default\\s+(?:async\\s+)?(?:function|class)\\s+(\\w+)/g,\r\n // export { name }\r\n /export\\s*\\{\\s*([^}]+)\\s*\\}/g,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1]) {\r\n // Handle export { a, b, c }\r\n const names = match[1].split(',').map(n => n.trim().split(/\\s+as\\s+/).pop()!.trim());\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n }\r\n\r\n // Check for export default\r\n if (/export\\s+default\\s+/.test(source)) {\r\n exports.push('default');\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\n// ============================================================================\r\n// Reference Creation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una referencia a un Client Component\r\n * Para uso en build-time (transformación de código)\r\n */\r\nexport function createClientReference<T>(\r\n moduleId: string,\r\n exportName: string,\r\n isAsync = false\r\n): ClientReference<T> {\r\n const id = `${moduleId}#${exportName}`;\r\n\r\n const reference = function (_props: unknown): never {\r\n throw new Error(\r\n `Attempted to call Client Component \"${exportName}\" from \"${moduleId}\" on the server. ` +\r\n 'Client Components can only be rendered on the client.'\r\n );\r\n } as unknown as ClientReference<T>;\r\n\r\n reference.$$typeof = CLIENT_REFERENCE;\r\n reference.$$id = id;\r\n reference.$$async = isAsync;\r\n reference.__flight_client = true;\r\n reference.__flight_module = moduleId;\r\n reference.__flight_export = exportName;\r\n\r\n return reference;\r\n}\r\n\r\n/**\r\n * Crea una referencia a una Server Function (Action)\r\n * Para uso en build-time (transformación de código)\r\n */\r\nexport function createServerReference<T extends (...args: unknown[]) => unknown>(\r\n actionId: string,\r\n boundArgs?: unknown[]\r\n): ServerReference<T> {\r\n const reference = async function (...args: unknown[]) {\r\n // Esta función será reemplazada por el bundler plugin\r\n // para hacer una llamada RPC al servidor\r\n throw new Error(\r\n `Server Action \"${actionId}\" was called but no RPC handler is configured. ` +\r\n 'Make sure the Flight bundler plugin is properly configured.'\r\n );\r\n } as unknown as ServerReference<T>;\r\n\r\n reference.$$typeof = SERVER_REFERENCE;\r\n reference.$$id = actionId;\r\n reference.$$bound = boundArgs ?? null;\r\n reference.__flight_server = true;\r\n reference.__flight_action = actionId;\r\n\r\n return reference;\r\n}\r\n\r\n/**\r\n * Verifica si un valor es una Client Reference\r\n */\r\nexport function isClientReference(value: unknown): value is ClientReference {\r\n return (\r\n typeof value === 'function' &&\r\n '$$typeof' in value &&\r\n value.$$typeof === CLIENT_REFERENCE\r\n );\r\n}\r\n\r\n/**\r\n * Verifica si un valor es una Server Reference\r\n */\r\nexport function isServerReference(value: unknown): value is ServerReference {\r\n return (\r\n typeof value === 'function' &&\r\n '$$typeof' in value &&\r\n value.$$typeof === SERVER_REFERENCE\r\n );\r\n}\r\n\r\n/**\r\n * Obtiene el ID de una referencia\r\n */\r\nexport function getReferenceId(ref: ClientReference | ServerReference): string {\r\n return ref.$$id;\r\n}\r\n\r\n// ============================================================================\r\n// Boundary Registry\r\n// ============================================================================\r\n\r\n/**\r\n * Registry de boundaries para uso en runtime\r\n */\r\nexport class BoundaryRegistry {\r\n private clientModules = new Map<string, () => Promise<unknown>>();\r\n private serverActions = new Map<string, (...args: unknown[]) => Promise<unknown>>();\r\n\r\n /**\r\n * Registra un Client Component\r\n */\r\n registerClient(id: string, loader: () => Promise<unknown>): void {\r\n this.clientModules.set(id, loader);\r\n }\r\n\r\n /**\r\n * Registra una Server Action\r\n */\r\n registerServer(id: string, action: (...args: unknown[]) => Promise<unknown>): void {\r\n this.serverActions.set(id, action);\r\n }\r\n\r\n /**\r\n * Obtiene un Client Component loader\r\n */\r\n getClient(id: string): (() => Promise<unknown>) | undefined {\r\n return this.clientModules.get(id);\r\n }\r\n\r\n /**\r\n * Obtiene una Server Action\r\n */\r\n getServer(id: string): ((...args: unknown[]) => Promise<unknown>) | undefined {\r\n return this.serverActions.get(id);\r\n }\r\n\r\n /**\r\n * Verifica si un client module está registrado\r\n */\r\n hasClient(id: string): boolean {\r\n return this.clientModules.has(id);\r\n }\r\n\r\n /**\r\n * Verifica si una server action está registrada\r\n */\r\n hasServer(id: string): boolean {\r\n return this.serverActions.has(id);\r\n }\r\n\r\n /**\r\n * Obtiene todos los IDs de client modules\r\n */\r\n getClientIds(): string[] {\r\n return [...this.clientModules.keys()];\r\n }\r\n\r\n /**\r\n * Obtiene todos los IDs de server actions\r\n */\r\n getServerIds(): string[] {\r\n return [...this.serverActions.keys()];\r\n }\r\n\r\n /**\r\n * Limpia el registry\r\n */\r\n clear(): void {\r\n this.clientModules.clear();\r\n this.serverActions.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Registry global (singleton)\r\n */\r\nexport const globalRegistry = new BoundaryRegistry();\r\n\r\n/**\r\n * Registra un Client Component en el registry global\r\n */\r\nexport function registerClientComponent(id: string, loader: () => Promise<unknown>): void {\r\n globalRegistry.registerClient(id, loader);\r\n}\r\n\r\n/**\r\n * Registra una Server Action en el registry global\r\n */\r\nexport function registerServerAction(id: string, action: (...args: unknown[]) => Promise<unknown>): void {\r\n globalRegistry.registerServer(id, action);\r\n}\r\n"]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// src/rsc/payload.ts
|
|
2
|
+
function serialize(value) {
|
|
3
|
+
return serializeValue(value, /* @__PURE__ */ new WeakSet());
|
|
4
|
+
}
|
|
5
|
+
function serializeValue(value, seen) {
|
|
6
|
+
if (value === null) return null;
|
|
7
|
+
if (value === void 0) return { $$flight: "undefined", value: "" };
|
|
8
|
+
if (typeof value === "string") return value;
|
|
9
|
+
if (typeof value === "number") {
|
|
10
|
+
if (Number.isNaN(value)) return { $$flight: "undefined", value: "NaN" };
|
|
11
|
+
if (!Number.isFinite(value)) return { $$flight: "undefined", value: value > 0 ? "Infinity" : "-Infinity" };
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === "boolean") return value;
|
|
15
|
+
if (typeof value === "bigint") return { $$flight: "bigint", value: value.toString() };
|
|
16
|
+
if (typeof value === "symbol") return { $$flight: "symbol", value: value.description ?? "" };
|
|
17
|
+
if (typeof value === "function") {
|
|
18
|
+
throw new FlightSerializationError(
|
|
19
|
+
"Functions cannot be passed from Server to Client Components. If you need to pass a function, use a Server Action instead."
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === "object") {
|
|
23
|
+
if (seen.has(value)) {
|
|
24
|
+
throw new FlightSerializationError("Circular references are not supported in Flight payloads.");
|
|
25
|
+
}
|
|
26
|
+
seen.add(value);
|
|
27
|
+
}
|
|
28
|
+
if (value instanceof Date) {
|
|
29
|
+
return { $$flight: "date", value: value.toISOString() };
|
|
30
|
+
}
|
|
31
|
+
if (value instanceof RegExp) {
|
|
32
|
+
return { $$flight: "regexp", value: value.toString() };
|
|
33
|
+
}
|
|
34
|
+
if (value instanceof URL) {
|
|
35
|
+
return { $$flight: "url", value: value.href };
|
|
36
|
+
}
|
|
37
|
+
if (value instanceof Map) {
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const [k, v] of value) {
|
|
40
|
+
entries.push([serializeValue(k, seen), serializeValue(v, seen)]);
|
|
41
|
+
}
|
|
42
|
+
return { $$flight: "map", value: entries };
|
|
43
|
+
}
|
|
44
|
+
if (value instanceof Set) {
|
|
45
|
+
const items = [];
|
|
46
|
+
for (const v of value) {
|
|
47
|
+
items.push(serializeValue(v, seen));
|
|
48
|
+
}
|
|
49
|
+
return { $$flight: "set", value: items };
|
|
50
|
+
}
|
|
51
|
+
if (value instanceof Error) {
|
|
52
|
+
return {
|
|
53
|
+
$$flight: "error",
|
|
54
|
+
value: JSON.stringify({ name: value.name, message: value.message })
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
return value.map((v) => serializeValue(v, seen));
|
|
59
|
+
}
|
|
60
|
+
if (isPlainObject(value)) {
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const [k, v] of Object.entries(value)) {
|
|
63
|
+
result[k] = serializeValue(v, seen);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(JSON.stringify(value));
|
|
69
|
+
} catch {
|
|
70
|
+
throw new FlightSerializationError(
|
|
71
|
+
`Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. Only serializable values can be passed to Client Components.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function deserialize(value) {
|
|
76
|
+
return deserializeValue(value);
|
|
77
|
+
}
|
|
78
|
+
function deserializeValue(value) {
|
|
79
|
+
if (value === null || value === void 0) return value;
|
|
80
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
if (isSpecialValue(value)) {
|
|
84
|
+
switch (value.$$flight) {
|
|
85
|
+
case "undefined":
|
|
86
|
+
if (value.value === "NaN") return NaN;
|
|
87
|
+
if (value.value === "Infinity") return Infinity;
|
|
88
|
+
if (value.value === "-Infinity") return -Infinity;
|
|
89
|
+
return void 0;
|
|
90
|
+
case "date":
|
|
91
|
+
return new Date(value.value);
|
|
92
|
+
case "bigint":
|
|
93
|
+
return BigInt(value.value);
|
|
94
|
+
case "symbol":
|
|
95
|
+
return Symbol(value.value);
|
|
96
|
+
case "regexp": {
|
|
97
|
+
const match = value.value.match(/^\/(.*)\/([gimsuy]*)$/);
|
|
98
|
+
if (match) return new RegExp(match[1], match[2]);
|
|
99
|
+
return new RegExp(value.value);
|
|
100
|
+
}
|
|
101
|
+
case "url":
|
|
102
|
+
return new URL(value.value);
|
|
103
|
+
case "map":
|
|
104
|
+
return new Map(value.value.map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));
|
|
105
|
+
case "set":
|
|
106
|
+
return new Set(value.value.map((v) => deserializeValue(v)));
|
|
107
|
+
case "error": {
|
|
108
|
+
const { name, message } = JSON.parse(value.value);
|
|
109
|
+
const error = new Error(message);
|
|
110
|
+
error.name = name;
|
|
111
|
+
return error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (Array.isArray(value)) {
|
|
116
|
+
return value.map(deserializeValue);
|
|
117
|
+
}
|
|
118
|
+
if (typeof value === "object") {
|
|
119
|
+
const result = {};
|
|
120
|
+
for (const [k, v] of Object.entries(value)) {
|
|
121
|
+
result[k] = deserializeValue(v);
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
function isPlainObject(value) {
|
|
128
|
+
if (typeof value !== "object" || value === null) return false;
|
|
129
|
+
const proto = Object.getPrototypeOf(value);
|
|
130
|
+
return proto === null || proto === Object.prototype;
|
|
131
|
+
}
|
|
132
|
+
function isSpecialValue(value) {
|
|
133
|
+
return typeof value === "object" && value !== null && "$$flight" in value;
|
|
134
|
+
}
|
|
135
|
+
function h(tag, props, ...children) {
|
|
136
|
+
const serializedProps = {};
|
|
137
|
+
if (props) {
|
|
138
|
+
for (const [key, value] of Object.entries(props)) {
|
|
139
|
+
if (key !== "children") {
|
|
140
|
+
serializedProps[key] = serialize(value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
$$type: "host",
|
|
146
|
+
tag,
|
|
147
|
+
props: serializedProps,
|
|
148
|
+
children: children.flat().map((child) => toFlightElement(child))
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function text(value) {
|
|
152
|
+
return { $$type: "text", value };
|
|
153
|
+
}
|
|
154
|
+
function fragment(...children) {
|
|
155
|
+
return {
|
|
156
|
+
$$type: "fragment",
|
|
157
|
+
children: children.flat().map((child) => toFlightElement(child))
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function suspense(id, fallback, children) {
|
|
161
|
+
return { $$type: "suspense", id, fallback, children };
|
|
162
|
+
}
|
|
163
|
+
function clientRef(refId, ssrHtml) {
|
|
164
|
+
return { $$type: "client", ref: refId, ssr: ssrHtml };
|
|
165
|
+
}
|
|
166
|
+
function toFlightElement(value) {
|
|
167
|
+
if (value === null || value === void 0 || typeof value === "boolean") {
|
|
168
|
+
return { $$type: "null" };
|
|
169
|
+
}
|
|
170
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
171
|
+
return { $$type: "text", value: String(value) };
|
|
172
|
+
}
|
|
173
|
+
if (isFlightElement(value)) {
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
return { $$type: "null" };
|
|
177
|
+
}
|
|
178
|
+
function isFlightElement(value) {
|
|
179
|
+
return typeof value === "object" && value !== null && "$$type" in value;
|
|
180
|
+
}
|
|
181
|
+
var chunkIdCounter = 0;
|
|
182
|
+
function generateChunkId(prefix = "c") {
|
|
183
|
+
return `${prefix}${chunkIdCounter++}`;
|
|
184
|
+
}
|
|
185
|
+
function resetChunkIdCounter() {
|
|
186
|
+
chunkIdCounter = 0;
|
|
187
|
+
}
|
|
188
|
+
function createServerChunk(id, tree, awaiting) {
|
|
189
|
+
return {
|
|
190
|
+
type: "S",
|
|
191
|
+
id,
|
|
192
|
+
tree,
|
|
193
|
+
awaiting,
|
|
194
|
+
ts: Date.now()
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function createClientChunk(id, module, exportName, props, fallback) {
|
|
198
|
+
return {
|
|
199
|
+
type: "C",
|
|
200
|
+
id,
|
|
201
|
+
module,
|
|
202
|
+
export: exportName,
|
|
203
|
+
props: serialize(props),
|
|
204
|
+
fallback
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function createActionChunk(id, boundArgs) {
|
|
208
|
+
return {
|
|
209
|
+
type: "A",
|
|
210
|
+
id,
|
|
211
|
+
bound: boundArgs?.map(serialize)
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function createErrorChunk(boundary, error, includeStack = false) {
|
|
215
|
+
return {
|
|
216
|
+
type: "E",
|
|
217
|
+
boundary,
|
|
218
|
+
message: error.message,
|
|
219
|
+
digest: generateErrorDigest(error),
|
|
220
|
+
stack: includeStack ? error.stack : void 0
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function createHintChunk(hint, href, options) {
|
|
224
|
+
return {
|
|
225
|
+
type: "H",
|
|
226
|
+
hint,
|
|
227
|
+
href,
|
|
228
|
+
...options
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function generateErrorDigest(error) {
|
|
232
|
+
const str = `${error.name}:${error.message}:${Date.now()}`;
|
|
233
|
+
let hash = 0;
|
|
234
|
+
for (let i = 0; i < str.length; i++) {
|
|
235
|
+
const char = str.charCodeAt(i);
|
|
236
|
+
hash = (hash << 5) - hash + char;
|
|
237
|
+
hash = hash & hash;
|
|
238
|
+
}
|
|
239
|
+
return Math.abs(hash).toString(36);
|
|
240
|
+
}
|
|
241
|
+
var FlightSerializationError = class extends Error {
|
|
242
|
+
constructor(message) {
|
|
243
|
+
super(message);
|
|
244
|
+
this.name = "FlightSerializationError";
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
var FlightPayloadError = class extends Error {
|
|
248
|
+
constructor(message, chunk) {
|
|
249
|
+
super(message);
|
|
250
|
+
this.chunk = chunk;
|
|
251
|
+
this.name = "FlightPayloadError";
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
export { FlightPayloadError, FlightSerializationError, clientRef, createActionChunk, createClientChunk, createErrorChunk, createHintChunk, createServerChunk, deserialize, fragment, generateChunkId, h, isFlightElement, resetChunkIdCounter, serialize, suspense, text, toFlightElement };
|
|
256
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|
|
257
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/payload.ts"],"names":[],"mappings":"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","file":"chunk-K2CQZPCG.js","sourcesContent":["/**\r\n * @flight-framework/core - Flight Payload System\r\n * \r\n * Formato de serialización agnóstico para Server Components.\r\n * Diseñado para máxima debuggabilidad y compatibilidad multi-framework.\r\n * \r\n * Filosofía Flight:\r\n * - Formato documentado y abierto (NDJSON)\r\n * - No depende de internals de React\r\n * - Extensible para cualquier UI framework\r\n * - Zero vendor lock-in\r\n * \r\n * @module @flight-framework/core/rsc/payload\r\n */\r\n\r\n// ============================================================================\r\n// Chunk Types - El corazón del streaming protocol\r\n// ============================================================================\r\n\r\n/**\r\n * Union type de todos los chunks que pueden enviarse en un FlightStream\r\n */\r\nexport type FlightChunk =\r\n | ServerComponentChunk\r\n | ClientReferenceChunk\r\n | ServerReferenceChunk\r\n | ErrorBoundaryChunk\r\n | HintChunk\r\n | MetaChunk;\r\n\r\n/**\r\n * Chunk de Server Component renderizado\r\n * Contiene el árbol virtual de elementos\r\n */\r\nexport interface ServerComponentChunk {\r\n /** Discriminator */\r\n readonly type: 'S';\r\n /** Unique chunk ID */\r\n readonly id: string;\r\n /** Virtual element tree */\r\n readonly tree: FlightElement;\r\n /** IDs de chunks que este depende (para streaming ordenado) */\r\n readonly awaiting?: readonly string[];\r\n /** Timestamp para debugging/observability */\r\n readonly ts?: number;\r\n}\r\n\r\n/**\r\n * Referencia a un Client Component\r\n * El cliente cargará el módulo y lo hidratará\r\n */\r\nexport interface ClientReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'C';\r\n /** Reference ID */\r\n readonly id: string;\r\n /** Module specifier (relativo al manifest) */\r\n readonly module: string;\r\n /** Export name */\r\n readonly export: string;\r\n /** Serialized props */\r\n readonly props: SerializedValue;\r\n /** Fallback HTML para SSR (opcional) */\r\n readonly fallback?: string;\r\n}\r\n\r\n/**\r\n * Referencia a una Server Function (Action)\r\n * El cliente la invocará via RPC\r\n */\r\nexport interface ServerReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'A';\r\n /** Action ID */\r\n readonly id: string;\r\n /** Bound arguments (pre-bound via .bind()) */\r\n readonly bound?: readonly SerializedValue[];\r\n}\r\n\r\n/**\r\n * Error en un boundary específico\r\n */\r\nexport interface ErrorBoundaryChunk {\r\n /** Discriminator */\r\n readonly type: 'E';\r\n /** Boundary ID where error occurred */\r\n readonly boundary: string;\r\n /** Safe error message for client */\r\n readonly message: string;\r\n /** Error digest for server-side correlation */\r\n readonly digest: string;\r\n /** Component stack for development */\r\n readonly stack?: string;\r\n}\r\n\r\n/**\r\n * Hints para el cliente (preload, prefetch, etc.)\r\n */\r\nexport interface HintChunk {\r\n /** Discriminator */\r\n readonly type: 'H';\r\n /** Hint type */\r\n readonly hint: 'preload' | 'prefetch' | 'dns-prefetch' | 'preconnect' | 'modulepreload';\r\n /** Resource URL */\r\n readonly href: string;\r\n /** Resource type (for preload) */\r\n readonly as?: 'script' | 'style' | 'image' | 'font' | 'fetch';\r\n /** Crossorigin attribute */\r\n readonly crossorigin?: 'anonymous' | 'use-credentials';\r\n}\r\n\r\n/**\r\n * Metadata chunk (para SSR head injection)\r\n */\r\nexport interface MetaChunk {\r\n /** Discriminator */\r\n readonly type: 'M';\r\n /** Meta type */\r\n readonly meta: 'title' | 'description' | 'og' | 'twitter' | 'link' | 'script';\r\n /** Content */\r\n readonly content: string | Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element - Virtual DOM agnóstico\r\n// ============================================================================\r\n\r\n/**\r\n * Virtual element que puede representar cualquier UI framework\r\n */\r\nexport type FlightElement =\r\n | FlightHostElement\r\n | FlightTextElement\r\n | FlightFragmentElement\r\n | FlightSuspenseElement\r\n | FlightClientElement\r\n | FlightLazyElement\r\n | FlightNullElement;\r\n\r\n/**\r\n * Host element (div, span, etc.)\r\n */\r\nexport interface FlightHostElement {\r\n readonly $$type: 'host';\r\n readonly tag: string;\r\n readonly key?: string | number;\r\n readonly props: Readonly<Record<string, SerializedValue>>;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Text node\r\n */\r\nexport interface FlightTextElement {\r\n readonly $$type: 'text';\r\n readonly value: string;\r\n}\r\n\r\n/**\r\n * Fragment (multiple children, no wrapper)\r\n */\r\nexport interface FlightFragmentElement {\r\n readonly $$type: 'fragment';\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Suspense boundary\r\n */\r\nexport interface FlightSuspenseElement {\r\n readonly $$type: 'suspense';\r\n readonly id: string;\r\n readonly fallback: FlightElement;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Client component reference\r\n */\r\nexport interface FlightClientElement {\r\n readonly $$type: 'client';\r\n /** Reference to ClientReferenceChunk ID */\r\n readonly ref: string;\r\n /** Pre-rendered fallback HTML */\r\n readonly ssr?: string;\r\n}\r\n\r\n/**\r\n * Lazy/async element (pending resolution)\r\n */\r\nexport interface FlightLazyElement {\r\n readonly $$type: 'lazy';\r\n readonly id: string;\r\n readonly fallback?: FlightElement;\r\n}\r\n\r\n/**\r\n * Null/empty element\r\n */\r\nexport interface FlightNullElement {\r\n readonly $$type: 'null';\r\n}\r\n\r\n// ============================================================================\r\n// Serializable Values\r\n// ============================================================================\r\n\r\n/**\r\n * Valores que pueden cruzar el boundary server/client\r\n */\r\nexport type SerializedValue =\r\n | string\r\n | number\r\n | boolean\r\n | null\r\n | undefined\r\n | readonly SerializedValue[]\r\n | { readonly [key: string]: SerializedValue }\r\n | SerializedSpecialValue;\r\n\r\n/**\r\n * Tipos especiales que requieren serialización custom\r\n */\r\nexport interface SerializedSpecialValue {\r\n readonly $$flight: SpecialValueType;\r\n readonly value: string | readonly unknown[];\r\n}\r\n\r\nexport type SpecialValueType =\r\n | 'date'\r\n | 'bigint'\r\n | 'map'\r\n | 'set'\r\n | 'undefined'\r\n | 'symbol'\r\n | 'regexp'\r\n | 'url'\r\n | 'error'\r\n | 'formdata'\r\n | 'blob'\r\n | 'arraybuffer';\r\n\r\n// ============================================================================\r\n// Serialization Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Serializa un valor para transmisión a través de FlightStream\r\n */\r\nexport function serialize(value: unknown): SerializedValue {\r\n return serializeValue(value, new WeakSet());\r\n}\r\n\r\nfunction serializeValue(value: unknown, seen: WeakSet<object>): SerializedValue {\r\n // Primitives\r\n if (value === null) return null;\r\n if (value === undefined) return { $$flight: 'undefined', value: '' };\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number') {\r\n if (Number.isNaN(value)) return { $$flight: 'undefined', value: 'NaN' };\r\n if (!Number.isFinite(value)) return { $$flight: 'undefined', value: value > 0 ? 'Infinity' : '-Infinity' };\r\n return value;\r\n }\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'bigint') return { $$flight: 'bigint', value: value.toString() };\r\n if (typeof value === 'symbol') return { $$flight: 'symbol', value: value.description ?? '' };\r\n\r\n // Functions cannot be serialized\r\n if (typeof value === 'function') {\r\n throw new FlightSerializationError(\r\n 'Functions cannot be passed from Server to Client Components. ' +\r\n 'If you need to pass a function, use a Server Action instead.'\r\n );\r\n }\r\n\r\n // Circular reference detection\r\n if (typeof value === 'object') {\r\n if (seen.has(value)) {\r\n throw new FlightSerializationError('Circular references are not supported in Flight payloads.');\r\n }\r\n seen.add(value);\r\n }\r\n\r\n // Special objects\r\n if (value instanceof Date) {\r\n return { $$flight: 'date', value: value.toISOString() };\r\n }\r\n if (value instanceof RegExp) {\r\n return { $$flight: 'regexp', value: value.toString() };\r\n }\r\n if (value instanceof URL) {\r\n return { $$flight: 'url', value: value.href };\r\n }\r\n if (value instanceof Map) {\r\n const entries: [SerializedValue, SerializedValue][] = [];\r\n for (const [k, v] of value) {\r\n entries.push([serializeValue(k, seen), serializeValue(v, seen)]);\r\n }\r\n return { $$flight: 'map', value: entries as unknown as string };\r\n }\r\n if (value instanceof Set) {\r\n const items: SerializedValue[] = [];\r\n for (const v of value) {\r\n items.push(serializeValue(v, seen));\r\n }\r\n return { $$flight: 'set', value: items as unknown as string };\r\n }\r\n if (value instanceof Error) {\r\n return {\r\n $$flight: 'error',\r\n value: JSON.stringify({ name: value.name, message: value.message })\r\n };\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(v => serializeValue(v, seen));\r\n }\r\n\r\n // Plain objects\r\n if (isPlainObject(value)) {\r\n const result: Record<string, SerializedValue> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = serializeValue(v, seen);\r\n }\r\n return result;\r\n }\r\n\r\n // Unknown object type - try JSON serialization\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as SerializedValue;\r\n } catch {\r\n throw new FlightSerializationError(\r\n `Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. ` +\r\n 'Only serializable values can be passed to Client Components.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Deserializa un valor recibido de FlightStream\r\n */\r\nexport function deserialize<T = unknown>(value: SerializedValue): T {\r\n return deserializeValue(value) as T;\r\n}\r\n\r\nfunction deserializeValue(value: SerializedValue): unknown {\r\n if (value === null || value === undefined) return value;\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n // Special values\r\n if (isSpecialValue(value)) {\r\n switch (value.$$flight) {\r\n case 'undefined':\r\n if (value.value === 'NaN') return NaN;\r\n if (value.value === 'Infinity') return Infinity;\r\n if (value.value === '-Infinity') return -Infinity;\r\n return undefined;\r\n case 'date':\r\n return new Date(value.value as string);\r\n case 'bigint':\r\n return BigInt(value.value as string);\r\n case 'symbol':\r\n return Symbol(value.value as string);\r\n case 'regexp': {\r\n const match = (value.value as string).match(/^\\/(.*)\\/([gimsuy]*)$/);\r\n if (match) return new RegExp(match[1]!, match[2]);\r\n return new RegExp(value.value as string);\r\n }\r\n case 'url':\r\n return new URL(value.value as string);\r\n case 'map':\r\n return new Map((value.value as unknown as [SerializedValue, SerializedValue][])\r\n .map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));\r\n case 'set':\r\n return new Set((value.value as unknown as SerializedValue[])\r\n .map(v => deserializeValue(v)));\r\n case 'error': {\r\n const { name, message } = JSON.parse(value.value as string);\r\n const error = new Error(message);\r\n error.name = name;\r\n return error;\r\n }\r\n }\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(deserializeValue);\r\n }\r\n\r\n // Objects\r\n if (typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = deserializeValue(v);\r\n }\r\n return result;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== 'object' || value === null) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\nfunction isSpecialValue(value: unknown): value is SerializedSpecialValue {\r\n return typeof value === 'object' && value !== null && '$$flight' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element Builders\r\n// ============================================================================\r\n\r\n/**\r\n * Create a host element\r\n */\r\nexport function h(\r\n tag: string,\r\n props: Record<string, unknown> | null,\r\n ...children: unknown[]\r\n): FlightHostElement {\r\n const serializedProps: Record<string, SerializedValue> = {};\r\n\r\n if (props) {\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key !== 'children') {\r\n serializedProps[key] = serialize(value);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n props: serializedProps,\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a text element\r\n */\r\nexport function text(value: string): FlightTextElement {\r\n return { $$type: 'text', value };\r\n}\r\n\r\n/**\r\n * Create a fragment\r\n */\r\nexport function fragment(...children: unknown[]): FlightFragmentElement {\r\n return {\r\n $$type: 'fragment',\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a suspense boundary\r\n */\r\nexport function suspense(\r\n id: string,\r\n fallback: FlightElement,\r\n children: FlightElement[]\r\n): FlightSuspenseElement {\r\n return { $$type: 'suspense', id, fallback, children };\r\n}\r\n\r\n/**\r\n * Create a client component reference\r\n */\r\nexport function clientRef(refId: string, ssrHtml?: string): FlightClientElement {\r\n return { $$type: 'client', ref: refId, ssr: ssrHtml };\r\n}\r\n\r\n/**\r\n * Convert any value to a FlightElement\r\n */\r\nexport function toFlightElement(value: unknown): FlightElement {\r\n if (value === null || value === undefined || typeof value === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return { $$type: 'text', value: String(value) };\r\n }\r\n if (isFlightElement(value)) {\r\n return value;\r\n }\r\n // Unknown - render as null\r\n return { $$type: 'null' };\r\n}\r\n\r\n/**\r\n * Type guard for FlightElement\r\n */\r\nexport function isFlightElement(value: unknown): value is FlightElement {\r\n return typeof value === 'object' && value !== null && '$$type' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Chunk Builders\r\n// ============================================================================\r\n\r\nlet chunkIdCounter = 0;\r\n\r\n/**\r\n * Generate unique chunk ID\r\n */\r\nexport function generateChunkId(prefix = 'c'): string {\r\n return `${prefix}${chunkIdCounter++}`;\r\n}\r\n\r\n/**\r\n * Reset chunk ID counter (for testing)\r\n */\r\nexport function resetChunkIdCounter(): void {\r\n chunkIdCounter = 0;\r\n}\r\n\r\n/**\r\n * Create a server component chunk\r\n */\r\nexport function createServerChunk(\r\n id: string,\r\n tree: FlightElement,\r\n awaiting?: string[]\r\n): ServerComponentChunk {\r\n return {\r\n type: 'S',\r\n id,\r\n tree,\r\n awaiting,\r\n ts: Date.now(),\r\n };\r\n}\r\n\r\n/**\r\n * Create a client reference chunk\r\n */\r\nexport function createClientChunk(\r\n id: string,\r\n module: string,\r\n exportName: string,\r\n props: unknown,\r\n fallback?: string\r\n): ClientReferenceChunk {\r\n return {\r\n type: 'C',\r\n id,\r\n module,\r\n export: exportName,\r\n props: serialize(props),\r\n fallback,\r\n };\r\n}\r\n\r\n/**\r\n * Create a server reference (action) chunk\r\n */\r\nexport function createActionChunk(\r\n id: string,\r\n boundArgs?: unknown[]\r\n): ServerReferenceChunk {\r\n return {\r\n type: 'A',\r\n id,\r\n bound: boundArgs?.map(serialize),\r\n };\r\n}\r\n\r\n/**\r\n * Create an error chunk\r\n */\r\nexport function createErrorChunk(\r\n boundary: string,\r\n error: Error,\r\n includeStack = false\r\n): ErrorBoundaryChunk {\r\n return {\r\n type: 'E',\r\n boundary,\r\n message: error.message,\r\n digest: generateErrorDigest(error),\r\n stack: includeStack ? error.stack : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Create a hint chunk\r\n */\r\nexport function createHintChunk(\r\n hint: HintChunk['hint'],\r\n href: string,\r\n options?: { as?: HintChunk['as']; crossorigin?: HintChunk['crossorigin'] }\r\n): HintChunk {\r\n return {\r\n type: 'H',\r\n hint,\r\n href,\r\n ...options,\r\n };\r\n}\r\n\r\n/**\r\n * Generate error digest for correlation\r\n */\r\nfunction generateErrorDigest(error: Error): string {\r\n const str = `${error.name}:${error.message}:${Date.now()}`;\r\n // Simple hash for digest\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n}\r\n\r\n// ============================================================================\r\n// Custom Errors\r\n// ============================================================================\r\n\r\n/**\r\n * Error thrown during serialization\r\n */\r\nexport class FlightSerializationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'FlightSerializationError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown during payload processing\r\n */\r\nexport class FlightPayloadError extends Error {\r\n constructor(message: string, public readonly chunk?: FlightChunk) {\r\n super(message);\r\n this.name = 'FlightPayloadError';\r\n }\r\n}\r\n"]}
|