@flight-framework/core 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/actions/index.d.ts +636 -1
  2. package/dist/actions/index.js +1 -1
  3. package/dist/cache/index.d.ts +119 -4
  4. package/dist/cache/index.js +1 -1
  5. package/dist/{chunk-N3TUOEV4.js → chunk-2F2QU6RC.js} +14 -2
  6. package/dist/chunk-2F2QU6RC.js.map +1 -0
  7. package/dist/chunk-3QP3E7HS.js +667 -0
  8. package/dist/chunk-3QP3E7HS.js.map +1 -0
  9. package/dist/{chunk-3TPAA52K.js → chunk-IXMD5QH2.js} +5 -2
  10. package/dist/chunk-IXMD5QH2.js.map +1 -0
  11. package/dist/{chunk-4S5JWTGN.js → chunk-MDQNNIHH.js} +13 -2
  12. package/dist/{chunk-4S5JWTGN.js.map → chunk-MDQNNIHH.js.map} +1 -1
  13. package/dist/{chunk-HAX5OAB6.js → chunk-P6WSBVDT.js} +4 -12
  14. package/dist/chunk-P6WSBVDT.js.map +1 -0
  15. package/dist/chunk-R7SQAREQ.js +310 -0
  16. package/dist/chunk-R7SQAREQ.js.map +1 -0
  17. package/dist/{chunk-6Z2RYHEU.js → chunk-TASAT7KB.js} +12 -2
  18. package/dist/chunk-TASAT7KB.js.map +1 -0
  19. package/dist/{chunk-6LYV4VQX.js → chunk-VOBQDQKX.js} +3 -3
  20. package/dist/{chunk-6LYV4VQX.js.map → chunk-VOBQDQKX.js.map} +1 -1
  21. package/dist/{chunk-OCVLNLTI.js → chunk-VPFMHGEV.js} +9 -2
  22. package/dist/chunk-VPFMHGEV.js.map +1 -0
  23. package/dist/config/index.d.ts +27 -3
  24. package/dist/config/index.js +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +15 -15
  27. package/dist/index.js.map +1 -1
  28. package/dist/rsc/adapters/index.js +4 -4
  29. package/dist/rsc/adapters/preact.js +1 -1
  30. package/dist/rsc/adapters/react.js +1 -1
  31. package/dist/rsc/adapters/solid.js +1 -1
  32. package/dist/rsc/adapters/vue.js +1 -1
  33. package/dist/rsc/index.js +5 -5
  34. package/dist/rsc/renderer.d.ts +5 -3
  35. package/dist/rsc/renderer.js +1 -1
  36. package/dist/server/index.js +2 -2
  37. package/package.json +190 -178
  38. package/LICENSE +0 -21
  39. package/dist/chunk-3AIQVGTM.js +0 -120
  40. package/dist/chunk-3AIQVGTM.js.map +0 -1
  41. package/dist/chunk-3TPAA52K.js.map +0 -1
  42. package/dist/chunk-6Z2RYHEU.js.map +0 -1
  43. package/dist/chunk-HAX5OAB6.js.map +0 -1
  44. package/dist/chunk-JIW55ZVD.js +0 -145
  45. package/dist/chunk-JIW55ZVD.js.map +0 -1
  46. package/dist/chunk-N3TUOEV4.js.map +0 -1
  47. package/dist/chunk-OCVLNLTI.js.map +0 -1
