@useavalon/avalon 0.1.12 → 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 (230) hide show
  1. package/mod.ts +302 -0
  2. package/package.json +9 -17
  3. package/src/build/integration-bundler-plugin.ts +116 -0
  4. package/src/build/integration-config.ts +168 -0
  5. package/src/build/integration-detection-plugin.ts +117 -0
  6. package/src/build/integration-resolver-plugin.ts +90 -0
  7. package/src/build/island-manifest.ts +269 -0
  8. package/src/build/island-types-generator.ts +476 -0
  9. package/src/build/mdx-island-transform.ts +464 -0
  10. package/src/build/mdx-plugin.ts +98 -0
  11. package/src/build/page-island-transform.ts +598 -0
  12. package/src/build/prop-extractors/index.ts +21 -0
  13. package/src/build/prop-extractors/lit.ts +140 -0
  14. package/src/build/prop-extractors/qwik.ts +16 -0
  15. package/src/build/prop-extractors/solid.ts +125 -0
  16. package/src/build/prop-extractors/svelte.ts +194 -0
  17. package/src/build/prop-extractors/vue.ts +111 -0
  18. package/src/build/sidecar-file-manager.ts +104 -0
  19. package/src/build/sidecar-renderer.ts +30 -0
  20. package/src/client/adapters/index.ts +21 -0
  21. package/src/client/components.ts +35 -0
  22. package/src/client/css-hmr-handler.ts +344 -0
  23. package/src/client/framework-adapter.ts +462 -0
  24. package/src/client/hmr-coordinator.ts +396 -0
  25. package/src/client/hmr-error-overlay.js +533 -0
  26. package/src/client/main.js +824 -0
  27. package/src/components/Image.tsx +123 -0
  28. package/src/components/IslandErrorBoundary.tsx +145 -0
  29. package/src/components/LayoutDataErrorBoundary.tsx +141 -0
  30. package/src/components/LayoutErrorBoundary.tsx +127 -0
  31. package/src/components/PersistentIsland.tsx +52 -0
  32. package/src/components/StreamingErrorBoundary.tsx +233 -0
  33. package/src/components/StreamingLayout.tsx +538 -0
  34. package/src/core/components/component-analyzer.ts +192 -0
  35. package/src/core/components/component-detection.ts +508 -0
  36. package/src/core/components/enhanced-framework-detector.ts +500 -0
  37. package/src/core/components/framework-registry.ts +563 -0
  38. package/src/core/content/mdx-processor.ts +46 -0
  39. package/src/core/integrations/index.ts +19 -0
  40. package/src/core/integrations/loader.ts +125 -0
  41. package/src/core/integrations/registry.ts +175 -0
  42. package/src/core/islands/island-persistence.ts +325 -0
  43. package/src/core/islands/island-state-serializer.ts +258 -0
  44. package/src/core/islands/persistent-island-context.tsx +80 -0
  45. package/src/core/islands/use-persistent-state.ts +68 -0
  46. package/src/core/layout/enhanced-layout-resolver.ts +322 -0
  47. package/src/core/layout/layout-cache-manager.ts +485 -0
  48. package/src/core/layout/layout-composer.ts +357 -0
  49. package/src/core/layout/layout-data-loader.ts +516 -0
  50. package/src/core/layout/layout-discovery.ts +243 -0
  51. package/src/core/layout/layout-matcher.ts +299 -0
  52. package/src/core/layout/layout-types.ts +110 -0
  53. package/src/core/modules/framework-module-resolver.ts +273 -0
  54. package/src/islands/component-analysis.ts +213 -0
  55. package/src/islands/css-utils.ts +565 -0
  56. package/src/islands/discovery/index.ts +80 -0
  57. package/src/islands/discovery/registry.ts +340 -0
  58. package/src/islands/discovery/resolver.ts +477 -0
  59. package/src/islands/discovery/scanner.ts +386 -0
  60. package/src/islands/discovery/types.ts +117 -0
  61. package/src/islands/discovery/validator.ts +544 -0
  62. package/src/islands/discovery/watcher.ts +368 -0
  63. package/src/islands/framework-detection.ts +428 -0
  64. package/src/islands/integration-loader.ts +490 -0
  65. package/src/islands/island.tsx +565 -0
  66. package/src/islands/render-cache.ts +550 -0
  67. package/src/islands/types.ts +80 -0
  68. package/src/islands/universal-css-collector.ts +157 -0
  69. package/src/islands/universal-head-collector.ts +137 -0
  70. package/src/layout-system.ts +218 -0
  71. package/src/middleware/discovery.ts +268 -0
  72. package/src/middleware/executor.ts +315 -0
  73. package/src/middleware/index.ts +76 -0
  74. package/src/middleware/types.ts +99 -0
  75. package/src/nitro/build-config.ts +576 -0
  76. package/src/nitro/config.ts +483 -0
  77. package/src/nitro/error-handler.ts +636 -0
  78. package/src/nitro/index.ts +173 -0
  79. package/src/nitro/island-manifest.ts +584 -0
  80. package/src/nitro/middleware-adapter.ts +260 -0
  81. package/src/nitro/renderer.ts +1471 -0
  82. package/src/nitro/route-discovery.ts +439 -0
  83. package/src/nitro/types.ts +321 -0
  84. package/src/render/collect-css.ts +198 -0
  85. package/src/render/error-pages.ts +79 -0
  86. package/src/render/isolated-ssr-renderer.ts +654 -0
  87. package/src/render/ssr.ts +1030 -0
  88. package/src/schemas/api.ts +30 -0
  89. package/src/schemas/core.ts +64 -0
  90. package/src/schemas/index.ts +212 -0
  91. package/src/schemas/layout.ts +279 -0
  92. package/src/schemas/routing/index.ts +38 -0
  93. package/src/schemas/routing.ts +376 -0
  94. package/src/types/as-island.ts +20 -0
  95. package/src/types/layout.ts +285 -0
  96. package/src/types/routing.ts +555 -0
  97. package/src/types/types.ts +5 -0
  98. package/src/utils/dev-logger.ts +299 -0
  99. package/src/utils/fs.ts +151 -0
  100. package/src/vite-plugin/auto-discover.ts +551 -0
  101. package/src/vite-plugin/config.ts +266 -0
  102. package/src/vite-plugin/errors.ts +127 -0
  103. package/src/vite-plugin/image-optimization.ts +156 -0
  104. package/src/vite-plugin/integration-activator.ts +126 -0
  105. package/src/vite-plugin/island-sidecar-plugin.ts +176 -0
  106. package/src/vite-plugin/module-discovery.ts +189 -0
  107. package/src/vite-plugin/nitro-integration.ts +1354 -0
  108. package/src/vite-plugin/plugin.ts +403 -0
  109. package/src/vite-plugin/types.ts +327 -0
  110. package/src/vite-plugin/validation.ts +228 -0
  111. package/dist/mod.js +0 -1
  112. package/dist/src/build/integration-bundler-plugin.js +0 -1
  113. package/dist/src/build/integration-config.js +0 -1
  114. package/dist/src/build/integration-detection-plugin.js +0 -1
  115. package/dist/src/build/integration-resolver-plugin.js +0 -1
  116. package/dist/src/build/island-manifest.js +0 -1
  117. package/dist/src/build/island-types-generator.js +0 -5
  118. package/dist/src/build/mdx-island-transform.js +0 -2
  119. package/dist/src/build/mdx-plugin.js +0 -1
  120. package/dist/src/build/page-island-transform.js +0 -3
  121. package/dist/src/build/prop-extractors/index.js +0 -1
  122. package/dist/src/build/prop-extractors/lit.js +0 -1
  123. package/dist/src/build/prop-extractors/qwik.js +0 -1
  124. package/dist/src/build/prop-extractors/solid.js +0 -1
  125. package/dist/src/build/prop-extractors/svelte.js +0 -1
  126. package/dist/src/build/prop-extractors/vue.js +0 -1
  127. package/dist/src/build/sidecar-file-manager.js +0 -1
  128. package/dist/src/build/sidecar-renderer.js +0 -6
  129. package/dist/src/client/adapters/index.js +0 -1
  130. package/dist/src/client/components.js +0 -1
  131. package/dist/src/client/css-hmr-handler.js +0 -1
  132. package/dist/src/client/framework-adapter.js +0 -13
  133. package/dist/src/client/hmr-coordinator.js +0 -1
  134. package/dist/src/client/hmr-error-overlay.js +0 -214
  135. package/dist/src/client/main.js +0 -39
  136. package/dist/src/components/Image.js +0 -1
  137. package/dist/src/components/IslandErrorBoundary.js +0 -1
  138. package/dist/src/components/LayoutDataErrorBoundary.js +0 -1
  139. package/dist/src/components/LayoutErrorBoundary.js +0 -1
  140. package/dist/src/components/PersistentIsland.js +0 -1
  141. package/dist/src/components/StreamingErrorBoundary.js +0 -1
  142. package/dist/src/components/StreamingLayout.js +0 -29
  143. package/dist/src/core/components/component-analyzer.js +0 -1
  144. package/dist/src/core/components/component-detection.js +0 -5
  145. package/dist/src/core/components/enhanced-framework-detector.js +0 -1
  146. package/dist/src/core/components/framework-registry.js +0 -1
  147. package/dist/src/core/content/mdx-processor.js +0 -1
  148. package/dist/src/core/integrations/index.js +0 -1
  149. package/dist/src/core/integrations/loader.js +0 -1
  150. package/dist/src/core/integrations/registry.js +0 -1
  151. package/dist/src/core/islands/island-persistence.js +0 -1
  152. package/dist/src/core/islands/island-state-serializer.js +0 -1
  153. package/dist/src/core/islands/persistent-island-context.js +0 -1
  154. package/dist/src/core/islands/use-persistent-state.js +0 -1
  155. package/dist/src/core/layout/enhanced-layout-resolver.js +0 -1
  156. package/dist/src/core/layout/layout-cache-manager.js +0 -1
  157. package/dist/src/core/layout/layout-composer.js +0 -1
  158. package/dist/src/core/layout/layout-data-loader.js +0 -1
  159. package/dist/src/core/layout/layout-discovery.js +0 -1
  160. package/dist/src/core/layout/layout-matcher.js +0 -1
  161. package/dist/src/core/layout/layout-types.js +0 -1
  162. package/dist/src/core/modules/framework-module-resolver.js +0 -1
  163. package/dist/src/islands/component-analysis.js +0 -1
  164. package/dist/src/islands/css-utils.js +0 -17
  165. package/dist/src/islands/discovery/index.js +0 -1
  166. package/dist/src/islands/discovery/registry.js +0 -1
  167. package/dist/src/islands/discovery/resolver.js +0 -2
  168. package/dist/src/islands/discovery/scanner.js +0 -1
  169. package/dist/src/islands/discovery/types.js +0 -1
  170. package/dist/src/islands/discovery/validator.js +0 -18
  171. package/dist/src/islands/discovery/watcher.js +0 -1
  172. package/dist/src/islands/framework-detection.js +0 -1
  173. package/dist/src/islands/integration-loader.js +0 -1
  174. package/dist/src/islands/island.js +0 -1
  175. package/dist/src/islands/render-cache.js +0 -1
  176. package/dist/src/islands/types.js +0 -1
  177. package/dist/src/islands/universal-css-collector.js +0 -5
  178. package/dist/src/islands/universal-head-collector.js +0 -2
  179. package/dist/src/layout-system.js +0 -1
  180. package/dist/src/middleware/discovery.js +0 -1
  181. package/dist/src/middleware/executor.js +0 -1
  182. package/dist/src/middleware/index.js +0 -1
  183. package/dist/src/middleware/types.js +0 -1
  184. package/dist/src/nitro/build-config.js +0 -1
  185. package/dist/src/nitro/config.js +0 -1
  186. package/dist/src/nitro/error-handler.js +0 -198
  187. package/dist/src/nitro/index.js +0 -1
  188. package/dist/src/nitro/island-manifest.js +0 -2
  189. package/dist/src/nitro/middleware-adapter.js +0 -1
  190. package/dist/src/nitro/renderer.js +0 -183
  191. package/dist/src/nitro/route-discovery.js +0 -1
  192. package/dist/src/nitro/types.js +0 -1
  193. package/dist/src/render/collect-css.js +0 -3
  194. package/dist/src/render/error-pages.js +0 -48
  195. package/dist/src/render/isolated-ssr-renderer.js +0 -1
  196. package/dist/src/render/ssr.js +0 -90
  197. package/dist/src/schemas/api.js +0 -1
  198. package/dist/src/schemas/core.js +0 -1
  199. package/dist/src/schemas/index.js +0 -1
  200. package/dist/src/schemas/layout.js +0 -1
  201. package/dist/src/schemas/routing/index.js +0 -1
  202. package/dist/src/schemas/routing.js +0 -1
  203. package/dist/src/types/as-island.js +0 -1
  204. package/dist/src/types/layout.js +0 -1
  205. package/dist/src/types/routing.js +0 -1
  206. package/dist/src/types/types.js +0 -1
  207. package/dist/src/utils/dev-logger.js +0 -12
  208. package/dist/src/utils/fs.js +0 -1
  209. package/dist/src/vite-plugin/auto-discover.js +0 -1
  210. package/dist/src/vite-plugin/config.js +0 -1
  211. package/dist/src/vite-plugin/errors.js +0 -1
  212. package/dist/src/vite-plugin/image-optimization.js +0 -45
  213. package/dist/src/vite-plugin/integration-activator.js +0 -1
  214. package/dist/src/vite-plugin/island-sidecar-plugin.js +0 -1
  215. package/dist/src/vite-plugin/module-discovery.js +0 -1
  216. package/dist/src/vite-plugin/nitro-integration.js +0 -42
  217. package/dist/src/vite-plugin/plugin.js +0 -1
  218. package/dist/src/vite-plugin/types.js +0 -1
  219. package/dist/src/vite-plugin/validation.js +0 -2
  220. /package/{dist/src → src}/client/types/framework-runtime.d.ts +0 -0
  221. /package/{dist/src → src}/client/types/vite-hmr.d.ts +0 -0
  222. /package/{dist/src → src}/client/types/vite-virtual-modules.d.ts +0 -0
  223. /package/{dist/src → src}/layout-system.d.ts +0 -0
  224. /package/{dist/src → src}/types/image.d.ts +0 -0
  225. /package/{dist/src → src}/types/index.d.ts +0 -0
  226. /package/{dist/src → src}/types/island-jsx.d.ts +0 -0
  227. /package/{dist/src → src}/types/island-prop.d.ts +0 -0
  228. /package/{dist/src → src}/types/mdx.d.ts +0 -0
  229. /package/{dist/src → src}/types/urlpattern.d.ts +0 -0
  230. /package/{dist/src → src}/types/vite-env.d.ts +0 -0
