@flight-framework/core 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/{chunk-5KF3QQWZ.js → chunk-3AY23FZP.js} +5 -19
- package/dist/chunk-3AY23FZP.js.map +1 -0
- package/dist/chunk-4F77J5TY.js +324 -0
- package/dist/chunk-4F77J5TY.js.map +1 -0
- package/dist/{chunk-CLMFEKYM.js → chunk-54HPVE7N.js} +67 -2
- package/dist/chunk-54HPVE7N.js.map +1 -0
- package/dist/chunk-5GUCB2CG.js +300 -0
- package/dist/chunk-5GUCB2CG.js.map +1 -0
- package/dist/chunk-62C7LX2E.js +205 -0
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/chunk-63SCEXD7.js +3 -0
- package/dist/chunk-63SCEXD7.js.map +1 -0
- package/dist/chunk-6BDCTUQY.js +282 -0
- package/dist/chunk-6BDCTUQY.js.map +1 -0
- package/dist/chunk-6CD5FIYI.js +252 -0
- package/dist/chunk-6CD5FIYI.js.map +1 -0
- package/dist/chunk-6XZQPPYC.js +285 -0
- package/dist/chunk-6XZQPPYC.js.map +1 -0
- package/dist/chunk-BJIMTO2I.js +213 -0
- package/dist/chunk-BJIMTO2I.js.map +1 -0
- package/dist/chunk-CLZSB5QD.js +258 -0
- package/dist/chunk-CLZSB5QD.js.map +1 -0
- package/dist/chunk-K2CQZPCG.js +257 -0
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-MQQLYWZZ.js +288 -0
- package/dist/chunk-MQQLYWZZ.js.map +1 -0
- package/dist/chunk-MRLCNFSD.js +341 -0
- package/dist/chunk-MRLCNFSD.js.map +1 -0
- package/dist/chunk-PSJPMEQK.js +212 -0
- package/dist/chunk-PSJPMEQK.js.map +1 -0
- package/dist/chunk-Q62ZQ6FM.js +218 -0
- package/dist/chunk-Q62ZQ6FM.js.map +1 -0
- package/dist/{chunk-ABNCAPQB.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/chunk-T3S5YC7L.js +256 -0
- package/dist/chunk-T3S5YC7L.js.map +1 -0
- package/dist/chunk-WFAWAHJH.js +267 -0
- package/dist/chunk-WFAWAHJH.js.map +1 -0
- package/dist/chunk-WOEIJWGJ.js +351 -0
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/chunk-XOIYNY4I.js +164 -0
- package/dist/chunk-XOIYNY4I.js.map +1 -0
- package/dist/chunk-XSY5AAXT.js +125 -0
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/chunk-Y22AMGTM.js +3 -0
- package/dist/chunk-Y22AMGTM.js.map +1 -0
- package/dist/file-router/index.d.ts +9 -0
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.d.ts +129 -0
- package/dist/file-router/streaming-hints.js +3 -0
- package/dist/file-router/streaming-hints.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +23 -5
- package/dist/index.js.map +1 -1
- package/dist/islands/index.d.ts +234 -0
- package/dist/islands/index.js +3 -0
- package/dist/islands/index.js.map +1 -0
- package/dist/rsc/adapters/index.d.ts +8 -0
- package/dist/rsc/adapters/index.js +7 -0
- package/dist/rsc/adapters/index.js.map +1 -0
- package/dist/rsc/adapters/preact.d.ts +97 -0
- package/dist/rsc/adapters/preact.js +3 -0
- package/dist/rsc/adapters/preact.js.map +1 -0
- package/dist/rsc/adapters/react.d.ts +82 -0
- package/dist/rsc/adapters/react.js +3 -0
- package/dist/rsc/adapters/react.js.map +1 -0
- package/dist/rsc/adapters/solid.d.ts +84 -0
- package/dist/rsc/adapters/solid.js +3 -0
- package/dist/rsc/adapters/solid.js.map +1 -0
- package/dist/rsc/adapters/vue.d.ts +80 -0
- package/dist/rsc/adapters/vue.js +3 -0
- package/dist/rsc/adapters/vue.js.map +1 -0
- package/dist/rsc/boundaries.d.ts +182 -0
- package/dist/rsc/boundaries.js +3 -0
- package/dist/rsc/boundaries.js.map +1 -0
- package/dist/rsc/context.d.ts +201 -0
- package/dist/rsc/context.js +3 -0
- package/dist/rsc/context.js.map +1 -0
- package/dist/rsc/index.d.ts +20 -124
- package/dist/rsc/index.js +13 -1
- package/dist/rsc/legacy.d.ts +131 -0
- package/dist/rsc/legacy.js +3 -0
- package/dist/rsc/legacy.js.map +1 -0
- package/dist/rsc/payload.d.ts +262 -0
- package/dist/rsc/payload.js +3 -0
- package/dist/rsc/payload.js.map +1 -0
- package/dist/rsc/plugins/esbuild.d.ts +124 -0
- package/dist/rsc/plugins/esbuild.js +4 -0
- package/dist/rsc/plugins/esbuild.js.map +1 -0
- package/dist/rsc/plugins/index.d.ts +4 -0
- package/dist/rsc/plugins/index.js +6 -0
- package/dist/rsc/plugins/index.js.map +1 -0
- package/dist/rsc/plugins/rollup.d.ts +103 -0
- package/dist/rsc/plugins/rollup.js +4 -0
- package/dist/rsc/plugins/rollup.js.map +1 -0
- package/dist/rsc/renderer.d.ts +160 -0
- package/dist/rsc/renderer.js +5 -0
- package/dist/rsc/renderer.js.map +1 -0
- package/dist/rsc/stream.d.ts +129 -0
- package/dist/rsc/stream.js +3 -0
- package/dist/rsc/stream.js.map +1 -0
- package/dist/rsc/vite-plugin.d.ts +78 -0
- package/dist/rsc/vite-plugin.js +4 -0
- package/dist/rsc/vite-plugin.js.map +1 -0
- package/dist/streaming/adapters/index.d.ts +223 -0
- package/dist/streaming/adapters/index.js +3 -0
- package/dist/streaming/adapters/index.js.map +1 -0
- package/dist/streaming/conditional.d.ts +130 -0
- package/dist/streaming/conditional.js +3 -0
- package/dist/streaming/conditional.js.map +1 -0
- package/dist/streaming/index.d.ts +8 -0
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.d.ts +201 -0
- package/dist/streaming/observability.js +4 -0
- package/dist/streaming/observability.js.map +1 -0
- package/dist/streaming/priority.d.ts +103 -0
- package/dist/streaming/priority.js +3 -0
- package/dist/streaming/priority.js.map +1 -0
- package/package.json +180 -100
- package/dist/chunk-5KF3QQWZ.js.map +0 -1
- package/dist/chunk-ABNCAPQB.js.map +0 -1
- package/dist/chunk-CLMFEKYM.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/file-router/index.ts"],"names":[],"mappings":"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","file":"chunk-54HPVE7N.js","sourcesContent":["/**\r\n * @flight-framework/core - File Router\r\n * \r\n * Auto-discovery of routes from file system.\r\n * Similar to Next.js App Router and Nuxt server/api patterns.\r\n */\r\n\r\nimport { readdir } from 'node:fs/promises';\r\nimport { join, basename, extname } from 'node:path';\r\nimport { pathToFileURL } from 'node:url';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\r\n\r\nexport type Handler = (context: unknown) => Response | Promise<Response>;\r\nexport type Middleware = (context: unknown, next: () => Promise<Response>) => Response | Promise<Response>;\r\n\r\nexport interface FileRoute {\r\n /** HTTP method (GET, POST, etc) or 'ALL' */\r\n method: HttpMethod | 'ALL';\r\n /** Route path with params (e.g., /users/:id) */\r\n path: string;\r\n /** Original file path */\r\n filePath: string;\r\n /** Handler function (for APIs) */\r\n handler?: Handler;\r\n /** Route-specific middleware */\r\n middleware?: Middleware[];\r\n /** Route type: 'page' for SSR pages, 'api' for API endpoints */\r\n type: 'page' | 'api';\r\n /** Component function (for pages) */\r\n component?: () => unknown;\r\n /** Page metadata (title, description, etc) */\r\n meta?: Record<string, unknown>;\r\n /** Parallel route slot name (for @folder convention) */\r\n slot?: string;\r\n /** Intercepting route info (for (.) (..) (...) convention) */\r\n interceptInfo?: {\r\n /** Number of levels to intercept: 1 = same, 2 = parent, 3+ = root */\r\n level: number;\r\n /** Target route segment to intercept */\r\n target: string;\r\n /** Original path that triggers interception */\r\n interceptPath: string;\r\n };\r\n}\r\n\r\nexport interface FileRouterOptions {\r\n /** Root directory to scan (default: src/routes) */\r\n directory: string;\r\n /** File extensions to consider (default: ['.ts', '.js']) */\r\n extensions?: string[];\r\n /** Whether to watch for changes (default: false in prod) */\r\n watch?: boolean;\r\n /** \r\n * Custom module loader for development with Vite.\r\n * Pass vite.ssrLoadModule to load TSX files correctly.\r\n * Falls back to native import() if not provided.\r\n */\r\n moduleLoader?: (filePath: string) => Promise<any>;\r\n}\r\n\r\nexport interface ScanResult {\r\n routes: FileRoute[];\r\n errors: string[];\r\n}\r\n\r\n// ============================================================================\r\n// File Scanner\r\n// ============================================================================\r\n\r\n/**\r\n * Scan a directory for route files\r\n */\r\nexport async function scanRoutes(options: FileRouterOptions): Promise<ScanResult> {\r\n const {\r\n directory,\r\n extensions = ['.ts', '.js'],\r\n } = options;\r\n\r\n const routes: FileRoute[] = [];\r\n const errors: string[] = [];\r\n\r\n async function scanDir(dir: string, basePath: string = ''): Promise<void> {\r\n try {\r\n const entries = await readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n // Skip hidden directories and node_modules\r\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\r\n continue;\r\n }\r\n\r\n // Detect parallel route slots (@folder convention)\r\n if (entry.name.startsWith('@')) {\r\n const slotName = entry.name.slice(1);\r\n // Scan slot directory and mark routes with slot name\r\n const slotRoutes = await scanSlotDir(fullPath, basePath, slotName, extensions);\r\n routes.push(...slotRoutes);\r\n continue;\r\n }\r\n\r\n // Detect intercepting routes ((.) (..) (...) convention)\r\n const interceptMatch = entry.name.match(/^\\((\\.+)\\)(.+)$/);\r\n if (interceptMatch) {\r\n const level = interceptMatch[1].length;\r\n const targetSegment = interceptMatch[2];\r\n // Scan intercept directory and mark routes with interceptInfo\r\n const interceptRoutes = await scanInterceptDir(\r\n fullPath,\r\n basePath,\r\n level,\r\n targetSegment,\r\n extensions\r\n );\r\n routes.push(...interceptRoutes);\r\n continue;\r\n }\r\n\r\n // Recurse into subdirectory\r\n await scanDir(fullPath, `${basePath}/${entry.name}`);\r\n } else if (entry.isFile()) {\r\n const ext = extname(entry.name);\r\n\r\n if (!extensions.includes(ext)) {\r\n continue;\r\n }\r\n\r\n // Parse route from filename\r\n const routeInfo = parseRouteFile(entry.name, basePath);\r\n\r\n if (routeInfo && routeInfo.method && routeInfo.path) {\r\n routes.push({\r\n method: routeInfo.method,\r\n path: routeInfo.path,\r\n filePath: fullPath,\r\n type: routeInfo.type,\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n errors.push(`Failed to scan ${dir}: ${error}`);\r\n }\r\n }\r\n\r\n await scanDir(directory);\r\n\r\n return { routes, errors };\r\n}\r\n\r\n/**\r\n * Scan a parallel route slot directory\r\n */\r\nasync function scanSlotDir(\r\n dir: string,\r\n basePath: string,\r\n slotName: string,\r\n extensions: string[] = ['.ts', '.js', '.tsx', '.jsx']\r\n): Promise<FileRoute[]> {\r\n const routes: FileRoute[] = [];\r\n\r\n try {\r\n const entries = await readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isFile()) {\r\n const ext = extname(entry.name);\r\n\r\n if (!extensions.includes(ext)) {\r\n continue;\r\n }\r\n\r\n const routeInfo = parseRouteFile(entry.name, basePath);\r\n\r\n if (routeInfo && routeInfo.method && routeInfo.path) {\r\n routes.push({\r\n method: routeInfo.method,\r\n path: routeInfo.path,\r\n filePath: fullPath,\r\n type: routeInfo.type,\r\n slot: slotName,\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`[Flight] Failed to scan slot @${slotName}:`, error);\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n/**\r\n * Scan an intercepting route directory\r\n * Uses (.) (..) (...) convention similar to Next.js\r\n * - (.)segment - intercepts from same level\r\n * - (..)segment - intercepts from parent level\r\n * - (...)segment - intercepts from root\r\n */\r\nasync function scanInterceptDir(\r\n dir: string,\r\n basePath: string,\r\n level: number,\r\n targetSegment: string,\r\n extensions: string[] = ['.ts', '.js', '.tsx', '.jsx']\r\n): Promise<FileRoute[]> {\r\n const routes: FileRoute[] = [];\r\n\r\n // Calculate the intercept path based on level\r\n const pathParts = basePath.split('/').filter(Boolean);\r\n let interceptPath: string;\r\n\r\n if (level === 1) {\r\n // (.) - Same level, intercepts sibling route\r\n interceptPath = `${basePath}/${targetSegment}`;\r\n } else if (level === 2) {\r\n // (..) - Parent level\r\n pathParts.pop();\r\n interceptPath = `/${pathParts.join('/')}/${targetSegment}`;\r\n } else {\r\n // (...) - Root level (3 or more dots)\r\n interceptPath = `/${targetSegment}`;\r\n }\r\n\r\n try {\r\n const entries = await readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isFile()) {\r\n const ext = extname(entry.name);\r\n\r\n if (!extensions.includes(ext)) {\r\n continue;\r\n }\r\n\r\n const routeInfo = parseRouteFile(entry.name, basePath);\r\n\r\n if (routeInfo && routeInfo.method && routeInfo.path) {\r\n routes.push({\r\n method: routeInfo.method,\r\n path: routeInfo.path,\r\n filePath: fullPath,\r\n type: routeInfo.type,\r\n interceptInfo: {\r\n level,\r\n target: targetSegment,\r\n interceptPath: interceptPath.replace(/\\/+/g, '/') || '/',\r\n },\r\n });\r\n }\r\n } else if (entry.isDirectory()) {\r\n // Recurse into subdirectories within intercept folder\r\n const subRoutes = await scanInterceptDir(\r\n fullPath,\r\n `${basePath}/${entry.name}`,\r\n level,\r\n targetSegment,\r\n extensions\r\n );\r\n routes.push(...subRoutes);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`[Flight] Failed to scan intercept (${'.'.repeat(level)})${targetSegment}:`, error);\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n// ============================================================================\r\n// Route Parser\r\n// ============================================================================\r\n\r\ninterface ParsedRoute {\r\n method: HttpMethod | 'ALL';\r\n path: string;\r\n type: 'page' | 'api';\r\n}\r\n\r\n/**\r\n * Parse route information from filename and path\r\n * \r\n * Patterns:\r\n * - index.ts → /\r\n * - users.ts → /users\r\n * - users.get.ts → GET /users (API)\r\n * - users.post.ts → POST /users (API)\r\n * - about.page.tsx → GET /about (Page)\r\n * - blog/[slug].page.tsx → GET /blog/:slug (Page)\r\n * - [id].ts → /:id\r\n * - [...slug].ts → /* (catch-all)\r\n * - [[...slug]].ts → /* (optional catch-all)\r\n */\r\nfunction parseRouteFile(filename: string, basePath: string): ParsedRoute | null {\r\n const ext = extname(filename);\r\n const nameWithoutExt = basename(filename, ext);\r\n\r\n // Skip files starting with underscore (private)\r\n if (nameWithoutExt.startsWith('_')) {\r\n return null;\r\n }\r\n\r\n // Detect route type\r\n let type: 'page' | 'api' = 'api';\r\n let routeName = nameWithoutExt;\r\n let method: HttpMethod | 'ALL' = 'ALL';\r\n\r\n // Check for page suffix (e.g., about.page.tsx, index.page.tsx)\r\n const pageMatch = nameWithoutExt.match(/^(.+)?\\.page$/i);\r\n if (pageMatch) {\r\n type = 'page';\r\n method = 'GET'; // Pages are always GET\r\n routeName = pageMatch[1] || 'index';\r\n } else {\r\n // Check for method suffix (e.g., users.get.ts)\r\n const methodMatch = nameWithoutExt.match(/^(.+)\\.(get|post|put|delete|patch|head|options)$/i);\r\n if (methodMatch) {\r\n routeName = methodMatch[1] || nameWithoutExt;\r\n method = (methodMatch[2] || 'ALL').toUpperCase() as HttpMethod;\r\n }\r\n }\r\n\r\n // Also check if file is in /api/ directory\r\n if (basePath.startsWith('/api') || basePath.includes('/api/')) {\r\n type = 'api';\r\n }\r\n\r\n // Build route path\r\n let path = basePath;\r\n\r\n if (routeName !== 'index') {\r\n path = `${basePath}/${convertToRoutePath(routeName)}`;\r\n }\r\n\r\n // Ensure path starts with /\r\n if (!path.startsWith('/')) {\r\n path = '/' + path;\r\n }\r\n\r\n // Remove trailing slash (except for root)\r\n if (path !== '/' && path.endsWith('/')) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n return { method, path, type };\r\n}\r\n\r\n/**\r\n * Convert filename segment to route path segment\r\n * \r\n * - [id] → :id\r\n * - [...slug] → *\r\n * - [[...slug]] → *?\r\n */\r\nfunction convertToRoutePath(name: string): string {\r\n // Optional catch-all: [[...slug]]\r\n if (name.startsWith('[[...') && name.endsWith(']]')) {\r\n const paramName = name.slice(5, -2);\r\n return `:${paramName}*`;\r\n }\r\n\r\n // Catch-all: [...slug]\r\n if (name.startsWith('[...') && name.endsWith(']')) {\r\n const paramName = name.slice(4, -1);\r\n return `:${paramName}+`;\r\n }\r\n\r\n // Dynamic param: [id]\r\n if (name.startsWith('[') && name.endsWith(']')) {\r\n const paramName = name.slice(1, -1);\r\n return `:${paramName}`;\r\n }\r\n\r\n return name;\r\n}\r\n\r\n// ============================================================================\r\n// Route Loader\r\n// ============================================================================\r\n\r\n/**\r\n * Load routes with their handlers or components\r\n * @param scanResult - Result from scanRoutes\r\n * @param moduleLoader - Optional custom loader (use vite.ssrLoadModule for dev)\r\n */\r\nexport async function loadRoutes(\r\n scanResult: ScanResult,\r\n moduleLoader?: (filePath: string) => Promise<any>\r\n): Promise<FileRoute[]> {\r\n const loadedRoutes: FileRoute[] = [];\r\n\r\n for (const route of scanResult.routes) {\r\n try {\r\n // Use custom loader if provided (Vite ssrLoadModule for TSX)\r\n // Otherwise fall back to native import() for production\r\n let module: any;\r\n if (moduleLoader) {\r\n module = await moduleLoader(route.filePath);\r\n } else {\r\n // Convert to file:// URL for Windows ESM compatibility\r\n const fileUrl = pathToFileURL(route.filePath).href;\r\n module = await import(fileUrl);\r\n }\r\n\r\n // Handle PAGE routes\r\n if (route.type === 'page') {\r\n // Pages export default component\r\n const component = module.default;\r\n const meta = module.meta || module.metadata || {};\r\n\r\n if (component) {\r\n loadedRoutes.push({\r\n ...route,\r\n component,\r\n meta,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n // Handle API routes\r\n if (route.method === 'ALL') {\r\n // Look for named exports: GET, POST, PUT, DELETE, etc\r\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];\r\n\r\n for (const method of methods) {\r\n if (typeof module[method] === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n method,\r\n handler: module[method],\r\n });\r\n }\r\n }\r\n\r\n // Also check for default export as handler\r\n if (typeof module.default === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n method: 'ALL',\r\n handler: module.default,\r\n });\r\n }\r\n } else {\r\n // Specific method from filename suffix\r\n const handler = module[route.method] || module.default;\r\n\r\n if (typeof handler === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n handler,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`[Flight] Failed to load route ${route.filePath}:`, error);\r\n }\r\n }\r\n\r\n return loadedRoutes;\r\n}\r\n\r\n// ============================================================================\r\n// File Router Factory\r\n// ============================================================================\r\n\r\nexport interface FileRouter {\r\n routes: FileRoute[];\r\n refresh: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Create a file-based router\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createFileRouter } from '@flight-framework/core/file-router';\r\n * import { createServer } from '@flight-framework/http';\r\n * \r\n * const router = await createFileRouter({ directory: './src/routes' });\r\n * const app = createServer();\r\n * \r\n * // Register all discovered routes\r\n * for (const route of router.routes) {\r\n * app[route.method.toLowerCase()](route.path, route.handler);\r\n * }\r\n * ```\r\n */\r\nexport async function createFileRouter(options: FileRouterOptions): Promise<FileRouter> {\r\n let routes: FileRoute[] = [];\r\n const { moduleLoader } = options;\r\n\r\n async function refresh(): Promise<void> {\r\n const scanResult = await scanRoutes(options);\r\n\r\n if (scanResult.errors.length > 0) {\r\n console.warn('[Flight] Route scan errors:', scanResult.errors);\r\n }\r\n\r\n routes = await loadRoutes(scanResult, moduleLoader);\r\n\r\n console.log(`[Flight] Loaded ${routes.length} routes from ${options.directory}`);\r\n }\r\n\r\n // Initial load\r\n await refresh();\r\n\r\n return {\r\n get routes() {\r\n return routes;\r\n },\r\n refresh,\r\n };\r\n}\r\n"]}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-CLZSB5QD.js';
|
|
2
|
+
|
|
3
|
+
// src/rsc/plugins/rollup.ts
|
|
4
|
+
function flightRSCRollup(options = {}) {
|
|
5
|
+
const {
|
|
6
|
+
include = /\.(tsx?|jsx?)$/,
|
|
7
|
+
exclude = /node_modules/,
|
|
8
|
+
actionsEndpoint = "/_flight/action",
|
|
9
|
+
clientManifest = ".flight/client-manifest.json",
|
|
10
|
+
serverManifest = ".flight/server-manifest.json",
|
|
11
|
+
ssr = false,
|
|
12
|
+
dev = false
|
|
13
|
+
} = options;
|
|
14
|
+
const state = {
|
|
15
|
+
clientModules: /* @__PURE__ */ new Map(),
|
|
16
|
+
serverActions: /* @__PURE__ */ new Map()
|
|
17
|
+
};
|
|
18
|
+
const shouldInclude = (id) => {
|
|
19
|
+
if (typeof include === "function") return include(id);
|
|
20
|
+
return include.test(id);
|
|
21
|
+
};
|
|
22
|
+
const shouldExclude = (id) => {
|
|
23
|
+
if (typeof exclude === "function") return exclude(id);
|
|
24
|
+
return exclude.test(id);
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
name: "flight-rsc",
|
|
28
|
+
// ================================================================
|
|
29
|
+
// buildStart: Reset state
|
|
30
|
+
// ================================================================
|
|
31
|
+
buildStart() {
|
|
32
|
+
state.clientModules.clear();
|
|
33
|
+
state.serverActions.clear();
|
|
34
|
+
if (dev) {
|
|
35
|
+
console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
// ================================================================
|
|
39
|
+
// transform: Analyze and transform modules
|
|
40
|
+
// ================================================================
|
|
41
|
+
transform(code, id) {
|
|
42
|
+
if (!shouldInclude(id) || shouldExclude(id)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const analysis = analyzeModule(code, id);
|
|
46
|
+
const moduleId = createModuleId(id);
|
|
47
|
+
if (analysis.fileDirective === "client") {
|
|
48
|
+
state.clientModules.set(id, {
|
|
49
|
+
id: moduleId,
|
|
50
|
+
file: id,
|
|
51
|
+
exports: analysis.clientComponents
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (analysis.fileDirective === "server" || analysis.serverActions.length > 0) {
|
|
55
|
+
state.serverActions.set(id, {
|
|
56
|
+
id: moduleId,
|
|
57
|
+
file: id,
|
|
58
|
+
exports: analysis.serverActions.length > 0 ? analysis.serverActions : extractExportNames(code)
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (ssr) {
|
|
62
|
+
if (hasUseClientDirective(code)) {
|
|
63
|
+
return {
|
|
64
|
+
code: transformClientForSSR(code, moduleId),
|
|
65
|
+
map: null
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
if (hasUseServerDirective(code)) {
|
|
70
|
+
return {
|
|
71
|
+
code: transformServerForClient(code, moduleId, actionsEndpoint),
|
|
72
|
+
map: null
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const inlineActions = detectInlineServerActions(code);
|
|
76
|
+
if (inlineActions.length > 0) {
|
|
77
|
+
return {
|
|
78
|
+
code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),
|
|
79
|
+
map: null
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
},
|
|
85
|
+
// ================================================================
|
|
86
|
+
// generateBundle: Emit manifests
|
|
87
|
+
// ================================================================
|
|
88
|
+
generateBundle() {
|
|
89
|
+
if (state.clientModules.size > 0) {
|
|
90
|
+
const manifest = Object.fromEntries(state.clientModules);
|
|
91
|
+
this.emitFile({
|
|
92
|
+
type: "asset",
|
|
93
|
+
fileName: clientManifest,
|
|
94
|
+
source: JSON.stringify(manifest, null, 2)
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (state.serverActions.size > 0) {
|
|
98
|
+
const manifest = Object.fromEntries(state.serverActions);
|
|
99
|
+
this.emitFile({
|
|
100
|
+
type: "asset",
|
|
101
|
+
fileName: serverManifest,
|
|
102
|
+
source: JSON.stringify(manifest, null, 2)
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (dev) {
|
|
106
|
+
console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);
|
|
107
|
+
console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
// ================================================================
|
|
111
|
+
// buildEnd: Cleanup
|
|
112
|
+
// ================================================================
|
|
113
|
+
buildEnd(error) {
|
|
114
|
+
if (error && dev) {
|
|
115
|
+
console.error("[Flight RSC Rollup] Build failed:", error.message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function transformClientForSSR(code, moduleId) {
|
|
121
|
+
const exports$1 = extractExportNames(code);
|
|
122
|
+
let transformed = `
|
|
123
|
+
// Flight RSC: Client Component Reference (Rollup)
|
|
124
|
+
// Original module: ${moduleId}
|
|
125
|
+
|
|
126
|
+
const __flight_module_id = ${JSON.stringify(moduleId)};
|
|
127
|
+
|
|
128
|
+
`;
|
|
129
|
+
for (const exportName of exports$1) {
|
|
130
|
+
if (exportName === "default") {
|
|
131
|
+
transformed += `
|
|
132
|
+
const __flight_default = Object.assign(
|
|
133
|
+
function() {
|
|
134
|
+
throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
$$typeof: Symbol.for('flight.client.reference'),
|
|
138
|
+
$$id: __flight_module_id + '#default',
|
|
139
|
+
$$async: false,
|
|
140
|
+
__flight_client: true,
|
|
141
|
+
__flight_module: __flight_module_id,
|
|
142
|
+
__flight_export: 'default',
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
export default __flight_default;
|
|
146
|
+
`;
|
|
147
|
+
} else {
|
|
148
|
+
transformed += `
|
|
149
|
+
export const ${exportName} = Object.assign(
|
|
150
|
+
function() {
|
|
151
|
+
throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
$$typeof: Symbol.for('flight.client.reference'),
|
|
155
|
+
$$id: __flight_module_id + '#${exportName}',
|
|
156
|
+
$$async: false,
|
|
157
|
+
__flight_client: true,
|
|
158
|
+
__flight_module: __flight_module_id,
|
|
159
|
+
__flight_export: '${exportName}',
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return transformed;
|
|
166
|
+
}
|
|
167
|
+
function transformServerForClient(code, moduleId, endpoint) {
|
|
168
|
+
const exports$1 = extractExportNames(code);
|
|
169
|
+
let transformed = `
|
|
170
|
+
// Flight RSC: Server Actions RPC Proxies (Rollup)
|
|
171
|
+
// Original module: ${moduleId}
|
|
172
|
+
|
|
173
|
+
const __flight_endpoint = ${JSON.stringify(endpoint)};
|
|
174
|
+
const __flight_module_id = ${JSON.stringify(moduleId)};
|
|
175
|
+
|
|
176
|
+
async function __flight_rpc(actionId, args) {
|
|
177
|
+
const response = await fetch(__flight_endpoint, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
'X-Flight-Action': actionId,
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({ actionId, args }),
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
const error = await response.json().catch(() => ({ message: 'Server action failed' }));
|
|
188
|
+
throw new Error(error.message || 'Server action failed');
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return response.json();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
`;
|
|
195
|
+
for (const exportName of exports$1) {
|
|
196
|
+
const actionId = `${moduleId}#${exportName}`;
|
|
197
|
+
if (exportName === "default") {
|
|
198
|
+
transformed += `
|
|
199
|
+
export default async function(...args) {
|
|
200
|
+
return __flight_rpc(${JSON.stringify(actionId)}, args);
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
} else {
|
|
204
|
+
transformed += `
|
|
205
|
+
export async function ${exportName}(...args) {
|
|
206
|
+
return __flight_rpc(${JSON.stringify(actionId)}, args);
|
|
207
|
+
}
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return transformed;
|
|
212
|
+
}
|
|
213
|
+
function transformInlineActions(code, moduleId, actions, endpoint) {
|
|
214
|
+
let transformed = code;
|
|
215
|
+
const rpcHelper = `
|
|
216
|
+
// Flight RSC: Inline Server Action Helpers (Rollup)
|
|
217
|
+
const __flight_inline_endpoint = ${JSON.stringify(endpoint)};
|
|
218
|
+
async function __flight_inline_rpc(actionId, args) {
|
|
219
|
+
const response = await fetch(__flight_inline_endpoint, {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },
|
|
222
|
+
body: JSON.stringify({ actionId, args }),
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) throw new Error('Server action failed');
|
|
225
|
+
return response.json();
|
|
226
|
+
}
|
|
227
|
+
`;
|
|
228
|
+
const lastImportMatch = code.match(/^import\s.+$/gm);
|
|
229
|
+
if (lastImportMatch) {
|
|
230
|
+
const lastImport = lastImportMatch[lastImportMatch.length - 1] || "";
|
|
231
|
+
const insertPos = code.indexOf(lastImport) + lastImport.length;
|
|
232
|
+
transformed = code.slice(0, insertPos) + "\n" + rpcHelper + code.slice(insertPos);
|
|
233
|
+
} else {
|
|
234
|
+
transformed = rpcHelper + code;
|
|
235
|
+
}
|
|
236
|
+
for (const actionName of actions) {
|
|
237
|
+
const actionId = `${moduleId}#${actionName}`;
|
|
238
|
+
const patterns = [
|
|
239
|
+
new RegExp(
|
|
240
|
+
`async\\s+function\\s+${actionName}\\s*\\([^)]*\\)\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
|
|
241
|
+
"g"
|
|
242
|
+
),
|
|
243
|
+
new RegExp(
|
|
244
|
+
`const\\s+${actionName}\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
|
|
245
|
+
"g"
|
|
246
|
+
)
|
|
247
|
+
];
|
|
248
|
+
for (const pattern of patterns) {
|
|
249
|
+
transformed = transformed.replace(
|
|
250
|
+
pattern,
|
|
251
|
+
`async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return transformed;
|
|
256
|
+
}
|
|
257
|
+
function createModuleId(filePath) {
|
|
258
|
+
let id = filePath.replace(/\\/g, "/");
|
|
259
|
+
const prefixes = ["/src/", "src/", "packages/", "/packages/"];
|
|
260
|
+
for (const prefix of prefixes) {
|
|
261
|
+
const idx = id.indexOf(prefix);
|
|
262
|
+
if (idx !== -1) {
|
|
263
|
+
id = id.slice(idx);
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!id.startsWith("/")) {
|
|
268
|
+
id = "/" + id;
|
|
269
|
+
}
|
|
270
|
+
return id;
|
|
271
|
+
}
|
|
272
|
+
function extractExportNames(code) {
|
|
273
|
+
const exports$1 = [];
|
|
274
|
+
if (/export\s+default\s+/.test(code)) {
|
|
275
|
+
exports$1.push("default");
|
|
276
|
+
}
|
|
277
|
+
const namedPattern = /export\s+(?:async\s+)?(?:function|const|let|var|class)\s+(\w+)/g;
|
|
278
|
+
let match;
|
|
279
|
+
while ((match = namedPattern.exec(code)) !== null) {
|
|
280
|
+
if (match[1] && match[1] !== "default") {
|
|
281
|
+
exports$1.push(match[1]);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const bracketPattern = /export\s*\{\s*([^}]+)\s*\}/g;
|
|
285
|
+
while ((match = bracketPattern.exec(code)) !== null) {
|
|
286
|
+
if (match[1]) {
|
|
287
|
+
const names = match[1].split(",").map((n) => {
|
|
288
|
+
const parts = n.trim().split(/\s+as\s+/);
|
|
289
|
+
return parts[parts.length - 1]?.trim() || "";
|
|
290
|
+
});
|
|
291
|
+
exports$1.push(...names.filter((n) => n && n !== "default"));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return [...new Set(exports$1)];
|
|
295
|
+
}
|
|
296
|
+
var rollup_default = flightRSCRollup;
|
|
297
|
+
|
|
298
|
+
export { flightRSCRollup, rollup_default };
|
|
299
|
+
//# sourceMappingURL=chunk-5GUCB2CG.js.map
|
|
300
|
+
//# sourceMappingURL=chunk-5GUCB2CG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/plugins/rollup.ts"],"names":["exports"],"mappings":"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","file":"chunk-5GUCB2CG.js","sourcesContent":["/**\r\n * @flight-framework/core - Rollup Plugin for RSC\r\n * \r\n * Rollup plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - Rollup is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/rollup\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Rollup Plugin interface (minimal)\r\n * We define our own to avoid requiring rollup as dependency\r\n */\r\nexport interface RollupPlugin {\r\n name: string;\r\n buildStart?: (options: unknown) => void | Promise<void>;\r\n resolveId?: (\r\n source: string,\r\n importer: string | undefined,\r\n options: { isEntry: boolean }\r\n ) => string | null | undefined | { id: string; external?: boolean } | Promise<string | null | undefined | { id: string; external?: boolean }>;\r\n load?: (id: string) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n transform?: (\r\n code: string,\r\n id: string\r\n ) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n generateBundle?: (\r\n options: unknown,\r\n bundle: Record<string, unknown>\r\n ) => void | Promise<void>;\r\n buildEnd?: (error?: Error) => void | Promise<void>;\r\n}\r\n\r\nexport interface RollupPluginContext {\r\n emitFile: (file: { type: 'asset' | 'chunk'; fileName?: string; source?: string; id?: string }) => string;\r\n warn: (message: string) => void;\r\n error: (message: string) => never;\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightRollupPluginOptions {\r\n /** Include patterns (regex or function) */\r\n include?: RegExp | ((id: string) => boolean);\r\n\r\n /** Exclude patterns (regex or function) */\r\n exclude?: RegExp | ((id: string) => boolean);\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Client manifest filename */\r\n clientManifest?: string;\r\n\r\n /** Server manifest filename */\r\n serverManifest?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC Rollup Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // rollup.config.js\r\n * import { flightRSCRollup } from '@flight-framework/core/rsc/plugins/rollup';\r\n * \r\n * export default {\r\n * input: 'src/index.tsx',\r\n * output: { dir: 'dist', format: 'esm' },\r\n * plugins: [\r\n * flightRSCRollup({\r\n * ssr: true,\r\n * actionsEndpoint: '/_flight/action',\r\n * }),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function flightRSCRollup(options: FlightRollupPluginOptions = {}): RollupPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n clientManifest = '.flight/client-manifest.json',\r\n serverManifest = '.flight/server-manifest.json',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n };\r\n\r\n const shouldInclude = (id: string): boolean => {\r\n if (typeof include === 'function') return include(id);\r\n return include.test(id);\r\n };\r\n\r\n const shouldExclude = (id: string): boolean => {\r\n if (typeof exclude === 'function') return exclude(id);\r\n return exclude.test(id);\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n // ================================================================\r\n // buildStart: Reset state\r\n // ================================================================\r\n buildStart() {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // transform: Analyze and transform modules\r\n // ================================================================\r\n transform(code: string, id: string) {\r\n // Skip non-matching files\r\n if (!shouldInclude(id) || shouldExclude(id)) {\r\n return null;\r\n }\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, id);\r\n const moduleId = createModuleId(id);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.serverActions.length > 0\r\n ? analysis.serverActions\r\n : extractExportNames(code),\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n code: transformClientForSSR(code, moduleId),\r\n map: null,\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n code: transformServerForClient(code, moduleId, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // ================================================================\r\n // generateBundle: Emit manifests\r\n // ================================================================\r\n generateBundle(this: RollupPluginContext) {\r\n // Emit client manifest\r\n if (state.clientModules.size > 0) {\r\n const manifest = Object.fromEntries(state.clientModules);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: clientManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n // Emit server manifest\r\n if (state.serverActions.size > 0) {\r\n const manifest = Object.fromEntries(state.serverActions);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: serverManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // buildEnd: Cleanup\r\n // ================================================================\r\n buildEnd(error?: Error) {\r\n if (error && dev) {\r\n console.error('[Flight RSC Rollup] Build failed:', error.message);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers (Rollup)\r\nconst __flight_inline_endpoint = ${JSON.stringify(endpoint)};\r\nasync function __flight_inline_rpc(actionId, args) {\r\n const response = await fetch(__flight_inline_endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Insert after imports\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform action functions\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n const patterns = [\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n const prefixes = ['/src/', 'src/', 'packages/', '/packages/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCRollup;\r\n"]}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// src/rsc/context.ts
|
|
2
|
+
function createServerContext(request, options = {}) {
|
|
3
|
+
const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;
|
|
4
|
+
const url = new URL(request.url);
|
|
5
|
+
let parsedCookies = null;
|
|
6
|
+
const parseCookies = () => {
|
|
7
|
+
if (parsedCookies !== null) return parsedCookies;
|
|
8
|
+
parsedCookies = {};
|
|
9
|
+
const cookieHeader = request.headers.get("cookie");
|
|
10
|
+
if (cookieHeader) {
|
|
11
|
+
for (const cookie of cookieHeader.split(";")) {
|
|
12
|
+
const trimmed = cookie.trim();
|
|
13
|
+
const eqIndex = trimmed.indexOf("=");
|
|
14
|
+
if (eqIndex > 0) {
|
|
15
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
16
|
+
const value = trimmed.slice(eqIndex + 1).trim();
|
|
17
|
+
try {
|
|
18
|
+
parsedCookies[key] = decodeURIComponent(value);
|
|
19
|
+
} catch {
|
|
20
|
+
parsedCookies[key] = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return parsedCookies;
|
|
26
|
+
};
|
|
27
|
+
const cookies = {
|
|
28
|
+
get(name) {
|
|
29
|
+
return parseCookies()[name];
|
|
30
|
+
},
|
|
31
|
+
getAll() {
|
|
32
|
+
return Object.freeze({ ...parseCookies() });
|
|
33
|
+
},
|
|
34
|
+
has(name) {
|
|
35
|
+
return name in parseCookies();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const contextExtensions = {
|
|
39
|
+
get(key) {
|
|
40
|
+
return extensions[key];
|
|
41
|
+
},
|
|
42
|
+
has(key) {
|
|
43
|
+
return key in extensions;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const responseHeaders = new Headers(initHeaders);
|
|
47
|
+
return Object.freeze({
|
|
48
|
+
request,
|
|
49
|
+
params: Object.freeze({ ...params }),
|
|
50
|
+
searchParams: url.searchParams,
|
|
51
|
+
headers: request.headers,
|
|
52
|
+
cookies,
|
|
53
|
+
responseHeaders,
|
|
54
|
+
signal: request.signal,
|
|
55
|
+
url,
|
|
56
|
+
method: request.method,
|
|
57
|
+
extensions: contextExtensions
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function getHeader(ctx, name) {
|
|
61
|
+
return ctx.headers.get(name);
|
|
62
|
+
}
|
|
63
|
+
function getHeaders(ctx) {
|
|
64
|
+
const headers = {};
|
|
65
|
+
ctx.headers.forEach((value, key) => {
|
|
66
|
+
headers[key] = value;
|
|
67
|
+
});
|
|
68
|
+
return headers;
|
|
69
|
+
}
|
|
70
|
+
function isMutationRequest(ctx) {
|
|
71
|
+
return ["POST", "PUT", "PATCH", "DELETE"].includes(ctx.method);
|
|
72
|
+
}
|
|
73
|
+
function acceptsJson(ctx) {
|
|
74
|
+
const accept = ctx.headers.get("accept") || "";
|
|
75
|
+
return accept.includes("application/json") || accept.includes("*/*");
|
|
76
|
+
}
|
|
77
|
+
function isAjaxRequest(ctx) {
|
|
78
|
+
return ctx.headers.get("x-requested-with")?.toLowerCase() === "xmlhttprequest" || ctx.headers.has("x-flight-action");
|
|
79
|
+
}
|
|
80
|
+
function isBotRequest(ctx) {
|
|
81
|
+
const ua = ctx.headers.get("user-agent")?.toLowerCase() || "";
|
|
82
|
+
const botPatterns = [
|
|
83
|
+
"bot",
|
|
84
|
+
"crawler",
|
|
85
|
+
"spider",
|
|
86
|
+
"scraper",
|
|
87
|
+
"googlebot",
|
|
88
|
+
"bingbot",
|
|
89
|
+
"yandexbot",
|
|
90
|
+
"duckduckbot",
|
|
91
|
+
"slurp",
|
|
92
|
+
"baiduspider",
|
|
93
|
+
"facebookexternalhit",
|
|
94
|
+
"twitterbot",
|
|
95
|
+
"linkedinbot",
|
|
96
|
+
"embedly",
|
|
97
|
+
"quora",
|
|
98
|
+
"outbrain",
|
|
99
|
+
"pinterest",
|
|
100
|
+
"slack",
|
|
101
|
+
"vkshare",
|
|
102
|
+
"w3c_validator",
|
|
103
|
+
"lighthouse",
|
|
104
|
+
"pagespeed"
|
|
105
|
+
];
|
|
106
|
+
return botPatterns.some((pattern) => ua.includes(pattern));
|
|
107
|
+
}
|
|
108
|
+
function supportsStreaming(ctx) {
|
|
109
|
+
const noStream = ctx.searchParams.get("_nostream");
|
|
110
|
+
if (noStream === "1" || noStream === "true") return false;
|
|
111
|
+
if (isBotRequest(ctx)) return false;
|
|
112
|
+
const connection = ctx.headers.get("downlink") || ctx.headers.get("ect");
|
|
113
|
+
if (connection === "slow-2g" || connection === "2g") return false;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
function getPreferredLanguage(ctx, available) {
|
|
117
|
+
const acceptLang = ctx.headers.get("accept-language");
|
|
118
|
+
if (!acceptLang) return available[0];
|
|
119
|
+
const languages = acceptLang.split(",").map((lang) => {
|
|
120
|
+
const [code, q = "q=1"] = lang.trim().split(";");
|
|
121
|
+
const quality = parseFloat(q.replace("q=", "")) || 1;
|
|
122
|
+
return { code: code.trim().toLowerCase(), quality };
|
|
123
|
+
}).sort((a, b) => b.quality - a.quality);
|
|
124
|
+
for (const { code } of languages) {
|
|
125
|
+
const exact = available.find((a) => a.toLowerCase() === code);
|
|
126
|
+
if (exact) return exact;
|
|
127
|
+
const baseCode = code.split("-")[0];
|
|
128
|
+
const partial = available.find((a) => a.toLowerCase().startsWith(baseCode));
|
|
129
|
+
if (partial) return partial;
|
|
130
|
+
}
|
|
131
|
+
return available[0];
|
|
132
|
+
}
|
|
133
|
+
function setCookie(ctx, name, value, options = {}) {
|
|
134
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
|
|
135
|
+
if (options.maxAge !== void 0) {
|
|
136
|
+
parts.push(`Max-Age=${options.maxAge}`);
|
|
137
|
+
}
|
|
138
|
+
if (options.expires) {
|
|
139
|
+
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
140
|
+
}
|
|
141
|
+
if (options.path) {
|
|
142
|
+
parts.push(`Path=${options.path}`);
|
|
143
|
+
}
|
|
144
|
+
if (options.domain) {
|
|
145
|
+
parts.push(`Domain=${options.domain}`);
|
|
146
|
+
}
|
|
147
|
+
if (options.secure) {
|
|
148
|
+
parts.push("Secure");
|
|
149
|
+
}
|
|
150
|
+
if (options.httpOnly) {
|
|
151
|
+
parts.push("HttpOnly");
|
|
152
|
+
}
|
|
153
|
+
if (options.sameSite) {
|
|
154
|
+
parts.push(`SameSite=${options.sameSite}`);
|
|
155
|
+
}
|
|
156
|
+
ctx.responseHeaders.append("Set-Cookie", parts.join("; "));
|
|
157
|
+
}
|
|
158
|
+
function deleteCookie(ctx, name, options = {}) {
|
|
159
|
+
setCookie(ctx, name, "", {
|
|
160
|
+
...options,
|
|
161
|
+
maxAge: 0,
|
|
162
|
+
expires: /* @__PURE__ */ new Date(0)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function setCacheControl(ctx, options) {
|
|
166
|
+
const parts = [];
|
|
167
|
+
if (options.public) parts.push("public");
|
|
168
|
+
if (options.private) parts.push("private");
|
|
169
|
+
if (options.noCache) parts.push("no-cache");
|
|
170
|
+
if (options.noStore) parts.push("no-store");
|
|
171
|
+
if (options.maxAge !== void 0) parts.push(`max-age=${options.maxAge}`);
|
|
172
|
+
if (options.sMaxAge !== void 0) parts.push(`s-maxage=${options.sMaxAge}`);
|
|
173
|
+
if (options.staleWhileRevalidate !== void 0) {
|
|
174
|
+
parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);
|
|
175
|
+
}
|
|
176
|
+
if (options.staleIfError !== void 0) {
|
|
177
|
+
parts.push(`stale-if-error=${options.staleIfError}`);
|
|
178
|
+
}
|
|
179
|
+
if (options.mustRevalidate) parts.push("must-revalidate");
|
|
180
|
+
if (options.immutable) parts.push("immutable");
|
|
181
|
+
ctx.responseHeaders.set("Cache-Control", parts.join(", "));
|
|
182
|
+
}
|
|
183
|
+
function notFound(message = "Not Found") {
|
|
184
|
+
const error = new Error(message);
|
|
185
|
+
error.__flight_not_found = true;
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
function isNotFoundError(error) {
|
|
189
|
+
return error instanceof Error && "__flight_not_found" in error;
|
|
190
|
+
}
|
|
191
|
+
function redirect(url, status = 307) {
|
|
192
|
+
const error = new Error(`Redirect: ${url}`);
|
|
193
|
+
error.__flight_redirect = { url, status };
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
function isRedirectError(error) {
|
|
197
|
+
return error instanceof Error && "__flight_redirect" in error;
|
|
198
|
+
}
|
|
199
|
+
function getRedirectInfo(error) {
|
|
200
|
+
return error.__flight_redirect;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { acceptsJson, createServerContext, deleteCookie, getHeader, getHeaders, getPreferredLanguage, getRedirectInfo, isAjaxRequest, isBotRequest, isMutationRequest, isNotFoundError, isRedirectError, notFound, redirect, setCacheControl, setCookie, supportsStreaming };
|
|
204
|
+
//# sourceMappingURL=chunk-62C7LX2E.js.map
|
|
205
|
+
//# sourceMappingURL=chunk-62C7LX2E.js.map
|