@useavalon/avalon 0.1.11 → 0.1.13
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/README.md +54 -54
- package/mod.ts +302 -302
- package/package.json +49 -26
- package/src/build/integration-bundler-plugin.ts +116 -116
- package/src/build/integration-config.ts +168 -168
- package/src/build/integration-detection-plugin.ts +117 -117
- package/src/build/integration-resolver-plugin.ts +90 -90
- package/src/build/island-manifest.ts +269 -269
- package/src/build/island-types-generator.ts +476 -476
- package/src/build/mdx-island-transform.ts +464 -464
- package/src/build/mdx-plugin.ts +98 -98
- package/src/build/page-island-transform.ts +598 -598
- package/src/build/prop-extractors/index.ts +21 -21
- package/src/build/prop-extractors/lit.ts +140 -140
- package/src/build/prop-extractors/qwik.ts +16 -16
- package/src/build/prop-extractors/solid.ts +125 -125
- package/src/build/prop-extractors/svelte.ts +194 -194
- package/src/build/prop-extractors/vue.ts +111 -111
- package/src/build/sidecar-file-manager.ts +104 -104
- package/src/build/sidecar-renderer.ts +30 -30
- package/src/client/adapters/index.ts +21 -13
- package/src/client/components.ts +35 -35
- package/src/client/css-hmr-handler.ts +344 -344
- package/src/client/framework-adapter.ts +462 -462
- package/src/client/hmr-coordinator.ts +396 -396
- package/src/client/hmr-error-overlay.js +533 -533
- package/src/client/main.js +824 -816
- package/src/client/types/framework-runtime.d.ts +68 -68
- package/src/client/types/vite-hmr.d.ts +46 -46
- package/src/client/types/vite-virtual-modules.d.ts +70 -60
- package/src/components/Image.tsx +123 -123
- package/src/components/IslandErrorBoundary.tsx +145 -145
- package/src/components/LayoutDataErrorBoundary.tsx +141 -141
- package/src/components/LayoutErrorBoundary.tsx +127 -127
- package/src/components/PersistentIsland.tsx +52 -52
- package/src/components/StreamingErrorBoundary.tsx +233 -233
- package/src/components/StreamingLayout.tsx +538 -538
- package/src/core/components/component-analyzer.ts +192 -192
- package/src/core/components/component-detection.ts +508 -508
- package/src/core/components/enhanced-framework-detector.ts +500 -500
- package/src/core/components/framework-registry.ts +563 -563
- package/src/core/content/mdx-processor.ts +46 -46
- package/src/core/integrations/index.ts +19 -19
- package/src/core/integrations/loader.ts +125 -125
- package/src/core/integrations/registry.ts +175 -175
- package/src/core/islands/island-persistence.ts +325 -325
- package/src/core/islands/island-state-serializer.ts +258 -258
- package/src/core/islands/persistent-island-context.tsx +80 -80
- package/src/core/islands/use-persistent-state.ts +68 -68
- package/src/core/layout/enhanced-layout-resolver.ts +322 -322
- package/src/core/layout/layout-cache-manager.ts +485 -485
- package/src/core/layout/layout-composer.ts +357 -357
- package/src/core/layout/layout-data-loader.ts +516 -516
- package/src/core/layout/layout-discovery.ts +243 -243
- package/src/core/layout/layout-matcher.ts +299 -299
- package/src/core/layout/layout-types.ts +110 -110
- package/src/core/modules/framework-module-resolver.ts +273 -273
- package/src/islands/component-analysis.ts +213 -213
- package/src/islands/css-utils.ts +565 -565
- package/src/islands/discovery/index.ts +80 -80
- package/src/islands/discovery/registry.ts +340 -340
- package/src/islands/discovery/resolver.ts +477 -477
- package/src/islands/discovery/scanner.ts +386 -386
- package/src/islands/discovery/types.ts +117 -117
- package/src/islands/discovery/validator.ts +544 -544
- package/src/islands/discovery/watcher.ts +368 -368
- package/src/islands/framework-detection.ts +428 -428
- package/src/islands/integration-loader.ts +490 -490
- package/src/islands/island.tsx +565 -565
- package/src/islands/render-cache.ts +550 -550
- package/src/islands/types.ts +80 -80
- package/src/islands/universal-css-collector.ts +157 -157
- package/src/islands/universal-head-collector.ts +137 -137
- package/src/layout-system.d.ts +592 -592
- package/src/layout-system.ts +218 -218
- package/src/middleware/discovery.ts +268 -268
- package/src/middleware/executor.ts +315 -315
- package/src/middleware/index.ts +76 -76
- package/src/middleware/types.ts +99 -99
- package/src/nitro/build-config.ts +575 -575
- package/src/nitro/config.ts +483 -483
- package/src/nitro/error-handler.ts +636 -636
- package/src/nitro/index.ts +173 -173
- package/src/nitro/island-manifest.ts +584 -584
- package/src/nitro/middleware-adapter.ts +260 -260
- package/src/nitro/renderer.ts +1471 -1471
- package/src/nitro/route-discovery.ts +439 -439
- package/src/nitro/types.ts +321 -321
- package/src/render/collect-css.ts +198 -198
- package/src/render/error-pages.ts +79 -79
- package/src/render/isolated-ssr-renderer.ts +654 -654
- package/src/render/ssr.ts +1030 -1030
- package/src/schemas/api.ts +30 -30
- package/src/schemas/core.ts +64 -64
- package/src/schemas/index.ts +212 -212
- package/src/schemas/layout.ts +279 -279
- package/src/schemas/routing/index.ts +38 -38
- package/src/schemas/routing.ts +376 -376
- package/src/types/as-island.ts +20 -20
- package/src/types/image.d.ts +106 -106
- package/src/types/index.d.ts +22 -22
- package/src/types/island-jsx.d.ts +33 -33
- package/src/types/island-prop.d.ts +20 -20
- package/src/types/layout.ts +285 -285
- package/src/types/mdx.d.ts +6 -6
- package/src/types/routing.ts +555 -555
- package/src/types/types.ts +5 -5
- package/src/types/urlpattern.d.ts +49 -49
- package/src/types/vite-env.d.ts +11 -11
- package/src/utils/dev-logger.ts +299 -299
- package/src/utils/fs.ts +151 -151
- package/src/vite-plugin/auto-discover.ts +551 -551
- package/src/vite-plugin/config.ts +266 -266
- package/src/vite-plugin/errors.ts +127 -127
- package/src/vite-plugin/image-optimization.ts +156 -156
- package/src/vite-plugin/integration-activator.ts +126 -126
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
- package/src/vite-plugin/module-discovery.ts +189 -189
- package/src/vite-plugin/nitro-integration.ts +1354 -1354
- package/src/vite-plugin/plugin.ts +403 -409
- package/src/vite-plugin/types.ts +327 -327
- package/src/vite-plugin/validation.ts +228 -228
- package/src/client/adapters/index.js +0 -12
- package/src/client/adapters/lit-adapter.js +0 -467
- package/src/client/adapters/lit-adapter.ts +0 -654
- package/src/client/adapters/preact-adapter.js +0 -223
- package/src/client/adapters/preact-adapter.ts +0 -331
- package/src/client/adapters/qwik-adapter.js +0 -259
- package/src/client/adapters/qwik-adapter.ts +0 -345
- package/src/client/adapters/react-adapter.js +0 -220
- package/src/client/adapters/react-adapter.ts +0 -353
- package/src/client/adapters/solid-adapter.js +0 -295
- package/src/client/adapters/solid-adapter.ts +0 -451
- package/src/client/adapters/svelte-adapter.js +0 -368
- package/src/client/adapters/svelte-adapter.ts +0 -524
- package/src/client/adapters/vue-adapter.js +0 -278
- package/src/client/adapters/vue-adapter.ts +0 -467
- package/src/client/components.js +0 -23
- package/src/client/css-hmr-handler.js +0 -263
- package/src/client/framework-adapter.js +0 -283
- package/src/client/hmr-coordinator.js +0 -274
package/src/schemas/layout.ts
CHANGED
|
@@ -1,279 +1,279 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import type { ComponentChildren } from 'preact';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Layout Context Schema - Contains request information and state for layout processing
|
|
6
|
-
*/
|
|
7
|
-
export const LayoutContextSchema = z.object({
|
|
8
|
-
request: z.instanceof(Request),
|
|
9
|
-
params: z.record(z.string(), z.string()),
|
|
10
|
-
query: z.instanceof(URLSearchParams),
|
|
11
|
-
state: z.instanceof(Map<string, unknown>),
|
|
12
|
-
middlewareContext: z.any().optional(), // MiddlewareContext type from middleware system
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Layout Data Schema - Flexible data structure for layout loaders
|
|
17
|
-
*/
|
|
18
|
-
export const LayoutDataSchema = z.record(z.string(), z.unknown());
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Layout Route Schema - Represents a discovered layout file with routing information
|
|
22
|
-
*/
|
|
23
|
-
export const LayoutRouteSchema = z.object({
|
|
24
|
-
pattern: z.instanceof(URLPattern),
|
|
25
|
-
layoutPath: z.string().min(1),
|
|
26
|
-
priority: z.number().int().min(0),
|
|
27
|
-
type: z.enum(['root', 'nested']),
|
|
28
|
-
depth: z.number().int().min(0),
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Layout Handler Schema - Complete layout information including component and loader
|
|
33
|
-
*/
|
|
34
|
-
export const LayoutHandlerSchema = z.object({
|
|
35
|
-
component: z.any(), // ComponentType<LayoutProps> - can't validate function types with Zod
|
|
36
|
-
loader: z.any().optional(), // LayoutLoader function - can't validate function signature with Zod
|
|
37
|
-
path: z.string().min(1),
|
|
38
|
-
priority: z.number().int().min(0),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Layout Props Schema - Props passed to layout components
|
|
43
|
-
*/
|
|
44
|
-
export const LayoutPropsSchema = z.object({
|
|
45
|
-
children: z.any(), // ComponentChildren - can't validate JSX with Zod
|
|
46
|
-
data: LayoutDataSchema,
|
|
47
|
-
frontmatter: z.record(z.string(), z.any()).optional(), // Frontmatter from MDX files
|
|
48
|
-
route: z.object({
|
|
49
|
-
path: z.string(),
|
|
50
|
-
params: z.record(z.string(), z.string()),
|
|
51
|
-
query: z.instanceof(URLSearchParams),
|
|
52
|
-
}),
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Layout Discovery Options Schema
|
|
57
|
-
*/
|
|
58
|
-
export const LayoutDiscoveryOptionsSchema = z.object({
|
|
59
|
-
baseDirectory: z.string().min(1),
|
|
60
|
-
filePattern: z.string().min(1).optional().default('_layout.tsx'),
|
|
61
|
-
excludeDirectories: z.array(z.string()).optional().default([]),
|
|
62
|
-
enableWatching: z.boolean().optional().default(false),
|
|
63
|
-
developmentMode: z.boolean().optional().default(false),
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Route Info Schema - Information about the current route for conditional rendering
|
|
68
|
-
*/
|
|
69
|
-
export const RouteInfoSchema = z.object({
|
|
70
|
-
path: z.string(),
|
|
71
|
-
params: z.record(z.string(), z.string()),
|
|
72
|
-
method: z.string(),
|
|
73
|
-
headers: z.instanceof(Headers),
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Layout Rule Schema - Rules for conditional layout rendering
|
|
78
|
-
*/
|
|
79
|
-
export const LayoutRuleSchema = z.object({
|
|
80
|
-
matches: z.any(), // (layoutPath: string, route: RouteInfo) => boolean - can't validate function signature with Zod
|
|
81
|
-
apply: z.boolean(),
|
|
82
|
-
priority: z.number().int(),
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Layout Config Schema - Page-level layout composition control
|
|
87
|
-
*/
|
|
88
|
-
export const LayoutConfigSchema = z.object({
|
|
89
|
-
skipLayouts: z.array(z.string()).optional(),
|
|
90
|
-
replaceLayout: z.boolean().optional(),
|
|
91
|
-
onlyLayouts: z.array(z.string()).optional(),
|
|
92
|
-
customLayout: z.string().optional(),
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Island State Schema - State data for persistent islands
|
|
97
|
-
*/
|
|
98
|
-
export const IslandStateSchema = z.record(z.string(), z.unknown());
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Persistent Island Props Schema
|
|
102
|
-
*/
|
|
103
|
-
export const PersistentIslandPropsSchema = z.object({
|
|
104
|
-
persistentId: z.string().min(1),
|
|
105
|
-
children: z.any(), // ComponentChildren
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Persistent Island Context Schema
|
|
110
|
-
*/
|
|
111
|
-
export const PersistentIslandContextSchema = z.object({
|
|
112
|
-
saveState: z.any(), // (state: IslandState) => void - can't validate function signature with Zod
|
|
113
|
-
loadState: z.any(), // () => IslandState | null - can't validate function signature with Zod
|
|
114
|
-
clearState: z.any(), // () => void - can't validate function signature with Zod
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Layout Error Info Schema
|
|
119
|
-
*/
|
|
120
|
-
export const LayoutErrorInfoSchema = z.object({
|
|
121
|
-
layoutPath: z.string(),
|
|
122
|
-
errorType: z.enum(['component', 'loader', 'rendering', 'island']),
|
|
123
|
-
timestamp: z.number().int().positive(),
|
|
124
|
-
componentStack: z.string().optional(),
|
|
125
|
-
errorBoundary: z.string().optional(),
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Layout Error Boundary Props Schema
|
|
130
|
-
*/
|
|
131
|
-
export const LayoutErrorBoundaryPropsSchema = z.object({
|
|
132
|
-
children: z.any(), // ComponentChildren
|
|
133
|
-
fallback: z.any(), // (error: Error, retry: () => void) => ComponentChildren - can't validate function signature with Zod
|
|
134
|
-
onError: z.any().optional(), // (error: Error, errorInfo: unknown) => void - can't validate function signature with Zod
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Error Recovery Strategy Schema
|
|
139
|
-
*/
|
|
140
|
-
export const ErrorRecoveryStrategySchema = z.object({
|
|
141
|
-
type: z.enum(['retry', 'fallback', 'skip', 'redirect']),
|
|
142
|
-
maxRetries: z.number().int().positive().optional(),
|
|
143
|
-
fallbackComponent: z.any().optional(), // ComponentType
|
|
144
|
-
redirectUrl: z.url().optional(),
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Streaming Layout Props Schema
|
|
149
|
-
*/
|
|
150
|
-
export const StreamingLayoutPropsSchema = z.object({
|
|
151
|
-
children: z.any(), // ComponentChildren
|
|
152
|
-
fallback: z.any().optional(), // ComponentChildren
|
|
153
|
-
priority: z.enum(['high', 'medium', 'low']).default('medium'),
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Streaming Component Schema
|
|
158
|
-
*/
|
|
159
|
-
export const StreamingComponentSchema = z.object({
|
|
160
|
-
component: z.any(), // ComponentType
|
|
161
|
-
fallback: z.any(), // ComponentType
|
|
162
|
-
priority: z.number().int().min(0),
|
|
163
|
-
isReady: z.any(), // () => Promise<boolean> - can't validate function signature with Zod
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Resolved Layout Schema - Complete layout resolution result
|
|
168
|
-
*/
|
|
169
|
-
export const ResolvedLayoutSchema = z.object({
|
|
170
|
-
handlers: z.array(LayoutHandlerSchema),
|
|
171
|
-
dataLoaders: z.array(z.any()), // LayoutLoader[] - can't validate function signature with Zod
|
|
172
|
-
errorBoundaries: z.array(z.any()), // LayoutErrorBoundary[]
|
|
173
|
-
streamingComponents: z.array(StreamingComponentSchema),
|
|
174
|
-
metadata: z.object({
|
|
175
|
-
totalLayouts: z.number().int().min(0),
|
|
176
|
-
resolutionTime: z.number().positive(),
|
|
177
|
-
cacheHit: z.boolean(),
|
|
178
|
-
}),
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Layout Cache Schema
|
|
183
|
-
*/
|
|
184
|
-
export const LayoutCacheSchema = z.object({
|
|
185
|
-
resolved: z.instanceof(Map), // Map<string, ResolvedLayout>
|
|
186
|
-
handlers: z.instanceof(Map), // Map<string, LayoutHandler>
|
|
187
|
-
data: z.instanceof(Map), // Map<string, LayoutData>
|
|
188
|
-
ttl: z.instanceof(Map), // Map<string, number>
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Enhanced Layout Context Schema - Extended context with layout-specific information
|
|
193
|
-
*/
|
|
194
|
-
export const EnhancedLayoutContextSchema = LayoutContextSchema.extend({
|
|
195
|
-
layouts: z.array(LayoutHandlerSchema),
|
|
196
|
-
parentData: z.array(LayoutDataSchema),
|
|
197
|
-
islandStates: z.instanceof(Map), // Map<string, IslandState>
|
|
198
|
-
streamingEnabled: z.boolean(),
|
|
199
|
-
errorBoundaries: z.array(z.any()), // LayoutErrorBoundary[]
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
// === TypeScript Type Definitions ===
|
|
203
|
-
|
|
204
|
-
export type LayoutContext = z.infer<typeof LayoutContextSchema>;
|
|
205
|
-
export type LayoutData = z.infer<typeof LayoutDataSchema>;
|
|
206
|
-
export type LayoutRoute = z.infer<typeof LayoutRouteSchema>;
|
|
207
|
-
export type LayoutHandler = z.infer<typeof LayoutHandlerSchema>;
|
|
208
|
-
export type LayoutProps = z.infer<typeof LayoutPropsSchema>;
|
|
209
|
-
export type LayoutDiscoveryOptions = z.infer<typeof LayoutDiscoveryOptionsSchema>;
|
|
210
|
-
export type RouteInfo = z.infer<typeof RouteInfoSchema>;
|
|
211
|
-
export type LayoutRule = z.infer<typeof LayoutRuleSchema>;
|
|
212
|
-
export type LayoutConfig = z.infer<typeof LayoutConfigSchema>;
|
|
213
|
-
export type IslandState = z.infer<typeof IslandStateSchema>;
|
|
214
|
-
export type PersistentIslandProps = z.infer<typeof PersistentIslandPropsSchema>;
|
|
215
|
-
export type PersistentIslandContext = z.infer<typeof PersistentIslandContextSchema>;
|
|
216
|
-
export type LayoutErrorInfo = z.infer<typeof LayoutErrorInfoSchema>;
|
|
217
|
-
export type LayoutErrorBoundaryProps = z.infer<typeof LayoutErrorBoundaryPropsSchema>;
|
|
218
|
-
export type ErrorRecoveryStrategy = z.infer<typeof ErrorRecoveryStrategySchema>;
|
|
219
|
-
export type StreamingLayoutProps = z.infer<typeof StreamingLayoutPropsSchema>;
|
|
220
|
-
export type StreamingComponent = z.infer<typeof StreamingComponentSchema>;
|
|
221
|
-
export type ResolvedLayout = z.infer<typeof ResolvedLayoutSchema>;
|
|
222
|
-
export type LayoutCache = z.infer<typeof LayoutCacheSchema>;
|
|
223
|
-
export type EnhancedLayoutContext = z.infer<typeof EnhancedLayoutContextSchema>;
|
|
224
|
-
|
|
225
|
-
// === Function Type Definitions ===
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Layout Loader Function Type
|
|
229
|
-
* Loads data for a specific layout component
|
|
230
|
-
*/
|
|
231
|
-
export type LayoutLoader = (ctx: LayoutContext) => Promise<LayoutData>;
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Layout Matcher Function Type
|
|
235
|
-
* Determines if a layout should be applied based on route information and optional layout path
|
|
236
|
-
*/
|
|
237
|
-
export type LayoutMatcherFunction = (route: RouteInfo, layoutPath?: string) => boolean;
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Layout Error Handler Function Type
|
|
241
|
-
* Handles errors that occur during layout processing
|
|
242
|
-
*/
|
|
243
|
-
export type LayoutErrorHandler = (error: Error, errorInfo: LayoutErrorInfo) => void;
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Layout Retry Function Type
|
|
247
|
-
* Function to retry failed layout operations
|
|
248
|
-
*/
|
|
249
|
-
export type LayoutRetryFunction = () => void;
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Layout Fallback Renderer Function Type
|
|
253
|
-
* Renders fallback UI when layout errors occur
|
|
254
|
-
*/
|
|
255
|
-
export type LayoutFallbackRenderer = (error: Error, retry: LayoutRetryFunction) => ComponentChildren;
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Island State Saver Function Type
|
|
259
|
-
* Saves island state to persistence layer
|
|
260
|
-
*/
|
|
261
|
-
export type IslandStateSaver = (state: IslandState) => void;
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Island State Loader Function Type
|
|
265
|
-
* Loads island state from persistence layer
|
|
266
|
-
*/
|
|
267
|
-
export type IslandStateLoader = () => IslandState | null;
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Island State Clearer Function Type
|
|
271
|
-
* Clears island state from persistence layer
|
|
272
|
-
*/
|
|
273
|
-
export type IslandStateClearer = () => void;
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Streaming Component Ready Check Function Type
|
|
277
|
-
* Checks if a streaming component is ready to render
|
|
278
|
-
*/
|
|
279
|
-
export type StreamingReadyCheck = () => Promise<boolean>;
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ComponentChildren } from 'preact';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Layout Context Schema - Contains request information and state for layout processing
|
|
6
|
+
*/
|
|
7
|
+
export const LayoutContextSchema = z.object({
|
|
8
|
+
request: z.instanceof(Request),
|
|
9
|
+
params: z.record(z.string(), z.string()),
|
|
10
|
+
query: z.instanceof(URLSearchParams),
|
|
11
|
+
state: z.instanceof(Map<string, unknown>),
|
|
12
|
+
middlewareContext: z.any().optional(), // MiddlewareContext type from middleware system
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Layout Data Schema - Flexible data structure for layout loaders
|
|
17
|
+
*/
|
|
18
|
+
export const LayoutDataSchema = z.record(z.string(), z.unknown());
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Layout Route Schema - Represents a discovered layout file with routing information
|
|
22
|
+
*/
|
|
23
|
+
export const LayoutRouteSchema = z.object({
|
|
24
|
+
pattern: z.instanceof(URLPattern),
|
|
25
|
+
layoutPath: z.string().min(1),
|
|
26
|
+
priority: z.number().int().min(0),
|
|
27
|
+
type: z.enum(['root', 'nested']),
|
|
28
|
+
depth: z.number().int().min(0),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Layout Handler Schema - Complete layout information including component and loader
|
|
33
|
+
*/
|
|
34
|
+
export const LayoutHandlerSchema = z.object({
|
|
35
|
+
component: z.any(), // ComponentType<LayoutProps> - can't validate function types with Zod
|
|
36
|
+
loader: z.any().optional(), // LayoutLoader function - can't validate function signature with Zod
|
|
37
|
+
path: z.string().min(1),
|
|
38
|
+
priority: z.number().int().min(0),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Layout Props Schema - Props passed to layout components
|
|
43
|
+
*/
|
|
44
|
+
export const LayoutPropsSchema = z.object({
|
|
45
|
+
children: z.any(), // ComponentChildren - can't validate JSX with Zod
|
|
46
|
+
data: LayoutDataSchema,
|
|
47
|
+
frontmatter: z.record(z.string(), z.any()).optional(), // Frontmatter from MDX files
|
|
48
|
+
route: z.object({
|
|
49
|
+
path: z.string(),
|
|
50
|
+
params: z.record(z.string(), z.string()),
|
|
51
|
+
query: z.instanceof(URLSearchParams),
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Layout Discovery Options Schema
|
|
57
|
+
*/
|
|
58
|
+
export const LayoutDiscoveryOptionsSchema = z.object({
|
|
59
|
+
baseDirectory: z.string().min(1),
|
|
60
|
+
filePattern: z.string().min(1).optional().default('_layout.tsx'),
|
|
61
|
+
excludeDirectories: z.array(z.string()).optional().default([]),
|
|
62
|
+
enableWatching: z.boolean().optional().default(false),
|
|
63
|
+
developmentMode: z.boolean().optional().default(false),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Route Info Schema - Information about the current route for conditional rendering
|
|
68
|
+
*/
|
|
69
|
+
export const RouteInfoSchema = z.object({
|
|
70
|
+
path: z.string(),
|
|
71
|
+
params: z.record(z.string(), z.string()),
|
|
72
|
+
method: z.string(),
|
|
73
|
+
headers: z.instanceof(Headers),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Layout Rule Schema - Rules for conditional layout rendering
|
|
78
|
+
*/
|
|
79
|
+
export const LayoutRuleSchema = z.object({
|
|
80
|
+
matches: z.any(), // (layoutPath: string, route: RouteInfo) => boolean - can't validate function signature with Zod
|
|
81
|
+
apply: z.boolean(),
|
|
82
|
+
priority: z.number().int(),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Layout Config Schema - Page-level layout composition control
|
|
87
|
+
*/
|
|
88
|
+
export const LayoutConfigSchema = z.object({
|
|
89
|
+
skipLayouts: z.array(z.string()).optional(),
|
|
90
|
+
replaceLayout: z.boolean().optional(),
|
|
91
|
+
onlyLayouts: z.array(z.string()).optional(),
|
|
92
|
+
customLayout: z.string().optional(),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Island State Schema - State data for persistent islands
|
|
97
|
+
*/
|
|
98
|
+
export const IslandStateSchema = z.record(z.string(), z.unknown());
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Persistent Island Props Schema
|
|
102
|
+
*/
|
|
103
|
+
export const PersistentIslandPropsSchema = z.object({
|
|
104
|
+
persistentId: z.string().min(1),
|
|
105
|
+
children: z.any(), // ComponentChildren
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Persistent Island Context Schema
|
|
110
|
+
*/
|
|
111
|
+
export const PersistentIslandContextSchema = z.object({
|
|
112
|
+
saveState: z.any(), // (state: IslandState) => void - can't validate function signature with Zod
|
|
113
|
+
loadState: z.any(), // () => IslandState | null - can't validate function signature with Zod
|
|
114
|
+
clearState: z.any(), // () => void - can't validate function signature with Zod
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Layout Error Info Schema
|
|
119
|
+
*/
|
|
120
|
+
export const LayoutErrorInfoSchema = z.object({
|
|
121
|
+
layoutPath: z.string(),
|
|
122
|
+
errorType: z.enum(['component', 'loader', 'rendering', 'island']),
|
|
123
|
+
timestamp: z.number().int().positive(),
|
|
124
|
+
componentStack: z.string().optional(),
|
|
125
|
+
errorBoundary: z.string().optional(),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Layout Error Boundary Props Schema
|
|
130
|
+
*/
|
|
131
|
+
export const LayoutErrorBoundaryPropsSchema = z.object({
|
|
132
|
+
children: z.any(), // ComponentChildren
|
|
133
|
+
fallback: z.any(), // (error: Error, retry: () => void) => ComponentChildren - can't validate function signature with Zod
|
|
134
|
+
onError: z.any().optional(), // (error: Error, errorInfo: unknown) => void - can't validate function signature with Zod
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Error Recovery Strategy Schema
|
|
139
|
+
*/
|
|
140
|
+
export const ErrorRecoveryStrategySchema = z.object({
|
|
141
|
+
type: z.enum(['retry', 'fallback', 'skip', 'redirect']),
|
|
142
|
+
maxRetries: z.number().int().positive().optional(),
|
|
143
|
+
fallbackComponent: z.any().optional(), // ComponentType
|
|
144
|
+
redirectUrl: z.url().optional(),
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Streaming Layout Props Schema
|
|
149
|
+
*/
|
|
150
|
+
export const StreamingLayoutPropsSchema = z.object({
|
|
151
|
+
children: z.any(), // ComponentChildren
|
|
152
|
+
fallback: z.any().optional(), // ComponentChildren
|
|
153
|
+
priority: z.enum(['high', 'medium', 'low']).default('medium'),
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Streaming Component Schema
|
|
158
|
+
*/
|
|
159
|
+
export const StreamingComponentSchema = z.object({
|
|
160
|
+
component: z.any(), // ComponentType
|
|
161
|
+
fallback: z.any(), // ComponentType
|
|
162
|
+
priority: z.number().int().min(0),
|
|
163
|
+
isReady: z.any(), // () => Promise<boolean> - can't validate function signature with Zod
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Resolved Layout Schema - Complete layout resolution result
|
|
168
|
+
*/
|
|
169
|
+
export const ResolvedLayoutSchema = z.object({
|
|
170
|
+
handlers: z.array(LayoutHandlerSchema),
|
|
171
|
+
dataLoaders: z.array(z.any()), // LayoutLoader[] - can't validate function signature with Zod
|
|
172
|
+
errorBoundaries: z.array(z.any()), // LayoutErrorBoundary[]
|
|
173
|
+
streamingComponents: z.array(StreamingComponentSchema),
|
|
174
|
+
metadata: z.object({
|
|
175
|
+
totalLayouts: z.number().int().min(0),
|
|
176
|
+
resolutionTime: z.number().positive(),
|
|
177
|
+
cacheHit: z.boolean(),
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Layout Cache Schema
|
|
183
|
+
*/
|
|
184
|
+
export const LayoutCacheSchema = z.object({
|
|
185
|
+
resolved: z.instanceof(Map), // Map<string, ResolvedLayout>
|
|
186
|
+
handlers: z.instanceof(Map), // Map<string, LayoutHandler>
|
|
187
|
+
data: z.instanceof(Map), // Map<string, LayoutData>
|
|
188
|
+
ttl: z.instanceof(Map), // Map<string, number>
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Enhanced Layout Context Schema - Extended context with layout-specific information
|
|
193
|
+
*/
|
|
194
|
+
export const EnhancedLayoutContextSchema = LayoutContextSchema.extend({
|
|
195
|
+
layouts: z.array(LayoutHandlerSchema),
|
|
196
|
+
parentData: z.array(LayoutDataSchema),
|
|
197
|
+
islandStates: z.instanceof(Map), // Map<string, IslandState>
|
|
198
|
+
streamingEnabled: z.boolean(),
|
|
199
|
+
errorBoundaries: z.array(z.any()), // LayoutErrorBoundary[]
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// === TypeScript Type Definitions ===
|
|
203
|
+
|
|
204
|
+
export type LayoutContext = z.infer<typeof LayoutContextSchema>;
|
|
205
|
+
export type LayoutData = z.infer<typeof LayoutDataSchema>;
|
|
206
|
+
export type LayoutRoute = z.infer<typeof LayoutRouteSchema>;
|
|
207
|
+
export type LayoutHandler = z.infer<typeof LayoutHandlerSchema>;
|
|
208
|
+
export type LayoutProps = z.infer<typeof LayoutPropsSchema>;
|
|
209
|
+
export type LayoutDiscoveryOptions = z.infer<typeof LayoutDiscoveryOptionsSchema>;
|
|
210
|
+
export type RouteInfo = z.infer<typeof RouteInfoSchema>;
|
|
211
|
+
export type LayoutRule = z.infer<typeof LayoutRuleSchema>;
|
|
212
|
+
export type LayoutConfig = z.infer<typeof LayoutConfigSchema>;
|
|
213
|
+
export type IslandState = z.infer<typeof IslandStateSchema>;
|
|
214
|
+
export type PersistentIslandProps = z.infer<typeof PersistentIslandPropsSchema>;
|
|
215
|
+
export type PersistentIslandContext = z.infer<typeof PersistentIslandContextSchema>;
|
|
216
|
+
export type LayoutErrorInfo = z.infer<typeof LayoutErrorInfoSchema>;
|
|
217
|
+
export type LayoutErrorBoundaryProps = z.infer<typeof LayoutErrorBoundaryPropsSchema>;
|
|
218
|
+
export type ErrorRecoveryStrategy = z.infer<typeof ErrorRecoveryStrategySchema>;
|
|
219
|
+
export type StreamingLayoutProps = z.infer<typeof StreamingLayoutPropsSchema>;
|
|
220
|
+
export type StreamingComponent = z.infer<typeof StreamingComponentSchema>;
|
|
221
|
+
export type ResolvedLayout = z.infer<typeof ResolvedLayoutSchema>;
|
|
222
|
+
export type LayoutCache = z.infer<typeof LayoutCacheSchema>;
|
|
223
|
+
export type EnhancedLayoutContext = z.infer<typeof EnhancedLayoutContextSchema>;
|
|
224
|
+
|
|
225
|
+
// === Function Type Definitions ===
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Layout Loader Function Type
|
|
229
|
+
* Loads data for a specific layout component
|
|
230
|
+
*/
|
|
231
|
+
export type LayoutLoader = (ctx: LayoutContext) => Promise<LayoutData>;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Layout Matcher Function Type
|
|
235
|
+
* Determines if a layout should be applied based on route information and optional layout path
|
|
236
|
+
*/
|
|
237
|
+
export type LayoutMatcherFunction = (route: RouteInfo, layoutPath?: string) => boolean;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Layout Error Handler Function Type
|
|
241
|
+
* Handles errors that occur during layout processing
|
|
242
|
+
*/
|
|
243
|
+
export type LayoutErrorHandler = (error: Error, errorInfo: LayoutErrorInfo) => void;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Layout Retry Function Type
|
|
247
|
+
* Function to retry failed layout operations
|
|
248
|
+
*/
|
|
249
|
+
export type LayoutRetryFunction = () => void;
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Layout Fallback Renderer Function Type
|
|
253
|
+
* Renders fallback UI when layout errors occur
|
|
254
|
+
*/
|
|
255
|
+
export type LayoutFallbackRenderer = (error: Error, retry: LayoutRetryFunction) => ComponentChildren;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Island State Saver Function Type
|
|
259
|
+
* Saves island state to persistence layer
|
|
260
|
+
*/
|
|
261
|
+
export type IslandStateSaver = (state: IslandState) => void;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Island State Loader Function Type
|
|
265
|
+
* Loads island state from persistence layer
|
|
266
|
+
*/
|
|
267
|
+
export type IslandStateLoader = () => IslandState | null;
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Island State Clearer Function Type
|
|
271
|
+
* Clears island state from persistence layer
|
|
272
|
+
*/
|
|
273
|
+
export type IslandStateClearer = () => void;
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Streaming Component Ready Check Function Type
|
|
277
|
+
* Checks if a streaming component is ready to render
|
|
278
|
+
*/
|
|
279
|
+
export type StreamingReadyCheck = () => Promise<boolean>;
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
// Re-export all routing schemas and types
|
|
2
|
-
export * from '../routing.ts';
|
|
3
|
-
|
|
4
|
-
// Export specific validators for routing
|
|
5
|
-
import {
|
|
6
|
-
FileSystemRouteSchema,
|
|
7
|
-
RoutePageModuleSchema,
|
|
8
|
-
RouteDiscoveryOptionsSchema,
|
|
9
|
-
FileSystemRouterConfigSchema,
|
|
10
|
-
MetadataSchema,
|
|
11
|
-
ResolvedMetadataSchema,
|
|
12
|
-
} from '../routing.ts';
|
|
13
|
-
|
|
14
|
-
import { validate, safeValidate } from '../index.ts';
|
|
15
|
-
|
|
16
|
-
// Routing-specific validators
|
|
17
|
-
export const routingValidators = {
|
|
18
|
-
fileSystemRoute: (data: unknown) => validate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
19
|
-
routePageModule: (data: unknown) => validate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
20
|
-
routeDiscoveryOptions: (data: unknown) =>
|
|
21
|
-
validate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
22
|
-
fileSystemRouterConfig: (data: unknown) =>
|
|
23
|
-
validate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
24
|
-
metadata: (data: unknown) => validate(MetadataSchema, data, 'Invalid metadata'),
|
|
25
|
-
resolvedMetadata: (data: unknown) => validate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
26
|
-
} as const;
|
|
27
|
-
|
|
28
|
-
// Safe routing validators
|
|
29
|
-
export const safeRoutingValidators = {
|
|
30
|
-
fileSystemRoute: (data: unknown) => safeValidate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
31
|
-
routePageModule: (data: unknown) => safeValidate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
32
|
-
routeDiscoveryOptions: (data: unknown) =>
|
|
33
|
-
safeValidate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
34
|
-
fileSystemRouterConfig: (data: unknown) =>
|
|
35
|
-
safeValidate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
36
|
-
metadata: (data: unknown) => safeValidate(MetadataSchema, data, 'Invalid metadata'),
|
|
37
|
-
resolvedMetadata: (data: unknown) => safeValidate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
38
|
-
} as const;
|
|
1
|
+
// Re-export all routing schemas and types
|
|
2
|
+
export * from '../routing.ts';
|
|
3
|
+
|
|
4
|
+
// Export specific validators for routing
|
|
5
|
+
import {
|
|
6
|
+
FileSystemRouteSchema,
|
|
7
|
+
RoutePageModuleSchema,
|
|
8
|
+
RouteDiscoveryOptionsSchema,
|
|
9
|
+
FileSystemRouterConfigSchema,
|
|
10
|
+
MetadataSchema,
|
|
11
|
+
ResolvedMetadataSchema,
|
|
12
|
+
} from '../routing.ts';
|
|
13
|
+
|
|
14
|
+
import { validate, safeValidate } from '../index.ts';
|
|
15
|
+
|
|
16
|
+
// Routing-specific validators
|
|
17
|
+
export const routingValidators = {
|
|
18
|
+
fileSystemRoute: (data: unknown) => validate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
19
|
+
routePageModule: (data: unknown) => validate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
20
|
+
routeDiscoveryOptions: (data: unknown) =>
|
|
21
|
+
validate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
22
|
+
fileSystemRouterConfig: (data: unknown) =>
|
|
23
|
+
validate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
24
|
+
metadata: (data: unknown) => validate(MetadataSchema, data, 'Invalid metadata'),
|
|
25
|
+
resolvedMetadata: (data: unknown) => validate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
// Safe routing validators
|
|
29
|
+
export const safeRoutingValidators = {
|
|
30
|
+
fileSystemRoute: (data: unknown) => safeValidate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
31
|
+
routePageModule: (data: unknown) => safeValidate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
32
|
+
routeDiscoveryOptions: (data: unknown) =>
|
|
33
|
+
safeValidate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
34
|
+
fileSystemRouterConfig: (data: unknown) =>
|
|
35
|
+
safeValidate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
36
|
+
metadata: (data: unknown) => safeValidate(MetadataSchema, data, 'Invalid metadata'),
|
|
37
|
+
resolvedMetadata: (data: unknown) => safeValidate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
38
|
+
} as const;
|