@@ -0,0 +1,322 @@
1
+ import { render as preactRenderToString } from 'preact-render-to-string';
2
+
3
+ import { LayoutDiscovery } from './layout-discovery.ts';
4
+ import { LayoutMatcher } from './layout-matcher.ts';
5
+ import { LayoutComposer } from './layout-composer.ts';
6
+ import { LayoutDataLoader } from './layout-data-loader.ts';
7
+ import { LayoutCacheManager, defaultCacheConfig } from './layout-cache-manager.ts';
8
+ import type {
9
+ ComponentType,
10
+ LayoutContext,
11
+ LayoutData,
12
+ LayoutHandler,
13
+ LayoutProps,
14
+ LayoutDiscoveryOptions,
15
+ ResolvedLayout,
16
+ LayoutCache,
17
+ LayoutErrorInfo,
18
+ PageModule,
19
+ } from './layout-types.ts';
20
+
21
+ /**
22
+ * Call a ComponentType as a plain function regardless of whether
23
+ * it's a class constructor or a function component.
24
+ */
25
+ function callComponent<P>(component: ComponentType<P>, props: P): unknown {
26
+ return (component as (props: P) => unknown)(props);
27
+ }
28
+
29
+ interface IEnhancedLayoutResolver {
30
+ resolveAndRender(routePath: string, pageModule: PageModule, context: LayoutContext): Promise<ResolvedLayout>;
31
+ getCachedResolution(routePath: string): ResolvedLayout | null;
32
+ clearCache(): void;
33
+ setCaching(enabled: boolean): void;
34
+ }
35
+
36
+ /**
37
+ * Enhanced Layout Resolver Options
38
+ */
39
+ export interface EnhancedLayoutResolverOptions extends LayoutDiscoveryOptions {
40
+ enableCaching?: boolean;
41
+ cacheTTL?: number;
42
+ maxCacheSize?: number;
43
+ enableMetrics?: boolean;
44
+ enableDebugInfo?: boolean;
45
+ }
46
+
47
+ /**
48
+ * Simplified Enhanced Layout Resolver
49
+ * Handles: discovery → conditional filtering → composition → data loading → rendering
50
+ */
51
+ export class EnhancedLayoutResolver implements IEnhancedLayoutResolver {
52
+ private readonly layoutDiscovery: LayoutDiscovery;
53
+ private readonly layoutMatcher: LayoutMatcher;
54
+ private readonly layoutComposer: LayoutComposer;
55
+ private readonly layoutDataLoader: LayoutDataLoader;
56
+ private readonly cache: LayoutCache;
57
+ private readonly cacheManager: LayoutCacheManager;
58
+ private readonly options: Required<EnhancedLayoutResolverOptions>;
59
+
60
+ constructor(options: EnhancedLayoutResolverOptions) {
61
+ this.options = {
62
+ baseDirectory: options.baseDirectory,
63
+ filePattern: options.filePattern || '_layout.tsx',
64
+ excludeDirectories: options.excludeDirectories || ['node_modules', '.git', 'dist'],
65
+ enableWatching: options.enableWatching || false,
66
+ developmentMode: options.developmentMode || false,
67
+ enableCaching: options.enableCaching ?? true,
68
+ cacheTTL: options.cacheTTL || 5 * 60 * 1000,
69
+ maxCacheSize: options.maxCacheSize || 1000,
70
+ enableMetrics: options.enableMetrics ?? true,
71
+ enableDebugInfo: options.enableDebugInfo || false,
72
+ };
73
+
74
+ this.layoutDiscovery = new LayoutDiscovery(this.options);
75
+ this.layoutMatcher = new LayoutMatcher({ developmentMode: this.options.developmentMode });
76
+ this.layoutComposer = new LayoutComposer(this.options);
77
+ this.layoutDataLoader = new LayoutDataLoader({
78
+ developmentMode: this.options.developmentMode,
79
+ enableParallelLoading: true,
80
+ continueOnError: true,
81
+ });
82
+
83
+ this.cache = {
84
+ resolved: new Map<string, ResolvedLayout>(),
85
+ handlers: new Map<string, LayoutHandler>(),
86
+ data: new Map<string, LayoutData>(),
87
+ ttl: new Map<string, number>(),
88
+ };
89
+
90
+ this.cacheManager = new LayoutCacheManager({
91
+ ...defaultCacheConfig,
92
+ defaultTtl: this.options.cacheTTL,
93
+ maxEntries: this.options.maxCacheSize,
94
+ enableStats: this.options.enableMetrics,
95
+ });
96
+ }
97
+
98
+ /**
99
+ * Resolve layout chain for a route
100
+ */
101
+ async resolveLayouts(routePath: string, pageModule: PageModule, context: LayoutContext): Promise<ResolvedLayout> {
102
+ const startTime = performance.now();
103
+ const cacheKey = this.generateCacheKey(routePath, pageModule, context);
104
+
105
+ // Check cache first
106
+ if (this.options.enableCaching) {
107
+ const cached = this.cacheManager.getResolvedLayout(cacheKey);
108
+ if (cached) {
109
+ if (this.options.developmentMode) {
110
+ console.log(`[EnhancedLayoutResolver] Cache hit for route: ${routePath}`);
111
+ }
112
+ return { ...cached, metadata: { ...cached.metadata, cacheHit: true } };
113
+ }
114
+ }
115
+
116
+ const errors: LayoutErrorInfo[] = [];
117
+ let handlers: LayoutHandler[] = [];
118
+
119
+ try {
120
+ // Stage 1–3: Composition Control (subsumes discovery + filtering)
121
+ handlers = await this.layoutComposer.resolveLayouts(routePath, pageModule);
122
+
123
+ // Stage 4: Data Loading
124
+ const loadingResults = await this.layoutDataLoader.loadLayoutData(handlers, context);
125
+ const { errors: loadErrors } = this.layoutDataLoader.processLoadingResults(loadingResults, handlers);
126
+ errors.push(...loadErrors);
127
+
128
+ } catch (error) {
129
+ errors.push({ layoutPath: routePath, errorType: 'rendering', timestamp: Date.now() });
130
+ if (this.options.developmentMode) {
131
+ console.warn(`[EnhancedLayoutResolver] Error resolving layouts:`, error);
132
+ }
133
+ }
134
+
135
+ const totalTime = performance.now() - startTime;
136
+ const resolvedLayout: ResolvedLayout = {
137
+ handlers,
138
+ dataLoaders: handlers.map(h => h.loader).filter((l): l is (ctx: LayoutContext) => Promise<LayoutData> => l !== undefined),
139
+ errorBoundaries: [],
140
+ streamingComponents: [],
141
+ metadata: { totalLayouts: handlers.length, resolutionTime: totalTime, cacheHit: false },
142
+ };
143
+
144
+ // Cache the result
145
+ if (this.options.enableCaching) {
146
+ this.cacheManager.setResolvedLayout(cacheKey, resolvedLayout);
147
+ for (const handler of handlers) {
148
+ this.cacheManager.addDependency(cacheKey, handler.path);
149
+ }
150
+ }
151
+
152
+ if (this.options.developmentMode) {
153
+ if (errors.length > 0) {
154
+ console.warn(`[EnhancedLayoutResolver] ${errors.length} error(s) during layout resolution for ${routePath}`);
155
+ }
156
+ console.log(`[EnhancedLayoutResolver] Resolved ${handlers.length} layouts for ${routePath} in ${totalTime.toFixed(2)}ms`);
157
+ }
158
+
159
+ return resolvedLayout;
160
+ }
161
+
162
+ /**
163
+ * Resolve and render complete layout chain
164
+ */
165
+ async resolveAndRender(routePath: string, pageModule: PageModule, context: LayoutContext): Promise<ResolvedLayout> {
166
+ const resolvedLayout = await this.resolveLayouts(routePath, pageModule, context);
167
+
168
+ if (this.options.developmentMode) {
169
+ console.log(`[EnhancedLayoutResolver] Rendering ${resolvedLayout.handlers.length} layouts for ${routePath}`);
170
+ }
171
+
172
+ const loadingResults = await this.layoutDataLoader.loadLayoutData(resolvedLayout.handlers, context);
173
+ const { data } = this.layoutDataLoader.processLoadingResults(loadingResults, resolvedLayout.handlers);
174
+
175
+ if (this.options.developmentMode) {
176
+ this.renderLayoutsToString(resolvedLayout, pageModule, context, data);
177
+ }
178
+
179
+ return resolvedLayout;
180
+ }
181
+
182
+ private renderLayoutsToString(
183
+ resolvedLayout: ResolvedLayout,
184
+ pageModule: PageModule,
185
+ context: LayoutContext,
186
+ layoutData: LayoutData[] = []
187
+ ): string {
188
+ try {
189
+ const PageComponent = (pageModule.default ?? (() => null)) as unknown as ComponentType<LayoutProps>;
190
+ let currentComponent: ComponentType<LayoutProps> = PageComponent;
191
+
192
+ for (let i = resolvedLayout.handlers.length - 1; i >= 0; i--) {
193
+ const handler = resolvedLayout.handlers[i];
194
+ const LayoutComponent = handler.component;
195
+ const previousComponent = currentComponent;
196
+ const layoutDataForThis: LayoutData = layoutData[i] || {};
197
+
198
+ currentComponent = (props: LayoutProps) => callComponent(LayoutComponent, {
199
+ ...props,
200
+ data: layoutDataForThis,
201
+ frontmatter: pageModule.frontmatter,
202
+ children: callComponent(previousComponent, props),
203
+ });
204
+ }
205
+
206
+ return preactRenderToString(
207
+ callComponent(currentComponent, {
208
+ children: null,
209
+ data: {},
210
+ route: {
211
+ path: new URL(context.request.url).pathname,
212
+ params: context.params,
213
+ query: context.query,
214
+ },
215
+ }) as Parameters<typeof preactRenderToString>[0]
216
+ );
217
+ } catch (error) {
218
+ if (this.options.developmentMode) {
219
+ console.warn('[EnhancedLayoutResolver] Rendering failed:', error);
220
+ }
221
+ return '';
222
+ }
223
+ }
224
+
225
+ getCachedResolution(cacheKey: string): ResolvedLayout | null {
226
+ return this.cacheManager.getResolvedLayout(cacheKey);
227
+ }
228
+
229
+ invalidateCacheByFilePath(filePath: string): number {
230
+ return this.cacheManager.invalidateByFilePath(filePath);
231
+ }
232
+
233
+ clearCache(): void {
234
+ this.cacheManager.clear();
235
+ (this.cache.resolved).clear();
236
+ (this.cache.handlers).clear();
237
+ (this.cache.data).clear();
238
+ (this.cache.ttl).clear();
239
+ this.layoutDiscovery.clearCache();
240
+ this.layoutComposer.clearCache();
241
+ }
242
+
243
+ setCaching(enabled: boolean): void {
244
+ this.options.enableCaching = enabled;
245
+ if (!enabled) this.clearCache();
246
+ }
247
+
248
+ private generateCacheKey(routePath: string, pageModule: PageModule, context: LayoutContext): string {
249
+ const pageConfigHash = pageModule.layoutConfig ? JSON.stringify(pageModule.layoutConfig) : '';
250
+ return `${routePath}:${pageConfigHash}:${context.request.method}:${context.request.url}`;
251
+ }
252
+
253
+
254
+ getResolverStats(): {
255
+ cacheSize: number;
256
+ cacheHitRate: number;
257
+ totalResolutions: number;
258
+ averageResolutionTime: number;
259
+ errorCount: number;
260
+ cacheStats: ReturnType<LayoutCacheManager['getStats']>;
261
+ discoveryStats: ReturnType<LayoutDiscovery['getCacheStats']>;
262
+ } {
263
+ const cacheStats = this.cacheManager.getStats();
264
+ const discoveryStats = this.layoutDiscovery.getCacheStats();
265
+ return {
266
+ cacheSize: cacheStats.totalEntries,
267
+ cacheHitRate: this.cacheManager.getHitRate(),
268
+ totalResolutions: cacheStats.hits + cacheStats.misses,
269
+ averageResolutionTime: 0,
270
+ errorCount: 0,
271
+ cacheStats,
272
+ discoveryStats,
273
+ };
274
+ }
275
+
276
+ updateOptions(options: Partial<EnhancedLayoutResolverOptions>): void {
277
+ Object.assign(this.options, options);
278
+ if (options.developmentMode !== undefined) {
279
+ this.layoutDataLoader.updateOptions({ developmentMode: options.developmentMode });
280
+ }
281
+ }
282
+
283
+ getOptions(): Required<EnhancedLayoutResolverOptions> {
284
+ return { ...this.options };
285
+ }
286
+
287
+ getLayoutDiscovery(): LayoutDiscovery { return this.layoutDiscovery; }
288
+ getLayoutMatcher(): LayoutMatcher { return this.layoutMatcher; }
289
+ getLayoutComposer(): LayoutComposer { return this.layoutComposer; }
290
+ getLayoutDataLoader(): LayoutDataLoader { return this.layoutDataLoader; }
291
+ getCacheManager(): LayoutCacheManager { return this.cacheManager; }
292
+
293
+ destroy(): void {
294
+ this.cacheManager.destroy();
295
+ }
296
+ }
297
+
298
+ export function createEnhancedLayoutResolver(options: EnhancedLayoutResolverOptions): EnhancedLayoutResolver {
299
+ return new EnhancedLayoutResolver(options);
300
+ }
301
+
302
+ export const EnhancedLayoutResolverUtils = {
303
+ createBasicConfig(baseDirectory: string, developmentMode = false): EnhancedLayoutResolverOptions {
304
+ return {
305
+ baseDirectory,
306
+ developmentMode,
307
+ enableCaching: true,
308
+ enableMetrics: developmentMode,
309
+ enableDebugInfo: developmentMode,
310
+ };
311
+ },
312
+
313
+ createProductionConfig(baseDirectory: string): EnhancedLayoutResolverOptions {
314
+ return {
315
+ baseDirectory,
316
+ developmentMode: false,
317
+ enableCaching: true,
318
+ enableMetrics: false,
319
+ enableDebugInfo: false,
320
+ };
321
+ },
322
+ };