@useavalon/avalon 0.1.11 → 0.1.12

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 (250) hide show
  1. package/README.md +54 -54
  2. package/dist/mod.js +1 -0
  3. package/dist/src/build/integration-bundler-plugin.js +1 -0
  4. package/dist/src/build/integration-config.js +1 -0
  5. package/dist/src/build/integration-detection-plugin.js +1 -0
  6. package/dist/src/build/integration-resolver-plugin.js +1 -0
  7. package/dist/src/build/island-manifest.js +1 -0
  8. package/dist/src/build/island-types-generator.js +5 -0
  9. package/dist/src/build/mdx-island-transform.js +2 -0
  10. package/dist/src/build/mdx-plugin.js +1 -0
  11. package/dist/src/build/page-island-transform.js +3 -0
  12. package/dist/src/build/prop-extractors/index.js +1 -0
  13. package/dist/src/build/prop-extractors/lit.js +1 -0
  14. package/dist/src/build/prop-extractors/qwik.js +1 -0
  15. package/dist/src/build/prop-extractors/solid.js +1 -0
  16. package/dist/src/build/prop-extractors/svelte.js +1 -0
  17. package/dist/src/build/prop-extractors/vue.js +1 -0
  18. package/dist/src/build/sidecar-file-manager.js +1 -0
  19. package/dist/src/build/sidecar-renderer.js +6 -0
  20. package/dist/src/client/adapters/index.js +1 -0
  21. package/dist/src/client/components.js +1 -0
  22. package/dist/src/client/css-hmr-handler.js +1 -0
  23. package/dist/src/client/framework-adapter.js +13 -0
  24. package/dist/src/client/hmr-coordinator.js +1 -0
  25. package/dist/src/client/hmr-error-overlay.js +214 -0
  26. package/dist/src/client/main.js +39 -0
  27. package/{src → dist/src}/client/types/framework-runtime.d.ts +68 -68
  28. package/{src → dist/src}/client/types/vite-hmr.d.ts +46 -46
  29. package/dist/src/client/types/vite-virtual-modules.d.ts +70 -0
  30. package/dist/src/components/Image.js +1 -0
  31. package/dist/src/components/IslandErrorBoundary.js +1 -0
  32. package/dist/src/components/LayoutDataErrorBoundary.js +1 -0
  33. package/dist/src/components/LayoutErrorBoundary.js +1 -0
  34. package/dist/src/components/PersistentIsland.js +1 -0
  35. package/dist/src/components/StreamingErrorBoundary.js +1 -0
  36. package/dist/src/components/StreamingLayout.js +29 -0
  37. package/dist/src/core/components/component-analyzer.js +1 -0
  38. package/dist/src/core/components/component-detection.js +5 -0
  39. package/dist/src/core/components/enhanced-framework-detector.js +1 -0
  40. package/dist/src/core/components/framework-registry.js +1 -0
  41. package/dist/src/core/content/mdx-processor.js +1 -0
  42. package/dist/src/core/integrations/index.js +1 -0
  43. package/dist/src/core/integrations/loader.js +1 -0
  44. package/dist/src/core/integrations/registry.js +1 -0
  45. package/dist/src/core/islands/island-persistence.js +1 -0
  46. package/dist/src/core/islands/island-state-serializer.js +1 -0
  47. package/dist/src/core/islands/persistent-island-context.js +1 -0
  48. package/dist/src/core/islands/use-persistent-state.js +1 -0
  49. package/dist/src/core/layout/enhanced-layout-resolver.js +1 -0
  50. package/dist/src/core/layout/layout-cache-manager.js +1 -0
  51. package/dist/src/core/layout/layout-composer.js +1 -0
  52. package/dist/src/core/layout/layout-data-loader.js +1 -0
  53. package/dist/src/core/layout/layout-discovery.js +1 -0
  54. package/dist/src/core/layout/layout-matcher.js +1 -0
  55. package/dist/src/core/layout/layout-types.js +1 -0
  56. package/dist/src/core/modules/framework-module-resolver.js +1 -0
  57. package/dist/src/islands/component-analysis.js +1 -0
  58. package/dist/src/islands/css-utils.js +17 -0
  59. package/dist/src/islands/discovery/index.js +1 -0
  60. package/dist/src/islands/discovery/registry.js +1 -0
  61. package/dist/src/islands/discovery/resolver.js +2 -0
  62. package/dist/src/islands/discovery/scanner.js +1 -0
  63. package/dist/src/islands/discovery/types.js +1 -0
  64. package/dist/src/islands/discovery/validator.js +18 -0
  65. package/dist/src/islands/discovery/watcher.js +1 -0
  66. package/dist/src/islands/framework-detection.js +1 -0
  67. package/dist/src/islands/integration-loader.js +1 -0
  68. package/dist/src/islands/island.js +1 -0
  69. package/dist/src/islands/render-cache.js +1 -0
  70. package/dist/src/islands/types.js +1 -0
  71. package/dist/src/islands/universal-css-collector.js +5 -0
  72. package/dist/src/islands/universal-head-collector.js +2 -0
  73. package/{src → dist/src}/layout-system.d.ts +592 -592
  74. package/dist/src/layout-system.js +1 -0
  75. package/dist/src/middleware/discovery.js +1 -0
  76. package/dist/src/middleware/executor.js +1 -0
  77. package/dist/src/middleware/index.js +1 -0
  78. package/dist/src/middleware/types.js +1 -0
  79. package/dist/src/nitro/build-config.js +1 -0
  80. package/dist/src/nitro/config.js +1 -0
  81. package/dist/src/nitro/error-handler.js +198 -0
  82. package/dist/src/nitro/index.js +1 -0
  83. package/dist/src/nitro/island-manifest.js +2 -0
  84. package/dist/src/nitro/middleware-adapter.js +1 -0
  85. package/dist/src/nitro/renderer.js +183 -0
  86. package/dist/src/nitro/route-discovery.js +1 -0
  87. package/dist/src/nitro/types.js +1 -0
  88. package/dist/src/render/collect-css.js +3 -0
  89. package/{src/render/error-pages.ts → dist/src/render/error-pages.js} +7 -38
  90. package/dist/src/render/isolated-ssr-renderer.js +1 -0
  91. package/dist/src/render/ssr.js +90 -0
  92. package/dist/src/schemas/api.js +1 -0
  93. package/dist/src/schemas/core.js +1 -0
  94. package/dist/src/schemas/index.js +1 -0
  95. package/dist/src/schemas/layout.js +1 -0
  96. package/dist/src/schemas/routing/index.js +1 -0
  97. package/dist/src/schemas/routing.js +1 -0
  98. package/dist/src/types/as-island.js +1 -0
  99. package/{src → dist/src}/types/image.d.ts +106 -106
  100. package/{src → dist/src}/types/index.d.ts +22 -22
  101. package/{src → dist/src}/types/island-jsx.d.ts +33 -33
  102. package/{src → dist/src}/types/island-prop.d.ts +20 -20
  103. package/dist/src/types/layout.js +1 -0
  104. package/{src → dist/src}/types/mdx.d.ts +6 -6
  105. package/dist/src/types/routing.js +1 -0
  106. package/dist/src/types/types.js +1 -0
  107. package/{src → dist/src}/types/urlpattern.d.ts +49 -49
  108. package/{src → dist/src}/types/vite-env.d.ts +11 -11
  109. package/dist/src/utils/dev-logger.js +12 -0
  110. package/dist/src/utils/fs.js +1 -0
  111. package/dist/src/vite-plugin/auto-discover.js +1 -0
  112. package/dist/src/vite-plugin/config.js +1 -0
  113. package/dist/src/vite-plugin/errors.js +1 -0
  114. package/dist/src/vite-plugin/image-optimization.js +45 -0
  115. package/dist/src/vite-plugin/integration-activator.js +1 -0
  116. package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -0
  117. package/dist/src/vite-plugin/module-discovery.js +1 -0
  118. package/dist/src/vite-plugin/nitro-integration.js +42 -0
  119. package/dist/src/vite-plugin/plugin.js +1 -0
  120. package/dist/src/vite-plugin/types.js +1 -0
  121. package/dist/src/vite-plugin/validation.js +2 -0
  122. package/package.json +57 -26
  123. package/mod.ts +0 -302
  124. package/src/build/integration-bundler-plugin.ts +0 -116
  125. package/src/build/integration-config.ts +0 -168
  126. package/src/build/integration-detection-plugin.ts +0 -117
  127. package/src/build/integration-resolver-plugin.ts +0 -90
  128. package/src/build/island-manifest.ts +0 -269
  129. package/src/build/island-types-generator.ts +0 -476
  130. package/src/build/mdx-island-transform.ts +0 -464
  131. package/src/build/mdx-plugin.ts +0 -98
  132. package/src/build/page-island-transform.ts +0 -598
  133. package/src/build/prop-extractors/index.ts +0 -21
  134. package/src/build/prop-extractors/lit.ts +0 -140
  135. package/src/build/prop-extractors/qwik.ts +0 -16
  136. package/src/build/prop-extractors/solid.ts +0 -125
  137. package/src/build/prop-extractors/svelte.ts +0 -194
  138. package/src/build/prop-extractors/vue.ts +0 -111
  139. package/src/build/sidecar-file-manager.ts +0 -104
  140. package/src/build/sidecar-renderer.ts +0 -30
  141. package/src/client/adapters/index.js +0 -12
  142. package/src/client/adapters/index.ts +0 -13
  143. package/src/client/adapters/lit-adapter.js +0 -467
  144. package/src/client/adapters/lit-adapter.ts +0 -654
  145. package/src/client/adapters/preact-adapter.js +0 -223
  146. package/src/client/adapters/preact-adapter.ts +0 -331
  147. package/src/client/adapters/qwik-adapter.js +0 -259
  148. package/src/client/adapters/qwik-adapter.ts +0 -345
  149. package/src/client/adapters/react-adapter.js +0 -220
  150. package/src/client/adapters/react-adapter.ts +0 -353
  151. package/src/client/adapters/solid-adapter.js +0 -295
  152. package/src/client/adapters/solid-adapter.ts +0 -451
  153. package/src/client/adapters/svelte-adapter.js +0 -368
  154. package/src/client/adapters/svelte-adapter.ts +0 -524
  155. package/src/client/adapters/vue-adapter.js +0 -278
  156. package/src/client/adapters/vue-adapter.ts +0 -467
  157. package/src/client/components.js +0 -23
  158. package/src/client/components.ts +0 -35
  159. package/src/client/css-hmr-handler.js +0 -263
  160. package/src/client/css-hmr-handler.ts +0 -344
  161. package/src/client/framework-adapter.js +0 -283
  162. package/src/client/framework-adapter.ts +0 -462
  163. package/src/client/hmr-coordinator.js +0 -274
  164. package/src/client/hmr-coordinator.ts +0 -396
  165. package/src/client/hmr-error-overlay.js +0 -533
  166. package/src/client/main.js +0 -816
  167. package/src/client/types/vite-virtual-modules.d.ts +0 -60
  168. package/src/components/Image.tsx +0 -123
  169. package/src/components/IslandErrorBoundary.tsx +0 -145
  170. package/src/components/LayoutDataErrorBoundary.tsx +0 -141
  171. package/src/components/LayoutErrorBoundary.tsx +0 -127
  172. package/src/components/PersistentIsland.tsx +0 -52
  173. package/src/components/StreamingErrorBoundary.tsx +0 -233
  174. package/src/components/StreamingLayout.tsx +0 -538
  175. package/src/core/components/component-analyzer.ts +0 -192
  176. package/src/core/components/component-detection.ts +0 -508
  177. package/src/core/components/enhanced-framework-detector.ts +0 -500
  178. package/src/core/components/framework-registry.ts +0 -563
  179. package/src/core/content/mdx-processor.ts +0 -46
  180. package/src/core/integrations/index.ts +0 -19
  181. package/src/core/integrations/loader.ts +0 -125
  182. package/src/core/integrations/registry.ts +0 -175
  183. package/src/core/islands/island-persistence.ts +0 -325
  184. package/src/core/islands/island-state-serializer.ts +0 -258
  185. package/src/core/islands/persistent-island-context.tsx +0 -80
  186. package/src/core/islands/use-persistent-state.ts +0 -68
  187. package/src/core/layout/enhanced-layout-resolver.ts +0 -322
  188. package/src/core/layout/layout-cache-manager.ts +0 -485
  189. package/src/core/layout/layout-composer.ts +0 -357
  190. package/src/core/layout/layout-data-loader.ts +0 -516
  191. package/src/core/layout/layout-discovery.ts +0 -243
  192. package/src/core/layout/layout-matcher.ts +0 -299
  193. package/src/core/layout/layout-types.ts +0 -110
  194. package/src/core/modules/framework-module-resolver.ts +0 -273
  195. package/src/islands/component-analysis.ts +0 -213
  196. package/src/islands/css-utils.ts +0 -565
  197. package/src/islands/discovery/index.ts +0 -80
  198. package/src/islands/discovery/registry.ts +0 -340
  199. package/src/islands/discovery/resolver.ts +0 -477
  200. package/src/islands/discovery/scanner.ts +0 -386
  201. package/src/islands/discovery/types.ts +0 -117
  202. package/src/islands/discovery/validator.ts +0 -544
  203. package/src/islands/discovery/watcher.ts +0 -368
  204. package/src/islands/framework-detection.ts +0 -428
  205. package/src/islands/integration-loader.ts +0 -490
  206. package/src/islands/island.tsx +0 -565
  207. package/src/islands/render-cache.ts +0 -550
  208. package/src/islands/types.ts +0 -80
  209. package/src/islands/universal-css-collector.ts +0 -157
  210. package/src/islands/universal-head-collector.ts +0 -137
  211. package/src/layout-system.ts +0 -218
  212. package/src/middleware/discovery.ts +0 -268
  213. package/src/middleware/executor.ts +0 -315
  214. package/src/middleware/index.ts +0 -76
  215. package/src/middleware/types.ts +0 -99
  216. package/src/nitro/build-config.ts +0 -576
  217. package/src/nitro/config.ts +0 -483
  218. package/src/nitro/error-handler.ts +0 -636
  219. package/src/nitro/index.ts +0 -173
  220. package/src/nitro/island-manifest.ts +0 -584
  221. package/src/nitro/middleware-adapter.ts +0 -260
  222. package/src/nitro/renderer.ts +0 -1471
  223. package/src/nitro/route-discovery.ts +0 -439
  224. package/src/nitro/types.ts +0 -321
  225. package/src/render/collect-css.ts +0 -198
  226. package/src/render/isolated-ssr-renderer.ts +0 -654
  227. package/src/render/ssr.ts +0 -1030
  228. package/src/schemas/api.ts +0 -30
  229. package/src/schemas/core.ts +0 -64
  230. package/src/schemas/index.ts +0 -212
  231. package/src/schemas/layout.ts +0 -279
  232. package/src/schemas/routing/index.ts +0 -38
  233. package/src/schemas/routing.ts +0 -376
  234. package/src/types/as-island.ts +0 -20
  235. package/src/types/layout.ts +0 -285
  236. package/src/types/routing.ts +0 -555
  237. package/src/types/types.ts +0 -5
  238. package/src/utils/dev-logger.ts +0 -299
  239. package/src/utils/fs.ts +0 -151
  240. package/src/vite-plugin/auto-discover.ts +0 -551
  241. package/src/vite-plugin/config.ts +0 -266
  242. package/src/vite-plugin/errors.ts +0 -127
  243. package/src/vite-plugin/image-optimization.ts +0 -156
  244. package/src/vite-plugin/integration-activator.ts +0 -126
  245. package/src/vite-plugin/island-sidecar-plugin.ts +0 -176
  246. package/src/vite-plugin/module-discovery.ts +0 -189
  247. package/src/vite-plugin/nitro-integration.ts +0 -1354
  248. package/src/vite-plugin/plugin.ts +0 -409
  249. package/src/vite-plugin/types.ts +0 -327
  250. package/src/vite-plugin/validation.ts +0 -228
