eclipsa 0.1.0 → 0.1.2
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/action-DstcBFEm.mjs +6188 -0
- package/action-DstcBFEm.mjs.map +1 -0
- package/client-D1zMr8hs.mjs +307 -0
- package/client-D1zMr8hs.mjs.map +1 -0
- package/component-DjUmyVqL.d.mts +8 -0
- package/core/client/mod.d.mts +3 -0
- package/core/client/mod.mjs +5 -0
- package/core/dev-client/mod.d.mts +33 -0
- package/core/dev-client/mod.mjs +82 -0
- package/core/dev-client/mod.mjs.map +1 -0
- package/core/internal.d.mts +2 -0
- package/core/internal.mjs +2 -0
- package/core/prod-client/mod.d.mts +19 -0
- package/core/prod-client/mod.mjs +44 -0
- package/core/prod-client/mod.mjs.map +1 -0
- package/internal-Dmvt_AGE.d.mts +674 -0
- package/jsx/jsx-dev-runtime.d.mts +17 -0
- package/jsx/jsx-dev-runtime.mjs +2 -0
- package/jsx/jsx-runtime.d.mts +2 -0
- package/jsx/jsx-runtime.mjs +1 -0
- package/jsx/mod.d.mts +7 -0
- package/jsx/mod.mjs +7 -0
- package/jsx/mod.mjs.map +1 -0
- package/jsx-dev-runtime-CY60yQJY.mjs +28 -0
- package/jsx-dev-runtime-CY60yQJY.mjs.map +1 -0
- package/jsx-runtime-QIK6ADiK.d.mts +1 -0
- package/loader-DDVVUXBr.mjs +2 -0
- package/mod-CaLAdQcH.d.mts +18 -0
- package/mod.d.mts +164 -0
- package/mod.mjs +289 -0
- package/mod.mjs.map +1 -0
- package/package.json +69 -3
- package/resume-hmr-BRDojQNp.mjs +6 -0
- package/resume-hmr-BRDojQNp.mjs.map +1 -0
- package/signal-CosyYdtA.d.mts +22 -0
- package/signal-D1WmFjmJ.mjs +108 -0
- package/signal-D1WmFjmJ.mjs.map +1 -0
- package/snapshot-BG0kq9wt.mjs +39 -0
- package/snapshot-BG0kq9wt.mjs.map +1 -0
- package/types-DDeNM8UH.d.mts +11 -0
- package/types-WOJV0N2h.d.mts +282 -0
- package/vite/mod.d.mts +13 -0
- package/vite/mod.mjs +150297 -0
- package/vite/mod.mjs.map +1 -0
- package/web-utils/mod.d.mts +34 -0
- package/web-utils/mod.mjs +132 -0
- package/web-utils/mod.mjs.map +1 -0
- package/core/component.ts +0 -7
- package/core/dev-client/mod.ts +0 -17
- package/core/dev-client/renderer.ts +0 -5
- package/core/dev-client/types.ts +0 -3
- package/core/mod.ts +0 -4
- package/core/signal.ts +0 -20
- package/core/types.ts +0 -6
- package/deno.json +0 -23
- package/jsx/jsx-dev-runtime.ts +0 -19
- package/jsx/jsx-runtime.ts +0 -1
- package/jsx/mod.ts +0 -34
- package/jsx/shared.ts +0 -1
- package/jsx/types.ts +0 -23
- package/mod.ts +0 -2
- package/transformers/dev-client/mod.ts +0 -39
- package/transformers/dev-ssr/mod.ts +0 -52
- package/transformers/utils/jsx.ts +0 -77
- package/utils/node-connect.ts +0 -55
- package/vite/dev-app/mod.ts +0 -88
- package/vite/mod.ts +0 -76
- package/vite/utils/routing.ts +0 -26
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { $ as restoreSignalRefs, C as createDetachedClientInsertOwner, G as rememberInsertMarkerRange, J as renderClientInsertable, K as rememberManagedAttributesForNode, N as getRuntimeContainer, Ot as getComponentMeta, P as getRuntimeSignalId, R as preserveReusableContentInRoots, Y as renderClientInsertableForOwner, _ as assignRuntimeRef, _n as isSuspenseType, at as tryPatchElementShellInPlace, b as bindRuntimeEvent, et as shouldReconnectDetachedInsertMarkers, nt as syncRuntimeRefMarker, ot as tryPatchNodeSequenceInPlace, q as rememberManagedAttributesForNodes, tt as syncManagedAttributeSnapshot, x as captureClientInsertOwner } from "./action-DstcBFEm.mjs";
|
|
2
|
+
import { i as jsxDEV } from "./jsx-dev-runtime-CY60yQJY.mjs";
|
|
3
|
+
import { t as effect$1 } from "./signal-D1WmFjmJ.mjs";
|
|
4
|
+
import { r as withSignalSnapshot } from "./snapshot-BG0kq9wt.mjs";
|
|
5
|
+
//#region core/client/dom.ts
|
|
6
|
+
const INSERT_MARKER_PREFIX = "ec:i:";
|
|
7
|
+
const ensureInsertMarkerKey = (marker, runtimeContainer) => {
|
|
8
|
+
if (!(marker instanceof Comment) || !runtimeContainer) return null;
|
|
9
|
+
if (marker.data.startsWith(INSERT_MARKER_PREFIX)) return marker.data;
|
|
10
|
+
const key = `${INSERT_MARKER_PREFIX}${runtimeContainer.nextElementId++}`;
|
|
11
|
+
marker.data = key;
|
|
12
|
+
return key;
|
|
13
|
+
};
|
|
14
|
+
const findLiveInsertMarker = (doc, markerKey) => {
|
|
15
|
+
if (!doc?.body || !markerKey || typeof doc.createTreeWalker !== "function") return null;
|
|
16
|
+
const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_COMMENT);
|
|
17
|
+
let next = walker.nextNode();
|
|
18
|
+
while (next) {
|
|
19
|
+
if (next instanceof Comment && next.data === markerKey) return next;
|
|
20
|
+
next = walker.nextNode();
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
const isConnectedNode = (node) => !!node && (!("isConnected" in node) || node.isConnected !== false);
|
|
25
|
+
const isUsableInsertParent = (candidate, stableParents) => !!candidate && (isConnectedNode(candidate) || stableParents.includes(candidate));
|
|
26
|
+
const removeNodeFromParent = (node, parent) => {
|
|
27
|
+
const removable = node;
|
|
28
|
+
if (typeof removable.remove === "function") {
|
|
29
|
+
removable.remove();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const parentWithRemoveChild = parent;
|
|
33
|
+
if (typeof parentWithRemoveChild.removeChild === "function") parentWithRemoveChild.removeChild(node);
|
|
34
|
+
};
|
|
35
|
+
const hasUsableInsertParent = (node, stableParents) => isUsableInsertParent(node?.parentNode, stableParents);
|
|
36
|
+
const collectNodesBeforeMarker = (marker, count) => {
|
|
37
|
+
if (!marker?.parentNode || count === 0) return [];
|
|
38
|
+
const nodes = [];
|
|
39
|
+
let cursor = marker.previousSibling;
|
|
40
|
+
while (cursor && nodes.length < count) {
|
|
41
|
+
nodes.unshift(cursor);
|
|
42
|
+
cursor = cursor.previousSibling;
|
|
43
|
+
}
|
|
44
|
+
return nodes.length === count ? nodes : [];
|
|
45
|
+
};
|
|
46
|
+
const COMPONENT_BOUNDARY_START_REGEX = /^ec:c:(.+):start$/;
|
|
47
|
+
const COMPONENT_BOUNDARY_END_REGEX = /^ec:c:(.+):end$/;
|
|
48
|
+
const getBoundaryMarker = (node) => {
|
|
49
|
+
if (!(node instanceof Comment)) return null;
|
|
50
|
+
const start = node.data.match(COMPONENT_BOUNDARY_START_REGEX);
|
|
51
|
+
if (start?.[1]) return {
|
|
52
|
+
id: start[1],
|
|
53
|
+
kind: "start"
|
|
54
|
+
};
|
|
55
|
+
const end = node.data.match(COMPONENT_BOUNDARY_END_REGEX);
|
|
56
|
+
if (end?.[1]) return {
|
|
57
|
+
id: end[1],
|
|
58
|
+
kind: "end"
|
|
59
|
+
};
|
|
60
|
+
return null;
|
|
61
|
+
};
|
|
62
|
+
const canReconnectOwnerRange = (currentNodes, newNodes) => {
|
|
63
|
+
if (currentNodes.length === 0 || currentNodes.length !== newNodes.length) return false;
|
|
64
|
+
let sawBoundary = false;
|
|
65
|
+
for (let index = 0; index < newNodes.length; index += 1) {
|
|
66
|
+
const currentNode = currentNodes[index];
|
|
67
|
+
const newNode = newNodes[index];
|
|
68
|
+
if (currentNode.nodeType !== newNode.nodeType) return false;
|
|
69
|
+
const currentBoundary = getBoundaryMarker(currentNode);
|
|
70
|
+
const newBoundary = getBoundaryMarker(newNode);
|
|
71
|
+
if (currentBoundary || newBoundary) {
|
|
72
|
+
if (!currentBoundary || !newBoundary || currentBoundary.kind !== newBoundary.kind || currentBoundary.id !== newBoundary.id) return false;
|
|
73
|
+
sawBoundary = true;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (currentNode instanceof Element && newNode instanceof Element) {
|
|
77
|
+
if (currentNode.tagName !== newNode.tagName) return false;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (currentNode.nodeType === Node.TEXT_NODE && newNode.nodeType === Node.TEXT_NODE) continue;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return sawBoundary;
|
|
84
|
+
};
|
|
85
|
+
const createTemplate = (html) => {
|
|
86
|
+
let template = null;
|
|
87
|
+
return () => {
|
|
88
|
+
if (!template) {
|
|
89
|
+
template = document.createElement("template");
|
|
90
|
+
template.innerHTML = html;
|
|
91
|
+
}
|
|
92
|
+
const node = template.cloneNode(true).content.firstChild;
|
|
93
|
+
rememberManagedAttributesForNode(node);
|
|
94
|
+
return node;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const insert = (value, parent, marker) => {
|
|
98
|
+
let lastFirstNode = marker;
|
|
99
|
+
let lastNodeLength = 0;
|
|
100
|
+
const runtimeContainer = getRuntimeContainer();
|
|
101
|
+
if (!runtimeContainer) throw new Error("Client insertions require an active runtime container.");
|
|
102
|
+
const owner = captureClientInsertOwner(runtimeContainer, marker instanceof Comment && !marker.data.startsWith(INSERT_MARKER_PREFIX) ? marker.data : null) ?? createDetachedClientInsertOwner(runtimeContainer);
|
|
103
|
+
const markerKey = ensureInsertMarkerKey(marker, runtimeContainer);
|
|
104
|
+
const collectCurrentNodes = (liveMarker, stableParents) => {
|
|
105
|
+
if (!lastFirstNode || lastNodeLength === 0 || !hasUsableInsertParent(lastFirstNode, stableParents)) {
|
|
106
|
+
const liveNodes = collectNodesBeforeMarker(liveMarker, lastNodeLength);
|
|
107
|
+
return liveNodes.every((node) => hasUsableInsertParent(node, stableParents)) ? liveNodes : [];
|
|
108
|
+
}
|
|
109
|
+
const nodes = [lastFirstNode];
|
|
110
|
+
let cursor = lastFirstNode;
|
|
111
|
+
while (nodes.length < lastNodeLength) {
|
|
112
|
+
const next = cursor.nextSibling;
|
|
113
|
+
if (!next || !hasUsableInsertParent(next, stableParents)) return [];
|
|
114
|
+
cursor = next;
|
|
115
|
+
nodes.push(cursor);
|
|
116
|
+
}
|
|
117
|
+
return nodes;
|
|
118
|
+
};
|
|
119
|
+
effect$1(() => {
|
|
120
|
+
const shouldReconnect = shouldReconnectDetachedInsertMarkers(runtimeContainer);
|
|
121
|
+
const liveMarker = !(marker instanceof Comment) ? marker : isConnectedNode(marker.parentNode) ? marker : shouldReconnect ? findLiveInsertMarker(runtimeContainer.doc, markerKey) ?? marker : marker;
|
|
122
|
+
const stableParents = liveMarker?.parentNode ? [liveMarker.parentNode, parent === liveMarker.parentNode ? parent : null] : [parent, marker?.parentNode];
|
|
123
|
+
const liveLastParent = isUsableInsertParent(lastFirstNode?.parentNode, stableParents) ? lastFirstNode?.parentNode : null;
|
|
124
|
+
const liveMarkerParent = isUsableInsertParent(liveMarker?.parentNode, stableParents) ? liveMarker?.parentNode : null;
|
|
125
|
+
const targetParent = liveLastParent ?? liveMarkerParent ?? parent ?? parent;
|
|
126
|
+
const newNodes = owner ? renderClientInsertableForOwner(value, runtimeContainer, owner) : renderClientInsertable(value, runtimeContainer);
|
|
127
|
+
const seededCurrentNodes = lastNodeLength === 0 && liveMarker instanceof Comment ? collectNodesBeforeMarker(liveMarker, newNodes.length) : [];
|
|
128
|
+
const currentNodes = seededCurrentNodes.length !== 0 && seededCurrentNodes.every((node) => hasUsableInsertParent(node, stableParents)) && canReconnectOwnerRange(seededCurrentNodes, newNodes) ? seededCurrentNodes : collectCurrentNodes(liveMarker, stableParents);
|
|
129
|
+
if (currentNodes.length !== 0 && lastNodeLength === 0) {
|
|
130
|
+
lastFirstNode = currentNodes[0];
|
|
131
|
+
lastNodeLength = currentNodes.length;
|
|
132
|
+
}
|
|
133
|
+
if (currentNodes.length === lastNodeLength && currentNodes.length !== 0 && newNodes.length !== 0 && (tryPatchNodeSequenceInPlace(currentNodes, newNodes) || tryPatchSingleElementShellInPlace(currentNodes, newNodes))) {
|
|
134
|
+
restoreSignalRefs(runtimeContainer, targetParent);
|
|
135
|
+
rememberInsertMarkerRange(liveMarker, currentNodes);
|
|
136
|
+
lastFirstNode = currentNodes[0];
|
|
137
|
+
lastNodeLength = currentNodes.length;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
let replacementNodes = newNodes;
|
|
141
|
+
if (currentNodes.length !== 0 && newNodes.length !== 0) {
|
|
142
|
+
const doc = runtimeContainer.doc;
|
|
143
|
+
if (!doc) throw new Error("Client insertions require an active runtime document.");
|
|
144
|
+
const stagingParent = doc.createElement("div");
|
|
145
|
+
for (const node of newNodes) stagingParent.appendChild(node);
|
|
146
|
+
preserveReusableContentInRoots(currentNodes, Array.from(stagingParent.childNodes));
|
|
147
|
+
replacementNodes = Array.from(stagingParent.childNodes);
|
|
148
|
+
}
|
|
149
|
+
const insertReference = liveMarker?.parentNode === targetParent ? liveMarker : null;
|
|
150
|
+
for (const node of currentNodes) if (node.parentNode === targetParent) removeNodeFromParent(node, targetParent);
|
|
151
|
+
for (const node of replacementNodes) targetParent.insertBefore(node, insertReference);
|
|
152
|
+
rememberManagedAttributesForNodes(replacementNodes);
|
|
153
|
+
rememberInsertMarkerRange(liveMarker, replacementNodes);
|
|
154
|
+
lastFirstNode = replacementNodes[0] ?? liveMarker;
|
|
155
|
+
lastNodeLength = replacementNodes.length;
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
const EVENT_ATTR_REGEX = /^on[A-Z].+$/;
|
|
159
|
+
const DANGEROUSLY_SET_INNER_HTML_PROP = "dangerouslySetInnerHTML";
|
|
160
|
+
const BIND_VALUE_PROP = "bind:value";
|
|
161
|
+
const BIND_CHECKED_PROP = "bind:checked";
|
|
162
|
+
const BIND_VALUE_ATTR = "data-e-bind-value";
|
|
163
|
+
const BIND_CHECKED_ATTR = "data-e-bind-checked";
|
|
164
|
+
const shouldUseAttributeAssignment = (elem, name, isSVG) => isSVG || name.startsWith("data-") || name.startsWith("aria-") || !(name in elem);
|
|
165
|
+
const isBindableSignal = (value) => !!value && (typeof value === "object" || typeof value === "function") && "value" in value;
|
|
166
|
+
const readValueBinding = (elem, currentValue) => {
|
|
167
|
+
if (elem instanceof HTMLInputElement && typeof currentValue === "number" && (elem.type === "number" || elem.type === "range") && !Number.isNaN(elem.valueAsNumber)) return elem.valueAsNumber;
|
|
168
|
+
return elem.value;
|
|
169
|
+
};
|
|
170
|
+
const tryPatchSingleElementShellInPlace = (currentNodes, nextNodes) => {
|
|
171
|
+
if (currentNodes.length !== 1 || nextNodes.length !== 1) return false;
|
|
172
|
+
const [current] = currentNodes;
|
|
173
|
+
const [next] = nextNodes;
|
|
174
|
+
if (!(current instanceof Element) || !(next instanceof Element) || current.tagName !== next.tagName) return false;
|
|
175
|
+
return tryPatchElementShellInPlace(current, next);
|
|
176
|
+
};
|
|
177
|
+
const attr = (elem, name, value) => {
|
|
178
|
+
const isSVG = elem.namespaceURI === "http://www.w3.org/2000/svg";
|
|
179
|
+
if (name === BIND_VALUE_PROP) {
|
|
180
|
+
const readBinding = () => {
|
|
181
|
+
const binding = value();
|
|
182
|
+
const signalId = getRuntimeSignalId(binding);
|
|
183
|
+
if (signalId) elem.setAttribute(BIND_VALUE_ATTR, signalId);
|
|
184
|
+
else elem.removeAttribute(BIND_VALUE_ATTR);
|
|
185
|
+
syncManagedAttributeSnapshot(elem, BIND_VALUE_ATTR);
|
|
186
|
+
return binding;
|
|
187
|
+
};
|
|
188
|
+
const syncSignalFromElement = () => {
|
|
189
|
+
const binding = readBinding();
|
|
190
|
+
if (!isBindableSignal(binding)) return;
|
|
191
|
+
binding.value = readValueBinding(elem, binding.value);
|
|
192
|
+
};
|
|
193
|
+
elem.addEventListener("input", syncSignalFromElement);
|
|
194
|
+
elem.addEventListener("change", syncSignalFromElement);
|
|
195
|
+
effect$1(() => {
|
|
196
|
+
const binding = readBinding();
|
|
197
|
+
if (!isBindableSignal(binding)) return;
|
|
198
|
+
elem.value = String(binding.value ?? "");
|
|
199
|
+
});
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (name === BIND_CHECKED_PROP) {
|
|
203
|
+
if (!(elem instanceof HTMLInputElement)) return;
|
|
204
|
+
const readBinding = () => {
|
|
205
|
+
const binding = value();
|
|
206
|
+
const signalId = getRuntimeSignalId(binding);
|
|
207
|
+
if (signalId) elem.setAttribute(BIND_CHECKED_ATTR, signalId);
|
|
208
|
+
else elem.removeAttribute(BIND_CHECKED_ATTR);
|
|
209
|
+
syncManagedAttributeSnapshot(elem, BIND_CHECKED_ATTR);
|
|
210
|
+
return binding;
|
|
211
|
+
};
|
|
212
|
+
const syncSignalFromElement = () => {
|
|
213
|
+
const binding = readBinding();
|
|
214
|
+
if (!isBindableSignal(binding)) return;
|
|
215
|
+
binding.value = elem.checked;
|
|
216
|
+
};
|
|
217
|
+
elem.addEventListener("input", syncSignalFromElement);
|
|
218
|
+
elem.addEventListener("change", syncSignalFromElement);
|
|
219
|
+
effect$1(() => {
|
|
220
|
+
const binding = readBinding();
|
|
221
|
+
if (!isBindableSignal(binding)) return;
|
|
222
|
+
elem.checked = Boolean(binding.value);
|
|
223
|
+
});
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (EVENT_ATTR_REGEX.test(name)) {
|
|
227
|
+
const eventName = name[2].toLowerCase() + name.slice(3);
|
|
228
|
+
const resolved = value();
|
|
229
|
+
if (bindRuntimeEvent(elem, eventName, resolved)) return;
|
|
230
|
+
if (typeof resolved !== "function") throw new Error("Resumable event bindings require an active runtime container.");
|
|
231
|
+
elem.addEventListener(eventName, resolved);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (name === "style") {
|
|
235
|
+
effect$1(() => {
|
|
236
|
+
const resolved = value();
|
|
237
|
+
const styleValue = resolved && typeof resolved === "object" ? Object.entries(resolved).map(([k, v]) => `${k}: ${v}`).join("; ") : String(resolved ?? "");
|
|
238
|
+
elem.setAttribute("style", styleValue);
|
|
239
|
+
syncManagedAttributeSnapshot(elem, "style");
|
|
240
|
+
});
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (name === "class") {
|
|
244
|
+
effect$1(() => {
|
|
245
|
+
if (isSVG) {
|
|
246
|
+
elem.setAttribute("class", String(value()));
|
|
247
|
+
syncManagedAttributeSnapshot(elem, "class");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
elem.className = String(value());
|
|
251
|
+
syncManagedAttributeSnapshot(elem, "class");
|
|
252
|
+
});
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (name === "ref") {
|
|
256
|
+
const resolved = value();
|
|
257
|
+
syncRuntimeRefMarker(elem, resolved);
|
|
258
|
+
assignRuntimeRef(resolved, elem, getRuntimeContainer());
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (name === DANGEROUSLY_SET_INNER_HTML_PROP) {
|
|
262
|
+
effect$1(() => {
|
|
263
|
+
const html = value();
|
|
264
|
+
elem.innerHTML = html === false || html === void 0 || html === null ? "" : String(html);
|
|
265
|
+
});
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
effect$1(() => {
|
|
269
|
+
if (shouldUseAttributeAssignment(elem, name, isSVG)) {
|
|
270
|
+
elem.setAttribute(name, String(value()));
|
|
271
|
+
syncManagedAttributeSnapshot(elem, name);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
elem[name] = String(value());
|
|
275
|
+
syncManagedAttributeSnapshot(elem, name);
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
const hydrate = (Component, target, options) => {
|
|
279
|
+
const elem = withSignalSnapshot(options?.snapshot ?? null, () => Component({})).result;
|
|
280
|
+
while (target.childNodes.length > 0) target.lastChild?.remove();
|
|
281
|
+
for (const entry of Array.isArray(elem) ? elem : [elem]) insert(() => entry, target);
|
|
282
|
+
};
|
|
283
|
+
const createComponent = (Component, props) => {
|
|
284
|
+
if (isSuspenseType(Component)) return () => jsxDEV(Component, props, null, false, {});
|
|
285
|
+
if (!getComponentMeta(Component)) {
|
|
286
|
+
const render = Component;
|
|
287
|
+
return () => render(props);
|
|
288
|
+
}
|
|
289
|
+
return () => jsxDEV(Component, props, null, false, {});
|
|
290
|
+
};
|
|
291
|
+
const registry = new FinalizationRegistry((effect) => {
|
|
292
|
+
for (const signal of effect.signals) signal.effects.delete(effect);
|
|
293
|
+
});
|
|
294
|
+
const effect = (fn) => {
|
|
295
|
+
const newEffect = {
|
|
296
|
+
fn() {
|
|
297
|
+
fn();
|
|
298
|
+
},
|
|
299
|
+
signals: /* @__PURE__ */ new Set()
|
|
300
|
+
};
|
|
301
|
+
newEffect.fn();
|
|
302
|
+
registry.register(fn, newEffect);
|
|
303
|
+
};
|
|
304
|
+
//#endregion
|
|
305
|
+
export { hydrate as a, createTemplate as i, attr as n, insert as o, createComponent as r, effect as t };
|
|
306
|
+
|
|
307
|
+
//# sourceMappingURL=client-D1zMr8hs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-D1zMr8hs.mjs","names":[],"sources":["../core/client/dom.ts","../core/reactive/core.ts"],"sourcesContent":["import { jsxDEV } from '../../jsx/jsx-dev-runtime.ts'\nimport type { Component } from '../component.ts'\nimport { getComponentMeta } from '../internal.ts'\nimport {\n assignRuntimeRef,\n bindRuntimeEvent,\n captureClientInsertOwner,\n createDetachedClientInsertOwner,\n getRuntimeSignalId,\n getRuntimeContainer,\n preserveReusableContentInRoots,\n rememberManagedAttributesForNode,\n rememberManagedAttributesForNodes,\n rememberInsertMarkerRange,\n renderClientInsertable,\n renderClientInsertableForOwner,\n restoreSignalRefs,\n syncManagedAttributeSnapshot,\n syncRuntimeRefMarker,\n shouldReconnectDetachedInsertMarkers,\n tryPatchElementShellInPlace,\n tryPatchNodeSequenceInPlace,\n} from '../runtime.ts'\nimport { effect } from '../signal.ts'\nimport { isSuspenseType } from '../suspense.ts'\nimport { withSignalSnapshot } from '../snapshot.ts'\nimport type { ClientElementLike, Insertable } from './types.ts'\n\nconst INSERT_MARKER_PREFIX = 'ec:i:'\n\nconst ensureInsertMarkerKey = (\n marker: Node | undefined,\n runtimeContainer: ReturnType<typeof getRuntimeContainer>,\n) => {\n if (!(marker instanceof Comment) || !runtimeContainer) {\n return null\n }\n\n if (marker.data.startsWith(INSERT_MARKER_PREFIX)) {\n return marker.data\n }\n\n const key = `${INSERT_MARKER_PREFIX}${runtimeContainer.nextElementId++}`\n marker.data = key\n return key\n}\n\nconst findLiveInsertMarker = (doc: Document | undefined, markerKey: string | null) => {\n if (!doc?.body || !markerKey || typeof doc.createTreeWalker !== 'function') {\n return null\n }\n\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_COMMENT)\n let next = walker.nextNode()\n while (next) {\n if (next instanceof Comment && next.data === markerKey) {\n return next\n }\n next = walker.nextNode()\n }\n return null\n}\n\nconst isConnectedNode = (node: Node | null | undefined) =>\n !!node &&\n (!('isConnected' in node) ||\n (\n node as Node & {\n isConnected?: boolean\n }\n ).isConnected !== false)\n\nconst isUsableInsertParent = (\n candidate: Node | null | undefined,\n stableParents: Array<Node | null | undefined>,\n) => !!candidate && (isConnectedNode(candidate) || stableParents.includes(candidate))\n\nconst removeNodeFromParent = (node: Node, parent: Node) => {\n const removable = node as Node & {\n remove?: () => void\n }\n if (typeof removable.remove === 'function') {\n removable.remove()\n return\n }\n\n const parentWithRemoveChild = parent as Node & {\n removeChild?: (child: Node) => Node\n }\n if (typeof parentWithRemoveChild.removeChild === 'function') {\n parentWithRemoveChild.removeChild(node)\n }\n}\n\nconst hasUsableInsertParent = (\n node: Node | null | undefined,\n stableParents: Array<Node | null | undefined>,\n) => isUsableInsertParent(node?.parentNode, stableParents)\n\nconst collectNodesBeforeMarker = (marker: Node | null | undefined, count: number) => {\n if (!marker?.parentNode || count === 0) {\n return [] as Node[]\n }\n\n const nodes: Node[] = []\n let cursor = marker.previousSibling\n while (cursor && nodes.length < count) {\n nodes.unshift(cursor)\n cursor = cursor.previousSibling\n }\n\n return nodes.length === count ? nodes : []\n}\n\nconst COMPONENT_BOUNDARY_START_REGEX = /^ec:c:(.+):start$/\nconst COMPONENT_BOUNDARY_END_REGEX = /^ec:c:(.+):end$/\n\nconst getBoundaryMarker = (node: Node | null | undefined) => {\n if (!(node instanceof Comment)) {\n return null\n }\n\n const start = node.data.match(COMPONENT_BOUNDARY_START_REGEX)\n if (start?.[1]) {\n return {\n id: start[1],\n kind: 'start' as const,\n }\n }\n\n const end = node.data.match(COMPONENT_BOUNDARY_END_REGEX)\n if (end?.[1]) {\n return {\n id: end[1],\n kind: 'end' as const,\n }\n }\n\n return null\n}\n\nconst canReconnectOwnerRange = (currentNodes: Node[], newNodes: Node[]) => {\n if (currentNodes.length === 0 || currentNodes.length !== newNodes.length) {\n return false\n }\n\n let sawBoundary = false\n\n for (let index = 0; index < newNodes.length; index += 1) {\n const currentNode = currentNodes[index]!\n const newNode = newNodes[index]!\n if (currentNode.nodeType !== newNode.nodeType) {\n return false\n }\n\n const currentBoundary = getBoundaryMarker(currentNode)\n const newBoundary = getBoundaryMarker(newNode)\n if (currentBoundary || newBoundary) {\n if (\n !currentBoundary ||\n !newBoundary ||\n currentBoundary.kind !== newBoundary.kind ||\n currentBoundary.id !== newBoundary.id\n ) {\n return false\n }\n sawBoundary = true\n continue\n }\n\n if (currentNode instanceof Element && newNode instanceof Element) {\n if (currentNode.tagName !== newNode.tagName) {\n return false\n }\n continue\n }\n\n if (currentNode.nodeType === Node.TEXT_NODE && newNode.nodeType === Node.TEXT_NODE) {\n continue\n }\n\n return false\n }\n\n return sawBoundary\n}\n\nexport const createTemplate = (html: string): (() => Node) => {\n let template: HTMLTemplateElement | null = null\n\n return () => {\n if (!template) {\n template = document.createElement('template')\n template.innerHTML = html\n }\n const node = (template.cloneNode(true) as HTMLTemplateElement).content.firstChild as Node\n rememberManagedAttributesForNode(node)\n return node\n }\n}\n\nexport const insert = (value: Insertable, parent: Node, marker?: Node) => {\n let lastFirstNode = marker\n let lastNodeLength = 0\n const runtimeContainer = getRuntimeContainer()\n if (!runtimeContainer) {\n throw new Error('Client insertions require an active runtime container.')\n }\n const ownerSiteKey =\n marker instanceof Comment && !marker.data.startsWith(INSERT_MARKER_PREFIX) ? marker.data : null\n const owner =\n captureClientInsertOwner(runtimeContainer, ownerSiteKey) ??\n createDetachedClientInsertOwner(runtimeContainer)\n const markerKey = ensureInsertMarkerKey(marker, runtimeContainer)\n const collectCurrentNodes = (\n liveMarker: Node | undefined,\n stableParents: Array<Node | null | undefined>,\n ) => {\n if (\n !lastFirstNode ||\n lastNodeLength === 0 ||\n !hasUsableInsertParent(lastFirstNode, stableParents)\n ) {\n const liveNodes = collectNodesBeforeMarker(liveMarker, lastNodeLength)\n return liveNodes.every((node) => hasUsableInsertParent(node, stableParents)) ? liveNodes : []\n }\n const nodes = [lastFirstNode]\n let cursor = lastFirstNode\n while (nodes.length < lastNodeLength) {\n const next = cursor.nextSibling\n if (!next || !hasUsableInsertParent(next, stableParents)) {\n return [] as Node[]\n }\n cursor = next\n nodes.push(cursor)\n }\n return nodes\n }\n\n effect(() => {\n const shouldReconnect = shouldReconnectDetachedInsertMarkers(runtimeContainer)\n const liveMarker = !(marker instanceof Comment)\n ? marker\n : isConnectedNode(marker.parentNode)\n ? marker\n : shouldReconnect\n ? (findLiveInsertMarker(runtimeContainer.doc, markerKey) ?? marker)\n : marker\n const stableParents = liveMarker?.parentNode\n ? [liveMarker.parentNode, parent === liveMarker.parentNode ? parent : null]\n : [parent, marker?.parentNode]\n const liveLastParent = isUsableInsertParent(lastFirstNode?.parentNode, stableParents)\n ? lastFirstNode?.parentNode\n : null\n const liveMarkerParent = isUsableInsertParent(liveMarker?.parentNode, stableParents)\n ? liveMarker?.parentNode\n : null\n const resolvedParent = (liveLastParent ?? liveMarkerParent ?? parent) as ParentNode | null\n const targetParent = resolvedParent ?? (parent as ParentNode)\n const newNodes = owner\n ? renderClientInsertableForOwner(value, runtimeContainer, owner)\n : renderClientInsertable(value, runtimeContainer)\n const seededCurrentNodes =\n lastNodeLength === 0 && liveMarker instanceof Comment\n ? collectNodesBeforeMarker(liveMarker, newNodes.length)\n : []\n const currentNodes =\n seededCurrentNodes.length !== 0 &&\n seededCurrentNodes.every((node) => hasUsableInsertParent(node, stableParents)) &&\n canReconnectOwnerRange(seededCurrentNodes, newNodes)\n ? seededCurrentNodes\n : collectCurrentNodes(liveMarker, stableParents)\n\n if (currentNodes.length !== 0 && lastNodeLength === 0) {\n lastFirstNode = currentNodes[0]\n lastNodeLength = currentNodes.length\n }\n\n if (\n currentNodes.length === lastNodeLength &&\n currentNodes.length !== 0 &&\n newNodes.length !== 0 &&\n (tryPatchNodeSequenceInPlace(currentNodes, newNodes) ||\n tryPatchSingleElementShellInPlace(currentNodes, newNodes))\n ) {\n restoreSignalRefs(runtimeContainer, targetParent)\n rememberInsertMarkerRange(liveMarker, currentNodes)\n lastFirstNode = currentNodes[0]\n lastNodeLength = currentNodes.length\n return\n }\n\n let replacementNodes = newNodes\n if (currentNodes.length !== 0 && newNodes.length !== 0) {\n const doc = runtimeContainer.doc\n if (!doc) {\n throw new Error('Client insertions require an active runtime document.')\n }\n const stagingParent = doc.createElement('div')\n for (const node of newNodes) {\n stagingParent.appendChild(node)\n }\n preserveReusableContentInRoots(currentNodes, Array.from(stagingParent.childNodes))\n replacementNodes = Array.from(stagingParent.childNodes)\n }\n\n const insertReference = liveMarker?.parentNode === targetParent ? liveMarker : null\n for (const node of currentNodes) {\n if (node.parentNode === targetParent) {\n removeNodeFromParent(node, targetParent)\n }\n }\n for (const node of replacementNodes) {\n targetParent.insertBefore(node, insertReference)\n }\n\n rememberManagedAttributesForNodes(replacementNodes)\n rememberInsertMarkerRange(liveMarker, replacementNodes)\n\n lastFirstNode = replacementNodes[0] ?? liveMarker\n lastNodeLength = replacementNodes.length\n })\n}\n\nconst EVENT_ATTR_REGEX = /^on[A-Z].+$/\nconst DANGEROUSLY_SET_INNER_HTML_PROP = 'dangerouslySetInnerHTML'\nconst BIND_VALUE_PROP = 'bind:value'\nconst BIND_CHECKED_PROP = 'bind:checked'\nconst BIND_VALUE_ATTR = 'data-e-bind-value'\nconst BIND_CHECKED_ATTR = 'data-e-bind-checked'\nconst shouldUseAttributeAssignment = (elem: Element, name: string, isSVG: boolean) =>\n isSVG || name.startsWith('data-') || name.startsWith('aria-') || !(name in elem)\n\ntype BindableSignal<T> = {\n value: T\n}\n\nconst isBindableSignal = <T>(value: unknown): value is BindableSignal<T> =>\n !!value && (typeof value === 'object' || typeof value === 'function') && 'value' in value\n\nconst readValueBinding = (elem: Element, currentValue: unknown) => {\n if (\n elem instanceof HTMLInputElement &&\n typeof currentValue === 'number' &&\n (elem.type === 'number' || elem.type === 'range') &&\n !Number.isNaN(elem.valueAsNumber)\n ) {\n return elem.valueAsNumber\n }\n\n return (elem as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).value\n}\n\nconst tryPatchSingleElementShellInPlace = (currentNodes: Node[], nextNodes: Node[]) => {\n if (currentNodes.length !== 1 || nextNodes.length !== 1) {\n return false\n }\n\n const [current] = currentNodes\n const [next] = nextNodes\n if (\n !(current instanceof Element) ||\n !(next instanceof Element) ||\n current.tagName !== next.tagName\n ) {\n return false\n }\n return tryPatchElementShellInPlace(current, next)\n}\n\nexport const attr = (elem: Element, name: string, value: () => unknown) => {\n const isSVG = elem.namespaceURI === 'http://www.w3.org/2000/svg'\n\n if (name === BIND_VALUE_PROP) {\n const readBinding = () => {\n const binding = value()\n const signalId = getRuntimeSignalId(binding)\n if (signalId) {\n elem.setAttribute(BIND_VALUE_ATTR, signalId)\n } else {\n elem.removeAttribute(BIND_VALUE_ATTR)\n }\n syncManagedAttributeSnapshot(elem, BIND_VALUE_ATTR)\n return binding\n }\n\n const syncSignalFromElement = () => {\n const binding = readBinding()\n if (!isBindableSignal(binding)) {\n return\n }\n binding.value = readValueBinding(elem, binding.value) as never\n }\n\n elem.addEventListener('input', syncSignalFromElement)\n elem.addEventListener('change', syncSignalFromElement)\n\n effect(() => {\n const binding = readBinding()\n if (!isBindableSignal(binding)) {\n return\n }\n ;(elem as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).value = String(\n binding.value ?? '',\n )\n })\n return\n }\n\n if (name === BIND_CHECKED_PROP) {\n if (!(elem instanceof HTMLInputElement)) {\n return\n }\n\n const readBinding = () => {\n const binding = value()\n const signalId = getRuntimeSignalId(binding)\n if (signalId) {\n elem.setAttribute(BIND_CHECKED_ATTR, signalId)\n } else {\n elem.removeAttribute(BIND_CHECKED_ATTR)\n }\n syncManagedAttributeSnapshot(elem, BIND_CHECKED_ATTR)\n return binding\n }\n\n const syncSignalFromElement = () => {\n const binding = readBinding()\n if (!isBindableSignal(binding)) {\n return\n }\n binding.value = elem.checked as never\n }\n\n elem.addEventListener('input', syncSignalFromElement)\n elem.addEventListener('change', syncSignalFromElement)\n\n effect(() => {\n const binding = readBinding()\n if (!isBindableSignal(binding)) {\n return\n }\n elem.checked = Boolean(binding.value)\n })\n return\n }\n\n if (EVENT_ATTR_REGEX.test(name)) {\n const eventName = name[2].toLowerCase() + name.slice(3)\n const resolved = value()\n if (bindRuntimeEvent(elem, eventName, resolved)) {\n return\n }\n if (typeof resolved !== 'function') {\n throw new Error('Resumable event bindings require an active runtime container.')\n }\n elem.addEventListener(eventName, resolved as () => void)\n return\n }\n\n if (name === 'style') {\n effect(() => {\n const resolved = value()\n const styleValue =\n resolved && typeof resolved === 'object'\n ? Object.entries(resolved as Record<string, string>)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ')\n : String(resolved ?? '')\n elem.setAttribute('style', styleValue)\n syncManagedAttributeSnapshot(elem, 'style')\n })\n return\n }\n\n if (name === 'class') {\n effect(() => {\n if (isSVG) {\n elem.setAttribute('class', String(value()))\n syncManagedAttributeSnapshot(elem, 'class')\n return\n }\n ;(elem as Element & { className: string }).className = String(value())\n syncManagedAttributeSnapshot(elem, 'class')\n })\n return\n }\n\n if (name === 'ref') {\n const resolved = value()\n syncRuntimeRefMarker(elem, resolved)\n assignRuntimeRef(resolved, elem, getRuntimeContainer())\n return\n }\n\n if (name === DANGEROUSLY_SET_INNER_HTML_PROP) {\n effect(() => {\n const html = value()\n ;(elem as Element & { innerHTML: string }).innerHTML =\n html === false || html === undefined || html === null ? '' : String(html)\n })\n return\n }\n\n effect(() => {\n if (shouldUseAttributeAssignment(elem, name, isSVG)) {\n elem.setAttribute(name, String(value()))\n syncManagedAttributeSnapshot(elem, name)\n return\n }\n // @ts-expect-error DOM property assignment uses dynamic keys.\n elem[name] = String(value())\n syncManagedAttributeSnapshot(elem, name)\n })\n}\n\nexport const hydrate = (\n Component: Component,\n target: HTMLElement,\n options?: {\n snapshot?: unknown[]\n },\n) => {\n const elem = withSignalSnapshot(options?.snapshot ?? null, () => Component({}))\n .result as unknown as ClientElementLike\n\n while (target.childNodes.length > 0) {\n target.lastChild?.remove()\n }\n\n for (const entry of Array.isArray(elem) ? elem : [elem]) {\n insert(() => entry, target)\n }\n}\n\nexport const createComponent = (Component: Component, props: unknown) => {\n if (isSuspenseType(Component)) {\n return () => jsxDEV(Component, props as Record<string, unknown>, null, false, {})\n }\n if (!getComponentMeta(Component)) {\n const render = Component as (props: unknown) => unknown\n return () => render(props) as ClientElementLike\n }\n return () => jsxDEV(Component, props as Record<string, unknown>, null, false, {})\n}\n","export interface Signal<T> {\n get(): T\n set(newValue: T): T\n effects: Set<Effect>\n}\n\ninterface Effect {\n fn: () => void\n signals: Set<Signal<unknown>>\n}\nlet currentEffect: Effect | null = null\n\nconst isPrimitiveSignalValue = (value: unknown) =>\n value === null || (typeof value !== 'object' && typeof value !== 'function')\n\nconst didSignalValueChange = (previous: unknown, next: unknown) => {\n if (isPrimitiveSignalValue(previous) && isPrimitiveSignalValue(next)) {\n return !Object.is(previous, next)\n }\n\n return previous !== next\n}\n\nexport const signal = <T>(init: T): Signal<T> => {\n let value = init\n const signal: Signal<T> = {\n get() {\n if (currentEffect) {\n this.effects.add(currentEffect)\n }\n return value\n },\n set(newValue) {\n if (!didSignalValueChange(value, newValue)) {\n return value\n }\n value = newValue\n for (const effect of this.effects) {\n effect.fn()\n }\n return value\n },\n effects: new Set(),\n }\n return signal\n}\n\nconst registry = new FinalizationRegistry<Effect>((effect) => {\n for (const signal of effect.signals) {\n signal.effects.delete(effect)\n }\n})\n\nexport const effect = (fn: () => void) => {\n const newEffect: Effect = {\n fn() {\n fn()\n },\n signals: new Set(),\n }\n\n currentEffect = newEffect\n newEffect.fn()\n currentEffect = null\n\n registry.register(fn, newEffect)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { i as JSX } from "./types-WOJV0N2h.mjs";
|
|
2
|
+
|
|
3
|
+
//#region core/component.d.ts
|
|
4
|
+
type Component<T = unknown> = (props: T) => JSX.Element;
|
|
5
|
+
type EURL<T> = T;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { EURL as n, Component as t };
|
|
8
|
+
//# sourceMappingURL=component-DjUmyVqL.d.mts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as Insertable, t as ClientElementLike } from "../../types-DDeNM8UH.mjs";
|
|
2
|
+
import { a as hydrate, i as createTemplate, n as attr, o as insert, r as createComponent, t as effect } from "../../mod-CaLAdQcH.mjs";
|
|
3
|
+
export { ClientElementLike, Insertable, attr, createComponent, createTemplate, effect, hydrate, insert };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import "../../action-DstcBFEm.mjs";
|
|
2
|
+
import "../../signal-D1WmFjmJ.mjs";
|
|
3
|
+
import "../../snapshot-BG0kq9wt.mjs";
|
|
4
|
+
import { a as hydrate, i as createTemplate, n as attr, o as insert, r as createComponent, t as effect } from "../../client-D1zMr8hs.mjs";
|
|
5
|
+
export { attr, createComponent, createTemplate, effect, hydrate, insert };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { t as Component } from "../../component-DjUmyVqL.mjs";
|
|
2
|
+
|
|
3
|
+
//#region core/dev-client/hot.d.ts
|
|
4
|
+
interface ViteHotContext {
|
|
5
|
+
off(event: string, listener: (data: {
|
|
6
|
+
url: string;
|
|
7
|
+
}) => void): void;
|
|
8
|
+
on(event: string, listener: (data: {
|
|
9
|
+
url: string;
|
|
10
|
+
}) => void): void;
|
|
11
|
+
}
|
|
12
|
+
declare const initHot: (hot: ViteHotContext | undefined, stringURL: string, registry: HotRegistry) => void;
|
|
13
|
+
interface ComponentMetaInput {
|
|
14
|
+
registry: HotRegistry;
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
declare const defineHotComponent: (Component: Component, meta: ComponentMetaInput) => Component;
|
|
18
|
+
interface HotComponentData {
|
|
19
|
+
update(newComponent: Component): void;
|
|
20
|
+
Component: Component;
|
|
21
|
+
}
|
|
22
|
+
interface HotRegistry {
|
|
23
|
+
components: Map<string, HotComponentData>;
|
|
24
|
+
setIsChild(): void;
|
|
25
|
+
}
|
|
26
|
+
declare const applyHotUpdate: (registry: HotRegistry, newRegistry: HotRegistry) => "reload" | "updated";
|
|
27
|
+
declare const createHotRegistry: () => HotRegistry;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region core/dev-client/mod.d.ts
|
|
30
|
+
declare const initDevClient: () => Promise<void>;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { applyHotUpdate, createHotRegistry, defineHotComponent, initDevClient, initHot };
|
|
33
|
+
//# sourceMappingURL=mod.d.mts.map
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Ot as getComponentMeta, St as __eclipsaComponent } from "../../action-DstcBFEm.mjs";
|
|
2
|
+
import "../../signal-D1WmFjmJ.mjs";
|
|
3
|
+
import "../../snapshot-BG0kq9wt.mjs";
|
|
4
|
+
import { a as hydrate } from "../../client-D1zMr8hs.mjs";
|
|
5
|
+
//#region core/dev-client/hot.ts
|
|
6
|
+
const HOT_COMPONENT_TARGET_KEY = Symbol.for("eclipsa.hot-component-target");
|
|
7
|
+
const unwrapHotComponent = (Component) => Component[HOT_COMPONENT_TARGET_KEY] ?? Component;
|
|
8
|
+
const initHot = (hot, stringURL, registry) => {
|
|
9
|
+
if (!hot) return;
|
|
10
|
+
const id = new URL(stringURL).pathname;
|
|
11
|
+
const handler = async (data) => {
|
|
12
|
+
const hotTargetId = data.url;
|
|
13
|
+
if (hotTargetId === id) {
|
|
14
|
+
const newModURL = new URL(hotTargetId, stringURL);
|
|
15
|
+
newModURL.searchParams.append("t", Date.now().toString());
|
|
16
|
+
const newRegistry = (await import(
|
|
17
|
+
/* @vite-ignore */
|
|
18
|
+
newModURL.href
|
|
19
|
+
)).__eclipsa$hotRegistry;
|
|
20
|
+
if (!newRegistry) return;
|
|
21
|
+
newRegistry.setIsChild();
|
|
22
|
+
if (applyHotUpdate(registry, newRegistry) === "reload") {
|
|
23
|
+
console.info("[Eclipsa HMR]: Component graph changed, reloading page...");
|
|
24
|
+
location.reload();
|
|
25
|
+
}
|
|
26
|
+
hot.on("update-client", handler);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
registry.setIsChild = () => {
|
|
30
|
+
hot.off("update-client", handler);
|
|
31
|
+
};
|
|
32
|
+
hot.on("update-client", handler);
|
|
33
|
+
};
|
|
34
|
+
const defineHotComponent = (Component, meta) => {
|
|
35
|
+
const current = { value: unwrapHotComponent(Component) };
|
|
36
|
+
const componentMeta = getComponentMeta(Component);
|
|
37
|
+
meta.registry.components.set(meta.name, {
|
|
38
|
+
update(newComponent) {
|
|
39
|
+
current.value = unwrapHotComponent(newComponent);
|
|
40
|
+
},
|
|
41
|
+
Component: current.value
|
|
42
|
+
});
|
|
43
|
+
const HotComponent = ((props) => {
|
|
44
|
+
return current.value(props);
|
|
45
|
+
});
|
|
46
|
+
HotComponent[HOT_COMPONENT_TARGET_KEY] = current.value;
|
|
47
|
+
if (!componentMeta) return HotComponent;
|
|
48
|
+
return __eclipsaComponent(HotComponent, componentMeta.symbol, componentMeta.captures, componentMeta.projectionSlots, { optimizedRoot: componentMeta.optimizedRoot });
|
|
49
|
+
};
|
|
50
|
+
const applyHotUpdate = (registry, newRegistry) => {
|
|
51
|
+
if (registry.components.size !== newRegistry.components.size) return "reload";
|
|
52
|
+
for (const [name, newHotComponentData] of newRegistry.components) {
|
|
53
|
+
const oldHotComponentData = registry.components.get(name);
|
|
54
|
+
if (!oldHotComponentData) return "reload";
|
|
55
|
+
oldHotComponentData.update(newHotComponentData.Component);
|
|
56
|
+
}
|
|
57
|
+
return "updated";
|
|
58
|
+
};
|
|
59
|
+
const createHotRegistry = () => {
|
|
60
|
+
return {
|
|
61
|
+
components: /* @__PURE__ */ new Map(),
|
|
62
|
+
setIsChild: () => null
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region core/dev-client/mod.ts
|
|
67
|
+
const getDevInfo = () => {
|
|
68
|
+
const elem = document.getElementById("eclipsa-devinfo");
|
|
69
|
+
if (!elem) throw new Error("devinfo element is falsy.");
|
|
70
|
+
return JSON.parse(elem.innerHTML);
|
|
71
|
+
};
|
|
72
|
+
const initDevClient = async () => {
|
|
73
|
+
const Component = (await import(
|
|
74
|
+
/* @vite-ignore */
|
|
75
|
+
getDevInfo().entry.url
|
|
76
|
+
)).default;
|
|
77
|
+
hydrate(Component, document.body);
|
|
78
|
+
};
|
|
79
|
+
//#endregion
|
|
80
|
+
export { applyHotUpdate, createHotRegistry, defineHotComponent, initDevClient, initHot };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=mod.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.mjs","names":[],"sources":["../../../core/dev-client/hot.ts","../../../core/dev-client/mod.ts"],"sourcesContent":["import type { Component } from '../component.ts'\nimport { __eclipsaComponent, getComponentMeta } from '../internal.ts'\n\nconst HOT_COMPONENT_TARGET_KEY = Symbol.for('eclipsa.hot-component-target')\n\ninterface ViteHotContext {\n off(event: string, listener: (data: { url: string }) => void): void\n on(event: string, listener: (data: { url: string }) => void): void\n}\n\nconst unwrapHotComponent = (Component: Component): Component =>\n ((Component as Component & { [HOT_COMPONENT_TARGET_KEY]?: Component })[\n HOT_COMPONENT_TARGET_KEY\n ] ?? Component) as Component\n\nexport const initHot = (\n hot: ViteHotContext | undefined,\n stringURL: string,\n registry: HotRegistry,\n) => {\n if (!hot) {\n return\n }\n const url = new URL(stringURL)\n const id = url.pathname\n\n const handler: Parameters<typeof hot.on>[1] = async (data: { url: string }) => {\n const hotTargetId: string = data.url\n if (hotTargetId === id) {\n // Update module\n const newModURL = new URL(hotTargetId, stringURL)\n newModURL.searchParams.append('t', Date.now().toString())\n const newMod = await import(/* @vite-ignore */ newModURL.href)\n\n const newRegistry: HotRegistry | undefined = newMod.__eclipsa$hotRegistry\n if (!newRegistry) {\n return\n }\n newRegistry.setIsChild()\n if (applyHotUpdate(registry, newRegistry) === 'reload') {\n console.info('[Eclipsa HMR]: Component graph changed, reloading page...')\n location.reload()\n }\n hot.on('update-client', handler)\n }\n }\n registry.setIsChild = () => {\n hot.off('update-client', handler)\n }\n hot.on('update-client', handler)\n}\n\ninterface ComponentMetaInput {\n registry: HotRegistry\n name: string\n}\nexport const defineHotComponent = (Component: Component, meta: ComponentMetaInput): Component => {\n const current = { value: unwrapHotComponent(Component) }\n const componentMeta = getComponentMeta(Component)\n\n meta.registry.components.set(meta.name, {\n update(newComponent) {\n current.value = unwrapHotComponent(newComponent)\n },\n Component: current.value,\n })\n\n const HotComponent = ((props: unknown) => {\n return current.value(props)\n }) as Component & {\n [HOT_COMPONENT_TARGET_KEY]?: Component\n }\n HotComponent[HOT_COMPONENT_TARGET_KEY] = current.value\n if (!componentMeta) {\n return HotComponent\n }\n return __eclipsaComponent(\n HotComponent,\n componentMeta.symbol,\n componentMeta.captures,\n componentMeta.projectionSlots,\n {\n optimizedRoot: componentMeta.optimizedRoot,\n },\n )\n}\n\ninterface HotComponentData {\n update(newComponent: Component): void\n Component: Component\n}\ninterface HotRegistry {\n components: Map<string, HotComponentData>\n setIsChild(): void\n}\n\nexport const applyHotUpdate = (registry: HotRegistry, newRegistry: HotRegistry) => {\n if (registry.components.size !== newRegistry.components.size) {\n return 'reload' as const\n }\n\n for (const [name, newHotComponentData] of newRegistry.components) {\n const oldHotComponentData = registry.components.get(name)\n if (!oldHotComponentData) {\n return 'reload' as const\n }\n oldHotComponentData.update(newHotComponentData.Component)\n }\n\n return 'updated' as const\n}\n\nexport const createHotRegistry = (): HotRegistry => {\n return {\n components: new Map(),\n setIsChild: () => null,\n }\n}\n","import type { DevClientInfo } from './types.ts'\nimport { hydrate } from '../client/mod.ts'\n\nconst getDevInfo = (): DevClientInfo => {\n const elem = document.getElementById('eclipsa-devinfo')\n\n if (!elem) {\n throw new Error('devinfo element is falsy.')\n }\n\n return JSON.parse(elem.innerHTML)\n}\n\nexport const initDevClient = async () => {\n const Component = (await import(/* @vite-ignore */ getDevInfo().entry.url)).default\n hydrate(Component, document.body)\n}\n\nexport * from './hot.ts'\n"],"mappings":";;;;;AAGA,MAAM,2BAA2B,OAAO,IAAI,+BAA+B;AAO3E,MAAM,sBAAsB,cACxB,UACA,6BACG;AAEP,MAAa,WACX,KACA,WACA,aACG;AACH,KAAI,CAAC,IACH;CAGF,MAAM,KADM,IAAI,IAAI,UAAU,CACf;CAEf,MAAM,UAAwC,OAAO,SAA0B;EAC7E,MAAM,cAAsB,KAAK;AACjC,MAAI,gBAAgB,IAAI;GAEtB,MAAM,YAAY,IAAI,IAAI,aAAa,UAAU;AACjD,aAAU,aAAa,OAAO,KAAK,KAAK,KAAK,CAAC,UAAU,CAAC;GAGzD,MAAM,eAFS,MAAM;;IAA0B,UAAU;GAEL;AACpD,OAAI,CAAC,YACH;AAEF,eAAY,YAAY;AACxB,OAAI,eAAe,UAAU,YAAY,KAAK,UAAU;AACtD,YAAQ,KAAK,4DAA4D;AACzE,aAAS,QAAQ;;AAEnB,OAAI,GAAG,iBAAiB,QAAQ;;;AAGpC,UAAS,mBAAmB;AAC1B,MAAI,IAAI,iBAAiB,QAAQ;;AAEnC,KAAI,GAAG,iBAAiB,QAAQ;;AAOlC,MAAa,sBAAsB,WAAsB,SAAwC;CAC/F,MAAM,UAAU,EAAE,OAAO,mBAAmB,UAAU,EAAE;CACxD,MAAM,gBAAgB,iBAAiB,UAAU;AAEjD,MAAK,SAAS,WAAW,IAAI,KAAK,MAAM;EACtC,OAAO,cAAc;AACnB,WAAQ,QAAQ,mBAAmB,aAAa;;EAElD,WAAW,QAAQ;EACpB,CAAC;CAEF,MAAM,iBAAiB,UAAmB;AACxC,SAAO,QAAQ,MAAM,MAAM;;AAI7B,cAAa,4BAA4B,QAAQ;AACjD,KAAI,CAAC,cACH,QAAO;AAET,QAAO,mBACL,cACA,cAAc,QACd,cAAc,UACd,cAAc,iBACd,EACE,eAAe,cAAc,eAC9B,CACF;;AAYH,MAAa,kBAAkB,UAAuB,gBAA6B;AACjF,KAAI,SAAS,WAAW,SAAS,YAAY,WAAW,KACtD,QAAO;AAGT,MAAK,MAAM,CAAC,MAAM,wBAAwB,YAAY,YAAY;EAChE,MAAM,sBAAsB,SAAS,WAAW,IAAI,KAAK;AACzD,MAAI,CAAC,oBACH,QAAO;AAET,sBAAoB,OAAO,oBAAoB,UAAU;;AAG3D,QAAO;;AAGT,MAAa,0BAAuC;AAClD,QAAO;EACL,4BAAY,IAAI,KAAK;EACrB,kBAAkB;EACnB;;;;ACjHH,MAAM,mBAAkC;CACtC,MAAM,OAAO,SAAS,eAAe,kBAAkB;AAEvD,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,4BAA4B;AAG9C,QAAO,KAAK,MAAM,KAAK,UAAU;;AAGnC,MAAa,gBAAgB,YAAY;CACvC,MAAM,aAAa,MAAM;;EAA0B,YAAY,CAAC,MAAM;GAAM;AAC5E,SAAQ,WAAW,SAAS,KAAK"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { A as getSignalMeta, C as getLoaderHandleMeta, D as getRegisteredActionHookIds, E as getRegisteredActionHook, F as setActionHookMeta, I as setLoaderHandleMeta, L as setLoaderHookMeta, M as registerActionHook, Mt as getRuntimeComponentId, N as registerLoaderHook, O as getRegisteredLoaderHook, P as setActionHandleMeta, R as setNavigateMeta, S as getLazyMeta, T as getNavigateMeta, W as __eclipsaLoader, _ as __eclipsaWatch, a as EventDescriptor, b as getComponentMeta, c as LoaderHandleMeta, d as SignalMeta, f as WatchMeta, g as __eclipsaLazy, h as __eclipsaEvent, i as ComponentOptions, j as getWatchMeta, k as getRegisteredLoaderHookIds, l as LoaderHookMeta, m as __eclipsaComponent, n as ActionHookMeta, o as LazyMeta, p as WatchReference, r as ComponentMeta, s as LazyReference, t as ActionHandleMeta, u as NavigateMeta, v as getActionHandleMeta, vt as __eclipsaAction, w as getLoaderHookMeta, x as getEventMeta, y as getActionHookMeta, z as setSignalMeta } from "../internal-Dmvt_AGE.mjs";
|
|
2
|
+
export { ActionHandleMeta, ActionHookMeta, ComponentMeta, ComponentOptions, EventDescriptor, LazyMeta, LazyReference, LoaderHandleMeta, LoaderHookMeta, NavigateMeta, SignalMeta, WatchMeta, WatchReference, __eclipsaAction, __eclipsaComponent, __eclipsaEvent, __eclipsaLazy, __eclipsaLoader, __eclipsaWatch, getActionHandleMeta, getActionHookMeta, getComponentMeta, getEventMeta, getLazyMeta, getLoaderHandleMeta, getLoaderHookMeta, getNavigateMeta, getRegisteredActionHook, getRegisteredActionHookIds, getRegisteredLoaderHook, getRegisteredLoaderHookIds, getRuntimeComponentId, getSignalMeta, getWatchMeta, registerActionHook, registerLoaderHook, setActionHandleMeta, setActionHookMeta, setLoaderHandleMeta, setLoaderHookMeta, setNavigateMeta, setSignalMeta };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { At as getLazyMeta, Bt as registerActionHook, Ct as __eclipsaEvent, Dt as getActionHookMeta, Et as getActionHandleMeta, Ft as getRegisteredActionHookIds, Gt as setLoaderHookMeta, Ht as setActionHandleMeta, It as getRegisteredLoaderHook, Jt as __eclipsaLoader, Kt as setNavigateMeta, Lt as getRegisteredLoaderHookIds, M as getRuntimeComponentId, Mt as getLoaderHookMeta, Nt as getNavigateMeta, Ot as getComponentMeta, Pt as getRegisteredActionHook, Rt as getSignalMeta, St as __eclipsaComponent, Tt as __eclipsaWatch, Ut as setActionHookMeta, Vt as registerLoaderHook, Wt as setLoaderHandleMeta, i as __eclipsaAction, jt as getLoaderHandleMeta, kt as getEventMeta, qt as setSignalMeta, wt as __eclipsaLazy, zt as getWatchMeta } from "../action-DstcBFEm.mjs";
|
|
2
|
+
export { __eclipsaAction, __eclipsaComponent, __eclipsaEvent, __eclipsaLazy, __eclipsaLoader, __eclipsaWatch, getActionHandleMeta, getActionHookMeta, getComponentMeta, getEventMeta, getLazyMeta, getLoaderHandleMeta, getLoaderHookMeta, getNavigateMeta, getRegisteredActionHook, getRegisteredActionHookIds, getRegisteredLoaderHook, getRegisteredLoaderHookIds, getRuntimeComponentId, getSignalMeta, getWatchMeta, registerActionHook, registerLoaderHook, setActionHandleMeta, setActionHookMeta, setLoaderHandleMeta, setLoaderHookMeta, setNavigateMeta, setSignalMeta };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as Component } from "../../component-DjUmyVqL.mjs";
|
|
2
|
+
import { n as Insertable, t as ClientElementLike } from "../../types-DDeNM8UH.mjs";
|
|
3
|
+
import { a as hydrate, i as createTemplate, n as attr, o as insert, r as createComponent, t as effect } from "../../mod-CaLAdQcH.mjs";
|
|
4
|
+
|
|
5
|
+
//#region core/prod-client/eurl.d.ts
|
|
6
|
+
declare const fetchEurl: (id: string) => Promise<unknown>;
|
|
7
|
+
declare const getEurl: (id: string) => unknown;
|
|
8
|
+
declare const eurlFn: (id: string) => Promise<unknown>;
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region core/prod-client/dom.d.ts
|
|
11
|
+
interface ComponentResult {
|
|
12
|
+
(): void;
|
|
13
|
+
vars: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
declare const createComponentResult: (vars: Record<string, unknown>, elem: ComponentResult) => ComponentResult;
|
|
16
|
+
declare const createComponentEurl: (elem: HTMLElement, signalI: number, Component: Component, props: Record<string, unknown>) => void;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ClientElementLike, Insertable, attr, createComponent, createComponentEurl, createComponentResult, createTemplate, effect, eurlFn, fetchEurl, getEurl, hydrate, insert };
|
|
19
|
+
//# sourceMappingURL=mod.d.mts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { J as renderClientInsertable, N as getRuntimeContainer } from "../../action-DstcBFEm.mjs";
|
|
2
|
+
import { i as jsxDEV } from "../../jsx-dev-runtime-CY60yQJY.mjs";
|
|
3
|
+
import "../../signal-D1WmFjmJ.mjs";
|
|
4
|
+
import "../../snapshot-BG0kq9wt.mjs";
|
|
5
|
+
import { a as hydrate, i as createTemplate, n as attr, o as insert, r as createComponent, t as effect } from "../../client-D1zMr8hs.mjs";
|
|
6
|
+
//#region core/prod-client/eurl.ts
|
|
7
|
+
const eurlMaps = /* @__PURE__ */ new Map();
|
|
8
|
+
const fetchEurl = async (id) => {
|
|
9
|
+
const url = `/${id}`;
|
|
10
|
+
const got = eurlMaps.get(id);
|
|
11
|
+
if (got) return got;
|
|
12
|
+
const imported = await import(
|
|
13
|
+
/* @vite-ignore */
|
|
14
|
+
url
|
|
15
|
+
);
|
|
16
|
+
eurlMaps.set(id, imported);
|
|
17
|
+
return imported;
|
|
18
|
+
};
|
|
19
|
+
const getEurl = (id) => {
|
|
20
|
+
const data = eurlMaps.get(id);
|
|
21
|
+
if (!data) throw new Error(`eurl ${id} haven't loaded yet.`);
|
|
22
|
+
return data;
|
|
23
|
+
};
|
|
24
|
+
const eurlFn = async (id) => {
|
|
25
|
+
return (await fetchEurl(id)).default;
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region core/prod-client/dom.ts
|
|
29
|
+
const createComponentResult = (vars, elem) => {
|
|
30
|
+
elem.vars = vars;
|
|
31
|
+
return elem;
|
|
32
|
+
};
|
|
33
|
+
const createComponentEurl = (elem, signalI, Component, props) => {
|
|
34
|
+
const marker = elem.getAttribute("sig") === String(signalI) ? elem : Array.from(elem.querySelectorAll("*")).find((candidate) => candidate.getAttribute("sig") === String(signalI));
|
|
35
|
+
if (!marker?.parentNode) return;
|
|
36
|
+
const runtimeContainer = getRuntimeContainer();
|
|
37
|
+
const nodes = renderClientInsertable(jsxDEV(Component, props, null, false, {}), runtimeContainer);
|
|
38
|
+
for (const node of nodes) marker.parentNode.insertBefore(node, marker);
|
|
39
|
+
marker.remove();
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { attr, createComponent, createComponentEurl, createComponentResult, createTemplate, effect, eurlFn, fetchEurl, getEurl, hydrate, insert };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=mod.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.mjs","names":[],"sources":["../../../core/prod-client/eurl.ts","../../../core/prod-client/dom.ts"],"sourcesContent":["const eurlMaps = new Map<string, unknown>()\n\nexport const fetchEurl = async (id: string): Promise<unknown> => {\n const url = `/${id}`\n const got = eurlMaps.get(id)\n if (got) {\n return got\n }\n const imported = await import(/* @vite-ignore */ url)\n eurlMaps.set(id, imported)\n return imported\n}\n\nexport const getEurl = (id: string): unknown => {\n const data = eurlMaps.get(id)\n if (!data) {\n throw new Error(`eurl ${id} haven't loaded yet.`)\n }\n return data\n}\n\nexport const eurlFn = async (id: string): Promise<unknown> => {\n const imported = (await fetchEurl(id)) as {\n default: (vars: Record<string, unknown>) => () => unknown\n parentEurl: string\n depEurls: string[]\n }\n\n return imported.default\n}\n","import { jsxDEV } from '../../jsx/jsx-dev-runtime.ts'\nimport type { Component } from '../component.ts'\nimport { getRuntimeContainer, renderClientInsertable } from '../runtime.ts'\n\ninterface ComponentResult {\n (): void\n vars: Record<string, unknown>\n}\nexport const createComponentResult = (vars: Record<string, unknown>, elem: ComponentResult) => {\n elem.vars = vars\n\n return elem\n}\n\nexport const createTemplate = (templateHTML: string) => {\n let template: HTMLTemplateElement\n return () => {\n if (!template) {\n template = document.createElement('template')\n template.innerHTML = templateHTML\n }\n const content = (template.cloneNode(true) as HTMLTemplateElement).content.firstChild as Node\n return content\n }\n}\n\nexport const createComponentEurl = (\n elem: HTMLElement,\n signalI: number,\n Component: Component,\n props: Record<string, unknown>,\n) => {\n const marker =\n elem.getAttribute('sig') === String(signalI)\n ? elem\n : Array.from(elem.querySelectorAll('*')).find(\n (candidate) => candidate.getAttribute('sig') === String(signalI),\n )\n\n if (!marker?.parentNode) {\n return\n }\n\n const runtimeContainer = getRuntimeContainer()\n const nodes = renderClientInsertable(jsxDEV(Component, props, null, false, {}), runtimeContainer)\n\n for (const node of nodes) {\n marker.parentNode.insertBefore(node, marker)\n }\n marker.remove()\n}\n"],"mappings":";;;;;;AAAA,MAAM,2BAAW,IAAI,KAAsB;AAE3C,MAAa,YAAY,OAAO,OAAiC;CAC/D,MAAM,MAAM,IAAI;CAChB,MAAM,MAAM,SAAS,IAAI,GAAG;AAC5B,KAAI,IACF,QAAO;CAET,MAAM,WAAW,MAAM;;EAA0B;;AACjD,UAAS,IAAI,IAAI,SAAS;AAC1B,QAAO;;AAGT,MAAa,WAAW,OAAwB;CAC9C,MAAM,OAAO,SAAS,IAAI,GAAG;AAC7B,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,QAAQ,GAAG,sBAAsB;AAEnD,QAAO;;AAGT,MAAa,SAAS,OAAO,OAAiC;AAO5D,SANkB,MAAM,UAAU,GAAG,EAMrB;;;;ACpBlB,MAAa,yBAAyB,MAA+B,SAA0B;AAC7F,MAAK,OAAO;AAEZ,QAAO;;AAeT,MAAa,uBACX,MACA,SACA,WACA,UACG;CACH,MAAM,SACJ,KAAK,aAAa,MAAM,KAAK,OAAO,QAAQ,GACxC,OACA,MAAM,KAAK,KAAK,iBAAiB,IAAI,CAAC,CAAC,MACpC,cAAc,UAAU,aAAa,MAAM,KAAK,OAAO,QAAQ,CACjE;AAEP,KAAI,CAAC,QAAQ,WACX;CAGF,MAAM,mBAAmB,qBAAqB;CAC9C,MAAM,QAAQ,uBAAuB,OAAO,WAAW,OAAO,MAAM,OAAO,EAAE,CAAC,EAAE,iBAAiB;AAEjG,MAAK,MAAM,QAAQ,MACjB,QAAO,WAAW,aAAa,MAAM,OAAO;AAE9C,QAAO,QAAQ"}
|