package/package.json CHANGED
@@ -1,181 +1,193 @@
1
1
  {
2
- "name": "@flight-framework/core",
3
- "version": "0.2.1",
4
- "description": "Core primitives for Flight Framework - routing, rendering, caching",
5
- "keywords": [
6
- "flight",
7
- "framework",
8
- "core",
9
- "ssr",
10
- "routing"
11
- ],
12
- "license": "MIT",
13
- "author": "Flight Contributors",
14
- "type": "module",
15
- "exports": {
16
- ".": {
17
- "types": "./dist/index.d.ts",
18
- "import": "./dist/index.js"
19
- },
20
- "./router": {
21
- "types": "./dist/router/index.d.ts",
22
- "import": "./dist/router/index.js"
23
- },
24
- "./render": {
25
- "types": "./dist/render/index.d.ts",
26
- "import": "./dist/render/index.js"
27
- },
28
- "./cache": {
29
- "types": "./dist/cache/index.d.ts",
30
- "import": "./dist/cache/index.js"
31
- },
32
- "./middleware": {
33
- "types": "./dist/middleware/index.d.ts",
34
- "import": "./dist/middleware/index.js"
35
- },
36
- "./config": {
37
- "types": "./dist/config/index.d.ts",
38
- "import": "./dist/config/index.js"
39
- },
40
- "./adapters": {
41
- "types": "./dist/adapters/index.d.ts",
42
- "import": "./dist/adapters/index.js"
43
- },
44
- "./server": {
45
- "types": "./dist/server/index.d.ts",
46
- "import": "./dist/server/index.js"
47
- },
48
- "./file-router": {
49
- "types": "./dist/file-router/index.d.ts",
50
- "import": "./dist/file-router/index.js"
51
- },
52
- "./actions": {
53
- "types": "./dist/actions/index.d.ts",
54
- "import": "./dist/actions/index.js"
55
- },
56
- "./handlers": {
57
- "types": "./dist/handlers/index.d.ts",
58
- "import": "./dist/handlers/index.js"
59
- },
60
- "./streaming": {
61
- "types": "./dist/streaming/index.d.ts",
62
- "import": "./dist/streaming/index.js"
63
- },
64
- "./streaming/priority": {
65
- "types": "./dist/streaming/priority.d.ts",
66
- "import": "./dist/streaming/priority.js"
67
- },
68
- "./streaming/observability": {
69
- "types": "./dist/streaming/observability.d.ts",
70
- "import": "./dist/streaming/observability.js"
71
- },
72
- "./streaming/conditional": {
73
- "types": "./dist/streaming/conditional.d.ts",
74
- "import": "./dist/streaming/conditional.js"
75
- },
76
- "./streaming/adapters": {
77
- "types": "./dist/streaming/adapters/index.d.ts",
78
- "import": "./dist/streaming/adapters/index.js"
79
- },
80
- "./islands": {
81
- "types": "./dist/islands/index.d.ts",
82
- "import": "./dist/islands/index.js"
83
- },
84
- "./file-router/streaming-hints": {
85
- "types": "./dist/file-router/streaming-hints.d.ts",
86
- "import": "./dist/file-router/streaming-hints.js"
87
- },
88
- "./rsc": {
89
- "types": "./dist/rsc/index.d.ts",
90
- "import": "./dist/rsc/index.js"
91
- },
92
- "./rsc/payload": {
93
- "types": "./dist/rsc/payload.d.ts",
94
- "import": "./dist/rsc/payload.js"
95
- },
96
- "./rsc/boundaries": {
97
- "types": "./dist/rsc/boundaries.d.ts",
98
- "import": "./dist/rsc/boundaries.js"
99
- },
100
- "./rsc/context": {
101
- "types": "./dist/rsc/context.d.ts",
102
- "import": "./dist/rsc/context.js"
103
- },
104
- "./rsc/stream": {
105
- "types": "./dist/rsc/stream.d.ts",
106
- "import": "./dist/rsc/stream.js"
107
- },
108
- "./rsc/renderer": {
109
- "types": "./dist/rsc/renderer.d.ts",
110
- "import": "./dist/rsc/renderer.js"
111
- },
112
- "./rsc/vite-plugin": {
113
- "types": "./dist/rsc/vite-plugin.d.ts",
114
- "import": "./dist/rsc/vite-plugin.js"
115
- },
116
- "./rsc/adapters": {
117
- "types": "./dist/rsc/adapters/index.d.ts",
118
- "import": "./dist/rsc/adapters/index.js"
119
- },
120
- "./rsc/adapters/react": {
121
- "types": "./dist/rsc/adapters/react.d.ts",
122
- "import": "./dist/rsc/adapters/react.js"
123
- },
124
- "./rsc/adapters/vue": {
125
- "types": "./dist/rsc/adapters/vue.d.ts",
126
- "import": "./dist/rsc/adapters/vue.js"
127
- },
128
- "./rsc/adapters/solid": {
129
- "types": "./dist/rsc/adapters/solid.d.ts",
130
- "import": "./dist/rsc/adapters/solid.js"
131
- },
132
- "./rsc/adapters/preact": {
133
- "types": "./dist/rsc/adapters/preact.d.ts",
134
- "import": "./dist/rsc/adapters/preact.js"
135
- },
136
- "./rsc/plugins": {
137
- "types": "./dist/rsc/plugins/index.d.ts",
138
- "import": "./dist/rsc/plugins/index.js"
139
- },
140
- "./rsc/plugins/esbuild": {
141
- "types": "./dist/rsc/plugins/esbuild.d.ts",
142
- "import": "./dist/rsc/plugins/esbuild.js"
143
- },
144
- "./rsc/plugins/rollup": {
145
- "types": "./dist/rsc/plugins/rollup.d.ts",
146
- "import": "./dist/rsc/plugins/rollup.js"
147
- }
148
- },
149
- "main": "./dist/index.js",
150
- "types": "./dist/index.d.ts",
151
- "files": [
152
- "dist"
153
- ],
154
- "dependencies": {
155
- "radix3": "^1.1.0"
156
- },
157
- "devDependencies": {
158
- "@types/node": "^22.0.0",
159
- "rimraf": "^6.0.0",
160
- "tsup": "^8.0.0",
161
- "typescript": "^5.7.0",
162
- "vitest": "^2.0.0"
163
- },
164
- "peerDependencies": {
165
- "vite": "^6.0.0 || ^7.0.0"
166
- },
167
- "peerDependenciesMeta": {
168
- "vite": {
169
- "optional": true
2
+ "name": "@flight-framework/core",
3
+ "version": "0.2.3",
4
+ "description": "Core primitives for Flight Framework - routing, rendering, caching",
5
+ "keywords": [
6
+ "flight",
7
+ "framework",
8
+ "core",
9
+ "ssr",
10
+ "routing"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Flight Contributors",
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./router": {
21
+ "types": "./dist/router/index.d.ts",
22
+ "import": "./dist/router/index.js"
23
+ },
24
+ "./render": {
25
+ "types": "./dist/render/index.d.ts",
26
+ "import": "./dist/render/index.js"
27
+ },
28
+ "./cache": {
29
+ "types": "./dist/cache/index.d.ts",
30
+ "import": "./dist/cache/index.js"
31
+ },
32
+ "./middleware": {
33
+ "types": "./dist/middleware/index.d.ts",
34
+ "import": "./dist/middleware/index.js"
35
+ },
36
+ "./config": {
37
+ "types": "./dist/config/index.d.ts",
38
+ "import": "./dist/config/index.js"
39
+ },
40
+ "./adapters": {
41
+ "types": "./dist/adapters/index.d.ts",
42
+ "import": "./dist/adapters/index.js"
43
+ },
44
+ "./server": {
45
+ "types": "./dist/server/index.d.ts",
46
+ "import": "./dist/server/index.js"
47
+ },
48
+ "./file-router": {
49
+ "types": "./dist/file-router/index.d.ts",
50
+ "import": "./dist/file-router/index.js"
51
+ },
52
+ "./actions": {
53
+ "types": "./dist/actions/index.d.ts",
54
+ "import": "./dist/actions/index.js"
55
+ },
56
+ "./actions/middleware": {
57
+ "types": "./dist/actions/middleware.d.ts",
58
+ "import": "./dist/actions/middleware.js"
59
+ },
60
+ "./actions/streaming": {
61
+ "types": "./dist/actions/streaming.d.ts",
62
+ "import": "./dist/actions/streaming.js"
63
+ },
64
+ "./actions/queue": {
65
+ "types": "./dist/actions/queue.d.ts",
66
+ "import": "./dist/actions/queue.js"
67
+ },
68
+ "./handlers": {
69
+ "types": "./dist/handlers/index.d.ts",
70
+ "import": "./dist/handlers/index.js"
71
+ },
72
+ "./streaming": {
73
+ "types": "./dist/streaming/index.d.ts",
74
+ "import": "./dist/streaming/index.js"
75
+ },
76
+ "./streaming/priority": {
77
+ "types": "./dist/streaming/priority.d.ts",
78
+ "import": "./dist/streaming/priority.js"
79
+ },
80
+ "./streaming/observability": {
81
+ "types": "./dist/streaming/observability.d.ts",
82
+ "import": "./dist/streaming/observability.js"
83
+ },
84
+ "./streaming/conditional": {
85
+ "types": "./dist/streaming/conditional.d.ts",
86
+ "import": "./dist/streaming/conditional.js"
87
+ },
88
+ "./streaming/adapters": {
89
+ "types": "./dist/streaming/adapters/index.d.ts",
90
+ "import": "./dist/streaming/adapters/index.js"
91
+ },
92
+ "./islands": {
93
+ "types": "./dist/islands/index.d.ts",
94
+ "import": "./dist/islands/index.js"
95
+ },
96
+ "./file-router/streaming-hints": {
97
+ "types": "./dist/file-router/streaming-hints.d.ts",
98
+ "import": "./dist/file-router/streaming-hints.js"
99
+ },
100
+ "./rsc": {
101
+ "types": "./dist/rsc/index.d.ts",
102
+ "import": "./dist/rsc/index.js"
103
+ },
104
+ "./rsc/payload": {
105
+ "types": "./dist/rsc/payload.d.ts",
106
+ "import": "./dist/rsc/payload.js"
107
+ },
108
+ "./rsc/boundaries": {
109
+ "types": "./dist/rsc/boundaries.d.ts",
110
+ "import": "./dist/rsc/boundaries.js"
111
+ },
112
+ "./rsc/context": {
113
+ "types": "./dist/rsc/context.d.ts",
114
+ "import": "./dist/rsc/context.js"
115
+ },
116
+ "./rsc/stream": {
117
+ "types": "./dist/rsc/stream.d.ts",
118
+ "import": "./dist/rsc/stream.js"
119
+ },
120
+ "./rsc/renderer": {
121
+ "types": "./dist/rsc/renderer.d.ts",
122
+ "import": "./dist/rsc/renderer.js"
123
+ },
124
+ "./rsc/vite-plugin": {
125
+ "types": "./dist/rsc/vite-plugin.d.ts",
126
+ "import": "./dist/rsc/vite-plugin.js"
127
+ },
128
+ "./rsc/adapters": {
129
+ "types": "./dist/rsc/adapters/index.d.ts",
130
+ "import": "./dist/rsc/adapters/index.js"
131
+ },
132
+ "./rsc/adapters/react": {
133
+ "types": "./dist/rsc/adapters/react.d.ts",
134
+ "import": "./dist/rsc/adapters/react.js"
135
+ },
136
+ "./rsc/adapters/vue": {
137
+ "types": "./dist/rsc/adapters/vue.d.ts",
138
+ "import": "./dist/rsc/adapters/vue.js"
139
+ },
140
+ "./rsc/adapters/solid": {
141
+ "types": "./dist/rsc/adapters/solid.d.ts",
142
+ "import": "./dist/rsc/adapters/solid.js"
143
+ },
144
+ "./rsc/adapters/preact": {
145
+ "types": "./dist/rsc/adapters/preact.d.ts",
146
+ "import": "./dist/rsc/adapters/preact.js"
147
+ },
148
+ "./rsc/plugins": {
149
+ "types": "./dist/rsc/plugins/index.d.ts",
150
+ "import": "./dist/rsc/plugins/index.js"
151
+ },
152
+ "./rsc/plugins/esbuild": {
153
+ "types": "./dist/rsc/plugins/esbuild.d.ts",
154
+ "import": "./dist/rsc/plugins/esbuild.js"
155
+ },
156
+ "./rsc/plugins/rollup": {
157
+ "types": "./dist/rsc/plugins/rollup.d.ts",
158
+ "import": "./dist/rsc/plugins/rollup.js"
159
+ }
160
+ },
161
+ "main": "./dist/index.js",
162
+ "types": "./dist/index.d.ts",
163
+ "files": [
164
+ "dist"
165
+ ],
166
+ "scripts": {
167
+ "build": "tsup",
168
+ "dev": "tsup --watch",
169
+ "test": "vitest run",
170
+ "test:watch": "vitest",
171
+ "lint": "eslint src/",
172
+ "clean": "rimraf dist",
173
+ "typecheck": "tsc --noEmit"
174
+ },
175
+ "dependencies": {
176
+ "radix3": "^1.1.0"
177
+ },
178
+ "devDependencies": {
179
+ "@types/node": "^22.0.0",
180
+ "rimraf": "^6.0.0",
181
+ "tsup": "^8.0.0",
182
+ "typescript": "^5.7.0",
183
+ "vitest": "^2.0.0"
184
+ },
185
+ "peerDependencies": {
186
+ "vite": "^6.0.0 || ^7.0.0"
187
+ },
188
+ "peerDependenciesMeta": {
189
+ "vite": {
190
+ "optional": true
191
+ }
170
192
  }
171
- },
172
- "scripts": {
173
- "build": "tsup",
174
- "dev": "tsup --watch",
175
- "test": "vitest run",
176
- "test:watch": "vitest",
177
- "lint": "eslint src/",
178
- "clean": "rimraf dist",
179
- "typecheck": "tsc --noEmit"
180
- }
181
193
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024-2026 Flight Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,120 +0,0 @@
1
- // src/cache/index.ts
2
- var MemoryCacheAdapter = class {
3
- name = "memory";
4
- store = /* @__PURE__ */ new Map();
5
- async get(key) {
6
- const entry = this.store.get(key);
7
- if (!entry) return void 0;
8
- if (entry.expiresAt && Date.now() > entry.expiresAt) {
9
- this.store.delete(key);
10
- return void 0;
11
- }
12
- return entry;
13
- }
14
- async set(key, entry) {
15
- this.store.set(key, entry);
16
- }
17
- async delete(key) {
18
- return this.store.delete(key);
19
- }
20
- async has(key) {
21
- const entry = await this.get(key);
22
- return entry !== void 0;
23
- }
24
- async clear() {
25
- this.store.clear();
26
- }
27
- async keys(pattern) {
28
- const allKeys = Array.from(this.store.keys());
29
- if (!pattern) return allKeys;
30
- const regex = new RegExp(pattern.replace(/\*/g, ".*"));
31
- return allKeys.filter((key) => regex.test(key));
32
- }
33
- };
34
- function createCache(options = {}) {
35
- const {
36
- adapter = new MemoryCacheAdapter(),
37
- defaultTTL,
38
- prefix = ""
39
- } = options;
40
- const tagIndex = /* @__PURE__ */ new Map();
41
- function prefixKey(key) {
42
- return prefix ? `${prefix}:${key}` : key;
43
- }
44
- return {
45
- async get(key) {
46
- const entry = await adapter.get(prefixKey(key));
47
- if (!entry) return void 0;
48
- if (entry.staleAt && Date.now() > entry.staleAt) {
49
- return entry.value;
50
- }
51
- return entry.value;
52
- },
53
- async set(key, value, opts) {
54
- const ttl = opts?.ttl ?? defaultTTL;
55
- const now = Date.now();
56
- const entry = {
57
- value,
58
- createdAt: now,
59
- tags: opts?.tags
60
- };
61
- if (ttl) {
62
- entry.expiresAt = now + ttl * 1e3;
63
- if (opts?.swr) {
64
- entry.staleAt = now + (ttl - opts.swr) * 1e3;
65
- }
66
- }
67
- const fullKey = prefixKey(key);
68
- await adapter.set(fullKey, entry);
69
- if (opts?.tags) {
70
- for (const tag of opts.tags) {
71
- if (!tagIndex.has(tag)) {
72
- tagIndex.set(tag, /* @__PURE__ */ new Set());
73
- }
74
- tagIndex.get(tag).add(fullKey);
75
- }
76
- }
77
- },
78
- async delete(key) {
79
- return adapter.delete(prefixKey(key));
80
- },
81
- async has(key) {
82
- return adapter.has(prefixKey(key));
83
- },
84
- async clear() {
85
- await adapter.clear();
86
- tagIndex.clear();
87
- },
88
- async invalidateTag(tag) {
89
- const keys = tagIndex.get(tag);
90
- if (!keys) return;
91
- for (const key of keys) {
92
- await adapter.delete(key);
93
- }
94
- tagIndex.delete(tag);
95
- },
96
- async getOrSet(key, factory, opts) {
97
- const cached2 = await this.get(key);
98
- if (cached2 !== void 0) {
99
- return cached2;
100
- }
101
- const value = await factory();
102
- await this.set(key, value, opts);
103
- return value;
104
- }
105
- };
106
- }
107
- function cacheKey(...parts) {
108
- return parts.filter((p) => p !== void 0).map((p) => String(p)).join(":");
109
- }
110
- function cached(cache, fn, options) {
111
- const { keyFn = (...args) => JSON.stringify(args), ...cacheOpts } = options ?? {};
112
- return (async (...args) => {
113
- const key = keyFn(...args);
114
- return cache.getOrSet(key, () => fn(...args), cacheOpts);
115
- });
116
- }
117
-
118
- export { cacheKey, cached, createCache };
119
- //# sourceMappingURL=chunk-3AIQVGTM.js.map
120
- //# sourceMappingURL=chunk-3AIQVGTM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cache/index.ts"],"names":["cached"],"mappings":"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","file":"chunk-3AIQVGTM.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, or anything else.\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 /** 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\r\n/** Adapter interface for external cache providers */\r\nexport interface CacheAdapter {\r\n name: string;\r\n get<T>(key: string): Promise<CacheEntry<T> | undefined>;\r\n set<T>(key: string, entry: CacheEntry<T>): Promise<void>;\r\n delete(key: string): Promise<boolean>;\r\n has(key: string): Promise<boolean>;\r\n clear(): Promise<void>;\r\n keys?(pattern?: string): Promise<string[]>;\r\n}\r\n\r\n// ============================================================================\r\n// In-Memory Cache Implementation (Default)\r\n// ============================================================================\r\n\r\nclass MemoryCacheAdapter implements CacheAdapter {\r\n name = 'memory';\r\n private store = new Map<string, CacheEntry<unknown>>();\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 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 this.store.set(key, entry as CacheEntry<unknown>);\r\n }\r\n\r\n async delete(key: string): Promise<boolean> {\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 }\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\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 */\r\n defaultTTL?: number;\r\n /** Key prefix for namespacing */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Create a new cache instance\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 } = options;\r\n\r\n const tagIndex = new Map<string, Set<string>>();\r\n\r\n function prefixKey(key: string): string {\r\n return prefix ? `${prefix}:${key}` : key;\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 if (!entry) return undefined;\r\n\r\n // Check stale-while-revalidate\r\n if (entry.staleAt && Date.now() > entry.staleAt) {\r\n // Return stale value (caller should revalidate)\r\n return entry.value;\r\n }\r\n\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\r\n // Update tag index\r\n if (opts?.tags) {\r\n for (const tag of opts.tags) {\r\n if (!tagIndex.has(tag)) {\r\n tagIndex.set(tag, new Set());\r\n }\r\n tagIndex.get(tag)!.add(fullKey);\r\n }\r\n }\r\n },\r\n\r\n async delete(key: string): Promise<boolean> {\r\n return adapter.delete(prefixKey(key));\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 tagIndex.clear();\r\n },\r\n\r\n async invalidateTag(tag: string): Promise<void> {\r\n const keys = tagIndex.get(tag);\r\n if (!keys) return;\r\n\r\n for (const key of keys) {\r\n await adapter.delete(key);\r\n }\r\n tagIndex.delete(tag);\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}\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\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\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/index.ts"],"names":[],"mappings":"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","file":"chunk-3TPAA52K.js","sourcesContent":["/**\r\n * Flight Configuration - User configuration system\r\n */\r\n\r\nimport type { RenderMode } from '../render/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** UI Framework configuration */\r\nexport interface UIConfig {\r\n /** The UI framework to use */\r\n framework?: 'react' | 'vue' | 'svelte' | 'solid' | 'preact' | 'vanilla' | string;\r\n /** Framework-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/** Rendering configuration */\r\nexport interface RenderConfig {\r\n /** Default render mode */\r\n default?: RenderMode;\r\n /** Per-route render mode overrides */\r\n routes?: Record<string, RenderMode>;\r\n}\r\n\r\n/** Development server options */\r\nexport interface DevConfig {\r\n /** Port to run dev server on */\r\n port?: number;\r\n /** Host to bind to */\r\n host?: string | boolean;\r\n /** Open browser on start */\r\n open?: boolean;\r\n /** HTTPS configuration */\r\n https?: boolean | {\r\n key?: string;\r\n cert?: string;\r\n };\r\n /** Proxy configuration */\r\n proxy?: Record<string, string | {\r\n target: string;\r\n changeOrigin?: boolean;\r\n rewrite?: (path: string) => string;\r\n }>;\r\n}\r\n\r\n/** Build configuration */\r\nexport interface BuildConfig {\r\n /** Output directory */\r\n outDir?: string;\r\n /** Source directory */\r\n srcDir?: string;\r\n /** Public assets directory */\r\n publicDir?: string;\r\n /** Routes directory */\r\n routesDir?: string;\r\n /** Generate sourcemaps */\r\n sourcemap?: boolean | 'inline' | 'hidden';\r\n /** Minify output */\r\n minify?: boolean | 'terser' | 'esbuild';\r\n /** Target environments */\r\n target?: string | string[];\r\n}\r\n\r\n/** Full Flight configuration (resolved) */\r\nexport interface FlightConfig {\r\n /** Root directory */\r\n root: string;\r\n /** Deployment adapter */\r\n adapter: FlightAdapter | null;\r\n /** UI framework configuration */\r\n ui: UIConfig;\r\n /** Rendering configuration */\r\n rendering: RenderConfig;\r\n /** Development server options */\r\n dev: Required<DevConfig>;\r\n /** Build configuration */\r\n build: Required<BuildConfig>;\r\n /** Vite configuration overrides */\r\n vite?: Record<string, unknown>;\r\n /** Plugin configurations */\r\n plugins: FlightPlugin[];\r\n}\r\n\r\n/** Flight plugin interface */\r\nexport interface FlightPlugin {\r\n /** Plugin name */\r\n name: string;\r\n /** Hook into config resolution */\r\n config?: (config: FlightConfig) => FlightConfig | void | Promise<FlightConfig | void>;\r\n /** Hook into build start */\r\n buildStart?: () => void | Promise<void>;\r\n /** Hook into build end */\r\n buildEnd?: () => void | Promise<void>;\r\n /** Hook into dev server start */\r\n devStart?: () => void | Promise<void>;\r\n}\r\n\r\n/** User-provided configuration (partial) */\r\nexport interface FlightUserConfig {\r\n /** Root directory (defaults to process.cwd()) */\r\n root?: string;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** UI framework configuration */\r\n ui?: UIConfig;\r\n /** Rendering configuration */\r\n rendering?: RenderConfig;\r\n /** Development server options */\r\n dev?: DevConfig;\r\n /** Build configuration */\r\n build?: BuildConfig;\r\n /** Vite configuration overrides */\r\n vite?: Record<string, unknown>;\r\n /** Plugins */\r\n plugins?: FlightPlugin[];\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Factory\r\n// ============================================================================\r\n\r\n/** Default configuration values */\r\nconst DEFAULT_CONFIG: Omit<FlightConfig, 'root'> = {\r\n adapter: null,\r\n ui: {\r\n framework: 'vanilla',\r\n },\r\n rendering: {\r\n default: 'ssr',\r\n routes: {},\r\n },\r\n dev: {\r\n port: 5173,\r\n host: 'localhost',\r\n open: false,\r\n https: false,\r\n proxy: {},\r\n },\r\n build: {\r\n outDir: 'dist',\r\n srcDir: 'src',\r\n publicDir: 'public',\r\n routesDir: 'src/routes',\r\n sourcemap: false,\r\n minify: true,\r\n target: 'es2022',\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Define Flight configuration\r\n * \r\n * @example\r\n * ```typescript\r\n * // flight.config.ts\r\n * import { defineConfig } from '@flight-framework/core';\r\n * import node from '@flight-framework/adapter-node';\r\n * \r\n * export default defineConfig({\r\n * adapter: node(),\r\n * ui: { framework: 'react' },\r\n * rendering: {\r\n * default: 'ssr',\r\n * routes: {\r\n * '/blog/*': 'ssg',\r\n * '/app/*': 'csr',\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: FlightUserConfig): FlightUserConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Resolve user config to full config with defaults\r\n */\r\nexport function resolveConfig(userConfig: FlightUserConfig = {}): FlightConfig {\r\n return {\r\n root: userConfig.root ?? process.cwd(),\r\n adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,\r\n ui: {\r\n ...DEFAULT_CONFIG.ui,\r\n ...userConfig.ui,\r\n },\r\n rendering: {\r\n ...DEFAULT_CONFIG.rendering,\r\n ...userConfig.rendering,\r\n },\r\n dev: {\r\n ...DEFAULT_CONFIG.dev,\r\n ...userConfig.dev,\r\n } as Required<DevConfig>,\r\n build: {\r\n ...DEFAULT_CONFIG.build,\r\n ...userConfig.build,\r\n } as Required<BuildConfig>,\r\n vite: userConfig.vite,\r\n plugins: userConfig.plugins ?? [],\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Config Loading\r\n// ============================================================================\r\n\r\nconst CONFIG_FILES = [\r\n 'flight.config.ts',\r\n 'flight.config.js',\r\n 'flight.config.mjs',\r\n 'flight.config.mts',\r\n];\r\n\r\n/**\r\n * Find the config file in a directory\r\n */\r\nexport async function findConfigFile(root: string): Promise<string | null> {\r\n // Dynamic import for Node.js fs\r\n const { existsSync } = await import('node:fs');\r\n const { join } = await import('node:path');\r\n\r\n for (const file of CONFIG_FILES) {\r\n const path = join(root, file);\r\n if (existsSync(path)) {\r\n return path;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Load configuration from file\r\n */\r\nexport async function loadConfig(root: string = process.cwd()): Promise<FlightConfig> {\r\n const configFile = await findConfigFile(root);\r\n\r\n if (!configFile) {\r\n return resolveConfig({ root });\r\n }\r\n\r\n try {\r\n // Use dynamic import for the config file\r\n // On Windows, we need to convert the path to a file:// URL\r\n const { pathToFileURL } = await import('node:url');\r\n const configUrl = pathToFileURL(configFile).href;\r\n const module = await import(configUrl);\r\n const userConfig = module.default as FlightUserConfig;\r\n\r\n return resolveConfig({\r\n ...userConfig,\r\n root,\r\n });\r\n } catch (error) {\r\n console.error(`Failed to load config from ${configFile}:`, error);\r\n return resolveConfig({ root });\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/adapters/react.ts"],"names":[],"mappings":"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","file":"chunk-6Z2RYHEU.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 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"]}