@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/api.ts
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Supported HTTP methods for API routes
|
|
5
|
-
*/
|
|
6
|
-
export const ApiMethodSchema = z.enum([
|
|
7
|
-
'GET',
|
|
8
|
-
'POST',
|
|
9
|
-
'PUT',
|
|
10
|
-
'DELETE',
|
|
11
|
-
'PATCH',
|
|
12
|
-
'HEAD',
|
|
13
|
-
'OPTIONS',
|
|
14
|
-
]);
|
|
15
|
-
|
|
16
|
-
export type ApiMethod = z.infer<typeof ApiMethodSchema>;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Discovered API route with metadata
|
|
20
|
-
*/
|
|
21
|
-
export interface ApiRoute {
|
|
22
|
-
/** URL pattern for matching requests */
|
|
23
|
-
pattern: URLPattern;
|
|
24
|
-
/** Route configuration with handlers */
|
|
25
|
-
config: unknown;
|
|
26
|
-
/** Original file path relative to src/api */
|
|
27
|
-
filePath: string;
|
|
28
|
-
/** Extracted dynamic parameter names */
|
|
29
|
-
paramNames: string[];
|
|
30
|
-
}
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Supported HTTP methods for API routes
|
|
5
|
+
*/
|
|
6
|
+
export const ApiMethodSchema = z.enum([
|
|
7
|
+
'GET',
|
|
8
|
+
'POST',
|
|
9
|
+
'PUT',
|
|
10
|
+
'DELETE',
|
|
11
|
+
'PATCH',
|
|
12
|
+
'HEAD',
|
|
13
|
+
'OPTIONS',
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
export type ApiMethod = z.infer<typeof ApiMethodSchema>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Discovered API route with metadata
|
|
20
|
+
*/
|
|
21
|
+
export interface ApiRoute {
|
|
22
|
+
/** URL pattern for matching requests */
|
|
23
|
+
pattern: URLPattern;
|
|
24
|
+
/** Route configuration with handlers */
|
|
25
|
+
config: unknown;
|
|
26
|
+
/** Original file path relative to src/api */
|
|
27
|
+
filePath: string;
|
|
28
|
+
/** Extracted dynamic parameter names */
|
|
29
|
+
paramNames: string[];
|
|
30
|
+
}
|
package/src/schemas/core.ts
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Schema for meta tags
|
|
5
|
-
*/
|
|
6
|
-
export const MetaTagSchema = z.object({
|
|
7
|
-
name: z.string().min(1),
|
|
8
|
-
content: z.string(),
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Script configuration schema - supports both simple URLs and complex script objects
|
|
13
|
-
*/
|
|
14
|
-
export const ScriptConfigSchema = z.union([
|
|
15
|
-
// Simple string URL (backward compatible)
|
|
16
|
-
z.string().min(1),
|
|
17
|
-
// Complex script object with attributes
|
|
18
|
-
z
|
|
19
|
-
.object({
|
|
20
|
-
src: z.string().min(1).optional(),
|
|
21
|
-
content: z.string().optional(), // For inline scripts
|
|
22
|
-
data: z.union([z.record(z.string(), z.unknown()), z.array(z.unknown()), z.string()]).optional(), // For structured data (JSON-LD)
|
|
23
|
-
type: z.string().optional(),
|
|
24
|
-
async: z.boolean().optional(),
|
|
25
|
-
defer: z.boolean().optional(),
|
|
26
|
-
crossorigin: z.enum(['anonymous', 'use-credentials']).optional(),
|
|
27
|
-
integrity: z.string().optional(),
|
|
28
|
-
nomodule: z.boolean().optional(),
|
|
29
|
-
referrerpolicy: z
|
|
30
|
-
.enum([
|
|
31
|
-
'no-referrer',
|
|
32
|
-
'no-referrer-when-downgrade',
|
|
33
|
-
'origin',
|
|
34
|
-
'origin-when-cross-origin',
|
|
35
|
-
'same-origin',
|
|
36
|
-
'strict-origin',
|
|
37
|
-
'strict-origin-when-cross-origin',
|
|
38
|
-
'unsafe-url',
|
|
39
|
-
])
|
|
40
|
-
.optional(),
|
|
41
|
-
// Allow custom attributes
|
|
42
|
-
attributes: z.record(z.string(), z.string()).optional(),
|
|
43
|
-
})
|
|
44
|
-
.refine(data => data.src || data.content || data.data, {
|
|
45
|
-
message: "Script must have either 'src', 'content', or 'data'",
|
|
46
|
-
}),
|
|
47
|
-
]);
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Simplified render options for Vite-powered architecture
|
|
51
|
-
*/
|
|
52
|
-
export const RenderOptionsSchema = z.object({
|
|
53
|
-
title: z.string().optional(),
|
|
54
|
-
scripts: z.array(ScriptConfigSchema).optional(),
|
|
55
|
-
styles: z.array(z.string().min(1)).optional(),
|
|
56
|
-
meta: z.array(MetaTagSchema).optional(),
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// === Simplified TypeScript types ===
|
|
61
|
-
|
|
62
|
-
export type MetaTag = z.infer<typeof MetaTagSchema>;
|
|
63
|
-
export type ScriptConfig = z.infer<typeof ScriptConfigSchema>;
|
|
64
|
-
export type RenderOptions = z.infer<typeof RenderOptionsSchema>;
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Schema for meta tags
|
|
5
|
+
*/
|
|
6
|
+
export const MetaTagSchema = z.object({
|
|
7
|
+
name: z.string().min(1),
|
|
8
|
+
content: z.string(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Script configuration schema - supports both simple URLs and complex script objects
|
|
13
|
+
*/
|
|
14
|
+
export const ScriptConfigSchema = z.union([
|
|
15
|
+
// Simple string URL (backward compatible)
|
|
16
|
+
z.string().min(1),
|
|
17
|
+
// Complex script object with attributes
|
|
18
|
+
z
|
|
19
|
+
.object({
|
|
20
|
+
src: z.string().min(1).optional(),
|
|
21
|
+
content: z.string().optional(), // For inline scripts
|
|
22
|
+
data: z.union([z.record(z.string(), z.unknown()), z.array(z.unknown()), z.string()]).optional(), // For structured data (JSON-LD)
|
|
23
|
+
type: z.string().optional(),
|
|
24
|
+
async: z.boolean().optional(),
|
|
25
|
+
defer: z.boolean().optional(),
|
|
26
|
+
crossorigin: z.enum(['anonymous', 'use-credentials']).optional(),
|
|
27
|
+
integrity: z.string().optional(),
|
|
28
|
+
nomodule: z.boolean().optional(),
|
|
29
|
+
referrerpolicy: z
|
|
30
|
+
.enum([
|
|
31
|
+
'no-referrer',
|
|
32
|
+
'no-referrer-when-downgrade',
|
|
33
|
+
'origin',
|
|
34
|
+
'origin-when-cross-origin',
|
|
35
|
+
'same-origin',
|
|
36
|
+
'strict-origin',
|
|
37
|
+
'strict-origin-when-cross-origin',
|
|
38
|
+
'unsafe-url',
|
|
39
|
+
])
|
|
40
|
+
.optional(),
|
|
41
|
+
// Allow custom attributes
|
|
42
|
+
attributes: z.record(z.string(), z.string()).optional(),
|
|
43
|
+
})
|
|
44
|
+
.refine(data => data.src || data.content || data.data, {
|
|
45
|
+
message: "Script must have either 'src', 'content', or 'data'",
|
|
46
|
+
}),
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Simplified render options for Vite-powered architecture
|
|
51
|
+
*/
|
|
52
|
+
export const RenderOptionsSchema = z.object({
|
|
53
|
+
title: z.string().optional(),
|
|
54
|
+
scripts: z.array(ScriptConfigSchema).optional(),
|
|
55
|
+
styles: z.array(z.string().min(1)).optional(),
|
|
56
|
+
meta: z.array(MetaTagSchema).optional(),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
// === Simplified TypeScript types ===
|
|
61
|
+
|
|
62
|
+
export type MetaTag = z.infer<typeof MetaTagSchema>;
|
|
63
|
+
export type ScriptConfig = z.infer<typeof ScriptConfigSchema>;
|
|
64
|
+
export type RenderOptions = z.infer<typeof RenderOptionsSchema>;
|
package/src/schemas/index.ts
CHANGED
|
@@ -1,212 +1,212 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { RenderOptionsSchema } from './core.ts';
|
|
3
|
-
import {
|
|
4
|
-
LayoutContextSchema,
|
|
5
|
-
LayoutDataSchema,
|
|
6
|
-
LayoutHandlerSchema,
|
|
7
|
-
LayoutDiscoveryOptionsSchema as LayoutDiscoverySchema,
|
|
8
|
-
LayoutConfigSchema,
|
|
9
|
-
ResolvedLayoutSchema,
|
|
10
|
-
} from './layout.ts';
|
|
11
|
-
import {
|
|
12
|
-
FileSystemRouteSchema,
|
|
13
|
-
RoutePageModuleSchema,
|
|
14
|
-
RouteDiscoveryOptionsSchema,
|
|
15
|
-
FileSystemRouterConfigSchema,
|
|
16
|
-
MetadataSchema,
|
|
17
|
-
ResolvedMetadataSchema,
|
|
18
|
-
} from './routing.ts';
|
|
19
|
-
import type { RenderOptions } from './core.ts';
|
|
20
|
-
import type {
|
|
21
|
-
LayoutContext,
|
|
22
|
-
LayoutData,
|
|
23
|
-
LayoutHandler,
|
|
24
|
-
LayoutDiscoveryOptions,
|
|
25
|
-
LayoutConfig,
|
|
26
|
-
ResolvedLayout,
|
|
27
|
-
} from './layout.ts';
|
|
28
|
-
import type {
|
|
29
|
-
FileSystemRoute,
|
|
30
|
-
RoutePageModule,
|
|
31
|
-
RouteDiscoveryOptions,
|
|
32
|
-
FileSystemRouterConfig,
|
|
33
|
-
Metadata,
|
|
34
|
-
ResolvedMetadata,
|
|
35
|
-
} from './routing.ts';
|
|
36
|
-
|
|
37
|
-
export * from './core.ts';
|
|
38
|
-
export * from './api.ts';
|
|
39
|
-
export * from './layout.ts';
|
|
40
|
-
export * from './routing.ts';
|
|
41
|
-
|
|
42
|
-
export interface ValidationSuccess<T> {
|
|
43
|
-
success: true;
|
|
44
|
-
data: T;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface ValidationFailure {
|
|
48
|
-
success: false;
|
|
49
|
-
error: ValidationError;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;
|
|
53
|
-
|
|
54
|
-
export class ValidationError extends Error {
|
|
55
|
-
constructor(message: string, public readonly zodError: z.ZodError) {
|
|
56
|
-
super(message);
|
|
57
|
-
this.name = 'ValidationError';
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
getFormattedErrors(): string[] {
|
|
61
|
-
return this.zodError.issues.map((issue): string => {
|
|
62
|
-
const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
|
|
63
|
-
return `${path}${issue.message}`;
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
getErrorMessage(): string {
|
|
68
|
-
return this.getFormattedErrors().join('; ');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function createValidationError(message: string, zodError: z.ZodError): ValidationError {
|
|
73
|
-
return new ValidationError(message, zodError);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function safeValidate<TOutput>(
|
|
77
|
-
schema: z.ZodType<TOutput>,
|
|
78
|
-
data: unknown,
|
|
79
|
-
errorMessage = 'Validation failed'
|
|
80
|
-
): ValidationResult<TOutput> {
|
|
81
|
-
const result = schema.safeParse(data);
|
|
82
|
-
if (result.success) {
|
|
83
|
-
return { success: true, data: result.data };
|
|
84
|
-
}
|
|
85
|
-
return { success: false, error: createValidationError(errorMessage, result.error) };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function validate<TOutput>(
|
|
89
|
-
schema: z.ZodType<TOutput>,
|
|
90
|
-
data: unknown,
|
|
91
|
-
errorMessage = 'Validation failed'
|
|
92
|
-
): TOutput {
|
|
93
|
-
const result = schema.safeParse(data);
|
|
94
|
-
if (result.success) {
|
|
95
|
-
return result.data;
|
|
96
|
-
}
|
|
97
|
-
throw createValidationError(errorMessage, result.error);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export const validators = {
|
|
101
|
-
renderOptions: (data: unknown): RenderOptions => validate(RenderOptionsSchema, data, 'Invalid render options'),
|
|
102
|
-
layoutContext: (data: unknown): LayoutContext => validate(LayoutContextSchema, data, 'Invalid layout context'),
|
|
103
|
-
layoutData: (data: unknown): LayoutData => validate(LayoutDataSchema, data, 'Invalid layout data'),
|
|
104
|
-
layoutHandler: (data: unknown): LayoutHandler => validate(LayoutHandlerSchema, data, 'Invalid layout handler'),
|
|
105
|
-
layoutDiscoveryOptions: (data: unknown): LayoutDiscoveryOptions => validate(LayoutDiscoverySchema, data, 'Invalid layout discovery options'),
|
|
106
|
-
layoutConfig: (data: unknown): LayoutConfig => validate(LayoutConfigSchema, data, 'Invalid layout config'),
|
|
107
|
-
resolvedLayout: (data: unknown): ResolvedLayout => validate(ResolvedLayoutSchema, data, 'Invalid resolved layout'),
|
|
108
|
-
fileSystemRoute: (data: unknown): FileSystemRoute => validate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
109
|
-
routePageModule: (data: unknown): RoutePageModule => validate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
110
|
-
routeDiscoveryOptions: (data: unknown): RouteDiscoveryOptions => validate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
111
|
-
fileSystemRouterConfig: (data: unknown): FileSystemRouterConfig => validate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
112
|
-
metadata: (data: unknown): Metadata => validate(MetadataSchema, data, 'Invalid metadata'),
|
|
113
|
-
resolvedMetadata: (data: unknown): ResolvedMetadata => validate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
114
|
-
} as const;
|
|
115
|
-
|
|
116
|
-
export const safeValidators = {
|
|
117
|
-
renderOptions: (data: unknown): ValidationResult<RenderOptions> => safeValidate(RenderOptionsSchema, data, 'Invalid render options'),
|
|
118
|
-
layoutContext: (data: unknown): ValidationResult<LayoutContext> => safeValidate(LayoutContextSchema, data, 'Invalid layout context'),
|
|
119
|
-
layoutData: (data: unknown): ValidationResult<LayoutData> => safeValidate(LayoutDataSchema, data, 'Invalid layout data'),
|
|
120
|
-
layoutHandler: (data: unknown): ValidationResult<LayoutHandler> => safeValidate(LayoutHandlerSchema, data, 'Invalid layout handler'),
|
|
121
|
-
layoutDiscoveryOptions: (data: unknown): ValidationResult<LayoutDiscoveryOptions> => safeValidate(LayoutDiscoverySchema, data, 'Invalid layout discovery options'),
|
|
122
|
-
layoutConfig: (data: unknown): ValidationResult<LayoutConfig> => safeValidate(LayoutConfigSchema, data, 'Invalid layout config'),
|
|
123
|
-
resolvedLayout: (data: unknown): ValidationResult<ResolvedLayout> => safeValidate(ResolvedLayoutSchema, data, 'Invalid resolved layout'),
|
|
124
|
-
fileSystemRoute: (data: unknown): ValidationResult<FileSystemRoute> => safeValidate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
125
|
-
routePageModule: (data: unknown): ValidationResult<RoutePageModule> => safeValidate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
126
|
-
routeDiscoveryOptions: (data: unknown): ValidationResult<RouteDiscoveryOptions> => safeValidate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
127
|
-
fileSystemRouterConfig: (data: unknown): ValidationResult<FileSystemRouterConfig> => safeValidate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
128
|
-
metadata: (data: unknown): ValidationResult<Metadata> => safeValidate(MetadataSchema, data, 'Invalid metadata'),
|
|
129
|
-
resolvedMetadata: (data: unknown): ValidationResult<ResolvedMetadata> => safeValidate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
130
|
-
} as const;
|
|
131
|
-
|
|
132
|
-
export const devValidators = {
|
|
133
|
-
renderOptionsSoft: (data: unknown, context = 'unknown'): boolean => {
|
|
134
|
-
const result = safeValidators.renderOptions(data);
|
|
135
|
-
if (!result.success) {
|
|
136
|
-
console.warn(`Render options validation warning in ${context}:`, result.error.getErrorMessage());
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
return true;
|
|
140
|
-
},
|
|
141
|
-
} as const;
|
|
142
|
-
|
|
143
|
-
export function isValidRenderOptions(data: unknown): data is RenderOptions {
|
|
144
|
-
return safeValidators.renderOptions(data).success;
|
|
145
|
-
}
|
|
146
|
-
export function isValidFileSystemRoute(data: unknown): data is FileSystemRoute {
|
|
147
|
-
return safeValidators.fileSystemRoute(data).success;
|
|
148
|
-
}
|
|
149
|
-
export function isValidRoutePageModule(data: unknown): data is RoutePageModule {
|
|
150
|
-
return safeValidators.routePageModule(data).success;
|
|
151
|
-
}
|
|
152
|
-
export function isValidRouteDiscoveryOptions(data: unknown): data is RouteDiscoveryOptions {
|
|
153
|
-
return safeValidators.routeDiscoveryOptions(data).success;
|
|
154
|
-
}
|
|
155
|
-
export function isValidFileSystemRouterConfig(data: unknown): data is FileSystemRouterConfig {
|
|
156
|
-
return safeValidators.fileSystemRouterConfig(data).success;
|
|
157
|
-
}
|
|
158
|
-
export function isValidMetadata(data: unknown): data is Metadata {
|
|
159
|
-
return safeValidators.metadata(data).success;
|
|
160
|
-
}
|
|
161
|
-
export function isValidResolvedMetadata(data: unknown): data is ResolvedMetadata {
|
|
162
|
-
return safeValidators.resolvedMetadata(data).success;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export function validateBatch<T extends Record<string, unknown>>(
|
|
166
|
-
schemas: { [K in keyof T]: z.ZodType<T[K]> },
|
|
167
|
-
data: { [K in keyof T]: unknown }
|
|
168
|
-
): T {
|
|
169
|
-
const result: Partial<T> = {};
|
|
170
|
-
const errors: string[] = [];
|
|
171
|
-
|
|
172
|
-
for (const [key, schema] of Object.entries(schemas) as Array<[keyof T, z.ZodType<T[keyof T]>]>) {
|
|
173
|
-
try {
|
|
174
|
-
result[key] = validate(schema, data[key], `Invalid ${String(key)}`);
|
|
175
|
-
} catch (error) {
|
|
176
|
-
if (error instanceof ValidationError) {
|
|
177
|
-
errors.push(`${String(key)}: ${error.getErrorMessage()}`);
|
|
178
|
-
} else {
|
|
179
|
-
errors.push(`${String(key)}: Unknown validation error`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (errors.length > 0) {
|
|
185
|
-
throw new Error(`Batch validation failed: ${errors.join('; ')}`);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return result as T;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function safeValidateBatch<T extends Record<string, unknown>>(
|
|
192
|
-
schemas: { [K in keyof T]: z.ZodType<T[K]> },
|
|
193
|
-
data: { [K in keyof T]: unknown }
|
|
194
|
-
): ValidationResult<T> {
|
|
195
|
-
try {
|
|
196
|
-
const result = validateBatch(schemas, data);
|
|
197
|
-
return { success: true, data: result };
|
|
198
|
-
} catch (error) {
|
|
199
|
-
const validationError =
|
|
200
|
-
error instanceof ValidationError
|
|
201
|
-
? error
|
|
202
|
-
: createValidationError(
|
|
203
|
-
'Batch validation failed',
|
|
204
|
-
new z.ZodError([{ code: 'custom', message: String(error), path: [] }])
|
|
205
|
-
);
|
|
206
|
-
return { success: false, error: validationError };
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export type ExtractValidationData<T> = T extends ValidationResult<infer U> ? U : never;
|
|
211
|
-
export type ExtractSchemaInput<T> = T extends z.ZodType<infer U> ? U : never;
|
|
212
|
-
export type ExtractSchemaOutput<T> = T extends z.ZodType<infer U> ? U : never;
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RenderOptionsSchema } from './core.ts';
|
|
3
|
+
import {
|
|
4
|
+
LayoutContextSchema,
|
|
5
|
+
LayoutDataSchema,
|
|
6
|
+
LayoutHandlerSchema,
|
|
7
|
+
LayoutDiscoveryOptionsSchema as LayoutDiscoverySchema,
|
|
8
|
+
LayoutConfigSchema,
|
|
9
|
+
ResolvedLayoutSchema,
|
|
10
|
+
} from './layout.ts';
|
|
11
|
+
import {
|
|
12
|
+
FileSystemRouteSchema,
|
|
13
|
+
RoutePageModuleSchema,
|
|
14
|
+
RouteDiscoveryOptionsSchema,
|
|
15
|
+
FileSystemRouterConfigSchema,
|
|
16
|
+
MetadataSchema,
|
|
17
|
+
ResolvedMetadataSchema,
|
|
18
|
+
} from './routing.ts';
|
|
19
|
+
import type { RenderOptions } from './core.ts';
|
|
20
|
+
import type {
|
|
21
|
+
LayoutContext,
|
|
22
|
+
LayoutData,
|
|
23
|
+
LayoutHandler,
|
|
24
|
+
LayoutDiscoveryOptions,
|
|
25
|
+
LayoutConfig,
|
|
26
|
+
ResolvedLayout,
|
|
27
|
+
} from './layout.ts';
|
|
28
|
+
import type {
|
|
29
|
+
FileSystemRoute,
|
|
30
|
+
RoutePageModule,
|
|
31
|
+
RouteDiscoveryOptions,
|
|
32
|
+
FileSystemRouterConfig,
|
|
33
|
+
Metadata,
|
|
34
|
+
ResolvedMetadata,
|
|
35
|
+
} from './routing.ts';
|
|
36
|
+
|
|
37
|
+
export * from './core.ts';
|
|
38
|
+
export * from './api.ts';
|
|
39
|
+
export * from './layout.ts';
|
|
40
|
+
export * from './routing.ts';
|
|
41
|
+
|
|
42
|
+
export interface ValidationSuccess<T> {
|
|
43
|
+
success: true;
|
|
44
|
+
data: T;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ValidationFailure {
|
|
48
|
+
success: false;
|
|
49
|
+
error: ValidationError;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;
|
|
53
|
+
|
|
54
|
+
export class ValidationError extends Error {
|
|
55
|
+
constructor(message: string, public readonly zodError: z.ZodError) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.name = 'ValidationError';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getFormattedErrors(): string[] {
|
|
61
|
+
return this.zodError.issues.map((issue): string => {
|
|
62
|
+
const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
|
|
63
|
+
return `${path}${issue.message}`;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getErrorMessage(): string {
|
|
68
|
+
return this.getFormattedErrors().join('; ');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function createValidationError(message: string, zodError: z.ZodError): ValidationError {
|
|
73
|
+
return new ValidationError(message, zodError);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function safeValidate<TOutput>(
|
|
77
|
+
schema: z.ZodType<TOutput>,
|
|
78
|
+
data: unknown,
|
|
79
|
+
errorMessage = 'Validation failed'
|
|
80
|
+
): ValidationResult<TOutput> {
|
|
81
|
+
const result = schema.safeParse(data);
|
|
82
|
+
if (result.success) {
|
|
83
|
+
return { success: true, data: result.data };
|
|
84
|
+
}
|
|
85
|
+
return { success: false, error: createValidationError(errorMessage, result.error) };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function validate<TOutput>(
|
|
89
|
+
schema: z.ZodType<TOutput>,
|
|
90
|
+
data: unknown,
|
|
91
|
+
errorMessage = 'Validation failed'
|
|
92
|
+
): TOutput {
|
|
93
|
+
const result = schema.safeParse(data);
|
|
94
|
+
if (result.success) {
|
|
95
|
+
return result.data;
|
|
96
|
+
}
|
|
97
|
+
throw createValidationError(errorMessage, result.error);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const validators = {
|
|
101
|
+
renderOptions: (data: unknown): RenderOptions => validate(RenderOptionsSchema, data, 'Invalid render options'),
|
|
102
|
+
layoutContext: (data: unknown): LayoutContext => validate(LayoutContextSchema, data, 'Invalid layout context'),
|
|
103
|
+
layoutData: (data: unknown): LayoutData => validate(LayoutDataSchema, data, 'Invalid layout data'),
|
|
104
|
+
layoutHandler: (data: unknown): LayoutHandler => validate(LayoutHandlerSchema, data, 'Invalid layout handler'),
|
|
105
|
+
layoutDiscoveryOptions: (data: unknown): LayoutDiscoveryOptions => validate(LayoutDiscoverySchema, data, 'Invalid layout discovery options'),
|
|
106
|
+
layoutConfig: (data: unknown): LayoutConfig => validate(LayoutConfigSchema, data, 'Invalid layout config'),
|
|
107
|
+
resolvedLayout: (data: unknown): ResolvedLayout => validate(ResolvedLayoutSchema, data, 'Invalid resolved layout'),
|
|
108
|
+
fileSystemRoute: (data: unknown): FileSystemRoute => validate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
109
|
+
routePageModule: (data: unknown): RoutePageModule => validate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
110
|
+
routeDiscoveryOptions: (data: unknown): RouteDiscoveryOptions => validate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
111
|
+
fileSystemRouterConfig: (data: unknown): FileSystemRouterConfig => validate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
112
|
+
metadata: (data: unknown): Metadata => validate(MetadataSchema, data, 'Invalid metadata'),
|
|
113
|
+
resolvedMetadata: (data: unknown): ResolvedMetadata => validate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
114
|
+
} as const;
|
|
115
|
+
|
|
116
|
+
export const safeValidators = {
|
|
117
|
+
renderOptions: (data: unknown): ValidationResult<RenderOptions> => safeValidate(RenderOptionsSchema, data, 'Invalid render options'),
|
|
118
|
+
layoutContext: (data: unknown): ValidationResult<LayoutContext> => safeValidate(LayoutContextSchema, data, 'Invalid layout context'),
|
|
119
|
+
layoutData: (data: unknown): ValidationResult<LayoutData> => safeValidate(LayoutDataSchema, data, 'Invalid layout data'),
|
|
120
|
+
layoutHandler: (data: unknown): ValidationResult<LayoutHandler> => safeValidate(LayoutHandlerSchema, data, 'Invalid layout handler'),
|
|
121
|
+
layoutDiscoveryOptions: (data: unknown): ValidationResult<LayoutDiscoveryOptions> => safeValidate(LayoutDiscoverySchema, data, 'Invalid layout discovery options'),
|
|
122
|
+
layoutConfig: (data: unknown): ValidationResult<LayoutConfig> => safeValidate(LayoutConfigSchema, data, 'Invalid layout config'),
|
|
123
|
+
resolvedLayout: (data: unknown): ValidationResult<ResolvedLayout> => safeValidate(ResolvedLayoutSchema, data, 'Invalid resolved layout'),
|
|
124
|
+
fileSystemRoute: (data: unknown): ValidationResult<FileSystemRoute> => safeValidate(FileSystemRouteSchema, data, 'Invalid file system route'),
|
|
125
|
+
routePageModule: (data: unknown): ValidationResult<RoutePageModule> => safeValidate(RoutePageModuleSchema, data, 'Invalid route page module'),
|
|
126
|
+
routeDiscoveryOptions: (data: unknown): ValidationResult<RouteDiscoveryOptions> => safeValidate(RouteDiscoveryOptionsSchema, data, 'Invalid route discovery options'),
|
|
127
|
+
fileSystemRouterConfig: (data: unknown): ValidationResult<FileSystemRouterConfig> => safeValidate(FileSystemRouterConfigSchema, data, 'Invalid file system router config'),
|
|
128
|
+
metadata: (data: unknown): ValidationResult<Metadata> => safeValidate(MetadataSchema, data, 'Invalid metadata'),
|
|
129
|
+
resolvedMetadata: (data: unknown): ValidationResult<ResolvedMetadata> => safeValidate(ResolvedMetadataSchema, data, 'Invalid resolved metadata'),
|
|
130
|
+
} as const;
|
|
131
|
+
|
|
132
|
+
export const devValidators = {
|
|
133
|
+
renderOptionsSoft: (data: unknown, context = 'unknown'): boolean => {
|
|
134
|
+
const result = safeValidators.renderOptions(data);
|
|
135
|
+
if (!result.success) {
|
|
136
|
+
console.warn(`Render options validation warning in ${context}:`, result.error.getErrorMessage());
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
},
|
|
141
|
+
} as const;
|
|
142
|
+
|
|
143
|
+
export function isValidRenderOptions(data: unknown): data is RenderOptions {
|
|
144
|
+
return safeValidators.renderOptions(data).success;
|
|
145
|
+
}
|
|
146
|
+
export function isValidFileSystemRoute(data: unknown): data is FileSystemRoute {
|
|
147
|
+
return safeValidators.fileSystemRoute(data).success;
|
|
148
|
+
}
|
|
149
|
+
export function isValidRoutePageModule(data: unknown): data is RoutePageModule {
|
|
150
|
+
return safeValidators.routePageModule(data).success;
|
|
151
|
+
}
|
|
152
|
+
export function isValidRouteDiscoveryOptions(data: unknown): data is RouteDiscoveryOptions {
|
|
153
|
+
return safeValidators.routeDiscoveryOptions(data).success;
|
|
154
|
+
}
|
|
155
|
+
export function isValidFileSystemRouterConfig(data: unknown): data is FileSystemRouterConfig {
|
|
156
|
+
return safeValidators.fileSystemRouterConfig(data).success;
|
|
157
|
+
}
|
|
158
|
+
export function isValidMetadata(data: unknown): data is Metadata {
|
|
159
|
+
return safeValidators.metadata(data).success;
|
|
160
|
+
}
|
|
161
|
+
export function isValidResolvedMetadata(data: unknown): data is ResolvedMetadata {
|
|
162
|
+
return safeValidators.resolvedMetadata(data).success;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function validateBatch<T extends Record<string, unknown>>(
|
|
166
|
+
schemas: { [K in keyof T]: z.ZodType<T[K]> },
|
|
167
|
+
data: { [K in keyof T]: unknown }
|
|
168
|
+
): T {
|
|
169
|
+
const result: Partial<T> = {};
|
|
170
|
+
const errors: string[] = [];
|
|
171
|
+
|
|
172
|
+
for (const [key, schema] of Object.entries(schemas) as Array<[keyof T, z.ZodType<T[keyof T]>]>) {
|
|
173
|
+
try {
|
|
174
|
+
result[key] = validate(schema, data[key], `Invalid ${String(key)}`);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
if (error instanceof ValidationError) {
|
|
177
|
+
errors.push(`${String(key)}: ${error.getErrorMessage()}`);
|
|
178
|
+
} else {
|
|
179
|
+
errors.push(`${String(key)}: Unknown validation error`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (errors.length > 0) {
|
|
185
|
+
throw new Error(`Batch validation failed: ${errors.join('; ')}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return result as T;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function safeValidateBatch<T extends Record<string, unknown>>(
|
|
192
|
+
schemas: { [K in keyof T]: z.ZodType<T[K]> },
|
|
193
|
+
data: { [K in keyof T]: unknown }
|
|
194
|
+
): ValidationResult<T> {
|
|
195
|
+
try {
|
|
196
|
+
const result = validateBatch(schemas, data);
|
|
197
|
+
return { success: true, data: result };
|
|
198
|
+
} catch (error) {
|
|
199
|
+
const validationError =
|
|
200
|
+
error instanceof ValidationError
|
|
201
|
+
? error
|
|
202
|
+
: createValidationError(
|
|
203
|
+
'Batch validation failed',
|
|
204
|
+
new z.ZodError([{ code: 'custom', message: String(error), path: [] }])
|
|
205
|
+
);
|
|
206
|
+
return { success: false, error: validationError };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export type ExtractValidationData<T> = T extends ValidationResult<infer U> ? U : never;
|
|
211
|
+
export type ExtractSchemaInput<T> = T extends z.ZodType<infer U> ? U : never;
|
|
212
|
+
export type ExtractSchemaOutput<T> = T extends z.ZodType<infer U> ? U : never;
|