@flight-framework/core 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-BJIMTO2I.js → chunk-2F2QU6RC.js} +15 -3
- package/dist/chunk-2F2QU6RC.js.map +1 -0
- package/dist/{chunk-3AY23FZP.js → chunk-3ZSSRE6M.js} +3 -3
- package/dist/chunk-3ZSSRE6M.js.map +1 -0
- package/dist/{chunk-Q62ZQ6FM.js → chunk-MDQNNIHH.js} +13 -2
- package/dist/chunk-MDQNNIHH.js.map +1 -0
- package/dist/{chunk-5GUCB2CG.js → chunk-NWMJYTMB.js} +3 -3
- package/dist/{chunk-5GUCB2CG.js.map → chunk-NWMJYTMB.js.map} +1 -1
- package/dist/{chunk-4F77J5TY.js → chunk-P6WSBVDT.js} +8 -16
- package/dist/chunk-P6WSBVDT.js.map +1 -0
- package/dist/{chunk-CLZSB5QD.js → chunk-PDW5WCMW.js} +3 -3
- package/dist/{chunk-CLZSB5QD.js.map → chunk-PDW5WCMW.js.map} +1 -1
- package/dist/{chunk-T3S5YC7L.js → chunk-PVUMB632.js} +3 -3
- package/dist/{chunk-T3S5YC7L.js.map → chunk-PVUMB632.js.map} +1 -1
- package/dist/{chunk-6XZQPPYC.js → chunk-T4Z4HM4W.js} +3 -3
- package/dist/{chunk-6XZQPPYC.js.map → chunk-T4Z4HM4W.js.map} +1 -1
- package/dist/{chunk-PSJPMEQK.js → chunk-TASAT7KB.js} +12 -2
- package/dist/chunk-TASAT7KB.js.map +1 -0
- package/dist/{chunk-6CD5FIYI.js → chunk-VPFMHGEV.js} +9 -2
- package/dist/chunk-VPFMHGEV.js.map +1 -0
- package/dist/{chunk-MRLCNFSD.js → chunk-ZIE56LCA.js} +5 -5
- package/dist/chunk-ZIE56LCA.js.map +1 -0
- package/dist/index.js +9 -9
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/index.js +9 -9
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.d.ts +5 -3
- package/dist/rsc/renderer.js +2 -2
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/package.json +179 -179
- package/LICENSE +0 -21
- package/dist/chunk-3AY23FZP.js.map +0 -1
- package/dist/chunk-4F77J5TY.js.map +0 -1
- package/dist/chunk-6CD5FIYI.js.map +0 -1
- package/dist/chunk-BJIMTO2I.js.map +0 -1
- package/dist/chunk-MRLCNFSD.js.map +0 -1
- package/dist/chunk-PSJPMEQK.js.map +0 -1
- package/dist/chunk-Q62ZQ6FM.js.map +0 -1
|
@@ -58,7 +58,7 @@ function createVueAdapter(deps) {
|
|
|
58
58
|
if (comp.setup || comp.render) {
|
|
59
59
|
return {
|
|
60
60
|
kind: "component",
|
|
61
|
-
fn: (
|
|
61
|
+
fn: (_props) => {
|
|
62
62
|
return null;
|
|
63
63
|
},
|
|
64
64
|
name: comp.name || "VueComponent"
|
|
@@ -112,6 +112,18 @@ function createVueAdapter(deps) {
|
|
|
112
112
|
if (comp.$$typeof === CLIENT_REFERENCE) return true;
|
|
113
113
|
return false;
|
|
114
114
|
},
|
|
115
|
+
createElement(component, props) {
|
|
116
|
+
if (Vue?.h) {
|
|
117
|
+
return Vue.h(component, props);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
__v_isVNode: true,
|
|
121
|
+
type: component,
|
|
122
|
+
props,
|
|
123
|
+
key: null,
|
|
124
|
+
children: props.children ?? null
|
|
125
|
+
};
|
|
126
|
+
},
|
|
115
127
|
async renderToString(element) {
|
|
116
128
|
if (renderToString && Vue?.createSSRApp) {
|
|
117
129
|
const app = Vue.createSSRApp({
|
|
@@ -209,5 +221,5 @@ function markAsVueClientComponent(component, moduleId, exportName = "default") {
|
|
|
209
221
|
}
|
|
210
222
|
|
|
211
223
|
export { createVueAdapter, createVueConsumer, markAsVueClientComponent };
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
224
|
+
//# sourceMappingURL=chunk-2F2QU6RC.js.map
|
|
225
|
+
//# sourceMappingURL=chunk-2F2QU6RC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/adapters/vue.ts"],"names":["children"],"mappings":"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","file":"chunk-2F2QU6RC.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_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\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// 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 createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Create a Vue VNode using h() if available\r\n if (Vue?.h) {\r\n return Vue.h(component, props);\r\n }\r\n\r\n // Fallback: create VNode structure directly\r\n return {\r\n __v_isVNode: true,\r\n type: component,\r\n props,\r\n key: null,\r\n children: props.children ?? null,\r\n } as VueVNode;\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"]}
|
|
@@ -26,7 +26,7 @@ function createRenderContext(request, params = {}) {
|
|
|
26
26
|
}
|
|
27
27
|
var fetchCache = /* @__PURE__ */ new Map();
|
|
28
28
|
async function serverFetch(url, options = {}) {
|
|
29
|
-
const { revalidate = 60,
|
|
29
|
+
const { revalidate = 60, ...fetchOptions } = options;
|
|
30
30
|
const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;
|
|
31
31
|
const cached = fetchCache.get(cacheKey);
|
|
32
32
|
if (cached) {
|
|
@@ -170,5 +170,5 @@ function isRedirectError(error) {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, isNotFoundError, isRedirectError, notFound, redirect, revalidatePath, revalidateTag, serializeProps, serverFetch, withErrorBoundary };
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
173
|
+
//# sourceMappingURL=chunk-3ZSSRE6M.js.map
|
|
174
|
+
//# sourceMappingURL=chunk-3ZSSRE6M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/legacy.ts"],"names":[],"mappings":"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","file":"chunk-3ZSSRE6M.js","sourcesContent":["/**\r\n * @flight-framework/core - Legacy RSC Support\r\n * \r\n * Backward compatibility module for the original RSC implementation.\r\n * Use the new API from './index.js' for new features.\r\n * \r\n * @deprecated Use the new RSC API instead\r\n * @module @flight-framework/core/rsc/legacy\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Component rendering context\r\n * @deprecated Use ServerContext from './context.js' instead\r\n */\r\nexport interface RenderContext {\r\n /** Current request */\r\n request: Request;\r\n /** Route params */\r\n params: Record<string, string>;\r\n /** Search params */\r\n searchParams: URLSearchParams;\r\n /** Request headers */\r\n headers: Headers;\r\n /** Cookies */\r\n cookies: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Server component definition\r\n * @deprecated Use ServerComponentFn from './index.js' instead\r\n */\r\nexport interface ServerComponent<P = unknown> {\r\n (props: P, context: RenderContext): Promise<string> | string;\r\n /** Mark as server component */\r\n __flight_server?: true;\r\n /** Dependencies for hydration */\r\n __flight_deps?: string[];\r\n}\r\n\r\n/**\r\n * Client component definition\r\n * @deprecated Use ClientReference from './boundaries.js' instead\r\n */\r\nexport interface ClientComponent<P = unknown> {\r\n (props: P): unknown;\r\n /** Mark as client component */\r\n __flight_client?: true;\r\n /** Client bundle path */\r\n __flight_bundle?: string;\r\n}\r\n\r\n/**\r\n * Component type detection\r\n */\r\nexport type ComponentType = 'server' | 'client' | 'hybrid';\r\n\r\n// ============================================================================\r\n// Server Component Execution\r\n// ============================================================================\r\n\r\n/**\r\n * Execute an async server component\r\n * @deprecated Use the new rendering pipeline instead\r\n */\r\nexport async function executeServerComponent<P>(\r\n component: ServerComponent<P>,\r\n props: P,\r\n context: RenderContext\r\n): Promise<string> {\r\n try {\r\n const result = await component(props, context);\r\n return result;\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a render context from a Request\r\n * @deprecated Use createServerContext from './context.js' instead\r\n */\r\nexport function createRenderContext(request: Request, params: Record<string, string> = {}): RenderContext {\r\n const url = new URL(request.url);\r\n\r\n // Parse cookies\r\n const cookies = new Map<string, string>();\r\n const cookieHeader = request.headers.get('cookie') || '';\r\n cookieHeader.split(';').forEach(cookie => {\r\n const [key, value] = cookie.trim().split('=');\r\n if (key && value) cookies.set(key, value);\r\n });\r\n\r\n return {\r\n request,\r\n params,\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Data Fetching Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Cache for server-side fetch requests\r\n */\r\nconst fetchCache = new Map<string, { data: unknown; timestamp: number }>();\r\n\r\n/**\r\n * Server-side fetch with automatic caching\r\n */\r\nexport async function serverFetch<T>(\r\n url: string,\r\n options: RequestInit & {\r\n revalidate?: number | false;\r\n tags?: string[];\r\n } = {}\r\n): Promise<T> {\r\n const { revalidate = 60, ...fetchOptions } = options;\r\n const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;\r\n\r\n // Check cache\r\n const cached = fetchCache.get(cacheKey);\r\n if (cached) {\r\n const age = Date.now() - cached.timestamp;\r\n if (revalidate === false || age < (revalidate * 1000)) {\r\n return cached.data as T;\r\n }\r\n }\r\n\r\n // Fetch fresh data\r\n const response = await fetch(url, fetchOptions);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Fetch failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Cache the result\r\n if (revalidate !== false) {\r\n fetchCache.set(cacheKey, {\r\n data,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n return data as T;\r\n}\r\n\r\n/**\r\n * Invalidate cache by tag\r\n */\r\nexport function revalidateTag(tag: string): void {\r\n console.log(`[Flight] Revalidating tag: ${tag}`);\r\n}\r\n\r\n/**\r\n * Invalidate cache by path\r\n */\r\nexport function revalidatePath(path: string): void {\r\n console.log(`[Flight] Revalidating path: ${path}`);\r\n}\r\n\r\n// ============================================================================\r\n// Component Serialization\r\n// ============================================================================\r\n\r\n/**\r\n * Serialize props for transmission to client\r\n * @deprecated Use serialize from './payload.js' instead\r\n */\r\nexport function serializeProps(props: unknown): string {\r\n function preProcess(value: unknown): unknown {\r\n if (value instanceof Date) {\r\n return { __type: 'Date', value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()).map(([k, v]) => [preProcess(k), preProcess(v)]) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value).map(preProcess) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n if (typeof value === 'function') {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(preProcess);\r\n }\r\n if (value && typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = preProcess(v);\r\n }\r\n return result;\r\n }\r\n return value;\r\n }\r\n\r\n return JSON.stringify(preProcess(props));\r\n}\r\n\r\n/**\r\n * Deserialize props on client\r\n * @deprecated Use deserialize from './payload.js' instead\r\n */\r\nexport function deserializeProps<T>(serialized: string): T {\r\n return JSON.parse(serialized, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.value);\r\n case 'Map':\r\n return new Map(value.value);\r\n case 'Set':\r\n return new Set(value.value);\r\n case 'BigInt':\r\n return BigInt(value.value);\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Client Component Boundary\r\n// ============================================================================\r\n\r\n/**\r\n * Create a client boundary placeholder\r\n * @deprecated Use clientRef from './payload.js' instead\r\n */\r\nexport function createClientBoundary(\r\n componentId: string,\r\n props: unknown,\r\n fallback?: string\r\n): string {\r\n const serializedProps = serializeProps(props);\r\n\r\n return `\r\n<!--flight-client:${componentId}-->\r\n<div data-flight-component=\"${componentId}\" data-flight-props='${serializedProps.replace(/'/g, \"'\")}'>\r\n ${fallback || '<div>Loading...</div>'}\r\n</div>\r\n<!--/flight-client-->\r\n<script type=\"module\">\r\n(async function() {\r\n const component = await import('/_flight/components/${componentId}.js');\r\n const props = JSON.parse('${serializedProps.replace(/'/g, \"\\\\'\")}');\r\n const container = document.querySelector('[data-flight-component=\"${componentId}\"]');\r\n if (container && component.default) {\r\n if (typeof component.hydrate === 'function') {\r\n component.hydrate(container, props);\r\n }\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n// ============================================================================\r\n// Async Component Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Helper to create an async server component\r\n * @deprecated Use async Server Components directly\r\n */\r\nexport function createAsyncComponent<P, T>(\r\n fetcher: (props: P, context: RenderContext) => Promise<T>,\r\n renderer: (data: T, props: P) => string\r\n): ServerComponent<P> {\r\n const component: ServerComponent<P> = async (props, context) => {\r\n const data = await fetcher(props, context);\r\n return renderer(data, props);\r\n };\r\n component.__flight_server = true;\r\n return component;\r\n}\r\n\r\n/**\r\n * Compose multiple server components\r\n * @deprecated Use Promise.all with async components\r\n */\r\nexport function composeComponents(\r\n ...components: Array<() => Promise<string> | string>\r\n): () => Promise<string> {\r\n return async () => {\r\n const results = await Promise.all(\r\n components.map(async (comp) => await comp())\r\n );\r\n return results.join('');\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Error Boundary for Server Components\r\n// ============================================================================\r\n\r\n/**\r\n * Wrap a server component with error handling\r\n * @deprecated Use try/catch in async components\r\n */\r\nexport function withErrorBoundary<P>(\r\n component: ServerComponent<P>,\r\n errorFallback: (error: Error) => string\r\n): ServerComponent<P> {\r\n return async (props: P, context: RenderContext) => {\r\n try {\r\n return await component(props, context);\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n return errorFallback(error as Error);\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Not Found / Redirect Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Throw a not found error\r\n * @deprecated Use notFound from './context.js' instead\r\n */\r\nexport function notFound(): never {\r\n const error = new Error('Not Found');\r\n (error as Error & { __flight_not_found: boolean }).__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is not found\r\n * @deprecated Use isNotFoundError from './context.js' instead\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && (error as Error & { __flight_not_found?: boolean }).__flight_not_found === true;\r\n}\r\n\r\n/**\r\n * Server-side redirect\r\n * @deprecated Use redirect from './context.js' instead\r\n */\r\nexport function redirect(url: string, type: 'replace' | 'push' = 'replace'): never {\r\n const error = new Error(`Redirect: ${url}`);\r\n (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect = { url, type };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is redirect\r\n * @deprecated Use isRedirectError from './context.js' instead\r\n */\r\nexport function isRedirectError(error: unknown): { url: string; type: string } | null {\r\n if (error instanceof Error && (error as Error & { __flight_redirect?: unknown }).__flight_redirect) {\r\n return (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect;\r\n }\r\n return null;\r\n}\r\n"]}
|
|
@@ -72,6 +72,17 @@ function createPreactAdapter(deps) {
|
|
|
72
72
|
if (comp.$$typeof === CLIENT_REFERENCE) return true;
|
|
73
73
|
return false;
|
|
74
74
|
},
|
|
75
|
+
createElement(component, props) {
|
|
76
|
+
if (preact?.h) {
|
|
77
|
+
return preact.h(component, props);
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
type: component,
|
|
81
|
+
props,
|
|
82
|
+
key: null,
|
|
83
|
+
ref: null
|
|
84
|
+
};
|
|
85
|
+
},
|
|
75
86
|
async renderToString(element) {
|
|
76
87
|
if (renderToString) {
|
|
77
88
|
return renderToString(element);
|
|
@@ -214,5 +225,5 @@ function lazy(loader) {
|
|
|
214
225
|
}
|
|
215
226
|
|
|
216
227
|
export { createPreactAdapter, createPreactConsumer, lazy, markAsPreactClientComponent };
|
|
217
|
-
//# sourceMappingURL=chunk-
|
|
218
|
-
//# sourceMappingURL=chunk-
|
|
228
|
+
//# sourceMappingURL=chunk-MDQNNIHH.js.map
|
|
229
|
+
//# sourceMappingURL=chunk-MDQNNIHH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/adapters/preact.ts"],"names":[],"mappings":"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","file":"chunk-MDQNNIHH.js","sourcesContent":["/**\r\n * @flight-framework/core - Preact UI Adapter\r\n * \r\n * Adapter for using Preact with Flight Server Components.\r\n * Enables Flight to render Preact components without tight coupling.\r\n * \r\n * Philosophy: Zero lock-in - Preact is optional, user decides.\r\n * \r\n * @module @flight-framework/core/rsc/adapters/preact\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// Preact Symbols\r\n// ============================================================================\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal Preact VNode interface\r\n */\r\ninterface PreactVNode {\r\n type: unknown;\r\n props: Record<string, unknown>;\r\n key: string | number | null;\r\n ref: unknown;\r\n __?: unknown; // parent\r\n __k?: unknown[]; // children\r\n __b?: number; // depth\r\n __e?: unknown; // dom\r\n __c?: unknown; // component\r\n}\r\n\r\n/**\r\n * Preact dependencies (user provides these)\r\n */\r\nexport interface PreactDependencies {\r\n /** preact module */\r\n preact: {\r\n h: (type: unknown, props?: unknown, ...children: unknown[]) => PreactVNode;\r\n Fragment?: unknown;\r\n Component?: unknown;\r\n isValidElement?: (value: unknown) => boolean;\r\n cloneElement?: (vnode: PreactVNode, props?: unknown) => PreactVNode;\r\n };\r\n /** preact-render-to-string module (optional - for SSR) */\r\n renderToString?: (vnode: PreactVNode) => string;\r\n /** preact/hooks module (optional) */\r\n hooks?: {\r\n useState: <T>(initial: T) => [T, (v: T) => void];\r\n useEffect: (fn: () => void | (() => void), deps?: unknown[]) => void;\r\n useMemo: <T>(fn: () => T, deps: unknown[]) => T;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create Preact UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPreactAdapter } from '@flight-framework/core/rsc/adapters/preact';\r\n * import * as preact from 'preact';\r\n * import renderToString from 'preact-render-to-string';\r\n * \r\n * const adapter = createPreactAdapter({\r\n * preact,\r\n * renderToString,\r\n * });\r\n * \r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createPreactAdapter(deps?: PreactDependencies): UIAdapter {\r\n const { preact, renderToString } = deps || {};\r\n\r\n return {\r\n name: 'preact',\r\n\r\n isElement(value: unknown): boolean {\r\n if (preact?.isValidElement) {\r\n return preact.isValidElement(value);\r\n }\r\n // Fallback: check for VNode structure\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'type' in value &&\r\n 'props' in value\r\n );\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n const vnode = element as PreactVNode;\r\n const type = vnode.type;\r\n\r\n // Null type (text or null node)\r\n if (type === null) {\r\n const props = vnode.props;\r\n if (typeof props === 'string' || typeof props === 'number') {\r\n return { kind: 'text', value: String(props) };\r\n }\r\n return { kind: 'null' };\r\n }\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Fragment\r\n if (type === preact?.Fragment) {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n // Function component\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n\r\n // Check for class component (extends Component)\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\r\n if (preact?.Component && type.prototype instanceof (preact.Component as unknown as Function)) {\r\n return {\r\n kind: 'component',\r\n fn: (props) => {\r\n // Class components need instantiation\r\n const Component = type as new (props: unknown) => { render: () => unknown };\r\n const instance = new Component(props);\r\n return instance.render();\r\n },\r\n name: fn.displayName || fn.name || 'PreactComponent',\r\n };\r\n }\r\n\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'Component'\r\n };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n return (element as PreactVNode).props || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n const props = (element as PreactVNode).props;\r\n const children = props?.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n const key = (element as PreactVNode).key;\r\n return key !== null ? key : undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function') return false;\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Create a Preact VNode using h() if available\r\n if (preact?.h) {\r\n return preact.h(component, props);\r\n }\r\n\r\n // Fallback: create VNode structure directly\r\n return {\r\n type: component,\r\n props,\r\n key: null,\r\n ref: null,\r\n } as PreactVNode;\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (renderToString) {\r\n return renderToString(element as PreactVNode);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass preact-render-to-string when creating the adapter: ' +\r\n 'createPreactAdapter({ preact, renderToString })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Preact Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Preact consumer\r\n */\r\nexport interface PreactConsumerOptions {\r\n /** Registry of client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n}\r\n\r\n/**\r\n * Create a Preact client-side consumer for Flight payloads\r\n */\r\nexport function createPreactConsumer(\r\n deps: PreactDependencies,\r\n options: PreactConsumerOptions = {}\r\n) {\r\n const { preact } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to Preact VNodes\r\n */\r\n toPreactElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(\r\n element.tag,\r\n { ...element.props, key: element.key },\r\n ...children\r\n );\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'suspense': {\r\n // Preact doesn't have built-in Suspense, use fragment\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'client': {\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n // Create lazy loading wrapper\r\n // Preact doesn't have React.lazy, so we create a simple async loader\r\n const LazyWrapper = (props: Record<string, unknown>) => {\r\n // This is a simplified version - in production use @preact/signals\r\n // or a state management solution\r\n const loadedRef = { current: null as unknown };\r\n\r\n loader().then((mod: { default?: unknown }) => {\r\n loadedRef.current = mod.default ?? mod;\r\n });\r\n\r\n if (loadedRef.current) {\r\n return preact.h(loadedRef.current as string, props);\r\n }\r\n\r\n // Return SSR placeholder\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n\r\n return preact.h('div', { 'data-flight-loading': element.ref });\r\n };\r\n\r\n return preact.h(LazyWrapper, {});\r\n }\r\n\r\n case 'lazy': {\r\n if (element.fallback) {\r\n return this.toPreactElement(element.fallback);\r\n }\r\n return preact.h('div', { 'data-flight-pending': element.id });\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * Hydrate Flight payload into DOM\r\n */\r\n hydrate(\r\n chunks: import('../payload.js').FlightChunk[],\r\n container: Element,\r\n hydrateFn?: (vnode: unknown, container: Element) => void\r\n ): void {\r\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\r\n if (!rootChunk || rootChunk.type !== 'S') {\r\n throw new Error('[Flight] No root chunk found');\r\n }\r\n\r\n // Register client components\r\n for (const chunk of chunks) {\r\n if (chunk.type === 'C') {\r\n if (!registry.has(chunk.id)) {\r\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\r\n }\r\n }\r\n }\r\n\r\n const element = this.toPreactElement(rootChunk.tree);\r\n\r\n if (hydrateFn) {\r\n hydrateFn(element, container);\r\n } else {\r\n // Fallback: use preact.render (not ideal for SSR)\r\n const { render } = deps?.preact as { render?: (vnode: unknown, container: Element) => void } || {};\r\n if (render) {\r\n render(element, container);\r\n } else {\r\n throw new Error('[Flight] No hydrate or render function provided');\r\n }\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for Preact Server Component\r\n */\r\nexport type PreactServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<PreactVNode> | PreactVNode;\r\n\r\n/**\r\n * Mark a Preact component as a client component\r\n */\r\nexport function markAsPreactClientComponent<T extends (...args: unknown[]) => unknown>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n\r\n/**\r\n * Create a lazy-loading component for Preact\r\n */\r\nexport function lazy<T extends (...args: unknown[]) => unknown>(\r\n loader: () => Promise<{ default: T }>\r\n): T {\r\n let Component: T | null = null;\r\n let promise: Promise<{ default: T }> | null = null;\r\n\r\n const LazyComponent = ((props: unknown) => {\r\n if (Component) {\r\n return Component(props);\r\n }\r\n\r\n if (!promise) {\r\n promise = loader().then(mod => {\r\n Component = mod.default;\r\n return mod;\r\n });\r\n }\r\n\r\n throw promise; // Suspense-style\r\n }) as T;\r\n\r\n return LazyComponent;\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-
|
|
1
|
+
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
|
|
2
2
|
|
|
3
3
|
// src/rsc/plugins/rollup.ts
|
|
4
4
|
function flightRSCRollup(options = {}) {
|
|
@@ -296,5 +296,5 @@ function extractExportNames(code) {
|
|
|
296
296
|
var rollup_default = flightRSCRollup;
|
|
297
297
|
|
|
298
298
|
export { flightRSCRollup, rollup_default };
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
300
|
-
//# sourceMappingURL=chunk-
|
|
299
|
+
//# sourceMappingURL=chunk-NWMJYTMB.js.map
|
|
300
|
+
//# sourceMappingURL=chunk-NWMJYTMB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/plugins/rollup.ts"],"names":["exports"],"mappings":"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","file":"chunk-5GUCB2CG.js","sourcesContent":["/**\r\n * @flight-framework/core - Rollup Plugin for RSC\r\n * \r\n * Rollup plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - Rollup is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/rollup\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Rollup Plugin interface (minimal)\r\n * We define our own to avoid requiring rollup as dependency\r\n */\r\nexport interface RollupPlugin {\r\n name: string;\r\n buildStart?: (options: unknown) => void | Promise<void>;\r\n resolveId?: (\r\n source: string,\r\n importer: string | undefined,\r\n options: { isEntry: boolean }\r\n ) => string | null | undefined | { id: string; external?: boolean } | Promise<string | null | undefined | { id: string; external?: boolean }>;\r\n load?: (id: string) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n transform?: (\r\n code: string,\r\n id: string\r\n ) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n generateBundle?: (\r\n options: unknown,\r\n bundle: Record<string, unknown>\r\n ) => void | Promise<void>;\r\n buildEnd?: (error?: Error) => void | Promise<void>;\r\n}\r\n\r\nexport interface RollupPluginContext {\r\n emitFile: (file: { type: 'asset' | 'chunk'; fileName?: string; source?: string; id?: string }) => string;\r\n warn: (message: string) => void;\r\n error: (message: string) => never;\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightRollupPluginOptions {\r\n /** Include patterns (regex or function) */\r\n include?: RegExp | ((id: string) => boolean);\r\n\r\n /** Exclude patterns (regex or function) */\r\n exclude?: RegExp | ((id: string) => boolean);\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Client manifest filename */\r\n clientManifest?: string;\r\n\r\n /** Server manifest filename */\r\n serverManifest?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC Rollup Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // rollup.config.js\r\n * import { flightRSCRollup } from '@flight-framework/core/rsc/plugins/rollup';\r\n * \r\n * export default {\r\n * input: 'src/index.tsx',\r\n * output: { dir: 'dist', format: 'esm' },\r\n * plugins: [\r\n * flightRSCRollup({\r\n * ssr: true,\r\n * actionsEndpoint: '/_flight/action',\r\n * }),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function flightRSCRollup(options: FlightRollupPluginOptions = {}): RollupPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n clientManifest = '.flight/client-manifest.json',\r\n serverManifest = '.flight/server-manifest.json',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n };\r\n\r\n const shouldInclude = (id: string): boolean => {\r\n if (typeof include === 'function') return include(id);\r\n return include.test(id);\r\n };\r\n\r\n const shouldExclude = (id: string): boolean => {\r\n if (typeof exclude === 'function') return exclude(id);\r\n return exclude.test(id);\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n // ================================================================\r\n // buildStart: Reset state\r\n // ================================================================\r\n buildStart() {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // transform: Analyze and transform modules\r\n // ================================================================\r\n transform(code: string, id: string) {\r\n // Skip non-matching files\r\n if (!shouldInclude(id) || shouldExclude(id)) {\r\n return null;\r\n }\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, id);\r\n const moduleId = createModuleId(id);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.serverActions.length > 0\r\n ? analysis.serverActions\r\n : extractExportNames(code),\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n code: transformClientForSSR(code, moduleId),\r\n map: null,\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n code: transformServerForClient(code, moduleId, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // ================================================================\r\n // generateBundle: Emit manifests\r\n // ================================================================\r\n generateBundle(this: RollupPluginContext) {\r\n // Emit client manifest\r\n if (state.clientModules.size > 0) {\r\n const manifest = Object.fromEntries(state.clientModules);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: clientManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n // Emit server manifest\r\n if (state.serverActions.size > 0) {\r\n const manifest = Object.fromEntries(state.serverActions);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: serverManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // buildEnd: Cleanup\r\n // ================================================================\r\n buildEnd(error?: Error) {\r\n if (error && dev) {\r\n console.error('[Flight RSC Rollup] Build failed:', error.message);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers (Rollup)\r\nconst __flight_inline_endpoint = ${JSON.stringify(endpoint)};\r\nasync function __flight_inline_rpc(actionId, args) {\r\n const response = await fetch(__flight_inline_endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Insert after imports\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform action functions\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n const patterns = [\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n const prefixes = ['/src/', 'src/', 'packages/', '/packages/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCRollup;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/rsc/plugins/rollup.ts"],"names":["exports"],"mappings":"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","file":"chunk-NWMJYTMB.js","sourcesContent":["/**\r\n * @flight-framework/core - Rollup Plugin for RSC\r\n * \r\n * Rollup plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - Rollup is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/rollup\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Rollup Plugin interface (minimal)\r\n * We define our own to avoid requiring rollup as dependency\r\n */\r\nexport interface RollupPlugin {\r\n name: string;\r\n buildStart?: (options: unknown) => void | Promise<void>;\r\n resolveId?: (\r\n source: string,\r\n importer: string | undefined,\r\n options: { isEntry: boolean }\r\n ) => string | null | undefined | { id: string; external?: boolean } | Promise<string | null | undefined | { id: string; external?: boolean }>;\r\n load?: (id: string) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n transform?: (\r\n code: string,\r\n id: string\r\n ) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n generateBundle?: (\r\n options: unknown,\r\n bundle: Record<string, unknown>\r\n ) => void | Promise<void>;\r\n buildEnd?: (error?: Error) => void | Promise<void>;\r\n}\r\n\r\nexport interface RollupPluginContext {\r\n emitFile: (file: { type: 'asset' | 'chunk'; fileName?: string; source?: string; id?: string }) => string;\r\n warn: (message: string) => void;\r\n error: (message: string) => never;\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightRollupPluginOptions {\r\n /** Include patterns (regex or function) */\r\n include?: RegExp | ((id: string) => boolean);\r\n\r\n /** Exclude patterns (regex or function) */\r\n exclude?: RegExp | ((id: string) => boolean);\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Client manifest filename */\r\n clientManifest?: string;\r\n\r\n /** Server manifest filename */\r\n serverManifest?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC Rollup Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // rollup.config.js\r\n * import { flightRSCRollup } from '@flight-framework/core/rsc/plugins/rollup';\r\n * \r\n * export default {\r\n * input: 'src/index.tsx',\r\n * output: { dir: 'dist', format: 'esm' },\r\n * plugins: [\r\n * flightRSCRollup({\r\n * ssr: true,\r\n * actionsEndpoint: '/_flight/action',\r\n * }),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function flightRSCRollup(options: FlightRollupPluginOptions = {}): RollupPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n clientManifest = '.flight/client-manifest.json',\r\n serverManifest = '.flight/server-manifest.json',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n };\r\n\r\n const shouldInclude = (id: string): boolean => {\r\n if (typeof include === 'function') return include(id);\r\n return include.test(id);\r\n };\r\n\r\n const shouldExclude = (id: string): boolean => {\r\n if (typeof exclude === 'function') return exclude(id);\r\n return exclude.test(id);\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n // ================================================================\r\n // buildStart: Reset state\r\n // ================================================================\r\n buildStart() {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // transform: Analyze and transform modules\r\n // ================================================================\r\n transform(code: string, id: string) {\r\n // Skip non-matching files\r\n if (!shouldInclude(id) || shouldExclude(id)) {\r\n return null;\r\n }\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, id);\r\n const moduleId = createModuleId(id);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.serverActions.length > 0\r\n ? analysis.serverActions\r\n : extractExportNames(code),\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n code: transformClientForSSR(code, moduleId),\r\n map: null,\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n code: transformServerForClient(code, moduleId, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // ================================================================\r\n // generateBundle: Emit manifests\r\n // ================================================================\r\n generateBundle(this: RollupPluginContext) {\r\n // Emit client manifest\r\n if (state.clientModules.size > 0) {\r\n const manifest = Object.fromEntries(state.clientModules);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: clientManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n // Emit server manifest\r\n if (state.serverActions.size > 0) {\r\n const manifest = Object.fromEntries(state.serverActions);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: serverManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // buildEnd: Cleanup\r\n // ================================================================\r\n buildEnd(error?: Error) {\r\n if (error && dev) {\r\n console.error('[Flight RSC Rollup] Build failed:', error.message);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers (Rollup)\r\nconst __flight_inline_endpoint = ${JSON.stringify(endpoint)};\r\nasync function __flight_inline_rpc(actionId, args) {\r\n const response = await fetch(__flight_inline_endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Insert after imports\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform action functions\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n const patterns = [\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n const prefixes = ['/src/', 'src/', 'packages/', '/packages/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCRollup;\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createServerChunk, createErrorChunk, toFlightElement, serialize, generateChunkId, createClientChunk } from './chunk-K2CQZPCG.js';
|
|
2
|
-
import { isClientReference } from './chunk-
|
|
2
|
+
import { isClientReference } from './chunk-PDW5WCMW.js';
|
|
3
3
|
|
|
4
4
|
// src/rsc/renderer.ts
|
|
5
5
|
var FlightRenderer = class {
|
|
@@ -180,7 +180,7 @@ var FlightRenderer = class {
|
|
|
180
180
|
/**
|
|
181
181
|
* Render a client boundary
|
|
182
182
|
*/
|
|
183
|
-
async renderClientBoundary(component, name, props,
|
|
183
|
+
async renderClientBoundary(component, name, props, _ctx) {
|
|
184
184
|
const chunkId = generateChunkId("c");
|
|
185
185
|
const moduleId = component.__flight_module ?? name;
|
|
186
186
|
const exportName = component.__flight_export ?? "default";
|
|
@@ -263,7 +263,7 @@ var FlightRenderer = class {
|
|
|
263
263
|
/**
|
|
264
264
|
* Render a Client Reference directly
|
|
265
265
|
*/
|
|
266
|
-
async renderClientReference(ref,
|
|
266
|
+
async renderClientReference(ref, _ctx) {
|
|
267
267
|
const chunkId = generateChunkId("c");
|
|
268
268
|
const clientChunk = createClientChunk(
|
|
269
269
|
chunkId,
|
|
@@ -282,7 +282,7 @@ var FlightRenderer = class {
|
|
|
282
282
|
/**
|
|
283
283
|
* Resolve all pending async chunks
|
|
284
284
|
*/
|
|
285
|
-
async resolvePendingChunks(
|
|
285
|
+
async resolvePendingChunks(_ctx) {
|
|
286
286
|
while (this.pendingPromises.size > 0) {
|
|
287
287
|
const entries = [...this.pendingPromises.entries()];
|
|
288
288
|
for (const [id, promise] of entries) {
|
|
@@ -302,23 +302,15 @@ function createRenderer(adapter, options) {
|
|
|
302
302
|
}
|
|
303
303
|
async function renderServerComponent(component, props, ctx, adapter, options) {
|
|
304
304
|
const renderer = createRenderer(adapter, options);
|
|
305
|
-
const element =
|
|
306
|
-
type: component,
|
|
307
|
-
props,
|
|
308
|
-
$$typeof: /* @__PURE__ */ Symbol.for("react.element")
|
|
309
|
-
};
|
|
305
|
+
const element = adapter.createElement(component, props);
|
|
310
306
|
return renderer.render(element, ctx);
|
|
311
307
|
}
|
|
312
308
|
async function* renderServerComponentStreaming(component, props, ctx, adapter, options) {
|
|
313
309
|
const renderer = createRenderer(adapter, options);
|
|
314
|
-
const element =
|
|
315
|
-
type: component,
|
|
316
|
-
props,
|
|
317
|
-
$$typeof: /* @__PURE__ */ Symbol.for("react.element")
|
|
318
|
-
};
|
|
310
|
+
const element = adapter.createElement(component, props);
|
|
319
311
|
yield* renderer.renderStreaming(element, ctx);
|
|
320
312
|
}
|
|
321
313
|
|
|
322
314
|
export { FlightRenderer, createRenderer, renderServerComponent, renderServerComponentStreaming };
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
315
|
+
//# sourceMappingURL=chunk-P6WSBVDT.js.map
|
|
316
|
+
//# sourceMappingURL=chunk-P6WSBVDT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/renderer.ts"],"names":["children"],"mappings":"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","file":"chunk-P6WSBVDT.js","sourcesContent":["/**\r\n * @flight-framework/core - Server Component Renderer\r\n * \r\n * Renders Server Components to FlightChunks.\r\n * Framework-agnostic rendering engine that works with adapters.\r\n * \r\n * @module @flight-framework/core/rsc/renderer\r\n */\r\n\r\nimport type {\r\n FlightChunk,\r\n FlightElement,\r\n ServerComponentChunk,\r\n ClientReferenceChunk,\r\n} from './payload.js';\r\nimport {\r\n generateChunkId,\r\n createServerChunk,\r\n createClientChunk,\r\n createErrorChunk,\r\n toFlightElement,\r\n serialize,\r\n} from './payload.js';\r\nimport {\r\n isClientReference,\r\n type ClientReference,\r\n} from './boundaries.js';\r\nimport type { ServerContext } from './context.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * UI Framework adapter for rendering\r\n */\r\nexport interface UIAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** Check if value is a framework element */\r\n isElement(value: unknown): boolean;\r\n\r\n /** Get element type info */\r\n getElementType(element: unknown): ElementTypeInfo;\r\n\r\n /** Get element props */\r\n getProps(element: unknown): Record<string, unknown>;\r\n\r\n /** Get element children */\r\n getChildren(element: unknown): unknown[];\r\n\r\n /** Get element key */\r\n getKey(element: unknown): string | number | undefined;\r\n\r\n /** Check if component is a client boundary */\r\n isClientBoundary(component: unknown): boolean;\r\n\r\n /** \r\n * Create a framework-specific element\r\n * This abstracts away React's Symbol.for('react.element'), Vue's VNode, etc.\r\n */\r\n createElement(\r\n component: ComponentFn,\r\n props: Record<string, unknown>\r\n ): unknown;\r\n\r\n /** Render element to HTML string (for SSR fallback) */\r\n renderToString?(element: unknown): Promise<string>;\r\n}\r\n\r\nexport type ElementTypeInfo =\r\n | { kind: 'host'; tag: string }\r\n | { kind: 'component'; fn: ComponentFn; name: string }\r\n | { kind: 'fragment' }\r\n | { kind: 'suspense'; fallback?: unknown }\r\n | { kind: 'provider'; value?: unknown }\r\n | { kind: 'context' }\r\n | { kind: 'text'; value: string }\r\n | { kind: 'null' };\r\n\r\n/**\r\n * Component function type\r\n */\r\nexport type ComponentFn = (\r\n props: Record<string, unknown>,\r\n ctx?: ServerContext\r\n) => unknown | Promise<unknown>;\r\n\r\n/**\r\n * Render options\r\n */\r\nexport interface RenderOptions {\r\n /** Include SSR fallbacks for client components */\r\n includeSSRFallbacks?: boolean;\r\n\r\n /** Error handler */\r\n onError?: (error: Error, componentName?: string) => void;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n\r\n /** Max render depth to prevent infinite loops */\r\n maxDepth?: number;\r\n}\r\n\r\n/**\r\n * Render result with metadata\r\n */\r\nexport interface RenderResult {\r\n /** All chunks generated */\r\n chunks: FlightChunk[];\r\n\r\n /** Root chunk */\r\n root: ServerComponentChunk;\r\n\r\n /** Client references found */\r\n clientRefs: ClientReferenceChunk[];\r\n\r\n /** Timing info */\r\n timing: {\r\n startTime: number;\r\n endTime: number;\r\n duration: number;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Renderer Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight Server Component Renderer\r\n */\r\nexport class FlightRenderer {\r\n private chunks: FlightChunk[] = [];\r\n private clientRefs: ClientReferenceChunk[] = [];\r\n private pendingPromises = new Map<string, Promise<FlightElement>>();\r\n private depth = 0;\r\n\r\n constructor(\r\n private adapter: UIAdapter,\r\n private options: RenderOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Render a component tree to Flight chunks\r\n */\r\n async render(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<RenderResult> {\r\n const startTime = Date.now();\r\n\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render the root element\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n this.chunks.unshift(root);\r\n\r\n // Wait for any pending async boundaries\r\n await this.resolvePendingChunks(ctx);\r\n\r\n const endTime = Date.now();\r\n\r\n return {\r\n chunks: this.chunks,\r\n root,\r\n clientRefs: this.clientRefs,\r\n timing: {\r\n startTime,\r\n endTime,\r\n duration: endTime - startTime,\r\n },\r\n };\r\n } catch (error) {\r\n const errChunk = createErrorChunk('root', error as Error, this.options.dev);\r\n this.chunks.push(errChunk);\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render as async generator (for streaming)\r\n */\r\n async *renderStreaming(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): AsyncGenerator<FlightChunk> {\r\n // Note: startTime available for future timing features\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render root synchronously\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n yield root;\r\n\r\n // Yield pending chunks as they resolve\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n // Race all pending promises\r\n const promises = entries.map(async ([id, promise]) => {\r\n const tree = await promise;\r\n this.pendingPromises.delete(id);\r\n return createServerChunk(id, tree);\r\n });\r\n\r\n // Yield first to complete\r\n const chunk = await Promise.race(promises);\r\n yield chunk;\r\n }\r\n\r\n // Yield all client refs\r\n for (const clientRef of this.clientRefs) {\r\n yield clientRef;\r\n }\r\n\r\n } catch (error) {\r\n yield createErrorChunk('root', error as Error, this.options.dev);\r\n }\r\n }\r\n\r\n /**\r\n * Render an element to FlightElement\r\n */\r\n private async renderElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check depth limit\r\n this.depth++;\r\n if (this.depth > (this.options.maxDepth ?? 100)) {\r\n throw new Error('Maximum render depth exceeded. Check for infinite component loops.');\r\n }\r\n\r\n try {\r\n // Handle null/undefined/boolean\r\n if (element === null || element === undefined || typeof element === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n\r\n // Handle primitives\r\n if (typeof element === 'string') {\r\n return { $$type: 'text', value: element };\r\n }\r\n if (typeof element === 'number') {\r\n return { $$type: 'text', value: String(element) };\r\n }\r\n\r\n // Handle arrays (fragments)\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(\r\n element.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children };\r\n }\r\n\r\n // Handle Client References\r\n if (isClientReference(element)) {\r\n return this.renderClientReference(element, ctx);\r\n }\r\n\r\n // Handle framework elements\r\n if (this.adapter.isElement(element)) {\r\n return this.renderFrameworkElement(element, ctx);\r\n }\r\n\r\n // Unknown - try to convert\r\n return toFlightElement(element);\r\n\r\n } finally {\r\n this.depth--;\r\n }\r\n }\r\n\r\n /**\r\n * Render a framework-specific element\r\n */\r\n private async renderFrameworkElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const typeInfo = this.adapter.getElementType(element);\r\n const props = this.adapter.getProps(element);\r\n const key = this.adapter.getKey(element);\r\n\r\n switch (typeInfo.kind) {\r\n case 'host':\r\n return this.renderHostElement(typeInfo.tag, props, key, ctx);\r\n\r\n case 'component':\r\n return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);\r\n\r\n case 'fragment': {\r\n const children = this.adapter.getChildren(element);\r\n const renderedChildren = await Promise.all(\r\n children.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children: renderedChildren };\r\n }\r\n\r\n case 'suspense': {\r\n return this.renderSuspense(element, typeInfo.fallback, ctx);\r\n }\r\n\r\n case 'text':\r\n return { $$type: 'text', value: typeInfo.value };\r\n\r\n case 'null':\r\n return { $$type: 'null' };\r\n\r\n default:\r\n return { $$type: 'null' };\r\n }\r\n }\r\n\r\n /**\r\n * Render a host element (div, span, etc.)\r\n */\r\n private async renderHostElement(\r\n tag: string,\r\n props: Record<string, unknown>,\r\n key: string | number | undefined,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Extract children\r\n const { children: childrenProp, ...restProps } = props;\r\n\r\n // Serialize props (excluding functions and children)\r\n const serializedProps: Record<string, unknown> = {};\r\n for (const [propKey, value] of Object.entries(restProps)) {\r\n if (typeof value !== 'function') {\r\n serializedProps[propKey] = serialize(value);\r\n }\r\n }\r\n\r\n // Render children\r\n const rawChildren = childrenProp ?\r\n (Array.isArray(childrenProp) ? childrenProp : [childrenProp]) :\r\n [];\r\n\r\n const children = await Promise.all(\r\n rawChildren.map(child => this.renderElement(child, ctx))\r\n );\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n key,\r\n props: serializedProps as Record<string, import('./payload.js').SerializedValue>,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Render a component (server or client)\r\n */\r\n private async renderComponent(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check if this is a client component\r\n if (this.adapter.isClientBoundary(component)) {\r\n return this.renderClientBoundary(component, name, props, ctx);\r\n }\r\n\r\n // Execute server component\r\n try {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n } catch (error) {\r\n // Check for Suspense promise\r\n if (error instanceof Promise) {\r\n return this.renderAsyncBoundary(error, name, props, ctx);\r\n }\r\n\r\n this.options.onError?.(error as Error, name);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render a client boundary\r\n */\r\n private async renderClientBoundary(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n // Get module info from component\r\n const moduleId = (component as unknown as { __flight_module?: string }).__flight_module ?? name;\r\n const exportName = (component as unknown as { __flight_export?: string }).__flight_export ?? 'default';\r\n\r\n // Generate SSR fallback if enabled\r\n let fallback: string | undefined;\r\n if (this.options.includeSSRFallbacks && this.adapter.renderToString) {\r\n try {\r\n // Create element with props for SSR\r\n fallback = await this.adapter.renderToString(props);\r\n } catch {\r\n // SSR failed, continue without fallback\r\n }\r\n }\r\n\r\n // Create client reference chunk\r\n const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n ssr: fallback,\r\n };\r\n }\r\n\r\n /**\r\n * Render a Suspense boundary\r\n */\r\n private async renderSuspense(\r\n element: unknown,\r\n fallbackElement: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const boundaryId = generateChunkId('s');\r\n const children = this.adapter.getChildren(element);\r\n\r\n // Render fallback\r\n const fallback = fallbackElement ?\r\n await this.renderElement(fallbackElement, ctx) :\r\n { $$type: 'null' as const };\r\n\r\n // Render children\r\n const renderedChildren: FlightElement[] = [];\r\n for (const child of children) {\r\n try {\r\n const rendered = await this.renderElement(child, ctx);\r\n renderedChildren.push(rendered);\r\n } catch (error) {\r\n if (error instanceof Promise) {\r\n // This is a suspended promise\r\n this.pendingPromises.set(boundaryId, error.then(async () => {\r\n const children = this.adapter.getChildren(element);\r\n const rendered = await Promise.all(\r\n children.map(c => this.renderElement(c, ctx))\r\n );\r\n return { $$type: 'fragment' as const, children: rendered };\r\n }));\r\n\r\n // Return suspense with fallback for now\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: [{ $$type: 'lazy', id: boundaryId, fallback }],\r\n };\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: renderedChildren,\r\n };\r\n }\r\n\r\n /**\r\n * Render an async boundary (promise thrown from component)\r\n */\r\n private renderAsyncBoundary(\r\n promise: Promise<unknown>,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): FlightElement {\r\n const boundaryId = generateChunkId('a');\r\n\r\n // Track this promise\r\n this.pendingPromises.set(boundaryId,\r\n promise.then(async () => {\r\n // Re-render the component after promise resolves\r\n const component = (props as unknown as { component: ComponentFn }).component;\r\n if (component) {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n }\r\n return { $$type: 'null' as const };\r\n })\r\n );\r\n\r\n return {\r\n $$type: 'lazy',\r\n id: boundaryId,\r\n fallback: { $$type: 'text', value: `Loading ${name}...` },\r\n };\r\n }\r\n\r\n /**\r\n * Render a Client Reference directly\r\n */\r\n private async renderClientReference(\r\n ref: ClientReference,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n const clientChunk = createClientChunk(\r\n chunkId,\r\n ref.__flight_module,\r\n ref.__flight_export,\r\n {} // Props are embedded in the reference\r\n );\r\n\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve all pending async chunks\r\n */\r\n private async resolvePendingChunks(_ctx: ServerContext): Promise<void> {\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n for (const [id, promise] of entries) {\r\n try {\r\n const tree = await promise;\r\n this.chunks.push(createServerChunk(id, tree));\r\n } catch (error) {\r\n this.chunks.push(createErrorChunk(id, error as Error, this.options.dev));\r\n }\r\n this.pendingPromises.delete(id);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a renderer with adapter\r\n */\r\nexport function createRenderer(\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): FlightRenderer {\r\n return new FlightRenderer(adapter, options);\r\n}\r\n\r\n/**\r\n * Render a server component tree\r\n */\r\nexport async function renderServerComponent<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): Promise<RenderResult> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n return renderer.render(element, ctx);\r\n}\r\n\r\nexport async function* renderServerComponentStreaming<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): AsyncGenerator<FlightChunk> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n yield* renderer.renderStreaming(element, ctx);\r\n}\r\n"]}
|
|
@@ -165,7 +165,7 @@ function createClientReference(moduleId, exportName, isAsync = false) {
|
|
|
165
165
|
return reference;
|
|
166
166
|
}
|
|
167
167
|
function createServerReference(actionId, boundArgs) {
|
|
168
|
-
const reference = async function(...
|
|
168
|
+
const reference = async function(..._args) {
|
|
169
169
|
throw new Error(
|
|
170
170
|
`Server Action "${actionId}" was called but no RPC handler is configured. Make sure the Flight bundler plugin is properly configured.`
|
|
171
171
|
);
|
|
@@ -254,5 +254,5 @@ function registerServerAction(id, action) {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
export { BoundaryRegistry, CLIENT_REFERENCE, SERVER_REFERENCE, analyzeModule, createClientReference, createServerReference, detectAsyncComponents, detectBoundaryType, detectInlineServerActions, getReferenceId, globalRegistry, hasUseClientDirective, hasUseServerDirective, isClientReference, isServerReference, registerClientComponent, registerServerAction };
|
|
257
|
-
//# sourceMappingURL=chunk-
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
257
|
+
//# sourceMappingURL=chunk-PDW5WCMW.js.map
|
|
258
|
+
//# sourceMappingURL=chunk-PDW5WCMW.js.map
|