@flight-framework/core 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +541 -541
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-FSJNOPYE.js → chunk-2JVEH76V.js} +3 -3
- package/dist/chunk-2JVEH76V.js.map +1 -0
- package/dist/{chunk-VPFMHGEV.js → chunk-3N5ZBVZJ.js} +2 -2
- package/dist/chunk-3N5ZBVZJ.js.map +1 -0
- package/dist/{chunk-2F2QU6RC.js → chunk-3UQJE3XZ.js} +2 -2
- package/dist/chunk-3UQJE3XZ.js.map +1 -0
- package/dist/{chunk-3KRBRSRJ.js → chunk-4U7CJVNQ.js} +2 -2
- package/dist/chunk-4U7CJVNQ.js.map +1 -0
- package/dist/{chunk-PDW5WCMW.js → chunk-5XHOLZBJ.js} +2 -2
- package/dist/chunk-5XHOLZBJ.js.map +1 -0
- package/dist/{chunk-MDQNNIHH.js → chunk-65JYF3DJ.js} +2 -2
- package/dist/chunk-65JYF3DJ.js.map +1 -0
- package/dist/{chunk-K2CQZPCG.js → chunk-6GI6HFSQ.js} +2 -2
- package/dist/chunk-6GI6HFSQ.js.map +1 -0
- package/dist/{chunk-3ZSSRE6M.js → chunk-6IG6XIXU.js} +29 -3
- package/dist/chunk-6IG6XIXU.js.map +1 -0
- package/dist/{chunk-PVUMB632.js → chunk-A2QRUBVE.js} +2 -2
- package/dist/chunk-A2QRUBVE.js.map +1 -0
- package/dist/{chunk-W6D62JCI.js → chunk-A4TKWQBU.js} +2 -2
- package/dist/chunk-A4TKWQBU.js.map +1 -0
- package/dist/{chunk-GCQZ4FHI.js → chunk-ARBKF6VI.js} +2 -2
- package/dist/{chunk-GCQZ4FHI.js.map → chunk-ARBKF6VI.js.map} +1 -1
- package/dist/{chunk-ZVC3ZWLM.js → chunk-B2LPSCES.js} +2 -2
- package/dist/chunk-B2LPSCES.js.map +1 -0
- package/dist/{chunk-62C7LX2E.js → chunk-CKJHJPKQ.js} +2 -2
- package/dist/chunk-CKJHJPKQ.js.map +1 -0
- package/dist/{chunk-RSVA2EYO.js → chunk-CNY3ZUVG.js} +2 -2
- package/dist/chunk-CNY3ZUVG.js.map +1 -0
- package/dist/{chunk-IXMD5QH2.js → chunk-EHVUAFNH.js} +2 -2
- package/dist/chunk-EHVUAFNH.js.map +1 -0
- package/dist/{chunk-P6WSBVDT.js → chunk-FRAH5QNY.js} +4 -4
- package/dist/chunk-FRAH5QNY.js.map +1 -0
- package/dist/{chunk-MQQLYWZZ.js → chunk-GNS2FGPC.js} +2 -2
- package/dist/chunk-GNS2FGPC.js.map +1 -0
- package/dist/{chunk-TASAT7KB.js → chunk-HNPO6LFW.js} +2 -2
- package/dist/chunk-HNPO6LFW.js.map +1 -0
- package/dist/{chunk-ROJFQCGV.js → chunk-KDEA64UX.js} +5 -5
- package/dist/chunk-KDEA64UX.js.map +1 -0
- package/dist/{chunk-NWMJYTMB.js → chunk-LAKHYTHL.js} +3 -3
- package/dist/chunk-LAKHYTHL.js.map +1 -0
- package/dist/{chunk-R7SQAREQ.js → chunk-LKOPJ3GS.js} +2 -2
- package/dist/chunk-LKOPJ3GS.js.map +1 -0
- package/dist/{chunk-WOEIJWGJ.js → chunk-NZS2YJ43.js} +2 -2
- package/dist/chunk-NZS2YJ43.js.map +1 -0
- package/dist/{chunk-3QP3E7HS.js → chunk-OZ3EXPLE.js} +2 -2
- package/dist/chunk-OZ3EXPLE.js.map +1 -0
- package/dist/{chunk-YHEVHRLH.js → chunk-OZBPR27I.js} +2 -2
- package/dist/chunk-OZBPR27I.js.map +1 -0
- package/dist/{chunk-T4Z4HM4W.js → chunk-PAVI5W6M.js} +3 -3
- package/dist/chunk-PAVI5W6M.js.map +1 -0
- package/dist/{chunk-XSY5AAXT.js → chunk-PO7IHPFF.js} +2 -2
- package/dist/chunk-PO7IHPFF.js.map +1 -0
- package/dist/{chunk-SUILH4ID.js → chunk-QK6UEQ75.js} +2 -2
- package/dist/chunk-QK6UEQ75.js.map +1 -0
- package/dist/{chunk-OYF2OAKS.js → chunk-R7MEVVA4.js} +2 -2
- package/dist/chunk-R7MEVVA4.js.map +1 -0
- package/dist/{chunk-WFAWAHJH.js → chunk-UFWGOJL7.js} +2 -2
- package/dist/chunk-UFWGOJL7.js.map +1 -0
- package/dist/{chunk-XOIYNY4I.js → chunk-VNO2YUVD.js} +2 -2
- package/dist/chunk-VNO2YUVD.js.map +1 -0
- package/dist/{chunk-ZIE56LCA.js → chunk-XU6MRYG2.js} +3 -3
- package/dist/chunk-XU6MRYG2.js.map +1 -0
- package/dist/{chunk-6BDCTUQY.js → chunk-YNTMYL36.js} +3 -3
- package/dist/chunk-YNTMYL36.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.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/handlers/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/islands/index.js +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/router/index.js +1 -1
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/context.js +1 -1
- package/dist/rsc/index.d.ts +211 -6
- package/dist/rsc/index.js +11 -11
- package/dist/rsc/legacy.d.ts +26 -2
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/payload.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.js +3 -3
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/dist/server/index.js +4 -4
- package/dist/streaming/adapters/index.js +1 -1
- package/dist/streaming/conditional.js +1 -1
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +228 -222
- package/dist/chunk-2F2QU6RC.js.map +0 -1
- package/dist/chunk-3KRBRSRJ.js.map +0 -1
- package/dist/chunk-3QP3E7HS.js.map +0 -1
- package/dist/chunk-3ZSSRE6M.js.map +0 -1
- package/dist/chunk-62C7LX2E.js.map +0 -1
- package/dist/chunk-6BDCTUQY.js.map +0 -1
- package/dist/chunk-FSJNOPYE.js.map +0 -1
- package/dist/chunk-IXMD5QH2.js.map +0 -1
- package/dist/chunk-K2CQZPCG.js.map +0 -1
- package/dist/chunk-MDQNNIHH.js.map +0 -1
- package/dist/chunk-MQQLYWZZ.js.map +0 -1
- package/dist/chunk-NWMJYTMB.js.map +0 -1
- package/dist/chunk-OYF2OAKS.js.map +0 -1
- package/dist/chunk-P6WSBVDT.js.map +0 -1
- package/dist/chunk-PDW5WCMW.js.map +0 -1
- package/dist/chunk-PVUMB632.js.map +0 -1
- package/dist/chunk-R7SQAREQ.js.map +0 -1
- package/dist/chunk-ROJFQCGV.js.map +0 -1
- package/dist/chunk-RSVA2EYO.js.map +0 -1
- package/dist/chunk-SUILH4ID.js.map +0 -1
- package/dist/chunk-T4Z4HM4W.js.map +0 -1
- package/dist/chunk-TASAT7KB.js.map +0 -1
- package/dist/chunk-VPFMHGEV.js.map +0 -1
- package/dist/chunk-W6D62JCI.js.map +0 -1
- package/dist/chunk-WFAWAHJH.js.map +0 -1
- package/dist/chunk-WOEIJWGJ.js.map +0 -1
- package/dist/chunk-XOIYNY4I.js.map +0 -1
- package/dist/chunk-XSY5AAXT.js.map +0 -1
- package/dist/chunk-YHEVHRLH.js.map +0 -1
- package/dist/chunk-ZIE56LCA.js.map +0 -1
- package/dist/chunk-ZVC3ZWLM.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/index.ts"],"names":["cached"],"mappings":"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","file":"chunk-R7SQAREQ.js","sourcesContent":["/**\r\n * Flight Cache - Agnostic caching primitives\r\n * \r\n * Flight provides the interface, you choose the implementation.\r\n * Use in-memory, Redis, Cloudflare KV, Upstash, or anything else.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createCache } from '@flight-framework/core';\r\n * import { redis } from '@flight-framework/cache-redis';\r\n * \r\n * const cache = createCache({\r\n * adapter: redis({ url: process.env.REDIS_URL }),\r\n * defaultTTL: 3600,\r\n * });\r\n * \r\n * await cache.set('user:1', userData, { tags: ['users'] });\r\n * await cache.invalidateTag('users');\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface CacheOptions {\r\n /** Time-to-live in seconds */\r\n ttl?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** Stale-while-revalidate time in seconds */\r\n swr?: number;\r\n}\r\n\r\nexport interface CacheEntry<T> {\r\n /** Cached value */\r\n value: T;\r\n /** When this entry expires (timestamp) */\r\n expiresAt?: number;\r\n /** When this entry becomes stale (timestamp) */\r\n staleAt?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** When this entry was created */\r\n createdAt: number;\r\n}\r\n\r\nexport interface Cache {\r\n /** Get a value from cache */\r\n get<T>(key: string): Promise<T | undefined>;\r\n\r\n /** Set a value in cache */\r\n set<T>(key: string, value: T, options?: CacheOptions): Promise<void>;\r\n\r\n /** Delete a value from cache */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /** Check if a key exists */\r\n has(key: string): Promise<boolean>;\r\n\r\n /** Clear all cache entries */\r\n clear(): Promise<void>;\r\n\r\n /** Invalidate entries by tag */\r\n invalidateTag(tag: string): Promise<void>;\r\n\r\n /** Invalidate entries by multiple tags */\r\n invalidateTags(tags: string[]): Promise<void>;\r\n\r\n /** Get or set with a factory function */\r\n getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n options?: CacheOptions\r\n ): Promise<T>;\r\n\r\n /** Get multiple values at once */\r\n getMany<T>(keys: string[]): Promise<Map<string, T | undefined>>;\r\n\r\n /** Set multiple values at once */\r\n setMany<T>(entries: Map<string, T>, options?: CacheOptions): Promise<void>;\r\n\r\n /** Get cache statistics (if tracking enabled) */\r\n getStats?(): CacheStats | undefined;\r\n}\r\n\r\nexport interface CacheStats {\r\n hits: number;\r\n misses: number;\r\n sets: number;\r\n deletes: number;\r\n}\r\n\r\n/** Adapter interface for external cache providers */\r\nexport interface CacheAdapter {\r\n /** Adapter name for identification */\r\n readonly name: string;\r\n\r\n /** Get an entry from cache */\r\n get<T>(key: string): Promise<CacheEntry<T> | undefined>;\r\n\r\n /** Set an entry in cache */\r\n set<T>(key: string, entry: CacheEntry<T>): Promise<void>;\r\n\r\n /** Delete an entry from cache */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /** Check if key exists */\r\n has(key: string): Promise<boolean>;\r\n\r\n /** Clear all entries */\r\n clear(): Promise<void>;\r\n\r\n /** Get keys matching pattern (optional) */\r\n keys?(pattern?: string): Promise<string[]>;\r\n\r\n /** Get multiple entries at once (optional, for performance) */\r\n getMany?<T>(keys: string[]): Promise<Map<string, CacheEntry<T> | undefined>>;\r\n\r\n /** Set multiple entries at once (optional, for performance) */\r\n setMany?<T>(entries: Map<string, CacheEntry<T>>): Promise<void>;\r\n\r\n // ========================================================================\r\n // Tag operations - For distributed caches, tags MUST be handled by adapter\r\n // ========================================================================\r\n\r\n /** Whether this adapter supports distributed tags natively */\r\n readonly supportsDistributedTags?: boolean;\r\n\r\n /** Add a key to a tag set (for distributed tag management) */\r\n addToTag?(tag: string, key: string): Promise<void>;\r\n\r\n /** Get all keys associated with a tag */\r\n getTagMembers?(tag: string): Promise<string[]>;\r\n\r\n /** Delete a tag and return its members */\r\n deleteTag?(tag: string): Promise<string[]>;\r\n\r\n // ========================================================================\r\n // Lifecycle\r\n // ========================================================================\r\n\r\n /** Close connection (for cleanup) */\r\n close?(): Promise<void>;\r\n\r\n /** Check if adapter is healthy */\r\n ping?(): Promise<boolean>;\r\n}\r\n\r\n// ============================================================================\r\n// Serialization\r\n// ============================================================================\r\n\r\nexport interface Serializer {\r\n serialize(value: unknown): string;\r\n deserialize<T>(data: string): T;\r\n}\r\n\r\n/** Default JSON serializer */\r\nexport const jsonSerializer: Serializer = {\r\n serialize: (value) => JSON.stringify(value),\r\n deserialize: <T>(data: string) => JSON.parse(data) as T,\r\n};\r\n\r\n// ============================================================================\r\n// In-Memory Cache Implementation (Default)\r\n// ============================================================================\r\n\r\nexport interface MemoryCacheAdapterOptions {\r\n /** Maximum number of entries (0 = unlimited) */\r\n maxSize?: number;\r\n /** Cleanup interval in ms (default: 60000) */\r\n cleanupInterval?: number;\r\n}\r\n\r\nclass MemoryCacheAdapter implements CacheAdapter {\r\n readonly name = 'memory';\r\n readonly supportsDistributedTags = false;\r\n\r\n private store = new Map<string, CacheEntry<unknown>>();\r\n private tagIndex = new Map<string, Set<string>>();\r\n private maxSize: number;\r\n private cleanupTimer?: ReturnType<typeof setInterval>;\r\n\r\n constructor(options: MemoryCacheAdapterOptions = {}) {\r\n this.maxSize = options.maxSize ?? 0;\r\n\r\n // Periodic cleanup of expired entries\r\n const interval = options.cleanupInterval ?? 60000;\r\n if (interval > 0) {\r\n this.cleanupTimer = setInterval(() => this.cleanup(), interval);\r\n }\r\n }\r\n\r\n async get<T>(key: string): Promise<CacheEntry<T> | undefined> {\r\n const entry = this.store.get(key) as CacheEntry<T> | undefined;\r\n if (!entry) return undefined;\r\n\r\n // Check if expired\r\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\r\n this.store.delete(key);\r\n this.removeFromTagIndex(key, entry.tags);\r\n return undefined;\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\r\n // Evict if at max size (simple FIFO eviction)\r\n if (this.maxSize > 0 && this.store.size >= this.maxSize && !this.store.has(key)) {\r\n const firstKey = this.store.keys().next().value;\r\n if (firstKey) {\r\n const evicted = this.store.get(firstKey);\r\n this.store.delete(firstKey);\r\n if (evicted?.tags) {\r\n this.removeFromTagIndex(firstKey, evicted.tags);\r\n }\r\n }\r\n }\r\n\r\n this.store.set(key, entry as CacheEntry<unknown>);\r\n\r\n // Update tag index\r\n if (entry.tags) {\r\n for (const tag of entry.tags) {\r\n if (!this.tagIndex.has(tag)) {\r\n this.tagIndex.set(tag, new Set());\r\n }\r\n this.tagIndex.get(tag)!.add(key);\r\n }\r\n }\r\n }\r\n\r\n async delete(key: string): Promise<boolean> {\r\n const entry = this.store.get(key);\r\n if (entry?.tags) {\r\n this.removeFromTagIndex(key, entry.tags);\r\n }\r\n return this.store.delete(key);\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n const entry = await this.get(key);\r\n return entry !== undefined;\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.store.clear();\r\n this.tagIndex.clear();\r\n }\r\n\r\n async keys(pattern?: string): Promise<string[]> {\r\n const allKeys = Array.from(this.store.keys());\r\n if (!pattern) return allKeys;\r\n\r\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\r\n return allKeys.filter(key => regex.test(key));\r\n }\r\n\r\n async getMany<T>(keys: string[]): Promise<Map<string, CacheEntry<T> | undefined>> {\r\n const result = new Map<string, CacheEntry<T> | undefined>();\r\n for (const key of keys) {\r\n result.set(key, await this.get<T>(key));\r\n }\r\n return result;\r\n }\r\n\r\n async setMany<T>(entries: Map<string, CacheEntry<T>>): Promise<void> {\r\n for (const [key, entry] of entries) {\r\n await this.set(key, entry);\r\n }\r\n }\r\n\r\n // In-memory adapter handles tags locally (non-distributed)\r\n async addToTag(tag: string, key: string): Promise<void> {\r\n if (!this.tagIndex.has(tag)) {\r\n this.tagIndex.set(tag, new Set());\r\n }\r\n this.tagIndex.get(tag)!.add(key);\r\n }\r\n\r\n async getTagMembers(tag: string): Promise<string[]> {\r\n return Array.from(this.tagIndex.get(tag) ?? []);\r\n }\r\n\r\n async deleteTag(tag: string): Promise<string[]> {\r\n const members = await this.getTagMembers(tag);\r\n this.tagIndex.delete(tag);\r\n return members;\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n }\r\n this.store.clear();\r\n this.tagIndex.clear();\r\n }\r\n\r\n async ping(): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n private removeFromTagIndex(key: string, tags?: string[]): void {\r\n if (!tags) return;\r\n for (const tag of tags) {\r\n this.tagIndex.get(tag)?.delete(key);\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n const now = Date.now();\r\n for (const [key, entry] of this.store) {\r\n if (entry.expiresAt && now > entry.expiresAt) {\r\n this.store.delete(key);\r\n this.removeFromTagIndex(key, entry.tags);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create in-memory cache adapter\r\n */\r\nexport function memory(options: MemoryCacheAdapterOptions = {}): CacheAdapter {\r\n return new MemoryCacheAdapter(options);\r\n}\r\n\r\n// ============================================================================\r\n// Cache Factory\r\n// ============================================================================\r\n\r\nexport interface CreateCacheOptions {\r\n /** Custom cache adapter (defaults to in-memory) */\r\n adapter?: CacheAdapter;\r\n /** Default TTL for all entries (seconds) */\r\n defaultTTL?: number;\r\n /** Key prefix for namespacing */\r\n prefix?: string;\r\n /** Custom serializer (for external adapters) */\r\n serializer?: Serializer;\r\n /** Track cache statistics */\r\n trackStats?: boolean;\r\n}\r\n\r\n/**\r\n * Create a new cache instance\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple in-memory cache\r\n * const cache = createCache();\r\n * \r\n * // With Redis adapter\r\n * import { redis } from '@flight-framework/cache-redis';\r\n * const cache = createCache({\r\n * adapter: redis({ url: 'redis://localhost:6379' }),\r\n * defaultTTL: 3600,\r\n * prefix: 'myapp',\r\n * });\r\n * ```\r\n */\r\nexport function createCache(options: CreateCacheOptions = {}): Cache {\r\n const {\r\n adapter = new MemoryCacheAdapter(),\r\n defaultTTL,\r\n prefix = '',\r\n trackStats = false,\r\n } = options;\r\n\r\n // Local tag index for adapters that don't support distributed tags\r\n const localTagIndex = new Map<string, Set<string>>();\r\n\r\n // Stats tracking\r\n const stats: CacheStats = { hits: 0, misses: 0, sets: 0, deletes: 0 };\r\n\r\n function prefixKey(key: string): string {\r\n return prefix ? `${prefix}:${key}` : key;\r\n }\r\n\r\n function useDistributedTags(): boolean {\r\n return !!(adapter.supportsDistributedTags && adapter.addToTag && adapter.getTagMembers && adapter.deleteTag);\r\n }\r\n\r\n async function registerTags(fullKey: string, tags?: string[]): Promise<void> {\r\n if (!tags || tags.length === 0) return;\r\n\r\n if (useDistributedTags()) {\r\n // Distributed: adapter handles tag storage\r\n for (const tag of tags) {\r\n await adapter.addToTag!(tag, fullKey);\r\n }\r\n } else {\r\n // Local: use in-memory index (for memory adapter or simple adapters)\r\n for (const tag of tags) {\r\n if (!localTagIndex.has(tag)) {\r\n localTagIndex.set(tag, new Set());\r\n }\r\n localTagIndex.get(tag)!.add(fullKey);\r\n }\r\n }\r\n }\r\n\r\n async function getTagMembers(tag: string): Promise<string[]> {\r\n if (useDistributedTags()) {\r\n return adapter.getTagMembers!(tag);\r\n }\r\n return Array.from(localTagIndex.get(tag) ?? []);\r\n }\r\n\r\n async function removeTag(tag: string): Promise<void> {\r\n if (useDistributedTags()) {\r\n await adapter.deleteTag!(tag);\r\n } else {\r\n localTagIndex.delete(tag);\r\n }\r\n }\r\n\r\n return {\r\n async get<T>(key: string): Promise<T | undefined> {\r\n const entry = await adapter.get<T>(prefixKey(key));\r\n\r\n if (!entry) {\r\n if (trackStats) stats.misses++;\r\n return undefined;\r\n }\r\n\r\n if (trackStats) stats.hits++;\r\n\r\n // Check stale-while-revalidate (return stale value, caller should revalidate)\r\n // The value is still returned even if stale - that's the \"while revalidate\" part\r\n return entry.value;\r\n },\r\n\r\n async set<T>(key: string, value: T, opts?: CacheOptions): Promise<void> {\r\n const ttl = opts?.ttl ?? defaultTTL;\r\n const now = Date.now();\r\n\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: now,\r\n tags: opts?.tags,\r\n };\r\n\r\n if (ttl) {\r\n entry.expiresAt = now + (ttl * 1000);\r\n if (opts?.swr) {\r\n entry.staleAt = now + ((ttl - opts.swr) * 1000);\r\n }\r\n }\r\n\r\n const fullKey = prefixKey(key);\r\n await adapter.set(fullKey, entry);\r\n await registerTags(fullKey, opts?.tags);\r\n\r\n if (trackStats) stats.sets++;\r\n },\r\n\r\n async delete(key: string): Promise<boolean> {\r\n const fullKey = prefixKey(key);\r\n const result = await adapter.delete(fullKey);\r\n if (trackStats && result) stats.deletes++;\r\n return result;\r\n },\r\n\r\n async has(key: string): Promise<boolean> {\r\n return adapter.has(prefixKey(key));\r\n },\r\n\r\n async clear(): Promise<void> {\r\n await adapter.clear();\r\n localTagIndex.clear();\r\n },\r\n\r\n async invalidateTag(tag: string): Promise<void> {\r\n const keys = await getTagMembers(tag);\r\n\r\n for (const key of keys) {\r\n await adapter.delete(key);\r\n }\r\n\r\n await removeTag(tag);\r\n },\r\n\r\n async invalidateTags(tags: string[]): Promise<void> {\r\n for (const tag of tags) {\r\n await this.invalidateTag(tag);\r\n }\r\n },\r\n\r\n async getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n opts?: CacheOptions\r\n ): Promise<T> {\r\n const cached = await this.get<T>(key);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const value = await factory();\r\n await this.set(key, value, opts);\r\n return value;\r\n },\r\n\r\n async getMany<T>(keys: string[]): Promise<Map<string, T | undefined>> {\r\n const result = new Map<string, T | undefined>();\r\n\r\n if (adapter.getMany) {\r\n // Use batch operation if adapter supports it\r\n const entries = await adapter.getMany<T>(keys.map(prefixKey));\r\n for (const [key, entry] of entries) {\r\n const originalKey = prefix ? key.slice(prefix.length + 1) : key;\r\n result.set(originalKey, entry?.value);\r\n }\r\n } else {\r\n // Fallback to individual gets\r\n for (const key of keys) {\r\n result.set(key, await this.get<T>(key));\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n async setMany<T>(entries: Map<string, T>, opts?: CacheOptions): Promise<void> {\r\n const ttl = opts?.ttl ?? defaultTTL;\r\n const now = Date.now();\r\n\r\n const cacheEntries = new Map<string, CacheEntry<T>>();\r\n\r\n for (const [key, value] of entries) {\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: now,\r\n tags: opts?.tags,\r\n };\r\n\r\n if (ttl) {\r\n entry.expiresAt = now + (ttl * 1000);\r\n if (opts?.swr) {\r\n entry.staleAt = now + ((ttl - opts.swr) * 1000);\r\n }\r\n }\r\n\r\n const fullKey = prefixKey(key);\r\n cacheEntries.set(fullKey, entry);\r\n await registerTags(fullKey, opts?.tags);\r\n }\r\n\r\n if (adapter.setMany) {\r\n await adapter.setMany(cacheEntries);\r\n } else {\r\n for (const [key, entry] of cacheEntries) {\r\n await adapter.set(key, entry);\r\n }\r\n }\r\n\r\n if (trackStats) stats.sets += entries.size;\r\n },\r\n\r\n getStats() {\r\n return trackStats ? { ...stats } : undefined;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Cache Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a cache key from multiple parts\r\n * \r\n * @example\r\n * ```typescript\r\n * cacheKey('user', userId, 'profile'); // \"user:123:profile\"\r\n * ```\r\n */\r\nexport function cacheKey(...parts: (string | number | boolean | undefined)[]): string {\r\n return parts\r\n .filter(p => p !== undefined)\r\n .map(p => String(p))\r\n .join(':');\r\n}\r\n\r\n/**\r\n * Wrap a function with caching\r\n * \r\n * @example\r\n * ```typescript\r\n * const getCachedUser = cached(cache, getUser, {\r\n * ttl: 300,\r\n * keyFn: (userId) => `user:${userId}`,\r\n * });\r\n * \r\n * const user = await getCachedUser(123);\r\n * ```\r\n */\r\nexport function cached<T extends (...args: unknown[]) => Promise<unknown>>(\r\n cache: Cache,\r\n fn: T,\r\n options?: CacheOptions & { keyFn?: (...args: Parameters<T>) => string }\r\n): T {\r\n const { keyFn = (...args: unknown[]) => JSON.stringify(args), ...cacheOpts } = options ?? {};\r\n\r\n return (async (...args: Parameters<T>) => {\r\n const key = keyFn(...args);\r\n return cache.getOrSet(key, () => fn(...args) as Promise<unknown>, cacheOpts);\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Create a deduplication wrapper to prevent duplicate concurrent requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const dedupedFetch = dedupe(fetchUser);\r\n * \r\n * // These will share the same request\r\n * const [user1, user2] = await Promise.all([\r\n * dedupedFetch(123),\r\n * dedupedFetch(123),\r\n * ]);\r\n * ```\r\n */\r\nexport function dedupe<T extends (...args: unknown[]) => Promise<unknown>>(\r\n fn: T,\r\n keyFn: (...args: Parameters<T>) => string = (...args) => JSON.stringify(args)\r\n): T {\r\n const pending = new Map<string, Promise<unknown>>();\r\n\r\n return (async (...args: Parameters<T>) => {\r\n const key = keyFn(...args);\r\n\r\n if (pending.has(key)) {\r\n return pending.get(key);\r\n }\r\n\r\n const promise = fn(...args).finally(() => {\r\n pending.delete(key);\r\n });\r\n\r\n pending.set(key, promise);\r\n return promise;\r\n }) as T;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/index.ts"],"names":[],"mappings":"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","file":"chunk-ROJFQCGV.js","sourcesContent":["/**\r\n * Flight Server - Main server factory\r\n * \r\n * Creates a Flight server instance that handles routing, middleware, and rendering.\r\n * This is the primary entry point for Flight applications.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/health', () => Response.json({ status: 'ok' }));\r\n * \r\n * // Just works! Auto-detects Node.js, Bun, or Deno\r\n * server.listen(3000);\r\n * ```\r\n */\r\n\r\nimport { createRouter, type Router } from '../router/index.js';\r\nimport {\r\n createMiddlewareChain,\r\n createContextFromRequest,\r\n createResponseFromContext,\r\n type MiddlewareChain,\r\n type Middleware,\r\n} from '../middleware/index.js';\r\nimport { type FlightConfig, type FlightUserConfig, resolveConfig } from '../config/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Route handler function signature */\r\nexport type RouteHandler = (context: RouteHandlerContext) => Promise<Response> | Response;\r\n\r\n/** Context passed to route handlers */\r\nexport interface RouteHandlerContext {\r\n /** The incoming request */\r\n request: Request;\r\n /** URL parameters from routing */\r\n params: Record<string, string | string[]>;\r\n /** Query parameters */\r\n query: URLSearchParams;\r\n /** Parsed URL */\r\n url: URL;\r\n /** Local data from middleware */\r\n locals: Record<string, unknown>;\r\n /** Database instance (if configured) */\r\n db?: unknown;\r\n /** Auth instance (if configured) */\r\n auth?: unknown;\r\n /** Email instance (if configured) */\r\n email?: unknown;\r\n}\r\n\r\n/** Server options */\r\nexport interface ServerOptions {\r\n /** Server configuration */\r\n config?: FlightUserConfig;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** Database instance */\r\n db?: unknown;\r\n /** Auth instance */\r\n auth?: unknown;\r\n /** Email instance */\r\n email?: unknown;\r\n}\r\n\r\n/** Route definition for the server */\r\nexport interface ServerRoute {\r\n /** HTTP method (GET, POST, etc.) */\r\n method: string | string[];\r\n /** Route path pattern */\r\n path: string;\r\n /** Route handler */\r\n handler: RouteHandler;\r\n}\r\n\r\n/** Listen options */\r\nexport interface ListenOptions {\r\n /** Port to listen on (default: 3000) */\r\n port?: number;\r\n /** Hostname to bind to (default: 'localhost') */\r\n hostname?: string;\r\n /** Callback when server starts */\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/** Flight Server instance */\r\nexport interface FlightServer {\r\n /** Add a route */\r\n route(method: string | string[], path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Convenience methods for common HTTP methods */\r\n get(path: string, handler: RouteHandler): FlightServer;\r\n post(path: string, handler: RouteHandler): FlightServer;\r\n put(path: string, handler: RouteHandler): FlightServer;\r\n delete(path: string, handler: RouteHandler): FlightServer;\r\n patch(path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Add middleware */\r\n use(middleware: Middleware): FlightServer;\r\n use(path: string, middleware: Middleware): FlightServer;\r\n\r\n /** Handle incoming request (Web standard Request/Response) */\r\n handle(request: Request): Promise<Response>;\r\n\r\n /** \r\n * Start the HTTP server\r\n * Auto-detects runtime: Node.js, Bun, or Deno\r\n */\r\n listen(port?: number | ListenOptions): Promise<void>;\r\n\r\n /** Fetch handler for Bun.serve() and Deno.serve() */\r\n fetch(request: Request): Promise<Response>;\r\n\r\n /** Get the resolved configuration */\r\n readonly config: FlightConfig;\r\n\r\n /** Get the router instance */\r\n readonly router: Router<RouteHandler>;\r\n\r\n /** Get the middleware chain */\r\n readonly middleware: MiddlewareChain;\r\n}\r\n\r\n// ============================================================================\r\n// Runtime Detection\r\n// ============================================================================\r\n\r\ntype Runtime = 'node' | 'bun' | 'deno' | 'unknown';\r\n\r\nfunction detectRuntime(): Runtime {\r\n // @ts-expect-error - Bun global\r\n if (typeof Bun !== 'undefined') return 'bun';\r\n // @ts-expect-error - Deno global \r\n if (typeof Deno !== 'undefined') return 'deno';\r\n if (typeof process !== 'undefined' && process.versions?.node) return 'node';\r\n return 'unknown';\r\n}\r\n\r\n// ============================================================================\r\n// Server Implementation\r\n// ============================================================================\r\n\r\ninterface RouteEntry {\r\n methods: Set<string>;\r\n handler: RouteHandler;\r\n}\r\n\r\n/**\r\n * Create a new Flight server instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/users', async ({ db }) => {\r\n * const users = await db.query('SELECT * FROM users');\r\n * return Response.json(users);\r\n * });\r\n * \r\n * // Works on Node.js, Bun, and Deno!\r\n * server.listen(3000);\r\n * ```\r\n */\r\nexport function createServer(options: ServerOptions = {}): FlightServer {\r\n const config = resolveConfig(options.config ?? {});\r\n const router = createRouter<RouteEntry>();\r\n const middlewareChain = createMiddlewareChain();\r\n\r\n // Store dependencies\r\n const deps = {\r\n db: options.db,\r\n auth: options.auth,\r\n email: options.email,\r\n };\r\n\r\n function addRoute(method: string | string[], path: string, handler: RouteHandler): FlightServer {\r\n const methods = Array.isArray(method) ? method : [method];\r\n const methodSet = new Set(methods.map(m => m.toUpperCase()));\r\n\r\n // Check if route already exists\r\n const existingMatch = router.match(path);\r\n if (existingMatch && existingMatch.route.path === path) {\r\n // Merge methods\r\n for (const m of methodSet) {\r\n existingMatch.route.handler.methods.add(m);\r\n }\r\n existingMatch.route.handler.handler = handler;\r\n } else {\r\n router.add({\r\n path,\r\n handler: { methods: methodSet, handler },\r\n });\r\n }\r\n\r\n return server;\r\n }\r\n\r\n function useMiddleware(\r\n pathOrMiddleware: string | Middleware,\r\n maybeMiddleware?: Middleware\r\n ): FlightServer {\r\n if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\r\n middlewareChain.use(pathOrMiddleware, maybeMiddleware);\r\n } else if (typeof pathOrMiddleware === 'function') {\r\n middlewareChain.use(pathOrMiddleware);\r\n }\r\n return server;\r\n }\r\n\r\n async function handle(request: Request): Promise<Response> {\r\n const url = new URL(request.url);\r\n const method = request.method.toUpperCase();\r\n\r\n // Run middleware\r\n const ctx = createContextFromRequest(request);\r\n await middlewareChain.execute(ctx);\r\n\r\n // If middleware already set a response, return it\r\n if (ctx.responseBody !== undefined) {\r\n return createResponseFromContext(ctx);\r\n }\r\n\r\n // Match route\r\n const match = router.match(url.pathname);\r\n if (!match) {\r\n return new Response('Not Found', { status: 404 });\r\n }\r\n\r\n // Check method\r\n if (!match.route.handler.methods.has(method) && !match.route.handler.methods.has('*')) {\r\n return new Response('Method Not Allowed', { status: 405 });\r\n }\r\n\r\n // Build handler context\r\n const handlerContext: RouteHandlerContext = {\r\n request,\r\n params: match.params,\r\n query: url.searchParams,\r\n url,\r\n locals: ctx.locals,\r\n ...deps,\r\n };\r\n\r\n try {\r\n return await match.route.handler.handler(handlerContext);\r\n } catch (error) {\r\n console.error('Route handler error:', error);\r\n return new Response('Internal Server Error', { status: 500 });\r\n }\r\n }\r\n\r\n /**\r\n * Start the HTTP server\r\n * Auto-detects the runtime and uses the appropriate server\r\n */\r\n async function listen(portOrOptions?: number | ListenOptions): Promise<void> {\r\n const opts: ListenOptions = typeof portOrOptions === 'number'\r\n ? { port: portOrOptions }\r\n : portOrOptions ?? {};\r\n\r\n const port = opts.port ?? config.dev.port ?? 3000;\r\n const hostname = opts.hostname ?? 'localhost';\r\n\r\n // Check for custom adapter first\r\n const adapter = options.adapter ?? config.adapter;\r\n if (adapter?.listen) {\r\n await adapter.listen(server, port);\r\n return;\r\n }\r\n\r\n const runtime = detectRuntime();\r\n\r\n switch (runtime) {\r\n case 'bun':\r\n await startBunServer(port, hostname, opts.onListen);\r\n break;\r\n case 'deno':\r\n await startDenoServer(port, hostname, opts.onListen);\r\n break;\r\n case 'node':\r\n default:\r\n await startNodeServer(port, hostname, opts.onListen);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Start Node.js HTTP server\r\n */\r\n async function startNodeServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n const httpServer = createHttpServer(async (req, res) => {\r\n const url = new URL(req.url || '/', `http://${hostname}:${port}`);\r\n\r\n // Build headers\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n const headerValue = Array.isArray(value) ? value[0] : value;\r\n if (headerValue) headers.set(key, headerValue);\r\n }\r\n }\r\n\r\n // Read body for POST/PUT/PATCH\r\n let body: string | undefined;\r\n if (['POST', 'PUT', 'PATCH'].includes(req.method || '')) {\r\n body = await new Promise<string>((resolve) => {\r\n let data = '';\r\n req.on('data', chunk => data += chunk);\r\n req.on('end', () => resolve(data));\r\n });\r\n }\r\n\r\n const request = new Request(url.toString(), {\r\n method: req.method,\r\n headers,\r\n body: body || undefined,\r\n });\r\n\r\n try {\r\n const response = await handle(request);\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value, key) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const responseBody = await response.text();\r\n res.end(responseBody);\r\n } catch (error) {\r\n console.error('Server error:', error);\r\n res.statusCode = 500;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\r\n }\r\n });\r\n\r\n return new Promise((resolve) => {\r\n httpServer.listen(port, hostname, () => {\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Node.js) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Start Bun server\r\n */\r\n async function startBunServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Bun types\r\n Bun.serve({\r\n port,\r\n hostname,\r\n fetch: handle,\r\n });\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Bun) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n /**\r\n * Start Deno server\r\n */\r\n async function startDenoServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Deno types\r\n Deno.serve({ port, hostname }, handle);\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Deno) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n const server: FlightServer = {\r\n route: addRoute,\r\n get: (path, handler) => addRoute('GET', path, handler),\r\n post: (path, handler) => addRoute('POST', path, handler),\r\n put: (path, handler) => addRoute('PUT', path, handler),\r\n delete: (path, handler) => addRoute('DELETE', path, handler),\r\n patch: (path, handler) => addRoute('PATCH', path, handler),\r\n use: useMiddleware as FlightServer['use'],\r\n handle,\r\n listen,\r\n fetch: handle, // Alias for Bun/Deno compatibility\r\n get config() { return config; },\r\n get router() { return router as unknown as Router<RouteHandler>; },\r\n get middleware() { return middlewareChain; },\r\n };\r\n\r\n return server;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Exports\r\n// ============================================================================\r\n\r\n/** Type guard to check if an object is a FlightServer */\r\nexport function isFlightServer(obj: unknown): obj is FlightServer {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'handle' in obj &&\r\n 'route' in obj &&\r\n typeof (obj as FlightServer).handle === 'function'\r\n );\r\n}\r\n\r\n/** Get current runtime */\r\nexport function getRuntime(): Runtime {\r\n return detectRuntime();\r\n}\r\n\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/streaming/index.ts"],"names":[],"mappings":"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","file":"chunk-RSVA2EYO.js","sourcesContent":["/**\r\n * @flight-framework/core - Streaming SSR\r\n * \r\n * Full streaming server-side rendering implementation following React 18+/19 patterns.\r\n * Supports both Node.js (renderToPipeableStream) and Edge (renderToReadableStream) environments.\r\n * \r\n * Best Practices 2025/2026:\r\n * - Progressive HTML streaming with Suspense boundaries\r\n * - Shell-first rendering for fast TTFB\r\n * - Nested Suspense for granular loading states\r\n * - Error boundaries for graceful degradation\r\n * - Web Streams API for Edge runtime compatibility\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Streaming render options following React's conventions\r\n */\r\nexport interface StreamingRenderOptions {\r\n /** Bootstrap scripts to load on client */\r\n bootstrapScripts?: string[];\r\n /** Bootstrap ES modules */\r\n bootstrapModules?: string[];\r\n /** Inline script content */\r\n bootstrapScriptContent?: string;\r\n /** Prefix for React IDs (useId) */\r\n identifierPrefix?: string;\r\n /** Nonce for CSP */\r\n nonce?: string;\r\n /** Callback when shell is ready (main content before Suspense) */\r\n onShellReady?: () => void;\r\n /** Callback when shell errors */\r\n onShellError?: (error: Error) => void;\r\n /** Callback when all content is ready */\r\n onAllReady?: () => void;\r\n /** Callback for any error */\r\n onError?: (error: Error) => void;\r\n /** Timeout before aborting stream */\r\n timeoutMs?: number;\r\n /** Progressive hydration enabled */\r\n progressiveHydration?: boolean;\r\n}\r\n\r\n/**\r\n * Streaming render result\r\n */\r\nexport interface StreamingRenderResult {\r\n /** The readable stream to pipe to response */\r\n stream: ReadableStream<Uint8Array>;\r\n /** Abort the stream */\r\n abort: () => void;\r\n /** Promise that resolves when shell is ready */\r\n shellReady: Promise<void>;\r\n /** Promise that resolves when all content is ready */\r\n allReady: Promise<void>;\r\n}\r\n\r\n/**\r\n * Suspense boundary configuration\r\n */\r\nexport interface SuspenseBoundaryConfig {\r\n /** Unique ID for this boundary */\r\n id: string;\r\n /** Fallback HTML to show while loading */\r\n fallback: string;\r\n /** Content resolver promise */\r\n contentPromise: Promise<string>;\r\n /** \r\n * IDs of boundaries that must resolve before this one.\r\n * Enables dependency-aware streaming for complex data relationships.\r\n * @example ['user'] - Wait for 'user' boundary before starting\r\n */\r\n dependsOn?: string[];\r\n /** Custom metadata for observability */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Renderer\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming SSR response using Web Streams API.\r\n * Compatible with Edge Runtime (Cloudflare, Vercel Edge, Deno).\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = await createStreamingSSR({\r\n * shell: '<html><body><div id=\"root\">',\r\n * shellEnd: '</div></body></html>',\r\n * suspenseBoundaries: [\r\n * {\r\n * id: 'posts',\r\n * fallback: '<div>Loading posts...</div>',\r\n * contentPromise: fetchAndRenderPosts(),\r\n * }\r\n * ],\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return new Response(result.stream, {\r\n * headers: { 'Content-Type': 'text/html' },\r\n * });\r\n * ```\r\n */\r\nexport async function createStreamingSSR(config: {\r\n /** Initial HTML shell (before suspense content) */\r\n shell: string;\r\n /** Closing HTML shell */\r\n shellEnd: string;\r\n /** Suspense boundaries with async content */\r\n suspenseBoundaries?: SuspenseBoundaryConfig[];\r\n /** Streaming options */\r\n options?: StreamingRenderOptions;\r\n}): Promise<StreamingRenderResult> {\r\n const { shell, shellEnd, suspenseBoundaries = [], options = {} } = config;\r\n\r\n let shellResolved = false;\r\n let allResolved = false;\r\n let abortController: AbortController | null = null;\r\n\r\n // Shell ready promise\r\n let resolveShell: () => void;\r\n const shellReady = new Promise<void>((resolve) => {\r\n resolveShell = resolve;\r\n });\r\n\r\n // All ready promise\r\n let resolveAll: () => void;\r\n const allReady = new Promise<void>((resolve) => {\r\n resolveAll = resolve;\r\n });\r\n\r\n const encoder = new TextEncoder();\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n try {\r\n // 1. Send the shell immediately (fast TTFB)\r\n const shellWithPlaceholders = buildShellWithPlaceholders(\r\n shell,\r\n suspenseBoundaries,\r\n shellEnd,\r\n options\r\n );\r\n\r\n controller.enqueue(encoder.encode(shellWithPlaceholders));\r\n\r\n shellResolved = true;\r\n options.onShellReady?.();\r\n resolveShell!();\r\n\r\n // 2. Stream Suspense boundary contents as they resolve\r\n if (suspenseBoundaries.length > 0) {\r\n await streamSuspenseContent(controller, encoder, suspenseBoundaries, options);\r\n }\r\n\r\n // 3. Send hydration script if needed\r\n if (options.bootstrapScripts?.length || options.bootstrapModules?.length) {\r\n const hydrationScript = buildHydrationScript(options);\r\n controller.enqueue(encoder.encode(hydrationScript));\r\n }\r\n\r\n allResolved = true;\r\n options.onAllReady?.();\r\n resolveAll!();\r\n\r\n controller.close();\r\n } catch (error) {\r\n if (!shellResolved) {\r\n options.onShellError?.(error as Error);\r\n }\r\n options.onError?.(error as Error);\r\n controller.error(error);\r\n }\r\n },\r\n\r\n cancel() {\r\n abortController?.abort();\r\n },\r\n });\r\n\r\n const abort = () => {\r\n abortController?.abort();\r\n };\r\n\r\n // Timeout handling\r\n if (options.timeoutMs) {\r\n abortController = new AbortController();\r\n setTimeout(() => {\r\n if (!allResolved) {\r\n abort();\r\n }\r\n }, options.timeoutMs);\r\n }\r\n\r\n return {\r\n stream,\r\n abort,\r\n shellReady,\r\n allReady,\r\n };\r\n}\r\n\r\n/**\r\n * Build shell HTML with Suspense placeholders\r\n */\r\nfunction buildShellWithPlaceholders(\r\n shell: string,\r\n boundaries: SuspenseBoundaryConfig[],\r\n shellEnd: string,\r\n options: StreamingRenderOptions\r\n): string {\r\n let html = shell;\r\n\r\n // Add inline bootstrap script if provided\r\n if (options.bootstrapScriptContent) {\r\n html += `<script>${options.bootstrapScriptContent}</script>`;\r\n }\r\n\r\n // Add Suspense fallbacks with placeholder markers\r\n for (const boundary of boundaries) {\r\n html += `\r\n<!--$?--><template id=\"B:${boundary.id}\"></template>\r\n${boundary.fallback}\r\n<!--/$-->`;\r\n }\r\n\r\n html += shellEnd;\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * Stream Suspense content as promises resolve\r\n */\r\nasync function streamSuspenseContent(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n boundaries: SuspenseBoundaryConfig[],\r\n options: StreamingRenderOptions\r\n): Promise<void> {\r\n // Race all boundaries - stream each as it completes\r\n const pending = boundaries.map(async (boundary) => {\r\n try {\r\n const content = await boundary.contentPromise;\r\n return { boundary, content, error: null };\r\n } catch (error) {\r\n return { boundary, content: null, error: error as Error };\r\n }\r\n });\r\n\r\n // Process as each resolves\r\n const results = await Promise.allSettled(pending);\r\n\r\n for (const result of results) {\r\n if (result.status === 'fulfilled') {\r\n const { boundary, content, error } = result.value;\r\n\r\n if (error) {\r\n // Send error replacement\r\n const errorScript = buildErrorReplacement(boundary.id, error.message);\r\n controller.enqueue(encoder.encode(errorScript));\r\n options.onError?.(error);\r\n } else if (content) {\r\n // Send content replacement script\r\n const replacementScript = buildContentReplacement(boundary.id, content);\r\n controller.enqueue(encoder.encode(replacementScript));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Build script to replace Suspense placeholder with actual content\r\n * This follows React's streaming hydration pattern\r\n */\r\nfunction buildContentReplacement(id: string, content: string): string {\r\n // Escape script-breaking characters\r\n const escaped = content\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/\\n/g, '\\\\n')\r\n .replace(/\\r/g, '\\\\r');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var p=b.previousSibling;\r\n while(p&&p.nodeType===8&&p.data===\"$?\")p=p.previousSibling;\r\n var n=b.nextSibling;\r\n var f=document.createDocumentFragment();\r\n var t=document.createElement(\"template\");\r\n t.innerHTML=\"${escaped}\";\r\n while(t.content.firstChild)f.appendChild(t.content.firstChild);\r\n if(n&&n.nodeType===8&&n.data===\"/$\"){\r\n var s=n.nextSibling;\r\n while(s&&s!==b){var x=s.nextSibling;s.parentNode.removeChild(s);s=x;}\r\n }\r\n b.parentNode.replaceChild(f,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build script to show error in place of Suspense content\r\n */\r\nfunction buildErrorReplacement(id: string, message: string): string {\r\n const escaped = message.replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var t=document.createElement(\"div\");\r\n t.className=\"streaming-error\";\r\n t.textContent=\"Error: ${escaped}\";\r\n b.parentNode.replaceChild(t,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build hydration bootstrap script\r\n */\r\nfunction buildHydrationScript(options: StreamingRenderOptions): string {\r\n let scripts = '';\r\n\r\n if (options.bootstrapScripts?.length) {\r\n for (const src of options.bootstrapScripts) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script src=\"${src}\"${nonceAttr} async></script>`;\r\n }\r\n }\r\n\r\n if (options.bootstrapModules?.length) {\r\n for (const src of options.bootstrapModules) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script type=\"module\" src=\"${src}\"${nonceAttr}></script>`;\r\n }\r\n }\r\n\r\n return scripts;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming HTML Response object\r\n */\r\nexport function createStreamingResponse(\r\n stream: ReadableStream<Uint8Array>,\r\n options: {\r\n status?: number;\r\n headers?: Record<string, string>;\r\n } = {}\r\n): Response {\r\n return new Response(stream, {\r\n status: options.status || 200,\r\n headers: {\r\n 'Content-Type': 'text/html; charset=utf-8',\r\n 'Transfer-Encoding': 'chunked',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...options.headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Higher-level API: Render page with Suspense boundaries\r\n * \r\n * @example\r\n * ```typescript\r\n * return renderWithStreaming({\r\n * layout: ({ children }) => `\r\n * <html>\r\n * <head><title>My App</title></head>\r\n * <body><div id=\"root\">${children}</div></body>\r\n * </html>\r\n * `,\r\n * page: async () => '<h1>Welcome</h1>',\r\n * suspense: {\r\n * posts: {\r\n * fallback: '<div class=\"skeleton\">Loading...</div>',\r\n * content: fetchPosts().then(renderPosts),\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function renderWithStreaming(config: {\r\n /** Layout wrapper */\r\n layout: (props: { children: string }) => string;\r\n /** Main page content (sync part) */\r\n page: () => string | Promise<string>;\r\n /** Suspense boundaries keyed by ID */\r\n suspense?: Record<string, { fallback: string; content: Promise<string> }>;\r\n /** Bootstrap scripts */\r\n bootstrapScripts?: string[];\r\n /** Timeout in ms */\r\n timeoutMs?: number;\r\n}): Promise<Response> {\r\n const { layout, page, suspense = {}, bootstrapScripts, timeoutMs } = config;\r\n\r\n // Get synchronous page content\r\n const pageContent = await page();\r\n\r\n // Build suspense boundaries\r\n const boundaries: SuspenseBoundaryConfig[] = Object.entries(suspense).map(\r\n ([id, { fallback, content }]) => ({\r\n id,\r\n fallback,\r\n contentPromise: content,\r\n })\r\n );\r\n\r\n // Create streaming result\r\n const result = await createStreamingSSR({\r\n shell: layout({ children: pageContent }),\r\n shellEnd: '',\r\n suspenseBoundaries: boundaries,\r\n options: {\r\n bootstrapScripts,\r\n timeoutMs,\r\n },\r\n });\r\n\r\n return createStreamingResponse(result.stream);\r\n}\r\n\r\n// ============================================================================\r\n// Progressive Rendering Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a lazy component that streams its content\r\n */\r\nexport function createLazyContent<T>(\r\n fetcher: () => Promise<T>,\r\n renderer: (data: T) => string,\r\n fallback: string\r\n): { fallback: string; content: Promise<string> } {\r\n return {\r\n fallback,\r\n content: fetcher().then(renderer),\r\n };\r\n}\r\n\r\n/**\r\n * Parallel streaming: resolve multiple boundaries simultaneously\r\n */\r\nexport async function streamParallel(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n return boundaries.map((b) => ({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n }));\r\n}\r\n\r\n/**\r\n * Sequential streaming: resolve boundaries in order\r\n */\r\nexport async function streamSequential(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n const result: SuspenseBoundaryConfig[] = [];\r\n\r\n for (const b of boundaries) {\r\n result.push({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Export for use with React\r\n// ============================================================================\r\n\r\n/**\r\n * NOTE: For React-specific streaming with renderToPipeableStream or \r\n * renderToReadableStream, use the dedicated React adapter:\r\n * \r\n * ```typescript\r\n * import { renderToReadableStream } from 'react-dom/server';\r\n * import { createStreamingResponse } from '@flight-framework/core/streaming';\r\n * \r\n * const stream = await renderToReadableStream(<App />, {\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return createStreamingResponse(stream);\r\n * ```\r\n * \r\n * This module provides framework-agnostic streaming primitives that work\r\n * with any UI library or custom HTML generation.\r\n */\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/index.ts"],"names":[],"mappings":";AA2IO,SAAS,cAAc,OAAA,EAAwC;AAClE,EAAA,OAAO;AAAA,IACH,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAU,OAAA,CAAQ;AAAA,GACtB;AACJ","file":"chunk-SUILH4ID.js","sourcesContent":["/**\r\n * Flight Adapters - Universal deployment adapters\r\n * \r\n * Adapters transform Flight's output for different deployment targets.\r\n * The user chooses where to deploy - Flight provides the adapters.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Build manifest containing all generated assets */\r\nexport interface BuildManifest {\r\n /** Entry points by name */\r\n entries: Record<string, string>;\r\n /** All generated files */\r\n files: string[];\r\n /** Route information */\r\n routes: RouteManifestEntry[];\r\n /** Server entry point (if applicable) */\r\n serverEntry?: string;\r\n /** Client entry point */\r\n clientEntry?: string;\r\n}\r\n\r\n/** Route information in manifest */\r\nexport interface RouteManifestEntry {\r\n /** Route path pattern */\r\n path: string;\r\n /** Render mode for this route */\r\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n /** Component/handler file path */\r\n component: string;\r\n /** Pre-rendered paths (for SSG/ISR) */\r\n prerendered?: string[];\r\n}\r\n\r\n/** Builder utilities passed to adapters */\r\nexport interface AdapterBuilder {\r\n /** Build manifest */\r\n manifest: BuildManifest;\r\n /** Project root directory */\r\n root: string;\r\n /** Build output directory */\r\n outDir: string;\r\n\r\n /** Read a file from the build output */\r\n readFile(path: string): Promise<string>;\r\n /** Write a file to the adapter output */\r\n writeFile(path: string, content: string): Promise<void>;\r\n /** Copy files from build to adapter output */\r\n copy(from: string, to: string): Promise<void>;\r\n /** Get all files matching a pattern */\r\n glob(pattern: string): Promise<string[]>;\r\n /** Compress files for production */\r\n compress?(files: string[]): Promise<void>;\r\n\r\n /** Log info message */\r\n log: {\r\n info(message: string): void;\r\n warn(message: string): void;\r\n error(message: string): void;\r\n };\r\n}\r\n\r\n/** Flight adapter interface */\r\nexport interface FlightAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** \r\n * Transform the build output for the target platform\r\n * This is called after Flight's build process completes\r\n */\r\n adapt(builder: AdapterBuilder): Promise<void>;\r\n\r\n /**\r\n * Optional: Start listening for requests (for Node.js/Bun adapters)\r\n */\r\n listen?(server: unknown, port: number): Promise<void>;\r\n\r\n /**\r\n * Optional: Emulate the platform during development\r\n * Useful for testing platform-specific behavior locally\r\n */\r\n emulate?(): {\r\n /** Platform-specific env vars */\r\n env?: Record<string, string>;\r\n /** Custom middleware for dev server */\r\n middleware?: unknown[];\r\n };\r\n\r\n /**\r\n * Optional: Declare what this adapter supports\r\n * Flight uses this to warn about incompatible features\r\n */\r\n supports?: {\r\n /** Can read files at runtime (for dynamic content) */\r\n read?: () => boolean;\r\n /** Supports streaming responses */\r\n streaming?: () => boolean;\r\n /** Supports WebSockets */\r\n websockets?: () => boolean;\r\n /** Supports edge runtime */\r\n edge?: () => boolean;\r\n /** Supports Node.js runtime */\r\n node?: () => boolean;\r\n };\r\n}\r\n\r\n\r\n// ============================================================================\r\n// Adapter Factory Helper\r\n// ============================================================================\r\n\r\nexport interface AdapterOptions {\r\n name: string;\r\n adapt: (builder: AdapterBuilder) => Promise<void>;\r\n emulate?: FlightAdapter['emulate'];\r\n supports?: FlightAdapter['supports'];\r\n}\r\n\r\n/**\r\n * Create a Flight adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createAdapter } from '@flight-framework/core/adapters';\r\n * \r\n * export default function myAdapter(options = {}) {\r\n * return createAdapter({\r\n * name: 'my-adapter',\r\n * async adapt(builder) {\r\n * // Transform build output for your platform\r\n * },\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport function createAdapter(options: AdapterOptions): FlightAdapter {\r\n return {\r\n name: options.name,\r\n adapt: options.adapt,\r\n emulate: options.emulate,\r\n supports: options.supports,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Agnostic Service Adapters (Interfaces)\r\n// ============================================================================\r\n\r\n/**\r\n * Storage Adapter Interface\r\n * \r\n * Implement this to use any storage provider:\r\n * S3, Supabase Storage, Cloudflare R2, local filesystem, etc.\r\n */\r\nexport interface StorageAdapter {\r\n name: string;\r\n\r\n /** Upload a file */\r\n upload(path: string, data: Buffer | Uint8Array | string, options?: {\r\n contentType?: string;\r\n metadata?: Record<string, string>;\r\n }): Promise<{ url: string; path: string }>;\r\n\r\n /** Download a file */\r\n download(path: string): Promise<Buffer>;\r\n\r\n /** Delete a file */\r\n delete(path: string): Promise<void>;\r\n\r\n /** List files with optional prefix */\r\n list(prefix?: string): Promise<string[]>;\r\n\r\n /** Get a signed URL for direct access */\r\n getSignedUrl?(path: string, options?: {\r\n expiresIn?: number;\r\n operation?: 'read' | 'write';\r\n }): Promise<string>;\r\n}\r\n\r\n/**\r\n * Auth Adapter Interface\r\n * \r\n * Implement this to use any auth provider:\r\n * Better Auth, Supabase Auth, Lucia, Auth.js, etc.\r\n */\r\nexport interface AuthAdapter {\r\n name: string;\r\n\r\n /** Get the current user from a request */\r\n getUser(request: Request): Promise<AuthUser | null>;\r\n\r\n /** Verify a session token */\r\n verifySession(token: string): Promise<AuthSession | null>;\r\n\r\n /** Optional middleware for handling auth-specific routes (e.g., /api/auth/*) */\r\n middleware?: (req: Request) => Promise<Response | null>;\r\n}\r\n\r\nexport interface AuthUser {\r\n id: string;\r\n email?: string;\r\n name?: string;\r\n avatar?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface AuthSession {\r\n user: AuthUser;\r\n expiresAt: Date;\r\n token: string;\r\n}\r\n\r\n/**\r\n * Email Adapter Interface\r\n * \r\n * Implement this to use any email provider:\r\n * Resend, SendGrid, Postmark, SMTP, etc.\r\n */\r\nexport interface EmailAdapter {\r\n name: string;\r\n\r\n /** Send an email */\r\n send(options: {\r\n to: string | string[];\r\n subject: string;\r\n html?: string;\r\n text?: string;\r\n from?: string;\r\n replyTo?: string;\r\n attachments?: Array<{\r\n filename: string;\r\n content: Buffer | string;\r\n contentType?: string;\r\n }>;\r\n }): Promise<{ id: string; success: boolean }>;\r\n}\r\n\r\n/**\r\n * Queue/Jobs Adapter Interface\r\n * \r\n * Implement this to use any job queue:\r\n * BullMQ, Quirrel, Inngest, custom, etc.\r\n */\r\nexport interface JobsAdapter {\r\n name: string;\r\n\r\n /** Add a job to the queue */\r\n enqueue<T>(jobName: string, data: T, options?: {\r\n delay?: number;\r\n priority?: number;\r\n retries?: number;\r\n }): Promise<{ id: string }>;\r\n\r\n /** Schedule a recurring job */\r\n schedule?(jobName: string, cron: string, data?: unknown): Promise<{ id: string }>;\r\n\r\n /** Cancel a job */\r\n cancel?(jobId: string): Promise<void>;\r\n}\r\n\r\n/**\r\n * Database Adapter Interface\r\n * \r\n * Note: This is intentionally minimal. \r\n * For databases, use your preferred ORM/query builder directly.\r\n * This interface is for Flight's internal use (sessions, cache, etc.)\r\n */\r\nexport interface DatabaseAdapter {\r\n name: string;\r\n\r\n /** Raw query execution */\r\n query<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;\r\n\r\n /** Execute a mutation */\r\n execute(sql: string, params?: unknown[]): Promise<{ rowsAffected: number }>;\r\n\r\n /** Transaction support */\r\n transaction?<T>(fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T>;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/plugins/esbuild.ts"],"names":["exports"],"mappings":"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","file":"chunk-T4Z4HM4W.js","sourcesContent":["/**\r\n * @flight-framework/core - esbuild Plugin for RSC\r\n * \r\n * esbuild plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - esbuild is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/esbuild\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * esbuild Plugin interface (minimal)\r\n * We define our own to avoid requiring esbuild as dependency\r\n */\r\nexport interface EsbuildPlugin {\r\n name: string;\r\n setup: (build: EsbuildBuild) => void | Promise<void>;\r\n}\r\n\r\nexport interface EsbuildBuild {\r\n initialOptions: EsbuildBuildOptions;\r\n onStart: (callback: () => void | Promise<void>) => void;\r\n onEnd: (callback: (result: EsbuildResult) => void | Promise<void>) => void;\r\n onResolve: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildResolveArgs) => EsbuildResolveResult | null | undefined | Promise<EsbuildResolveResult | null | undefined>\r\n ) => void;\r\n onLoad: (\r\n options: { filter: RegExp; namespace?: string },\r\n callback: (args: EsbuildLoadArgs) => EsbuildLoadResult | null | undefined | Promise<EsbuildLoadResult | null | undefined>\r\n ) => void;\r\n}\r\n\r\nexport interface EsbuildBuildOptions {\r\n outdir?: string;\r\n write?: boolean;\r\n metafile?: boolean;\r\n}\r\n\r\nexport interface EsbuildResult {\r\n errors: unknown[];\r\n warnings: unknown[];\r\n metafile?: unknown;\r\n}\r\n\r\nexport interface EsbuildResolveArgs {\r\n path: string;\r\n importer: string;\r\n namespace: string;\r\n resolveDir: string;\r\n kind: string;\r\n}\r\n\r\nexport interface EsbuildResolveResult {\r\n path?: string;\r\n external?: boolean;\r\n namespace?: string;\r\n suffix?: string;\r\n pluginData?: unknown;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\nexport interface EsbuildLoadArgs {\r\n path: string;\r\n namespace: string;\r\n suffix: string;\r\n pluginData: unknown;\r\n}\r\n\r\nexport interface EsbuildLoadResult {\r\n contents?: string;\r\n loader?: 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'text' | 'css';\r\n resolveDir?: string;\r\n errors?: unknown[];\r\n warnings?: unknown[];\r\n watchFiles?: string[];\r\n watchDirs?: string[];\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightEsbuildPluginOptions {\r\n /** Include patterns (regex) */\r\n include?: RegExp;\r\n\r\n /** Exclude patterns (regex) */\r\n exclude?: RegExp;\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Output directory for manifests */\r\n manifestDir?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n isSSR: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC esbuild Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // build.js\r\n * import * as esbuild from 'esbuild';\r\n * import { flightRSCEsbuild } from '@flight-framework/core/rsc/plugins/esbuild';\r\n * \r\n * await esbuild.build({\r\n * entryPoints: ['src/index.tsx'],\r\n * bundle: true,\r\n * outdir: 'dist',\r\n * plugins: [\r\n * flightRSCEsbuild({\r\n * actionsEndpoint: '/_flight/action',\r\n * ssr: true,\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function flightRSCEsbuild(options: FlightEsbuildPluginOptions = {}): EsbuildPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n manifestDir = '.flight',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n isSSR: ssr,\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n setup(build) {\r\n const outdir = build.initialOptions.outdir || 'dist';\r\n\r\n // ============================================================\r\n // onStart: Reset state\r\n // ============================================================\r\n build.onStart(() => {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n });\r\n\r\n // ============================================================\r\n // onLoad: Transform client/server modules\r\n // ============================================================\r\n build.onLoad({ filter: include }, async (args) => {\r\n // Skip excluded\r\n if (exclude.test(args.path)) {\r\n return null;\r\n }\r\n\r\n // Read file\r\n const fs = await import('fs/promises');\r\n const code = await fs.readFile(args.path, 'utf-8');\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, args.path);\r\n const moduleId = createModuleId(args.path);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(args.path, {\r\n id: moduleId,\r\n file: args.path,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(args.path, {\r\n id: moduleId,\r\n file: args.path,\r\n exports: analysis.serverActions,\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n contents: transformClientForSSR(code, moduleId),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n contents: transformServerForClient(code, moduleId, actionsEndpoint),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n loader: getLoader(args.path),\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n });\r\n\r\n // ============================================================\r\n // onEnd: Write manifests\r\n // ============================================================\r\n build.onEnd(async () => {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n\r\n const manifestPath = path.join(outdir, manifestDir);\r\n\r\n // Ensure directory exists\r\n await fs.mkdir(manifestPath, { recursive: true });\r\n\r\n // Write client manifest\r\n if (state.clientModules.size > 0) {\r\n const clientManifest = Object.fromEntries(state.clientModules);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'client-manifest.json'),\r\n JSON.stringify(clientManifest, null, 2)\r\n );\r\n }\r\n\r\n // Write server manifest\r\n if (state.serverActions.size > 0) {\r\n const serverManifest = Object.fromEntries(state.serverActions);\r\n await fs.writeFile(\r\n path.join(manifestPath, 'server-manifest.json'),\r\n JSON.stringify(serverManifest, null, 2)\r\n );\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);\r\n }\r\n });\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (esbuild)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (esbuild)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper at the top (after any imports)\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers\r\nconst __flight_endpoint_inline = ${JSON.stringify(endpoint)};\r\nasync function __flight_rpc_inline(actionId, args) {\r\n const response = await fetch(__flight_endpoint_inline, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Find last import statement\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform each action function\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n // Replace async function with RPC call\r\n // This is simplified - production would use proper AST transformation\r\n const patterns = [\r\n // async function name() { 'use server'; ... }\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n // const name = async () => { 'use server'; ... }\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_rpc_inline(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n // Normalize and create relative path\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n // Remove common prefixes\r\n const prefixes = ['/src/', 'src/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx + prefix.length);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Get esbuild loader from file extension\r\n */\r\nfunction getLoader(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' {\r\n if (filePath.endsWith('.tsx')) return 'tsx';\r\n if (filePath.endsWith('.ts')) return 'ts';\r\n if (filePath.endsWith('.jsx')) return 'jsx';\r\n return 'js';\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n // export default\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n // export function/const/let/class Name\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n // export { a, b, c }\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCEsbuild;\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/adapters/react.ts"],"names":[],"mappings":";AAgBA,IAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AACrD,IAAM,mBAAA,mBAAsB,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA;AACvD,IAAM,mBAAA,mBAAsB,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA;AACvD,IAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AACrD,IAAM,sBAAA,mBAAyB,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA;AAC7D,IAAM,mBAAA,mBAAsB,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA;AACvD,IAAM,eAAA,mBAAkB,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAC/C,IAAM,eAAA,mBAAkB,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAG/C,IAAM,gBAAA,mBAAmB,MAAA,CAAO,GAAA,CAAI,yBAAyB,CAAA;AAuCtD,SAAS,mBAAmB,IAAA,EAUrB;AACV,EAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAe,GAAI,QAAQ,EAAC;AAE3C,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,OAAA;AAAA,IAEN,UAAU,KAAA,EAAyB;AAC/B,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,OAAO,KAAA,CAAM,eAAe,KAAK,CAAA;AAAA,MACrC;AAEA,MAAA,OACI,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,UAAA,IAAc,KAAA,IACb,MAAuB,QAAA,KAAa,kBAAA;AAAA,IAE7C,CAAA;AAAA,IAEA,eAAe,OAAA,EAAmC;AAC9C,MAAA,MAAM,EAAA,GAAK,OAAA;AACX,MAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAGhB,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAK;AAAA,MACrC;AAGA,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,QAAA,IAAI,IAAA,KAAS,mBAAA,IAAuB,IAAA,KAAU,KAAA,EAAO,QAAA,EAAqB;AACtE,UAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,QAC9B;AACA,QAAA,IAAI,SAAS,mBAAA,IAAwB,KAAA,EAAO,QAAA,IAAY,IAAA,KAAU,MAAM,QAAA,EAAiC;AACrG,UAAA,OAAO;AAAA,YACH,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,GAAG,KAAA,CAAM;AAAA,WACvB;AAAA,QACJ;AACA,QAAA,IAAI,SAAS,mBAAA,EAAqB;AAC9B,UAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,EAAA,CAAG,MAAM,KAAA,EAAM;AAAA,QACrD;AACA,QAAA,IAAI,SAAS,kBAAA,EAAoB;AAC7B,UAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,QAC7B;AACA,QAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,MAC1B;AAGA,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC3C,QAAA,MAAM,OAAA,GAAU,IAAA;AAEhB,QAAA,IAAI,OAAA,CAAQ,aAAa,eAAA,EAAiB;AAEtC,UAAA,OAAO,IAAA,CAAK,eAAe,EAAE,GAAG,IAAI,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,QAC5D;AAEA,QAAA,IAAI,OAAA,CAAQ,aAAa,eAAA,EAAiB;AACtC,UAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,IAAI,MAAM,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,QAC7D;AAEA,QAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,sBAAA,IAA0B,OAAA,CAAQ,MAAA,EAAQ;AAC/D,UAAA,OAAO;AAAA,YACH,IAAA,EAAM,WAAA;AAAA,YACN,IAAI,OAAA,CAAQ,MAAA;AAAA,YACZ,IAAA,EAAM;AAAA,WACV;AAAA,QACJ;AAGA,QAAA,IAAI,UAAA,IAAc,OAAA,IACb,OAAA,CAAQ,QAAA,KAAa,mBAAA,EAAsB;AAC5C,UAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,EAAA,CAAG,MAAM,QAAA,EAAS;AAAA,QAC3D;AAAA,MACJ;AAGA,MAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC5B,QAAA,MAAM,EAAA,GAAK,IAAA;AAIX,QAAA,OAAO;AAAA,UACH,IAAA,EAAM,WAAA;AAAA,UACN,EAAA;AAAA,UACA,IAAA,EAAM,EAAA,CAAG,WAAA,IAAe,EAAA,CAAG,IAAA,IAAQ;AAAA,SACvC;AAAA,MACJ;AAEA,MAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,IAC1B,CAAA;AAAA,IAEA,SAAS,OAAA,EAA2C;AAChD,MAAA,OAAQ,OAAA,CAAyB,SAAS,EAAC;AAAA,IAC/C,CAAA;AAAA,IAEA,YAAY,OAAA,EAA6B;AACrC,MAAA,MAAM,QAAS,OAAA,CAAyB,KAAA;AACxC,MAAA,MAAM,WAAW,KAAA,EAAO,QAAA;AAExB,MAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,EAAM;AAC7C,QAAA,OAAO,EAAC;AAAA,MACZ;AAEA,MAAA,IAAI,OAAO,QAAA,EAAU;AACjB,QAAA,OAAO,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC1C;AAGA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACzB,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACzB;AAEA,MAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,OAAO,OAAA,EAA+C;AAClD,MAAA,MAAM,MAAO,OAAA,CAAyB,GAAA;AACtC,MAAA,OAAO,GAAA,KAAQ,OAAO,GAAA,GAAM,MAAA;AAAA,IAChC,CAAA;AAAA,IAEA,iBAAiB,SAAA,EAA6B;AAC1C,MAAA,IAAI,OAAO,SAAA,KAAc,UAAA,EAAY,OAAO,KAAA;AAE5C,MAAA,MAAM,IAAA,GAAO,SAAA;AAMb,MAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,IAAA,EAAM,OAAO,IAAA;AAG1C,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,gBAAA,EAAkB,OAAO,IAAA;AAE/C,MAAA,OAAO,KAAA;AAAA,IACX,CAAA;AAAA,IAEA,aAAA,CACI,WACA,KAAA,EACO;AAGP,MAAA,OAAO;AAAA,QACH,QAAA,EAAU,kBAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,GAAA,EAAK,IAAA;AAAA,QACL,GAAA,EAAK,IAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACZ;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,eAAe,OAAA,EAAmC;AACpD,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,OAAO,eAAe,OAAO,CAAA;AAAA,MACjC;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OAEJ;AAAA,IACJ;AAAA,GACJ;AACJ;AAqBO,SAAS,mBAAA,CAAoB,IAAA,EAOjC,OAAA,GAAgC,EAAC,EAAG;AACnC,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,EAAE,QAAA,mBAAW,IAAI,GAAA,IAAM,GAAI,OAAA;AAEjC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIH,QAAA,CAAS,IAAY,MAAA,EAAsC;AACvD,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AAAA,IAC3B,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,eAAe,OAAA,EAAyD;AACpE,MAAA,QAAQ,QAAQ,MAAA;AAAQ,QACpB,KAAK,MAAA;AACD,UAAA,OAAO,IAAA;AAAA,QAEX,KAAK,MAAA;AACD,UAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,QAEnB,KAAK,MAAA,EAAQ;AACT,UAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,CAAS,GAAA,CAAI,OAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AACjE,UAAA,OAAO,KAAA,CAAM,aAAA;AAAA,YACT,OAAA,CAAQ,GAAA;AAAA,YACR,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,YACrC,GAAG;AAAA,WACP;AAAA,QACJ;AAAA,QAEA,KAAK,UAAA,EAAY;AACb,UAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,CAAS,GAAA,CAAI,OAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AACjE,UAAA,OAAO,MAAM,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,GAAG,QAAQ,CAAA;AAAA,QAChE;AAAA,QAEA,KAAK,UAAA,EAAY;AACb,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AACrD,UAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,CAAS,GAAA,CAAI,OAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AACjE,UAAA,OAAO,KAAA,CAAM,aAAA;AAAA,YACT,KAAA,CAAM,QAAA;AAAA,YACN,EAAE,QAAA,EAAS;AAAA,YACX,GAAG;AAAA,WACP;AAAA,QACJ;AAAA,QAEA,KAAK,QAAA,EAAU;AAEX,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AACvC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACT,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAA6C,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAEvE,YAAA,IAAI,QAAQ,GAAA,EAAK;AACb,cAAA,OAAO,KAAA,CAAM,cAAc,KAAA,EAAO;AAAA,gBAC9B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,OAAA,CAAQ,GAAA;AAAI,eAClD,CAAA;AAAA,YACL;AACA,YAAA,OAAO,IAAA;AAAA,UACX;AAGA,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,YAAY;AACzC,YAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAO;AACzB,YAAA,OAAO,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,GAAA,EAAI;AAAA,UACzC,CAAC,CAAA;AAED,UAAA,OAAO,KAAA,CAAM,cAAc,aAAa,CAAA;AAAA,QAC5C;AAAA,QAEA,KAAK,MAAA,EAAQ;AAET,UAAA,IAAI,QAAQ,QAAA,EAAU;AAClB,YAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC/C;AACA,UAAA,OAAO,MAAM,aAAA,CAAc,KAAA,EAAO,EAAE,qBAAA,EAAuB,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3E;AAAA,QAEA;AACI,UAAA,OAAO,IAAA;AAAA;AACf,IACJ,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,MAAA,EAAwD;AAElE,MAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,GAAA,IAAO,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACpE,MAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,GAAA,EAAK;AACtC,QAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,MAC7D;AAGA,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,QAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AAEpB,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACzB,YAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,MAAM;AAAA;AAAA,cAAiC,KAAA,CAAM;AAAA,aAAO,CAAA;AAAA,UAC/E;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,OAAO,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,IAAI,CAAA;AAAA,IAC7C;AAAA,GACJ;AACJ;AAiBO,SAAS,qBAAA,CACZ,SAAA,EACA,QAAA,EACA,UAAA,GAAa,SAAA,EACZ;AACD,EAAA,MAAM,MAAA,GAAS,SAAA;AAOf,EAAA,MAAA,CAAO,QAAA,GAAW,gBAAA;AAClB,EAAA,MAAA,CAAO,eAAA,GAAkB,IAAA;AACzB,EAAA,MAAA,CAAO,eAAA,GAAkB,QAAA;AACzB,EAAA,MAAA,CAAO,eAAA,GAAkB,UAAA;AAEzB,EAAA,OAAO,MAAA;AACX","file":"chunk-TASAT7KB.js","sourcesContent":["/**\r\n * @flight-framework/core - React UI Adapter\r\n * \r\n * Adapter for using React with Flight Server Components.\r\n * Enables Flight to render React elements without tight coupling.\r\n * \r\n * @module @flight-framework/core/rsc/adapters/react\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// React Symbols\r\n// ============================================================================\r\n\r\n// React internal symbols (stable across versions)\r\nconst REACT_ELEMENT_TYPE = Symbol.for('react.element');\r\nconst REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\r\nconst REACT_PROVIDER_TYPE = Symbol.for('react.provider');\r\nconst REACT_CONTEXT_TYPE = Symbol.for('react.context');\r\nconst REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\r\nconst REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\r\nconst REACT_MEMO_TYPE = Symbol.for('react.memo');\r\nconst REACT_LAZY_TYPE = Symbol.for('react.lazy');\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * React element shape (minimal interface)\r\n */\r\ninterface ReactElement {\r\n $$typeof: symbol;\r\n type: unknown;\r\n key: string | number | null;\r\n ref: unknown;\r\n props: Record<string, unknown>;\r\n _owner: unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create React UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createReactAdapter } from '@flight-framework/core/rsc/adapters/react';\r\n * import { renderToString } from 'react-dom/server';\r\n * import * as React from 'react';\r\n * \r\n * const adapter = createReactAdapter({\r\n * React,\r\n * renderToString,\r\n * });\r\n * \r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createReactAdapter(deps?: {\r\n /** React module (optional - for SSR) */\r\n React?: {\r\n isValidElement: (value: unknown) => boolean;\r\n Children: { toArray: (children: unknown) => unknown[] };\r\n Fragment: symbol;\r\n Suspense: unknown;\r\n };\r\n /** renderToString function (optional - for SSR fallbacks) */\r\n renderToString?: (element: unknown) => string;\r\n}): UIAdapter {\r\n const { React, renderToString } = deps || {};\r\n\r\n return {\r\n name: 'react',\r\n\r\n isElement(value: unknown): boolean {\r\n if (React) {\r\n return React.isValidElement(value);\r\n }\r\n // Fallback: check for $$typeof\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n '$$typeof' in value &&\r\n (value as ReactElement).$$typeof === REACT_ELEMENT_TYPE\r\n );\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n const el = element as ReactElement;\r\n const type = el.type;\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Symbol types\r\n if (typeof type === 'symbol') {\r\n if (type === REACT_FRAGMENT_TYPE || type === (React?.Fragment as symbol)) {\r\n return { kind: 'fragment' };\r\n }\r\n if (type === REACT_SUSPENSE_TYPE || (React?.Suspense && type === (React.Suspense as unknown as symbol))) {\r\n return {\r\n kind: 'suspense',\r\n fallback: el.props.fallback\r\n };\r\n }\r\n if (type === REACT_PROVIDER_TYPE) {\r\n return { kind: 'provider', value: el.props.value };\r\n }\r\n if (type === REACT_CONTEXT_TYPE) {\r\n return { kind: 'context' };\r\n }\r\n return { kind: 'null' };\r\n }\r\n\r\n // Object types (memo, lazy, forwardRef)\r\n if (typeof type === 'object' && type !== null) {\r\n const typeObj = type as { $$typeof?: symbol; type?: unknown; render?: unknown };\r\n\r\n if (typeObj.$$typeof === REACT_MEMO_TYPE) {\r\n // Unwrap memo\r\n return this.getElementType({ ...el, type: typeObj.type });\r\n }\r\n\r\n if (typeObj.$$typeof === REACT_LAZY_TYPE) {\r\n return { kind: 'component', fn: () => null, name: 'Lazy' };\r\n }\r\n\r\n if (typeObj.$$typeof === REACT_FORWARD_REF_TYPE && typeObj.render) {\r\n return {\r\n kind: 'component',\r\n fn: typeObj.render as (props: Record<string, unknown>) => unknown,\r\n name: 'ForwardRef'\r\n };\r\n }\r\n\r\n // Check for Suspense object\r\n if ('$$typeof' in typeObj &&\r\n (typeObj.$$typeof === REACT_SUSPENSE_TYPE)) {\r\n return { kind: 'suspense', fallback: el.props.fallback };\r\n }\r\n }\r\n\r\n // Function component\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'Component'\r\n };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n return (element as ReactElement).props || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n const props = (element as ReactElement).props;\r\n const children = props?.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n if (React?.Children) {\r\n return React.Children.toArray(children);\r\n }\r\n\r\n // Fallback array handling\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n const key = (element as ReactElement).key;\r\n return key !== null ? key : undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function') return false;\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Create a React element using the internal structure\r\n // This is framework-agnostic from the caller's perspective\r\n return {\r\n $$typeof: REACT_ELEMENT_TYPE,\r\n type: component,\r\n key: null,\r\n ref: null,\r\n props,\r\n _owner: null,\r\n };\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (renderToString) {\r\n return renderToString(element);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass it when creating the adapter: ' +\r\n 'createReactAdapter({ renderToString })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// React Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Opciones para el consumer de React\r\n */\r\nexport interface ReactConsumerOptions {\r\n /** Registry de client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n /** Callback when hydration completes */\r\n onHydrate?: (id: string) => void;\r\n}\r\n\r\n/**\r\n * Create a React client-side consumer for Flight payloads\r\n * \r\n * This reconstructs React elements from Flight chunks on the client.\r\n */\r\nexport function createReactConsumer(deps: {\r\n React: {\r\n createElement: (type: unknown, props?: unknown, ...children: unknown[]) => unknown;\r\n Suspense: unknown;\r\n Fragment: unknown;\r\n lazy: (factory: () => Promise<{ default: unknown }>) => unknown;\r\n };\r\n}, options: ReactConsumerOptions = {}) {\r\n const { React } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to React elements\r\n */\r\n toReactElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n const children = element.children.map(c => this.toReactElement(c));\r\n return React.createElement(\r\n element.tag,\r\n { ...element.props, key: element.key },\r\n ...children\r\n );\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toReactElement(c));\r\n return React.createElement(React.Fragment, null, ...children);\r\n }\r\n\r\n case 'suspense': {\r\n const fallback = this.toReactElement(element.fallback);\r\n const children = element.children.map(c => this.toReactElement(c));\r\n return React.createElement(\r\n React.Suspense,\r\n { fallback },\r\n ...children\r\n );\r\n }\r\n\r\n case 'client': {\r\n // Get loader from registry\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n // Return SSR fallback if available\r\n if (element.ssr) {\r\n return React.createElement('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n // Create lazy component\r\n const LazyComponent = React.lazy(async () => {\r\n const mod = await loader() as { default?: unknown };\r\n return { default: mod.default ?? mod };\r\n });\r\n\r\n return React.createElement(LazyComponent);\r\n }\r\n\r\n case 'lazy': {\r\n // This is a pending chunk - render fallback\r\n if (element.fallback) {\r\n return this.toReactElement(element.fallback);\r\n }\r\n return React.createElement('div', { 'data-flight-pending': element.id });\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * Process Flight chunks and build React tree\r\n */\r\n processChunks(chunks: import('../payload.js').FlightChunk[]): unknown {\r\n // Find root chunk\r\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\r\n if (!rootChunk || rootChunk.type !== 'S') {\r\n throw new Error('[Flight] No root chunk found in payload');\r\n }\r\n\r\n // Register all client references\r\n for (const chunk of chunks) {\r\n if (chunk.type === 'C') {\r\n // Default registry - lazy load via dynamic import\r\n if (!registry.has(chunk.id)) {\r\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\r\n }\r\n }\r\n }\r\n\r\n return this.toReactElement(rootChunk.tree);\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for React Server Component\r\n */\r\nexport type ReactServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<ReturnType<typeof import('react').createElement>> | ReturnType<typeof import('react').createElement>;\r\n\r\n/**\r\n * Mark a component as a client component (for use without bundler transform)\r\n */\r\nexport function markAsClientComponent<T extends (...args: unknown[]) => unknown>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/adapters/solid.ts"],"names":[],"mappings":"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","file":"chunk-VPFMHGEV.js","sourcesContent":["/**\r\n * @flight-framework/core - Solid.js UI Adapter\r\n * \r\n * Adapter for using Solid.js with Flight Server Components.\r\n * Enables Flight to render Solid components without tight coupling.\r\n * \r\n * Philosophy: Zero lock-in - Solid is optional, user decides.\r\n * \r\n * @module @flight-framework/core/rsc/adapters/solid\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// Solid Symbols\r\n// ============================================================================\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal Solid JSX Element interface\r\n */\r\ninterface SolidElement {\r\n t: string | ((props: unknown) => unknown); // tag or component\r\n p: Record<string, unknown> | null; // props\r\n r?: unknown; // key/ref\r\n}\r\n\r\n/**\r\n * Solid dependencies (user provides these)\r\n */\r\nexport interface SolidDependencies {\r\n /** solid-js module */\r\n solid: {\r\n createSignal: <T>(value: T) => [() => T, (v: T) => void];\r\n createMemo: <T>(fn: () => T) => () => T;\r\n createEffect: (fn: () => void) => void;\r\n children: (fn: () => unknown) => () => unknown[];\r\n splitProps: <T extends object, K extends keyof T>(\r\n props: T,\r\n ...keys: K[][]\r\n ) => [Pick<T, K>, Omit<T, K>][];\r\n For?: unknown;\r\n Show?: unknown;\r\n Switch?: unknown;\r\n Match?: unknown;\r\n Suspense?: unknown;\r\n ErrorBoundary?: unknown;\r\n };\r\n /** solid-js/web module */\r\n web: {\r\n render?: (code: () => unknown, element: Element) => () => void;\r\n hydrate?: (code: () => unknown, element: Element) => () => void;\r\n renderToString?: (code: () => unknown) => string;\r\n renderToStringAsync?: (code: () => unknown) => Promise<string>;\r\n isServer?: boolean;\r\n Dynamic?: unknown;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create Solid.js UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createSolidAdapter } from '@flight-framework/core/rsc/adapters/solid';\r\n * import * as solid from 'solid-js';\r\n * import * as web from 'solid-js/web';\r\n * \r\n * const adapter = createSolidAdapter({ solid, web });\r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createSolidAdapter(deps?: SolidDependencies): UIAdapter {\r\n const { solid, web } = deps || {};\r\n\r\n return {\r\n name: 'solid',\r\n\r\n isElement(value: unknown): boolean {\r\n if (value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n\r\n // Solid JSX elements are plain objects with t (type) and p (props)\r\n const el = value as Record<string, unknown>;\r\n\r\n // Check for Solid's compiled JSX structure\r\n if ('t' in el && ('p' in el || el.p === null)) {\r\n return true;\r\n }\r\n\r\n // Check for function components (Solid lazy returns functions)\r\n if (typeof value === 'function') {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n // Handle function directly (component or lazy)\r\n if (typeof element === 'function') {\r\n const fn = element as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'SolidComponent'\r\n };\r\n }\r\n\r\n const el = element as SolidElement;\r\n const type = el.t;\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Function = component\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n\r\n // Check for Solid built-in components\r\n if (solid) {\r\n if (type === solid.For) {\r\n return { kind: 'fragment' };\r\n }\r\n if (type === solid.Show) {\r\n return { kind: 'fragment' };\r\n }\r\n if (type === solid.Suspense) {\r\n return {\r\n kind: 'suspense',\r\n fallback: el.p?.fallback\r\n };\r\n }\r\n }\r\n\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'Component'\r\n };\r\n }\r\n\r\n // Symbol types (Fragment, etc.)\r\n if (typeof type === 'symbol') {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n if (typeof element === 'function') {\r\n return {};\r\n }\r\n return (element as SolidElement).p || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n if (typeof element === 'function') {\r\n return [];\r\n }\r\n\r\n const props = (element as SolidElement).p;\r\n const children = props?.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n // Solid children can be functions (for reactivity)\r\n if (typeof children === 'function') {\r\n // In SSR context, we can call the function\r\n if (web?.isServer) {\r\n try {\r\n const result = (children as () => unknown)();\r\n if (Array.isArray(result)) {\r\n return result;\r\n }\r\n return [result];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n // On client, return as-is for hydration\r\n return [children];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n if (typeof element === 'function') {\r\n return undefined;\r\n }\r\n const ref = (element as SolidElement).r;\r\n if (typeof ref === 'string' || typeof ref === 'number') {\r\n return ref;\r\n }\r\n return undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function' && typeof component !== 'object') {\r\n return false;\r\n }\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Solid JSX elements are plain objects with t (type) and p (props)\r\n return {\r\n t: component,\r\n p: props,\r\n r: null,\r\n } as SolidElement;\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (web?.renderToStringAsync) {\r\n // Async SSR with Suspense support\r\n return web.renderToStringAsync(() => element);\r\n }\r\n if (web?.renderToString) {\r\n // Sync SSR\r\n return web.renderToString(() => element);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass solid-js/web when creating the adapter: ' +\r\n 'createSolidAdapter({ solid, web })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Solid Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Solid consumer\r\n */\r\nexport interface SolidConsumerOptions {\r\n /** Registry of client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n}\r\n\r\n/**\r\n * Create a Solid client-side consumer for Flight payloads\r\n */\r\nexport function createSolidConsumer(\r\n deps: SolidDependencies,\r\n options: SolidConsumerOptions = {}\r\n) {\r\n const { solid, web } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to Solid JSX\r\n */\r\n toSolidElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n // Create Solid element structure\r\n const children = element.children.map(c => this.toSolidElement(c));\r\n return {\r\n t: element.tag,\r\n p: { ...element.props, children },\r\n r: element.key,\r\n };\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toSolidElement(c));\r\n return children;\r\n }\r\n\r\n case 'suspense': {\r\n if (solid?.Suspense) {\r\n const fallback = this.toSolidElement(element.fallback);\r\n const children = element.children.map(c => this.toSolidElement(c));\r\n return {\r\n t: solid.Suspense,\r\n p: { fallback: () => fallback, children: () => children },\r\n };\r\n }\r\n return element.children.map(c => this.toSolidElement(c));\r\n }\r\n\r\n case 'client': {\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n if (element.ssr) {\r\n return {\r\n t: 'div',\r\n p: { innerHTML: element.ssr },\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n // Create lazy component for Solid\r\n // Solid's lazy is different - it expects a dynamic import\r\n const LazyComponent = async () => {\r\n const mod = await loader() as { default?: unknown };\r\n return mod.default ?? mod;\r\n };\r\n\r\n if (solid?.Suspense) {\r\n return {\r\n t: solid.Suspense,\r\n p: {\r\n fallback: () => element.ssr ? { t: 'div', p: { innerHTML: element.ssr } } : null,\r\n children: LazyComponent,\r\n },\r\n };\r\n }\r\n\r\n return { t: LazyComponent, p: {} };\r\n }\r\n\r\n case 'lazy': {\r\n if (element.fallback) {\r\n return this.toSolidElement(element.fallback);\r\n }\r\n return {\r\n t: 'div',\r\n p: { 'data-flight-pending': element.id }\r\n };\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * Hydrate Flight payload into DOM\r\n */\r\n hydrate(\r\n chunks: import('../payload.js').FlightChunk[],\r\n container: Element\r\n ): (() => void) | undefined {\r\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\r\n if (!rootChunk || rootChunk.type !== 'S') {\r\n throw new Error('[Flight] No root chunk found');\r\n }\r\n\r\n // Register client components\r\n for (const chunk of chunks) {\r\n if (chunk.type === 'C') {\r\n if (!registry.has(chunk.id)) {\r\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\r\n }\r\n }\r\n }\r\n\r\n const element = this.toSolidElement(rootChunk.tree);\r\n\r\n if (web?.hydrate) {\r\n return web.hydrate(() => element, container);\r\n }\r\n if (web?.render) {\r\n return web.render(() => element, container);\r\n }\r\n\r\n throw new Error('[Flight] Solid web.hydrate or web.render not provided');\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for Solid Server Component\r\n */\r\nexport type SolidServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<unknown> | unknown;\r\n\r\n/**\r\n * Mark a Solid component as a client component\r\n */\r\nexport function markAsSolidClientComponent<T extends object>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n\r\n/**\r\n * Check if running on server (Solid isServer helper)\r\n */\r\nexport function isServer(deps?: SolidDependencies): boolean {\r\n return deps?.web?.isServer ?? (typeof window === 'undefined');\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/handlers/index.ts"],"names":[],"mappings":";AAuDO,SAAS,kBAAA,CACZ,OAAA,EACA,MAAA,GAAiC,EAAC,EACf;AACnB,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,cAAc,GAAA,CAAI;AAAA,GACtB;AACJ;AAKO,SAAS,IAAA,CAAQ,MAAS,IAAA,EAA+B;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,iCAAiC,CAAA;AAE7D,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACtC,GAAG,IAAA;AAAA,IACH;AAAA,GACH,CAAA;AACL;AAKO,SAAS,QAAA,CAAS,GAAA,EAAa,MAAA,GAAsC,GAAA,EAAe;AACvF,EAAA,OAAO,IAAI,SAAS,IAAA,EAAM;AAAA,IACtB,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,QAAA,EAAU,GAAA;AAAI,GAC5B,CAAA;AACL;AAKO,SAAS,KAAA,CAAM,OAAA,EAAiB,MAAA,GAAS,GAAA,EAAe;AAC3D,EAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,IACpD,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GACjD,CAAA;AACL;AAKA,eAAsB,UAAa,OAAA,EAA8B;AAC7D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAE3D,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC1C,IAAA,OAAO,MAAM,QAAQ,IAAA,EAAK;AAAA,EAC9B;AAEA,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,mCAAmC,CAAA,EAAG;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,EAAS;AACxC,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,WAAW,CAAA,CAAE,CAAA;AAC9D","file":"chunk-W6D62JCI.js","sourcesContent":["/**\r\n * @flight-framework/core - Route Handlers\r\n * \r\n * Types and utilities for route handlers.\r\n * Similar to Next.js Route Handlers pattern.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * HTTP methods supported by route handlers\r\n */\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\r\n\r\n/**\r\n * Context passed to route handlers\r\n */\r\nexport interface RouteHandlerContext {\r\n /** Route parameters (e.g., { id: '123' }) */\r\n params: Record<string, string>;\r\n /** Query string parameters */\r\n searchParams: URLSearchParams;\r\n}\r\n\r\n/**\r\n * Route handler function signature\r\n * \r\n * @example\r\n * ```typescript\r\n * // src/routes/api/users/[id].ts\r\n * export const GET: RouteHandler = async (request, context) => {\r\n * const { id } = context.params;\r\n * return Response.json({ userId: id });\r\n * };\r\n * \r\n * export const PUT: RouteHandler = async (request, context) => {\r\n * const body = await request.json();\r\n * return Response.json({ updated: true, data: body });\r\n * };\r\n * ```\r\n */\r\nexport type RouteHandler = (\r\n request: Request,\r\n context: RouteHandlerContext\r\n) => Response | Promise<Response>;\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a route handler context from request\r\n */\r\nexport function createRouteContext(\r\n request: Request,\r\n params: Record<string, string> = {}\r\n): RouteHandlerContext {\r\n const url = new URL(request.url);\r\n return {\r\n params,\r\n searchParams: url.searchParams,\r\n };\r\n}\r\n\r\n/**\r\n * Helper to create JSON response\r\n */\r\nexport function json<T>(data: T, init?: ResponseInit): Response {\r\n const headers = new Headers(init?.headers);\r\n headers.set('Content-Type', 'application/json; charset=utf-8');\r\n\r\n return new Response(JSON.stringify(data), {\r\n ...init,\r\n headers,\r\n });\r\n}\r\n\r\n/**\r\n * Helper to create redirect response\r\n */\r\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\r\n return new Response(null, {\r\n status,\r\n headers: { Location: url },\r\n });\r\n}\r\n\r\n/**\r\n * Helper to create error response\r\n */\r\nexport function error(message: string, status = 500): Response {\r\n return new Response(JSON.stringify({ error: message }), {\r\n status,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n}\r\n\r\n/**\r\n * Helper to get request body as typed object\r\n */\r\nexport async function parseBody<T>(request: Request): Promise<T> {\r\n const contentType = request.headers.get('content-type') || '';\r\n\r\n if (contentType.includes('application/json')) {\r\n return await request.json() as T;\r\n }\r\n\r\n if (contentType.includes('application/x-www-form-urlencoded')) {\r\n const formData = await request.formData();\r\n const obj: Record<string, string> = {};\r\n formData.forEach((value, key) => {\r\n obj[key] = String(value);\r\n });\r\n return obj as T;\r\n }\r\n\r\n throw new Error(`Unsupported content type: ${contentType}`);\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/islands/index.ts"],"names":[],"mappings":"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","file":"chunk-WFAWAHJH.js","sourcesContent":["/**\r\n * @flight-framework/core - Islands Architecture\r\n * \r\n * Selective hydration with fine-grained control over when and how\r\n * components become interactive. Framework-agnostic islands primitives.\r\n * \r\n * Best Practices 2026:\r\n * - Minimal JavaScript: Only hydrate what needs interactivity\r\n * - Lazy hydration: Load JS when actually needed\r\n * - Progressive enhancement: Works without JS\r\n * - Performance: Reduce main thread work\r\n * \r\n * @example\r\n * ```typescript\r\n * import { defineIsland, renderIsland, hydrateIslands } from '@flight-framework/core/islands';\r\n * \r\n * // Server: Define an interactive island\r\n * const Counter = defineIsland({\r\n * id: 'counter',\r\n * component: CounterComponent,\r\n * hydrate: 'visible', // Only hydrate when scrolled into view\r\n * });\r\n * \r\n * // Server: Render to HTML with island markers\r\n * const html = await renderIsland(Counter, { initial: 0 });\r\n * \r\n * // Client: Hydrate all islands on the page\r\n * hydrateIslands();\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * When to hydrate the island\r\n */\r\nexport type HydrationTrigger =\r\n | 'load' // Immediate: hydrate as soon as JS loads\r\n | 'idle' // When browser is idle (requestIdleCallback)\r\n | 'visible' // When island enters viewport (IntersectionObserver)\r\n | 'interaction' // On first user interaction (click, focus, hover)\r\n | 'media' // When media query matches\r\n | 'never' // Never hydrate (static HTML only)\r\n | CustomHydrationTrigger;\r\n\r\n/**\r\n * Custom hydration trigger function\r\n */\r\nexport interface CustomHydrationTrigger {\r\n type: 'custom';\r\n /** Name for debugging */\r\n name: string;\r\n /** Function that returns a promise resolving when hydration should occur */\r\n when: (element: HTMLElement) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Island configuration\r\n */\r\nexport interface IslandConfig<P = Record<string, unknown>> {\r\n /** Unique identifier for this island type */\r\n id: string;\r\n /** The component to render (framework-specific) */\r\n component: unknown;\r\n /** When to hydrate on client */\r\n hydrate: HydrationTrigger;\r\n /** Default props */\r\n defaultProps?: P;\r\n /** Media query for 'media' trigger */\r\n mediaQuery?: string;\r\n /** Path to client-side component bundle */\r\n clientEntry?: string;\r\n /** Fallback HTML while not hydrated (optional override) */\r\n fallback?: string;\r\n /** Loading priority hint */\r\n priority?: 'high' | 'low';\r\n}\r\n\r\n/**\r\n * Island instance with props\r\n */\r\nexport interface Island<P = Record<string, unknown>> {\r\n /** Island configuration */\r\n config: IslandConfig<P>;\r\n /** Instance props */\r\n props: P;\r\n /** Unique instance ID (for multiple instances of same island type) */\r\n instanceId: string;\r\n}\r\n\r\n/**\r\n * Rendered island HTML with metadata\r\n */\r\nexport interface RenderedIsland {\r\n /** The HTML string */\r\n html: string;\r\n /** Island ID */\r\n id: string;\r\n /** Instance ID */\r\n instanceId: string;\r\n /** Serialized props for hydration */\r\n propsScript: string;\r\n /** CSS if any */\r\n css?: string;\r\n}\r\n\r\n/**\r\n * Island registry for client-side hydration\r\n */\r\nexport interface IslandRegistry {\r\n /** Register a component for an island ID */\r\n register(id: string, loader: () => Promise<unknown>): void;\r\n /** Get registered loader */\r\n get(id: string): (() => Promise<unknown>) | undefined;\r\n /** Check if island is registered */\r\n has(id: string): boolean;\r\n}\r\n\r\n/**\r\n * Client-side hydration options\r\n */\r\nexport interface HydrateOptions {\r\n /** Root element to scan for islands */\r\n root?: HTMLElement;\r\n /** Custom island registry */\r\n registry?: IslandRegistry;\r\n /** Callback when an island is hydrated */\r\n onHydrate?: (id: string, instanceId: string, duration: number) => void;\r\n /** Callback on hydration error */\r\n onError?: (id: string, error: Error) => void;\r\n}\r\n\r\n// ============================================================================\r\n// Server-Side: Island Definition\r\n// ============================================================================\r\n\r\nlet instanceCounter = 0;\r\n\r\n/**\r\n * Generate a unique instance ID\r\n */\r\nfunction generateInstanceId(islandId: string): string {\r\n return `${islandId}:${++instanceCounter}:${Math.random().toString(36).slice(2, 7)}`;\r\n}\r\n\r\n/**\r\n * Define an island component\r\n */\r\nexport function defineIsland<P = Record<string, unknown>>(\r\n config: IslandConfig<P>\r\n): (props?: P) => Island<P> {\r\n return (props?: P) => ({\r\n config,\r\n props: { ...config.defaultProps, ...props } as P,\r\n instanceId: generateInstanceId(config.id),\r\n });\r\n}\r\n\r\n/**\r\n * Serialize props for client-side hydration\r\n */\r\nfunction serializeProps(props: Record<string, unknown>): string {\r\n try {\r\n return JSON.stringify(props);\r\n } catch {\r\n console.warn('[Flight Islands] Props are not serializable, using empty object');\r\n return '{}';\r\n }\r\n}\r\n\r\n/**\r\n * Get hydration trigger attribute value\r\n */\r\nfunction getHydrateAttr(trigger: HydrationTrigger): string {\r\n if (typeof trigger === 'object' && trigger.type === 'custom') {\r\n return `custom:${trigger.name}`;\r\n }\r\n return trigger as string;\r\n}\r\n\r\n// ============================================================================\r\n// Server-Side: Island Rendering\r\n// ============================================================================\r\n\r\n/**\r\n * UI framework adapter for island rendering\r\n */\r\nexport interface IslandRenderAdapter {\r\n /** Framework name */\r\n name: string;\r\n /** Render component to HTML */\r\n renderToString(component: unknown, props: Record<string, unknown>): Promise<string>;\r\n /** Get CSS if any */\r\n getCSS?(component: unknown): string;\r\n}\r\n\r\nlet globalAdapter: IslandRenderAdapter | null = null;\r\n\r\n/**\r\n * Set the global island render adapter\r\n */\r\nexport function setIslandAdapter(adapter: IslandRenderAdapter): void {\r\n globalAdapter = adapter;\r\n}\r\n\r\n/**\r\n * Render an island to HTML with hydration markers\r\n */\r\nexport async function renderIsland<P extends Record<string, unknown>>(\r\n island: Island<P>,\r\n adapter?: IslandRenderAdapter\r\n): Promise<RenderedIsland> {\r\n const renderAdapter = adapter || globalAdapter;\r\n\r\n if (!renderAdapter) {\r\n throw new Error(\r\n '[Flight Islands] No render adapter set. Call setIslandAdapter() or pass adapter to renderIsland().'\r\n );\r\n }\r\n\r\n const { config, props, instanceId } = island;\r\n\r\n // Render component to HTML\r\n const componentHtml = await renderAdapter.renderToString(config.component, props);\r\n const css = renderAdapter.getCSS?.(config.component);\r\n\r\n // Build island wrapper with data attributes\r\n const hydrateAttr = getHydrateAttr(config.hydrate);\r\n const propsJson = serializeProps(props);\r\n\r\n const html = `\r\n<flight-island \r\n data-island=\"${config.id}\"\r\n data-instance=\"${instanceId}\"\r\n data-hydrate=\"${hydrateAttr}\"\r\n ${config.mediaQuery ? `data-media=\"${config.mediaQuery}\"` : ''}\r\n ${config.clientEntry ? `data-entry=\"${config.clientEntry}\"` : ''}\r\n ${config.priority ? `data-priority=\"${config.priority}\"` : ''}\r\n>\r\n ${componentHtml}\r\n</flight-island>`;\r\n\r\n // Props script (inline for hydration)\r\n const propsScript = `<script type=\"application/json\" data-island-props=\"${instanceId}\">${propsJson}</script>`;\r\n\r\n return {\r\n html,\r\n id: config.id,\r\n instanceId,\r\n propsScript,\r\n css,\r\n };\r\n}\r\n\r\n/**\r\n * Render multiple islands and collect their outputs\r\n */\r\nexport async function renderIslands<P extends Record<string, unknown>>(\r\n islands: Island<P>[],\r\n adapter?: IslandRenderAdapter\r\n): Promise<{\r\n html: string;\r\n propsScripts: string;\r\n css: string;\r\n}> {\r\n const rendered = await Promise.all(\r\n islands.map(island => renderIsland(island, adapter))\r\n );\r\n\r\n return {\r\n html: rendered.map(r => r.html).join('\\n'),\r\n propsScripts: rendered.map(r => r.propsScript).join('\\n'),\r\n css: rendered.filter(r => r.css).map(r => r.css).join('\\n'),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Client-Side: Island Hydration\r\n// ============================================================================\r\n\r\n/**\r\n * Create an island registry for client-side hydration\r\n */\r\nexport function createIslandRegistry(): IslandRegistry {\r\n const loaders = new Map<string, () => Promise<unknown>>();\r\n\r\n return {\r\n register(id: string, loader: () => Promise<unknown>) {\r\n loaders.set(id, loader);\r\n },\r\n get(id: string) {\r\n return loaders.get(id);\r\n },\r\n has(id: string) {\r\n return loaders.has(id);\r\n },\r\n };\r\n}\r\n\r\n// Global registry for convenience\r\nconst globalRegistry = createIslandRegistry();\r\n\r\n/**\r\n * Register an island component for client-side hydration\r\n */\r\nexport function registerIsland(id: string, loader: () => Promise<unknown>): void {\r\n globalRegistry.register(id, loader);\r\n}\r\n\r\n/**\r\n * Client-side hydration bootstrapper\r\n * Call this in your client entry point\r\n */\r\nexport function hydrateIslands(options?: HydrateOptions): void {\r\n const {\r\n root = typeof document !== 'undefined' ? document.body : null,\r\n registry = globalRegistry,\r\n onHydrate,\r\n onError,\r\n } = options || {};\r\n\r\n if (!root || typeof document === 'undefined') {\r\n console.warn('[Flight Islands] hydrateIslands called in non-browser environment');\r\n return;\r\n }\r\n\r\n // Find all island elements\r\n const islands = root.querySelectorAll<HTMLElement>('flight-island[data-island]');\r\n\r\n islands.forEach((element) => {\r\n const islandId = element.dataset.island!;\r\n const instanceId = element.dataset.instance!;\r\n const hydrateTrigger = element.dataset.hydrate as string;\r\n const mediaQuery = element.dataset.media;\r\n\r\n // Check if component is registered\r\n if (!registry.has(islandId)) {\r\n console.warn(`[Flight Islands] No component registered for island: ${islandId}`);\r\n return;\r\n }\r\n\r\n // Setup hydration based on trigger\r\n setupHydration(\r\n element,\r\n islandId,\r\n instanceId,\r\n hydrateTrigger,\r\n mediaQuery,\r\n registry,\r\n onHydrate,\r\n onError\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Setup hydration trigger for an island element\r\n */\r\nfunction setupHydration(\r\n element: HTMLElement,\r\n islandId: string,\r\n instanceId: string,\r\n trigger: string,\r\n mediaQuery: string | undefined,\r\n registry: IslandRegistry,\r\n onHydrate?: (id: string, instanceId: string, duration: number) => void,\r\n onError?: (id: string, error: Error) => void\r\n): void {\r\n const hydrate = async () => {\r\n const startTime = performance.now();\r\n\r\n try {\r\n // Load component\r\n const loader = registry.get(islandId)!;\r\n const module = await loader() as { default?: unknown };\r\n const Component = module.default || module;\r\n\r\n // Get props\r\n const propsScript = document.querySelector(`[data-island-props=\"${instanceId}\"]`);\r\n const props = propsScript ? JSON.parse(propsScript.textContent || '{}') : {};\r\n\r\n // Hydrate (framework-specific, emit event for now)\r\n element.dispatchEvent(new CustomEvent('flight:hydrate', {\r\n detail: { Component, props, islandId, instanceId },\r\n bubbles: true,\r\n }));\r\n\r\n // Mark as hydrated\r\n element.setAttribute('data-hydrated', 'true');\r\n\r\n const duration = performance.now() - startTime;\r\n onHydrate?.(islandId, instanceId, duration);\r\n\r\n } catch (error) {\r\n console.error(`[Flight Islands] Failed to hydrate ${islandId}:`, error);\r\n element.setAttribute('data-hydrate-error', 'true');\r\n onError?.(islandId, error as Error);\r\n }\r\n };\r\n\r\n // Skip if already hydrated\r\n if (element.hasAttribute('data-hydrated')) return;\r\n\r\n switch (trigger) {\r\n case 'load':\r\n // Immediate hydration\r\n hydrate();\r\n break;\r\n\r\n case 'idle':\r\n // When browser is idle\r\n if ('requestIdleCallback' in window) {\r\n (window as unknown as { requestIdleCallback: (cb: () => void, opts?: { timeout: number }) => void })\r\n .requestIdleCallback(() => hydrate(), { timeout: 2000 });\r\n } else {\r\n setTimeout(hydrate, 200);\r\n }\r\n break;\r\n\r\n case 'visible': {\r\n // When element enters viewport\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n observer.disconnect();\r\n hydrate();\r\n }\r\n });\r\n },\r\n { rootMargin: '50px' }\r\n );\r\n observer.observe(element);\r\n break;\r\n }\r\n\r\n case 'interaction': {\r\n // On first user interaction\r\n const events = ['click', 'focus', 'touchstart', 'mouseenter'];\r\n const onInteraction = () => {\r\n events.forEach(e => element.removeEventListener(e, onInteraction));\r\n hydrate();\r\n };\r\n events.forEach(e => element.addEventListener(e, onInteraction, { once: true, passive: true }));\r\n break;\r\n }\r\n\r\n case 'media':\r\n // When media query matches\r\n if (mediaQuery) {\r\n const mql = window.matchMedia(mediaQuery);\r\n const check = () => {\r\n if (mql.matches) {\r\n mql.removeEventListener('change', check);\r\n hydrate();\r\n }\r\n };\r\n if (mql.matches) {\r\n hydrate();\r\n } else {\r\n mql.addEventListener('change', check);\r\n }\r\n }\r\n break;\r\n\r\n case 'never':\r\n // Never hydrate\r\n break;\r\n\r\n default:\r\n // Custom trigger\r\n if (trigger.startsWith('custom:')) {\r\n // Custom triggers need manual setup\r\n element.dispatchEvent(new CustomEvent('flight:custom-hydrate', {\r\n detail: { hydrate, trigger: trigger.replace('custom:', '') },\r\n bubbles: true,\r\n }));\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Utility: Framework-Specific Adapter Factories\r\n// These return adapters that users configure with their own framework imports\r\n// ============================================================================\r\n\r\n/**\r\n * Create a React island render adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToString } from 'react-dom/server';\r\n * import { createElement } from 'react';\r\n * \r\n * const reactAdapter = createReactIslandAdapter({\r\n * renderToString,\r\n * createElement,\r\n * });\r\n * ```\r\n */\r\nexport function createReactIslandAdapter(deps: {\r\n renderToString: (element: unknown) => string;\r\n createElement: (type: unknown, props?: unknown) => unknown;\r\n}): IslandRenderAdapter {\r\n return {\r\n name: 'react',\r\n async renderToString(component, props) {\r\n const element = deps.createElement(component, props);\r\n return deps.renderToString(element);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create a Preact island render adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToString } from 'preact-render-to-string';\r\n * import { h } from 'preact';\r\n * \r\n * const preactAdapter = createPreactIslandAdapter({\r\n * renderToString,\r\n * h,\r\n * });\r\n * ```\r\n */\r\nexport function createPreactIslandAdapter(deps: {\r\n renderToString: (element: unknown) => string;\r\n h: (type: unknown, props?: unknown) => unknown;\r\n}): IslandRenderAdapter {\r\n return {\r\n name: 'preact',\r\n async renderToString(component, props) {\r\n const element = deps.h(component, props);\r\n return deps.renderToString(element);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create a Vue island render adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToString, createSSRApp } from 'vue/server-renderer';\r\n * \r\n * const vueAdapter = createVueIslandAdapter({\r\n * renderToString,\r\n * createSSRApp,\r\n * });\r\n * ```\r\n */\r\nexport function createVueIslandAdapter(deps: {\r\n renderToString: (app: unknown) => Promise<string>;\r\n createSSRApp: (component: unknown, props?: unknown) => unknown;\r\n}): IslandRenderAdapter {\r\n return {\r\n name: 'vue',\r\n async renderToString(component, props) {\r\n const app = deps.createSSRApp(component, props);\r\n return deps.renderToString(app);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create a Solid island render adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToString } from 'solid-js/web';\r\n * \r\n * const solidAdapter = createSolidIslandAdapter({\r\n * renderToString,\r\n * });\r\n * ```\r\n */\r\nexport function createSolidIslandAdapter(deps: {\r\n renderToString: (fn: () => unknown) => string;\r\n}): IslandRenderAdapter {\r\n return {\r\n name: 'solid',\r\n async renderToString(component, props) {\r\n // Solid uses a function component pattern\r\n return deps.renderToString(() => (component as (p: unknown) => unknown)(props));\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Custom Element Registration (optional)\r\n// ============================================================================\r\n\r\n/**\r\n * Register the flight-island custom element\r\n * This provides additional functionality like slot support\r\n */\r\nexport function registerFlightIslandElement(): void {\r\n if (typeof customElements === 'undefined') return;\r\n if (customElements.get('flight-island')) return;\r\n\r\n class FlightIsland extends HTMLElement {\r\n static get observedAttributes() {\r\n return ['data-hydrated', 'data-hydrate-error'];\r\n }\r\n\r\n connectedCallback() {\r\n // Could add loading indicator logic here\r\n }\r\n\r\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\r\n if (name === 'data-hydrated' && newValue === 'true') {\r\n this.classList.add('hydrated');\r\n }\r\n if (name === 'data-hydrate-error' && newValue === 'true') {\r\n this.classList.add('hydrate-error');\r\n }\r\n }\r\n }\r\n\r\n customElements.define('flight-island', FlightIsland);\r\n}\r\n"]}
|