@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,451 +0,0 @@
1
- /**
2
- * Solid HMR Adapter
3
- *
4
- * Provides Hot Module Replacement support for Solid components using Solid Refresh.
5
- * Integrates with vite-plugin-solid to preserve signal subscriptions and reactive computations.
6
- * Handles Solid's fine-grained reactivity system during hot updates.
7
- *
8
- * Requirements: 2.5
9
- */
10
-
11
- /// <reference lib="dom" />
12
-
13
- import { BaseFrameworkAdapter, type StateSnapshot } from '../framework-adapter.ts';
14
-
15
- /**
16
- * Solid component type
17
- * Solid components are functions that return JSX
18
- */
19
- type SolidComponent<P = Record<string, unknown>> = (props: P) => unknown;
20
-
21
- /**
22
- * Solid Web module interface
23
- */
24
- interface SolidWebModule {
25
- hydrate(
26
- fn: () => unknown,
27
- node: HTMLElement,
28
- options?: { renderId?: string }
29
- ): () => void;
30
- render(
31
- fn: () => unknown,
32
- node: HTMLElement
33
- ): () => void;
34
- createComponent<P>(
35
- component: SolidComponent<P>,
36
- props: P
37
- ): unknown;
38
- }
39
-
40
- /**
41
- * Solid HMR Runtime interface
42
- * Provided by vite-plugin-solid for hot module replacement
43
- */
44
- interface SolidHMRRuntime {
45
- /**
46
- * Create a record for a component
47
- */
48
- createRecord(id: string, component: SolidComponent): void;
49
-
50
- /**
51
- * Reload a component
52
- */
53
- reload(id: string, component: SolidComponent): void;
54
-
55
- /**
56
- * Update component
57
- */
58
- update(id: string, component: SolidComponent): void;
59
- }
60
-
61
- /**
62
- * Global Solid HMR runtime
63
- * Injected by vite-plugin-solid
64
- */
65
- declare global {
66
- var __SOLID_HMR__: SolidHMRRuntime | undefined;
67
- }
68
-
69
- /**
70
- * Solid-specific state snapshot
71
- * Extends base snapshot with Solid-specific state like signal values
72
- */
73
- interface SolidStateSnapshot extends StateSnapshot {
74
- framework: 'solid';
75
- data: {
76
- /**
77
- * Signal values captured from component
78
- * Note: Solid's fine-grained reactivity makes this challenging
79
- */
80
- signalValues?: Record<string, unknown>;
81
-
82
- /**
83
- * Component display name for debugging
84
- */
85
- componentName?: string;
86
-
87
- /**
88
- * Props at time of state capture
89
- */
90
- capturedProps?: Record<string, unknown>;
91
-
92
- /**
93
- * Render ID for hydration
94
- */
95
- renderId?: string;
96
- };
97
- }
98
-
99
- /**
100
- * Solid HMR Adapter
101
- *
102
- * Leverages Solid Refresh (provided by vite-plugin-solid) to:
103
- * - Preserve signal subscriptions across updates
104
- * - Maintain reactive computations
105
- * - Handle component updates without full remount
106
- *
107
- * Solid Refresh works through the __SOLID_HMR__ API:
108
- * 1. When a component module is updated, Vite sends an HMR event
109
- * 2. We use __SOLID_HMR__.reload() to hot-reload the component
110
- * 3. Solid Refresh preserves signal subscriptions automatically
111
- * 4. Reactive computations are maintained across updates
112
- * 5. The component re-renders with preserved reactive state
113
- */
114
- export class SolidHMRAdapter extends BaseFrameworkAdapter {
115
- readonly name = 'solid';
116
-
117
- /**
118
- * Store Solid dispose functions for each island to enable proper cleanup
119
- */
120
- private disposers: WeakMap<HTMLElement, () => void> = new WeakMap();
121
-
122
- /**
123
- * Store component IDs for HMR runtime
124
- */
125
- private componentIds: WeakMap<HTMLElement, string> = new WeakMap();
126
-
127
- /**
128
- * Check if a component is a Solid component
129
- *
130
- * Solid components are:
131
- * - Functions that return JSX
132
- * - May use createSignal, createEffect, etc.
133
- * - Typically have .solid.tsx extension (but not always)
134
- */
135
- canHandle(component: unknown): boolean {
136
- if (!component) return false;
137
-
138
- // Check if it's a function (Solid components are functions)
139
- if (typeof component === 'function') {
140
- const comp = component as unknown as Record<string, unknown>;
141
-
142
- // Check for Solid-specific markers
143
- // Solid components may have __solid marker from vite-plugin-solid
144
- if (comp.__solid) {
145
- return true;
146
- }
147
-
148
- // Check function signature - Solid components typically accept props
149
- // and return JSX (which is compiled to function calls)
150
- try {
151
- const funcStr = component.toString();
152
-
153
- // Look for Solid-specific patterns
154
- // - createSignal, createEffect, createMemo, etc.
155
- // - JSX patterns (though this is less reliable after compilation)
156
- if (
157
- funcStr.includes('createSignal') ||
158
- funcStr.includes('createEffect') ||
159
- funcStr.includes('createMemo') ||
160
- funcStr.includes('createResource') ||
161
- funcStr.includes('createStore') ||
162
- funcStr.includes('_$') || // Solid's compiled JSX helper prefix
163
- funcStr.includes('_tmpl$') // Solid's template marker
164
- ) {
165
- return true;
166
- }
167
- } catch {
168
- // Ignore errors from toString()
169
- }
170
-
171
- // If we can't determine definitively, assume it could be a Solid component
172
- // if it's a function (Solid components are just functions)
173
- // This is a fallback - we'll let Solid's hydration handle validation
174
- return true;
175
- }
176
-
177
- // Check if it's a Solid component object (wrapped or exported)
178
- if (typeof component !== 'object') {
179
- return false;
180
- }
181
-
182
- const obj = component as Record<string, unknown>;
183
-
184
- // Check for default export pattern
185
- if (obj.default && typeof obj.default === 'function') {
186
- return this.canHandle(obj.default);
187
- }
188
-
189
- // Check for Solid component markers
190
- if (obj.__solid) {
191
- return true;
192
- }
193
-
194
- return false;
195
- }
196
-
197
- /**
198
- * Preserve Solid component state before HMR update
199
- *
200
- * Solid Refresh handles most state preservation automatically through
201
- * its fine-grained reactivity system. We capture additional DOM state
202
- * and props for fallback.
203
- *
204
- * Note: Solid's signals are not easily accessible from outside the component,
205
- * so we rely on Solid Refresh to preserve them.
206
- */
207
- override preserveState(island: HTMLElement): SolidStateSnapshot | null {
208
- try {
209
- // Get base DOM state
210
- const baseSnapshot = super.preserveState(island);
211
- if (!baseSnapshot) return null;
212
-
213
- // Get Solid-specific data
214
- const propsAttr = island.getAttribute('data-props');
215
- const capturedProps = propsAttr ? JSON.parse(propsAttr) : {};
216
-
217
- // Try to get component name from the island
218
- const src = island.getAttribute('data-src') || '';
219
- const componentName = this.extractComponentName(src);
220
-
221
- // Get render ID for hydration
222
- const renderId = island.dataset.solidRenderId || island.dataset.renderId;
223
-
224
- const solidSnapshot: SolidStateSnapshot = {
225
- ...baseSnapshot,
226
- framework: 'solid',
227
- data: {
228
- componentName,
229
- capturedProps,
230
- renderId,
231
- },
232
- };
233
-
234
- return solidSnapshot;
235
- } catch (error) {
236
- console.warn('Failed to preserve Solid state:', error);
237
- return null;
238
- }
239
- }
240
-
241
- /**
242
- * Update Solid component with HMR
243
- *
244
- * This method integrates with Solid Refresh:
245
- * 1. Solid Refresh is automatically enabled by vite-plugin-solid
246
- * 2. When a module updates, Vite sends an HMR event
247
- * 3. We use __SOLID_HMR__ to reload the component
248
- * 4. Solid Refresh preserves signal subscriptions automatically
249
- * 5. Reactive computations are maintained
250
- * 6. The component re-renders with preserved reactive state
251
- */
252
- async update(
253
- island: HTMLElement,
254
- newComponent: unknown,
255
- props: Record<string, unknown>
256
- ): Promise<void> {
257
- if (!this.canHandle(newComponent)) {
258
- throw new Error('Component is not a valid Solid component');
259
- }
260
-
261
- // Extract the actual component function
262
- let Component: SolidComponent;
263
- if (typeof newComponent === 'object' && newComponent !== null) {
264
- const obj = newComponent as Record<string, unknown>;
265
- if (obj.default && typeof obj.default === 'function') {
266
- Component = obj.default as SolidComponent;
267
- } else {
268
- throw new Error('Solid component object must have a default export');
269
- }
270
- } else if (typeof newComponent === 'function') {
271
- Component = newComponent as SolidComponent;
272
- } else {
273
- throw new Error('Invalid Solid component type');
274
- }
275
-
276
- try {
277
- // Check if we have an existing disposer
278
- const existingDisposer = this.disposers.get(island);
279
- const componentId = this.componentIds.get(island);
280
-
281
- // Try to use Solid HMR runtime if available
282
- const hmrRuntime = globalThis.__SOLID_HMR__;
283
-
284
- if (hmrRuntime && componentId) {
285
- // Use Solid's HMR runtime for hot reload
286
- // This preserves signal subscriptions and reactive computations automatically
287
- try {
288
- hmrRuntime.reload(componentId, Component);
289
-
290
- // If we have an existing component, Solid Refresh handles the update
291
- // We don't need to do anything else
292
- if (existingDisposer) {
293
- return;
294
- }
295
- } catch (error) {
296
- console.warn('Solid HMR runtime reload failed, falling back to full remount:', error);
297
- }
298
- }
299
-
300
- // Clean up existing component if present
301
- if (existingDisposer) {
302
- try {
303
- existingDisposer();
304
- this.disposers.delete(island);
305
- } catch (error) {
306
- console.warn('Failed to dispose existing Solid component:', error);
307
- }
308
- }
309
-
310
- // Dynamically import Solid at runtime
311
- // This is resolved by Vite in the browser
312
- const solidWebModule = await import('solid-js/web') as SolidWebModule;
313
- const { hydrate, createComponent } = solidWebModule;
314
-
315
- // Get render ID for hydration
316
- const renderId = island.dataset.solidRenderId || island.dataset.renderId;
317
-
318
- // Check if we have SSR content to hydrate
319
-
320
- // Hydrate or render the component
321
- const dispose = hydrate(
322
- () => createComponent(Component, props),
323
- island,
324
- {
325
- renderId,
326
- }
327
- );
328
-
329
- // Store disposer for future updates
330
- this.disposers.set(island, dispose);
331
-
332
- // Generate component ID for HMR runtime
333
- const src = island.getAttribute('data-src') || '';
334
- const newComponentId = this.generateComponentId(src);
335
- this.componentIds.set(island, newComponentId);
336
-
337
- // Register with HMR runtime if available
338
- if (hmrRuntime) {
339
- try {
340
- hmrRuntime.createRecord(newComponentId, Component);
341
- } catch (error) {
342
- console.warn('Failed to register with Solid HMR runtime:', error);
343
- }
344
- }
345
-
346
- // Mark as hydrated
347
- island.setAttribute('data-hydrated', 'true');
348
- island.setAttribute('data-hydration-status', 'success');
349
-
350
- } catch (error) {
351
- console.error('Solid HMR update failed:', error);
352
- island.setAttribute('data-hydration-status', 'error');
353
- throw error;
354
- }
355
- }
356
-
357
- /**
358
- * Restore Solid component state after HMR update
359
- *
360
- * Solid Refresh handles most state restoration automatically through
361
- * its fine-grained reactivity system. We restore DOM state (scroll, focus,
362
- * form values) as a supplement.
363
- */
364
- override restoreState(island: HTMLElement, state: StateSnapshot): void {
365
- try {
366
- // Restore DOM state (scroll, focus, form values)
367
- super.restoreState(island, state);
368
-
369
- // Solid Refresh handles signal subscriptions and reactive computations
370
- // automatically, so we don't need to do anything special here
371
-
372
- } catch (error) {
373
- console.warn('Failed to restore Solid state:', error);
374
- }
375
- }
376
-
377
- /**
378
- * Handle errors during Solid HMR update
379
- *
380
- * Provides Solid-specific error handling with helpful messages
381
- */
382
- override handleError(island: HTMLElement, error: Error): void {
383
- console.error('Solid HMR error:', error);
384
-
385
- // Use base error handling
386
- super.handleError(island, error);
387
-
388
- // Add Solid-specific error information
389
- const errorIndicator = island.querySelector('.hmr-error-indicator');
390
- if (errorIndicator) {
391
- const errorMessage = error.message;
392
-
393
- // Provide helpful hints for common Solid errors
394
- let hint = '';
395
- if (errorMessage.includes('signal') || errorMessage.includes('Signal')) {
396
- hint = ' (Hint: Check signal usage - signals must be called as functions)';
397
- } else if (errorMessage.includes('effect') || errorMessage.includes('Effect')) {
398
- hint = ' (Hint: Check effect usage - effects run after render)';
399
- } else if (errorMessage.includes('hydration') || errorMessage.includes('hydrate')) {
400
- hint = ' (Hint: Server and client render must match)';
401
- } else if (errorMessage.includes('createSignal') || errorMessage.includes('createEffect')) {
402
- hint = ' (Hint: Solid primitives must be called inside component functions)';
403
- } else if (errorMessage.includes('reactive')) {
404
- hint = ' (Hint: Check reactive dependencies - they must be accessed inside tracking scopes)';
405
- }
406
-
407
- errorIndicator.textContent = `Solid HMR Error: ${errorMessage}${hint}`;
408
- }
409
- }
410
-
411
- /**
412
- * Extract component name from source path
413
- * Used for debugging and error messages
414
- */
415
- private extractComponentName(src: string): string {
416
- const parts = src.split('/');
417
- const filename = parts[parts.length - 1];
418
- return filename.replace(/\.solid\.(tsx?|jsx?)$/, '').replace(/\.(tsx?|jsx?)$/, '');
419
- }
420
-
421
- /**
422
- * Generate a unique component ID for HMR runtime
423
- */
424
- private generateComponentId(src: string): string {
425
- // Use the source path as the component ID
426
- // This ensures consistency across HMR updates
427
- return src.replace(/[^a-zA-Z0-9]/g, '_');
428
- }
429
-
430
- /**
431
- * Clean up Solid component when island is removed
432
- * This should be called when an island is unmounted
433
- */
434
- unmount(island: HTMLElement): void {
435
- const disposer = this.disposers.get(island);
436
- if (disposer) {
437
- try {
438
- disposer();
439
- this.disposers.delete(island);
440
- this.componentIds.delete(island);
441
- } catch (error) {
442
- console.warn('Failed to unmount Solid component:', error);
443
- }
444
- }
445
- }
446
- }
447
-
448
- /**
449
- * Create and export a singleton instance of the Solid HMR adapter
450
- */
451
- export const solidAdapter = new SolidHMRAdapter();