@useavalon/avalon 0.1.11 → 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 (141) hide show
  1. package/README.md +54 -54
  2. package/mod.ts +302 -302
  3. package/package.json +49 -26
  4. package/src/build/integration-bundler-plugin.ts +116 -116
  5. package/src/build/integration-config.ts +168 -168
  6. package/src/build/integration-detection-plugin.ts +117 -117
  7. package/src/build/integration-resolver-plugin.ts +90 -90
  8. package/src/build/island-manifest.ts +269 -269
  9. package/src/build/island-types-generator.ts +476 -476
  10. package/src/build/mdx-island-transform.ts +464 -464
  11. package/src/build/mdx-plugin.ts +98 -98
  12. package/src/build/page-island-transform.ts +598 -598
  13. package/src/build/prop-extractors/index.ts +21 -21
  14. package/src/build/prop-extractors/lit.ts +140 -140
  15. package/src/build/prop-extractors/qwik.ts +16 -16
  16. package/src/build/prop-extractors/solid.ts +125 -125
  17. package/src/build/prop-extractors/svelte.ts +194 -194
  18. package/src/build/prop-extractors/vue.ts +111 -111
  19. package/src/build/sidecar-file-manager.ts +104 -104
  20. package/src/build/sidecar-renderer.ts +30 -30
  21. package/src/client/adapters/index.ts +21 -13
  22. package/src/client/components.ts +35 -35
  23. package/src/client/css-hmr-handler.ts +344 -344
  24. package/src/client/framework-adapter.ts +462 -462
  25. package/src/client/hmr-coordinator.ts +396 -396
  26. package/src/client/hmr-error-overlay.js +533 -533
  27. package/src/client/main.js +824 -816
  28. package/src/client/types/framework-runtime.d.ts +68 -68
  29. package/src/client/types/vite-hmr.d.ts +46 -46
  30. package/src/client/types/vite-virtual-modules.d.ts +70 -60
  31. package/src/components/Image.tsx +123 -123
  32. package/src/components/IslandErrorBoundary.tsx +145 -145
  33. package/src/components/LayoutDataErrorBoundary.tsx +141 -141
  34. package/src/components/LayoutErrorBoundary.tsx +127 -127
  35. package/src/components/PersistentIsland.tsx +52 -52
  36. package/src/components/StreamingErrorBoundary.tsx +233 -233
  37. package/src/components/StreamingLayout.tsx +538 -538
  38. package/src/core/components/component-analyzer.ts +192 -192
  39. package/src/core/components/component-detection.ts +508 -508
  40. package/src/core/components/enhanced-framework-detector.ts +500 -500
  41. package/src/core/components/framework-registry.ts +563 -563
  42. package/src/core/content/mdx-processor.ts +46 -46
  43. package/src/core/integrations/index.ts +19 -19
  44. package/src/core/integrations/loader.ts +125 -125
  45. package/src/core/integrations/registry.ts +175 -175
  46. package/src/core/islands/island-persistence.ts +325 -325
  47. package/src/core/islands/island-state-serializer.ts +258 -258
  48. package/src/core/islands/persistent-island-context.tsx +80 -80
  49. package/src/core/islands/use-persistent-state.ts +68 -68
  50. package/src/core/layout/enhanced-layout-resolver.ts +322 -322
  51. package/src/core/layout/layout-cache-manager.ts +485 -485
  52. package/src/core/layout/layout-composer.ts +357 -357
  53. package/src/core/layout/layout-data-loader.ts +516 -516
  54. package/src/core/layout/layout-discovery.ts +243 -243
  55. package/src/core/layout/layout-matcher.ts +299 -299
  56. package/src/core/layout/layout-types.ts +110 -110
  57. package/src/core/modules/framework-module-resolver.ts +273 -273
  58. package/src/islands/component-analysis.ts +213 -213
  59. package/src/islands/css-utils.ts +565 -565
  60. package/src/islands/discovery/index.ts +80 -80
  61. package/src/islands/discovery/registry.ts +340 -340
  62. package/src/islands/discovery/resolver.ts +477 -477
  63. package/src/islands/discovery/scanner.ts +386 -386
  64. package/src/islands/discovery/types.ts +117 -117
  65. package/src/islands/discovery/validator.ts +544 -544
  66. package/src/islands/discovery/watcher.ts +368 -368
  67. package/src/islands/framework-detection.ts +428 -428
  68. package/src/islands/integration-loader.ts +490 -490
  69. package/src/islands/island.tsx +565 -565
  70. package/src/islands/render-cache.ts +550 -550
  71. package/src/islands/types.ts +80 -80
  72. package/src/islands/universal-css-collector.ts +157 -157
  73. package/src/islands/universal-head-collector.ts +137 -137
  74. package/src/layout-system.d.ts +592 -592
  75. package/src/layout-system.ts +218 -218
  76. package/src/middleware/discovery.ts +268 -268
  77. package/src/middleware/executor.ts +315 -315
  78. package/src/middleware/index.ts +76 -76
  79. package/src/middleware/types.ts +99 -99
  80. package/src/nitro/build-config.ts +575 -575
  81. package/src/nitro/config.ts +483 -483
  82. package/src/nitro/error-handler.ts +636 -636
  83. package/src/nitro/index.ts +173 -173
  84. package/src/nitro/island-manifest.ts +584 -584
  85. package/src/nitro/middleware-adapter.ts +260 -260
  86. package/src/nitro/renderer.ts +1471 -1471
  87. package/src/nitro/route-discovery.ts +439 -439
  88. package/src/nitro/types.ts +321 -321
  89. package/src/render/collect-css.ts +198 -198
  90. package/src/render/error-pages.ts +79 -79
  91. package/src/render/isolated-ssr-renderer.ts +654 -654
  92. package/src/render/ssr.ts +1030 -1030
  93. package/src/schemas/api.ts +30 -30
  94. package/src/schemas/core.ts +64 -64
  95. package/src/schemas/index.ts +212 -212
  96. package/src/schemas/layout.ts +279 -279
  97. package/src/schemas/routing/index.ts +38 -38
  98. package/src/schemas/routing.ts +376 -376
  99. package/src/types/as-island.ts +20 -20
  100. package/src/types/image.d.ts +106 -106
  101. package/src/types/index.d.ts +22 -22
  102. package/src/types/island-jsx.d.ts +33 -33
  103. package/src/types/island-prop.d.ts +20 -20
  104. package/src/types/layout.ts +285 -285
  105. package/src/types/mdx.d.ts +6 -6
  106. package/src/types/routing.ts +555 -555
  107. package/src/types/types.ts +5 -5
  108. package/src/types/urlpattern.d.ts +49 -49
  109. package/src/types/vite-env.d.ts +11 -11
  110. package/src/utils/dev-logger.ts +299 -299
  111. package/src/utils/fs.ts +151 -151
  112. package/src/vite-plugin/auto-discover.ts +551 -551
  113. package/src/vite-plugin/config.ts +266 -266
  114. package/src/vite-plugin/errors.ts +127 -127
  115. package/src/vite-plugin/image-optimization.ts +156 -156
  116. package/src/vite-plugin/integration-activator.ts +126 -126
  117. package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
  118. package/src/vite-plugin/module-discovery.ts +189 -189
  119. package/src/vite-plugin/nitro-integration.ts +1354 -1354
  120. package/src/vite-plugin/plugin.ts +403 -409
  121. package/src/vite-plugin/types.ts +327 -327
  122. package/src/vite-plugin/validation.ts +228 -228
  123. package/src/client/adapters/index.js +0 -12
  124. package/src/client/adapters/lit-adapter.js +0 -467
  125. package/src/client/adapters/lit-adapter.ts +0 -654
  126. package/src/client/adapters/preact-adapter.js +0 -223
  127. package/src/client/adapters/preact-adapter.ts +0 -331
  128. package/src/client/adapters/qwik-adapter.js +0 -259
  129. package/src/client/adapters/qwik-adapter.ts +0 -345
  130. package/src/client/adapters/react-adapter.js +0 -220
  131. package/src/client/adapters/react-adapter.ts +0 -353
  132. package/src/client/adapters/solid-adapter.js +0 -295
  133. package/src/client/adapters/solid-adapter.ts +0 -451
  134. package/src/client/adapters/svelte-adapter.js +0 -368
  135. package/src/client/adapters/svelte-adapter.ts +0 -524
  136. package/src/client/adapters/vue-adapter.js +0 -278
  137. package/src/client/adapters/vue-adapter.ts +0 -467
  138. package/src/client/components.js +0 -23
  139. package/src/client/css-hmr-handler.js +0 -263
  140. package/src/client/framework-adapter.js +0 -283
  141. package/src/client/hmr-coordinator.js +0 -274
