@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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/dist/{chunk-5KF3QQWZ.js → chunk-3AY23FZP.js} +5 -19
  3. package/dist/chunk-3AY23FZP.js.map +1 -0
  4. package/dist/chunk-4F77J5TY.js +324 -0
  5. package/dist/chunk-4F77J5TY.js.map +1 -0
  6. package/dist/chunk-5GUCB2CG.js +300 -0
  7. package/dist/chunk-5GUCB2CG.js.map +1 -0
  8. package/dist/chunk-62C7LX2E.js +205 -0
  9. package/dist/chunk-62C7LX2E.js.map +1 -0
  10. package/dist/chunk-63SCEXD7.js +3 -0
  11. package/dist/chunk-63SCEXD7.js.map +1 -0
  12. package/dist/{chunk-YIOQC3DC.js → chunk-6BDCTUQY.js} +3 -3
  13. package/dist/{chunk-YIOQC3DC.js.map → chunk-6BDCTUQY.js.map} +1 -1
  14. package/dist/chunk-6CD5FIYI.js +252 -0
  15. package/dist/chunk-6CD5FIYI.js.map +1 -0
  16. package/dist/chunk-6XZQPPYC.js +285 -0
  17. package/dist/chunk-6XZQPPYC.js.map +1 -0
  18. package/dist/chunk-BJIMTO2I.js +213 -0
  19. package/dist/chunk-BJIMTO2I.js.map +1 -0
  20. package/dist/chunk-CLZSB5QD.js +258 -0
  21. package/dist/chunk-CLZSB5QD.js.map +1 -0
  22. package/dist/chunk-K2CQZPCG.js +257 -0
  23. package/dist/chunk-K2CQZPCG.js.map +1 -0
  24. package/dist/chunk-MRLCNFSD.js +341 -0
  25. package/dist/chunk-MRLCNFSD.js.map +1 -0
  26. package/dist/chunk-PSJPMEQK.js +212 -0
  27. package/dist/chunk-PSJPMEQK.js.map +1 -0
  28. package/dist/chunk-Q62ZQ6FM.js +218 -0
  29. package/dist/chunk-Q62ZQ6FM.js.map +1 -0
  30. package/dist/{chunk-6WSPUG5L.js → chunk-RSVA2EYO.js} +2 -2
  31. package/dist/chunk-RSVA2EYO.js.map +1 -0
  32. package/dist/chunk-T3S5YC7L.js +256 -0
  33. package/dist/chunk-T3S5YC7L.js.map +1 -0
  34. package/dist/{chunk-OBNYNJB5.js → chunk-WOEIJWGJ.js} +6 -8
  35. package/dist/chunk-WOEIJWGJ.js.map +1 -0
  36. package/dist/{chunk-I2B4WSHC.js → chunk-XSY5AAXT.js} +3 -4
  37. package/dist/chunk-XSY5AAXT.js.map +1 -0
  38. package/dist/chunk-Y22AMGTM.js +3 -0
  39. package/dist/chunk-Y22AMGTM.js.map +1 -0
  40. package/dist/file-router/streaming-hints.d.ts +1 -1
  41. package/dist/file-router/streaming-hints.js +1 -1
  42. package/dist/index.d.ts +3 -1
  43. package/dist/index.js +19 -7
  44. package/dist/index.js.map +1 -1
  45. package/dist/rsc/adapters/index.d.ts +8 -0
  46. package/dist/rsc/adapters/index.js +7 -0
  47. package/dist/rsc/adapters/index.js.map +1 -0
  48. package/dist/rsc/adapters/preact.d.ts +97 -0
  49. package/dist/rsc/adapters/preact.js +3 -0
  50. package/dist/rsc/adapters/preact.js.map +1 -0
  51. package/dist/rsc/adapters/react.d.ts +82 -0
  52. package/dist/rsc/adapters/react.js +3 -0
  53. package/dist/rsc/adapters/react.js.map +1 -0
  54. package/dist/rsc/adapters/solid.d.ts +84 -0
  55. package/dist/rsc/adapters/solid.js +3 -0
  56. package/dist/rsc/adapters/solid.js.map +1 -0
  57. package/dist/rsc/adapters/vue.d.ts +80 -0
  58. package/dist/rsc/adapters/vue.js +3 -0
  59. package/dist/rsc/adapters/vue.js.map +1 -0
  60. package/dist/rsc/boundaries.d.ts +182 -0
  61. package/dist/rsc/boundaries.js +3 -0
  62. package/dist/rsc/boundaries.js.map +1 -0
  63. package/dist/rsc/context.d.ts +201 -0
  64. package/dist/rsc/context.js +3 -0
  65. package/dist/rsc/context.js.map +1 -0
  66. package/dist/rsc/index.d.ts +20 -124
  67. package/dist/rsc/index.js +13 -1
  68. package/dist/rsc/legacy.d.ts +131 -0
  69. package/dist/rsc/legacy.js +3 -0
  70. package/dist/rsc/legacy.js.map +1 -0
  71. package/dist/rsc/payload.d.ts +262 -0
  72. package/dist/rsc/payload.js +3 -0
  73. package/dist/rsc/payload.js.map +1 -0
  74. package/dist/rsc/plugins/esbuild.d.ts +124 -0
  75. package/dist/rsc/plugins/esbuild.js +4 -0
  76. package/dist/rsc/plugins/esbuild.js.map +1 -0
  77. package/dist/rsc/plugins/index.d.ts +4 -0
  78. package/dist/rsc/plugins/index.js +6 -0
  79. package/dist/rsc/plugins/index.js.map +1 -0
  80. package/dist/rsc/plugins/rollup.d.ts +103 -0
  81. package/dist/rsc/plugins/rollup.js +4 -0
  82. package/dist/rsc/plugins/rollup.js.map +1 -0
  83. package/dist/rsc/renderer.d.ts +160 -0
  84. package/dist/rsc/renderer.js +5 -0
  85. package/dist/rsc/renderer.js.map +1 -0
  86. package/dist/rsc/stream.d.ts +129 -0
  87. package/dist/rsc/stream.js +3 -0
  88. package/dist/rsc/stream.js.map +1 -0
  89. package/dist/rsc/vite-plugin.d.ts +78 -0
  90. package/dist/rsc/vite-plugin.js +4 -0
  91. package/dist/rsc/vite-plugin.js.map +1 -0
  92. package/dist/streaming/index.js +1 -1
  93. package/dist/streaming/observability.js +2 -2
  94. package/dist/streaming/priority.js +1 -1
  95. package/package.json +180 -124
  96. package/dist/chunk-5KF3QQWZ.js.map +0 -1
  97. package/dist/chunk-6WSPUG5L.js.map +0 -1
  98. package/dist/chunk-I2B4WSHC.js.map +0 -1
  99. package/dist/chunk-OBNYNJB5.js.map +0 -1
