@flightdev/core 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +541 -0
  3. package/dist/actions/index.d.ts +743 -0
  4. package/dist/actions/index.js +3 -0
  5. package/dist/actions/index.js.map +1 -0
  6. package/dist/adapters/index.d.ts +502 -0
  7. package/dist/adapters/index.js +3 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/cache/index.d.ts +191 -0
  10. package/dist/cache/index.js +3 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/chunk-62HISNA3.js +354 -0
  13. package/dist/chunk-62HISNA3.js.map +1 -0
  14. package/dist/chunk-63LWTEDQ.js +341 -0
  15. package/dist/chunk-63LWTEDQ.js.map +1 -0
  16. package/dist/chunk-63SCEXD7.js +3 -0
  17. package/dist/chunk-63SCEXD7.js.map +1 -0
  18. package/dist/chunk-72MYOTUB.js +667 -0
  19. package/dist/chunk-72MYOTUB.js.map +1 -0
  20. package/dist/chunk-7CNW24MQ.js +257 -0
  21. package/dist/chunk-7CNW24MQ.js.map +1 -0
  22. package/dist/chunk-7WIEAUJT.js +300 -0
  23. package/dist/chunk-7WIEAUJT.js.map +1 -0
  24. package/dist/chunk-7ZZF4ULK.js +259 -0
  25. package/dist/chunk-7ZZF4ULK.js.map +1 -0
  26. package/dist/chunk-AE3JTS73.js +222 -0
  27. package/dist/chunk-AE3JTS73.js.map +1 -0
  28. package/dist/chunk-AP5NLUSB.js +258 -0
  29. package/dist/chunk-AP5NLUSB.js.map +1 -0
  30. package/dist/chunk-C37YQQI7.js +221 -0
  31. package/dist/chunk-C37YQQI7.js.map +1 -0
  32. package/dist/chunk-DCLVXFVH.js +225 -0
  33. package/dist/chunk-DCLVXFVH.js.map +1 -0
  34. package/dist/chunk-DZMWWDFD.js +223 -0
  35. package/dist/chunk-DZMWWDFD.js.map +1 -0
  36. package/dist/chunk-GCQZ4FHI.js +245 -0
  37. package/dist/chunk-GCQZ4FHI.js.map +1 -0
  38. package/dist/chunk-IPP44XY6.js +47 -0
  39. package/dist/chunk-IPP44XY6.js.map +1 -0
  40. package/dist/chunk-IW7FTQQX.js +267 -0
  41. package/dist/chunk-IW7FTQQX.js.map +1 -0
  42. package/dist/chunk-JX4YSCBH.js +428 -0
  43. package/dist/chunk-JX4YSCBH.js.map +1 -0
  44. package/dist/chunk-KX6UYWWR.js +229 -0
  45. package/dist/chunk-KX6UYWWR.js.map +1 -0
  46. package/dist/chunk-LWVETFJV.js +46 -0
  47. package/dist/chunk-LWVETFJV.js.map +1 -0
  48. package/dist/chunk-MCL2MCA2.js +285 -0
  49. package/dist/chunk-MCL2MCA2.js.map +1 -0
  50. package/dist/chunk-MZXCF35B.js +205 -0
  51. package/dist/chunk-MZXCF35B.js.map +1 -0
  52. package/dist/chunk-NCGPUFWV.js +96 -0
  53. package/dist/chunk-NCGPUFWV.js.map +1 -0
  54. package/dist/chunk-OEJMIE2Q.js +351 -0
  55. package/dist/chunk-OEJMIE2Q.js.map +1 -0
  56. package/dist/chunk-OYF2OAKS.js +394 -0
  57. package/dist/chunk-OYF2OAKS.js.map +1 -0
  58. package/dist/chunk-P6S43FYZ.js +316 -0
  59. package/dist/chunk-P6S43FYZ.js.map +1 -0
  60. package/dist/chunk-PL37KFRJ.js +3 -0
  61. package/dist/chunk-PL37KFRJ.js.map +1 -0
  62. package/dist/chunk-Q7BS5QC5.js +197 -0
  63. package/dist/chunk-Q7BS5QC5.js.map +1 -0
  64. package/dist/chunk-SDYPG3JD.js +288 -0
  65. package/dist/chunk-SDYPG3JD.js.map +1 -0
  66. package/dist/chunk-SUG56SZO.js +256 -0
  67. package/dist/chunk-SUG56SZO.js.map +1 -0
  68. package/dist/chunk-UVH5XJRP.js +164 -0
  69. package/dist/chunk-UVH5XJRP.js.map +1 -0
  70. package/dist/chunk-WZIJKCL3.js +282 -0
  71. package/dist/chunk-WZIJKCL3.js.map +1 -0
  72. package/dist/chunk-Y22AMGTM.js +3 -0
  73. package/dist/chunk-Y22AMGTM.js.map +1 -0
  74. package/dist/chunk-Z7G23XWU.js +200 -0
  75. package/dist/chunk-Z7G23XWU.js.map +1 -0
  76. package/dist/chunk-ZJU5M4IB.js +125 -0
  77. package/dist/chunk-ZJU5M4IB.js.map +1 -0
  78. package/dist/chunk-ZVC3ZWLM.js +52 -0
  79. package/dist/chunk-ZVC3ZWLM.js.map +1 -0
  80. package/dist/chunk-ZZZML7Y3.js +310 -0
  81. package/dist/chunk-ZZZML7Y3.js.map +1 -0
  82. package/dist/client.d.ts +25 -0
  83. package/dist/client.js +16 -0
  84. package/dist/client.js.map +1 -0
  85. package/dist/config/index.d.ts +170 -0
  86. package/dist/config/index.js +3 -0
  87. package/dist/config/index.js.map +1 -0
  88. package/dist/errors/index.d.ts +267 -0
  89. package/dist/errors/index.js +4 -0
  90. package/dist/errors/index.js.map +1 -0
  91. package/dist/file-router/index.d.ts +184 -0
  92. package/dist/file-router/index.js +3 -0
  93. package/dist/file-router/index.js.map +1 -0
  94. package/dist/file-router/streaming-hints.d.ts +129 -0
  95. package/dist/file-router/streaming-hints.js +3 -0
  96. package/dist/file-router/streaming-hints.js.map +1 -0
  97. package/dist/handlers/index.d.ts +59 -0
  98. package/dist/handlers/index.js +3 -0
  99. package/dist/handlers/index.js.map +1 -0
  100. package/dist/index.d.ts +588 -0
  101. package/dist/index.js +886 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/islands/index.d.ts +234 -0
  104. package/dist/islands/index.js +3 -0
  105. package/dist/islands/index.js.map +1 -0
  106. package/dist/middleware/index.d.ts +305 -0
  107. package/dist/middleware/index.js +3 -0
  108. package/dist/middleware/index.js.map +1 -0
  109. package/dist/react/index.d.ts +73 -0
  110. package/dist/react/index.js +52 -0
  111. package/dist/react/index.js.map +1 -0
  112. package/dist/render/index.d.ts +131 -0
  113. package/dist/render/index.js +3 -0
  114. package/dist/render/index.js.map +1 -0
  115. package/dist/router/index.d.ts +65 -0
  116. package/dist/router/index.js +3 -0
  117. package/dist/router/index.js.map +1 -0
  118. package/dist/rsc/adapters/index.d.ts +8 -0
  119. package/dist/rsc/adapters/index.js +7 -0
  120. package/dist/rsc/adapters/index.js.map +1 -0
  121. package/dist/rsc/adapters/preact.d.ts +97 -0
  122. package/dist/rsc/adapters/preact.js +3 -0
  123. package/dist/rsc/adapters/preact.js.map +1 -0
  124. package/dist/rsc/adapters/react.d.ts +82 -0
  125. package/dist/rsc/adapters/react.js +3 -0
  126. package/dist/rsc/adapters/react.js.map +1 -0
  127. package/dist/rsc/adapters/solid.d.ts +84 -0
  128. package/dist/rsc/adapters/solid.js +3 -0
  129. package/dist/rsc/adapters/solid.js.map +1 -0
  130. package/dist/rsc/adapters/vue.d.ts +80 -0
  131. package/dist/rsc/adapters/vue.js +3 -0
  132. package/dist/rsc/adapters/vue.js.map +1 -0
  133. package/dist/rsc/boundaries.d.ts +182 -0
  134. package/dist/rsc/boundaries.js +3 -0
  135. package/dist/rsc/boundaries.js.map +1 -0
  136. package/dist/rsc/context.d.ts +201 -0
  137. package/dist/rsc/context.js +3 -0
  138. package/dist/rsc/context.js.map +1 -0
  139. package/dist/rsc/index.d.ts +232 -0
  140. package/dist/rsc/index.js +15 -0
  141. package/dist/rsc/index.js.map +1 -0
  142. package/dist/rsc/legacy.d.ts +155 -0
  143. package/dist/rsc/legacy.js +3 -0
  144. package/dist/rsc/legacy.js.map +1 -0
  145. package/dist/rsc/payload.d.ts +262 -0
  146. package/dist/rsc/payload.js +3 -0
  147. package/dist/rsc/payload.js.map +1 -0
  148. package/dist/rsc/plugins/esbuild.d.ts +124 -0
  149. package/dist/rsc/plugins/esbuild.js +4 -0
  150. package/dist/rsc/plugins/esbuild.js.map +1 -0
  151. package/dist/rsc/plugins/index.d.ts +4 -0
  152. package/dist/rsc/plugins/index.js +6 -0
  153. package/dist/rsc/plugins/index.js.map +1 -0
  154. package/dist/rsc/plugins/rollup.d.ts +103 -0
  155. package/dist/rsc/plugins/rollup.js +4 -0
  156. package/dist/rsc/plugins/rollup.js.map +1 -0
  157. package/dist/rsc/renderer.d.ts +162 -0
  158. package/dist/rsc/renderer.js +5 -0
  159. package/dist/rsc/renderer.js.map +1 -0
  160. package/dist/rsc/stream.d.ts +129 -0
  161. package/dist/rsc/stream.js +3 -0
  162. package/dist/rsc/stream.js.map +1 -0
  163. package/dist/rsc/vite-plugin.d.ts +78 -0
  164. package/dist/rsc/vite-plugin.js +4 -0
  165. package/dist/rsc/vite-plugin.js.map +1 -0
  166. package/dist/server/index.d.ts +135 -0
  167. package/dist/server/index.js +6 -0
  168. package/dist/server/index.js.map +1 -0
  169. package/dist/streaming/adapters/index.d.ts +223 -0
  170. package/dist/streaming/adapters/index.js +3 -0
  171. package/dist/streaming/adapters/index.js.map +1 -0
  172. package/dist/streaming/conditional.d.ts +130 -0
  173. package/dist/streaming/conditional.js +3 -0
  174. package/dist/streaming/conditional.js.map +1 -0
  175. package/dist/streaming/index.d.ts +177 -0
  176. package/dist/streaming/index.js +3 -0
  177. package/dist/streaming/index.js.map +1 -0
  178. package/dist/streaming/observability.d.ts +201 -0
  179. package/dist/streaming/observability.js +4 -0
  180. package/dist/streaming/observability.js.map +1 -0
  181. package/dist/streaming/priority.d.ts +103 -0
  182. package/dist/streaming/priority.js +3 -0
  183. package/dist/streaming/priority.js.map +1 -0
  184. package/dist/utils/index.d.ts +42 -0
  185. package/dist/utils/index.js +4 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/package.json +228 -0
