@flightdev/core 0.6.7
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/README.md +541 -0
- package/dist/actions/index.d.ts +743 -0
- package/dist/actions/index.js +3 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/adapters/index.d.ts +502 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cache/index.d.ts +191 -0
- package/dist/cache/index.js +3 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/chunk-62HISNA3.js +354 -0
- package/dist/chunk-62HISNA3.js.map +1 -0
- package/dist/chunk-63LWTEDQ.js +341 -0
- package/dist/chunk-63LWTEDQ.js.map +1 -0
- package/dist/chunk-63SCEXD7.js +3 -0
- package/dist/chunk-63SCEXD7.js.map +1 -0
- package/dist/chunk-72MYOTUB.js +667 -0
- package/dist/chunk-72MYOTUB.js.map +1 -0
- package/dist/chunk-7CNW24MQ.js +257 -0
- package/dist/chunk-7CNW24MQ.js.map +1 -0
- package/dist/chunk-7WIEAUJT.js +300 -0
- package/dist/chunk-7WIEAUJT.js.map +1 -0
- package/dist/chunk-7ZZF4ULK.js +259 -0
- package/dist/chunk-7ZZF4ULK.js.map +1 -0
- package/dist/chunk-AE3JTS73.js +222 -0
- package/dist/chunk-AE3JTS73.js.map +1 -0
- package/dist/chunk-AP5NLUSB.js +258 -0
- package/dist/chunk-AP5NLUSB.js.map +1 -0
- package/dist/chunk-C37YQQI7.js +221 -0
- package/dist/chunk-C37YQQI7.js.map +1 -0
- package/dist/chunk-DCLVXFVH.js +225 -0
- package/dist/chunk-DCLVXFVH.js.map +1 -0
- package/dist/chunk-DZMWWDFD.js +223 -0
- package/dist/chunk-DZMWWDFD.js.map +1 -0
- package/dist/chunk-GCQZ4FHI.js +245 -0
- package/dist/chunk-GCQZ4FHI.js.map +1 -0
- package/dist/chunk-IPP44XY6.js +47 -0
- package/dist/chunk-IPP44XY6.js.map +1 -0
- package/dist/chunk-IW7FTQQX.js +267 -0
- package/dist/chunk-IW7FTQQX.js.map +1 -0
- package/dist/chunk-JX4YSCBH.js +428 -0
- package/dist/chunk-JX4YSCBH.js.map +1 -0
- package/dist/chunk-KX6UYWWR.js +229 -0
- package/dist/chunk-KX6UYWWR.js.map +1 -0
- package/dist/chunk-LWVETFJV.js +46 -0
- package/dist/chunk-LWVETFJV.js.map +1 -0
- package/dist/chunk-MCL2MCA2.js +285 -0
- package/dist/chunk-MCL2MCA2.js.map +1 -0
- package/dist/chunk-MZXCF35B.js +205 -0
- package/dist/chunk-MZXCF35B.js.map +1 -0
- package/dist/chunk-NCGPUFWV.js +96 -0
- package/dist/chunk-NCGPUFWV.js.map +1 -0
- package/dist/chunk-OEJMIE2Q.js +351 -0
- package/dist/chunk-OEJMIE2Q.js.map +1 -0
- package/dist/chunk-OYF2OAKS.js +394 -0
- package/dist/chunk-OYF2OAKS.js.map +1 -0
- package/dist/chunk-P6S43FYZ.js +316 -0
- package/dist/chunk-P6S43FYZ.js.map +1 -0
- package/dist/chunk-PL37KFRJ.js +3 -0
- package/dist/chunk-PL37KFRJ.js.map +1 -0
- package/dist/chunk-Q7BS5QC5.js +197 -0
- package/dist/chunk-Q7BS5QC5.js.map +1 -0
- package/dist/chunk-SDYPG3JD.js +288 -0
- package/dist/chunk-SDYPG3JD.js.map +1 -0
- package/dist/chunk-SUG56SZO.js +256 -0
- package/dist/chunk-SUG56SZO.js.map +1 -0
- package/dist/chunk-UVH5XJRP.js +164 -0
- package/dist/chunk-UVH5XJRP.js.map +1 -0
- package/dist/chunk-WZIJKCL3.js +282 -0
- package/dist/chunk-WZIJKCL3.js.map +1 -0
- package/dist/chunk-Y22AMGTM.js +3 -0
- package/dist/chunk-Y22AMGTM.js.map +1 -0
- package/dist/chunk-Z7G23XWU.js +200 -0
- package/dist/chunk-Z7G23XWU.js.map +1 -0
- package/dist/chunk-ZJU5M4IB.js +125 -0
- package/dist/chunk-ZJU5M4IB.js.map +1 -0
- package/dist/chunk-ZVC3ZWLM.js +52 -0
- package/dist/chunk-ZVC3ZWLM.js.map +1 -0
- package/dist/chunk-ZZZML7Y3.js +310 -0
- package/dist/chunk-ZZZML7Y3.js.map +1 -0
- package/dist/client.d.ts +25 -0
- package/dist/client.js +16 -0
- package/dist/client.js.map +1 -0
- package/dist/config/index.d.ts +170 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/errors/index.d.ts +267 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/file-router/index.d.ts +184 -0
- package/dist/file-router/index.js +3 -0
- package/dist/file-router/index.js.map +1 -0
- 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/handlers/index.d.ts +59 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/index.d.ts +588 -0
- package/dist/index.js +886 -0
- package/dist/index.js.map +1 -0
- 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/middleware/index.d.ts +305 -0
- package/dist/middleware/index.js +3 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/react/index.d.ts +73 -0
- package/dist/react/index.js +52 -0
- package/dist/react/index.js.map +1 -0
- package/dist/render/index.d.ts +131 -0
- package/dist/render/index.js +3 -0
- package/dist/render/index.js.map +1 -0
- package/dist/router/index.d.ts +65 -0
- package/dist/router/index.js +3 -0
- package/dist/router/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 +232 -0
- package/dist/rsc/index.js +15 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/legacy.d.ts +155 -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 +162 -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/server/index.d.ts +135 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.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 +177 -0
- package/dist/streaming/index.js +3 -0
- package/dist/streaming/index.js.map +1 -0
- 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/dist/utils/index.d.ts +42 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +228 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/plugins/esbuild.ts"],"names":["exports"],"mappings":"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","file":"chunk-MCL2MCA2.js","sourcesContent":["/**\r\n * @flightdev/core - esbuild Plugin for RSC\r\n * \r\n * esbuild plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - esbuild is optional, user decides bundler.\r\n * \r\n * @module @flightdev/core/rsc/plugins/esbuild\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * esbuild Plugin interface (minimal)\r\n * We define our own to avoid requiring esbuild as dependency\r\n */\r\nexport interface EsbuildPlugin {\r\n name: string;\r\n setup: (build: EsbuildBuild) => void | Promise<void>;\r\n}\r\n\r\nexport interface EsbuildBuild {\r\n initialOptions: EsbuildBuildOptions;\r\n onStart: (callback: () => void | Promise<void>) => void;\r\n onEnd: (callback: (result: EsbuildResult) => void | Promise<void>) => void;\r\n onResolve: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildResolveArgs) => EsbuildResolveResult | null | undefined | Promise<EsbuildResolveResult | null | undefined>\r\n ) => void;\r\n onLoad: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildLoadArgs) => EsbuildLoadResult | null | undefined | Promise<EsbuildLoadResult | null | undefined>\r\n ) => void;\r\n}\r\n\r\nexport interface EsbuildBuildOptions {\r\n outdir?: string;\r\n write?: boolean;\r\n metafile?: boolean;\r\n}\r\n\r\nexport interface EsbuildResult {\r\n errors: unknown[];\r\n warnings: unknown[];\r\n metafile?: unknown;\r\n}\r\n\r\nexport interface EsbuildResolveArgs {\r\n path: string;\r\n importer: string;\r\n namespace: string;\r\n resolveDir: string;\r\n kind: string;\r\n}\r\n\r\nexport interface EsbuildResolveResult {\r\n path?: string;\r\n external?: boolean;\r\n namespace?: string;\r\n suffix?: string;\r\n pluginData?: unknown;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\nexport interface EsbuildLoadArgs {\r\n path: string;\r\n namespace: string;\r\n suffix: string;\r\n pluginData: unknown;\r\n}\r\n\r\nexport interface EsbuildLoadResult {\r\n contents?: string;\r\n loader?: 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'text' | 'css';\r\n resolveDir?: string;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightEsbuildPluginOptions {\r\n /** Include patterns (regex) */\r\n include?: RegExp;\r\n\r\n /** Exclude patterns (regex) */\r\n exclude?: RegExp;\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Output directory for manifests */\r\n manifestDir?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n isSSR: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC esbuild Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // build.js\r\n * import * as esbuild from 'esbuild';\r\n * import { flightRSCEsbuild } from '@flightdev/core/rsc/plugins/esbuild';\r\n * \r\n * await esbuild.build({\r\n * entryPoints: ['src/index.tsx'],\r\n * bundle: true,\r\n * outdir: 'dist',\r\n * plugins: [\r\n * flightRSCEsbuild({\r\n * actionsEndpoint: '/_flight/action',\r\n * ssr: true,\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function flightRSCEsbuild(options: FlightEsbuildPluginOptions = {}): EsbuildPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n manifestDir = '.flight',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n isSSR: ssr,\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n setup(build) {\r\n const outdir = build.initialOptions.outdir || 'dist';\r\n\r\n // ============================================================\r\n // onStart: Reset state\r\n // ============================================================\r\n build.onStart(() => {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n });\r\n\r\n // ============================================================\r\n // onLoad: Transform client/server modules\r\n // ============================================================\r\n build.onLoad({ filter: include }, async (args) => {\r\n // Skip excluded\r\n if (exclude.test(args.path)) {\r\n return null;\r\n }\r\n\r\n // Read file\r\n const fs = await import('fs/promises');\r\n const code = await fs.readFile(args.path, 'utf-8');\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, args.path);\r\n const moduleId = createModuleId(args.path);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(args.path, {\r\n id: moduleId,\r\n file: args.path,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(args.path, {\r\n id: moduleId,\r\n file: args.path,\r\n exports: analysis.serverActions,\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n contents: transformClientForSSR(code, moduleId),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n contents: transformServerForClient(code, moduleId, actionsEndpoint),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n });\r\n\r\n // ============================================================\r\n // onEnd: Write manifests\r\n // ============================================================\r\n build.onEnd(async () => {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n\r\n const manifestPath = path.join(outdir, manifestDir);\r\n\r\n // Ensure directory exists\r\n await fs.mkdir(manifestPath, { recursive: true });\r\n\r\n // Write client manifest\r\n if (state.clientModules.size > 0) {\r\n const clientManifest = Object.fromEntries(state.clientModules);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'client-manifest.json'),\r\n JSON.stringify(clientManifest, null, 2)\r\n );\r\n }\r\n\r\n // Write server manifest\r\n if (state.serverActions.size > 0) {\r\n const serverManifest = Object.fromEntries(state.serverActions);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'server-manifest.json'),\r\n JSON.stringify(serverManifest, null, 2)\r\n );\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);\r\n }\r\n });\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (esbuild)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (esbuild)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper at the top (after any imports)\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers\r\nconst __flight_endpoint_inline = ${JSON.stringify(endpoint)};\r\nasync function __flight_rpc_inline(actionId, args) {\r\n const response = await fetch(__flight_endpoint_inline, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Find last import statement\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform each action function\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n // Replace async function with RPC call\r\n // This is simplified - production would use proper AST transformation\r\n const patterns = [\r\n // async function name() { 'use server'; ... }\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n // const name = async () => { 'use server'; ... }\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_rpc_inline(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n // Normalize and create relative path\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n // Remove common prefixes\r\n const prefixes = ['/src/', 'src/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx + prefix.length);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Get esbuild loader from file extension\r\n */\r\nfunction getLoader(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' {\r\n if (filePath.endsWith('.tsx')) return 'tsx';\r\n if (filePath.endsWith('.ts')) return 'ts';\r\n if (filePath.endsWith('.jsx')) return 'jsx';\r\n return 'js';\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n // export default\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n // export function/const/let/class Name\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n // export { a, b, c }\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCEsbuild;\r\n"]}
|
|
@@ -0,0 +1,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-MZXCF35B.js.map
|
|
205
|
+
//# sourceMappingURL=chunk-MZXCF35B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/context.ts"],"names":[],"mappings":"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","file":"chunk-MZXCF35B.js","sourcesContent":["/**\r\n * @flightdev/core - Server Context\r\n * \r\n * API de contexto para Server Components.\r\n * Provee acceso a datos del request de forma explícita y type-safe.\r\n * \r\n * Filosofía Flight:\r\n * - Contexto EXPLÍCITO (no magia con AsyncLocalStorage)\r\n * - Pasado como argumento (testeable, predecible)\r\n * - Extensible con adapters custom\r\n * - Inmutable por defecto\r\n * \r\n * @module @flightdev/core/rsc/context\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Contexto del servidor disponible en Server Components\r\n */\r\nexport interface ServerContext {\r\n /** Request actual (Web API Request) */\r\n readonly request: Request;\r\n\r\n /** Parámetros de ruta */\r\n readonly params: Readonly<Record<string, string>>;\r\n\r\n /** Search params de la URL */\r\n readonly searchParams: URLSearchParams;\r\n\r\n /** Headers del request */\r\n readonly headers: Headers;\r\n\r\n /** Accessor de cookies */\r\n readonly cookies: CookieAccessor;\r\n\r\n /** Headers de respuesta (mutables) */\r\n readonly responseHeaders: Headers;\r\n\r\n /** Signal para cancelación */\r\n readonly signal: AbortSignal;\r\n\r\n /** URL parseada */\r\n readonly url: URL;\r\n\r\n /** Método HTTP */\r\n readonly method: string;\r\n\r\n /** Context extensions (para adapters) */\r\n readonly extensions: ContextExtensions;\r\n}\r\n\r\n/**\r\n * Accessor para cookies con lazy parsing\r\n */\r\nexport interface CookieAccessor {\r\n /** Obtiene el valor de una cookie */\r\n get(name: string): string | undefined;\r\n\r\n /** Obtiene todas las cookies */\r\n getAll(): Readonly<Record<string, string>>;\r\n\r\n /** Verifica si existe una cookie */\r\n has(name: string): boolean;\r\n}\r\n\r\n/**\r\n * Extensiones del contexto para adapters\r\n */\r\nexport interface ContextExtensions {\r\n /** Obtiene una extensión */\r\n get<T>(key: string): T | undefined;\r\n\r\n /** Verifica si existe una extensión */\r\n has(key: string): boolean;\r\n}\r\n\r\n/**\r\n * Opciones para crear ServerContext\r\n */\r\nexport interface ServerContextOptions {\r\n /** Parámetros de ruta */\r\n params?: Record<string, string>;\r\n\r\n /** Extensiones custom */\r\n extensions?: Record<string, unknown>;\r\n\r\n /** Headers de respuesta iniciales */\r\n responseHeaders?: HeadersInit;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea un ServerContext a partir de un Request\r\n * \r\n * @example\r\n * ```typescript\r\n * const ctx = createServerContext(request, { \r\n * params: { id: '123' } \r\n * });\r\n * \r\n * // En un Server Component\r\n * async function UserPage(props, ctx: ServerContext) {\r\n * const userId = ctx.params.id;\r\n * const user = await db.users.get(userId);\r\n * return <UserProfile user={user} />;\r\n * }\r\n * ```\r\n */\r\nexport function createServerContext(\r\n request: Request,\r\n options: ServerContextOptions = {}\r\n): ServerContext {\r\n const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;\r\n\r\n // Parse URL\r\n const url = new URL(request.url);\r\n\r\n // Lazy cookie parsing\r\n let parsedCookies: Record<string, string> | null = null;\r\n\r\n const parseCookies = (): Record<string, string> => {\r\n if (parsedCookies !== null) return parsedCookies;\r\n\r\n parsedCookies = {};\r\n const cookieHeader = request.headers.get('cookie');\r\n\r\n if (cookieHeader) {\r\n for (const cookie of cookieHeader.split(';')) {\r\n const trimmed = cookie.trim();\r\n const eqIndex = trimmed.indexOf('=');\r\n\r\n if (eqIndex > 0) {\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n const value = trimmed.slice(eqIndex + 1).trim();\r\n\r\n // Decode URL-encoded values\r\n try {\r\n parsedCookies[key] = decodeURIComponent(value);\r\n } catch {\r\n parsedCookies[key] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return parsedCookies;\r\n };\r\n\r\n // Cookie accessor\r\n const cookies: CookieAccessor = {\r\n get(name: string): string | undefined {\r\n return parseCookies()[name];\r\n },\r\n getAll(): Readonly<Record<string, string>> {\r\n return Object.freeze({ ...parseCookies() });\r\n },\r\n has(name: string): boolean {\r\n return name in parseCookies();\r\n },\r\n };\r\n\r\n // Extensions accessor\r\n const contextExtensions: ContextExtensions = {\r\n get<T>(key: string): T | undefined {\r\n return extensions[key] as T | undefined;\r\n },\r\n has(key: string): boolean {\r\n return key in extensions;\r\n },\r\n };\r\n\r\n // Response headers (mutable)\r\n const responseHeaders = new Headers(initHeaders);\r\n\r\n return Object.freeze({\r\n request,\r\n params: Object.freeze({ ...params }),\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n responseHeaders,\r\n signal: request.signal,\r\n url,\r\n method: request.method,\r\n extensions: contextExtensions,\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Context Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Obtiene un header del request\r\n */\r\nexport function getHeader(ctx: ServerContext, name: string): string | null {\r\n return ctx.headers.get(name);\r\n}\r\n\r\n/**\r\n * Obtiene todos los headers como objeto\r\n */\r\nexport function getHeaders(ctx: ServerContext): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n ctx.headers.forEach((value, key) => {\r\n headers[key] = value;\r\n });\r\n return headers;\r\n}\r\n\r\n/**\r\n * Verifica si el request es un POST/PUT/PATCH/DELETE (mutation request)\r\n */\r\nexport function isMutationRequest(ctx: ServerContext): boolean {\r\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(ctx.method);\r\n}\r\n\r\n/**\r\n * Verifica si el request acepta JSON\r\n */\r\nexport function acceptsJson(ctx: ServerContext): boolean {\r\n const accept = ctx.headers.get('accept') || '';\r\n return accept.includes('application/json') || accept.includes('*/*');\r\n}\r\n\r\n/**\r\n * Verifica si el request es AJAX/fetch\r\n */\r\nexport function isAjaxRequest(ctx: ServerContext): boolean {\r\n return ctx.headers.get('x-requested-with')?.toLowerCase() === 'xmlhttprequest' ||\r\n ctx.headers.has('x-flight-action');\r\n}\r\n\r\n/**\r\n * Verifica si el request viene de un bot\r\n */\r\nexport function isBotRequest(ctx: ServerContext): boolean {\r\n const ua = ctx.headers.get('user-agent')?.toLowerCase() || '';\r\n const botPatterns = [\r\n 'bot', 'crawler', 'spider', 'scraper',\r\n 'googlebot', 'bingbot', 'yandexbot', 'duckduckbot',\r\n 'slurp', 'baiduspider', 'facebookexternalhit',\r\n 'twitterbot', 'linkedinbot', 'embedly', 'quora',\r\n 'outbrain', 'pinterest', 'slack', 'vkshare',\r\n 'w3c_validator', 'lighthouse', 'pagespeed',\r\n ];\r\n return botPatterns.some(pattern => ua.includes(pattern));\r\n}\r\n\r\n/**\r\n * Verifica si el cliente soporta streaming\r\n */\r\nexport function supportsStreaming(ctx: ServerContext): boolean {\r\n // Check for no-stream preference\r\n const noStream = ctx.searchParams.get('_nostream');\r\n if (noStream === '1' || noStream === 'true') return false;\r\n\r\n // Bots typically don't support streaming well\r\n if (isBotRequest(ctx)) return false;\r\n\r\n // Check for slow connection hints\r\n const connection = ctx.headers.get('downlink') || ctx.headers.get('ect');\r\n if (connection === 'slow-2g' || connection === '2g') return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Obtiene el idioma preferido del cliente\r\n */\r\nexport function getPreferredLanguage(ctx: ServerContext, available: string[]): string | undefined {\r\n const acceptLang = ctx.headers.get('accept-language');\r\n if (!acceptLang) return available[0];\r\n\r\n // Parse Accept-Language header\r\n const languages = acceptLang\r\n .split(',')\r\n .map(lang => {\r\n const [code, q = 'q=1'] = lang.trim().split(';');\r\n const quality = parseFloat(q.replace('q=', '')) || 1;\r\n return { code: code!.trim().toLowerCase(), quality };\r\n })\r\n .sort((a, b) => b.quality - a.quality);\r\n\r\n // Find best match\r\n for (const { code } of languages) {\r\n // Exact match\r\n const exact = available.find(a => a.toLowerCase() === code);\r\n if (exact) return exact;\r\n\r\n // Language-only match (e.g., 'es' matches 'es-AR')\r\n const baseCode = code.split('-')[0];\r\n const partial = available.find(a => a.toLowerCase().startsWith(baseCode!));\r\n if (partial) return partial;\r\n }\r\n\r\n return available[0];\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Sets a cookie in the response\r\n */\r\nexport function setCookie(\r\n ctx: ServerContext,\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {}\r\n): void {\r\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\r\n\r\n if (options.maxAge !== undefined) {\r\n parts.push(`Max-Age=${options.maxAge}`);\r\n }\r\n if (options.expires) {\r\n parts.push(`Expires=${options.expires.toUTCString()}`);\r\n }\r\n if (options.path) {\r\n parts.push(`Path=${options.path}`);\r\n }\r\n if (options.domain) {\r\n parts.push(`Domain=${options.domain}`);\r\n }\r\n if (options.secure) {\r\n parts.push('Secure');\r\n }\r\n if (options.httpOnly) {\r\n parts.push('HttpOnly');\r\n }\r\n if (options.sameSite) {\r\n parts.push(`SameSite=${options.sameSite}`);\r\n }\r\n\r\n ctx.responseHeaders.append('Set-Cookie', parts.join('; '));\r\n}\r\n\r\n/**\r\n * Deletes a cookie\r\n */\r\nexport function deleteCookie(ctx: ServerContext, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\r\n setCookie(ctx, name, '', {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n\r\n/**\r\n * Cookie options\r\n */\r\nexport interface CookieOptions {\r\n /** Max age in seconds */\r\n maxAge?: number;\r\n /** Expiration date */\r\n expires?: Date;\r\n /** Cookie path */\r\n path?: string;\r\n /** Cookie domain */\r\n domain?: string;\r\n /** HTTPS only */\r\n secure?: boolean;\r\n /** Not accessible via JavaScript */\r\n httpOnly?: boolean;\r\n /** SameSite attribute */\r\n sameSite?: 'Strict' | 'Lax' | 'None';\r\n}\r\n\r\n/**\r\n * Sets cache control headers\r\n */\r\nexport function setCacheControl(ctx: ServerContext, options: CacheControlOptions): void {\r\n const parts: string[] = [];\r\n\r\n if (options.public) parts.push('public');\r\n if (options.private) parts.push('private');\r\n if (options.noCache) parts.push('no-cache');\r\n if (options.noStore) parts.push('no-store');\r\n if (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`);\r\n if (options.sMaxAge !== undefined) parts.push(`s-maxage=${options.sMaxAge}`);\r\n if (options.staleWhileRevalidate !== undefined) {\r\n parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\r\n }\r\n if (options.staleIfError !== undefined) {\r\n parts.push(`stale-if-error=${options.staleIfError}`);\r\n }\r\n if (options.mustRevalidate) parts.push('must-revalidate');\r\n if (options.immutable) parts.push('immutable');\r\n\r\n ctx.responseHeaders.set('Cache-Control', parts.join(', '));\r\n}\r\n\r\n/**\r\n * Cache control options\r\n */\r\nexport interface CacheControlOptions {\r\n public?: boolean;\r\n private?: boolean;\r\n noCache?: boolean;\r\n noStore?: boolean;\r\n maxAge?: number;\r\n sMaxAge?: number;\r\n staleWhileRevalidate?: number;\r\n staleIfError?: number;\r\n mustRevalidate?: boolean;\r\n immutable?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Error Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Not found error - triggers 404 handling\r\n */\r\nexport function notFound(message = 'Not Found'): never {\r\n const error = new Error(message) as Error & { __flight_not_found: true };\r\n error.__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a not found error\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && '__flight_not_found' in error;\r\n}\r\n\r\n/**\r\n * Redirect error - triggers redirect handling\r\n */\r\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 307): never {\r\n const error = new Error(`Redirect: ${url}`) as Error & {\r\n __flight_redirect: { url: string; status: number }\r\n };\r\n error.__flight_redirect = { url, status };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a redirect error\r\n */\r\nexport function isRedirectError(error: unknown): error is Error & {\r\n __flight_redirect: { url: string; status: number }\r\n} {\r\n return error instanceof Error && '__flight_redirect' in error;\r\n}\r\n\r\n/**\r\n * Get redirect info from error\r\n */\r\nexport function getRedirectInfo(error: Error & { __flight_redirect: { url: string; status: number } }): { url: string; status: number } {\r\n return error.__flight_redirect;\r\n}\r\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// src/config/index.ts
|
|
2
|
+
var DEFAULT_CONFIG = {
|
|
3
|
+
adapter: null,
|
|
4
|
+
bundler: null,
|
|
5
|
+
ui: {
|
|
6
|
+
framework: "vanilla"
|
|
7
|
+
},
|
|
8
|
+
rendering: {
|
|
9
|
+
default: "ssr",
|
|
10
|
+
routes: {}
|
|
11
|
+
},
|
|
12
|
+
dev: {
|
|
13
|
+
port: 5173,
|
|
14
|
+
host: "localhost",
|
|
15
|
+
open: false,
|
|
16
|
+
https: false,
|
|
17
|
+
proxy: {}
|
|
18
|
+
},
|
|
19
|
+
build: {
|
|
20
|
+
outDir: "dist",
|
|
21
|
+
srcDir: "src",
|
|
22
|
+
publicDir: "public",
|
|
23
|
+
routesDir: "src/routes",
|
|
24
|
+
sourcemap: false,
|
|
25
|
+
minify: true,
|
|
26
|
+
target: "es2022"
|
|
27
|
+
}};
|
|
28
|
+
function defineConfig(config) {
|
|
29
|
+
return config;
|
|
30
|
+
}
|
|
31
|
+
function resolveConfig(userConfig = {}) {
|
|
32
|
+
return {
|
|
33
|
+
root: userConfig.root ?? process.cwd(),
|
|
34
|
+
adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,
|
|
35
|
+
bundler: userConfig.bundler ?? DEFAULT_CONFIG.bundler,
|
|
36
|
+
ui: {
|
|
37
|
+
...DEFAULT_CONFIG.ui,
|
|
38
|
+
...userConfig.ui
|
|
39
|
+
},
|
|
40
|
+
rendering: {
|
|
41
|
+
...DEFAULT_CONFIG.rendering,
|
|
42
|
+
...userConfig.rendering
|
|
43
|
+
},
|
|
44
|
+
dev: {
|
|
45
|
+
...DEFAULT_CONFIG.dev,
|
|
46
|
+
...userConfig.dev
|
|
47
|
+
},
|
|
48
|
+
build: {
|
|
49
|
+
...DEFAULT_CONFIG.build,
|
|
50
|
+
...userConfig.build
|
|
51
|
+
},
|
|
52
|
+
bundlerOptions: userConfig.bundlerOptions,
|
|
53
|
+
vite: userConfig.vite,
|
|
54
|
+
plugins: userConfig.plugins ?? []
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
var CONFIG_FILES = [
|
|
58
|
+
"flight.config.ts",
|
|
59
|
+
"flight.config.js",
|
|
60
|
+
"flight.config.mjs",
|
|
61
|
+
"flight.config.mts"
|
|
62
|
+
];
|
|
63
|
+
async function findConfigFile(root) {
|
|
64
|
+
const { existsSync } = await import('fs');
|
|
65
|
+
const { join } = await import('path');
|
|
66
|
+
for (const file of CONFIG_FILES) {
|
|
67
|
+
const path = join(root, file);
|
|
68
|
+
if (existsSync(path)) {
|
|
69
|
+
return path;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
async function loadConfig(root = process.cwd()) {
|
|
75
|
+
const configFile = await findConfigFile(root);
|
|
76
|
+
if (!configFile) {
|
|
77
|
+
return resolveConfig({ root });
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const { pathToFileURL } = await import('url');
|
|
81
|
+
const configUrl = pathToFileURL(configFile).href;
|
|
82
|
+
const module = await import(configUrl);
|
|
83
|
+
const userConfig = module.default;
|
|
84
|
+
return resolveConfig({
|
|
85
|
+
...userConfig,
|
|
86
|
+
root
|
|
87
|
+
});
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error(`Failed to load config from ${configFile}:`, error);
|
|
90
|
+
return resolveConfig({ root });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export { defineConfig, findConfigFile, loadConfig, resolveConfig };
|
|
95
|
+
//# sourceMappingURL=chunk-NCGPUFWV.js.map
|
|
96
|
+
//# sourceMappingURL=chunk-NCGPUFWV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/index.ts"],"names":[],"mappings":"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","file":"chunk-NCGPUFWV.js","sourcesContent":["/**\r\n * Flight Configuration - User configuration system\r\n */\r\n\r\nimport type { RenderMode } from '../render/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Bundler Types (from @flightdev/bundler)\r\n// ============================================================================\r\n\r\n/**\r\n * Bundler adapter interface.\r\n * Import the full type from @flightdev/bundler for implementation.\r\n */\r\nexport interface BundlerAdapter {\r\n /** Adapter identifier */\r\n name: string;\r\n /** Bundler name (vite, esbuild, rolldown, etc.) */\r\n bundler: string;\r\n /** Bundler-specific options */\r\n options?: Record<string, unknown>;\r\n /** Create dev server */\r\n createDevServer(config: FlightConfig): Promise<unknown>;\r\n /** Build for production */\r\n build(config: FlightConfig): Promise<unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** UI Framework configuration */\r\nexport interface UIConfig {\r\n /** The UI framework to use */\r\n framework?: 'react' | 'vue' | 'svelte' | 'solid' | 'preact' | 'vanilla' | string;\r\n /** Framework-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/** Rendering configuration */\r\nexport interface RenderConfig {\r\n /** Default render mode */\r\n default?: RenderMode;\r\n /** Per-route render mode overrides */\r\n routes?: Record<string, RenderMode>;\r\n}\r\n\r\n/** Development server options */\r\nexport interface DevConfig {\r\n /** Port to run dev server on */\r\n port?: number;\r\n /** Host to bind to */\r\n host?: string | boolean;\r\n /** Open browser on start */\r\n open?: boolean;\r\n /** HTTPS configuration */\r\n https?: boolean | {\r\n key?: string;\r\n cert?: string;\r\n };\r\n /** Proxy configuration */\r\n proxy?: Record<string, string | {\r\n target: string;\r\n changeOrigin?: boolean;\r\n rewrite?: (path: string) => string;\r\n }>;\r\n}\r\n\r\n/** Build configuration */\r\nexport interface BuildConfig {\r\n /** Output directory */\r\n outDir?: string;\r\n /** Source directory */\r\n srcDir?: string;\r\n /** Public assets directory */\r\n publicDir?: string;\r\n /** Routes directory */\r\n routesDir?: string;\r\n /** Generate sourcemaps */\r\n sourcemap?: boolean | 'inline' | 'hidden';\r\n /** Minify output */\r\n minify?: boolean | 'terser' | 'esbuild';\r\n /** Target environments */\r\n target?: string | string[];\r\n}\r\n\r\n/** Full Flight configuration (resolved) */\r\nexport interface FlightConfig {\r\n /** Root directory */\r\n root: string;\r\n /** Deployment adapter */\r\n adapter: FlightAdapter | null;\r\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\r\n bundler: BundlerAdapter | null;\r\n /** UI framework configuration */\r\n ui: UIConfig;\r\n /** Rendering configuration */\r\n rendering: RenderConfig;\r\n /** Development server options */\r\n dev: Required<DevConfig>;\r\n /** Build configuration */\r\n build: Required<BuildConfig>;\r\n /** Bundler-specific configuration (passed to adapter) */\r\n bundlerOptions?: Record<string, unknown>;\r\n /** @deprecated Use bundler adapter instead */\r\n vite?: Record<string, unknown>;\r\n /** Plugin configurations */\r\n plugins: FlightPlugin[];\r\n}\r\n\r\n/** Flight plugin interface */\r\nexport interface FlightPlugin {\r\n /** Plugin name */\r\n name: string;\r\n /** Hook into config resolution */\r\n config?: (config: FlightConfig) => FlightConfig | void | Promise<FlightConfig | void>;\r\n /** Hook into build start */\r\n buildStart?: () => void | Promise<void>;\r\n /** Hook into build end */\r\n buildEnd?: () => void | Promise<void>;\r\n /** Hook into dev server start */\r\n devStart?: () => void | Promise<void>;\r\n}\r\n\r\n/** User-provided configuration (partial) */\r\nexport interface FlightUserConfig {\r\n /** Root directory (defaults to process.cwd()) */\r\n root?: string;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\r\n bundler?: BundlerAdapter;\r\n /** UI framework configuration */\r\n ui?: UIConfig;\r\n /** Rendering configuration */\r\n rendering?: RenderConfig;\r\n /** Development server options */\r\n dev?: DevConfig;\r\n /** Build configuration */\r\n build?: BuildConfig;\r\n /** Bundler-specific configuration */\r\n bundlerOptions?: Record<string, unknown>;\r\n /** @deprecated Use bundler adapter instead */\r\n vite?: Record<string, unknown>;\r\n /** Plugins */\r\n plugins?: FlightPlugin[];\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Factory\r\n// ============================================================================\r\n\r\n/** Default configuration values */\r\nconst DEFAULT_CONFIG: Omit<FlightConfig, 'root'> = {\r\n adapter: null,\r\n bundler: null,\r\n ui: {\r\n framework: 'vanilla',\r\n },\r\n rendering: {\r\n default: 'ssr',\r\n routes: {},\r\n },\r\n dev: {\r\n port: 5173,\r\n host: 'localhost',\r\n open: false,\r\n https: false,\r\n proxy: {},\r\n },\r\n build: {\r\n outDir: 'dist',\r\n srcDir: 'src',\r\n publicDir: 'public',\r\n routesDir: 'src/routes',\r\n sourcemap: false,\r\n minify: true,\r\n target: 'es2022',\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Define Flight configuration\r\n * \r\n * @example\r\n * ```typescript\r\n * // flight.config.ts\r\n * import { defineConfig } from '@flightdev/core';\r\n * import node from '@flightdev/adapter-node';\r\n * \r\n * export default defineConfig({\r\n * adapter: node(),\r\n * ui: { framework: 'react' },\r\n * rendering: {\r\n * default: 'ssr',\r\n * routes: {\r\n * '/blog/*': 'ssg',\r\n * '/app/*': 'csr',\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: FlightUserConfig): FlightUserConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Resolve user config to full config with defaults\r\n */\r\nexport function resolveConfig(userConfig: FlightUserConfig = {}): FlightConfig {\r\n return {\r\n root: userConfig.root ?? process.cwd(),\r\n adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,\r\n bundler: userConfig.bundler ?? DEFAULT_CONFIG.bundler,\r\n ui: {\r\n ...DEFAULT_CONFIG.ui,\r\n ...userConfig.ui,\r\n },\r\n rendering: {\r\n ...DEFAULT_CONFIG.rendering,\r\n ...userConfig.rendering,\r\n },\r\n dev: {\r\n ...DEFAULT_CONFIG.dev,\r\n ...userConfig.dev,\r\n } as Required<DevConfig>,\r\n build: {\r\n ...DEFAULT_CONFIG.build,\r\n ...userConfig.build,\r\n } as Required<BuildConfig>,\r\n bundlerOptions: userConfig.bundlerOptions,\r\n vite: userConfig.vite,\r\n plugins: userConfig.plugins ?? [],\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Config Loading\r\n// ============================================================================\r\n\r\nconst CONFIG_FILES = [\r\n 'flight.config.ts',\r\n 'flight.config.js',\r\n 'flight.config.mjs',\r\n 'flight.config.mts',\r\n];\r\n\r\n/**\r\n * Find the config file in a directory\r\n */\r\nexport async function findConfigFile(root: string): Promise<string | null> {\r\n // Dynamic import for Node.js fs\r\n const { existsSync } = await import('node:fs');\r\n const { join } = await import('node:path');\r\n\r\n for (const file of CONFIG_FILES) {\r\n const path = join(root, file);\r\n if (existsSync(path)) {\r\n return path;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Load configuration from file\r\n */\r\nexport async function loadConfig(root: string = process.cwd()): Promise<FlightConfig> {\r\n const configFile = await findConfigFile(root);\r\n\r\n if (!configFile) {\r\n return resolveConfig({ root });\r\n }\r\n\r\n try {\r\n // Use dynamic import for the config file\r\n // On Windows, we need to convert the path to a file:// URL\r\n const { pathToFileURL } = await import('node:url');\r\n const configUrl = pathToFileURL(configFile).href;\r\n const module = await import(configUrl);\r\n const userConfig = module.default as FlightUserConfig;\r\n\r\n return resolveConfig({\r\n ...userConfig,\r\n root,\r\n });\r\n } catch (error) {\r\n console.error(`Failed to load config from ${configFile}:`, error);\r\n return resolveConfig({ root });\r\n }\r\n}\r\n"]}
|