@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.
Files changed (141) hide show
  1. package/README.md +54 -54
  2. package/mod.ts +302 -302
  3. package/package.json +49 -26
  4. package/src/build/integration-bundler-plugin.ts +116 -116
  5. package/src/build/integration-config.ts +168 -168
  6. package/src/build/integration-detection-plugin.ts +117 -117
  7. package/src/build/integration-resolver-plugin.ts +90 -90
  8. package/src/build/island-manifest.ts +269 -269
  9. package/src/build/island-types-generator.ts +476 -476
  10. package/src/build/mdx-island-transform.ts +464 -464
  11. package/src/build/mdx-plugin.ts +98 -98
  12. package/src/build/page-island-transform.ts +598 -598
  13. package/src/build/prop-extractors/index.ts +21 -21
  14. package/src/build/prop-extractors/lit.ts +140 -140
  15. package/src/build/prop-extractors/qwik.ts +16 -16
  16. package/src/build/prop-extractors/solid.ts +125 -125
  17. package/src/build/prop-extractors/svelte.ts +194 -194
  18. package/src/build/prop-extractors/vue.ts +111 -111
  19. package/src/build/sidecar-file-manager.ts +104 -104
  20. package/src/build/sidecar-renderer.ts +30 -30
  21. package/src/client/adapters/index.ts +21 -13
  22. package/src/client/components.ts +35 -35
  23. package/src/client/css-hmr-handler.ts +344 -344
  24. package/src/client/framework-adapter.ts +462 -462
  25. package/src/client/hmr-coordinator.ts +396 -396
  26. package/src/client/hmr-error-overlay.js +533 -533
  27. package/src/client/main.js +824 -816
  28. package/src/client/types/framework-runtime.d.ts +68 -68
  29. package/src/client/types/vite-hmr.d.ts +46 -46
  30. package/src/client/types/vite-virtual-modules.d.ts +70 -60
  31. package/src/components/Image.tsx +123 -123
  32. package/src/components/IslandErrorBoundary.tsx +145 -145
  33. package/src/components/LayoutDataErrorBoundary.tsx +141 -141
  34. package/src/components/LayoutErrorBoundary.tsx +127 -127
  35. package/src/components/PersistentIsland.tsx +52 -52
  36. package/src/components/StreamingErrorBoundary.tsx +233 -233
  37. package/src/components/StreamingLayout.tsx +538 -538
  38. package/src/core/components/component-analyzer.ts +192 -192
  39. package/src/core/components/component-detection.ts +508 -508
  40. package/src/core/components/enhanced-framework-detector.ts +500 -500
  41. package/src/core/components/framework-registry.ts +563 -563
  42. package/src/core/content/mdx-processor.ts +46 -46
  43. package/src/core/integrations/index.ts +19 -19
  44. package/src/core/integrations/loader.ts +125 -125
  45. package/src/core/integrations/registry.ts +175 -175
  46. package/src/core/islands/island-persistence.ts +325 -325
  47. package/src/core/islands/island-state-serializer.ts +258 -258
  48. package/src/core/islands/persistent-island-context.tsx +80 -80
  49. package/src/core/islands/use-persistent-state.ts +68 -68
  50. package/src/core/layout/enhanced-layout-resolver.ts +322 -322
  51. package/src/core/layout/layout-cache-manager.ts +485 -485
  52. package/src/core/layout/layout-composer.ts +357 -357
  53. package/src/core/layout/layout-data-loader.ts +516 -516
  54. package/src/core/layout/layout-discovery.ts +243 -243
  55. package/src/core/layout/layout-matcher.ts +299 -299
  56. package/src/core/layout/layout-types.ts +110 -110
  57. package/src/core/modules/framework-module-resolver.ts +273 -273
  58. package/src/islands/component-analysis.ts +213 -213
  59. package/src/islands/css-utils.ts +565 -565
  60. package/src/islands/discovery/index.ts +80 -80
  61. package/src/islands/discovery/registry.ts +340 -340
  62. package/src/islands/discovery/resolver.ts +477 -477
  63. package/src/islands/discovery/scanner.ts +386 -386
  64. package/src/islands/discovery/types.ts +117 -117
  65. package/src/islands/discovery/validator.ts +544 -544
  66. package/src/islands/discovery/watcher.ts +368 -368
  67. package/src/islands/framework-detection.ts +428 -428
  68. package/src/islands/integration-loader.ts +490 -490
  69. package/src/islands/island.tsx +565 -565
  70. package/src/islands/render-cache.ts +550 -550
  71. package/src/islands/types.ts +80 -80
  72. package/src/islands/universal-css-collector.ts +157 -157
  73. package/src/islands/universal-head-collector.ts +137 -137
  74. package/src/layout-system.d.ts +592 -592
  75. package/src/layout-system.ts +218 -218
  76. package/src/middleware/discovery.ts +268 -268
  77. package/src/middleware/executor.ts +315 -315
  78. package/src/middleware/index.ts +76 -76
  79. package/src/middleware/types.ts +99 -99
  80. package/src/nitro/build-config.ts +575 -575
  81. package/src/nitro/config.ts +483 -483
  82. package/src/nitro/error-handler.ts +636 -636
  83. package/src/nitro/index.ts +173 -173
  84. package/src/nitro/island-manifest.ts +584 -584
  85. package/src/nitro/middleware-adapter.ts +260 -260
  86. package/src/nitro/renderer.ts +1471 -1471
  87. package/src/nitro/route-discovery.ts +439 -439
  88. package/src/nitro/types.ts +321 -321
  89. package/src/render/collect-css.ts +198 -198
  90. package/src/render/error-pages.ts +79 -79
  91. package/src/render/isolated-ssr-renderer.ts +654 -654
  92. package/src/render/ssr.ts +1030 -1030
  93. package/src/schemas/api.ts +30 -30
  94. package/src/schemas/core.ts +64 -64
  95. package/src/schemas/index.ts +212 -212
  96. package/src/schemas/layout.ts +279 -279
  97. package/src/schemas/routing/index.ts +38 -38
  98. package/src/schemas/routing.ts +376 -376
  99. package/src/types/as-island.ts +20 -20
  100. package/src/types/image.d.ts +106 -106
  101. package/src/types/index.d.ts +22 -22
  102. package/src/types/island-jsx.d.ts +33 -33
  103. package/src/types/island-prop.d.ts +20 -20
  104. package/src/types/layout.ts +285 -285
  105. package/src/types/mdx.d.ts +6 -6
  106. package/src/types/routing.ts +555 -555
  107. package/src/types/types.ts +5 -5
  108. package/src/types/urlpattern.d.ts +49 -49
  109. package/src/types/vite-env.d.ts +11 -11
  110. package/src/utils/dev-logger.ts +299 -299
  111. package/src/utils/fs.ts +151 -151
  112. package/src/vite-plugin/auto-discover.ts +551 -551
  113. package/src/vite-plugin/config.ts +266 -266
  114. package/src/vite-plugin/errors.ts +127 -127
  115. package/src/vite-plugin/image-optimization.ts +156 -156
  116. package/src/vite-plugin/integration-activator.ts +126 -126
  117. package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
  118. package/src/vite-plugin/module-discovery.ts +189 -189
  119. package/src/vite-plugin/nitro-integration.ts +1354 -1354
  120. package/src/vite-plugin/plugin.ts +403 -409
  121. package/src/vite-plugin/types.ts +327 -327
  122. package/src/vite-plugin/validation.ts +228 -228
  123. package/src/client/adapters/index.js +0 -12
  124. package/src/client/adapters/lit-adapter.js +0 -467
  125. package/src/client/adapters/lit-adapter.ts +0 -654
  126. package/src/client/adapters/preact-adapter.js +0 -223
  127. package/src/client/adapters/preact-adapter.ts +0 -331
  128. package/src/client/adapters/qwik-adapter.js +0 -259
  129. package/src/client/adapters/qwik-adapter.ts +0 -345
  130. package/src/client/adapters/react-adapter.js +0 -220
  131. package/src/client/adapters/react-adapter.ts +0 -353
  132. package/src/client/adapters/solid-adapter.js +0 -295
  133. package/src/client/adapters/solid-adapter.ts +0 -451
  134. package/src/client/adapters/svelte-adapter.js +0 -368
  135. package/src/client/adapters/svelte-adapter.ts +0 -524
  136. package/src/client/adapters/vue-adapter.js +0 -278
  137. package/src/client/adapters/vue-adapter.ts +0 -467
  138. package/src/client/components.js +0 -23
  139. package/src/client/css-hmr-handler.js +0 -263
  140. package/src/client/framework-adapter.js +0 -283
  141. package/src/client/hmr-coordinator.js +0 -274