@@ -1,483 +0,0 @@
1
- /**
2
- * Nitro Configuration Module for Avalon
3
- *
4
- * This module provides configuration interfaces and utilities for integrating
5
- * Nitro as Avalon's server runtime. It handles preset configuration, route rules,
6
- * and merging Avalon-specific options with Nitro defaults.
7
- *
8
- * ## Static Asset Handling
9
- *
10
- * Nitro automatically serves static assets from the `public/` directory at the root path.
11
- * The configuration supports:
12
- * - `publicAssets`: Configures directories for static file serving
13
- * - `routeRules`: Configures cache headers for different asset types
14
- * - `staticAssets`: Avalon-specific static asset configuration
15
- *
16
- * Default route rules for static assets are generated by `createDefaultStaticAssetRouteRules()`:
17
- * - `/assets/**`, `/islands/**`, `/chunks/**`: Long cache (1 year, immutable)
18
- * - `/*.woff`, `/*.woff2`: Long cache for fonts
19
- * - `/*.html`, `/*.css`: Short cache with revalidation
20
- * - `/favicon.ico`: Medium cache (1 day)
21
- */
22
-
23
- import type { ResolvedAvalonConfig } from "../vite-plugin/types.ts";
24
-
25
- /**
26
- * Cache configuration options for route rules
27
- */
28
- export interface CacheOptions {
29
- /** Maximum age in seconds for cache validity */
30
- maxAge?: number;
31
- /** Maximum age in seconds for stale content */
32
- staleMaxAge?: number;
33
- /** Enable stale-while-revalidate behavior */
34
- swr?: boolean;
35
- }
36
-
37
- /**
38
- * Route rule configuration for caching, redirects, proxying, and headers
39
- */
40
- export interface RouteRule {
41
- /** Cache configuration or boolean to enable/disable */
42
- cache?: CacheOptions | boolean;
43
- /** Redirect destination URL */
44
- redirect?: string;
45
- /** Proxy destination URL */
46
- proxy?: string;
47
- /** Custom headers to set */
48
- headers?: Record<string, string>;
49
- /** Enable CORS for this route */
50
- cors?: boolean;
51
- }
52
-
53
- /**
54
- * Static asset serving configuration
55
- */
56
- export interface StaticAssetsConfig {
57
- /**
58
- * Directory containing public static assets
59
- * @default "public"
60
- */
61
- publicDir?: string;
62
-
63
- /**
64
- * Directory containing compiled build output
65
- * @default "dist"
66
- */
67
- buildDir?: string;
68
-
69
- /**
70
- * Enable serving pre-compressed assets (gzip, brotli)
71
- * @default true
72
- */
73
- compression?: boolean;
74
-
75
- /**
76
- * Default cache control header for immutable static assets
77
- * @default "public, max-age=31536000, immutable"
78
- */
79
- cacheControl?: string;
80
-
81
- /**
82
- * Cache control header for mutable assets (HTML, etc.)
83
- * @default "public, max-age=0, must-revalidate"
84
- */
85
- mutableCacheControl?: string;
86
-
87
- /**
88
- * Custom headers to add to all static asset responses
89
- */
90
- headers?: Record<string, string>;
91
- }
92
-
93
- /**
94
- * Avalon-specific Nitro configuration options
95
- */
96
- export interface AvalonNitroConfig {
97
- /**
98
- * Deployment preset (vercel, cloudflare, deno-deploy, node-server, netlify, etc.)
99
- * @default "node-server"
100
- */
101
- preset?: string;
102
-
103
- /**
104
- * Directory containing server routes
105
- * @default "server"
106
- */
107
- serverDir?: string;
108
-
109
- /**
110
- * Directory containing pages (overrides Avalon config if set)
111
- */
112
- pagesDir?: string;
113
-
114
- /**
115
- * Enable streaming SSR responses
116
- * @default true
117
- */
118
- streaming?: boolean;
119
-
120
- /**
121
- * Route rules for caching, redirects, proxying, and headers
122
- * Keys are route patterns (e.g., "/api/**", "/static/**")
123
- */
124
- routeRules?: Record<string, RouteRule>;
125
-
126
- /**
127
- * Runtime configuration accessible via useRuntimeConfig()
128
- * Can be overridden by NITRO_ prefixed environment variables
129
- */
130
- runtimeConfig?: Record<string, unknown>;
131
-
132
- /**
133
- * Public runtime configuration (exposed to client)
134
- */
135
- publicRuntimeConfig?: Record<string, unknown>;
136
-
137
- /**
138
- * Static asset serving configuration
139
- */
140
- staticAssets?: StaticAssetsConfig;
141
-
142
- /** Nitro v3: Compatibility date for preset features (YYYY-MM-DD) */
143
- compatibilityDate?: string;
144
- /** Nitro v3: Dependencies to trace instead of bundle */
145
- traceDeps?: string[];
146
- /** Nitro v3: Rolldown-specific configuration */
147
- rolldownConfig?: Record<string, unknown>;
148
- /** Nitro v3: Custom server entry point */
149
- serverEntry?: string;
150
- /** Nitro v3: Renderer configuration, or false to disable */
151
- renderer?: { handler: string } | false;
152
- /** Nitro v3: Pre-compress public assets (gzip, brotli, zstd) */
153
- compressPublicAssets?: boolean | { gzip?: boolean; brotli?: boolean; zstd?: boolean };
154
- }
155
-
156
- /**
157
- * Nitro configuration output structure
158
- * This matches the expected NitroConfig interface from nitro/types
159
- */
160
- export interface NitroConfigOutput {
161
- /** Deployment preset */
162
- preset: string;
163
- /** Server directory */
164
- serverDir: string;
165
- /** Route rules */
166
- routeRules: Record<string, RouteRule>;
167
- /** Runtime configuration */
168
- runtimeConfig: {
169
- avalon: AvalonRuntimeConfig;
170
- [key: string]: unknown;
171
- };
172
- /** Public runtime configuration */
173
- publicRuntimeConfig?: Record<string, unknown>;
174
- /** Renderer configuration, or false to disable */
175
- renderer?: {
176
- handler: string;
177
- } | false;
178
- /** Nitro v3: Compatibility date for preset features (YYYY-MM-DD) */
179
- compatibilityDate?: string;
180
- /** Nitro v3: Dependencies to trace instead of bundle */
181
- traceDeps?: string[];
182
- /** Nitro v3: Rolldown-specific configuration */
183
- rolldownConfig?: Record<string, unknown>;
184
- /** Nitro v3: Custom server entry point */
185
- serverEntry?: string;
186
- /** Nitro v3: Pre-compress public assets (gzip, brotli, zstd) */
187
- compressPublicAssets?: boolean | { gzip?: boolean; brotli?: boolean; zstd?: boolean };
188
- /** Public assets directory */
189
- publicAssets?: Array<{
190
- dir: string;
191
- baseURL?: string;
192
- maxAge?: number;
193
- }>;
194
- /** Server assets configuration */
195
- serverAssets?: Array<{
196
- baseName: string;
197
- dir: string;
198
- }>;
199
- /** Static assets configuration */
200
- staticAssets?: StaticAssetsConfig;
201
- }
202
-
203
- /**
204
- * Avalon-specific runtime configuration stored in Nitro's runtimeConfig
205
- */
206
- export interface AvalonRuntimeConfig {
207
- /** Enable streaming SSR */
208
- streaming: boolean;
209
- /** Pages directory path */
210
- pagesDir: string;
211
- /** Layouts directory path */
212
- layoutsDir: string;
213
- }
214
-
215
- /**
216
- * Default static assets configuration
217
- */
218
- export const DEFAULT_STATIC_ASSETS_CONFIG: Required<StaticAssetsConfig> = {
219
- publicDir: "public",
220
- buildDir: "dist",
221
- compression: true,
222
- cacheControl: "public, max-age=31536000, immutable",
223
- mutableCacheControl: "public, max-age=0, must-revalidate",
224
- headers: {},
225
- };
226
-
227
- /**
228
- * All valid Nitro v3 preset names (underscore convention).
229
- */
230
- export const VALID_V3_PRESETS: string[] = [
231
- "node_server",
232
- "node_middleware",
233
- "vercel",
234
- "cloudflare_module",
235
- "cloudflare_pages",
236
- "deno_deploy",
237
- "deno_server",
238
- "netlify_functions",
239
- "netlify_edge",
240
- "aws_lambda",
241
- "azure_swa",
242
- "firebase_functions",
243
- "render_com",
244
- "static",
245
- "browser",
246
- ];
247
-
248
- /**
249
- * Validates a preset name against the v3 preset list.
250
- * Returns the preset name if valid, throws if unrecognized.
251
- *
252
- * @param preset - The preset name to validate (must be a v3 name)
253
- * @returns The validated v3 preset name
254
- * @throws Error if the preset is not recognized
255
- */
256
- export function resolvePresetName(preset: string): string {
257
- if (VALID_V3_PRESETS.includes(preset)) return preset;
258
- throw new Error(
259
- `Unknown Nitro preset: "${preset}". Valid presets: ${VALID_V3_PRESETS.join(", ")}`
260
- );
261
- }
262
-
263
- /**
264
- * Default Nitro configuration values
265
- */
266
- export const DEFAULT_NITRO_CONFIG: Required<
267
- Pick<AvalonNitroConfig, "preset" | "serverDir" | "streaming">
268
- > = {
269
- preset: "node_server",
270
- serverDir: "server",
271
- streaming: true,
272
- };
273
-
274
- /**
275
- * Creates a Nitro configuration from Avalon plugin config and Nitro-specific options
276
- *
277
- * This function merges Avalon's resolved configuration with Nitro-specific options
278
- * to produce a complete Nitro configuration object. Avalon-specific settings are
279
- * stored in `runtimeConfig.avalon` for access by handlers.
280
- *
281
- * @param avalonNitroConfig - Nitro-specific configuration options
282
- * @param resolvedAvalonConfig - Resolved Avalon plugin configuration
283
- * @returns Complete Nitro configuration object
284
- *
285
- * @example
286
- * ```ts
287
- * const nitroConfig = createNitroConfig(
288
- * { preset: 'vercel', streaming: true },
289
- * resolvedAvalonConfig
290
- * );
291
- * ```
292
- */
293
- export function createNitroConfig(
294
- avalonNitroConfig: AvalonNitroConfig,
295
- resolvedAvalonConfig: ResolvedAvalonConfig
296
- ): NitroConfigOutput {
297
- // Determine final directory paths (Nitro config overrides Avalon config)
298
- const pagesDir = avalonNitroConfig.pagesDir ?? resolvedAvalonConfig.pagesDir;
299
- const layoutsDir = resolvedAvalonConfig.layoutsDir;
300
-
301
- // Build Avalon runtime config
302
- const avalonRuntimeConfig: AvalonRuntimeConfig = {
303
- streaming: avalonNitroConfig.streaming ?? DEFAULT_NITRO_CONFIG.streaming,
304
- pagesDir,
305
- layoutsDir,
306
- };
307
-
308
- // Validate that runtimeConfig does not contain a 'nitro' key (reserved in v3)
309
- if (avalonNitroConfig.runtimeConfig && "nitro" in avalonNitroConfig.runtimeConfig) {
310
- throw new Error(
311
- 'The "nitro" key in runtimeConfig is reserved by Nitro v3 and cannot be used.'
312
- );
313
- }
314
-
315
- // Merge user runtime config with Avalon runtime config
316
- const runtimeConfig: NitroConfigOutput["runtimeConfig"] = {
317
- avalon: avalonRuntimeConfig,
318
- ...avalonNitroConfig.runtimeConfig,
319
- };
320
-
321
- // Merge static assets config with defaults
322
- const staticAssetsConfig: StaticAssetsConfig = {
323
- ...DEFAULT_STATIC_ASSETS_CONFIG,
324
- ...avalonNitroConfig.staticAssets,
325
- };
326
-
327
- // Create default route rules for static assets
328
- const defaultStaticRouteRules = createDefaultStaticAssetRouteRules(staticAssetsConfig);
329
-
330
- // Merge user route rules with default static asset rules
331
- const routeRules = mergeRouteRules(
332
- defaultStaticRouteRules,
333
- avalonNitroConfig.routeRules ?? {}
334
- );
335
-
336
- // Configure public assets directories
337
- const publicAssets: NitroConfigOutput["publicAssets"] = [
338
- {
339
- dir: staticAssetsConfig.publicDir ?? DEFAULT_STATIC_ASSETS_CONFIG.publicDir,
340
- baseURL: "/",
341
- maxAge: 0, // Let route rules handle caching
342
- },
343
- ];
344
-
345
- // Resolve renderer: support explicit false to disable, otherwise use default handler
346
- const renderer: NitroConfigOutput["renderer"] =
347
- avalonNitroConfig.renderer === false
348
- ? false
349
- : (avalonNitroConfig.renderer ?? { handler: "./server/renderer.ts" });
350
-
351
- return {
352
- preset: resolvePresetName(avalonNitroConfig.preset ?? DEFAULT_NITRO_CONFIG.preset),
353
- serverDir: avalonNitroConfig.serverDir ?? DEFAULT_NITRO_CONFIG.serverDir,
354
- routeRules,
355
- runtimeConfig,
356
- publicRuntimeConfig: avalonNitroConfig.publicRuntimeConfig,
357
- renderer,
358
- compatibilityDate: avalonNitroConfig.compatibilityDate,
359
- traceDeps: avalonNitroConfig.traceDeps,
360
- rolldownConfig: avalonNitroConfig.rolldownConfig,
361
- serverEntry: avalonNitroConfig.serverEntry,
362
- compressPublicAssets: avalonNitroConfig.compressPublicAssets,
363
- publicAssets,
364
- staticAssets: staticAssetsConfig,
365
- };
366
- }
367
-
368
- /**
369
- * Creates default route rules for static asset caching
370
- *
371
- * @param config - Static assets configuration
372
- * @returns Route rules for static assets
373
- */
374
- export function createDefaultStaticAssetRouteRules(
375
- config: StaticAssetsConfig
376
- ): Record<string, RouteRule> {
377
- const cacheControl = config.cacheControl ?? DEFAULT_STATIC_ASSETS_CONFIG.cacheControl;
378
- const mutableCacheControl = config.mutableCacheControl ?? DEFAULT_STATIC_ASSETS_CONFIG.mutableCacheControl;
379
-
380
- return {
381
- // Immutable assets with hashed filenames (long cache)
382
- "/assets/**": {
383
- headers: {
384
- "Cache-Control": cacheControl,
385
- ...config.headers,
386
- },
387
- },
388
- "/islands/**": {
389
- headers: {
390
- "Cache-Control": cacheControl,
391
- ...config.headers,
392
- },
393
- },
394
- "/chunks/**": {
395
- headers: {
396
- "Cache-Control": cacheControl,
397
- ...config.headers,
398
- },
399
- },
400
- "/_nuxt/**": {
401
- headers: {
402
- "Cache-Control": cacheControl,
403
- ...config.headers,
404
- },
405
- },
406
- // Font files (long cache)
407
- "/**/*.woff": {
408
- headers: {
409
- "Cache-Control": cacheControl,
410
- ...config.headers,
411
- },
412
- },
413
- "/**/*.woff2": {
414
- headers: {
415
- "Cache-Control": cacheControl,
416
- ...config.headers,
417
- },
418
- },
419
- // Mutable assets (short cache with revalidation)
420
- "/**/*.html": {
421
- headers: {
422
- "Cache-Control": mutableCacheControl,
423
- ...config.headers,
424
- },
425
- },
426
- // Favicon (medium cache)
427
- "/favicon.ico": {
428
- headers: {
429
- "Cache-Control": "public, max-age=86400",
430
- ...config.headers,
431
- },
432
- },
433
- // CSS files in public directory (may be mutable)
434
- "/**/*.css": {
435
- headers: {
436
- "Cache-Control": mutableCacheControl,
437
- ...config.headers,
438
- },
439
- },
440
- };
441
- }
442
-
443
- /**
444
- * Validates a Nitro preset name against the v3 preset list
445
- *
446
- * @param preset - The preset name to validate
447
- * @returns True if the preset is a known valid v3 preset
448
- */
449
- export function isValidPreset(preset: string): boolean {
450
- return VALID_V3_PRESETS.includes(preset);
451
- }
452
-
453
- /**
454
- * Merges route rules, with later rules taking precedence
455
- *
456
- * @param baseRules - Base route rules
457
- * @param overrideRules - Override route rules
458
- * @returns Merged route rules
459
- */
460
- export function mergeRouteRules(
461
- baseRules: Record<string, RouteRule>,
462
- overrideRules: Record<string, RouteRule>
463
- ): Record<string, RouteRule> {
464
- const merged: Record<string, RouteRule> = { ...baseRules };
465
-
466
- for (const [pattern, rule] of Object.entries(overrideRules)) {
467
- if (merged[pattern]) {
468
- // Deep merge the rule
469
- merged[pattern] = {
470
- ...merged[pattern],
471
- ...rule,
472
- headers: {
473
- ...merged[pattern].headers,
474
- ...rule.headers,
475
- },
476
- };
477
- } else {
478
- merged[pattern] = rule;
479
- }
480
- }
481
-
482
- return merged;
483
- }