@flight-framework/core 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-FSJNOPYE.js → chunk-2JVEH76V.js} +3 -3
- package/dist/chunk-2JVEH76V.js.map +1 -0
- package/dist/{chunk-3ZSSRE6M.js → chunk-2R23X5Z3.js} +2 -2
- package/dist/chunk-2R23X5Z3.js.map +1 -0
- package/dist/{chunk-VPFMHGEV.js → chunk-3N5ZBVZJ.js} +2 -2
- package/dist/chunk-3N5ZBVZJ.js.map +1 -0
- package/dist/{chunk-2F2QU6RC.js → chunk-3UQJE3XZ.js} +2 -2
- package/dist/chunk-3UQJE3XZ.js.map +1 -0
- package/dist/{chunk-PDW5WCMW.js → chunk-5XHOLZBJ.js} +2 -2
- package/dist/chunk-5XHOLZBJ.js.map +1 -0
- package/dist/{chunk-MDQNNIHH.js → chunk-65JYF3DJ.js} +2 -2
- package/dist/chunk-65JYF3DJ.js.map +1 -0
- package/dist/{chunk-K2CQZPCG.js → chunk-6GI6HFSQ.js} +2 -2
- package/dist/chunk-6GI6HFSQ.js.map +1 -0
- package/dist/{chunk-PVUMB632.js → chunk-A2QRUBVE.js} +2 -2
- package/dist/chunk-A2QRUBVE.js.map +1 -0
- package/dist/{chunk-W6D62JCI.js → chunk-A4TKWQBU.js} +2 -2
- package/dist/chunk-A4TKWQBU.js.map +1 -0
- package/dist/{chunk-GCQZ4FHI.js → chunk-ARBKF6VI.js} +2 -2
- package/dist/{chunk-GCQZ4FHI.js.map → chunk-ARBKF6VI.js.map} +1 -1
- package/dist/{chunk-ZVC3ZWLM.js → chunk-B2LPSCES.js} +2 -2
- package/dist/chunk-B2LPSCES.js.map +1 -0
- package/dist/{chunk-62C7LX2E.js → chunk-CKJHJPKQ.js} +2 -2
- package/dist/chunk-CKJHJPKQ.js.map +1 -0
- package/dist/{chunk-RSVA2EYO.js → chunk-CNY3ZUVG.js} +2 -2
- package/dist/chunk-CNY3ZUVG.js.map +1 -0
- package/dist/{chunk-IXMD5QH2.js → chunk-EHVUAFNH.js} +2 -2
- package/dist/chunk-EHVUAFNH.js.map +1 -0
- package/dist/{chunk-P6WSBVDT.js → chunk-FRAH5QNY.js} +4 -4
- package/dist/chunk-FRAH5QNY.js.map +1 -0
- package/dist/{chunk-MQQLYWZZ.js → chunk-GNS2FGPC.js} +2 -2
- package/dist/chunk-GNS2FGPC.js.map +1 -0
- package/dist/{chunk-TASAT7KB.js → chunk-HNPO6LFW.js} +2 -2
- package/dist/chunk-HNPO6LFW.js.map +1 -0
- package/dist/{chunk-KWFX6WHG.js → chunk-JFUKVWSO.js} +2 -2
- package/dist/chunk-JFUKVWSO.js.map +1 -0
- package/dist/{chunk-NWMJYTMB.js → chunk-LAKHYTHL.js} +3 -3
- package/dist/chunk-LAKHYTHL.js.map +1 -0
- package/dist/{chunk-R7SQAREQ.js → chunk-LKOPJ3GS.js} +2 -2
- package/dist/chunk-LKOPJ3GS.js.map +1 -0
- package/dist/{chunk-WOEIJWGJ.js → chunk-NZS2YJ43.js} +2 -2
- package/dist/chunk-NZS2YJ43.js.map +1 -0
- package/dist/{chunk-3QP3E7HS.js → chunk-OZ3EXPLE.js} +2 -2
- package/dist/chunk-OZ3EXPLE.js.map +1 -0
- package/dist/{chunk-YHEVHRLH.js → chunk-OZBPR27I.js} +2 -2
- package/dist/chunk-OZBPR27I.js.map +1 -0
- package/dist/{chunk-T4Z4HM4W.js → chunk-PAVI5W6M.js} +3 -3
- package/dist/chunk-PAVI5W6M.js.map +1 -0
- package/dist/{chunk-XSY5AAXT.js → chunk-PO7IHPFF.js} +2 -2
- package/dist/chunk-PO7IHPFF.js.map +1 -0
- package/dist/{chunk-SUILH4ID.js → chunk-QK6UEQ75.js} +2 -2
- package/dist/chunk-QK6UEQ75.js.map +1 -0
- package/dist/{chunk-WFAWAHJH.js → chunk-UFWGOJL7.js} +2 -2
- package/dist/chunk-UFWGOJL7.js.map +1 -0
- package/dist/{chunk-54HPVE7N.js → chunk-UGTETAJ2.js} +2 -2
- package/dist/chunk-UGTETAJ2.js.map +1 -0
- package/dist/{chunk-LBYDTULN.js → chunk-UL4Q5CIJ.js} +5 -5
- package/dist/chunk-UL4Q5CIJ.js.map +1 -0
- package/dist/{chunk-XOIYNY4I.js → chunk-VNO2YUVD.js} +2 -2
- package/dist/chunk-VNO2YUVD.js.map +1 -0
- package/dist/{chunk-ZIE56LCA.js → chunk-XU6MRYG2.js} +3 -3
- package/dist/chunk-XU6MRYG2.js.map +1 -0
- package/dist/{chunk-6BDCTUQY.js → chunk-YNTMYL36.js} +3 -3
- package/dist/chunk-YNTMYL36.js.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/handlers/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/islands/index.js +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/router/index.js +1 -1
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/context.js +1 -1
- package/dist/rsc/index.js +11 -11
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/payload.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.js +3 -3
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/dist/server/index.js +4 -4
- package/dist/streaming/adapters/index.js +1 -1
- package/dist/streaming/conditional.js +1 -1
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +207 -207
- package/dist/chunk-2F2QU6RC.js.map +0 -1
- package/dist/chunk-3QP3E7HS.js.map +0 -1
- package/dist/chunk-3ZSSRE6M.js.map +0 -1
- package/dist/chunk-54HPVE7N.js.map +0 -1
- package/dist/chunk-62C7LX2E.js.map +0 -1
- package/dist/chunk-6BDCTUQY.js.map +0 -1
- package/dist/chunk-FSJNOPYE.js.map +0 -1
- package/dist/chunk-IXMD5QH2.js.map +0 -1
- package/dist/chunk-K2CQZPCG.js.map +0 -1
- package/dist/chunk-KWFX6WHG.js.map +0 -1
- package/dist/chunk-LBYDTULN.js.map +0 -1
- package/dist/chunk-MDQNNIHH.js.map +0 -1
- package/dist/chunk-MQQLYWZZ.js.map +0 -1
- package/dist/chunk-NWMJYTMB.js.map +0 -1
- package/dist/chunk-P6WSBVDT.js.map +0 -1
- package/dist/chunk-PDW5WCMW.js.map +0 -1
- package/dist/chunk-PVUMB632.js.map +0 -1
- package/dist/chunk-R7SQAREQ.js.map +0 -1
- package/dist/chunk-RSVA2EYO.js.map +0 -1
- package/dist/chunk-SUILH4ID.js.map +0 -1
- package/dist/chunk-T4Z4HM4W.js.map +0 -1
- package/dist/chunk-TASAT7KB.js.map +0 -1
- package/dist/chunk-VPFMHGEV.js.map +0 -1
- package/dist/chunk-W6D62JCI.js.map +0 -1
- package/dist/chunk-WFAWAHJH.js.map +0 -1
- package/dist/chunk-WOEIJWGJ.js.map +0 -1
- package/dist/chunk-XOIYNY4I.js.map +0 -1
- package/dist/chunk-XSY5AAXT.js.map +0 -1
- package/dist/chunk-YHEVHRLH.js.map +0 -1
- package/dist/chunk-ZIE56LCA.js.map +0 -1
- package/dist/chunk-ZVC3ZWLM.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# @flight-framework/core
|
|
2
|
+
|
|
3
|
+
Core primitives for Flight Framework, including configuration, routing, caching, streaming SSR, and server actions.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Multi-render mode: SSR, SSG, ISR, and streaming
|
|
8
|
+
- Framework support: React, Vue, Svelte, Solid, HTMX
|
|
9
|
+
- File-based routing with automatic route discovery
|
|
10
|
+
- Type-safe server actions with form support
|
|
11
|
+
- Streaming SSR with priority control
|
|
12
|
+
- Islands architecture for partial hydration
|
|
13
|
+
- Pluggable cache adapters with deduplication
|
|
14
|
+
- Structured error handling with type guards
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @flight-framework/core
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
### Configuration
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// flight.config.ts
|
|
28
|
+
import { defineConfig } from '@flight-framework/core';
|
|
29
|
+
|
|
30
|
+
export default defineConfig({
|
|
31
|
+
server: {
|
|
32
|
+
port: 3000,
|
|
33
|
+
},
|
|
34
|
+
render: {
|
|
35
|
+
defaultMode: 'ssr',
|
|
36
|
+
streaming: true,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Create a Server
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import { createServer } from '@flight-framework/core';
|
|
45
|
+
|
|
46
|
+
const server = createServer({
|
|
47
|
+
port: 3000,
|
|
48
|
+
routes: [
|
|
49
|
+
{ path: '/', handler: homeHandler },
|
|
50
|
+
{ path: '/api/*', handler: apiHandler },
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await server.start();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### File-Based Routing
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { createFileRouter, scanRoutes } from '@flight-framework/core';
|
|
61
|
+
|
|
62
|
+
const routes = await scanRoutes('./src/routes');
|
|
63
|
+
const router = createFileRouter({ routes });
|
|
64
|
+
|
|
65
|
+
// Routes are discovered automatically:
|
|
66
|
+
// src/routes/index.page.tsx -> /
|
|
67
|
+
// src/routes/about.page.tsx -> /about
|
|
68
|
+
// src/routes/blog/[slug].page.tsx -> /blog/:slug
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Modules
|
|
72
|
+
|
|
73
|
+
### Router
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { createRouter } from '@flight-framework/core/router';
|
|
77
|
+
|
|
78
|
+
const router = createRouter();
|
|
79
|
+
router.add('GET', '/users/:id', userHandler);
|
|
80
|
+
|
|
81
|
+
const match = router.match('GET', '/users/123');
|
|
82
|
+
// { params: { id: '123' }, handler: userHandler }
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Cache
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { createCache, memory, cached, dedupe } from '@flight-framework/core/cache';
|
|
89
|
+
|
|
90
|
+
// Create a cache with memory adapter
|
|
91
|
+
const cache = createCache({
|
|
92
|
+
adapter: memory(),
|
|
93
|
+
ttl: 60000,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Cache function results
|
|
97
|
+
const getUser = cached(
|
|
98
|
+
async (id: string) => fetchUser(id),
|
|
99
|
+
{ ttl: 5000, key: (id) => `user:${id}` }
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// Deduplicate concurrent requests
|
|
103
|
+
const getData = dedupe(fetchData);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Server Actions
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { registerAction, executeAction, cookies } from '@flight-framework/core/actions';
|
|
110
|
+
|
|
111
|
+
// Register a server action
|
|
112
|
+
registerAction('createUser', async (formData: FormData) => {
|
|
113
|
+
const name = formData.get('name');
|
|
114
|
+
const user = await db.users.create({ name });
|
|
115
|
+
|
|
116
|
+
cookies().set('user_id', user.id);
|
|
117
|
+
|
|
118
|
+
return { success: true, user };
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Execute from client
|
|
122
|
+
const result = await executeAction('createUser', formData);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Streaming SSR
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import {
|
|
129
|
+
createStreamingSSR,
|
|
130
|
+
streamWithPriority
|
|
131
|
+
} from '@flight-framework/core/streaming';
|
|
132
|
+
|
|
133
|
+
// Basic streaming
|
|
134
|
+
const stream = await createStreamingSSR({
|
|
135
|
+
component: App,
|
|
136
|
+
props: { data },
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Priority-based streaming (out-of-order)
|
|
140
|
+
const result = await streamWithPriority({
|
|
141
|
+
boundaries: [
|
|
142
|
+
{ id: 'header', priority: 100, render: Header },
|
|
143
|
+
{ id: 'sidebar', priority: 50, render: Sidebar },
|
|
144
|
+
{ id: 'content', priority: 75, render: Content },
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Islands Architecture
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import {
|
|
153
|
+
defineIsland,
|
|
154
|
+
hydrateIslands,
|
|
155
|
+
createReactIslandAdapter
|
|
156
|
+
} from '@flight-framework/core/islands';
|
|
157
|
+
|
|
158
|
+
// Define an island component
|
|
159
|
+
const Counter = defineIsland({
|
|
160
|
+
name: 'counter',
|
|
161
|
+
component: CounterComponent,
|
|
162
|
+
hydrate: 'visible', // 'load' | 'visible' | 'idle' | 'interaction'
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Client-side hydration
|
|
166
|
+
hydrateIslands({
|
|
167
|
+
adapter: createReactIslandAdapter(),
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Middleware
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { createMiddlewareChain } from '@flight-framework/core/middleware';
|
|
175
|
+
|
|
176
|
+
const middleware = createMiddlewareChain([
|
|
177
|
+
async (ctx, next) => {
|
|
178
|
+
const start = Date.now();
|
|
179
|
+
await next();
|
|
180
|
+
console.log(`Request took ${Date.now() - start}ms`);
|
|
181
|
+
},
|
|
182
|
+
authMiddleware,
|
|
183
|
+
loggingMiddleware,
|
|
184
|
+
]);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Error Handling
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import {
|
|
191
|
+
FlightError,
|
|
192
|
+
createError,
|
|
193
|
+
isFlightError,
|
|
194
|
+
createNotFound,
|
|
195
|
+
createForbidden,
|
|
196
|
+
} from '@flight-framework/core/errors';
|
|
197
|
+
|
|
198
|
+
// Create typed errors
|
|
199
|
+
throw createNotFound('Page not found');
|
|
200
|
+
throw createForbidden('Access denied');
|
|
201
|
+
|
|
202
|
+
// Create custom errors
|
|
203
|
+
throw createError({
|
|
204
|
+
statusCode: 422,
|
|
205
|
+
message: 'Validation failed',
|
|
206
|
+
data: { field: 'email', error: 'Invalid format' },
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Type guards
|
|
210
|
+
if (isFlightError(error)) {
|
|
211
|
+
console.log(error.statusCode, error.digest);
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### React Integration
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
import { ErrorProvider, useError, useFlightError } from '@flight-framework/core/react';
|
|
219
|
+
|
|
220
|
+
// Wrap your app
|
|
221
|
+
<ErrorProvider onError={console.error}>
|
|
222
|
+
<App />
|
|
223
|
+
</ErrorProvider>
|
|
224
|
+
|
|
225
|
+
// Use in components
|
|
226
|
+
function MyComponent() {
|
|
227
|
+
const { error, clearError } = useFlightError();
|
|
228
|
+
|
|
229
|
+
if (error) {
|
|
230
|
+
return <ErrorDisplay error={error} onRetry={clearError} />;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return <Content />;
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Metadata (SEO)
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
import { renderMetadataToHead, type Metadata } from '@flight-framework/core';
|
|
241
|
+
|
|
242
|
+
const metadata: Metadata = {
|
|
243
|
+
title: 'My Page',
|
|
244
|
+
description: 'Page description',
|
|
245
|
+
openGraph: {
|
|
246
|
+
title: 'OG Title',
|
|
247
|
+
image: '/og-image.png',
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const headHtml = renderMetadataToHead(metadata);
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Route Rules (ISR/SSG)
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
import { defineConfig } from '@flight-framework/core';
|
|
258
|
+
|
|
259
|
+
export default defineConfig({
|
|
260
|
+
routeRules: {
|
|
261
|
+
'/': { prerender: true },
|
|
262
|
+
'/blog/**': { isr: 3600 },
|
|
263
|
+
'/api/**': { ssr: true },
|
|
264
|
+
'/static/**': { static: true },
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Revalidation
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
import {
|
|
273
|
+
revalidatePath,
|
|
274
|
+
revalidateTag,
|
|
275
|
+
createRevalidateHandler
|
|
276
|
+
} from '@flight-framework/core';
|
|
277
|
+
|
|
278
|
+
// On-demand revalidation
|
|
279
|
+
await revalidatePath('/blog/my-post');
|
|
280
|
+
await revalidateTag('blog-posts');
|
|
281
|
+
|
|
282
|
+
// Create revalidation API handler
|
|
283
|
+
const handler = createRevalidateHandler({
|
|
284
|
+
secret: process.env.REVALIDATE_SECRET,
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Environment Utilities
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
import {
|
|
292
|
+
isServer,
|
|
293
|
+
isBrowser,
|
|
294
|
+
isProduction,
|
|
295
|
+
isDevelopment
|
|
296
|
+
} from '@flight-framework/core/utils';
|
|
297
|
+
|
|
298
|
+
if (isServer()) {
|
|
299
|
+
// Server-only code
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (isDevelopment()) {
|
|
303
|
+
console.log('Debug info');
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Module Exports
|
|
308
|
+
|
|
309
|
+
| Export | Description |
|
|
310
|
+
|--------|-------------|
|
|
311
|
+
| `@flight-framework/core` | Main entry with all primitives |
|
|
312
|
+
| `@flight-framework/core/router` | Routing utilities |
|
|
313
|
+
| `@flight-framework/core/cache` | Caching system |
|
|
314
|
+
| `@flight-framework/core/server` | HTTP server |
|
|
315
|
+
| `@flight-framework/core/render` | Rendering modes |
|
|
316
|
+
| `@flight-framework/core/middleware` | Middleware chain |
|
|
317
|
+
| `@flight-framework/core/actions` | Server actions |
|
|
318
|
+
| `@flight-framework/core/streaming` | Streaming SSR |
|
|
319
|
+
| `@flight-framework/core/islands` | Islands architecture |
|
|
320
|
+
| `@flight-framework/core/errors` | Error handling |
|
|
321
|
+
| `@flight-framework/core/react` | React integration |
|
|
322
|
+
| `@flight-framework/core/rsc` | React Server Components |
|
|
323
|
+
| `@flight-framework/core/config` | Configuration |
|
|
324
|
+
| `@flight-framework/core/utils` | Environment utilities |
|
|
325
|
+
|
|
326
|
+
## TypeScript
|
|
327
|
+
|
|
328
|
+
Full TypeScript support with exported types for all APIs:
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import type {
|
|
332
|
+
FlightConfig,
|
|
333
|
+
Route,
|
|
334
|
+
RouteMatch,
|
|
335
|
+
Cache,
|
|
336
|
+
CacheAdapter,
|
|
337
|
+
Middleware,
|
|
338
|
+
FlightError,
|
|
339
|
+
Metadata,
|
|
340
|
+
StreamingHints,
|
|
341
|
+
} from '@flight-framework/core';
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## License
|
|
345
|
+
|
|
346
|
+
MIT
|
package/dist/actions/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { RedirectError, clearActions, collectStream, cookies, createActionContext, createActionMiddleware, createActionReference, createLoggingMiddleware, createMemoryAdapter, createProgressReporter, createQueueManager, createQueuedAction, createRetryMiddleware, createStreamableAction, createTimingMiddleware, defaultRetryStrategy, executeAction, executeFormAction, executeWithMiddleware, exponentialBackoff, fixedDelay, generateActionId, getAction, getAllActions, handleActionRequest, isRedirectError, parseFormData, pipeline, redirect, registerAction, responseToStream, streamToResponse } from '../chunk-
|
|
1
|
+
export { RedirectError, clearActions, collectStream, cookies, createActionContext, createActionMiddleware, createActionReference, createLoggingMiddleware, createMemoryAdapter, createProgressReporter, createQueueManager, createQueuedAction, createRetryMiddleware, createStreamableAction, createTimingMiddleware, defaultRetryStrategy, executeAction, executeFormAction, executeWithMiddleware, exponentialBackoff, fixedDelay, generateActionId, getAction, getAllActions, handleActionRequest, isRedirectError, parseFormData, pipeline, redirect, registerAction, responseToStream, streamToResponse } from '../chunk-OZ3EXPLE.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/adapters/index.js
CHANGED
package/dist/cache/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from '../chunk-
|
|
1
|
+
export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from '../chunk-LKOPJ3GS.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isProduction, isDevelopment } from './chunk-
|
|
1
|
+
import { isProduction, isDevelopment } from './chunk-OZBPR27I.js';
|
|
2
2
|
|
|
3
3
|
// src/errors/index.ts
|
|
4
4
|
var FlightError = class extends Error {
|
|
@@ -193,5 +193,5 @@ function wrapWithDigest(error) {
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
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-
|
|
197
|
-
//# sourceMappingURL=chunk-
|
|
196
|
+
//# sourceMappingURL=chunk-2JVEH76V.js.map
|
|
197
|
+
//# sourceMappingURL=chunk-2JVEH76V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts"],"names":[],"mappings":"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","file":"chunk-2JVEH76V.js","sourcesContent":["/**\n * @flight-framework/core - Error Handling\n * \n * Comprehensive error handling utilities for Flight applications.\n * All utilities are OPTIONAL - developers can use their own error handling.\n * \n * Philosophy: Flight OFFERS these utilities, but never IMPOSES them.\n * Using throw new Error() works perfectly fine - this is your choice.\n */\n\nimport { isProduction, isDevelopment } from '../utils/env.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for creating a Flight error\n */\nexport interface FlightErrorOptions {\n /** HTTP status code */\n statusCode: number;\n /** Short status message (e.g., \"Not Found\") */\n statusMessage?: string;\n /** Detailed error message */\n message?: string;\n /** Additional data to include with the error */\n data?: Record<string, unknown>;\n /** If true, shows full-screen error page instead of error boundary */\n fatal?: boolean;\n /** Original error that caused this error */\n cause?: Error;\n}\n\n/**\n * Extended error props with digest for production error correlation\n */\nexport interface FlightErrorProps {\n /** The error object */\n error: Error & { digest?: string };\n /** Function to attempt recovery by re-rendering */\n reset: () => void;\n}\n\n/**\n * Reset details provided to onReset callback\n */\nexport interface ResetDetails {\n /** Reason for the reset */\n reason: 'imperative-api' | 'keys';\n /** Arguments passed to resetErrorBoundary (if imperative) */\n args?: unknown[];\n /** Previous resetKeys values (if keys changed) */\n prev?: unknown[];\n /** New resetKeys values (if keys changed) */\n next?: unknown[];\n}\n\n/**\n * Options for error boundary behavior\n */\nexport interface ErrorBoundaryOptions {\n /** Keys that trigger automatic reset when changed */\n resetKeys?: unknown[];\n /** Callback when error boundary resets */\n onReset?: (details: ResetDetails) => void;\n /** Callback when error is caught */\n onError?: (error: Error, info: { componentStack?: string }) => void;\n}\n\n// ============================================================================\n// FlightError Class\n// ============================================================================\n\n/**\n * Custom error class with status code and metadata support.\n * \n * You can use this class or regular Error - Flight handles both.\n * \n * @example\n * ```typescript\n * throw new FlightError({\n * statusCode: 404,\n * message: 'User not found',\n * data: { userId: '123' }\n * });\n * ```\n */\nexport class FlightError extends Error {\n /** HTTP status code */\n readonly statusCode: number;\n /** Short status message */\n readonly statusMessage: string;\n /** Additional error data */\n readonly data?: Record<string, unknown>;\n /** Whether this is a fatal error (shows full-screen) */\n readonly fatal: boolean;\n /** Unique digest for production error correlation */\n readonly digest?: string;\n\n constructor(options: FlightErrorOptions) {\n super(options.message || options.statusMessage || 'An error occurred');\n\n this.name = 'FlightError';\n this.statusCode = options.statusCode;\n this.statusMessage = options.statusMessage || getDefaultStatusMessage(options.statusCode);\n this.data = options.data;\n this.fatal = options.fatal ?? false;\n\n // Generate digest in production for error correlation\n // Using typeof check for SSR/browser compatibility\n if (isProduction()) {\n this.digest = generateDigest();\n }\n\n // Preserve original error stack if cause provided\n if (options.cause) {\n this.cause = options.cause;\n if (options.cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n }\n }\n }\n\n /**\n * Convert to plain object for serialization\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n statusMessage: this.statusMessage,\n data: this.data,\n fatal: this.fatal,\n digest: this.digest,\n };\n }\n}\n\n// ============================================================================\n// HTTP Error Classes (Convenience)\n// ============================================================================\n\n/**\n * 400 Bad Request error\n */\nexport class BadRequestError extends FlightError {\n constructor(message?: string, data?: Record<string, unknown>) {\n super({ statusCode: 400, message, data });\n this.name = 'BadRequestError';\n }\n}\n\n/**\n * 401 Unauthorized error\n */\nexport class UnauthorizedError extends FlightError {\n constructor(message?: string, data?: Record<string, unknown>) {\n super({ statusCode: 401, message: message || 'Unauthorized', data });\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * 403 Forbidden error\n */\nexport class ForbiddenError extends FlightError {\n constructor(message?: string, data?: Record<string, unknown>) {\n super({ statusCode: 403, message: message || 'Forbidden', data });\n this.name = 'ForbiddenError';\n }\n}\n\n/**\n * 404 Not Found error\n */\nexport class NotFoundError extends FlightError {\n constructor(message?: string, data?: Record<string, unknown>) {\n super({ statusCode: 404, message: message || 'Not Found', data });\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * 500 Internal Server Error\n */\nexport class InternalError extends FlightError {\n constructor(message?: string, data?: Record<string, unknown>) {\n super({ statusCode: 500, message: message || 'Internal Server Error', data });\n this.name = 'InternalError';\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a FlightError with the specified options.\n * \n * This is a convenience function - you can also use `new FlightError()` directly\n * or just `throw new Error()` - Flight handles all cases.\n * \n * @example\n * ```typescript\n * // With full options\n * throw createError({\n * statusCode: 404,\n * message: 'Product not found',\n * data: { productId: 'abc123' }\n * });\n * \n * // Simple string shorthand (becomes 500 error)\n * throw createError('Something went wrong');\n * ```\n */\nexport function createError(options: FlightErrorOptions | string): FlightError {\n if (typeof options === 'string') {\n return new FlightError({ statusCode: 500, message: options });\n }\n return new FlightError(options);\n}\n\n/**\n * Create a 404 Not Found error.\n * Convenience function equivalent to `createError({ statusCode: 404, ... })`.\n * \n * @example\n * ```typescript\n * if (!user) {\n * throw notFound('User not found');\n * }\n * ```\n */\nexport function notFound(message?: string, data?: Record<string, unknown>): never {\n throw new NotFoundError(message, data);\n}\n\n/**\n * Create a 403 Forbidden error.\n * \n * @example\n * ```typescript\n * if (!user.isAdmin) {\n * throw forbidden('Admin access required');\n * }\n * ```\n */\nexport function forbidden(message?: string, data?: Record<string, unknown>): never {\n throw new ForbiddenError(message, data);\n}\n\n/**\n * Create a 401 Unauthorized error.\n * \n * @example\n * ```typescript\n * if (!session) {\n * throw unauthorized('Please log in to continue');\n * }\n * ```\n */\nexport function unauthorized(message?: string, data?: Record<string, unknown>): never {\n throw new UnauthorizedError(message, data);\n}\n\n// ============================================================================\n// Error State Management (Client-Side)\n// ============================================================================\n\n// Global error state for client-side\ndeclare global {\n interface Window {\n __FLIGHT_ERROR__?: FlightError | null;\n }\n}\n\n/**\n * Programmatically show an error page.\n * \n * This triggers the nearest error boundary or navigates to the error page.\n * Only works on the client side.\n * \n * @example\n * ```typescript\n * // Show error with full options\n * showError({\n * statusCode: 500,\n * message: 'Connection lost'\n * });\n * \n * // Simple string shorthand\n * showError('Something went wrong');\n * ```\n */\nexport function showError(error: FlightErrorOptions | FlightError | string): void {\n let flightError: FlightError;\n\n if (typeof error === 'string') {\n flightError = new FlightError({ statusCode: 500, message: error });\n } else if (error instanceof FlightError) {\n flightError = error;\n } else {\n flightError = new FlightError(error);\n }\n\n // Client-side: dispatch custom event for error boundaries\n if (typeof window !== 'undefined') {\n window.__FLIGHT_ERROR__ = flightError;\n window.dispatchEvent(new CustomEvent('flight:error', {\n detail: flightError,\n bubbles: true\n }));\n }\n}\n\n/**\n * Clear the current error state and optionally redirect.\n * \n * Use this to dismiss an error and return to normal state.\n * \n * @example\n * ```typescript\n * // Just clear the error\n * clearError();\n * \n * // Clear and redirect to home\n * clearError({ redirect: '/' });\n * ```\n */\nexport function clearError(options?: { redirect?: string }): void {\n if (typeof window !== 'undefined') {\n window.__FLIGHT_ERROR__ = null;\n window.dispatchEvent(new CustomEvent('flight:error-clear', { bubbles: true }));\n\n if (options?.redirect) {\n window.location.href = options.redirect;\n }\n }\n}\n\n/**\n * Get the current error from global state.\n * Returns null if no error is active.\n */\nexport function getError(): FlightError | null {\n if (typeof window !== 'undefined') {\n return window.__FLIGHT_ERROR__ ?? null;\n }\n return null;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if an error is a FlightError\n */\nexport function isFlightError(error: unknown): error is FlightError {\n return error instanceof FlightError;\n}\n\n/**\n * Check if an error is a NotFoundError (404)\n */\nexport function isNotFoundError(error: unknown): error is NotFoundError {\n return error instanceof NotFoundError ||\n (isFlightError(error) && error.statusCode === 404);\n}\n\n/**\n * Check if an error is a ForbiddenError (403)\n */\nexport function isForbiddenError(error: unknown): error is ForbiddenError {\n return error instanceof ForbiddenError ||\n (isFlightError(error) && error.statusCode === 403);\n}\n\n/**\n * Check if an error is an UnauthorizedError (401)\n */\nexport function isUnauthorizedError(error: unknown): error is UnauthorizedError {\n return error instanceof UnauthorizedError ||\n (isFlightError(error) && error.statusCode === 401);\n}\n\n/**\n * Get the status code from any error.\n * Returns 500 for non-FlightError errors.\n */\nexport function getErrorStatusCode(error: unknown): number {\n if (isFlightError(error)) {\n return error.statusCode;\n }\n return 500;\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\n/**\n * Create an error Response from a FlightError.\n * \n * @example\n * ```typescript\n * try {\n * // ... some operation\n * } catch (error) {\n * return createErrorResponse(error);\n * }\n * ```\n */\nexport function createErrorResponse(error: unknown): Response {\n const flightError = isFlightError(error)\n ? error\n : new InternalError(error instanceof Error ? error.message : 'Unknown error');\n\n return new Response(\n JSON.stringify({\n error: flightError.statusMessage,\n message: flightError.message,\n statusCode: flightError.statusCode,\n digest: flightError.digest,\n ...(isDevelopment() && flightError.data\n ? { data: flightError.data }\n : {}),\n }),\n {\n status: flightError.statusCode,\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Get default status message for HTTP status code\n */\nfunction getDefaultStatusMessage(statusCode: number): string {\n const messages: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n };\n return messages[statusCode] || 'Error';\n}\n\n/**\n * Generate a short digest for error correlation.\n * Used in production to correlate client errors with server logs\n * without exposing stack traces.\n */\nfunction generateDigest(): string {\n // Use crypto if available (Node.js, modern browsers)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID().slice(0, 8);\n }\n // Fallback for older environments\n return Math.random().toString(36).slice(2, 10);\n}\n\n/**\n * Wrap an error with a digest if it doesn't have one.\n * Useful for adding correlation IDs to third-party errors.\n */\nexport function wrapWithDigest<T extends Error>(error: T): T & { digest: string } {\n const wrapped = error as T & { digest: string };\n if (!wrapped.digest) {\n wrapped.digest = generateDigest();\n }\n return wrapped;\n}\n"]}
|
|
@@ -170,5 +170,5 @@ function isRedirectError(error) {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, isNotFoundError, isRedirectError, notFound, redirect, revalidatePath, revalidateTag, serializeProps, serverFetch, withErrorBoundary };
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
173
|
+
//# sourceMappingURL=chunk-2R23X5Z3.js.map
|
|
174
|
+
//# sourceMappingURL=chunk-2R23X5Z3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/legacy.ts"],"names":[],"mappings":"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","file":"chunk-2R23X5Z3.js","sourcesContent":["/**\n * @flight-framework/core - Legacy RSC Support\n * \n * Backward compatibility module for the original RSC implementation.\n * Use the new API from './index.js' for new features.\n * \n * @deprecated Use the new RSC API instead\n * @module @flight-framework/core/rsc/legacy\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Component rendering context\n * @deprecated Use ServerContext from './context.js' instead\n */\nexport interface RenderContext {\n /** Current request */\n request: Request;\n /** Route params */\n params: Record<string, string>;\n /** Search params */\n searchParams: URLSearchParams;\n /** Request headers */\n headers: Headers;\n /** Cookies */\n cookies: Map<string, string>;\n}\n\n/**\n * Server component definition\n * @deprecated Use ServerComponentFn from './index.js' instead\n */\nexport interface ServerComponent<P = unknown> {\n (props: P, context: RenderContext): Promise<string> | string;\n /** Mark as server component */\n __flight_server?: true;\n /** Dependencies for hydration */\n __flight_deps?: string[];\n}\n\n/**\n * Client component definition\n * @deprecated Use ClientReference from './boundaries.js' instead\n */\nexport interface ClientComponent<P = unknown> {\n (props: P): unknown;\n /** Mark as client component */\n __flight_client?: true;\n /** Client bundle path */\n __flight_bundle?: string;\n}\n\n/**\n * Component type detection\n */\nexport type ComponentType = 'server' | 'client' | 'hybrid';\n\n// ============================================================================\n// Server Component Execution\n// ============================================================================\n\n/**\n * Execute an async server component\n * @deprecated Use the new rendering pipeline instead\n */\nexport async function executeServerComponent<P>(\n component: ServerComponent<P>,\n props: P,\n context: RenderContext\n): Promise<string> {\n try {\n const result = await component(props, context);\n return result;\n } catch (error) {\n console.error('[Flight] Server component error:', error);\n throw error;\n }\n}\n\n/**\n * Create a render context from a Request\n * @deprecated Use createServerContext from './context.js' instead\n */\nexport function createRenderContext(request: Request, params: Record<string, string> = {}): RenderContext {\n const url = new URL(request.url);\n\n // Parse cookies\n const cookies = new Map<string, string>();\n const cookieHeader = request.headers.get('cookie') || '';\n cookieHeader.split(';').forEach(cookie => {\n const [key, value] = cookie.trim().split('=');\n if (key && value) cookies.set(key, value);\n });\n\n return {\n request,\n params,\n searchParams: url.searchParams,\n headers: request.headers,\n cookies,\n };\n}\n\n// ============================================================================\n// Data Fetching Helpers\n// ============================================================================\n\n/**\n * Cache for server-side fetch requests\n */\nconst fetchCache = new Map<string, { data: unknown; timestamp: number }>();\n\n/**\n * Server-side fetch with automatic caching\n */\nexport async function serverFetch<T>(\n url: string,\n options: RequestInit & {\n revalidate?: number | false;\n tags?: string[];\n } = {}\n): Promise<T> {\n const { revalidate = 60, ...fetchOptions } = options;\n const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;\n\n // Check cache\n const cached = fetchCache.get(cacheKey);\n if (cached) {\n const age = Date.now() - cached.timestamp;\n if (revalidate === false || age < (revalidate * 1000)) {\n return cached.data as T;\n }\n }\n\n // Fetch fresh data\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Fetch failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Cache the result\n if (revalidate !== false) {\n fetchCache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n }\n\n return data as T;\n}\n\n/**\n * Invalidate cache by tag\n */\nexport function revalidateTag(tag: string): void {\n console.log(`[Flight] Revalidating tag: ${tag}`);\n}\n\n/**\n * Invalidate cache by path\n */\nexport function revalidatePath(path: string): void {\n console.log(`[Flight] Revalidating path: ${path}`);\n}\n\n// ============================================================================\n// Component Serialization\n// ============================================================================\n\n/**\n * Serialize props for transmission to client\n * @deprecated Use serialize from './payload.js' instead\n */\nexport function serializeProps(props: unknown): string {\n function preProcess(value: unknown): unknown {\n if (value instanceof Date) {\n return { __type: 'Date', value: value.toISOString() };\n }\n if (value instanceof Map) {\n return { __type: 'Map', value: Array.from(value.entries()).map(([k, v]) => [preProcess(k), preProcess(v)]) };\n }\n if (value instanceof Set) {\n return { __type: 'Set', value: Array.from(value).map(preProcess) };\n }\n if (typeof value === 'bigint') {\n return { __type: 'BigInt', value: value.toString() };\n }\n if (typeof value === 'function') {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map(preProcess);\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = preProcess(v);\n }\n return result;\n }\n return value;\n }\n\n return JSON.stringify(preProcess(props));\n}\n\n/**\n * Deserialize props on client\n * @deprecated Use deserialize from './payload.js' instead\n */\nexport function deserializeProps<T>(serialized: string): T {\n return JSON.parse(serialized, (_key, value) => {\n if (value && typeof value === 'object' && '__type' in value) {\n switch (value.__type) {\n case 'Date':\n return new Date(value.value);\n case 'Map':\n return new Map(value.value);\n case 'Set':\n return new Set(value.value);\n case 'BigInt':\n return BigInt(value.value);\n }\n }\n return value;\n });\n}\n\n// ============================================================================\n// Client Component Boundary\n// ============================================================================\n\n/**\n * Create a client boundary placeholder\n * @deprecated Use clientRef from './payload.js' instead\n */\nexport function createClientBoundary(\n componentId: string,\n props: unknown,\n fallback?: string\n): string {\n const serializedProps = serializeProps(props);\n\n return `\n<!--flight-client:${componentId}-->\n<div data-flight-component=\"${componentId}\" data-flight-props='${serializedProps.replace(/'/g, \"'\")}'>\n ${fallback || '<div>Loading...</div>'}\n</div>\n<!--/flight-client-->\n<script type=\"module\">\n(async function() {\n const component = await import('/_flight/components/${componentId}.js');\n const props = JSON.parse('${serializedProps.replace(/'/g, \"\\\\'\")}');\n const container = document.querySelector('[data-flight-component=\"${componentId}\"]');\n if (container && component.default) {\n if (typeof component.hydrate === 'function') {\n component.hydrate(container, props);\n }\n }\n})();\n</script>`;\n}\n\n// ============================================================================\n// Async Component Helpers\n// ============================================================================\n\n/**\n * Helper to create an async server component\n * @deprecated Use async Server Components directly\n */\nexport function createAsyncComponent<P, T>(\n fetcher: (props: P, context: RenderContext) => Promise<T>,\n renderer: (data: T, props: P) => string\n): ServerComponent<P> {\n const component: ServerComponent<P> = async (props, context) => {\n const data = await fetcher(props, context);\n return renderer(data, props);\n };\n component.__flight_server = true;\n return component;\n}\n\n/**\n * Compose multiple server components\n * @deprecated Use Promise.all with async components\n */\nexport function composeComponents(\n ...components: Array<() => Promise<string> | string>\n): () => Promise<string> {\n return async () => {\n const results = await Promise.all(\n components.map(async (comp) => await comp())\n );\n return results.join('');\n };\n}\n\n// ============================================================================\n// Error Boundary for Server Components\n// ============================================================================\n\n/**\n * Wrap a server component with error handling\n * @deprecated Use try/catch in async components\n */\nexport function withErrorBoundary<P>(\n component: ServerComponent<P>,\n errorFallback: (error: Error) => string\n): ServerComponent<P> {\n return async (props: P, context: RenderContext) => {\n try {\n return await component(props, context);\n } catch (error) {\n console.error('[Flight] Server component error:', error);\n return errorFallback(error as Error);\n }\n };\n}\n\n// ============================================================================\n// Not Found / Redirect Helpers\n// ============================================================================\n\n/**\n * Throw a not found error\n * @deprecated Use notFound from './context.js' instead\n */\nexport function notFound(): never {\n const error = new Error('Not Found');\n (error as Error & { __flight_not_found: boolean }).__flight_not_found = true;\n throw error;\n}\n\n/**\n * Check if error is not found\n * @deprecated Use isNotFoundError from './context.js' instead\n */\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && (error as Error & { __flight_not_found?: boolean }).__flight_not_found === true;\n}\n\n/**\n * Server-side redirect\n * @deprecated Use redirect from './context.js' instead\n */\nexport function redirect(url: string, type: 'replace' | 'push' = 'replace'): never {\n const error = new Error(`Redirect: ${url}`);\n (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect = { url, type };\n throw error;\n}\n\n/**\n * Check if error is redirect\n * @deprecated Use isRedirectError from './context.js' instead\n */\nexport function isRedirectError(error: unknown): { url: string; type: string } | null {\n if (error instanceof Error && (error as Error & { __flight_redirect?: unknown }).__flight_redirect) {\n return (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect;\n }\n return null;\n}\n"]}
|
|
@@ -255,5 +255,5 @@ function isServer(deps) {
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
export { createSolidAdapter, createSolidConsumer, isServer, markAsSolidClientComponent };
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
259
|
-
//# sourceMappingURL=chunk-
|
|
258
|
+
//# sourceMappingURL=chunk-3N5ZBVZJ.js.map
|
|
259
|
+
//# sourceMappingURL=chunk-3N5ZBVZJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/adapters/solid.ts"],"names":[],"mappings":"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","file":"chunk-3N5ZBVZJ.js","sourcesContent":["/**\n * @flight-framework/core - Solid.js UI Adapter\n * \n * Adapter for using Solid.js with Flight Server Components.\n * Enables Flight to render Solid components without tight coupling.\n * \n * Philosophy: Zero lock-in - Solid is optional, user decides.\n * \n * @module @flight-framework/core/rsc/adapters/solid\n */\n\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\n\n// ============================================================================\n// Solid Symbols\n// ============================================================================\n\n// Flight reference symbols\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Solid JSX Element interface\n */\ninterface SolidElement {\n t: string | ((props: unknown) => unknown); // tag or component\n p: Record<string, unknown> | null; // props\n r?: unknown; // key/ref\n}\n\n/**\n * Solid dependencies (user provides these)\n */\nexport interface SolidDependencies {\n /** solid-js module */\n solid: {\n createSignal: <T>(value: T) => [() => T, (v: T) => void];\n createMemo: <T>(fn: () => T) => () => T;\n createEffect: (fn: () => void) => void;\n children: (fn: () => unknown) => () => unknown[];\n splitProps: <T extends object, K extends keyof T>(\n props: T,\n ...keys: K[][]\n ) => [Pick<T, K>, Omit<T, K>][];\n For?: unknown;\n Show?: unknown;\n Switch?: unknown;\n Match?: unknown;\n Suspense?: unknown;\n ErrorBoundary?: unknown;\n };\n /** solid-js/web module */\n web: {\n render?: (code: () => unknown, element: Element) => () => void;\n hydrate?: (code: () => unknown, element: Element) => () => void;\n renderToString?: (code: () => unknown) => string;\n renderToStringAsync?: (code: () => unknown) => Promise<string>;\n isServer?: boolean;\n Dynamic?: unknown;\n };\n}\n\n// ============================================================================\n// Adapter Implementation\n// ============================================================================\n\n/**\n * Create Solid.js UI Adapter\n * \n * @example\n * ```typescript\n * import { createSolidAdapter } from '@flight-framework/core/rsc/adapters/solid';\n * import * as solid from 'solid-js';\n * import * as web from 'solid-js/web';\n * \n * const adapter = createSolidAdapter({ solid, web });\n * const renderer = createRenderer(adapter);\n * ```\n */\nexport function createSolidAdapter(deps?: SolidDependencies): UIAdapter {\n const { solid, web } = deps || {};\n\n return {\n name: 'solid',\n\n isElement(value: unknown): boolean {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n // Solid JSX elements are plain objects with t (type) and p (props)\n const el = value as Record<string, unknown>;\n\n // Check for Solid's compiled JSX structure\n if ('t' in el && ('p' in el || el.p === null)) {\n return true;\n }\n\n // Check for function components (Solid lazy returns functions)\n if (typeof value === 'function') {\n return true;\n }\n\n return false;\n },\n\n getElementType(element: unknown): ElementTypeInfo {\n // Handle function directly (component or lazy)\n if (typeof element === 'function') {\n const fn = element as ((props: Record<string, unknown>) => unknown) & {\n displayName?: string;\n name?: string;\n };\n return {\n kind: 'component',\n fn,\n name: fn.displayName || fn.name || 'SolidComponent'\n };\n }\n\n const el = element as SolidElement;\n const type = el.t;\n\n // String = host element (div, span, etc.)\n if (typeof type === 'string') {\n return { kind: 'host', tag: type };\n }\n\n // Function = component\n if (typeof type === 'function') {\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\n displayName?: string;\n name?: string;\n };\n\n // Check for Solid built-in components\n if (solid) {\n if (type === solid.For) {\n return { kind: 'fragment' };\n }\n if (type === solid.Show) {\n return { kind: 'fragment' };\n }\n if (type === solid.Suspense) {\n return {\n kind: 'suspense',\n fallback: el.p?.fallback\n };\n }\n }\n\n return {\n kind: 'component',\n fn,\n name: fn.displayName || fn.name || 'Component'\n };\n }\n\n // Symbol types (Fragment, etc.)\n if (typeof type === 'symbol') {\n return { kind: 'fragment' };\n }\n\n return { kind: 'null' };\n },\n\n getProps(element: unknown): Record<string, unknown> {\n if (typeof element === 'function') {\n return {};\n }\n return (element as SolidElement).p || {};\n },\n\n getChildren(element: unknown): unknown[] {\n if (typeof element === 'function') {\n return [];\n }\n\n const props = (element as SolidElement).p;\n const children = props?.children;\n\n if (children === undefined || children === null) {\n return [];\n }\n\n // Solid children can be functions (for reactivity)\n if (typeof children === 'function') {\n // In SSR context, we can call the function\n if (web?.isServer) {\n try {\n const result = (children as () => unknown)();\n if (Array.isArray(result)) {\n return result;\n }\n return [result];\n } catch {\n return [];\n }\n }\n // On client, return as-is for hydration\n return [children];\n }\n\n if (Array.isArray(children)) {\n return children.flat();\n }\n\n return [children];\n },\n\n getKey(element: unknown): string | number | undefined {\n if (typeof element === 'function') {\n return undefined;\n }\n const ref = (element as SolidElement).r;\n if (typeof ref === 'string' || typeof ref === 'number') {\n return ref;\n }\n return undefined;\n },\n\n isClientBoundary(component: unknown): boolean {\n if (typeof component !== 'function' && typeof component !== 'object') {\n return false;\n }\n\n const comp = component as {\n $$typeof?: symbol;\n __flight_client?: boolean;\n };\n\n // Check for Flight client marker\n if (comp.__flight_client === true) return true;\n\n // Check for client reference symbol\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\n\n return false;\n },\n\n createElement(\n component: (props: Record<string, unknown>) => unknown,\n props: Record<string, unknown>\n ): unknown {\n // Solid JSX elements are plain objects with t (type) and p (props)\n return {\n t: component,\n p: props,\n r: null,\n } as SolidElement;\n },\n\n async renderToString(element: unknown): Promise<string> {\n if (web?.renderToStringAsync) {\n // Async SSR with Suspense support\n return web.renderToStringAsync(() => element);\n }\n if (web?.renderToString) {\n // Sync SSR\n return web.renderToString(() => element);\n }\n throw new Error(\n 'renderToString not provided. Pass solid-js/web when creating the adapter: ' +\n 'createSolidAdapter({ solid, web })'\n );\n },\n };\n}\n\n// ============================================================================\n// Solid Client Consumer\n// ============================================================================\n\n/**\n * Options for Solid consumer\n */\nexport interface SolidConsumerOptions {\n /** Registry of client components */\n registry?: Map<string, () => Promise<unknown>>;\n}\n\n/**\n * Create a Solid client-side consumer for Flight payloads\n */\nexport function createSolidConsumer(\n deps: SolidDependencies,\n options: SolidConsumerOptions = {}\n) {\n const { solid, web } = deps;\n const { registry = new Map() } = options;\n\n return {\n /**\n * Register a client component\n */\n register(id: string, loader: () => Promise<unknown>): void {\n registry.set(id, loader);\n },\n\n /**\n * Convert Flight elements to Solid JSX\n */\n toSolidElement(element: import('../payload.js').FlightElement): unknown {\n switch (element.$$type) {\n case 'null':\n return null;\n\n case 'text':\n return element.value;\n\n case 'host': {\n // Create Solid element structure\n const children = element.children.map(c => this.toSolidElement(c));\n return {\n t: element.tag,\n p: { ...element.props, children },\n r: element.key,\n };\n }\n\n case 'fragment': {\n const children = element.children.map(c => this.toSolidElement(c));\n return children;\n }\n\n case 'suspense': {\n if (solid?.Suspense) {\n const fallback = this.toSolidElement(element.fallback);\n const children = element.children.map(c => this.toSolidElement(c));\n return {\n t: solid.Suspense,\n p: { fallback: () => fallback, children: () => children },\n };\n }\n return element.children.map(c => this.toSolidElement(c));\n }\n\n case 'client': {\n const loader = registry.get(element.ref);\n if (!loader) {\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\n if (element.ssr) {\n return {\n t: 'div',\n p: { innerHTML: element.ssr },\n };\n }\n return null;\n }\n\n // Create lazy component for Solid\n // Solid's lazy is different - it expects a dynamic import\n const LazyComponent = async () => {\n const mod = await loader() as { default?: unknown };\n return mod.default ?? mod;\n };\n\n if (solid?.Suspense) {\n return {\n t: solid.Suspense,\n p: {\n fallback: () => element.ssr ? { t: 'div', p: { innerHTML: element.ssr } } : null,\n children: LazyComponent,\n },\n };\n }\n\n return { t: LazyComponent, p: {} };\n }\n\n case 'lazy': {\n if (element.fallback) {\n return this.toSolidElement(element.fallback);\n }\n return {\n t: 'div',\n p: { 'data-flight-pending': element.id }\n };\n }\n\n default:\n return null;\n }\n },\n\n /**\n * Hydrate Flight payload into DOM\n */\n hydrate(\n chunks: import('../payload.js').FlightChunk[],\n container: Element\n ): (() => void) | undefined {\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\n if (!rootChunk || rootChunk.type !== 'S') {\n throw new Error('[Flight] No root chunk found');\n }\n\n // Register client components\n for (const chunk of chunks) {\n if (chunk.type === 'C') {\n if (!registry.has(chunk.id)) {\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\n }\n }\n }\n\n const element = this.toSolidElement(rootChunk.tree);\n\n if (web?.hydrate) {\n return web.hydrate(() => element, container);\n }\n if (web?.render) {\n return web.render(() => element, container);\n }\n\n throw new Error('[Flight] Solid web.hydrate or web.render not provided');\n },\n };\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Type helper for Solid Server Component\n */\nexport type SolidServerComponent<P = Record<string, unknown>> = (\n props: P,\n ctx: import('../context.js').ServerContext\n) => Promise<unknown> | unknown;\n\n/**\n * Mark a Solid component as a client component\n */\nexport function markAsSolidClientComponent<T extends object>(\n component: T,\n moduleId: string,\n exportName = 'default'\n): T {\n const marked = component as T & {\n $$typeof: symbol;\n __flight_client: boolean;\n __flight_module: string;\n __flight_export: string;\n };\n\n marked.$$typeof = CLIENT_REFERENCE;\n marked.__flight_client = true;\n marked.__flight_module = moduleId;\n marked.__flight_export = exportName;\n\n return marked;\n}\n\n/**\n * Check if running on server (Solid isServer helper)\n */\nexport function isServer(deps?: SolidDependencies): boolean {\n return deps?.web?.isServer ?? (typeof window === 'undefined');\n}\n"]}
|
|
@@ -221,5 +221,5 @@ function markAsVueClientComponent(component, moduleId, exportName = "default") {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
export { createVueAdapter, createVueConsumer, markAsVueClientComponent };
|
|
224
|
-
//# sourceMappingURL=chunk-
|
|
225
|
-
//# sourceMappingURL=chunk-
|
|
224
|
+
//# sourceMappingURL=chunk-3UQJE3XZ.js.map
|
|
225
|
+
//# sourceMappingURL=chunk-3UQJE3XZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/adapters/vue.ts"],"names":["children"],"mappings":"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","file":"chunk-3UQJE3XZ.js","sourcesContent":["/**\n * @flight-framework/core - Vue UI Adapter\n * \n * Adapter for using Vue 3 with Flight Server Components.\n * Enables Flight to render Vue components without tight coupling.\n * \n * Philosophy: Zero lock-in - Vue is optional, user decides.\n * \n * @module @flight-framework/core/rsc/adapters/vue\n */\n\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\n\n// ============================================================================\n// Vue Symbols (Vue 3 internal markers)\n// ============================================================================\n\nconst VUE_FRAGMENT = Symbol.for('v-fgt');\nconst VUE_TEXT = Symbol.for('v-txt');\nconst VUE_COMMENT = Symbol.for('v-cmt');\nconst VUE_SUSPENSE = Symbol.for('v-sus');\nconst VUE_TELEPORT = Symbol.for('v-tel');\n\n// Flight reference symbols\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Vue VNode interface\n */\ninterface VueVNode {\n __v_isVNode?: boolean;\n type: unknown;\n props: Record<string, unknown> | null;\n children: unknown;\n key: string | number | null;\n component?: unknown;\n shapeFlag?: number;\n}\n\n/**\n * Vue dependencies (user provides these)\n */\nexport interface VueDependencies {\n /** Vue module */\n Vue: {\n h: (type: unknown, props?: unknown, children?: unknown) => VueVNode;\n isVNode: (value: unknown) => boolean;\n createSSRApp?: (rootComponent: unknown) => unknown;\n Fragment?: symbol;\n Suspense?: unknown;\n Text?: symbol;\n };\n /** renderToString from vue/server-renderer (optional - for SSR) */\n renderToString?: (app: unknown) => Promise<string>;\n}\n\n// ============================================================================\n// Adapter Implementation\n// ============================================================================\n\n/**\n * Create Vue UI Adapter\n * \n * @example\n * ```typescript\n * import { createVueAdapter } from '@flight-framework/core/rsc/adapters/vue';\n * import * as Vue from 'vue';\n * import { renderToString } from 'vue/server-renderer';\n * \n * const adapter = createVueAdapter({\n * Vue,\n * renderToString,\n * });\n * \n * const renderer = createRenderer(adapter);\n * ```\n */\nexport function createVueAdapter(deps?: VueDependencies): UIAdapter {\n const { Vue, renderToString } = deps || {};\n\n return {\n name: 'vue',\n\n isElement(value: unknown): boolean {\n if (Vue?.isVNode) {\n return Vue.isVNode(value);\n }\n // Fallback: check for __v_isVNode marker\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as VueVNode).__v_isVNode === true\n );\n },\n\n getElementType(element: unknown): ElementTypeInfo {\n const vnode = element as VueVNode;\n const type = vnode.type;\n\n // String = host element (div, span, etc.)\n if (typeof type === 'string') {\n return { kind: 'host', tag: type };\n }\n\n // Symbol types\n if (typeof type === 'symbol') {\n // Fragment\n if (type === VUE_FRAGMENT || type === Vue?.Fragment) {\n return { kind: 'fragment' };\n }\n\n // Text\n if (type === VUE_TEXT || type === Vue?.Text) {\n const children = vnode.children;\n return {\n kind: 'text',\n value: String(children ?? '')\n };\n }\n\n // Comment\n if (type === VUE_COMMENT) {\n return { kind: 'null' };\n }\n\n // Suspense\n if (type === VUE_SUSPENSE) {\n return {\n kind: 'suspense',\n fallback: vnode.props?.fallback\n };\n }\n\n // Teleport (treat as fragment for RSC)\n if (type === VUE_TELEPORT) {\n return { kind: 'fragment' };\n }\n\n return { kind: 'null' };\n }\n\n // Object component (Options API or async component)\n if (typeof type === 'object' && type !== null) {\n const comp = type as {\n name?: string;\n setup?: unknown;\n render?: unknown;\n __asyncLoader?: unknown;\n };\n\n // Async component\n if (comp.__asyncLoader) {\n return {\n kind: 'component',\n fn: () => null,\n name: comp.name || 'AsyncComponent'\n };\n }\n\n // Options API component\n if (comp.setup || comp.render) {\n return {\n kind: 'component',\n fn: (_props) => {\n // Vue components need to be rendered differently\n // This is a placeholder - actual rendering uses renderToString\n return null;\n },\n name: comp.name || 'VueComponent',\n };\n }\n }\n\n // Function component (Composition API)\n if (typeof type === 'function') {\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\n displayName?: string;\n name?: string;\n __name?: string;\n };\n return {\n kind: 'component',\n fn,\n name: fn.displayName || fn.__name || fn.name || 'Component'\n };\n }\n\n return { kind: 'null' };\n },\n\n getProps(element: unknown): Record<string, unknown> {\n const vnode = element as VueVNode;\n return vnode.props || {};\n },\n\n getChildren(element: unknown): unknown[] {\n const vnode = element as VueVNode;\n const children = vnode.children;\n\n if (children === undefined || children === null) {\n return [];\n }\n\n // String children\n if (typeof children === 'string' || typeof children === 'number') {\n return [children];\n }\n\n // Array children\n if (Array.isArray(children)) {\n return children.flat();\n }\n\n // Slots object\n if (typeof children === 'object' && children !== null) {\n const slots = children as Record<string, () => unknown[]>;\n if (typeof slots.default === 'function') {\n return slots.default();\n }\n }\n\n return [children];\n },\n\n getKey(element: unknown): string | number | undefined {\n const key = (element as VueVNode).key;\n return key !== null ? key : undefined;\n },\n\n isClientBoundary(component: unknown): boolean {\n if (typeof component !== 'function' && typeof component !== 'object') {\n return false;\n }\n\n const comp = component as {\n $$typeof?: symbol;\n __flight_client?: boolean;\n };\n\n // Check for Flight client marker\n if (comp.__flight_client === true) return true;\n\n // Check for client reference symbol\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\n\n return false;\n },\n\n createElement(\n component: (props: Record<string, unknown>) => unknown,\n props: Record<string, unknown>\n ): unknown {\n // Create a Vue VNode using h() if available\n if (Vue?.h) {\n return Vue.h(component, props);\n }\n\n // Fallback: create VNode structure directly\n return {\n __v_isVNode: true,\n type: component,\n props,\n key: null,\n children: props.children ?? null,\n } as VueVNode;\n },\n\n async renderToString(element: unknown): Promise<string> {\n if (renderToString && Vue?.createSSRApp) {\n // Create SSR app wrapper\n const app = Vue.createSSRApp({\n render: () => element\n });\n return renderToString(app);\n }\n throw new Error(\n 'renderToString not provided. Pass Vue and renderToString when creating the adapter: ' +\n 'createVueAdapter({ Vue, renderToString })'\n );\n },\n };\n}\n\n// ============================================================================\n// Vue Client Consumer\n// ============================================================================\n\n/**\n * Options for Vue consumer\n */\nexport interface VueConsumerOptions {\n /** Registry of client components */\n registry?: Map<string, () => Promise<unknown>>;\n}\n\n/**\n * Create a Vue client-side consumer for Flight payloads\n */\nexport function createVueConsumer(deps: VueDependencies, options: VueConsumerOptions = {}) {\n const { Vue } = deps;\n const { registry = new Map() } = options;\n\n return {\n /**\n * Register a client component\n */\n register(id: string, loader: () => Promise<unknown>): void {\n registry.set(id, loader);\n },\n\n /**\n * Convert Flight elements to Vue VNodes\n */\n toVueElement(element: import('../payload.js').FlightElement): unknown {\n switch (element.$$type) {\n case 'null':\n return null;\n\n case 'text':\n return element.value;\n\n case 'host': {\n const children = element.children.map(c => this.toVueElement(c));\n return Vue.h(\n element.tag,\n { ...element.props, key: element.key },\n children\n );\n }\n\n case 'fragment': {\n const children = element.children.map(c => this.toVueElement(c));\n return Vue.h(Vue.Fragment!, null, children);\n }\n\n case 'suspense': {\n if (Vue.Suspense) {\n const fallback = this.toVueElement(element.fallback);\n const children = element.children.map(c => this.toVueElement(c));\n return Vue.h(Vue.Suspense, null, {\n default: () => children,\n fallback: () => fallback,\n });\n }\n // Fallback: render children directly\n const children = element.children.map(c => this.toVueElement(c));\n return Vue.h(Vue.Fragment!, null, children);\n }\n\n case 'client': {\n const loader = registry.get(element.ref);\n if (!loader) {\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\n if (element.ssr) {\n return Vue.h('div', {\n innerHTML: element.ssr\n });\n }\n return null;\n }\n\n // Create async component\n const AsyncComponent = {\n async setup() {\n const mod = await loader() as { default?: unknown };\n return () => Vue.h(mod.default ?? mod as unknown);\n }\n };\n\n return Vue.h(AsyncComponent);\n }\n\n case 'lazy': {\n if (element.fallback) {\n return this.toVueElement(element.fallback);\n }\n return Vue.h('div', { 'data-flight-pending': element.id });\n }\n\n default:\n return null;\n }\n },\n };\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Type helper for Vue Server Component\n */\nexport type VueServerComponent<P = Record<string, unknown>> = (\n props: P,\n ctx: import('../context.js').ServerContext\n) => Promise<VueVNode> | VueVNode;\n\n/**\n * Mark a Vue component as a client component\n */\nexport function markAsVueClientComponent<T extends object>(\n component: T,\n moduleId: string,\n exportName = 'default'\n): T {\n const marked = component as T & {\n $$typeof: symbol;\n __flight_client: boolean;\n __flight_module: string;\n __flight_export: string;\n };\n\n marked.$$typeof = CLIENT_REFERENCE;\n marked.__flight_client = true;\n marked.__flight_module = moduleId;\n marked.__flight_export = exportName;\n\n return marked;\n}\n"]}
|
|
@@ -254,5 +254,5 @@ function registerServerAction(id, action) {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
export { BoundaryRegistry, CLIENT_REFERENCE, SERVER_REFERENCE, analyzeModule, createClientReference, createServerReference, detectAsyncComponents, detectBoundaryType, detectInlineServerActions, getReferenceId, globalRegistry, hasUseClientDirective, hasUseServerDirective, isClientReference, isServerReference, registerClientComponent, registerServerAction };
|
|
257
|
-
//# sourceMappingURL=chunk-
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
257
|
+
//# sourceMappingURL=chunk-5XHOLZBJ.js.map
|
|
258
|
+
//# sourceMappingURL=chunk-5XHOLZBJ.js.map
|