@useavalon/avalon 0.1.11 → 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.
- package/README.md +54 -54
- package/dist/mod.js +1 -0
- package/dist/src/build/integration-bundler-plugin.js +1 -0
- package/dist/src/build/integration-config.js +1 -0
- package/dist/src/build/integration-detection-plugin.js +1 -0
- package/dist/src/build/integration-resolver-plugin.js +1 -0
- package/dist/src/build/island-manifest.js +1 -0
- package/dist/src/build/island-types-generator.js +5 -0
- package/dist/src/build/mdx-island-transform.js +2 -0
- package/dist/src/build/mdx-plugin.js +1 -0
- package/dist/src/build/page-island-transform.js +3 -0
- package/dist/src/build/prop-extractors/index.js +1 -0
- package/dist/src/build/prop-extractors/lit.js +1 -0
- package/dist/src/build/prop-extractors/qwik.js +1 -0
- package/dist/src/build/prop-extractors/solid.js +1 -0
- package/dist/src/build/prop-extractors/svelte.js +1 -0
- package/dist/src/build/prop-extractors/vue.js +1 -0
- package/dist/src/build/sidecar-file-manager.js +1 -0
- package/dist/src/build/sidecar-renderer.js +6 -0
- package/dist/src/client/adapters/index.js +1 -0
- package/dist/src/client/components.js +1 -0
- package/dist/src/client/css-hmr-handler.js +1 -0
- package/dist/src/client/framework-adapter.js +13 -0
- package/dist/src/client/hmr-coordinator.js +1 -0
- package/dist/src/client/hmr-error-overlay.js +214 -0
- package/dist/src/client/main.js +39 -0
- package/{src → dist/src}/client/types/framework-runtime.d.ts +68 -68
- package/{src → dist/src}/client/types/vite-hmr.d.ts +46 -46
- package/dist/src/client/types/vite-virtual-modules.d.ts +70 -0
- package/dist/src/components/Image.js +1 -0
- package/dist/src/components/IslandErrorBoundary.js +1 -0
- package/dist/src/components/LayoutDataErrorBoundary.js +1 -0
- package/dist/src/components/LayoutErrorBoundary.js +1 -0
- package/dist/src/components/PersistentIsland.js +1 -0
- package/dist/src/components/StreamingErrorBoundary.js +1 -0
- package/dist/src/components/StreamingLayout.js +29 -0
- package/dist/src/core/components/component-analyzer.js +1 -0
- package/dist/src/core/components/component-detection.js +5 -0
- package/dist/src/core/components/enhanced-framework-detector.js +1 -0
- package/dist/src/core/components/framework-registry.js +1 -0
- package/dist/src/core/content/mdx-processor.js +1 -0
- package/dist/src/core/integrations/index.js +1 -0
- package/dist/src/core/integrations/loader.js +1 -0
- package/dist/src/core/integrations/registry.js +1 -0
- package/dist/src/core/islands/island-persistence.js +1 -0
- package/dist/src/core/islands/island-state-serializer.js +1 -0
- package/dist/src/core/islands/persistent-island-context.js +1 -0
- package/dist/src/core/islands/use-persistent-state.js +1 -0
- package/dist/src/core/layout/enhanced-layout-resolver.js +1 -0
- package/dist/src/core/layout/layout-cache-manager.js +1 -0
- package/dist/src/core/layout/layout-composer.js +1 -0
- package/dist/src/core/layout/layout-data-loader.js +1 -0
- package/dist/src/core/layout/layout-discovery.js +1 -0
- package/dist/src/core/layout/layout-matcher.js +1 -0
- package/dist/src/core/layout/layout-types.js +1 -0
- package/dist/src/core/modules/framework-module-resolver.js +1 -0
- package/dist/src/islands/component-analysis.js +1 -0
- package/dist/src/islands/css-utils.js +17 -0
- package/dist/src/islands/discovery/index.js +1 -0
- package/dist/src/islands/discovery/registry.js +1 -0
- package/dist/src/islands/discovery/resolver.js +2 -0
- package/dist/src/islands/discovery/scanner.js +1 -0
- package/dist/src/islands/discovery/types.js +1 -0
- package/dist/src/islands/discovery/validator.js +18 -0
- package/dist/src/islands/discovery/watcher.js +1 -0
- package/dist/src/islands/framework-detection.js +1 -0
- package/dist/src/islands/integration-loader.js +1 -0
- package/dist/src/islands/island.js +1 -0
- package/dist/src/islands/render-cache.js +1 -0
- package/dist/src/islands/types.js +1 -0
- package/dist/src/islands/universal-css-collector.js +5 -0
- package/dist/src/islands/universal-head-collector.js +2 -0
- package/{src → dist/src}/layout-system.d.ts +592 -592
- package/dist/src/layout-system.js +1 -0
- package/dist/src/middleware/discovery.js +1 -0
- package/dist/src/middleware/executor.js +1 -0
- package/dist/src/middleware/index.js +1 -0
- package/dist/src/middleware/types.js +1 -0
- package/dist/src/nitro/build-config.js +1 -0
- package/dist/src/nitro/config.js +1 -0
- package/dist/src/nitro/error-handler.js +198 -0
- package/dist/src/nitro/index.js +1 -0
- package/dist/src/nitro/island-manifest.js +2 -0
- package/dist/src/nitro/middleware-adapter.js +1 -0
- package/dist/src/nitro/renderer.js +183 -0
- package/dist/src/nitro/route-discovery.js +1 -0
- package/dist/src/nitro/types.js +1 -0
- package/dist/src/render/collect-css.js +3 -0
- package/{src/render/error-pages.ts → dist/src/render/error-pages.js} +7 -38
- package/dist/src/render/isolated-ssr-renderer.js +1 -0
- package/dist/src/render/ssr.js +90 -0
- package/dist/src/schemas/api.js +1 -0
- package/dist/src/schemas/core.js +1 -0
- package/dist/src/schemas/index.js +1 -0
- package/dist/src/schemas/layout.js +1 -0
- package/dist/src/schemas/routing/index.js +1 -0
- package/dist/src/schemas/routing.js +1 -0
- package/dist/src/types/as-island.js +1 -0
- package/{src → dist/src}/types/image.d.ts +106 -106
- package/{src → dist/src}/types/index.d.ts +22 -22
- package/{src → dist/src}/types/island-jsx.d.ts +33 -33
- package/{src → dist/src}/types/island-prop.d.ts +20 -20
- package/dist/src/types/layout.js +1 -0
- package/{src → dist/src}/types/mdx.d.ts +6 -6
- package/dist/src/types/routing.js +1 -0
- package/dist/src/types/types.js +1 -0
- package/{src → dist/src}/types/urlpattern.d.ts +49 -49
- package/{src → dist/src}/types/vite-env.d.ts +11 -11
- package/dist/src/utils/dev-logger.js +12 -0
- package/dist/src/utils/fs.js +1 -0
- package/dist/src/vite-plugin/auto-discover.js +1 -0
- package/dist/src/vite-plugin/config.js +1 -0
- package/dist/src/vite-plugin/errors.js +1 -0
- package/dist/src/vite-plugin/image-optimization.js +45 -0
- package/dist/src/vite-plugin/integration-activator.js +1 -0
- package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -0
- package/dist/src/vite-plugin/module-discovery.js +1 -0
- package/dist/src/vite-plugin/nitro-integration.js +42 -0
- package/dist/src/vite-plugin/plugin.js +1 -0
- package/dist/src/vite-plugin/types.js +1 -0
- package/dist/src/vite-plugin/validation.js +2 -0
- package/package.json +57 -26
- package/mod.ts +0 -302
- package/src/build/integration-bundler-plugin.ts +0 -116
- package/src/build/integration-config.ts +0 -168
- package/src/build/integration-detection-plugin.ts +0 -117
- package/src/build/integration-resolver-plugin.ts +0 -90
- package/src/build/island-manifest.ts +0 -269
- package/src/build/island-types-generator.ts +0 -476
- package/src/build/mdx-island-transform.ts +0 -464
- package/src/build/mdx-plugin.ts +0 -98
- package/src/build/page-island-transform.ts +0 -598
- package/src/build/prop-extractors/index.ts +0 -21
- package/src/build/prop-extractors/lit.ts +0 -140
- package/src/build/prop-extractors/qwik.ts +0 -16
- package/src/build/prop-extractors/solid.ts +0 -125
- package/src/build/prop-extractors/svelte.ts +0 -194
- package/src/build/prop-extractors/vue.ts +0 -111
- package/src/build/sidecar-file-manager.ts +0 -104
- package/src/build/sidecar-renderer.ts +0 -30
- package/src/client/adapters/index.js +0 -12
- package/src/client/adapters/index.ts +0 -13
- package/src/client/adapters/lit-adapter.js +0 -467
- package/src/client/adapters/lit-adapter.ts +0 -654
- package/src/client/adapters/preact-adapter.js +0 -223
- package/src/client/adapters/preact-adapter.ts +0 -331
- package/src/client/adapters/qwik-adapter.js +0 -259
- package/src/client/adapters/qwik-adapter.ts +0 -345
- package/src/client/adapters/react-adapter.js +0 -220
- package/src/client/adapters/react-adapter.ts +0 -353
- package/src/client/adapters/solid-adapter.js +0 -295
- package/src/client/adapters/solid-adapter.ts +0 -451
- package/src/client/adapters/svelte-adapter.js +0 -368
- package/src/client/adapters/svelte-adapter.ts +0 -524
- package/src/client/adapters/vue-adapter.js +0 -278
- package/src/client/adapters/vue-adapter.ts +0 -467
- package/src/client/components.js +0 -23
- package/src/client/components.ts +0 -35
- package/src/client/css-hmr-handler.js +0 -263
- package/src/client/css-hmr-handler.ts +0 -344
- package/src/client/framework-adapter.js +0 -283
- package/src/client/framework-adapter.ts +0 -462
- package/src/client/hmr-coordinator.js +0 -274
- package/src/client/hmr-coordinator.ts +0 -396
- package/src/client/hmr-error-overlay.js +0 -533
- package/src/client/main.js +0 -816
- package/src/client/types/vite-virtual-modules.d.ts +0 -60
- package/src/components/Image.tsx +0 -123
- package/src/components/IslandErrorBoundary.tsx +0 -145
- package/src/components/LayoutDataErrorBoundary.tsx +0 -141
- package/src/components/LayoutErrorBoundary.tsx +0 -127
- package/src/components/PersistentIsland.tsx +0 -52
- package/src/components/StreamingErrorBoundary.tsx +0 -233
- package/src/components/StreamingLayout.tsx +0 -538
- package/src/core/components/component-analyzer.ts +0 -192
- package/src/core/components/component-detection.ts +0 -508
- package/src/core/components/enhanced-framework-detector.ts +0 -500
- package/src/core/components/framework-registry.ts +0 -563
- package/src/core/content/mdx-processor.ts +0 -46
- package/src/core/integrations/index.ts +0 -19
- package/src/core/integrations/loader.ts +0 -125
- package/src/core/integrations/registry.ts +0 -175
- package/src/core/islands/island-persistence.ts +0 -325
- package/src/core/islands/island-state-serializer.ts +0 -258
- package/src/core/islands/persistent-island-context.tsx +0 -80
- package/src/core/islands/use-persistent-state.ts +0 -68
- package/src/core/layout/enhanced-layout-resolver.ts +0 -322
- package/src/core/layout/layout-cache-manager.ts +0 -485
- package/src/core/layout/layout-composer.ts +0 -357
- package/src/core/layout/layout-data-loader.ts +0 -516
- package/src/core/layout/layout-discovery.ts +0 -243
- package/src/core/layout/layout-matcher.ts +0 -299
- package/src/core/layout/layout-types.ts +0 -110
- package/src/core/modules/framework-module-resolver.ts +0 -273
- package/src/islands/component-analysis.ts +0 -213
- package/src/islands/css-utils.ts +0 -565
- package/src/islands/discovery/index.ts +0 -80
- package/src/islands/discovery/registry.ts +0 -340
- package/src/islands/discovery/resolver.ts +0 -477
- package/src/islands/discovery/scanner.ts +0 -386
- package/src/islands/discovery/types.ts +0 -117
- package/src/islands/discovery/validator.ts +0 -544
- package/src/islands/discovery/watcher.ts +0 -368
- package/src/islands/framework-detection.ts +0 -428
- package/src/islands/integration-loader.ts +0 -490
- package/src/islands/island.tsx +0 -565
- package/src/islands/render-cache.ts +0 -550
- package/src/islands/types.ts +0 -80
- package/src/islands/universal-css-collector.ts +0 -157
- package/src/islands/universal-head-collector.ts +0 -137
- package/src/layout-system.ts +0 -218
- package/src/middleware/discovery.ts +0 -268
- package/src/middleware/executor.ts +0 -315
- package/src/middleware/index.ts +0 -76
- package/src/middleware/types.ts +0 -99
- package/src/nitro/build-config.ts +0 -576
- package/src/nitro/config.ts +0 -483
- package/src/nitro/error-handler.ts +0 -636
- package/src/nitro/index.ts +0 -173
- package/src/nitro/island-manifest.ts +0 -584
- package/src/nitro/middleware-adapter.ts +0 -260
- package/src/nitro/renderer.ts +0 -1471
- package/src/nitro/route-discovery.ts +0 -439
- package/src/nitro/types.ts +0 -321
- package/src/render/collect-css.ts +0 -198
- package/src/render/isolated-ssr-renderer.ts +0 -654
- package/src/render/ssr.ts +0 -1030
- package/src/schemas/api.ts +0 -30
- package/src/schemas/core.ts +0 -64
- package/src/schemas/index.ts +0 -212
- package/src/schemas/layout.ts +0 -279
- package/src/schemas/routing/index.ts +0 -38
- package/src/schemas/routing.ts +0 -376
- package/src/types/as-island.ts +0 -20
- package/src/types/layout.ts +0 -285
- package/src/types/routing.ts +0 -555
- package/src/types/types.ts +0 -5
- package/src/utils/dev-logger.ts +0 -299
- package/src/utils/fs.ts +0 -151
- package/src/vite-plugin/auto-discover.ts +0 -551
- package/src/vite-plugin/config.ts +0 -266
- package/src/vite-plugin/errors.ts +0 -127
- package/src/vite-plugin/image-optimization.ts +0 -156
- package/src/vite-plugin/integration-activator.ts +0 -126
- package/src/vite-plugin/island-sidecar-plugin.ts +0 -176
- package/src/vite-plugin/module-discovery.ts +0 -189
- package/src/vite-plugin/nitro-integration.ts +0 -1354
- package/src/vite-plugin/plugin.ts +0 -409
- package/src/vite-plugin/types.ts +0 -327
- package/src/vite-plugin/validation.ts +0 -228
|
@@ -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();
|