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