@@ -0,0 +1,285 @@
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-CLZSB5QD.js';
2
+
3
+ // src/rsc/plugins/esbuild.ts
4
+ function flightRSCEsbuild(options = {}) {
5
+ const {
6
+ include = /\.(tsx?|jsx?)$/,
7
+ exclude = /node_modules/,
8
+ actionsEndpoint = "/_flight/action",
9
+ manifestDir = ".flight",
10
+ ssr = false,
11
+ dev = false
12
+ } = options;
13
+ const state = {
14
+ clientModules: /* @__PURE__ */ new Map(),
15
+ serverActions: /* @__PURE__ */ new Map()};
16
+ return {
17
+ name: "flight-rsc",
18
+ setup(build) {
19
+ const outdir = build.initialOptions.outdir || "dist";
20
+ build.onStart(() => {
21
+ state.clientModules.clear();
22
+ state.serverActions.clear();
23
+ });
24
+ build.onLoad({ filter: include }, async (args) => {
25
+ if (exclude.test(args.path)) {
26
+ return null;
27
+ }
28
+ const fs = await import('fs/promises');
29
+ const code = await fs.readFile(args.path, "utf-8");
30
+ const analysis = analyzeModule(code, args.path);
31
+ const moduleId = createModuleId(args.path);
32
+ if (analysis.fileDirective === "client") {
33
+ state.clientModules.set(args.path, {
34
+ id: moduleId,
35
+ file: args.path,
36
+ exports: analysis.clientComponents
37
+ });
38
+ }
39
+ if (analysis.fileDirective === "server" || analysis.serverActions.length > 0) {
40
+ state.serverActions.set(args.path, {
41
+ id: moduleId,
42
+ file: args.path,
43
+ exports: analysis.serverActions
44
+ });
45
+ }
46
+ if (ssr) {
47
+ if (hasUseClientDirective(code)) {
48
+ return {
49
+ contents: transformClientForSSR(code, moduleId),
50
+ loader: getLoader(args.path)
51
+ };
52
+ }
53
+ } else {
54
+ if (hasUseServerDirective(code)) {
55
+ return {
56
+ contents: transformServerForClient(code, moduleId, actionsEndpoint),
57
+ loader: getLoader(args.path)
58
+ };
59
+ }
60
+ const inlineActions = detectInlineServerActions(code);
61
+ if (inlineActions.length > 0) {
62
+ return {
63
+ contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),
64
+ loader: getLoader(args.path)
65
+ };
66
+ }
67
+ }
68
+ return null;
69
+ });
70
+ build.onEnd(async () => {
71
+ const fs = await import('fs/promises');
72
+ const path = await import('path');
73
+ const manifestPath = path.join(outdir, manifestDir);
74
+ await fs.mkdir(manifestPath, { recursive: true });
75
+ if (state.clientModules.size > 0) {
76
+ const clientManifest = Object.fromEntries(state.clientModules);
77
+ await fs.writeFile(
78
+ path.join(manifestPath, "client-manifest.json"),
79
+ JSON.stringify(clientManifest, null, 2)
80
+ );
81
+ }
82
+ if (state.serverActions.size > 0) {
83
+ const serverManifest = Object.fromEntries(state.serverActions);
84
+ await fs.writeFile(
85
+ path.join(manifestPath, "server-manifest.json"),
86
+ JSON.stringify(serverManifest, null, 2)
87
+ );
88
+ }
89
+ if (dev) {
90
+ console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);
91
+ console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);
92
+ }
93
+ });
94
+ }
95
+ };
96
+ }
97
+ function transformClientForSSR(code, moduleId) {
98
+ const exports$1 = extractExportNames(code);
99
+ let transformed = `
100
+ // Flight RSC: Client Component Reference (esbuild)
101
+ // Original module: ${moduleId}
102
+
103
+ const __flight_module_id = ${JSON.stringify(moduleId)};
104
+
105
+ `;
106
+ for (const exportName of exports$1) {
107
+ if (exportName === "default") {
108
+ transformed += `
109
+ const __flight_default = Object.assign(
110
+ function() {
111
+ throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
112
+ },
113
+ {
114
+ $$typeof: Symbol.for('flight.client.reference'),
115
+ $$id: __flight_module_id + '#default',
116
+ $$async: false,
117
+ __flight_client: true,
118
+ __flight_module: __flight_module_id,
119
+ __flight_export: 'default',
120
+ }
121
+ );
122
+ export default __flight_default;
123
+ `;
124
+ } else {
125
+ transformed += `
126
+ export const ${exportName} = Object.assign(
127
+ function() {
128
+ throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
129
+ },
130
+ {
131
+ $$typeof: Symbol.for('flight.client.reference'),
132
+ $$id: __flight_module_id + '#${exportName}',
133
+ $$async: false,
134
+ __flight_client: true,
135
+ __flight_module: __flight_module_id,
136
+ __flight_export: '${exportName}',
137
+ }
138
+ );
139
+ `;
140
+ }
141
+ }
142
+ return transformed;
143
+ }
144
+ function transformServerForClient(code, moduleId, endpoint) {
145
+ const exports$1 = extractExportNames(code);
146
+ let transformed = `
147
+ // Flight RSC: Server Actions RPC Proxies (esbuild)
148
+ // Original module: ${moduleId}
149
+
150
+ const __flight_endpoint = ${JSON.stringify(endpoint)};
151
+ const __flight_module_id = ${JSON.stringify(moduleId)};
152
+
153
+ async function __flight_rpc(actionId, args) {
154
+ const response = await fetch(__flight_endpoint, {
155
+ method: 'POST',
156
+ headers: {
157
+ 'Content-Type': 'application/json',
158
+ 'X-Flight-Action': actionId,
159
+ },
160
+ body: JSON.stringify({ actionId, args }),
161
+ });
162
+
163
+ if (!response.ok) {
164
+ const error = await response.json().catch(() => ({ message: 'Server action failed' }));
165
+ throw new Error(error.message || 'Server action failed');
166
+ }
167
+
168
+ return response.json();
169
+ }
170
+
171
+ `;
172
+ for (const exportName of exports$1) {
173
+ const actionId = `${moduleId}#${exportName}`;
174
+ if (exportName === "default") {
175
+ transformed += `
176
+ export default async function(...args) {
177
+ return __flight_rpc(${JSON.stringify(actionId)}, args);
178
+ }
179
+ `;
180
+ } else {
181
+ transformed += `
182
+ export async function ${exportName}(...args) {
183
+ return __flight_rpc(${JSON.stringify(actionId)}, args);
184
+ }
185
+ `;
186
+ }
187
+ }
188
+ return transformed;
189
+ }
190
+ function transformInlineActions(code, moduleId, actions, endpoint) {
191
+ let transformed = code;
192
+ const rpcHelper = `
193
+ // Flight RSC: Inline Server Action Helpers
194
+ const __flight_endpoint_inline = ${JSON.stringify(endpoint)};
195
+ async function __flight_rpc_inline(actionId, args) {
196
+ const response = await fetch(__flight_endpoint_inline, {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },
199
+ body: JSON.stringify({ actionId, args }),
200
+ });
201
+ if (!response.ok) throw new Error('Server action failed');
202
+ return response.json();
203
+ }
204
+ `;
205
+ const lastImportMatch = code.match(/^import\s.+$/gm);
206
+ if (lastImportMatch) {
207
+ const lastImport = lastImportMatch[lastImportMatch.length - 1] || "";
208
+ const insertPos = code.indexOf(lastImport) + lastImport.length;
209
+ transformed = code.slice(0, insertPos) + "\n" + rpcHelper + code.slice(insertPos);
210
+ } else {
211
+ transformed = rpcHelper + code;
212
+ }
213
+ for (const actionName of actions) {
214
+ const actionId = `${moduleId}#${actionName}`;
215
+ const patterns = [
216
+ // async function name() { 'use server'; ... }
217
+ new RegExp(
218
+ `async\\s+function\\s+${actionName}\\s*\\([^)]*\\)\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
219
+ "g"
220
+ ),
221
+ // const name = async () => { 'use server'; ... }
222
+ new RegExp(
223
+ `const\\s+${actionName}\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
224
+ "g"
225
+ )
226
+ ];
227
+ for (const pattern of patterns) {
228
+ transformed = transformed.replace(
229
+ pattern,
230
+ `async function ${actionName}(...args) { return __flight_rpc_inline(${JSON.stringify(actionId)}, args); }`
231
+ );
232
+ }
233
+ }
234
+ return transformed;
235
+ }
236
+ function createModuleId(filePath) {
237
+ let id = filePath.replace(/\\/g, "/");
238
+ const prefixes = ["/src/", "src/"];
239
+ for (const prefix of prefixes) {
240
+ const idx = id.indexOf(prefix);
241
+ if (idx !== -1) {
242
+ id = id.slice(idx + prefix.length);
243
+ break;
244
+ }
245
+ }
246
+ if (!id.startsWith("/")) {
247
+ id = "/" + id;
248
+ }
249
+ return id;
250
+ }
251
+ function getLoader(filePath) {
252
+ if (filePath.endsWith(".tsx")) return "tsx";
253
+ if (filePath.endsWith(".ts")) return "ts";
254
+ if (filePath.endsWith(".jsx")) return "jsx";
255
+ return "js";
256
+ }
257
+ function extractExportNames(code) {
258
+ const exports$1 = [];
259
+ if (/export\s+default\s+/.test(code)) {
260
+ exports$1.push("default");
261
+ }
262
+ const namedPattern = /export\s+(?:async\s+)?(?:function|const|let|var|class)\s+(\w+)/g;
263
+ let match;
264
+ while ((match = namedPattern.exec(code)) !== null) {
265
+ if (match[1] && match[1] !== "default") {
266
+ exports$1.push(match[1]);
267
+ }
268
+ }
269
+ const bracketPattern = /export\s*\{\s*([^}]+)\s*\}/g;
270
+ while ((match = bracketPattern.exec(code)) !== null) {
271
+ if (match[1]) {
272
+ const names = match[1].split(",").map((n) => {
273
+ const parts = n.trim().split(/\s+as\s+/);
274
+ return parts[parts.length - 1]?.trim() || "";
275
+ });
276
+ exports$1.push(...names.filter((n) => n && n !== "default"));
277
+ }
278
+ }
279
+ return [...new Set(exports$1)];
280
+ }
281
+ var esbuild_default = flightRSCEsbuild;
282
+
283
+ export { esbuild_default, flightRSCEsbuild };
284
+ //# sourceMappingURL=chunk-6XZQPPYC.js.map
285
+ //# sourceMappingURL=chunk-6XZQPPYC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/plugins/esbuild.ts"],"names":["exports"],"mappings":"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","file":"chunk-6XZQPPYC.js","sourcesContent":["/**\r\n * @flight-framework/core - esbuild Plugin for RSC\r\n * \r\n * esbuild 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 - esbuild is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/esbuild\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 * esbuild Plugin interface (minimal)\r\n * We define our own to avoid requiring esbuild as dependency\r\n */\r\nexport interface EsbuildPlugin {\r\n name: string;\r\n setup: (build: EsbuildBuild) => void | Promise<void>;\r\n}\r\n\r\nexport interface EsbuildBuild {\r\n initialOptions: EsbuildBuildOptions;\r\n onStart: (callback: () => void | Promise<void>) => void;\r\n onEnd: (callback: (result: EsbuildResult) => void | Promise<void>) => void;\r\n onResolve: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildResolveArgs) => EsbuildResolveResult | null | undefined | Promise<EsbuildResolveResult | null | undefined>\r\n ) => void;\r\n onLoad: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildLoadArgs) => EsbuildLoadResult | null | undefined | Promise<EsbuildLoadResult | null | undefined>\r\n ) => void;\r\n}\r\n\r\nexport interface EsbuildBuildOptions {\r\n outdir?: string;\r\n write?: boolean;\r\n metafile?: boolean;\r\n}\r\n\r\nexport interface EsbuildResult {\r\n errors: unknown[];\r\n warnings: unknown[];\r\n metafile?: unknown;\r\n}\r\n\r\nexport interface EsbuildResolveArgs {\r\n path: string;\r\n importer: string;\r\n namespace: string;\r\n resolveDir: string;\r\n kind: string;\r\n}\r\n\r\nexport interface EsbuildResolveResult {\r\n path?: string;\r\n external?: boolean;\r\n namespace?: string;\r\n suffix?: string;\r\n pluginData?: unknown;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\nexport interface EsbuildLoadArgs {\r\n path: string;\r\n namespace: string;\r\n suffix: string;\r\n pluginData: unknown;\r\n}\r\n\r\nexport interface EsbuildLoadResult {\r\n contents?: string;\r\n loader?: 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'text' | 'css';\r\n resolveDir?: string;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightEsbuildPluginOptions {\r\n /** Include patterns (regex) */\r\n include?: RegExp;\r\n\r\n /** Exclude patterns (regex) */\r\n exclude?: RegExp;\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Output directory for manifests */\r\n manifestDir?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode (include extra debug info) */\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 isSSR: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC esbuild Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // build.js\r\n * import * as esbuild from 'esbuild';\r\n * import { flightRSCEsbuild } from '@flight-framework/core/rsc/plugins/esbuild';\r\n * \r\n * await esbuild.build({\r\n * entryPoints: ['src/index.tsx'],\r\n * bundle: true,\r\n * outdir: 'dist',\r\n * plugins: [\r\n * flightRSCEsbuild({\r\n * actionsEndpoint: '/_flight/action',\r\n * ssr: true,\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function flightRSCEsbuild(options: FlightEsbuildPluginOptions = {}): EsbuildPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n manifestDir = '.flight',\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 isSSR: ssr,\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n setup(build) {\r\n const outdir = build.initialOptions.outdir || 'dist';\r\n\r\n // ============================================================\r\n // onStart: Reset state\r\n // ============================================================\r\n build.onStart(() => {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n });\r\n\r\n // ============================================================\r\n // onLoad: Transform client/server modules\r\n // ============================================================\r\n build.onLoad({ filter: include }, async (args) => {\r\n // Skip excluded\r\n if (exclude.test(args.path)) {\r\n return null;\r\n }\r\n\r\n // Read file\r\n const fs = await import('fs/promises');\r\n const code = await fs.readFile(args.path, 'utf-8');\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, args.path);\r\n const moduleId = createModuleId(args.path);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(args.path, {\r\n id: moduleId,\r\n file: args.path,\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(args.path, {\r\n id: moduleId,\r\n file: args.path,\r\n exports: analysis.serverActions,\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 contents: transformClientForSSR(code, moduleId),\r\n loader: getLoader(args.path),\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 contents: transformServerForClient(code, moduleId, actionsEndpoint),\r\n loader: getLoader(args.path),\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 contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n });\r\n\r\n // ============================================================\r\n // onEnd: Write manifests\r\n // ============================================================\r\n build.onEnd(async () => {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n\r\n const manifestPath = path.join(outdir, manifestDir);\r\n\r\n // Ensure directory exists\r\n await fs.mkdir(manifestPath, { recursive: true });\r\n\r\n // Write client manifest\r\n if (state.clientModules.size > 0) {\r\n const clientManifest = Object.fromEntries(state.clientModules);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'client-manifest.json'),\r\n JSON.stringify(clientManifest, null, 2)\r\n );\r\n }\r\n\r\n // Write server manifest\r\n if (state.serverActions.size > 0) {\r\n const serverManifest = Object.fromEntries(state.serverActions);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'server-manifest.json'),\r\n JSON.stringify(serverManifest, null, 2)\r\n );\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);\r\n }\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 (esbuild)\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 (esbuild)\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 at the top (after any imports)\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers\r\nconst __flight_endpoint_inline = ${JSON.stringify(endpoint)};\r\nasync function __flight_rpc_inline(actionId, args) {\r\n const response = await fetch(__flight_endpoint_inline, {\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 // Find last import statement\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 each action function\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n // Replace async function with RPC call\r\n // This is simplified - production would use proper AST transformation\r\n const patterns = [\r\n // async function name() { 'use server'; ... }\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 // const name = async () => { 'use server'; ... }\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_rpc_inline(${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 // Normalize and create relative path\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n // Remove common prefixes\r\n const prefixes = ['/src/', 'src/'];\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 + prefix.length);\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 * Get esbuild loader from file extension\r\n */\r\nfunction getLoader(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' {\r\n if (filePath.endsWith('.tsx')) return 'tsx';\r\n if (filePath.endsWith('.ts')) return 'ts';\r\n if (filePath.endsWith('.jsx')) return 'jsx';\r\n return 'js';\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 // export default\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n // export function/const/let/class Name\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 // export { a, b, c }\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 flightRSCEsbuild;\r\n"]}
@@ -0,0 +1,213 @@
1
+ // src/rsc/adapters/vue.ts
2
+ var VUE_FRAGMENT = /* @__PURE__ */ Symbol.for("v-fgt");
3
+ var VUE_TEXT = /* @__PURE__ */ Symbol.for("v-txt");
4
+ var VUE_COMMENT = /* @__PURE__ */ Symbol.for("v-cmt");
5
+ var VUE_SUSPENSE = /* @__PURE__ */ Symbol.for("v-sus");
6
+ var VUE_TELEPORT = /* @__PURE__ */ Symbol.for("v-tel");
7
+ var CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for("flight.client.reference");
8
+ function createVueAdapter(deps) {
9
+ const { Vue, renderToString } = deps || {};
10
+ return {
11
+ name: "vue",
12
+ isElement(value) {
13
+ if (Vue?.isVNode) {
14
+ return Vue.isVNode(value);
15
+ }
16
+ return typeof value === "object" && value !== null && value.__v_isVNode === true;
17
+ },
18
+ getElementType(element) {
19
+ const vnode = element;
20
+ const type = vnode.type;
21
+ if (typeof type === "string") {
22
+ return { kind: "host", tag: type };
23
+ }
24
+ if (typeof type === "symbol") {
25
+ if (type === VUE_FRAGMENT || type === Vue?.Fragment) {
26
+ return { kind: "fragment" };
27
+ }
28
+ if (type === VUE_TEXT || type === Vue?.Text) {
29
+ const children = vnode.children;
30
+ return {
31
+ kind: "text",
32
+ value: String(children ?? "")
33
+ };
34
+ }
35
+ if (type === VUE_COMMENT) {
36
+ return { kind: "null" };
37
+ }
38
+ if (type === VUE_SUSPENSE) {
39
+ return {
40
+ kind: "suspense",
41
+ fallback: vnode.props?.fallback
42
+ };
43
+ }
44
+ if (type === VUE_TELEPORT) {
45
+ return { kind: "fragment" };
46
+ }
47
+ return { kind: "null" };
48
+ }
49
+ if (typeof type === "object" && type !== null) {
50
+ const comp = type;
51
+ if (comp.__asyncLoader) {
52
+ return {
53
+ kind: "component",
54
+ fn: () => null,
55
+ name: comp.name || "AsyncComponent"
56
+ };
57
+ }
58
+ if (comp.setup || comp.render) {
59
+ return {
60
+ kind: "component",
61
+ fn: (props) => {
62
+ return null;
63
+ },
64
+ name: comp.name || "VueComponent"
65
+ };
66
+ }
67
+ }
68
+ if (typeof type === "function") {
69
+ const fn = type;
70
+ return {
71
+ kind: "component",
72
+ fn,
73
+ name: fn.displayName || fn.__name || fn.name || "Component"
74
+ };
75
+ }
76
+ return { kind: "null" };
77
+ },
78
+ getProps(element) {
79
+ const vnode = element;
80
+ return vnode.props || {};
81
+ },
82
+ getChildren(element) {
83
+ const vnode = element;
84
+ const children = vnode.children;
85
+ if (children === void 0 || children === null) {
86
+ return [];
87
+ }
88
+ if (typeof children === "string" || typeof children === "number") {
89
+ return [children];
90
+ }
91
+ if (Array.isArray(children)) {
92
+ return children.flat();
93
+ }
94
+ if (typeof children === "object" && children !== null) {
95
+ const slots = children;
96
+ if (typeof slots.default === "function") {
97
+ return slots.default();
98
+ }
99
+ }
100
+ return [children];
101
+ },
102
+ getKey(element) {
103
+ const key = element.key;
104
+ return key !== null ? key : void 0;
105
+ },
106
+ isClientBoundary(component) {
107
+ if (typeof component !== "function" && typeof component !== "object") {
108
+ return false;
109
+ }
110
+ const comp = component;
111
+ if (comp.__flight_client === true) return true;
112
+ if (comp.$$typeof === CLIENT_REFERENCE) return true;
113
+ return false;
114
+ },
115
+ async renderToString(element) {
116
+ if (renderToString && Vue?.createSSRApp) {
117
+ const app = Vue.createSSRApp({
118
+ render: () => element
119
+ });
120
+ return renderToString(app);
121
+ }
122
+ throw new Error(
123
+ "renderToString not provided. Pass Vue and renderToString when creating the adapter: createVueAdapter({ Vue, renderToString })"
124
+ );
125
+ }
126
+ };
127
+ }
128
+ function createVueConsumer(deps, options = {}) {
129
+ const { Vue } = deps;
130
+ const { registry = /* @__PURE__ */ new Map() } = options;
131
+ return {
132
+ /**
133
+ * Register a client component
134
+ */
135
+ register(id, loader) {
136
+ registry.set(id, loader);
137
+ },
138
+ /**
139
+ * Convert Flight elements to Vue VNodes
140
+ */
141
+ toVueElement(element) {
142
+ switch (element.$$type) {
143
+ case "null":
144
+ return null;
145
+ case "text":
146
+ return element.value;
147
+ case "host": {
148
+ const children = element.children.map((c) => this.toVueElement(c));
149
+ return Vue.h(
150
+ element.tag,
151
+ { ...element.props, key: element.key },
152
+ children
153
+ );
154
+ }
155
+ case "fragment": {
156
+ const children = element.children.map((c) => this.toVueElement(c));
157
+ return Vue.h(Vue.Fragment, null, children);
158
+ }
159
+ case "suspense": {
160
+ if (Vue.Suspense) {
161
+ const fallback = this.toVueElement(element.fallback);
162
+ const children2 = element.children.map((c) => this.toVueElement(c));
163
+ return Vue.h(Vue.Suspense, null, {
164
+ default: () => children2,
165
+ fallback: () => fallback
166
+ });
167
+ }
168
+ const children = element.children.map((c) => this.toVueElement(c));
169
+ return Vue.h(Vue.Fragment, null, children);
170
+ }
171
+ case "client": {
172
+ const loader = registry.get(element.ref);
173
+ if (!loader) {
174
+ console.warn(`[Flight] Client component not registered: ${element.ref}`);
175
+ if (element.ssr) {
176
+ return Vue.h("div", {
177
+ innerHTML: element.ssr
178
+ });
179
+ }
180
+ return null;
181
+ }
182
+ const AsyncComponent = {
183
+ async setup() {
184
+ const mod = await loader();
185
+ return () => Vue.h(mod.default ?? mod);
186
+ }
187
+ };
188
+ return Vue.h(AsyncComponent);
189
+ }
190
+ case "lazy": {
191
+ if (element.fallback) {
192
+ return this.toVueElement(element.fallback);
193
+ }
194
+ return Vue.h("div", { "data-flight-pending": element.id });
195
+ }
196
+ default:
197
+ return null;
198
+ }
199
+ }
200
+ };
201
+ }
202
+ function markAsVueClientComponent(component, moduleId, exportName = "default") {
203
+ const marked = component;
204
+ marked.$$typeof = CLIENT_REFERENCE;
205
+ marked.__flight_client = true;
206
+ marked.__flight_module = moduleId;
207
+ marked.__flight_export = exportName;
208
+ return marked;
209
+ }
210
+
211
+ export { createVueAdapter, createVueConsumer, markAsVueClientComponent };
212
+ //# sourceMappingURL=chunk-BJIMTO2I.js.map
213
+ //# sourceMappingURL=chunk-BJIMTO2I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/adapters/vue.ts"],"names":["children"],"mappings":"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","file":"chunk-BJIMTO2I.js","sourcesContent":["/**\r\n * @flight-framework/core - Vue UI Adapter\r\n * \r\n * Adapter for using Vue 3 with Flight Server Components.\r\n * Enables Flight to render Vue components without tight coupling.\r\n * \r\n * Philosophy: Zero lock-in - Vue is optional, user decides.\r\n * \r\n * @module @flight-framework/core/rsc/adapters/vue\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// Vue Symbols (Vue 3 internal markers)\r\n// ============================================================================\r\n\r\nconst VUE_VNODE_TYPE = Symbol.for('v-vnd');\r\nconst VUE_FRAGMENT = Symbol.for('v-fgt');\r\nconst VUE_TEXT = Symbol.for('v-txt');\r\nconst VUE_COMMENT = Symbol.for('v-cmt');\r\nconst VUE_SUSPENSE = Symbol.for('v-sus');\r\nconst VUE_TELEPORT = Symbol.for('v-tel');\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\nconst SERVER_REFERENCE = Symbol.for('flight.server.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal Vue VNode interface\r\n */\r\ninterface VueVNode {\r\n __v_isVNode?: boolean;\r\n type: unknown;\r\n props: Record<string, unknown> | null;\r\n children: unknown;\r\n key: string | number | null;\r\n component?: unknown;\r\n shapeFlag?: number;\r\n}\r\n\r\n/**\r\n * Vue dependencies (user provides these)\r\n */\r\nexport interface VueDependencies {\r\n /** Vue module */\r\n Vue: {\r\n h: (type: unknown, props?: unknown, children?: unknown) => VueVNode;\r\n isVNode: (value: unknown) => boolean;\r\n createSSRApp?: (rootComponent: unknown) => unknown;\r\n Fragment?: symbol;\r\n Suspense?: unknown;\r\n Text?: symbol;\r\n };\r\n /** renderToString from vue/server-renderer (optional - for SSR) */\r\n renderToString?: (app: unknown) => Promise<string>;\r\n}\r\n\r\n// ============================================================================\r\n// Vue Shape Flags (for component detection)\r\n// ============================================================================\r\n\r\nconst ShapeFlags = {\r\n ELEMENT: 1,\r\n FUNCTIONAL_COMPONENT: 2,\r\n STATEFUL_COMPONENT: 4,\r\n TEXT_CHILDREN: 8,\r\n ARRAY_CHILDREN: 16,\r\n SLOTS_CHILDREN: 32,\r\n TELEPORT: 64,\r\n SUSPENSE: 128,\r\n COMPONENT_SHOULD_KEEP_ALIVE: 256,\r\n COMPONENT_KEPT_ALIVE: 512,\r\n COMPONENT: 6, // STATEFUL | FUNCTIONAL\r\n};\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create Vue UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createVueAdapter } from '@flight-framework/core/rsc/adapters/vue';\r\n * import * as Vue from 'vue';\r\n * import { renderToString } from 'vue/server-renderer';\r\n * \r\n * const adapter = createVueAdapter({\r\n * Vue,\r\n * renderToString,\r\n * });\r\n * \r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createVueAdapter(deps?: VueDependencies): UIAdapter {\r\n const { Vue, renderToString } = deps || {};\r\n\r\n return {\r\n name: 'vue',\r\n\r\n isElement(value: unknown): boolean {\r\n if (Vue?.isVNode) {\r\n return Vue.isVNode(value);\r\n }\r\n // Fallback: check for __v_isVNode marker\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n (value as VueVNode).__v_isVNode === true\r\n );\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n const vnode = element as VueVNode;\r\n const type = vnode.type;\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Symbol types\r\n if (typeof type === 'symbol') {\r\n // Fragment\r\n if (type === VUE_FRAGMENT || type === Vue?.Fragment) {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n // Text\r\n if (type === VUE_TEXT || type === Vue?.Text) {\r\n const children = vnode.children;\r\n return {\r\n kind: 'text',\r\n value: String(children ?? '')\r\n };\r\n }\r\n\r\n // Comment\r\n if (type === VUE_COMMENT) {\r\n return { kind: 'null' };\r\n }\r\n\r\n // Suspense\r\n if (type === VUE_SUSPENSE) {\r\n return {\r\n kind: 'suspense',\r\n fallback: vnode.props?.fallback\r\n };\r\n }\r\n\r\n // Teleport (treat as fragment for RSC)\r\n if (type === VUE_TELEPORT) {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n return { kind: 'null' };\r\n }\r\n\r\n // Object component (Options API or async component)\r\n if (typeof type === 'object' && type !== null) {\r\n const comp = type as {\r\n name?: string;\r\n setup?: unknown;\r\n render?: unknown;\r\n __asyncLoader?: unknown;\r\n };\r\n\r\n // Async component\r\n if (comp.__asyncLoader) {\r\n return {\r\n kind: 'component',\r\n fn: () => null,\r\n name: comp.name || 'AsyncComponent'\r\n };\r\n }\r\n\r\n // Options API component\r\n if (comp.setup || comp.render) {\r\n return {\r\n kind: 'component',\r\n fn: (props) => {\r\n // Vue components need to be rendered differently\r\n // This is a placeholder - actual rendering uses renderToString\r\n return null;\r\n },\r\n name: comp.name || 'VueComponent',\r\n };\r\n }\r\n }\r\n\r\n // Function component (Composition API)\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n __name?: string;\r\n };\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.__name || fn.name || 'Component'\r\n };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n const vnode = element as VueVNode;\r\n return vnode.props || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n const vnode = element as VueVNode;\r\n const children = vnode.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n // String children\r\n if (typeof children === 'string' || typeof children === 'number') {\r\n return [children];\r\n }\r\n\r\n // Array children\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n // Slots object\r\n if (typeof children === 'object' && children !== null) {\r\n const slots = children as Record<string, () => unknown[]>;\r\n if (typeof slots.default === 'function') {\r\n return slots.default();\r\n }\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n const key = (element as VueVNode).key;\r\n return key !== null ? key : undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function' && typeof component !== 'object') {\r\n return false;\r\n }\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (renderToString && Vue?.createSSRApp) {\r\n // Create SSR app wrapper\r\n const app = Vue.createSSRApp({\r\n render: () => element\r\n });\r\n return renderToString(app);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass Vue and renderToString when creating the adapter: ' +\r\n 'createVueAdapter({ Vue, renderToString })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Vue Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Vue consumer\r\n */\r\nexport interface VueConsumerOptions {\r\n /** Registry of client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n}\r\n\r\n/**\r\n * Create a Vue client-side consumer for Flight payloads\r\n */\r\nexport function createVueConsumer(deps: VueDependencies, options: VueConsumerOptions = {}) {\r\n const { Vue } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to Vue VNodes\r\n */\r\n toVueElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n const children = element.children.map(c => this.toVueElement(c));\r\n return Vue.h(\r\n element.tag,\r\n { ...element.props, key: element.key },\r\n children\r\n );\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toVueElement(c));\r\n return Vue.h(Vue.Fragment!, null, children);\r\n }\r\n\r\n case 'suspense': {\r\n if (Vue.Suspense) {\r\n const fallback = this.toVueElement(element.fallback);\r\n const children = element.children.map(c => this.toVueElement(c));\r\n return Vue.h(Vue.Suspense, null, {\r\n default: () => children,\r\n fallback: () => fallback,\r\n });\r\n }\r\n // Fallback: render children directly\r\n const children = element.children.map(c => this.toVueElement(c));\r\n return Vue.h(Vue.Fragment!, null, children);\r\n }\r\n\r\n case 'client': {\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n if (element.ssr) {\r\n return Vue.h('div', {\r\n innerHTML: element.ssr\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n // Create async component\r\n const AsyncComponent = {\r\n async setup() {\r\n const mod = await loader() as { default?: unknown };\r\n return () => Vue.h(mod.default ?? mod as unknown);\r\n }\r\n };\r\n\r\n return Vue.h(AsyncComponent);\r\n }\r\n\r\n case 'lazy': {\r\n if (element.fallback) {\r\n return this.toVueElement(element.fallback);\r\n }\r\n return Vue.h('div', { 'data-flight-pending': element.id });\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for Vue Server Component\r\n */\r\nexport type VueServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<VueVNode> | VueVNode;\r\n\r\n/**\r\n * Mark a Vue component as a client component\r\n */\r\nexport function markAsVueClientComponent<T extends object>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n"]}