@useavalon/avalon 0.1.13 → 0.1.14

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/dist/mod.js +1 -0
  2. package/dist/src/build/integration-bundler-plugin.js +1 -0
  3. package/dist/src/build/integration-config.js +1 -0
  4. package/dist/src/build/integration-detection-plugin.js +1 -0
  5. package/dist/src/build/integration-resolver-plugin.js +1 -0
  6. package/dist/src/build/island-manifest.js +1 -0
  7. package/dist/src/build/island-types-generator.js +5 -0
  8. package/dist/src/build/mdx-island-transform.js +2 -0
  9. package/dist/src/build/mdx-plugin.js +1 -0
  10. package/dist/src/build/page-island-transform.js +3 -0
  11. package/dist/src/build/prop-extractors/index.js +1 -0
  12. package/dist/src/build/prop-extractors/lit.js +1 -0
  13. package/dist/src/build/prop-extractors/qwik.js +1 -0
  14. package/dist/src/build/prop-extractors/solid.js +1 -0
  15. package/dist/src/build/prop-extractors/svelte.js +1 -0
  16. package/dist/src/build/prop-extractors/vue.js +1 -0
  17. package/dist/src/build/sidecar-file-manager.js +1 -0
  18. package/dist/src/build/sidecar-renderer.js +6 -0
  19. package/dist/src/client/adapters/index.js +1 -0
  20. package/dist/src/client/components.js +1 -0
  21. package/dist/src/client/css-hmr-handler.js +1 -0
  22. package/dist/src/client/framework-adapter.js +13 -0
  23. package/dist/src/client/hmr-coordinator.js +1 -0
  24. package/dist/src/client/hmr-error-overlay.js +214 -0
  25. package/dist/src/client/main.js +39 -0
  26. package/dist/src/components/Image.js +1 -0
  27. package/dist/src/components/IslandErrorBoundary.js +1 -0
  28. package/dist/src/components/LayoutDataErrorBoundary.js +1 -0
  29. package/dist/src/components/LayoutErrorBoundary.js +1 -0
  30. package/dist/src/components/PersistentIsland.js +1 -0
  31. package/dist/src/components/StreamingErrorBoundary.js +1 -0
  32. package/dist/src/components/StreamingLayout.js +29 -0
  33. package/dist/src/core/components/component-analyzer.js +1 -0
  34. package/dist/src/core/components/component-detection.js +5 -0
  35. package/dist/src/core/components/enhanced-framework-detector.js +1 -0
  36. package/dist/src/core/components/framework-registry.js +1 -0
  37. package/dist/src/core/content/mdx-processor.js +1 -0
  38. package/dist/src/core/integrations/index.js +1 -0
  39. package/dist/src/core/integrations/loader.js +1 -0
  40. package/dist/src/core/integrations/registry.js +1 -0
  41. package/dist/src/core/islands/island-persistence.js +1 -0
  42. package/dist/src/core/islands/island-state-serializer.js +1 -0
  43. package/dist/src/core/islands/persistent-island-context.js +1 -0
  44. package/dist/src/core/islands/use-persistent-state.js +1 -0
  45. package/dist/src/core/layout/enhanced-layout-resolver.js +1 -0
  46. package/dist/src/core/layout/layout-cache-manager.js +1 -0
  47. package/dist/src/core/layout/layout-composer.js +1 -0
  48. package/dist/src/core/layout/layout-data-loader.js +1 -0
  49. package/dist/src/core/layout/layout-discovery.js +1 -0
  50. package/dist/src/core/layout/layout-matcher.js +1 -0
  51. package/dist/src/core/layout/layout-types.js +1 -0
  52. package/dist/src/core/modules/framework-module-resolver.js +1 -0
  53. package/dist/src/islands/component-analysis.js +1 -0
  54. package/dist/src/islands/css-utils.js +17 -0
  55. package/dist/src/islands/discovery/index.js +1 -0
  56. package/dist/src/islands/discovery/registry.js +1 -0
  57. package/dist/src/islands/discovery/resolver.js +2 -0
  58. package/dist/src/islands/discovery/scanner.js +1 -0
  59. package/dist/src/islands/discovery/types.js +1 -0
  60. package/dist/src/islands/discovery/validator.js +18 -0
  61. package/dist/src/islands/discovery/watcher.js +1 -0
  62. package/dist/src/islands/framework-detection.js +1 -0
  63. package/dist/src/islands/integration-loader.js +1 -0
  64. package/dist/src/islands/island.js +1 -0
  65. package/dist/src/islands/render-cache.js +1 -0
  66. package/dist/src/islands/types.js +1 -0
  67. package/dist/src/islands/universal-css-collector.js +5 -0
  68. package/dist/src/islands/universal-head-collector.js +2 -0
  69. package/dist/src/layout-system.js +1 -0
  70. package/dist/src/middleware/discovery.js +1 -0
  71. package/dist/src/middleware/executor.js +1 -0
  72. package/dist/src/middleware/index.js +1 -0
  73. package/dist/src/middleware/types.js +1 -0
  74. package/dist/src/nitro/build-config.js +1 -0
  75. package/dist/src/nitro/config.js +1 -0
  76. package/dist/src/nitro/error-handler.js +198 -0
  77. package/dist/src/nitro/index.js +1 -0
  78. package/dist/src/nitro/island-manifest.js +2 -0
  79. package/dist/src/nitro/middleware-adapter.js +1 -0
  80. package/dist/src/nitro/renderer.js +183 -0
  81. package/dist/src/nitro/route-discovery.js +1 -0
  82. package/dist/src/nitro/types.js +1 -0
  83. package/dist/src/render/collect-css.js +3 -0
  84. package/dist/src/render/error-pages.js +48 -0
  85. package/dist/src/render/isolated-ssr-renderer.js +1 -0
  86. package/dist/src/render/ssr.js +90 -0
  87. package/dist/src/schemas/api.js +1 -0
  88. package/dist/src/schemas/core.js +1 -0
  89. package/dist/src/schemas/index.js +1 -0
  90. package/dist/src/schemas/layout.js +1 -0
  91. package/dist/src/schemas/routing/index.js +1 -0
  92. package/dist/src/schemas/routing.js +1 -0
  93. package/dist/src/types/as-island.js +1 -0
  94. package/dist/src/types/layout.js +1 -0
  95. package/dist/src/types/routing.js +1 -0
  96. package/dist/src/types/types.js +1 -0
  97. package/dist/src/utils/dev-logger.js +12 -0
  98. package/dist/src/utils/fs.js +1 -0
  99. package/dist/src/vite-plugin/auto-discover.js +1 -0
  100. package/dist/src/vite-plugin/config.js +1 -0
  101. package/dist/src/vite-plugin/errors.js +1 -0
  102. package/dist/src/vite-plugin/image-optimization.js +45 -0
  103. package/dist/src/vite-plugin/integration-activator.js +1 -0
  104. package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -0
  105. package/dist/src/vite-plugin/module-discovery.js +1 -0
  106. package/dist/src/vite-plugin/nitro-integration.js +42 -0
  107. package/dist/src/vite-plugin/plugin.js +1 -0
  108. package/dist/src/vite-plugin/types.js +1 -0
  109. package/dist/src/vite-plugin/validation.js +2 -0
  110. package/package.json +14 -20
  111. package/mod.ts +0 -302
  112. package/src/build/integration-bundler-plugin.ts +0 -116
  113. package/src/build/integration-config.ts +0 -168
  114. package/src/build/integration-detection-plugin.ts +0 -117
  115. package/src/build/integration-resolver-plugin.ts +0 -90
  116. package/src/build/island-manifest.ts +0 -269
  117. package/src/build/island-types-generator.ts +0 -476
  118. package/src/build/mdx-island-transform.ts +0 -464
  119. package/src/build/mdx-plugin.ts +0 -98
  120. package/src/build/page-island-transform.ts +0 -598
  121. package/src/build/prop-extractors/index.ts +0 -21
  122. package/src/build/prop-extractors/lit.ts +0 -140
  123. package/src/build/prop-extractors/qwik.ts +0 -16
  124. package/src/build/prop-extractors/solid.ts +0 -125
  125. package/src/build/prop-extractors/svelte.ts +0 -194
  126. package/src/build/prop-extractors/vue.ts +0 -111
  127. package/src/build/sidecar-file-manager.ts +0 -104
  128. package/src/build/sidecar-renderer.ts +0 -30
  129. package/src/client/adapters/index.ts +0 -21
  130. package/src/client/components.ts +0 -35
  131. package/src/client/css-hmr-handler.ts +0 -344
  132. package/src/client/framework-adapter.ts +0 -462
  133. package/src/client/hmr-coordinator.ts +0 -396
  134. package/src/client/hmr-error-overlay.js +0 -533
  135. package/src/client/main.js +0 -824
  136. package/src/components/Image.tsx +0 -123
  137. package/src/components/IslandErrorBoundary.tsx +0 -145
  138. package/src/components/LayoutDataErrorBoundary.tsx +0 -141
  139. package/src/components/LayoutErrorBoundary.tsx +0 -127
  140. package/src/components/PersistentIsland.tsx +0 -52
  141. package/src/components/StreamingErrorBoundary.tsx +0 -233
  142. package/src/components/StreamingLayout.tsx +0 -538
  143. package/src/core/components/component-analyzer.ts +0 -192
  144. package/src/core/components/component-detection.ts +0 -508
  145. package/src/core/components/enhanced-framework-detector.ts +0 -500
  146. package/src/core/components/framework-registry.ts +0 -563
  147. package/src/core/content/mdx-processor.ts +0 -46
  148. package/src/core/integrations/index.ts +0 -19
  149. package/src/core/integrations/loader.ts +0 -125
  150. package/src/core/integrations/registry.ts +0 -175
  151. package/src/core/islands/island-persistence.ts +0 -325
  152. package/src/core/islands/island-state-serializer.ts +0 -258
  153. package/src/core/islands/persistent-island-context.tsx +0 -80
  154. package/src/core/islands/use-persistent-state.ts +0 -68
  155. package/src/core/layout/enhanced-layout-resolver.ts +0 -322
  156. package/src/core/layout/layout-cache-manager.ts +0 -485
  157. package/src/core/layout/layout-composer.ts +0 -357
  158. package/src/core/layout/layout-data-loader.ts +0 -516
  159. package/src/core/layout/layout-discovery.ts +0 -243
  160. package/src/core/layout/layout-matcher.ts +0 -299
  161. package/src/core/layout/layout-types.ts +0 -110
  162. package/src/core/modules/framework-module-resolver.ts +0 -273
  163. package/src/islands/component-analysis.ts +0 -213
  164. package/src/islands/css-utils.ts +0 -565
  165. package/src/islands/discovery/index.ts +0 -80
  166. package/src/islands/discovery/registry.ts +0 -340
  167. package/src/islands/discovery/resolver.ts +0 -477
  168. package/src/islands/discovery/scanner.ts +0 -386
  169. package/src/islands/discovery/types.ts +0 -117
  170. package/src/islands/discovery/validator.ts +0 -544
  171. package/src/islands/discovery/watcher.ts +0 -368
  172. package/src/islands/framework-detection.ts +0 -428
  173. package/src/islands/integration-loader.ts +0 -490
  174. package/src/islands/island.tsx +0 -565
  175. package/src/islands/render-cache.ts +0 -550
  176. package/src/islands/types.ts +0 -80
  177. package/src/islands/universal-css-collector.ts +0 -157
  178. package/src/islands/universal-head-collector.ts +0 -137
  179. package/src/layout-system.ts +0 -218
  180. package/src/middleware/discovery.ts +0 -268
  181. package/src/middleware/executor.ts +0 -315
  182. package/src/middleware/index.ts +0 -76
  183. package/src/middleware/types.ts +0 -99
  184. package/src/nitro/build-config.ts +0 -576
  185. package/src/nitro/config.ts +0 -483
  186. package/src/nitro/error-handler.ts +0 -636
  187. package/src/nitro/index.ts +0 -173
  188. package/src/nitro/island-manifest.ts +0 -584
  189. package/src/nitro/middleware-adapter.ts +0 -260
  190. package/src/nitro/renderer.ts +0 -1471
  191. package/src/nitro/route-discovery.ts +0 -439
  192. package/src/nitro/types.ts +0 -321
  193. package/src/render/collect-css.ts +0 -198
  194. package/src/render/error-pages.ts +0 -79
  195. package/src/render/isolated-ssr-renderer.ts +0 -654
  196. package/src/render/ssr.ts +0 -1030
  197. package/src/schemas/api.ts +0 -30
  198. package/src/schemas/core.ts +0 -64
  199. package/src/schemas/index.ts +0 -212
  200. package/src/schemas/layout.ts +0 -279
  201. package/src/schemas/routing/index.ts +0 -38
  202. package/src/schemas/routing.ts +0 -376
  203. package/src/types/as-island.ts +0 -20
  204. package/src/types/layout.ts +0 -285
  205. package/src/types/routing.ts +0 -555
  206. package/src/types/types.ts +0 -5
  207. package/src/utils/dev-logger.ts +0 -299
  208. package/src/utils/fs.ts +0 -151
  209. package/src/vite-plugin/auto-discover.ts +0 -551
  210. package/src/vite-plugin/config.ts +0 -266
  211. package/src/vite-plugin/errors.ts +0 -127
  212. package/src/vite-plugin/image-optimization.ts +0 -156
  213. package/src/vite-plugin/integration-activator.ts +0 -126
  214. package/src/vite-plugin/island-sidecar-plugin.ts +0 -176
  215. package/src/vite-plugin/module-discovery.ts +0 -189
  216. package/src/vite-plugin/nitro-integration.ts +0 -1354
  217. package/src/vite-plugin/plugin.ts +0 -403
  218. package/src/vite-plugin/types.ts +0 -327
  219. package/src/vite-plugin/validation.ts +0 -228
  220. /package/{src → dist/src}/client/types/framework-runtime.d.ts +0 -0
  221. /package/{src → dist/src}/client/types/vite-hmr.d.ts +0 -0
  222. /package/{src → dist/src}/client/types/vite-virtual-modules.d.ts +0 -0
  223. /package/{src → dist/src}/layout-system.d.ts +0 -0
  224. /package/{src → dist/src}/types/image.d.ts +0 -0
  225. /package/{src → dist/src}/types/index.d.ts +0 -0
  226. /package/{src → dist/src}/types/island-jsx.d.ts +0 -0
  227. /package/{src → dist/src}/types/island-prop.d.ts +0 -0
  228. /package/{src → dist/src}/types/mdx.d.ts +0 -0
  229. /package/{src → dist/src}/types/urlpattern.d.ts +0 -0
  230. /package/{src → dist/src}/types/vite-env.d.ts +0 -0
