@askrjs/askr 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/access-CEA2pOry.js +1046 -0
  3. package/dist/actions/index.d.ts +16 -2
  4. package/dist/actions/index.js +5 -5
  5. package/dist/{activity-FirwPXA_.js → activity-oy2YFTFF.js} +10 -16
  6. package/dist/benchmark.js +8 -9
  7. package/dist/boot/index.d.ts +19 -9
  8. package/dist/boot/index.js +1 -1
  9. package/dist/{boot-tWyF6121.js → boot-DLplW9h4.js} +700 -441
  10. package/dist/capabilities-Bbf0mlp9.js +42 -0
  11. package/dist/components/index.d.ts +11 -8
  12. package/dist/components/index.js +1 -1
  13. package/dist/{compose-ref-Bfaf4kUC.js → compose-ref-v0qGlHoN.js} +7 -1
  14. package/dist/control/index.d.ts +20 -2
  15. package/dist/control/index.js +1 -1
  16. package/dist/{control-C-wSaq9V.js → control-BR_mrX__.js} +4 -4
  17. package/dist/core.d.ts +163 -0
  18. package/dist/csp-nonce-BfFWcd0w.js +173 -0
  19. package/dist/data/index.d.ts +74 -2
  20. package/dist/data/index.js +3 -3
  21. package/dist/{data-ghKopAbp.js → data-2edW0jhF.js} +108 -122
  22. package/dist/{data-runtime-7t_Y0iv3.js → data-runtime-CxoY98lX.js} +22 -15
  23. package/dist/{deferred-CxjWCkIn.js → deferred-CbgNhf67.js} +5 -5
  24. package/dist/dom-renderer.d.ts +77 -0
  25. package/dist/domains/actions.d.ts +70 -0
  26. package/dist/domains/component.d.ts +119 -0
  27. package/dist/domains/context.d.ts +73 -0
  28. package/dist/domains/control.d.ts +328 -0
  29. package/dist/domains/data.d.ts +461 -0
  30. package/dist/domains/diagnostics.d.ts +21 -0
  31. package/dist/domains/lifecycle.d.ts +112 -0
  32. package/dist/domains/refs.d.ts +18 -0
  33. package/dist/domains/renderer.d.ts +127 -0
  34. package/dist/domains/routing.d.ts +501 -0
  35. package/dist/domains/scheduler.d.ts +79 -0
  36. package/dist/domains/server.d.ts +112 -0
  37. package/dist/domains/state.d.ts +129 -0
  38. package/dist/domains/telemetry.d.ts +29 -0
  39. package/dist/eager-control.d.ts +8 -0
  40. package/dist/{effect-CNwstBBD.js → effect-C3Zsc1k6.js} +14 -41
  41. package/dist/{types-DWVrKn9N.d.ts → elements.d.ts} +79 -42
  42. package/dist/{for-internal-DyBHfKJA.js → for-state-BDykeOJL.js} +598 -494
  43. package/dist/foundations/icon/index.d.ts +67 -16
  44. package/dist/foundations/icon/index.js +1 -1
  45. package/dist/foundations/index.d.ts +26 -3
  46. package/dist/foundations/index.js +1 -1
  47. package/dist/foundations/interactions/index.d.ts +73 -34
  48. package/dist/foundations/interactions/index.js +1 -1
  49. package/dist/foundations/state/index.d.ts +12 -5
  50. package/dist/foundations/state/index.js +1 -1
  51. package/dist/foundations/structures/index.d.ts +44 -3
  52. package/dist/foundations/structures/index.js +1 -1
  53. package/dist/foundations/utilities/index.d.ts +34 -3
  54. package/dist/foundations/utilities/index.js +1 -1
  55. package/dist/fx/index.d.ts +72 -25
  56. package/dist/fx/index.js +8 -8
  57. package/dist/index.d.ts +121 -4
  58. package/dist/index.js +316 -47
  59. package/dist/{component-internal-C4hKKQBF.js → instance-VAFYVJOa.js} +495 -283
  60. package/dist/{interactions-D102JxBR.js → interactions-CTeACdT_.js} +1 -1
  61. package/dist/jsx-dev-runtime.d.ts +51 -11
  62. package/dist/jsx-globals.d.ts +2 -0
  63. package/dist/jsx-runtime-CPJXAOBF.js +43 -0
  64. package/dist/jsx-runtime.d.ts +17 -3
  65. package/dist/jsx-runtime.js +2 -42
  66. package/dist/jsx.d.ts +108 -0
  67. package/dist/{manifest-D6rfj_jC.js → manifest-D1P3UNWV.js} +4 -9
  68. package/dist/{navigate-ZZu1IV0B.js → navigate-prC5V8XV.js} +125 -472
  69. package/dist/{navigate-F4sHgWbw.d.ts → navigation.d.ts} +8 -8
  70. package/dist/{readable-Di1fzSwm.js → notify-DxxuDPeY.js} +96 -34
  71. package/dist/{query-registry-Bua3cDyb.js → query-registry-LrYpQsDJ.js} +1 -1
  72. package/dist/{compose-ref-DOJHoW5X.d.ts → refs.d.ts} +11 -7
  73. package/dist/{ssr-Doog-AfJ.js → render-resolved-BC0W7_5b.js} +165 -558
  74. package/dist/{renderer-Cl23O0hV.js → renderer-CT0HeY58.js} +6825 -5692
  75. package/dist/{resolution-ClD-K7Lz.js → resolution-3DskUkjG.js} +189 -180
  76. package/dist/{resource-operation-Vz1S5h2k.js → resource-18-sFRl9.js} +98 -58
  77. package/dist/resources/index.d.ts +64 -12
  78. package/dist/resources/index.js +214 -8
  79. package/dist/route-activity.d.ts +21 -0
  80. package/dist/{route-matching-Bo6UqG-5.js → route-matching-CUzZ31gT.js} +68 -82
  81. package/dist/router/index.d.ts +378 -79
  82. package/dist/router/index.js +9 -9
  83. package/dist/router-internal-7nuNEHfG.js +36 -0
  84. package/dist/scope-Cq_iYbTR.js +403 -0
  85. package/dist/{selector-CsKuomw0.js → selector-BSPVkjKP.js} +26 -27
  86. package/dist/{shared-CYBH3F8I.js → shared-kU8yvryp.js} +3 -6
  87. package/dist/{snapshot-source-BB42xgwb.js → snapshot-source-An4iKajG.js} +1 -1
  88. package/dist/ssg/index.d.ts +51 -15
  89. package/dist/ssg/index.js +269 -209
  90. package/dist/ssr/index.d.ts +121 -68
  91. package/dist/ssr/index.js +2 -1
  92. package/dist/ssr-CiNm6Vzl.js +393 -0
  93. package/dist/{ssr-DSHd_Q9K.js → ssr-EPjwJH5R.js} +5 -1
  94. package/dist/{state-BGJgYSyQ.js → state-BXJfudq1.js} +10 -15
  95. package/dist/{structures-DFyK5AdQ.js → structures-CjEzfj4h.js} +37 -57
  96. package/dist/{index-CTpMmzgN.d.ts → structures.d.ts} +57 -36
  97. package/dist/testing/index.d.ts +123 -24
  98. package/dist/testing/index.js +24 -61
  99. package/dist/timer-C7uqnJVt.js +85 -0
  100. package/dist/{index-B1gu0_m0.d.ts → utilities.d.ts} +24 -13
  101. package/dist/{verify-hydration-BZPJ_kYa.js → verify-hydration-ikaxotf7.js} +8 -5
  102. package/package.json +12 -14
  103. package/dist/access-BucjYZcX.js +0 -509
  104. package/dist/activity-DooIuxQO.d.ts +0 -14
  105. package/dist/benchmark.d.ts +0 -26
  106. package/dist/cleanup-TXSsApEl.js +0 -535
  107. package/dist/component-cleanup-jdbgjkT1.js +0 -143
  108. package/dist/component-scope-4I3yEMkb.js +0 -195
  109. package/dist/control-Cxag1yqV.d.ts +0 -8
  110. package/dist/csp-nonce-9NFUb7hJ.js +0 -72
  111. package/dist/css-BuPaTOfe.js +0 -70
  112. package/dist/fastlane-BKZduiBQ.js +0 -166
  113. package/dist/index-Dgjbo2gU.d.ts +0 -1456
  114. package/dist/jsx-runtime-Cg7GqY1S.d.ts +0 -2
  115. package/dist/jsx-runtime-gVIaTPw0.d.ts +0 -38
  116. package/dist/lifecycle-batch-63aXFf2S.js +0 -253
  117. package/dist/lifecycle-operations-Q0k3EFnG.js +0 -287