@@ -0,0 +1,316 @@
1
+ import { createServerChunk, createErrorChunk, toFlightElement, serialize, generateChunkId, createClientChunk } from './chunk-7CNW24MQ.js';
2
+ import { isClientReference } from './chunk-AP5NLUSB.js';
3
+
4
+ // src/rsc/renderer.ts
5
+ var FlightRenderer = class {
6
+ constructor(adapter, options = {}) {
7
+ this.adapter = adapter;
8
+ this.options = options;
9
+ }
10
+ chunks = [];
11
+ clientRefs = [];
12
+ pendingPromises = /* @__PURE__ */ new Map();
13
+ depth = 0;
14
+ /**
15
+ * Render a component tree to Flight chunks
16
+ */
17
+ async render(element, ctx) {
18
+ const startTime = Date.now();
19
+ this.chunks = [];
20
+ this.clientRefs = [];
21
+ this.pendingPromises.clear();
22
+ this.depth = 0;
23
+ try {
24
+ const rootTree = await this.renderElement(element, ctx);
25
+ const root = createServerChunk("root", rootTree);
26
+ this.chunks.unshift(root);
27
+ await this.resolvePendingChunks(ctx);
28
+ const endTime = Date.now();
29
+ return {
30
+ chunks: this.chunks,
31
+ root,
32
+ clientRefs: this.clientRefs,
33
+ timing: {
34
+ startTime,
35
+ endTime,
36
+ duration: endTime - startTime
37
+ }
38
+ };
39
+ } catch (error) {
40
+ const errChunk = createErrorChunk("root", error, this.options.dev);
41
+ this.chunks.push(errChunk);
42
+ throw error;
43
+ }
44
+ }
45
+ /**
46
+ * Render as async generator (for streaming)
47
+ */
48
+ async *renderStreaming(element, ctx) {
49
+ this.chunks = [];
50
+ this.clientRefs = [];
51
+ this.pendingPromises.clear();
52
+ this.depth = 0;
53
+ try {
54
+ const rootTree = await this.renderElement(element, ctx);
55
+ const root = createServerChunk("root", rootTree);
56
+ yield root;
57
+ while (this.pendingPromises.size > 0) {
58
+ const entries = [...this.pendingPromises.entries()];
59
+ const promises = entries.map(async ([id, promise]) => {
60
+ const tree = await promise;
61
+ this.pendingPromises.delete(id);
62
+ return createServerChunk(id, tree);
63
+ });
64
+ const chunk = await Promise.race(promises);
65
+ yield chunk;
66
+ }
67
+ for (const clientRef of this.clientRefs) {
68
+ yield clientRef;
69
+ }
70
+ } catch (error) {
71
+ yield createErrorChunk("root", error, this.options.dev);
72
+ }
73
+ }
74
+ /**
75
+ * Render an element to FlightElement
76
+ */
77
+ async renderElement(element, ctx) {
78
+ this.depth++;
79
+ if (this.depth > (this.options.maxDepth ?? 100)) {
80
+ throw new Error("Maximum render depth exceeded. Check for infinite component loops.");
81
+ }
82
+ try {
83
+ if (element === null || element === void 0 || typeof element === "boolean") {
84
+ return { $$type: "null" };
85
+ }
86
+ if (typeof element === "string") {
87
+ return { $$type: "text", value: element };
88
+ }
89
+ if (typeof element === "number") {
90
+ return { $$type: "text", value: String(element) };
91
+ }
92
+ if (Array.isArray(element)) {
93
+ const children = await Promise.all(
94
+ element.map((child) => this.renderElement(child, ctx))
95
+ );
96
+ return { $$type: "fragment", children };
97
+ }
98
+ if (isClientReference(element)) {
99
+ return this.renderClientReference(element, ctx);
100
+ }
101
+ if (this.adapter.isElement(element)) {
102
+ return this.renderFrameworkElement(element, ctx);
103
+ }
104
+ return toFlightElement(element);
105
+ } finally {
106
+ this.depth--;
107
+ }
108
+ }
109
+ /**
110
+ * Render a framework-specific element
111
+ */
112
+ async renderFrameworkElement(element, ctx) {
113
+ const typeInfo = this.adapter.getElementType(element);
114
+ const props = this.adapter.getProps(element);
115
+ const key = this.adapter.getKey(element);
116
+ switch (typeInfo.kind) {
117
+ case "host":
118
+ return this.renderHostElement(typeInfo.tag, props, key, ctx);
119
+ case "component":
120
+ return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);
121
+ case "fragment": {
122
+ const children = this.adapter.getChildren(element);
123
+ const renderedChildren = await Promise.all(
124
+ children.map((child) => this.renderElement(child, ctx))
125
+ );
126
+ return { $$type: "fragment", children: renderedChildren };
127
+ }
128
+ case "suspense": {
129
+ return this.renderSuspense(element, typeInfo.fallback, ctx);
130
+ }
131
+ case "text":
132
+ return { $$type: "text", value: typeInfo.value };
133
+ case "null":
134
+ return { $$type: "null" };
135
+ default:
136
+ return { $$type: "null" };
137
+ }
138
+ }
139
+ /**
140
+ * Render a host element (div, span, etc.)
141
+ */
142
+ async renderHostElement(tag, props, key, ctx) {
143
+ const { children: childrenProp, ...restProps } = props;
144
+ const serializedProps = {};
145
+ for (const [propKey, value] of Object.entries(restProps)) {
146
+ if (typeof value !== "function") {
147
+ serializedProps[propKey] = serialize(value);
148
+ }
149
+ }
150
+ const rawChildren = childrenProp ? Array.isArray(childrenProp) ? childrenProp : [childrenProp] : [];
151
+ const children = await Promise.all(
152
+ rawChildren.map((child) => this.renderElement(child, ctx))
153
+ );
154
+ return {
155
+ $$type: "host",
156
+ tag,
157
+ key,
158
+ props: serializedProps,
159
+ children
160
+ };
161
+ }
162
+ /**
163
+ * Render a component (server or client)
164
+ */
165
+ async renderComponent(component, name, props, ctx) {
166
+ if (this.adapter.isClientBoundary(component)) {
167
+ return this.renderClientBoundary(component, name, props, ctx);
168
+ }
169
+ try {
170
+ const result = await component(props, ctx);
171
+ return this.renderElement(result, ctx);
172
+ } catch (error) {
173
+ if (error instanceof Promise) {
174
+ return this.renderAsyncBoundary(error, name, props, ctx);
175
+ }
176
+ this.options.onError?.(error, name);
177
+ throw error;
178
+ }
179
+ }
180
+ /**
181
+ * Render a client boundary
182
+ */
183
+ async renderClientBoundary(component, name, props, _ctx) {
184
+ const chunkId = generateChunkId("c");
185
+ const moduleId = component.__flight_module ?? name;
186
+ const exportName = component.__flight_export ?? "default";
187
+ let fallback;
188
+ if (this.options.includeSSRFallbacks && this.adapter.renderToString) {
189
+ try {
190
+ fallback = await this.adapter.renderToString(props);
191
+ } catch {
192
+ }
193
+ }
194
+ const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);
195
+ this.clientRefs.push(clientChunk);
196
+ this.chunks.push(clientChunk);
197
+ return {
198
+ $$type: "client",
199
+ ref: chunkId,
200
+ ssr: fallback
201
+ };
202
+ }
203
+ /**
204
+ * Render a Suspense boundary
205
+ */
206
+ async renderSuspense(element, fallbackElement, ctx) {
207
+ const boundaryId = generateChunkId("s");
208
+ const children = this.adapter.getChildren(element);
209
+ const fallback = fallbackElement ? await this.renderElement(fallbackElement, ctx) : { $$type: "null" };
210
+ const renderedChildren = [];
211
+ for (const child of children) {
212
+ try {
213
+ const rendered = await this.renderElement(child, ctx);
214
+ renderedChildren.push(rendered);
215
+ } catch (error) {
216
+ if (error instanceof Promise) {
217
+ this.pendingPromises.set(boundaryId, error.then(async () => {
218
+ const children2 = this.adapter.getChildren(element);
219
+ const rendered = await Promise.all(
220
+ children2.map((c) => this.renderElement(c, ctx))
221
+ );
222
+ return { $$type: "fragment", children: rendered };
223
+ }));
224
+ return {
225
+ $$type: "suspense",
226
+ id: boundaryId,
227
+ fallback,
228
+ children: [{ $$type: "lazy", id: boundaryId, fallback }]
229
+ };
230
+ }
231
+ throw error;
232
+ }
233
+ }
234
+ return {
235
+ $$type: "suspense",
236
+ id: boundaryId,
237
+ fallback,
238
+ children: renderedChildren
239
+ };
240
+ }
241
+ /**
242
+ * Render an async boundary (promise thrown from component)
243
+ */
244
+ renderAsyncBoundary(promise, name, props, ctx) {
245
+ const boundaryId = generateChunkId("a");
246
+ this.pendingPromises.set(
247
+ boundaryId,
248
+ promise.then(async () => {
249
+ const component = props.component;
250
+ if (component) {
251
+ const result = await component(props, ctx);
252
+ return this.renderElement(result, ctx);
253
+ }
254
+ return { $$type: "null" };
255
+ })
256
+ );
257
+ return {
258
+ $$type: "lazy",
259
+ id: boundaryId,
260
+ fallback: { $$type: "text", value: `Loading ${name}...` }
261
+ };
262
+ }
263
+ /**
264
+ * Render a Client Reference directly
265
+ */
266
+ async renderClientReference(ref, _ctx) {
267
+ const chunkId = generateChunkId("c");
268
+ const clientChunk = createClientChunk(
269
+ chunkId,
270
+ ref.__flight_module,
271
+ ref.__flight_export,
272
+ {}
273
+ // Props are embedded in the reference
274
+ );
275
+ this.clientRefs.push(clientChunk);
276
+ this.chunks.push(clientChunk);
277
+ return {
278
+ $$type: "client",
279
+ ref: chunkId
280
+ };
281
+ }
282
+ /**
283
+ * Resolve all pending async chunks
284
+ */
285
+ async resolvePendingChunks(_ctx) {
286
+ while (this.pendingPromises.size > 0) {
287
+ const entries = [...this.pendingPromises.entries()];
288
+ for (const [id, promise] of entries) {
289
+ try {
290
+ const tree = await promise;
291
+ this.chunks.push(createServerChunk(id, tree));
292
+ } catch (error) {
293
+ this.chunks.push(createErrorChunk(id, error, this.options.dev));
294
+ }
295
+ this.pendingPromises.delete(id);
296
+ }
297
+ }
298
+ }
299
+ };
300
+ function createRenderer(adapter, options) {
301
+ return new FlightRenderer(adapter, options);
302
+ }
303
+ async function renderServerComponent(component, props, ctx, adapter, options) {
304
+ const renderer = createRenderer(adapter, options);
305
+ const element = adapter.createElement(component, props);
306
+ return renderer.render(element, ctx);
307
+ }
308
+ async function* renderServerComponentStreaming(component, props, ctx, adapter, options) {
309
+ const renderer = createRenderer(adapter, options);
310
+ const element = adapter.createElement(component, props);
311
+ yield* renderer.renderStreaming(element, ctx);
312
+ }
313
+
314
+ export { FlightRenderer, createRenderer, renderServerComponent, renderServerComponentStreaming };
315
+ //# sourceMappingURL=chunk-P6S43FYZ.js.map
316
+ //# sourceMappingURL=chunk-P6S43FYZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/renderer.ts"],"names":["children"],"mappings":"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","file":"chunk-P6S43FYZ.js","sourcesContent":["/**\r\n * @flightdev/core - Server Component Renderer\r\n * \r\n * Renders Server Components to FlightChunks.\r\n * Framework-agnostic rendering engine that works with adapters.\r\n * \r\n * @module @flightdev/core/rsc/renderer\r\n */\r\n\r\nimport type {\r\n FlightChunk,\r\n FlightElement,\r\n ServerComponentChunk,\r\n ClientReferenceChunk,\r\n} from './payload.js';\r\nimport {\r\n generateChunkId,\r\n createServerChunk,\r\n createClientChunk,\r\n createErrorChunk,\r\n toFlightElement,\r\n serialize,\r\n} from './payload.js';\r\nimport {\r\n isClientReference,\r\n type ClientReference,\r\n} from './boundaries.js';\r\nimport type { ServerContext } from './context.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * UI Framework adapter for rendering\r\n */\r\nexport interface UIAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** Check if value is a framework element */\r\n isElement(value: unknown): boolean;\r\n\r\n /** Get element type info */\r\n getElementType(element: unknown): ElementTypeInfo;\r\n\r\n /** Get element props */\r\n getProps(element: unknown): Record<string, unknown>;\r\n\r\n /** Get element children */\r\n getChildren(element: unknown): unknown[];\r\n\r\n /** Get element key */\r\n getKey(element: unknown): string | number | undefined;\r\n\r\n /** Check if component is a client boundary */\r\n isClientBoundary(component: unknown): boolean;\r\n\r\n /** \r\n * Create a framework-specific element\r\n * This abstracts away React's Symbol.for('react.element'), Vue's VNode, etc.\r\n */\r\n createElement(\r\n component: ComponentFn,\r\n props: Record<string, unknown>\r\n ): unknown;\r\n\r\n /** Render element to HTML string (for SSR fallback) */\r\n renderToString?(element: unknown): Promise<string>;\r\n}\r\n\r\nexport type ElementTypeInfo =\r\n | { kind: 'host'; tag: string }\r\n | { kind: 'component'; fn: ComponentFn; name: string }\r\n | { kind: 'fragment' }\r\n | { kind: 'suspense'; fallback?: unknown }\r\n | { kind: 'provider'; value?: unknown }\r\n | { kind: 'context' }\r\n | { kind: 'text'; value: string }\r\n | { kind: 'null' };\r\n\r\n/**\r\n * Component function type\r\n */\r\nexport type ComponentFn = (\r\n props: Record<string, unknown>,\r\n ctx?: ServerContext\r\n) => unknown | Promise<unknown>;\r\n\r\n/**\r\n * Render options\r\n */\r\nexport interface RenderOptions {\r\n /** Include SSR fallbacks for client components */\r\n includeSSRFallbacks?: boolean;\r\n\r\n /** Error handler */\r\n onError?: (error: Error, componentName?: string) => void;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n\r\n /** Max render depth to prevent infinite loops */\r\n maxDepth?: number;\r\n}\r\n\r\n/**\r\n * Render result with metadata\r\n */\r\nexport interface RenderResult {\r\n /** All chunks generated */\r\n chunks: FlightChunk[];\r\n\r\n /** Root chunk */\r\n root: ServerComponentChunk;\r\n\r\n /** Client references found */\r\n clientRefs: ClientReferenceChunk[];\r\n\r\n /** Timing info */\r\n timing: {\r\n startTime: number;\r\n endTime: number;\r\n duration: number;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Renderer Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight Server Component Renderer\r\n */\r\nexport class FlightRenderer {\r\n private chunks: FlightChunk[] = [];\r\n private clientRefs: ClientReferenceChunk[] = [];\r\n private pendingPromises = new Map<string, Promise<FlightElement>>();\r\n private depth = 0;\r\n\r\n constructor(\r\n private adapter: UIAdapter,\r\n private options: RenderOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Render a component tree to Flight chunks\r\n */\r\n async render(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<RenderResult> {\r\n const startTime = Date.now();\r\n\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render the root element\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n this.chunks.unshift(root);\r\n\r\n // Wait for any pending async boundaries\r\n await this.resolvePendingChunks(ctx);\r\n\r\n const endTime = Date.now();\r\n\r\n return {\r\n chunks: this.chunks,\r\n root,\r\n clientRefs: this.clientRefs,\r\n timing: {\r\n startTime,\r\n endTime,\r\n duration: endTime - startTime,\r\n },\r\n };\r\n } catch (error) {\r\n const errChunk = createErrorChunk('root', error as Error, this.options.dev);\r\n this.chunks.push(errChunk);\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render as async generator (for streaming)\r\n */\r\n async *renderStreaming(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): AsyncGenerator<FlightChunk> {\r\n // Note: startTime available for future timing features\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render root synchronously\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n yield root;\r\n\r\n // Yield pending chunks as they resolve\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n // Race all pending promises\r\n const promises = entries.map(async ([id, promise]) => {\r\n const tree = await promise;\r\n this.pendingPromises.delete(id);\r\n return createServerChunk(id, tree);\r\n });\r\n\r\n // Yield first to complete\r\n const chunk = await Promise.race(promises);\r\n yield chunk;\r\n }\r\n\r\n // Yield all client refs\r\n for (const clientRef of this.clientRefs) {\r\n yield clientRef;\r\n }\r\n\r\n } catch (error) {\r\n yield createErrorChunk('root', error as Error, this.options.dev);\r\n }\r\n }\r\n\r\n /**\r\n * Render an element to FlightElement\r\n */\r\n private async renderElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check depth limit\r\n this.depth++;\r\n if (this.depth > (this.options.maxDepth ?? 100)) {\r\n throw new Error('Maximum render depth exceeded. Check for infinite component loops.');\r\n }\r\n\r\n try {\r\n // Handle null/undefined/boolean\r\n if (element === null || element === undefined || typeof element === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n\r\n // Handle primitives\r\n if (typeof element === 'string') {\r\n return { $$type: 'text', value: element };\r\n }\r\n if (typeof element === 'number') {\r\n return { $$type: 'text', value: String(element) };\r\n }\r\n\r\n // Handle arrays (fragments)\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(\r\n element.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children };\r\n }\r\n\r\n // Handle Client References\r\n if (isClientReference(element)) {\r\n return this.renderClientReference(element, ctx);\r\n }\r\n\r\n // Handle framework elements\r\n if (this.adapter.isElement(element)) {\r\n return this.renderFrameworkElement(element, ctx);\r\n }\r\n\r\n // Unknown - try to convert\r\n return toFlightElement(element);\r\n\r\n } finally {\r\n this.depth--;\r\n }\r\n }\r\n\r\n /**\r\n * Render a framework-specific element\r\n */\r\n private async renderFrameworkElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const typeInfo = this.adapter.getElementType(element);\r\n const props = this.adapter.getProps(element);\r\n const key = this.adapter.getKey(element);\r\n\r\n switch (typeInfo.kind) {\r\n case 'host':\r\n return this.renderHostElement(typeInfo.tag, props, key, ctx);\r\n\r\n case 'component':\r\n return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);\r\n\r\n case 'fragment': {\r\n const children = this.adapter.getChildren(element);\r\n const renderedChildren = await Promise.all(\r\n children.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children: renderedChildren };\r\n }\r\n\r\n case 'suspense': {\r\n return this.renderSuspense(element, typeInfo.fallback, ctx);\r\n }\r\n\r\n case 'text':\r\n return { $$type: 'text', value: typeInfo.value };\r\n\r\n case 'null':\r\n return { $$type: 'null' };\r\n\r\n default:\r\n return { $$type: 'null' };\r\n }\r\n }\r\n\r\n /**\r\n * Render a host element (div, span, etc.)\r\n */\r\n private async renderHostElement(\r\n tag: string,\r\n props: Record<string, unknown>,\r\n key: string | number | undefined,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Extract children\r\n const { children: childrenProp, ...restProps } = props;\r\n\r\n // Serialize props (excluding functions and children)\r\n const serializedProps: Record<string, unknown> = {};\r\n for (const [propKey, value] of Object.entries(restProps)) {\r\n if (typeof value !== 'function') {\r\n serializedProps[propKey] = serialize(value);\r\n }\r\n }\r\n\r\n // Render children\r\n const rawChildren = childrenProp ?\r\n (Array.isArray(childrenProp) ? childrenProp : [childrenProp]) :\r\n [];\r\n\r\n const children = await Promise.all(\r\n rawChildren.map(child => this.renderElement(child, ctx))\r\n );\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n key,\r\n props: serializedProps as Record<string, import('./payload.js').SerializedValue>,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Render a component (server or client)\r\n */\r\n private async renderComponent(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check if this is a client component\r\n if (this.adapter.isClientBoundary(component)) {\r\n return this.renderClientBoundary(component, name, props, ctx);\r\n }\r\n\r\n // Execute server component\r\n try {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n } catch (error) {\r\n // Check for Suspense promise\r\n if (error instanceof Promise) {\r\n return this.renderAsyncBoundary(error, name, props, ctx);\r\n }\r\n\r\n this.options.onError?.(error as Error, name);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render a client boundary\r\n */\r\n private async renderClientBoundary(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n // Get module info from component\r\n const moduleId = (component as unknown as { __flight_module?: string }).__flight_module ?? name;\r\n const exportName = (component as unknown as { __flight_export?: string }).__flight_export ?? 'default';\r\n\r\n // Generate SSR fallback if enabled\r\n let fallback: string | undefined;\r\n if (this.options.includeSSRFallbacks && this.adapter.renderToString) {\r\n try {\r\n // Create element with props for SSR\r\n fallback = await this.adapter.renderToString(props);\r\n } catch {\r\n // SSR failed, continue without fallback\r\n }\r\n }\r\n\r\n // Create client reference chunk\r\n const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n ssr: fallback,\r\n };\r\n }\r\n\r\n /**\r\n * Render a Suspense boundary\r\n */\r\n private async renderSuspense(\r\n element: unknown,\r\n fallbackElement: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const boundaryId = generateChunkId('s');\r\n const children = this.adapter.getChildren(element);\r\n\r\n // Render fallback\r\n const fallback = fallbackElement ?\r\n await this.renderElement(fallbackElement, ctx) :\r\n { $$type: 'null' as const };\r\n\r\n // Render children\r\n const renderedChildren: FlightElement[] = [];\r\n for (const child of children) {\r\n try {\r\n const rendered = await this.renderElement(child, ctx);\r\n renderedChildren.push(rendered);\r\n } catch (error) {\r\n if (error instanceof Promise) {\r\n // This is a suspended promise\r\n this.pendingPromises.set(boundaryId, error.then(async () => {\r\n const children = this.adapter.getChildren(element);\r\n const rendered = await Promise.all(\r\n children.map(c => this.renderElement(c, ctx))\r\n );\r\n return { $$type: 'fragment' as const, children: rendered };\r\n }));\r\n\r\n // Return suspense with fallback for now\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: [{ $$type: 'lazy', id: boundaryId, fallback }],\r\n };\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: renderedChildren,\r\n };\r\n }\r\n\r\n /**\r\n * Render an async boundary (promise thrown from component)\r\n */\r\n private renderAsyncBoundary(\r\n promise: Promise<unknown>,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): FlightElement {\r\n const boundaryId = generateChunkId('a');\r\n\r\n // Track this promise\r\n this.pendingPromises.set(boundaryId,\r\n promise.then(async () => {\r\n // Re-render the component after promise resolves\r\n const component = (props as unknown as { component: ComponentFn }).component;\r\n if (component) {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n }\r\n return { $$type: 'null' as const };\r\n })\r\n );\r\n\r\n return {\r\n $$type: 'lazy',\r\n id: boundaryId,\r\n fallback: { $$type: 'text', value: `Loading ${name}...` },\r\n };\r\n }\r\n\r\n /**\r\n * Render a Client Reference directly\r\n */\r\n private async renderClientReference(\r\n ref: ClientReference,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n const clientChunk = createClientChunk(\r\n chunkId,\r\n ref.__flight_module,\r\n ref.__flight_export,\r\n {} // Props are embedded in the reference\r\n );\r\n\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve all pending async chunks\r\n */\r\n private async resolvePendingChunks(_ctx: ServerContext): Promise<void> {\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n for (const [id, promise] of entries) {\r\n try {\r\n const tree = await promise;\r\n this.chunks.push(createServerChunk(id, tree));\r\n } catch (error) {\r\n this.chunks.push(createErrorChunk(id, error as Error, this.options.dev));\r\n }\r\n this.pendingPromises.delete(id);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a renderer with adapter\r\n */\r\nexport function createRenderer(\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): FlightRenderer {\r\n return new FlightRenderer(adapter, options);\r\n}\r\n\r\n/**\r\n * Render a server component tree\r\n */\r\nexport async function renderServerComponent<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): Promise<RenderResult> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n return renderer.render(element, ctx);\r\n}\r\n\r\nexport async function* renderServerComponentStreaming<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): AsyncGenerator<FlightChunk> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n yield* renderer.renderStreaming(element, ctx);\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-PL37KFRJ.js.map
3
+ //# sourceMappingURL=chunk-PL37KFRJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-PL37KFRJ.js"}
@@ -0,0 +1,197 @@
1
+ import { isProduction, isDevelopment } from './chunk-LWVETFJV.js';
2
+
3
+ // src/errors/index.ts
4
+ var FlightError = class extends Error {
5
+ /** HTTP status code */
6
+ statusCode;
7
+ /** Short status message */
8
+ statusMessage;
9
+ /** Additional error data */
10
+ data;
11
+ /** Whether this is a fatal error (shows full-screen) */
12
+ fatal;
13
+ /** Unique digest for production error correlation */
14
+ digest;
15
+ constructor(options) {
16
+ super(options.message || options.statusMessage || "An error occurred");
17
+ this.name = "FlightError";
18
+ this.statusCode = options.statusCode;
19
+ this.statusMessage = options.statusMessage || getDefaultStatusMessage(options.statusCode);
20
+ this.data = options.data;
21
+ this.fatal = options.fatal ?? false;
22
+ if (isProduction()) {
23
+ this.digest = generateDigest();
24
+ }
25
+ if (options.cause) {
26
+ this.cause = options.cause;
27
+ if (options.cause.stack) {
28
+ this.stack = `${this.stack}
29
+ Caused by: ${options.cause.stack}`;
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Convert to plain object for serialization
35
+ */
36
+ toJSON() {
37
+ return {
38
+ name: this.name,
39
+ message: this.message,
40
+ statusCode: this.statusCode,
41
+ statusMessage: this.statusMessage,
42
+ data: this.data,
43
+ fatal: this.fatal,
44
+ digest: this.digest
45
+ };
46
+ }
47
+ };
48
+ var BadRequestError = class extends FlightError {
49
+ constructor(message, data) {
50
+ super({ statusCode: 400, message, data });
51
+ this.name = "BadRequestError";
52
+ }
53
+ };
54
+ var UnauthorizedError = class extends FlightError {
55
+ constructor(message, data) {
56
+ super({ statusCode: 401, message: message || "Unauthorized", data });
57
+ this.name = "UnauthorizedError";
58
+ }
59
+ };
60
+ var ForbiddenError = class extends FlightError {
61
+ constructor(message, data) {
62
+ super({ statusCode: 403, message: message || "Forbidden", data });
63
+ this.name = "ForbiddenError";
64
+ }
65
+ };
66
+ var NotFoundError = class extends FlightError {
67
+ constructor(message, data) {
68
+ super({ statusCode: 404, message: message || "Not Found", data });
69
+ this.name = "NotFoundError";
70
+ }
71
+ };
72
+ var InternalError = class extends FlightError {
73
+ constructor(message, data) {
74
+ super({ statusCode: 500, message: message || "Internal Server Error", data });
75
+ this.name = "InternalError";
76
+ }
77
+ };
78
+ function createError(options) {
79
+ if (typeof options === "string") {
80
+ return new FlightError({ statusCode: 500, message: options });
81
+ }
82
+ return new FlightError(options);
83
+ }
84
+ function notFound(message, data) {
85
+ throw new NotFoundError(message, data);
86
+ }
87
+ function forbidden(message, data) {
88
+ throw new ForbiddenError(message, data);
89
+ }
90
+ function unauthorized(message, data) {
91
+ throw new UnauthorizedError(message, data);
92
+ }
93
+ function showError(error) {
94
+ let flightError;
95
+ if (typeof error === "string") {
96
+ flightError = new FlightError({ statusCode: 500, message: error });
97
+ } else if (error instanceof FlightError) {
98
+ flightError = error;
99
+ } else {
100
+ flightError = new FlightError(error);
101
+ }
102
+ if (typeof window !== "undefined") {
103
+ window.__FLIGHT_ERROR__ = flightError;
104
+ window.dispatchEvent(new CustomEvent("flight:error", {
105
+ detail: flightError,
106
+ bubbles: true
107
+ }));
108
+ }
109
+ }
110
+ function clearError(options) {
111
+ if (typeof window !== "undefined") {
112
+ window.__FLIGHT_ERROR__ = null;
113
+ window.dispatchEvent(new CustomEvent("flight:error-clear", { bubbles: true }));
114
+ if (options?.redirect) {
115
+ window.location.href = options.redirect;
116
+ }
117
+ }
118
+ }
119
+ function getError() {
120
+ if (typeof window !== "undefined") {
121
+ return window.__FLIGHT_ERROR__ ?? null;
122
+ }
123
+ return null;
124
+ }
125
+ function isFlightError(error) {
126
+ return error instanceof FlightError;
127
+ }
128
+ function isNotFoundError(error) {
129
+ return error instanceof NotFoundError || isFlightError(error) && error.statusCode === 404;
130
+ }
131
+ function isForbiddenError(error) {
132
+ return error instanceof ForbiddenError || isFlightError(error) && error.statusCode === 403;
133
+ }
134
+ function isUnauthorizedError(error) {
135
+ return error instanceof UnauthorizedError || isFlightError(error) && error.statusCode === 401;
136
+ }
137
+ function getErrorStatusCode(error) {
138
+ if (isFlightError(error)) {
139
+ return error.statusCode;
140
+ }
141
+ return 500;
142
+ }
143
+ function createErrorResponse(error) {
144
+ const flightError = isFlightError(error) ? error : new InternalError(error instanceof Error ? error.message : "Unknown error");
145
+ return new Response(
146
+ JSON.stringify({
147
+ error: flightError.statusMessage,
148
+ message: flightError.message,
149
+ statusCode: flightError.statusCode,
150
+ digest: flightError.digest,
151
+ ...isDevelopment() && flightError.data ? { data: flightError.data } : {}
152
+ }),
153
+ {
154
+ status: flightError.statusCode,
155
+ headers: {
156
+ "Content-Type": "application/json"
157
+ }
158
+ }
159
+ );
160
+ }
161
+ function getDefaultStatusMessage(statusCode) {
162
+ const messages = {
163
+ 400: "Bad Request",
164
+ 401: "Unauthorized",
165
+ 403: "Forbidden",
166
+ 404: "Not Found",
167
+ 405: "Method Not Allowed",
168
+ 408: "Request Timeout",
169
+ 409: "Conflict",
170
+ 410: "Gone",
171
+ 422: "Unprocessable Entity",
172
+ 429: "Too Many Requests",
173
+ 500: "Internal Server Error",
174
+ 501: "Not Implemented",
175
+ 502: "Bad Gateway",
176
+ 503: "Service Unavailable",
177
+ 504: "Gateway Timeout"
178
+ };
179
+ return messages[statusCode] || "Error";
180
+ }
181
+ function generateDigest() {
182
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
183
+ return crypto.randomUUID().slice(0, 8);
184
+ }
185
+ return Math.random().toString(36).slice(2, 10);
186
+ }
187
+ function wrapWithDigest(error) {
188
+ const wrapped = error;
189
+ if (!wrapped.digest) {
190
+ wrapped.digest = generateDigest();
191
+ }
192
+ return wrapped;
193
+ }
194
+
195
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest };
196
+ //# sourceMappingURL=chunk-Q7BS5QC5.js.map
197
+ //# sourceMappingURL=chunk-Q7BS5QC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/index.ts"],"names":[],"mappings":";;;AAwFO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA;AAAA,EAE1B,UAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EAET,YAAY,OAAA,EAA6B;AACrC,IAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,aAAA,IAAiB,mBAAmB,CAAA;AAErE,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,uBAAA,CAAwB,QAAQ,UAAU,CAAA;AACxF,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAI9B,IAAA,IAAI,cAAa,EAAG;AAChB,MAAA,IAAA,CAAK,SAAS,cAAA,EAAe;AAAA,IACjC;AAGA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACf,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,MAAA,IAAI,OAAA,CAAQ,MAAM,KAAA,EAAO;AACrB,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK;AAAA,WAAA,EAAgB,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAC9B,IAAA,OAAO;AAAA,MACH,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACjB;AAAA,EACJ;AACJ;AASO,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAA,EAC7C,WAAA,CAAY,SAAkB,IAAA,EAAgC;AAC1D,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EAChB;AACJ;AAKO,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA,EAC/C,WAAA,CAAY,SAAkB,IAAA,EAAgC;AAC1D,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,GAAA,EAAK,SAAS,OAAA,IAAW,cAAA,EAAgB,MAAM,CAAA;AACnE,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EAChB;AACJ;AAKO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC5C,WAAA,CAAY,SAAkB,IAAA,EAAgC;AAC1D,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,GAAA,EAAK,SAAS,OAAA,IAAW,WAAA,EAAa,MAAM,CAAA;AAChE,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EAChB;AACJ;AAKO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC3C,WAAA,CAAY,SAAkB,IAAA,EAAgC;AAC1D,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,GAAA,EAAK,SAAS,OAAA,IAAW,WAAA,EAAa,MAAM,CAAA;AAChE,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EAChB;AACJ;AAKO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC3C,WAAA,CAAY,SAAkB,IAAA,EAAgC;AAC1D,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,GAAA,EAAK,SAAS,OAAA,IAAW,uBAAA,EAAyB,MAAM,CAAA;AAC5E,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EAChB;AACJ;AAyBO,SAAS,YAAY,OAAA,EAAmD;AAC3E,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,WAAA,CAAY,EAAE,YAAY,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAClC;AAaO,SAAS,QAAA,CAAS,SAAkB,IAAA,EAAuC;AAC9E,EAAA,MAAM,IAAI,aAAA,CAAc,OAAA,EAAS,IAAI,CAAA;AACzC;AAYO,SAAS,SAAA,CAAU,SAAkB,IAAA,EAAuC;AAC/E,EAAA,MAAM,IAAI,cAAA,CAAe,OAAA,EAAS,IAAI,CAAA;AAC1C;AAYO,SAAS,YAAA,CAAa,SAAkB,IAAA,EAAuC;AAClF,EAAA,MAAM,IAAI,iBAAA,CAAkB,OAAA,EAAS,IAAI,CAAA;AAC7C;AA+BO,SAAS,UAAU,KAAA,EAAwD;AAC9E,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,WAAA,GAAc,IAAI,WAAA,CAAY,EAAE,YAAY,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,iBAAiB,WAAA,EAAa;AACrC,IAAA,WAAA,GAAc,KAAA;AAAA,EAClB,CAAA,MAAO;AACH,IAAA,WAAA,GAAc,IAAI,YAAY,KAAK,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,MAAA,CAAO,gBAAA,GAAmB,WAAA;AAC1B,IAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,cAAA,EAAgB;AAAA,MACjD,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACZ,CAAC,CAAA;AAAA,EACN;AACJ;AAgBO,SAAS,WAAW,OAAA,EAAuC;AAC9D,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,MAAA,CAAO,gBAAA,GAAmB,IAAA;AAC1B,IAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,oBAAA,EAAsB,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAE7E,IAAA,IAAI,SAAS,QAAA,EAAU;AACnB,MAAA,MAAA,CAAO,QAAA,CAAS,OAAO,OAAA,CAAQ,QAAA;AAAA,IACnC;AAAA,EACJ;AACJ;AAMO,SAAS,QAAA,GAA+B;AAC3C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,OAAO,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACX;AASO,SAAS,cAAc,KAAA,EAAsC;AAChE,EAAA,OAAO,KAAA,YAAiB,WAAA;AAC5B;AAKO,SAAS,gBAAgB,KAAA,EAAwC;AACpE,EAAA,OAAO,iBAAiB,aAAA,IACnB,aAAA,CAAc,KAAK,CAAA,IAAK,MAAM,UAAA,KAAe,GAAA;AACtD;AAKO,SAAS,iBAAiB,KAAA,EAAyC;AACtE,EAAA,OAAO,iBAAiB,cAAA,IACnB,aAAA,CAAc,KAAK,CAAA,IAAK,MAAM,UAAA,KAAe,GAAA;AACtD;AAKO,SAAS,oBAAoB,KAAA,EAA4C;AAC5E,EAAA,OAAO,iBAAiB,iBAAA,IACnB,aAAA,CAAc,KAAK,CAAA,IAAK,MAAM,UAAA,KAAe,GAAA;AACtD;AAMO,SAAS,mBAAmB,KAAA,EAAwB;AACvD,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,UAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACX;AAkBO,SAAS,oBAAoB,KAAA,EAA0B;AAC1D,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAK,CAAA,GACjC,KAAA,GACA,IAAI,aAAA,CAAc,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA;AAEhF,EAAA,OAAO,IAAI,QAAA;AAAA,IACP,KAAK,SAAA,CAAU;AAAA,MACX,OAAO,WAAA,CAAY,aAAA;AAAA,MACnB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAY,WAAA,CAAY,UAAA;AAAA,MACxB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,GAAI,aAAA,EAAc,IAAK,WAAA,CAAY,IAAA,GAC7B,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA,EAAK,GACzB;AAAC,KACV,CAAA;AAAA,IACD;AAAA,MACI,QAAQ,WAAA,CAAY,UAAA;AAAA,MACpB,OAAA,EAAS;AAAA,QACL,cAAA,EAAgB;AAAA;AACpB;AACJ,GACJ;AACJ;AASA,SAAS,wBAAwB,UAAA,EAA4B;AACzD,EAAA,MAAM,QAAA,GAAmC;AAAA,IACrC,GAAA,EAAK,aAAA;AAAA,IACL,GAAA,EAAK,cAAA;AAAA,IACL,GAAA,EAAK,WAAA;AAAA,IACL,GAAA,EAAK,WAAA;AAAA,IACL,GAAA,EAAK,oBAAA;AAAA,IACL,GAAA,EAAK,iBAAA;AAAA,IACL,GAAA,EAAK,UAAA;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,sBAAA;AAAA,IACL,GAAA,EAAK,mBAAA;AAAA,IACL,GAAA,EAAK,uBAAA;AAAA,IACL,GAAA,EAAK,iBAAA;AAAA,IACL,GAAA,EAAK,aAAA;AAAA,IACL,GAAA,EAAK,qBAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACT;AACA,EAAA,OAAO,QAAA,CAAS,UAAU,CAAA,IAAK,OAAA;AACnC;AAOA,SAAS,cAAA,GAAyB;AAE9B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,UAAA,EAAY;AACpD,IAAA,OAAO,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACjD;AAMO,SAAS,eAAgC,KAAA,EAAkC;AAC9E,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACjB,IAAA,OAAA,CAAQ,SAAS,cAAA,EAAe;AAAA,EACpC;AACA,EAAA,OAAO,OAAA;AACX","file":"chunk-Q7BS5QC5.js","sourcesContent":["/**\r\n * @flightdev/core - Error Handling\r\n * \r\n * Comprehensive error handling utilities for Flight applications.\r\n * All utilities are OPTIONAL - developers can use their own error handling.\r\n * \r\n * Philosophy: Flight OFFERS these utilities, but never IMPOSES them.\r\n * Using throw new Error() works perfectly fine - this is your choice.\r\n */\r\n\r\nimport { isProduction, isDevelopment } from '../utils/env.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for creating a Flight error\r\n */\r\nexport interface FlightErrorOptions {\r\n /** HTTP status code */\r\n statusCode: number;\r\n /** Short status message (e.g., \"Not Found\") */\r\n statusMessage?: string;\r\n /** Detailed error message */\r\n message?: string;\r\n /** Additional data to include with the error */\r\n data?: Record<string, unknown>;\r\n /** If true, shows full-screen error page instead of error boundary */\r\n fatal?: boolean;\r\n /** Original error that caused this error */\r\n cause?: Error;\r\n}\r\n\r\n/**\r\n * Extended error props with digest for production error correlation\r\n */\r\nexport interface FlightErrorProps {\r\n /** The error object */\r\n error: Error & { digest?: string };\r\n /** Function to attempt recovery by re-rendering */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Reset details provided to onReset callback\r\n */\r\nexport interface ResetDetails {\r\n /** Reason for the reset */\r\n reason: 'imperative-api' | 'keys';\r\n /** Arguments passed to resetErrorBoundary (if imperative) */\r\n args?: unknown[];\r\n /** Previous resetKeys values (if keys changed) */\r\n prev?: unknown[];\r\n /** New resetKeys values (if keys changed) */\r\n next?: unknown[];\r\n}\r\n\r\n/**\r\n * Options for error boundary behavior\r\n */\r\nexport interface ErrorBoundaryOptions {\r\n /** Keys that trigger automatic reset when changed */\r\n resetKeys?: unknown[];\r\n /** Callback when error boundary resets */\r\n onReset?: (details: ResetDetails) => void;\r\n /** Callback when error is caught */\r\n onError?: (error: Error, info: { componentStack?: string }) => void;\r\n}\r\n\r\n// ============================================================================\r\n// FlightError Class\r\n// ============================================================================\r\n\r\n/**\r\n * Custom error class with status code and metadata support.\r\n * \r\n * You can use this class or regular Error - Flight handles both.\r\n * \r\n * @example\r\n * ```typescript\r\n * throw new FlightError({\r\n * statusCode: 404,\r\n * message: 'User not found',\r\n * data: { userId: '123' }\r\n * });\r\n * ```\r\n */\r\nexport class FlightError extends Error {\r\n /** HTTP status code */\r\n readonly statusCode: number;\r\n /** Short status message */\r\n readonly statusMessage: string;\r\n /** Additional error data */\r\n readonly data?: Record<string, unknown>;\r\n /** Whether this is a fatal error (shows full-screen) */\r\n readonly fatal: boolean;\r\n /** Unique digest for production error correlation */\r\n readonly digest?: string;\r\n\r\n constructor(options: FlightErrorOptions) {\r\n super(options.message || options.statusMessage || 'An error occurred');\r\n\r\n this.name = 'FlightError';\r\n this.statusCode = options.statusCode;\r\n this.statusMessage = options.statusMessage || getDefaultStatusMessage(options.statusCode);\r\n this.data = options.data;\r\n this.fatal = options.fatal ?? false;\r\n\r\n // Generate digest in production for error correlation\r\n // Using typeof check for SSR/browser compatibility\r\n if (isProduction()) {\r\n this.digest = generateDigest();\r\n }\r\n\r\n // Preserve original error stack if cause provided\r\n if (options.cause) {\r\n this.cause = options.cause;\r\n if (options.cause.stack) {\r\n this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert to plain object for serialization\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n statusCode: this.statusCode,\r\n statusMessage: this.statusMessage,\r\n data: this.data,\r\n fatal: this.fatal,\r\n digest: this.digest,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// HTTP Error Classes (Convenience)\r\n// ============================================================================\r\n\r\n/**\r\n * 400 Bad Request error\r\n */\r\nexport class BadRequestError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 400, message, data });\r\n this.name = 'BadRequestError';\r\n }\r\n}\r\n\r\n/**\r\n * 401 Unauthorized error\r\n */\r\nexport class UnauthorizedError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 401, message: message || 'Unauthorized', data });\r\n this.name = 'UnauthorizedError';\r\n }\r\n}\r\n\r\n/**\r\n * 403 Forbidden error\r\n */\r\nexport class ForbiddenError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 403, message: message || 'Forbidden', data });\r\n this.name = 'ForbiddenError';\r\n }\r\n}\r\n\r\n/**\r\n * 404 Not Found error\r\n */\r\nexport class NotFoundError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 404, message: message || 'Not Found', data });\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\n/**\r\n * 500 Internal Server Error\r\n */\r\nexport class InternalError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 500, message: message || 'Internal Server Error', data });\r\n this.name = 'InternalError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Factory Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a FlightError with the specified options.\r\n * \r\n * This is a convenience function - you can also use `new FlightError()` directly\r\n * or just `throw new Error()` - Flight handles all cases.\r\n * \r\n * @example\r\n * ```typescript\r\n * // With full options\r\n * throw createError({\r\n * statusCode: 404,\r\n * message: 'Product not found',\r\n * data: { productId: 'abc123' }\r\n * });\r\n * \r\n * // Simple string shorthand (becomes 500 error)\r\n * throw createError('Something went wrong');\r\n * ```\r\n */\r\nexport function createError(options: FlightErrorOptions | string): FlightError {\r\n if (typeof options === 'string') {\r\n return new FlightError({ statusCode: 500, message: options });\r\n }\r\n return new FlightError(options);\r\n}\r\n\r\n/**\r\n * Create a 404 Not Found error.\r\n * Convenience function equivalent to `createError({ statusCode: 404, ... })`.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!user) {\r\n * throw notFound('User not found');\r\n * }\r\n * ```\r\n */\r\nexport function notFound(message?: string, data?: Record<string, unknown>): never {\r\n throw new NotFoundError(message, data);\r\n}\r\n\r\n/**\r\n * Create a 403 Forbidden error.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!user.isAdmin) {\r\n * throw forbidden('Admin access required');\r\n * }\r\n * ```\r\n */\r\nexport function forbidden(message?: string, data?: Record<string, unknown>): never {\r\n throw new ForbiddenError(message, data);\r\n}\r\n\r\n/**\r\n * Create a 401 Unauthorized error.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!session) {\r\n * throw unauthorized('Please log in to continue');\r\n * }\r\n * ```\r\n */\r\nexport function unauthorized(message?: string, data?: Record<string, unknown>): never {\r\n throw new UnauthorizedError(message, data);\r\n}\r\n\r\n// ============================================================================\r\n// Error State Management (Client-Side)\r\n// ============================================================================\r\n\r\n// Global error state for client-side\r\ndeclare global {\r\n interface Window {\r\n __FLIGHT_ERROR__?: FlightError | null;\r\n }\r\n}\r\n\r\n/**\r\n * Programmatically show an error page.\r\n * \r\n * This triggers the nearest error boundary or navigates to the error page.\r\n * Only works on the client side.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Show error with full options\r\n * showError({\r\n * statusCode: 500,\r\n * message: 'Connection lost'\r\n * });\r\n * \r\n * // Simple string shorthand\r\n * showError('Something went wrong');\r\n * ```\r\n */\r\nexport function showError(error: FlightErrorOptions | FlightError | string): void {\r\n let flightError: FlightError;\r\n\r\n if (typeof error === 'string') {\r\n flightError = new FlightError({ statusCode: 500, message: error });\r\n } else if (error instanceof FlightError) {\r\n flightError = error;\r\n } else {\r\n flightError = new FlightError(error);\r\n }\r\n\r\n // Client-side: dispatch custom event for error boundaries\r\n if (typeof window !== 'undefined') {\r\n window.__FLIGHT_ERROR__ = flightError;\r\n window.dispatchEvent(new CustomEvent('flight:error', {\r\n detail: flightError,\r\n bubbles: true\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Clear the current error state and optionally redirect.\r\n * \r\n * Use this to dismiss an error and return to normal state.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Just clear the error\r\n * clearError();\r\n * \r\n * // Clear and redirect to home\r\n * clearError({ redirect: '/' });\r\n * ```\r\n */\r\nexport function clearError(options?: { redirect?: string }): void {\r\n if (typeof window !== 'undefined') {\r\n window.__FLIGHT_ERROR__ = null;\r\n window.dispatchEvent(new CustomEvent('flight:error-clear', { bubbles: true }));\r\n\r\n if (options?.redirect) {\r\n window.location.href = options.redirect;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get the current error from global state.\r\n * Returns null if no error is active.\r\n */\r\nexport function getError(): FlightError | null {\r\n if (typeof window !== 'undefined') {\r\n return window.__FLIGHT_ERROR__ ?? null;\r\n }\r\n return null;\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an error is a FlightError\r\n */\r\nexport function isFlightError(error: unknown): error is FlightError {\r\n return error instanceof FlightError;\r\n}\r\n\r\n/**\r\n * Check if an error is a NotFoundError (404)\r\n */\r\nexport function isNotFoundError(error: unknown): error is NotFoundError {\r\n return error instanceof NotFoundError ||\r\n (isFlightError(error) && error.statusCode === 404);\r\n}\r\n\r\n/**\r\n * Check if an error is a ForbiddenError (403)\r\n */\r\nexport function isForbiddenError(error: unknown): error is ForbiddenError {\r\n return error instanceof ForbiddenError ||\r\n (isFlightError(error) && error.statusCode === 403);\r\n}\r\n\r\n/**\r\n * Check if an error is an UnauthorizedError (401)\r\n */\r\nexport function isUnauthorizedError(error: unknown): error is UnauthorizedError {\r\n return error instanceof UnauthorizedError ||\r\n (isFlightError(error) && error.statusCode === 401);\r\n}\r\n\r\n/**\r\n * Get the status code from any error.\r\n * Returns 500 for non-FlightError errors.\r\n */\r\nexport function getErrorStatusCode(error: unknown): number {\r\n if (isFlightError(error)) {\r\n return error.statusCode;\r\n }\r\n return 500;\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Create an error Response from a FlightError.\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * // ... some operation\r\n * } catch (error) {\r\n * return createErrorResponse(error);\r\n * }\r\n * ```\r\n */\r\nexport function createErrorResponse(error: unknown): Response {\r\n const flightError = isFlightError(error)\r\n ? error\r\n : new InternalError(error instanceof Error ? error.message : 'Unknown error');\r\n\r\n return new Response(\r\n JSON.stringify({\r\n error: flightError.statusMessage,\r\n message: flightError.message,\r\n statusCode: flightError.statusCode,\r\n digest: flightError.digest,\r\n ...(isDevelopment() && flightError.data\r\n ? { data: flightError.data }\r\n : {}),\r\n }),\r\n {\r\n status: flightError.statusCode,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Get default status message for HTTP status code\r\n */\r\nfunction getDefaultStatusMessage(statusCode: number): string {\r\n const messages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 405: 'Method Not Allowed',\r\n 408: 'Request Timeout',\r\n 409: 'Conflict',\r\n 410: 'Gone',\r\n 422: 'Unprocessable Entity',\r\n 429: 'Too Many Requests',\r\n 500: 'Internal Server Error',\r\n 501: 'Not Implemented',\r\n 502: 'Bad Gateway',\r\n 503: 'Service Unavailable',\r\n 504: 'Gateway Timeout',\r\n };\r\n return messages[statusCode] || 'Error';\r\n}\r\n\r\n/**\r\n * Generate a short digest for error correlation.\r\n * Used in production to correlate client errors with server logs\r\n * without exposing stack traces.\r\n */\r\nfunction generateDigest(): string {\r\n // Use crypto if available (Node.js, modern browsers)\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8);\r\n }\r\n // Fallback for older environments\r\n return Math.random().toString(36).slice(2, 10);\r\n}\r\n\r\n/**\r\n * Wrap an error with a digest if it doesn't have one.\r\n * Useful for adding correlation IDs to third-party errors.\r\n */\r\nexport function wrapWithDigest<T extends Error>(error: T): T & { digest: string } {\r\n const wrapped = error as T & { digest: string };\r\n if (!wrapped.digest) {\r\n wrapped.digest = generateDigest();\r\n }\r\n return wrapped;\r\n}\r\n"]}