@@ -1,396 +0,0 @@
1
- /**
2
- * HMR Coordinator
3
- *
4
- * Central orchestrator for all HMR operations in Avalon.
5
- * Integrates with Vite's HMR API and coordinates island updates across frameworks.
6
- */
7
-
8
- /// <reference lib="dom" />
9
- /// <reference lib="dom.iterable" />
10
-
11
- import { type FrameworkHMRAdapter, type StateSnapshot, AdapterRegistry } from './framework-adapter.ts';
12
- import { getCSSHMRHandler } from './css-hmr-handler.ts';
13
-
14
- /**
15
- * Vite HMR types (defined locally to avoid import issues)
16
- */
17
- export interface HMRPayload {
18
- type: string;
19
- updates?: Update[];
20
- timestamp?: number;
21
- }
22
-
23
- export interface ErrorPayload {
24
- type: 'error';
25
- err: {
26
- message: string;
27
- stack: string;
28
- id?: string;
29
- frame?: string;
30
- plugin?: string;
31
- pluginCode?: string;
32
- loc?: {
33
- file?: string;
34
- line: number;
35
- column: number;
36
- };
37
- };
38
- }
39
-
40
- export interface Update {
41
- type: 'js-update' | 'css-update';
42
- path: string;
43
- acceptedPath: string;
44
- timestamp: number;
45
- explicitImportRequired?: boolean;
46
- }
47
-
48
- /**
49
- * HMR update payload from Vite
50
- */
51
- export interface HMRUpdatePayload extends HMRPayload {
52
- type: 'update' | 'full-reload' | 'prune' | 'error';
53
- updates?: ModuleUpdate[];
54
- timestamp?: number;
55
- err?: ErrorPayload;
56
- }
57
-
58
- /**
59
- * Individual module update information
60
- */
61
- export interface ModuleUpdate {
62
- type: 'js-update' | 'css-update';
63
- path: string;
64
- acceptedPath: string;
65
- timestamp: number;
66
- }
67
-
68
- // Re-export types for backward compatibility
69
- export type { FrameworkHMRAdapter, StateSnapshot } from './framework-adapter.ts';
70
-
71
- /**
72
- * HMR Coordinator class
73
- * Manages HMR lifecycle and coordinates updates across islands
74
- */
75
- export class HMRCoordinator {
76
- private readonly registry: AdapterRegistry = new AdapterRegistry();
77
- private readonly stateSnapshots: Map<string, StateSnapshot> = new Map();
78
- private readonly updateQueue: Set<string> = new Set();
79
- private isProcessing = false;
80
-
81
- /**
82
- * Initialize the HMR coordinator
83
- * Sets up Vite HMR listeners and accepts updates
84
- */
85
- initialize(): void {
86
- // @ts-ignore - Vite HMR is available in browser context
87
- if (!import.meta.hot) {
88
- return;
89
- }
90
-
91
- // @ts-ignore - Vite HMR API
92
- import.meta.hot.accept();
93
-
94
- // @ts-ignore - Vite HMR event types
95
- import.meta.hot.on('vite:beforeUpdate', (payload: HMRPayload) => {
96
- this.handleUpdate(payload as HMRUpdatePayload);
97
- });
98
-
99
- // @ts-ignore - Vite HMR event types
100
- import.meta.hot.on('vite:beforeFullReload', () => {
101
- this.handleBeforeFullReload();
102
- });
103
-
104
- // @ts-ignore - Vite HMR event types
105
- import.meta.hot.on('vite:error', (payload: ErrorPayload) => {
106
- console.error('[HMR] error:', payload);
107
- this.handleError(payload);
108
- });
109
-
110
- document.addEventListener('hmr-update-required', (event: Event) => {
111
- const customEvent = event as CustomEvent;
112
- const { src, reason } = customEvent.detail;
113
-
114
- if (reason === 'css-module-update') {
115
- this.updateQueue.add(this.normalizePath(src));
116
-
117
- if (!this.isProcessing) {
118
- this.processUpdateQueue().catch(error => {
119
- console.error('[HMR] Failed to process CSS module update:', error);
120
- });
121
- }
122
- }
123
- });
124
- }
125
-
126
- registerAdapter(framework: string, adapter: FrameworkHMRAdapter): void {
127
- this.registry.register(framework, adapter);
128
- }
129
-
130
- getRegistry(): AdapterRegistry {
131
- return this.registry;
132
- }
133
-
134
- async handleUpdate(payload: HMRUpdatePayload): Promise<void> {
135
- if (payload.type !== 'update' || !payload.updates) {
136
- return;
137
- }
138
-
139
- const cssUpdates: ModuleUpdate[] = [];
140
- const jsUpdates: ModuleUpdate[] = [];
141
-
142
- for (const update of payload.updates) {
143
- if (update.type === 'css-update') {
144
- cssUpdates.push(update);
145
- } else {
146
- jsUpdates.push(update);
147
- }
148
- }
149
-
150
- this.processCSSUpdates(cssUpdates);
151
- this.queueJSUpdates(jsUpdates);
152
-
153
- if (!this.isProcessing && this.updateQueue.size > 0) {
154
- await this.processUpdateQueue();
155
- }
156
- }
157
-
158
- private processCSSUpdates(cssUpdates: ModuleUpdate[]): void {
159
- if (cssUpdates.length === 0) return;
160
-
161
- const cssHandler = getCSSHMRHandler();
162
- for (const cssUpdate of cssUpdates) {
163
- try {
164
- cssHandler.handleCSSUpdate(cssUpdate);
165
- } catch (error) {
166
- console.error('[HMR] CSS update failed:', error);
167
- }
168
- }
169
- }
170
-
171
- private queueJSUpdates(jsUpdates: ModuleUpdate[]): void {
172
- for (const update of jsUpdates) {
173
- const normalizedPath = this.normalizePath(update.path || update.acceptedPath);
174
- if (this.isIslandModule(normalizedPath)) {
175
- this.updateQueue.add(normalizedPath);
176
- }
177
- }
178
- }
179
-
180
- private async processUpdateQueue(): Promise<void> {
181
- if (this.updateQueue.size === 0) return;
182
-
183
- this.isProcessing = true;
184
-
185
- try {
186
- const paths = Array.from(this.updateQueue);
187
- this.updateQueue.clear();
188
-
189
- for (const path of paths) {
190
- const islands = this.findAffectedIslands(path);
191
- for (const island of islands) {
192
- try {
193
- await this.updateIsland(island);
194
- } catch (error) {
195
- console.error('[HMR] Failed to update island:', error);
196
- }
197
- }
198
- }
199
- } finally {
200
- this.isProcessing = false;
201
- }
202
- }
203
-
204
- findAffectedIslands(modulePath: string): HTMLElement[] {
205
- const islands: HTMLElement[] = [];
206
- const normalizedPath = this.normalizePath(modulePath);
207
- const allIslands = document.querySelectorAll<HTMLElement>('[data-src]');
208
-
209
- for (const island of allIslands) {
210
- const src = island.dataset.src;
211
- if (!src) continue;
212
-
213
- const normalizedSrc = this.normalizePath(src);
214
- const isMatch =
215
- normalizedSrc === normalizedPath ||
216
- normalizedSrc.endsWith(normalizedPath) ||
217
- normalizedPath.endsWith(normalizedSrc) ||
218
- normalizedSrc.split('/').pop() === normalizedPath.split('/').pop();
219
-
220
- if (isMatch) {
221
- islands.push(island);
222
- }
223
- }
224
-
225
- return islands;
226
- }
227
-
228
- async updateIsland(island: HTMLElement): Promise<void> {
229
- const framework = island.dataset.framework;
230
- const src = island.dataset.src;
231
- const propsAttr = island.dataset.props;
232
-
233
- if (!framework || !src) {
234
- console.warn('[HMR] Island missing framework or src attribute', island);
235
- return;
236
- }
237
-
238
- const adapter = this.registry.get(framework.toLowerCase());
239
- if (!adapter) {
240
- console.warn(`[HMR] No adapter registered for framework: ${framework}`);
241
- return;
242
- }
243
-
244
- try {
245
- const props = propsAttr ? JSON.parse(propsAttr) : {};
246
- const state = adapter.preserveState(island);
247
-
248
- if (state) {
249
- this.stateSnapshots.set(this.getIslandId(island), state);
250
- }
251
-
252
- delete island.dataset.hydrated;
253
- delete island.dataset.hydrationStatus;
254
-
255
- island.querySelector('.hydration-error-indicator, .hmr-error-indicator')?.remove();
256
-
257
- const timestamp = Date.now();
258
- const freshSrc = src.includes('?') ? `${src}&t=${timestamp}` : `${src}?t=${timestamp}`;
259
- const componentModule = await import(/* @vite-ignore */ freshSrc);
260
- const Component = this.resolveComponent(componentModule, src);
261
-
262
- await adapter.update(island, Component, props);
263
-
264
- if (state) {
265
- adapter.restoreState(island, state);
266
- this.stateSnapshots.delete(this.getIslandId(island));
267
- }
268
-
269
- island.dataset.hydrated = 'true';
270
-
271
- island.dispatchEvent(
272
- new CustomEvent('hmr-update', {
273
- detail: { framework, src, timestamp: Date.now(), success: true },
274
- bubbles: true,
275
- }),
276
- );
277
- } catch (error) {
278
- console.error(`[HMR] Failed to update ${framework} island ${src}:`, error);
279
- adapter.handleError(island, error as Error);
280
-
281
- island.dispatchEvent(
282
- new CustomEvent('hmr-error', {
283
- detail: { framework, src, error: (error as Error).message, timestamp: Date.now() },
284
- bubbles: true,
285
- }),
286
- );
287
-
288
- throw error;
289
- }
290
- }
291
-
292
- private resolveComponent(componentModule: Record<string, unknown>, src: string): unknown {
293
- if (componentModule.default) return componentModule.default;
294
-
295
- for (const key of Object.keys(componentModule)) {
296
- if (key === 'default') continue;
297
- const value = componentModule[key];
298
- if (typeof value === 'function' && value.prototype) {
299
- return value;
300
- }
301
- }
302
-
303
- throw new Error(`Component ${src} has no default export`);
304
- }
305
-
306
- private handleBeforeFullReload(): void {
307
- const islands = document.querySelectorAll<HTMLElement>('[data-hydrated="true"]');
308
- const states: Record<string, StateSnapshot> = {};
309
-
310
- for (const island of islands) {
311
- const framework = island.dataset.framework;
312
- const src = island.dataset.src;
313
-
314
- if (!framework || !src) continue;
315
-
316
- const adapter = this.registry.get(framework.toLowerCase());
317
- if (!adapter) continue;
318
-
319
- const state = adapter.preserveState(island);
320
- if (state) {
321
- states[src] = state;
322
- }
323
- }
324
-
325
- try {
326
- sessionStorage.setItem('__avalon_hmr_states__', JSON.stringify(states));
327
- } catch (error) {
328
- console.warn('[HMR] Failed to save states:', error);
329
- }
330
- }
331
-
332
- private handleError(payload: ErrorPayload): void {
333
- const error = new Error(payload.err.message);
334
- error.stack = payload.err.stack;
335
-
336
- console.error('[HMR] Error:', error);
337
-
338
- if (globalThis.window !== undefined) {
339
- // @ts-ignore - dynamic import of JS file
340
- import('./hmr-error-overlay.js')
341
- .then(({ showHMRErrorOverlay }: { showHMRErrorOverlay: (opts: Record<string, unknown>) => void }) => {
342
- showHMRErrorOverlay({
343
- framework: 'unknown',
344
- src: 'unknown',
345
- error,
346
- filePath: payload.err.id || payload.err.loc?.file || 'unknown',
347
- line: payload.err.loc?.line,
348
- column: payload.err.loc?.column,
349
- });
350
- })
351
- .catch(() => {
352
- console.error('[HMR] Failed to show error overlay');
353
- });
354
- }
355
- }
356
-
357
- private normalizePath(path: string): string {
358
- return path
359
- .replaceAll('\\', '/')
360
- .replace(/^\//, '')
361
- .replace(/\?.*$/, '')
362
- .replace(/#.*$/, '')
363
- .replace(/^src\//, '');
364
- }
365
-
366
- private isIslandModule(path: string): boolean {
367
- return path.includes('/islands/') || path.includes('\\islands\\');
368
- }
369
-
370
- private getIslandId(island: HTMLElement): string {
371
- const src = island.dataset.src ?? '';
372
- const framework = island.dataset.framework ?? '';
373
- const index = Array.from(document.querySelectorAll(`[data-src="${src}"]`)).indexOf(island);
374
- return `${framework}:${src}:${index}`;
375
- }
376
- }
377
-
378
- /**
379
- * Global HMR coordinator instance
380
- */
381
- let coordinatorInstance: HMRCoordinator | null = null;
382
-
383
- export function getHMRCoordinator(): HMRCoordinator {
384
- coordinatorInstance ??= new HMRCoordinator();
385
- return coordinatorInstance;
386
- }
387
-
388
- export function initializeHMR(): void {
389
- // @ts-ignore - Vite HMR is available in browser context
390
- if (!import.meta.hot) {
391
- return;
392
- }
393
-
394
- const coordinator = getHMRCoordinator();
395
- coordinator.initialize();
396
- }