@@ -1,321 +1,321 @@
1
- /**
2
- * Nitro Types and Interfaces for Avalon
3
- *
4
- * This module defines the core types used throughout the Nitro integration,
5
- * including render context, runtime configuration, and route definitions.
6
- *
7
- * In Nitro v3, canonical types should be imported from `nitro/types`.
8
- * Avalon-specific types that extend or complement Nitro's types are defined here.
9
- */
10
-
11
- import type { MiddlewareContext } from "../nitro/middleware-adapter.ts";
12
- import type { ApiMethod } from "../schemas/api.ts";
13
-
14
- /**
15
- * ServerRequest type reference from Nitro v3 (`nitro/types`).
16
- * Re-exported here for convenience within Avalon's Nitro integration.
17
- *
18
- * Represents the server-side request object in Nitro v3's type system.
19
- * When the full `nitro/types` package is available, prefer importing directly.
20
- */
21
- export interface ServerRequest {
22
- /** HTTP method */
23
- method: string;
24
- /** Request URL */
25
- url: string;
26
- /** Request headers */
27
- headers: Record<string, string | string[] | undefined>;
28
- /** Request body (if applicable) */
29
- body?: unknown;
30
- }
31
-
32
- /**
33
- * H3 Event type placeholder
34
- * This represents the H3 event object from Nitro's h3 library
35
- */
36
- export interface H3Event {
37
- /** HTTP method */
38
- method: string;
39
- /** Node.js request object */
40
- node?: {
41
- req: unknown;
42
- res?: unknown;
43
- };
44
- /** Event context for storing data */
45
- context: Record<string, unknown>;
46
- /** Request path */
47
- path: string;
48
- }
49
-
50
- /**
51
- * Avalon-specific runtime configuration stored in Nitro's runtimeConfig
52
- * This is accessed via useRuntimeConfig().avalon in handlers
53
- */
54
- export interface AvalonRuntimeConfig {
55
- /** Enable streaming SSR responses */
56
- streaming: boolean;
57
- /** Pages directory path relative to project root */
58
- pagesDir: string;
59
- /** Layouts directory path relative to project root */
60
- layoutsDir: string;
61
- }
62
-
63
- /**
64
- * Render context provided to the SSR renderer
65
- * Contains all information needed to render a page
66
- */
67
- export interface NitroRenderContext {
68
- /** Request URL */
69
- url: URL;
70
- /** Route parameters extracted from dynamic segments */
71
- params: Record<string, string>;
72
- /** Query parameters from URL search string */
73
- query: Record<string, string | string[]>;
74
- /** Original HTTP request */
75
- request: Request;
76
- /** H3 event for advanced use cases */
77
- event: H3Event;
78
- /** Middleware context if middleware was executed */
79
- middlewareContext?: MiddlewareContext;
80
- /** Layout context for rendering */
81
- layoutContext?: LayoutContext;
82
- }
83
-
84
- /**
85
- * Layout context for page rendering
86
- */
87
- export interface LayoutContext {
88
- /** Layout component paths in nesting order (outermost first) */
89
- layouts: string[];
90
- /** Layout data loaded from layout modules */
91
- layoutData?: Record<string, unknown>;
92
- }
93
-
94
- /**
95
- * Discovered route information
96
- */
97
- export interface DiscoveredRoute {
98
- /** Route type: page or API */
99
- type: "page" | "api";
100
- /** Absolute file path to the route handler */
101
- filePath: string;
102
- /** Route pattern for matching (e.g., /users/:id) */
103
- pattern: string;
104
- /** Extracted parameter names from dynamic segments */
105
- params: string[];
106
- /** HTTP method for API routes with method suffix */
107
- method?: ApiMethod;
108
- }
109
-
110
- /**
111
- * Nitro route configuration
112
- */
113
- export interface NitroRouteConfig {
114
- /** Route pattern (e.g., /users/:id) */
115
- pattern: string;
116
- /** Route handler type */
117
- type: "page" | "api" | "middleware";
118
- /** File path to the handler */
119
- filePath: string;
120
- /** Extracted parameter names */
121
- params: string[];
122
- /** HTTP method (for API routes) */
123
- method?: ApiMethod;
124
- /** Layout chain for pages */
125
- layouts?: string[];
126
- }
127
-
128
- /**
129
- * SSR render options
130
- */
131
- export interface SSRRenderOptions {
132
- /** Enable streaming SSR */
133
- streaming?: boolean;
134
- /** Callback when shell is ready (for streaming) */
135
- onShellReady?: () => void;
136
- /** Callback when all content is ready */
137
- onAllReady?: () => void;
138
- /** Callback on render error */
139
- onError?: (error: Error) => void;
140
- }
141
-
142
- /**
143
- * SSR render result
144
- */
145
- export interface SSRRenderResult {
146
- /** Rendered HTML string or stream */
147
- html: string | ReadableStream<Uint8Array>;
148
- /** HTTP status code */
149
- statusCode: number;
150
- /** Response headers */
151
- headers: Record<string, string>;
152
- }
153
-
154
- /**
155
- * Island manifest entry for a single island
156
- */
157
- export interface IslandEntry {
158
- /** Compiled JavaScript path */
159
- src: string;
160
- /** Framework identifier (react, vue, svelte, etc.) */
161
- framework: string;
162
- /** CSS dependencies */
163
- css?: string[];
164
- /** Preload dependencies */
165
- preload?: string[];
166
- }
167
-
168
- /**
169
- * Island manifest for production builds
170
- */
171
- export interface IslandManifest {
172
- /** Map of island ID to compiled asset information */
173
- islands: Record<string, IslandEntry>;
174
- /** Client entry script path */
175
- clientEntry: string;
176
- /** CSS assets to inject */
177
- css: string[];
178
- }
179
-
180
- /**
181
- * Page module export interface
182
- */
183
- export interface PageModule {
184
- /** Default export - the page component */
185
- default: unknown;
186
- /** Optional page metadata */
187
- metadata?: PageMetadata;
188
- /** Optional getStaticProps for static generation */
189
- getStaticProps?: () => Promise<Record<string, unknown>>;
190
- /** Optional getServerSideProps for SSR */
191
- getServerSideProps?: (
192
- context: NitroRenderContext
193
- ) => Promise<Record<string, unknown>>;
194
- }
195
-
196
- /**
197
- * Page metadata for SEO and configuration
198
- */
199
- export interface PageMetadata {
200
- /** Page title */
201
- title?: string;
202
- /** Page description */
203
- description?: string;
204
- /** Open Graph metadata */
205
- openGraph?: {
206
- title?: string;
207
- description?: string;
208
- image?: string;
209
- };
210
- /** Additional head elements */
211
- head?: Array<{
212
- tag: string;
213
- attrs?: Record<string, string>;
214
- content?: string;
215
- }>;
216
- }
217
-
218
- /**
219
- * Error response structure
220
- */
221
- export interface ErrorResponse {
222
- /** HTTP status code */
223
- statusCode: number;
224
- /** Error message */
225
- message: string;
226
- /** Stack trace (development only) */
227
- stack?: string;
228
- /** Additional error data */
229
- data?: Record<string, unknown>;
230
- }
231
-
232
- /**
233
- * HTTP error class for typed error handling
234
- */
235
- export class HttpError extends Error {
236
- /** HTTP status code */
237
- statusCode: number;
238
- /** Additional error data */
239
- data?: Record<string, unknown>;
240
-
241
- constructor(
242
- statusCode: number,
243
- message: string,
244
- data?: Record<string, unknown>
245
- ) {
246
- super(message);
247
- this.name = "HttpError";
248
- this.statusCode = statusCode;
249
- this.data = data;
250
- }
251
- }
252
-
253
- /**
254
- * Create a 404 Not Found error
255
- */
256
- export function createNotFoundError(message = "Not Found"): HttpError {
257
- return new HttpError(404, message);
258
- }
259
-
260
- /**
261
- * Create a 405 Method Not Allowed error
262
- */
263
- export function createMethodNotAllowedError(
264
- allowedMethods: string[]
265
- ): HttpError {
266
- return new HttpError(405, "Method Not Allowed", { allowed: allowedMethods });
267
- }
268
-
269
- /**
270
- * Create a 500 Internal Server Error
271
- */
272
- export function createInternalError(message = "Internal Server Error"): HttpError {
273
- return new HttpError(500, message);
274
- }
275
-
276
- /**
277
- * Type guard to check if an error is an HttpError
278
- */
279
- export function isHttpError(error: unknown): error is HttpError {
280
- return error instanceof HttpError;
281
- }
282
-
283
- /**
284
- * Avalon context stored in H3 event.context
285
- */
286
- export interface AvalonEventContext {
287
- /** Middleware context after middleware execution */
288
- middlewareContext?: MiddlewareContext;
289
- /** Resolved route information */
290
- route?: NitroRouteConfig;
291
- /** Page props from getServerSideProps */
292
- pageProps?: Record<string, unknown>;
293
- }
294
-
295
- /**
296
- * Development server options
297
- */
298
- export interface DevServerOptions {
299
- /** Port to listen on */
300
- port?: number;
301
- /** Host to bind to */
302
- host?: string;
303
- /** Enable HTTPS */
304
- https?: boolean;
305
- /** Open browser on start */
306
- open?: boolean;
307
- }
308
-
309
- /**
310
- * Build options for production
311
- */
312
- export interface BuildOptions {
313
- /** Output directory */
314
- outDir?: string;
315
- /** Enable source maps */
316
- sourcemap?: boolean;
317
- /** Minify output */
318
- minify?: boolean;
319
- /** Target preset */
320
- preset?: string;
321
- }
1
+ /**
2
+ * Nitro Types and Interfaces for Avalon
3
+ *
4
+ * This module defines the core types used throughout the Nitro integration,
5
+ * including render context, runtime configuration, and route definitions.
6
+ *
7
+ * In Nitro v3, canonical types should be imported from `nitro/types`.
8
+ * Avalon-specific types that extend or complement Nitro's types are defined here.
9
+ */
10
+
11
+ import type { MiddlewareContext } from "../nitro/middleware-adapter.ts";
12
+ import type { ApiMethod } from "../schemas/api.ts";
13
+
14
+ /**
15
+ * ServerRequest type reference from Nitro v3 (`nitro/types`).
16
+ * Re-exported here for convenience within Avalon's Nitro integration.
17
+ *
18
+ * Represents the server-side request object in Nitro v3's type system.
19
+ * When the full `nitro/types` package is available, prefer importing directly.
20
+ */
21
+ export interface ServerRequest {
22
+ /** HTTP method */
23
+ method: string;
24
+ /** Request URL */
25
+ url: string;
26
+ /** Request headers */
27
+ headers: Record<string, string | string[] | undefined>;
28
+ /** Request body (if applicable) */
29
+ body?: unknown;
30
+ }
31
+
32
+ /**
33
+ * H3 Event type placeholder
34
+ * This represents the H3 event object from Nitro's h3 library
35
+ */
36
+ export interface H3Event {
37
+ /** HTTP method */
38
+ method: string;
39
+ /** Node.js request object */
40
+ node?: {
41
+ req: unknown;
42
+ res?: unknown;
43
+ };
44
+ /** Event context for storing data */
45
+ context: Record<string, unknown>;
46
+ /** Request path */
47
+ path: string;
48
+ }
49
+
50
+ /**
51
+ * Avalon-specific runtime configuration stored in Nitro's runtimeConfig
52
+ * This is accessed via useRuntimeConfig().avalon in handlers
53
+ */
54
+ export interface AvalonRuntimeConfig {
55
+ /** Enable streaming SSR responses */
56
+ streaming: boolean;
57
+ /** Pages directory path relative to project root */
58
+ pagesDir: string;
59
+ /** Layouts directory path relative to project root */
60
+ layoutsDir: string;
61
+ }
62
+
63
+ /**
64
+ * Render context provided to the SSR renderer
65
+ * Contains all information needed to render a page
66
+ */
67
+ export interface NitroRenderContext {
68
+ /** Request URL */
69
+ url: URL;
70
+ /** Route parameters extracted from dynamic segments */
71
+ params: Record<string, string>;
72
+ /** Query parameters from URL search string */
73
+ query: Record<string, string | string[]>;
74
+ /** Original HTTP request */
75
+ request: Request;
76
+ /** H3 event for advanced use cases */
77
+ event: H3Event;
78
+ /** Middleware context if middleware was executed */
79
+ middlewareContext?: MiddlewareContext;
80
+ /** Layout context for rendering */
81
+ layoutContext?: LayoutContext;
82
+ }
83
+
84
+ /**
85
+ * Layout context for page rendering
86
+ */
87
+ export interface LayoutContext {
88
+ /** Layout component paths in nesting order (outermost first) */
89
+ layouts: string[];
90
+ /** Layout data loaded from layout modules */
91
+ layoutData?: Record<string, unknown>;
92
+ }
93
+
94
+ /**
95
+ * Discovered route information
96
+ */
97
+ export interface DiscoveredRoute {
98
+ /** Route type: page or API */
99
+ type: "page" | "api";
100
+ /** Absolute file path to the route handler */
101
+ filePath: string;
102
+ /** Route pattern for matching (e.g., /users/:id) */
103
+ pattern: string;
104
+ /** Extracted parameter names from dynamic segments */
105
+ params: string[];
106
+ /** HTTP method for API routes with method suffix */
107
+ method?: ApiMethod;
108
+ }
109
+
110
+ /**
111
+ * Nitro route configuration
112
+ */
113
+ export interface NitroRouteConfig {
114
+ /** Route pattern (e.g., /users/:id) */
115
+ pattern: string;
116
+ /** Route handler type */
117
+ type: "page" | "api" | "middleware";
118
+ /** File path to the handler */
119
+ filePath: string;
120
+ /** Extracted parameter names */
121
+ params: string[];
122
+ /** HTTP method (for API routes) */
123
+ method?: ApiMethod;
124
+ /** Layout chain for pages */
125
+ layouts?: string[];
126
+ }
127
+
128
+ /**
129
+ * SSR render options
130
+ */
131
+ export interface SSRRenderOptions {
132
+ /** Enable streaming SSR */
133
+ streaming?: boolean;
134
+ /** Callback when shell is ready (for streaming) */
135
+ onShellReady?: () => void;
136
+ /** Callback when all content is ready */
137
+ onAllReady?: () => void;
138
+ /** Callback on render error */
139
+ onError?: (error: Error) => void;
140
+ }
141
+
142
+ /**
143
+ * SSR render result
144
+ */
145
+ export interface SSRRenderResult {
146
+ /** Rendered HTML string or stream */
147
+ html: string | ReadableStream<Uint8Array>;
148
+ /** HTTP status code */
149
+ statusCode: number;
150
+ /** Response headers */
151
+ headers: Record<string, string>;
152
+ }
153
+
154
+ /**
155
+ * Island manifest entry for a single island
156
+ */
157
+ export interface IslandEntry {
158
+ /** Compiled JavaScript path */
159
+ src: string;
160
+ /** Framework identifier (react, vue, svelte, etc.) */
161
+ framework: string;
162
+ /** CSS dependencies */
163
+ css?: string[];
164
+ /** Preload dependencies */
165
+ preload?: string[];
166
+ }
167
+
168
+ /**
169
+ * Island manifest for production builds
170
+ */
171
+ export interface IslandManifest {
172
+ /** Map of island ID to compiled asset information */
173
+ islands: Record<string, IslandEntry>;
174
+ /** Client entry script path */
175
+ clientEntry: string;
176
+ /** CSS assets to inject */
177
+ css: string[];
178
+ }
179
+
180
+ /**
181
+ * Page module export interface
182
+ */
183
+ export interface PageModule {
184
+ /** Default export - the page component */
185
+ default: unknown;
186
+ /** Optional page metadata */
187
+ metadata?: PageMetadata;
188
+ /** Optional getStaticProps for static generation */
189
+ getStaticProps?: () => Promise<Record<string, unknown>>;
190
+ /** Optional getServerSideProps for SSR */
191
+ getServerSideProps?: (
192
+ context: NitroRenderContext
193
+ ) => Promise<Record<string, unknown>>;
194
+ }
195
+
196
+ /**
197
+ * Page metadata for SEO and configuration
198
+ */
199
+ export interface PageMetadata {
200
+ /** Page title */
201
+ title?: string;
202
+ /** Page description */
203
+ description?: string;
204
+ /** Open Graph metadata */
205
+ openGraph?: {
206
+ title?: string;
207
+ description?: string;
208
+ image?: string;
209
+ };
210
+ /** Additional head elements */
211
+ head?: Array<{
212
+ tag: string;
213
+ attrs?: Record<string, string>;
214
+ content?: string;
215
+ }>;
216
+ }
217
+
218
+ /**
219
+ * Error response structure
220
+ */
221
+ export interface ErrorResponse {
222
+ /** HTTP status code */
223
+ statusCode: number;
224
+ /** Error message */
225
+ message: string;
226
+ /** Stack trace (development only) */
227
+ stack?: string;
228
+ /** Additional error data */
229
+ data?: Record<string, unknown>;
230
+ }
231
+
232
+ /**
233
+ * HTTP error class for typed error handling
234
+ */
235
+ export class HttpError extends Error {
236
+ /** HTTP status code */
237
+ statusCode: number;
238
+ /** Additional error data */
239
+ data?: Record<string, unknown>;
240
+
241
+ constructor(
242
+ statusCode: number,
243
+ message: string,
244
+ data?: Record<string, unknown>
245
+ ) {
246
+ super(message);
247
+ this.name = "HttpError";
248
+ this.statusCode = statusCode;
249
+ this.data = data;
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Create a 404 Not Found error
255
+ */
256
+ export function createNotFoundError(message = "Not Found"): HttpError {
257
+ return new HttpError(404, message);
258
+ }
259
+
260
+ /**
261
+ * Create a 405 Method Not Allowed error
262
+ */
263
+ export function createMethodNotAllowedError(
264
+ allowedMethods: string[]
265
+ ): HttpError {
266
+ return new HttpError(405, "Method Not Allowed", { allowed: allowedMethods });
267
+ }
268
+
269
+ /**
270
+ * Create a 500 Internal Server Error
271
+ */
272
+ export function createInternalError(message = "Internal Server Error"): HttpError {
273
+ return new HttpError(500, message);
274
+ }
275
+
276
+ /**
277
+ * Type guard to check if an error is an HttpError
278
+ */
279
+ export function isHttpError(error: unknown): error is HttpError {
280
+ return error instanceof HttpError;
281
+ }
282
+
283
+ /**
284
+ * Avalon context stored in H3 event.context
285
+ */
286
+ export interface AvalonEventContext {
287
+ /** Middleware context after middleware execution */
288
+ middlewareContext?: MiddlewareContext;
289
+ /** Resolved route information */
290
+ route?: NitroRouteConfig;
291
+ /** Page props from getServerSideProps */
292
+ pageProps?: Record<string, unknown>;
293
+ }
294
+
295
+ /**
296
+ * Development server options
297
+ */
298
+ export interface DevServerOptions {
299
+ /** Port to listen on */
300
+ port?: number;
301
+ /** Host to bind to */
302
+ host?: string;
303
+ /** Enable HTTPS */
304
+ https?: boolean;
305
+ /** Open browser on start */
306
+ open?: boolean;
307
+ }
308
+
309
+ /**
310
+ * Build options for production
311
+ */
312
+ export interface BuildOptions {
313
+ /** Output directory */
314
+ outDir?: string;
315
+ /** Enable source maps */
316
+ sourcemap?: boolean;
317
+ /** Minify output */
318
+ minify?: boolean;
319
+ /** Target preset */
320
+ preset?: string;
321
+ }