@@ -1,295 +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
- /// <reference lib="dom" />
11
- import { BaseFrameworkAdapter } from "../framework-adapter.js";
12
- /**
13
- * Solid HMR Adapter
14
- *
15
- * Leverages Solid Refresh (provided by vite-plugin-solid) to:
16
- * - Preserve signal subscriptions across updates
17
- * - Maintain reactive computations
18
- * - Handle component updates without full remount
19
- *
20
- * Solid Refresh works through the __SOLID_HMR__ API:
21
- * 1. When a component module is updated, Vite sends an HMR event
22
- * 2. We use __SOLID_HMR__.reload() to hot-reload the component
23
- * 3. Solid Refresh preserves signal subscriptions automatically
24
- * 4. Reactive computations are maintained across updates
25
- * 5. The component re-renders with preserved reactive state
26
- */
27
- export class SolidHMRAdapter extends BaseFrameworkAdapter {
28
- name = "solid";
29
- /**
30
- * Store Solid dispose functions for each island to enable proper cleanup
31
- */
32
- disposers = new WeakMap();
33
- /**
34
- * Store component IDs for HMR runtime
35
- */
36
- componentIds = new WeakMap();
37
- /**
38
- * Check if a component is a Solid component
39
- *
40
- * Solid components are:
41
- * - Functions that return JSX
42
- * - May use createSignal, createEffect, etc.
43
- * - Typically have .solid.tsx extension (but not always)
44
- */
45
- canHandle(component) {
46
- if (!component) return false;
47
- // Check if it's a function (Solid components are functions)
48
- if (typeof component === "function") {
49
- const comp = component;
50
- // Check for Solid-specific markers
51
- // Solid components may have __solid marker from vite-plugin-solid
52
- if (comp.__solid) {
53
- return true;
54
- }
55
- // Check function signature - Solid components typically accept props
56
- // and return JSX (which is compiled to function calls)
57
- try {
58
- const funcStr = component.toString();
59
- // Look for Solid-specific patterns
60
- // - createSignal, createEffect, createMemo, etc.
61
- // - JSX patterns (though this is less reliable after compilation)
62
- if (funcStr.includes("createSignal") || funcStr.includes("createEffect") || funcStr.includes("createMemo") || funcStr.includes("createResource") || funcStr.includes("createStore") || funcStr.includes("_$") || funcStr.includes("_tmpl$")) {
63
- return true;
64
- }
65
- } catch {}
66
- // If we can't determine definitively, assume it could be a Solid component
67
- // if it's a function (Solid components are just functions)
68
- // This is a fallback - we'll let Solid's hydration handle validation
69
- return true;
70
- }
71
- // Check if it's a Solid component object (wrapped or exported)
72
- if (typeof component !== "object") {
73
- return false;
74
- }
75
- const obj = component;
76
- // Check for default export pattern
77
- if (obj.default && typeof obj.default === "function") {
78
- return this.canHandle(obj.default);
79
- }
80
- // Check for Solid component markers
81
- if (obj.__solid) {
82
- return true;
83
- }
84
- return false;
85
- }
86
- /**
87
- * Preserve Solid component state before HMR update
88
- *
89
- * Solid Refresh handles most state preservation automatically through
90
- * its fine-grained reactivity system. We capture additional DOM state
91
- * and props for fallback.
92
- *
93
- * Note: Solid's signals are not easily accessible from outside the component,
94
- * so we rely on Solid Refresh to preserve them.
95
- */
96
- preserveState(island) {
97
- try {
98
- // Get base DOM state
99
- const baseSnapshot = super.preserveState(island);
100
- if (!baseSnapshot) return null;
101
- // Get Solid-specific data
102
- const propsAttr = island.getAttribute("data-props");
103
- const capturedProps = propsAttr ? JSON.parse(propsAttr) : {};
104
- // Try to get component name from the island
105
- const src = island.getAttribute("data-src") || "";
106
- const componentName = this.extractComponentName(src);
107
- // Get render ID for hydration
108
- const renderId = island.dataset.solidRenderId || island.dataset.renderId;
109
- const solidSnapshot = {
110
- ...baseSnapshot,
111
- framework: "solid",
112
- data: {
113
- componentName,
114
- capturedProps,
115
- renderId
116
- }
117
- };
118
- return solidSnapshot;
119
- } catch (error) {
120
- console.warn("Failed to preserve Solid state:", error);
121
- return null;
122
- }
123
- }
124
- /**
125
- * Update Solid component with HMR
126
- *
127
- * This method integrates with Solid Refresh:
128
- * 1. Solid Refresh is automatically enabled by vite-plugin-solid
129
- * 2. When a module updates, Vite sends an HMR event
130
- * 3. We use __SOLID_HMR__ to reload the component
131
- * 4. Solid Refresh preserves signal subscriptions automatically
132
- * 5. Reactive computations are maintained
133
- * 6. The component re-renders with preserved reactive state
134
- */
135
- async update(island, newComponent, props) {
136
- if (!this.canHandle(newComponent)) {
137
- throw new Error("Component is not a valid Solid component");
138
- }
139
- // Extract the actual component function
140
- let Component;
141
- if (typeof newComponent === "object" && newComponent !== null) {
142
- const obj = newComponent;
143
- if (obj.default && typeof obj.default === "function") {
144
- Component = obj.default;
145
- } else {
146
- throw new Error("Solid component object must have a default export");
147
- }
148
- } else if (typeof newComponent === "function") {
149
- Component = newComponent;
150
- } else {
151
- throw new Error("Invalid Solid component type");
152
- }
153
- try {
154
- // Check if we have an existing disposer
155
- const existingDisposer = this.disposers.get(island);
156
- const componentId = this.componentIds.get(island);
157
- // Try to use Solid HMR runtime if available
158
- const hmrRuntime = globalThis.__SOLID_HMR__;
159
- if (hmrRuntime && componentId) {
160
- // Use Solid's HMR runtime for hot reload
161
- // This preserves signal subscriptions and reactive computations automatically
162
- try {
163
- hmrRuntime.reload(componentId, Component);
164
- // If we have an existing component, Solid Refresh handles the update
165
- // We don't need to do anything else
166
- if (existingDisposer) {
167
- return;
168
- }
169
- } catch (error) {
170
- console.warn("Solid HMR runtime reload failed, falling back to full remount:", error);
171
- }
172
- }
173
- // Clean up existing component if present
174
- if (existingDisposer) {
175
- try {
176
- existingDisposer();
177
- this.disposers.delete(island);
178
- } catch (error) {
179
- console.warn("Failed to dispose existing Solid component:", error);
180
- }
181
- }
182
- // Dynamically import Solid at runtime
183
- // This is resolved by Vite in the browser
184
- const solidWebModule = await import("solid-js/web");
185
- const { hydrate, createComponent } = solidWebModule;
186
- // Get render ID for hydration
187
- const renderId = island.dataset.solidRenderId || island.dataset.renderId;
188
- // Check if we have SSR content to hydrate
189
- // Hydrate or render the component
190
- const dispose = hydrate(() => createComponent(Component, props), island, { renderId });
191
- // Store disposer for future updates
192
- this.disposers.set(island, dispose);
193
- // Generate component ID for HMR runtime
194
- const src = island.getAttribute("data-src") || "";
195
- const newComponentId = this.generateComponentId(src);
196
- this.componentIds.set(island, newComponentId);
197
- // Register with HMR runtime if available
198
- if (hmrRuntime) {
199
- try {
200
- hmrRuntime.createRecord(newComponentId, Component);
201
- } catch (error) {
202
- console.warn("Failed to register with Solid HMR runtime:", error);
203
- }
204
- }
205
- // Mark as hydrated
206
- island.setAttribute("data-hydrated", "true");
207
- island.setAttribute("data-hydration-status", "success");
208
- } catch (error) {
209
- console.error("Solid HMR update failed:", error);
210
- island.setAttribute("data-hydration-status", "error");
211
- throw error;
212
- }
213
- }
214
- /**
215
- * Restore Solid component state after HMR update
216
- *
217
- * Solid Refresh handles most state restoration automatically through
218
- * its fine-grained reactivity system. We restore DOM state (scroll, focus,
219
- * form values) as a supplement.
220
- */
221
- restoreState(island, state) {
222
- try {
223
- // Restore DOM state (scroll, focus, form values)
224
- super.restoreState(island, state);
225
- } catch (error) {
226
- console.warn("Failed to restore Solid state:", error);
227
- }
228
- }
229
- /**
230
- * Handle errors during Solid HMR update
231
- *
232
- * Provides Solid-specific error handling with helpful messages
233
- */
234
- handleError(island, error) {
235
- console.error("Solid HMR error:", error);
236
- // Use base error handling
237
- super.handleError(island, error);
238
- // Add Solid-specific error information
239
- const errorIndicator = island.querySelector(".hmr-error-indicator");
240
- if (errorIndicator) {
241
- const errorMessage = error.message;
242
- // Provide helpful hints for common Solid errors
243
- let hint = "";
244
- if (errorMessage.includes("signal") || errorMessage.includes("Signal")) {
245
- hint = " (Hint: Check signal usage - signals must be called as functions)";
246
- } else if (errorMessage.includes("effect") || errorMessage.includes("Effect")) {
247
- hint = " (Hint: Check effect usage - effects run after render)";
248
- } else if (errorMessage.includes("hydration") || errorMessage.includes("hydrate")) {
249
- hint = " (Hint: Server and client render must match)";
250
- } else if (errorMessage.includes("createSignal") || errorMessage.includes("createEffect")) {
251
- hint = " (Hint: Solid primitives must be called inside component functions)";
252
- } else if (errorMessage.includes("reactive")) {
253
- hint = " (Hint: Check reactive dependencies - they must be accessed inside tracking scopes)";
254
- }
255
- errorIndicator.textContent = `Solid HMR Error: ${errorMessage}${hint}`;
256
- }
257
- }
258
- /**
259
- * Extract component name from source path
260
- * Used for debugging and error messages
261
- */
262
- extractComponentName(src) {
263
- const parts = src.split("/");
264
- const filename = parts[parts.length - 1];
265
- return filename.replace(/\.solid\.(tsx?|jsx?)$/, "").replace(/\.(tsx?|jsx?)$/, "");
266
- }
267
- /**
268
- * Generate a unique component ID for HMR runtime
269
- */
270
- generateComponentId(src) {
271
- // Use the source path as the component ID
272
- // This ensures consistency across HMR updates
273
- return src.replace(/[^a-zA-Z0-9]/g, "_");
274
- }
275
- /**
276
- * Clean up Solid component when island is removed
277
- * This should be called when an island is unmounted
278
- */
279
- unmount(island) {
280
- const disposer = this.disposers.get(island);
281
- if (disposer) {
282
- try {
283
- disposer();
284
- this.disposers.delete(island);
285
- this.componentIds.delete(island);
286
- } catch (error) {
287
- console.warn("Failed to unmount Solid component:", error);
288
- }
289
- }
290
- }
291
- }
292
- /**
293
- * Create and export a singleton instance of the Solid HMR adapter
294
- */
295
- export const solidAdapter = new SolidHMRAdapter();