@useavalon/avalon 0.1.10 → 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 -401
  249. package/src/vite-plugin/types.ts +0 -327
  250. package/src/vite-plugin/validation.ts +0 -228
@@ -1,368 +0,0 @@
1
- /**
2
- * Svelte HMR Adapter
3
- *
4
- * Provides Hot Module Replacement support for Svelte 5 components.
5
- * Integrates with @sveltejs/vite-plugin-svelte for HMR updates.
6
- *
7
- * IMPORTANT: Svelte 5 HMR Behavior
8
- * - HMR is controlled via compilerOptions.hmr in the Vite plugin config
9
- * - Local state is NOT preserved during HMR (by design in Svelte 5)
10
- * - CSS-only changes DO preserve state (100% preserved)
11
- * - Store subscriptions are maintained across updates
12
- * - The component is remounted with fresh state on JS changes
13
- *
14
- * Requirements: 2.4
15
- */
16
- /// <reference lib="dom" />
17
- import { BaseFrameworkAdapter } from "../framework-adapter.js";
18
- /**
19
- * Svelte HMR Adapter
20
- *
21
- * Handles HMR for Svelte 5 components in the Avalon islands architecture.
22
- *
23
- * Svelte 5 HMR Behavior:
24
- * - HMR is controlled via compilerOptions.hmr in the Vite plugin config
25
- * - Local state is NOT preserved during HMR (by design in Svelte 5)
26
- * - CSS-only changes DO preserve state (100% preserved)
27
- * - Store subscriptions are maintained across updates
28
- * - The component is remounted with fresh state on JS changes
29
- *
30
- * How it works:
31
- * 1. When a component module is updated, Vite sends an HMR event
32
- * 2. Svelte's compiler-integrated HMR handles the update
33
- * 3. We clean up the old instance and mount the new component
34
- * 4. DOM state (scroll, focus, form values) is preserved where possible
35
- * 5. The component re-renders with fresh state
36
- */
37
- export class SvelteHMRAdapter extends BaseFrameworkAdapter {
38
- name = "svelte";
39
- /**
40
- * Store Svelte component instances for each island to enable proper cleanup
41
- */
42
- instances = new WeakMap();
43
- /**
44
- * Store component IDs for tracking
45
- */
46
- componentIds = new WeakMap();
47
- /**
48
- * Store active store subscriptions for cleanup
49
- */
50
- storeSubscriptions = new WeakMap();
51
- /**
52
- * Check if a function/class has Svelte component markers
53
- */
54
- isSvelteFunction(component) {
55
- const comp = component;
56
- if (comp.$$render) {
57
- return true;
58
- }
59
- const proto = component.prototype;
60
- if (proto && (proto.$set && proto.$destroy || proto.$$)) {
61
- return true;
62
- }
63
- try {
64
- const funcStr = component.toString();
65
- if (funcStr.includes("$set") || funcStr.includes("$destroy") || funcStr.includes("$$")) {
66
- return true;
67
- }
68
- } catch {}
69
- return false;
70
- }
71
- /**
72
- * Check if a component is a Svelte component
73
- *
74
- * Svelte components are compiled to classes with specific markers:
75
- * - Constructor function
76
- * - $$render method (SSR marker)
77
- * - Prototype with $set, $destroy methods
78
- */
79
- canHandle(component) {
80
- if (!component) return false;
81
- if (typeof component === "function") {
82
- return this.isSvelteFunction(component);
83
- }
84
- if (typeof component !== "object") {
85
- return false;
86
- }
87
- const obj = component;
88
- if (obj.default && typeof obj.default === "function") {
89
- return this.canHandle(obj.default);
90
- }
91
- return obj.$$render !== undefined;
92
- }
93
- /**
94
- * Preserve Svelte component state before HMR update
95
- *
96
- * Note: In Svelte 5, local state is NOT preserved during HMR (by design).
97
- * We capture DOM state (scroll, focus, form values) which CAN be restored.
98
- */
99
- preserveState(island) {
100
- try {
101
- // Get base DOM state
102
- const baseSnapshot = super.preserveState(island);
103
- if (!baseSnapshot) return null;
104
- // Get Svelte-specific data
105
- const propsAttr = island.dataset.props;
106
- const capturedProps = propsAttr ? JSON.parse(propsAttr) : {};
107
- // Try to get component name from the island
108
- const src = island.dataset.src || "";
109
- const componentName = this.extractComponentName(src);
110
- // Note: In Svelte 5, local state is not preserved during HMR
111
- // We still capture it for debugging purposes, but it won't be restored
112
- const localState = this.captureLocalState(island);
113
- // Store values are maintained by Svelte's reactivity system
114
- const storeValues = this.captureStoreValues(island);
115
- const svelteSnapshot = {
116
- ...baseSnapshot,
117
- framework: "svelte",
118
- data: {
119
- componentName,
120
- capturedProps,
121
- localState,
122
- storeValues
123
- }
124
- };
125
- return svelteSnapshot;
126
- } catch (error) {
127
- console.warn("Failed to preserve Svelte state:", error);
128
- return null;
129
- }
130
- }
131
- /**
132
- * Extract the Svelte component class from a module or function
133
- */
134
- extractComponent(newComponent) {
135
- if (typeof newComponent === "object" && newComponent !== null) {
136
- const obj = newComponent;
137
- if (obj.default && typeof obj.default === "function") {
138
- return obj.default;
139
- }
140
- throw new Error("Svelte component object must have a default export");
141
- }
142
- if (typeof newComponent === "function") {
143
- return newComponent;
144
- }
145
- throw new TypeError("Invalid Svelte component type");
146
- }
147
- /**
148
- * Clean up an existing Svelte component instance
149
- */
150
- async cleanupInstance(island, instance) {
151
- try {
152
- const subscriptions = this.storeSubscriptions.get(island);
153
- if (subscriptions) {
154
- subscriptions.forEach((unsubscribe) => unsubscribe());
155
- this.storeSubscriptions.delete(island);
156
- }
157
- const svelteModule = await import("svelte");
158
- const svelteUnmount = svelteModule.unmount;
159
- if (svelteUnmount) {
160
- svelteUnmount(instance);
161
- } else if (instance.$destroy) {
162
- instance.$destroy();
163
- }
164
- } catch {
165
- if (instance.$destroy) {
166
- instance.$destroy();
167
- }
168
- }
169
- }
170
- /**
171
- * Mount a Svelte component, trying Svelte 5 API first then falling back to constructor
172
- */
173
- async mountComponent(Component, island, props) {
174
- try {
175
- const svelteModule = await import("svelte");
176
- const svelteMount = svelteModule.mount;
177
- if (svelteMount) {
178
- return svelteMount(Component, {
179
- target: island,
180
- props
181
- });
182
- }
183
- return new Component({
184
- target: island,
185
- props,
186
- hydrate: false,
187
- intro: false
188
- });
189
- } catch (svelte5Error) {
190
- console.debug("Svelte 5 API not available, using constructor API:", svelte5Error);
191
- return new Component({
192
- target: island,
193
- props,
194
- hydrate: false,
195
- intro: false
196
- });
197
- }
198
- }
199
- /**
200
- * Update Svelte component with HMR
201
- *
202
- * Svelte 5 HMR Behavior:
203
- * - HMR is handled by the Svelte compiler via compilerOptions.hmr
204
- * - Local state is NOT preserved (by design)
205
- * - CSS-only changes preserve state 100%
206
- * - We clean up the old instance and mount the new component
207
- */
208
- async update(island, newComponent, props) {
209
- if (!this.canHandle(newComponent)) {
210
- throw new Error("Component is not a valid Svelte component");
211
- }
212
- const Component = this.extractComponent(newComponent);
213
- try {
214
- const existingInstance = this.instances.get(island);
215
- if (existingInstance) {
216
- await this.cleanupInstance(island, existingInstance).catch((error) => {
217
- console.warn("Failed to destroy existing Svelte instance:", error);
218
- });
219
- }
220
- island.innerHTML = "";
221
- const instance = await this.mountComponent(Component, island, props);
222
- this.instances.set(island, instance);
223
- const src = island.dataset.src || "";
224
- this.componentIds.set(island, this.generateComponentId(src));
225
- island.dataset.hydrated = "true";
226
- island.dataset.hydrationStatus = "success";
227
- } catch (error) {
228
- console.error("Svelte HMR update failed:", error);
229
- island.dataset.hydrationStatus = "error";
230
- throw error;
231
- }
232
- }
233
- /**
234
- * Restore Svelte component state after HMR update
235
- *
236
- * Note: In Svelte 5, local state is NOT preserved during HMR (by design).
237
- * We only restore DOM state (scroll, focus, form values).
238
- */
239
- restoreState(island, state) {
240
- try {
241
- // Restore DOM state (scroll, focus, form values)
242
- super.restoreState(island, state);
243
- } catch (error) {
244
- console.warn("Failed to restore Svelte state:", error);
245
- }
246
- }
247
- /**
248
- * Handle errors during Svelte HMR update
249
- *
250
- * Provides Svelte-specific error handling with helpful messages
251
- */
252
- handleError(island, error) {
253
- console.error("Svelte HMR error:", error);
254
- // Use base error handling
255
- super.handleError(island, error);
256
- // Add Svelte-specific error information
257
- const errorIndicator = island.querySelector(".hmr-error-indicator");
258
- if (errorIndicator) {
259
- const errorMessage = error.message;
260
- // Provide helpful hints for common Svelte errors
261
- let hint = "";
262
- if (errorMessage.includes("$:") || errorMessage.includes("reactive")) {
263
- hint = " (Hint: Check reactive statements ($:) - they must be at component top level)";
264
- } else if (errorMessage.includes("store")) {
265
- hint = " (Hint: Check store usage - stores must be imported and subscribed correctly)";
266
- } else if (errorMessage.includes("hydration") || errorMessage.includes("hydrate")) {
267
- hint = " (Hint: Server and client render must match)";
268
- } else if (errorMessage.includes("target")) {
269
- hint = " (Hint: Check component target - it must be a valid DOM element)";
270
- } else if (errorMessage.includes("props")) {
271
- hint = " (Hint: Check component props - they must match the component definition)";
272
- }
273
- errorIndicator.textContent = `Svelte HMR Error: ${errorMessage}${hint}`;
274
- }
275
- }
276
- /**
277
- * Extract component name from source path
278
- * Used for debugging and error messages
279
- */
280
- extractComponentName(src) {
281
- const parts = src.split("/");
282
- const filename = parts.at(-1) ?? "";
283
- return filename.replace(/\.svelte$/, "");
284
- }
285
- /**
286
- * Detect if an island has existing SSR content vs being an empty container
287
- *
288
- * @param island - Island element to check
289
- * @returns True if island has SSR content
290
- */
291
- detectSSRContent(island) {
292
- // Check if element has any meaningful content
293
- const hasTextContent = island.textContent && island.textContent.trim().length > 0;
294
- const hasChildElements = island.children && island.children.length > 0;
295
- const hasAttributes = island.dataset.ssrContent !== undefined || island.dataset.svelteRendered !== undefined;
296
- // Consider it SSR content if it has text, child elements, or explicit markers
297
- return hasTextContent || hasChildElements || hasAttributes;
298
- }
299
- /**
300
- * Generate a unique component ID for HMR runtime
301
- */
302
- generateComponentId(src) {
303
- // Use the source path as the component ID
304
- // This ensures consistency across HMR updates
305
- return src.replaceAll(/[^a-zA-Z0-9]/g, "_");
306
- }
307
- /**
308
- * Attempt to capture local state from Svelte instance
309
- * This is best-effort and may not work in all cases
310
- */
311
- captureLocalState(island) {
312
- try {
313
- const instance = this.instances.get(island);
314
- if (!instance) return undefined;
315
- // Try to access Svelte's internal state
316
- // This is internal API and may change, so we wrap in try-catch
317
- const internalState = instance.$$;
318
- if (internalState?.ctx) {
319
- // ctx is an array of component state values
320
- // We can't easily map these back to variable names,
321
- // so we just store the raw values
322
- return {
323
- ctx: internalState.ctx,
324
- props: internalState.props,
325
- bound: internalState.bound
326
- };
327
- }
328
- return undefined;
329
- } catch (error) {
330
- // Silently fail - this is best-effort
331
- console.debug("Could not capture Svelte local state:", error);
332
- return undefined;
333
- }
334
- }
335
- /**
336
- * Attempt to capture store values
337
- * This is best-effort and may not work in all cases
338
- */
339
- captureStoreValues(_island) {
340
- // Svelte stores are typically imported at module level,
341
- // so we can't easily access them from the component instance
342
- // The HMR system should handle store subscriptions automatically
343
- // We could potentially track stores if we intercept store.subscribe calls,
344
- // but that would require modifying the Svelte runtime, which is not feasible
345
- // For now, we rely on Svelte's HMR to preserve store subscriptions
346
- return undefined;
347
- }
348
- /**
349
- * Clean up Svelte component when island is removed
350
- * This should be called when an island is unmounted
351
- */
352
- async unmount(_island) {
353
- const instance = this.instances.get(_island);
354
- if (instance) {
355
- try {
356
- await this.cleanupInstance(_island, instance);
357
- this.instances.delete(_island);
358
- this.componentIds.delete(_island);
359
- } catch (error) {
360
- console.warn("Failed to unmount Svelte component:", error);
361
- }
362
- }
363
- }
364
- }
365
- /**
366
- * Create and export a singleton instance of the Svelte HMR adapter
367
- */
368
- export const svelteAdapter = new SvelteHMRAdapter();