@@ -1,535 +0,0 @@
1
- import { l as runRuntimeHandlerScope, y as logger } from "./access-BucjYZcX.js";
2
- import "./fastlane-BKZduiBQ.js";
3
- import { T as withAppRenderRuntime, d as getCurrentAppRenderRuntime } from "./component-scope-4I3yEMkb.js";
4
- import { t as cleanupComponent } from "./component-cleanup-jdbgjkT1.js";
5
- import { u as registerLifecycleTransaction } from "./lifecycle-batch-63aXFf2S.js";
6
- import { n as setRef } from "./compose-ref-Bfaf4kUC.js";
7
- //#region src/runtime/events.ts
8
- /**
9
- * Event delegation system for Askr
10
- *
11
- * Provides efficient event handling by attaching listeners to a container
12
- * instead of individual elements. This significantly reduces memory usage
13
- * and improves performance when many elements have the same event type.
14
- *
15
- * Delegated handling is enabled by default. Tests and internal runtime code
16
- * can still disable or re-enable it when they need to exercise both modes.
17
- */
18
- const DELEGATED_EVENTS = [
19
- "click",
20
- "dblclick",
21
- "mousedown",
22
- "mouseup",
23
- "mouseover",
24
- "mouseout",
25
- "mousemove",
26
- "focus",
27
- "blur",
28
- "input",
29
- "change",
30
- "keydown",
31
- "keyup",
32
- "keypress",
33
- "submit",
34
- "scroll",
35
- "wheel",
36
- "touchstart",
37
- "touchend",
38
- "touchmove",
39
- "touchcancel"
40
- ];
41
- function createDelegatedEventFacade(event, currentTarget) {
42
- return new Proxy(event, { get(target, property, _receiver) {
43
- if (property === "currentTarget") return currentTarget;
44
- const value = Reflect.get(target, property, target);
45
- return typeof value === "function" ? value.bind(target) : value;
46
- } });
47
- }
48
- const DELEGATED_HANDLERS = Symbol("askr.delegated-handlers");
49
- const delegatedHandlerFallback = /* @__PURE__ */ new WeakMap();
50
- function getDelegatedHandlerStore(element) {
51
- return element[DELEGATED_HANDLERS] ?? delegatedHandlerFallback.get(element);
52
- }
53
- function isElementNode(node) {
54
- if (!node || typeof node !== "object") return false;
55
- if (typeof Element !== "undefined") return node instanceof Element;
56
- return node.nodeType === 1;
57
- }
58
- function setDelegatedHandlerStore(element, store) {
59
- const host = element;
60
- try {
61
- host[DELEGATED_HANDLERS] = store;
62
- if (host[DELEGATED_HANDLERS] === store) return;
63
- } catch {}
64
- delegatedHandlerFallback.set(element, store);
65
- }
66
- function deleteDelegatedHandlerStore(element) {
67
- const host = element;
68
- if (host[DELEGATED_HANDLERS] !== void 0) try {
69
- delete host[DELEGATED_HANDLERS];
70
- return;
71
- } catch {}
72
- delegatedHandlerFallback.delete(element);
73
- }
74
- let eventDelegationEnabled = true;
75
- const containerDelegatedListeners = /* @__PURE__ */ new Map();
76
- function isEventDelegationEnabled() {
77
- return eventDelegationEnabled;
78
- }
79
- function usesDelegatedCapture(eventName) {
80
- return eventName === "focus" || eventName === "blur" || eventName === "scroll";
81
- }
82
- function removeContainerDelegatedListener(container, eventName, handler) {
83
- if (usesDelegatedCapture(eventName)) {
84
- container.removeEventListener(eventName, handler, true);
85
- return;
86
- }
87
- container.removeEventListener(eventName, handler);
88
- }
89
- function decrementContainerListenerUsage(entry) {
90
- const listeners = containerDelegatedListeners.get(entry.container);
91
- const listener = listeners?.get(entry.eventName);
92
- if (!listener) return;
93
- listener.usage -= 1;
94
- if (listener.usage > 0) return;
95
- removeContainerDelegatedListener(entry.container, entry.eventName, listener.handler);
96
- listeners?.delete(entry.eventName);
97
- if (listeners?.size === 0) containerDelegatedListeners.delete(entry.container);
98
- }
99
- function getDelegationContainer() {
100
- if (typeof document !== "undefined") return document.body;
101
- return null;
102
- }
103
- function attachDelegatedListener(container, element, eventName, handler, originalHandler, options, fresh = false) {
104
- const existingStore = fresh ? void 0 : getDelegatedHandlerStore(element);
105
- const hadHandler = existingStore instanceof Map ? existingStore.has(eventName) : existingStore?.eventName === eventName;
106
- let containerListeners = containerDelegatedListeners.get(container);
107
- if (!containerListeners) {
108
- containerListeners = /* @__PURE__ */ new Map();
109
- containerDelegatedListeners.set(container, containerListeners);
110
- }
111
- let containerListener = containerListeners.get(eventName);
112
- if (!containerListener) {
113
- const delegatedHandler = (e) => {
114
- runRuntimeHandlerScope(() => {
115
- const path = [];
116
- const seenPathNodes = /* @__PURE__ */ new Set();
117
- let node = e.target;
118
- while (node) {
119
- if (!seenPathNodes.has(node)) {
120
- seenPathNodes.add(node);
121
- path.push(node);
122
- }
123
- if (node === container) break;
124
- node = isElementNode(node) ? node.parentNode : node.parentNode;
125
- }
126
- if (typeof e.composedPath === "function") {
127
- for (const composedNode of e.composedPath()) if (!seenPathNodes.has(composedNode)) {
128
- seenPathNodes.add(composedNode);
129
- path.push(composedNode);
130
- }
131
- }
132
- const dispatchPath = [];
133
- for (const node of path) {
134
- if (node === container) break;
135
- if (!isElementNode(node)) continue;
136
- const store = getDelegatedHandlerStore(node);
137
- const entry = !store ? void 0 : store instanceof Map ? store.get(eventName) : store.eventName === eventName ? store : void 0;
138
- if (entry) dispatchPath.push({
139
- node,
140
- entry
141
- });
142
- }
143
- if (eventName === "focus" || eventName === "blur" || eventName === "scroll") dispatchPath.reverse();
144
- for (const { node, entry } of dispatchPath) {
145
- try {
146
- withAppRenderRuntime(entry.appRuntime, () => entry.handler(createDelegatedEventFacade(e, node)));
147
- } catch (error) {
148
- logger.error("[Askr] Delegated event error:", error);
149
- }
150
- if (e.cancelBubble) break;
151
- }
152
- }, "sync");
153
- };
154
- const passiveOptions = getPassiveOptions(eventName);
155
- const listenerOptions = usesDelegatedCapture(eventName) ? {
156
- ...passiveOptions ?? options,
157
- capture: true
158
- } : passiveOptions ?? options;
159
- container.addEventListener(eventName, delegatedHandler, listenerOptions);
160
- containerListener = {
161
- handler: delegatedHandler,
162
- usage: 0
163
- };
164
- containerListeners.set(eventName, containerListener);
165
- }
166
- setDelegatedHandlerForElement(element, {
167
- handler,
168
- original: originalHandler,
169
- appRuntime: getCurrentAppRenderRuntime(),
170
- container,
171
- eventName,
172
- options
173
- }, existingStore);
174
- if (!hadHandler) containerListener.usage += 1;
175
- }
176
- function setDelegatedHandlerForElement(element, entry, existing = getDelegatedHandlerStore(element)) {
177
- if (!existing) {
178
- setDelegatedHandlerStore(element, entry);
179
- return;
180
- }
181
- if (existing instanceof Map) {
182
- existing.set(entry.eventName, entry);
183
- return;
184
- }
185
- if (existing.eventName === entry.eventName) {
186
- setDelegatedHandlerStore(element, entry);
187
- return;
188
- }
189
- const next = /* @__PURE__ */ new Map();
190
- next.set(existing.eventName, existing);
191
- next.set(entry.eventName, entry);
192
- setDelegatedHandlerStore(element, next);
193
- }
194
- function getPassiveOptions(eventName) {
195
- if (eventName === "scroll") return { passive: true };
196
- }
197
- function addDelegatedListener(element, eventName, handler, originalHandler, options) {
198
- const container = getDelegationContainer();
199
- if (!container) return;
200
- attachDelegatedListener(container, element, eventName, handler, originalHandler, options);
201
- }
202
- /** @internal Attach a delegated handler to a newly cloned element. */
203
- function addFreshDelegatedListener(element, eventName, handler, originalHandler, options) {
204
- const container = getDelegationContainer();
205
- if (!container) return;
206
- attachDelegatedListener(container, element, eventName, handler, originalHandler, options, true);
207
- }
208
- function updateDelegatedListener(element, eventName, handler, originalHandler, options) {
209
- const existing = getDelegatedHandlerForElement(element, eventName);
210
- if (!existing) return false;
211
- const container = getDelegationContainer();
212
- if (!container || existing.container !== container || !containerDelegatedListeners.get(existing.container)?.has(eventName)) {
213
- removeDelegatedListener(element, eventName);
214
- return false;
215
- }
216
- existing.handler = handler;
217
- existing.original = originalHandler;
218
- existing.appRuntime = getCurrentAppRenderRuntime();
219
- existing.options = options;
220
- return true;
221
- }
222
- function removeDelegatedListener(element, eventName) {
223
- const existing = getDelegatedHandlerStore(element);
224
- if (!existing) return;
225
- if (existing instanceof Map) {
226
- if (existing.has(eventName)) decrementContainerListenerUsage(existing.get(eventName));
227
- existing.delete(eventName);
228
- if (existing.size === 0) {
229
- deleteDelegatedHandlerStore(element);
230
- return;
231
- }
232
- if (existing.size === 1) {
233
- const only = existing.values().next().value;
234
- setDelegatedHandlerStore(element, only);
235
- }
236
- return;
237
- }
238
- if (existing.eventName === eventName) {
239
- decrementContainerListenerUsage(existing);
240
- deleteDelegatedHandlerStore(element);
241
- }
242
- }
243
- function getDelegatedHandlerForElement(element, eventName) {
244
- const store = getDelegatedHandlerStore(element);
245
- if (!store) return void 0;
246
- if (store instanceof Map) return store.get(eventName);
247
- return store.eventName === eventName ? store : void 0;
248
- }
249
- function getDelegatedHandlersForElement(element) {
250
- const store = getDelegatedHandlerStore(element);
251
- if (!store) return void 0;
252
- if (store instanceof Map) return store;
253
- return /* @__PURE__ */ new Map([[store.eventName, store]]);
254
- }
255
- function clearDelegatedHandlersForElement(element) {
256
- const existing = getDelegatedHandlerStore(element);
257
- if (existing instanceof Map) for (const entry of existing.values()) decrementContainerListenerUsage(entry);
258
- else if (existing) decrementContainerListenerUsage(existing);
259
- deleteDelegatedHandlerStore(element);
260
- }
261
- function isDelegatedEvent(eventName) {
262
- return DELEGATED_EVENTS.includes(eventName);
263
- }
264
- //#endregion
265
- //#region src/renderer/cleanup.ts
266
- const elementRefs = /* @__PURE__ */ new WeakMap();
267
- const refOwners = /* @__PURE__ */ new WeakMap();
268
- function isRefOwnerKey(ref) {
269
- return typeof ref === "function" || typeof ref === "object" && ref !== null;
270
- }
271
- /** @internal Return the current exact owner for ref reconciliation. */
272
- function getElementRefOwner(ref) {
273
- return isRefOwnerKey(ref) ? refOwners.get(ref) : void 0;
274
- }
275
- /** @internal Synchronize ref registries without invoking user callbacks. */
276
- function replaceElementRefBookkeeping(element, ref) {
277
- const previousRef = elementRefs.get(element);
278
- if (isRefOwnerKey(previousRef) && refOwners.get(previousRef) === element) refOwners.delete(previousRef);
279
- if (ref) {
280
- elementRefs.set(element, ref);
281
- if (isRefOwnerKey(ref)) refOwners.set(ref, element);
282
- } else elementRefs.delete(element);
283
- }
284
- function applyRefValue(ref, value) {
285
- setRef(ref, value);
286
- }
287
- function updateElementRef(element, ref) {
288
- if (registerLifecycleTransaction({}, () => updateElementRefImmediately(element, ref), () => void 0)) return;
289
- updateElementRefImmediately(element, ref);
290
- }
291
- function updateElementRefImmediately(element, ref) {
292
- const previousRef = elementRefs.get(element);
293
- if (previousRef === ref) return;
294
- if (previousRef) {
295
- applyRefValue(previousRef, null);
296
- if (getElementRefOwner(previousRef) === element) refOwners.delete(previousRef);
297
- }
298
- if (ref) {
299
- const previousOwner = getElementRefOwner(ref);
300
- if (typeof ref === "function" && previousOwner && previousOwner !== element) {
301
- elementRefs.set(element, ref);
302
- refOwners.set(ref, element);
303
- return;
304
- }
305
- applyRefValue(ref, element);
306
- elementRefs.set(element, ref);
307
- if (isRefOwnerKey(ref)) refOwners.set(ref, element);
308
- } else elementRefs.delete(element);
309
- }
310
- function removeElementRef(element) {
311
- const ref = elementRefs.get(element);
312
- if (!ref) return;
313
- if (typeof ref !== "function" && getElementRefOwner(ref) !== element) {
314
- elementRefs.delete(element);
315
- return;
316
- }
317
- applyRefValue(ref, null);
318
- const nextOwner = getElementRefOwner(ref);
319
- if (typeof ref === "function" && nextOwner && nextOwner !== element) applyRefValue(ref, nextOwner);
320
- replaceElementRefBookkeeping(element, void 0);
321
- }
322
- function cleanupSingleInstance(node, errors, strict) {
323
- const instanceList = node.__ASKR_INSTANCES;
324
- const primaryInstance = node.__ASKR_INSTANCE;
325
- if (!instanceList && !primaryInstance) return;
326
- const instances = /* @__PURE__ */ new Set();
327
- if (Array.isArray(instanceList)) {
328
- for (const instance of instanceList) if (instance) instances.add(instance);
329
- }
330
- if (primaryInstance) instances.add(primaryInstance);
331
- for (const instance of instances) try {
332
- cleanupComponent(instance);
333
- } catch (err) {
334
- if (strict) errors.push(err);
335
- else logger.warn("[Askr] cleanupComponent failed:", err);
336
- }
337
- try {
338
- delete node.__ASKR_INSTANCE;
339
- delete node.__ASKR_INSTANCES;
340
- } catch (e) {
341
- if (strict) errors.push(e);
342
- }
343
- }
344
- function teardownSingleElement(element, errors, strict) {
345
- try {
346
- removeElementRef(element);
347
- } catch (err) {
348
- if (strict) errors.push(err);
349
- else logger.warn("[Askr] removeElementRef failed:", err);
350
- }
351
- try {
352
- removeElementListeners(element);
353
- } catch (err) {
354
- if (strict) errors.push(err);
355
- else logger.warn("[Askr] removeElementListeners failed:", err);
356
- }
357
- try {
358
- removeElementReactiveProps(element);
359
- } catch (err) {
360
- if (strict) errors.push(err);
361
- else logger.warn("[Askr] removeElementReactiveProps failed:", err);
362
- }
363
- try {
364
- cleanupSingleInstance(element, errors, strict);
365
- } catch (err) {
366
- if (strict) errors.push(err);
367
- else logger.warn("[Askr] cleanupSingleInstance failed:", err);
368
- }
369
- }
370
- function forEachDescendantElement(root, visit) {
371
- try {
372
- const doc = root.ownerDocument;
373
- const createTreeWalker = doc?.createTreeWalker;
374
- if (typeof createTreeWalker === "function") {
375
- const walker = createTreeWalker.call(doc, root, 1);
376
- let n = walker.firstChild();
377
- while (n) {
378
- visit(n);
379
- n = walker.nextNode();
380
- }
381
- return;
382
- }
383
- } catch {}
384
- const descendants = root.querySelectorAll("*");
385
- for (let i = 0; i < descendants.length; i++) visit(descendants[i]);
386
- }
387
- /** @internal Walk every descendant node, including component-host comments. */
388
- function forEachDescendantNode(root, visit) {
389
- try {
390
- const doc = root.ownerDocument;
391
- const createTreeWalker = doc?.createTreeWalker;
392
- if (typeof createTreeWalker === "function") {
393
- const walker = createTreeWalker.call(doc, root, 4294967295);
394
- let node = walker.nextNode();
395
- while (node) {
396
- visit(node);
397
- node = walker.nextNode();
398
- }
399
- return;
400
- }
401
- } catch {}
402
- const stack = Array.from(root.childNodes).reverse();
403
- while (stack.length > 0) {
404
- const node = stack.pop();
405
- visit(node);
406
- for (let child = node.lastChild; child; child = child.previousSibling) stack.push(child);
407
- }
408
- }
409
- function forEachElementInSubtree(root, visit) {
410
- visit(root);
411
- forEachDescendantElement(root, visit);
412
- }
413
- const elementListeners = /* @__PURE__ */ new WeakMap();
414
- /**
415
- * Clean up component instance attached to a DOM node
416
- * Accepts an optional `opts.strict` flag to surface errors instead of swallowing them.
417
- */
418
- function cleanupInstanceIfPresent(node, opts) {
419
- if (!node) return;
420
- const strict = opts?.strict ?? false;
421
- const errors = strict ? [] : null;
422
- try {
423
- cleanupSingleInstance(node, errors, strict);
424
- } catch (err) {
425
- if (strict) errors.push(err);
426
- else logger.warn("[Askr] cleanupInstanceIfPresent failed:", err);
427
- }
428
- try {
429
- forEachDescendantNode(node, (descendant) => {
430
- try {
431
- cleanupSingleInstance(descendant, errors, strict);
432
- } catch (err) {
433
- if (strict) errors.push(err);
434
- else logger.warn("[Askr] cleanupInstanceIfPresent descendant cleanup failed:", err);
435
- }
436
- });
437
- } catch (err) {
438
- if (strict) errors.push(err);
439
- else logger.warn("[Askr] cleanupInstanceIfPresent descendant query failed:", err);
440
- }
441
- if (errors && errors.length > 0) throw new AggregateError(errors, "cleanupInstanceIfPresent failed");
442
- }
443
- function cleanupInstancesUnder(node, opts) {
444
- cleanupInstanceIfPresent(node, opts);
445
- }
446
- function teardownNodeSubtree(node, opts) {
447
- if (!node) return;
448
- const strict = opts?.strict ?? false;
449
- const errors = strict ? [] : null;
450
- if (!(node instanceof Element)) {
451
- cleanupSingleInstance(node, errors, strict);
452
- if (errors && errors.length > 0) throw new AggregateError(errors, "teardownNodeSubtree failed");
453
- return;
454
- }
455
- try {
456
- teardownSingleElement(node, errors, strict);
457
- forEachDescendantNode(node, (descendant) => {
458
- if (descendant instanceof Element) teardownSingleElement(descendant, errors, strict);
459
- else cleanupSingleInstance(descendant, errors, strict);
460
- });
461
- } catch (err) {
462
- if (strict) errors.push(err);
463
- else logger.warn("[Askr] teardownNodeSubtree failed:", err);
464
- }
465
- if (errors && errors.length > 0) throw new AggregateError(errors, "teardownNodeSubtree failed");
466
- }
467
- const REACTIVE_CHILDREN_KEY = "__askr_reactive_children__";
468
- const elementReactivePropsCleanup = /* @__PURE__ */ new WeakMap();
469
- function getElementReactivePropsCleanupMap(element, create = false) {
470
- const store = elementReactivePropsCleanup.get(element);
471
- if (store instanceof Map) return store;
472
- if (store) {
473
- const map = /* @__PURE__ */ new Map([[store._bindingKey, store]]);
474
- elementReactivePropsCleanup.set(element, map);
475
- return map;
476
- }
477
- if (!create) return;
478
- const map = /* @__PURE__ */ new Map();
479
- elementReactivePropsCleanup.set(element, map);
480
- return map;
481
- }
482
- function setDirectElementReactivePropCleanup(element, bindingKey, entry) {
483
- if (!elementReactivePropsCleanup.get(element)) {
484
- entry._bindingKey = bindingKey;
485
- elementReactivePropsCleanup.set(element, entry);
486
- return;
487
- }
488
- getElementReactivePropsCleanupMap(element, true).set(bindingKey, entry);
489
- }
490
- /** @internal Publish the first reactive binding on a newly created element. */
491
- function setFreshElementReactivePropCleanup(element, bindingKey, entry) {
492
- entry._bindingKey = bindingKey;
493
- elementReactivePropsCleanup.set(element, entry);
494
- }
495
- function getElementReactivePropCleanupSize(element) {
496
- const store = elementReactivePropsCleanup.get(element);
497
- return store instanceof Map ? store.size : store ? 1 : 0;
498
- }
499
- function forEachElementReactivePropCleanup(element, visit) {
500
- const store = elementReactivePropsCleanup.get(element);
501
- if (store instanceof Map) for (const entry of store.values()) visit(entry);
502
- else if (store) visit(store);
503
- }
504
- function removeElementReactiveProps(element) {
505
- if (elementReactivePropsCleanup.has(element)) {
506
- forEachElementReactivePropCleanup(element, (entry) => {
507
- try {
508
- entry.cleanup();
509
- } catch (err) {
510
- logger.warn("[Askr] reactive prop cleanup failed:", err);
511
- }
512
- });
513
- elementReactivePropsCleanup.delete(element);
514
- }
515
- }
516
- function removeElementListeners(element) {
517
- const map = elementListeners.get(element);
518
- if (map) {
519
- for (const entry of map.values()) if (entry.isDelegated) removeDelegatedListener(element, entry.eventName);
520
- else if (entry.options !== void 0) element.removeEventListener(entry.eventName, entry.handler, entry.options);
521
- else element.removeEventListener(entry.eventName, entry.handler);
522
- elementListeners.delete(element);
523
- }
524
- clearDelegatedHandlersForElement(element);
525
- }
526
- function removeAllListeners(root) {
527
- if (!root) return;
528
- forEachElementInSubtree(root, (el) => {
529
- removeElementRef(el);
530
- removeElementListeners(el);
531
- removeElementReactiveProps(el);
532
- });
533
- }
534
- //#endregion
535
- export { getDelegatedHandlersForElement as C, updateDelegatedListener as D, removeDelegatedListener as E, getDelegatedHandlerForElement as S, isEventDelegationEnabled as T, teardownNodeSubtree as _, elementReactivePropsCleanup as a, addFreshDelegatedListener as b, forEachElementReactivePropCleanup as c, removeAllListeners as d, removeElementReactiveProps as f, setFreshElementReactivePropCleanup as g, setDirectElementReactivePropCleanup as h, elementListeners as i, getElementReactivePropCleanupSize as l, replaceElementRefBookkeeping as m, cleanupInstanceIfPresent as n, elementRefs as o, removeElementRef as p, cleanupInstancesUnder as r, forEachDescendantNode as s, REACTIVE_CHILDREN_KEY as t, getElementReactivePropsCleanupMap as u, updateElementRef as v, isDelegatedEvent as w, clearDelegatedHandlersForElement as x, addDelegatedListener as y };
@@ -1,143 +0,0 @@
1
- import { S as isProductionEnvironment, x as isDevelopmentEnvironment, y as logger } from "./access-BucjYZcX.js";
2
- import { a as clearCurrentComponentScope, y as restoreCurrentComponentScope } from "./component-scope-4I3yEMkb.js";
3
- import { n as cleanupReadableSubscriptions, t as cleanupReadableSubscriptionSources } from "./readable-Di1fzSwm.js";
4
- //#region src/runtime/state-diagnostics.ts
5
- /**
6
- * Report state cells that were never read during a component's completed
7
- * lifetime. A branch that has not rendered yet is not evidence that its state
8
- * is unused, so this diagnostic belongs at unmount rather than every commit.
9
- */
10
- function warnUnusedStateReads(instance) {
11
- if (isProductionEnvironment() || !instance.mounted) return;
12
- const stateValues = instance.stateValues;
13
- if (!stateValues) return;
14
- for (let i = 0; i < stateValues.length; i++) {
15
- const state = stateValues[i];
16
- const diagnosticEligible = state?._unusedStateDiagnosticEligible;
17
- const hasCommittedUsage = (state?._readers?.size ?? 0) > 0 || (state?._derivedSubscribers?.size ?? 0) > 0;
18
- if (state && diagnosticEligible !== false && !state._hasEverBeenRead && !hasCommittedUsage) {
19
- const warnings = instance.devWarningsEmitted ??= /* @__PURE__ */ new Set();
20
- const key = `unused-state:${i}`;
21
- if (warnings.has(key)) continue;
22
- warnings.add(key);
23
- try {
24
- const name = instance.fn?.name || "<anonymous>";
25
- logger.warn(`[askr] Unused state variable detected in ${name} at index ${i}. State should be read during render or removed.`);
26
- } catch {
27
- logger.warn("[askr] Unused state variable detected. State should be read during render or removed.");
28
- }
29
- }
30
- }
31
- }
32
- //#endregion
33
- //#region src/runtime/component-cleanup.ts
34
- /**
35
- * Component cleanup and owned child-scope bookkeeping.
36
- */
37
- /**
38
- * Dispose an inactive ownership generation without swapping it back onto the
39
- * component instance that now represents a different live route.
40
- */
41
- function cleanupComponentGeneration(instance, generation) {
42
- const savedScope = clearCurrentComponentScope();
43
- try {
44
- const cleanupErrors = instance.cleanupStrict ? [] : void 0;
45
- const recordCleanupError = (message, err) => {
46
- if (cleanupErrors) cleanupErrors.push(err);
47
- else if (isDevelopmentEnvironment()) logger.warn(message, err);
48
- };
49
- const ownedChildScopes = generation.ownedChildScopes;
50
- if (ownedChildScopes && ownedChildScopes.size > 0) {
51
- for (const scope of ownedChildScopes) try {
52
- scope.dispose();
53
- } catch (err) {
54
- recordCleanupError("[Askr] child scope cleanup threw:", err);
55
- }
56
- ownedChildScopes.clear();
57
- }
58
- try {
59
- cleanupReadableSubscriptionSources(instance, generation.readSources, generation.ownershipGeneration);
60
- } catch (err) {
61
- recordCleanupError("[Askr] readable subscription cleanup threw:", err);
62
- }
63
- const cleanupFns = generation.cleanupFns;
64
- generation.cleanupFns = void 0;
65
- if (cleanupFns) for (const cleanup of cleanupFns) try {
66
- cleanup();
67
- } catch (err) {
68
- recordCleanupError("[Askr] cleanup function threw:", err);
69
- }
70
- try {
71
- if (generation.abortController && !generation.abortController.signal.aborted) generation.abortController.abort();
72
- } catch (err) {
73
- recordCleanupError("[Askr] abort controller cleanup threw:", err);
74
- }
75
- generation.abortController = null;
76
- if (cleanupErrors && cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, `Cleanup failed for component ${instance.id}`);
77
- } finally {
78
- restoreCurrentComponentScope(savedScope);
79
- }
80
- }
81
- /**
82
- * Clean up component resources on unmount or route changes.
83
- */
84
- function cleanupComponent(instance) {
85
- const savedScope = clearCurrentComponentScope();
86
- try {
87
- warnUnusedStateReads(instance);
88
- const cleanupErrors = instance.cleanupStrict ? [] : void 0;
89
- const recordCleanupError = (message, err) => {
90
- if (cleanupErrors) cleanupErrors.push(err);
91
- else if (isDevelopmentEnvironment()) logger.warn(message, err);
92
- };
93
- const ownedChildScopes = instance._ownedChildScopes;
94
- if (ownedChildScopes && ownedChildScopes.size > 0) {
95
- instance._ownedChildScopes = /* @__PURE__ */ new Set();
96
- for (const scope of ownedChildScopes) try {
97
- scope.dispose();
98
- } catch (err) {
99
- recordCleanupError("[Askr] child scope cleanup threw:", err);
100
- }
101
- }
102
- const cleanupFns = instance.cleanupFns;
103
- instance.cleanupFns = void 0;
104
- if (cleanupFns) for (const cleanup of cleanupFns) try {
105
- cleanup();
106
- } catch (err) {
107
- recordCleanupError("[Askr] cleanup function threw:", err);
108
- }
109
- try {
110
- cleanupReadableSubscriptions(instance);
111
- } catch (err) {
112
- recordCleanupError("[Askr] readable subscription cleanup threw:", err);
113
- }
114
- try {
115
- if (instance.abortController && !instance.abortController.signal.aborted) instance.abortController.abort();
116
- } catch (err) {
117
- recordCleanupError("[Askr] abort controller cleanup threw:", err);
118
- }
119
- instance.abortController = null;
120
- instance.lifecycleGeneration++;
121
- instance.evaluationGeneration++;
122
- instance.mountOperations = void 0;
123
- instance.commitOperations = void 0;
124
- instance.lifecycleSlots = void 0;
125
- instance.hasPendingUpdate = false;
126
- instance.notifyUpdate = null;
127
- instance._portalErrorParent = void 0;
128
- instance._portalErrorParentGeneration = void 0;
129
- instance._placeholder = void 0;
130
- instance.mounted = false;
131
- if (cleanupErrors && cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, `Cleanup failed for component ${instance.id}`);
132
- } finally {
133
- restoreCurrentComponentScope(savedScope);
134
- }
135
- }
136
- function registerOwnedChildScope(instance, scope) {
137
- (instance._ownedChildScopes ??= /* @__PURE__ */ new Set()).add(scope);
138
- }
139
- function unregisterOwnedChildScope(instance, scope) {
140
- instance._ownedChildScopes?.delete(scope);
141
- }
142
- //#endregion
143
- export { unregisterOwnedChildScope as i, cleanupComponentGeneration as n, registerOwnedChildScope as r, cleanupComponent as t };