@askrjs/askr 0.0.68 → 0.0.70

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/dist/benchmark.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { r as flushRuntimeScheduler } from "./access-ePqdQqkV.js";
2
- import { t as installRendererBridge } from "./renderer-bZ0315dE.js";
2
+ import { t as installRendererBridge } from "./renderer-DF0hyjEr.js";
3
3
  import { t as state } from "./state-CVuQVjvK.js";
4
4
  import { t as selector } from "./selector-DueeR6Oz.js";
5
5
  import { jsx, jsxs } from "./jsx-runtime.js";
6
6
  import { i as For } from "./control-CA45Yvvu.js";
7
- import { t as createIsland } from "./boot-C8UOxI4f.js";
7
+ import { t as createIsland } from "./boot-8gP6mB3c.js";
8
8
  //#region src/bench/components/benchmark-row.tsx
9
9
  function BenchmarkRow({ item, isSelected, onSelect, onRemove }) {
10
10
  return /* @__PURE__ */ jsxs("tr", {
@@ -63,8 +63,8 @@ function BenchmarkTable({ rows, isSelected, onSelect, onRemove }) {
63
63
  installRendererBridge();
64
64
  const benchmarkMetadata = {
65
65
  packageName: "@askrjs/askr",
66
- packageVersion: "0.0.68",
67
- buildLabel: "0.0.68-local"
66
+ packageVersion: "0.0.70",
67
+ buildLabel: "0.0.70-local"
68
68
  };
69
69
  function getBenchmarkMetadata() {
70
70
  return { ...benchmarkMetadata };
@@ -1,2 +1,2 @@
1
- import { a as cleanupApp, i as hydrateSPA, n as createIslands, o as hasApp, r as createSPA, t as createIsland } from "../boot-C8UOxI4f.js";
1
+ import { a as cleanupApp, i as hydrateSPA, n as createIslands, o as hasApp, r as createSPA, t as createIsland } from "../boot-8gP6mB3c.js";
2
2
  export { cleanupApp, createIsland, createIslands, createSPA, hasApp, hydrateSPA };
@@ -3,8 +3,8 @@ import { n as Fragment, t as ELEMENT_TYPE } from "./jsx-CUpRxrLH.js";
3
3
  import { n as createComponentInstance, r as executeComponent } from "./component-internal-CPjM4n8M.js";
4
4
  import { t as cleanupComponent } from "./component-cleanup-1ZFoLLHt.js";
5
5
  import { p as isPromiseLike } from "./lifecycle-batch-COgl8jMS.js";
6
- import { a as withIntrinsicHydrationAdoption, i as registerDeferredHydrationBoundary, n as activateHydrationBoundary$1, o as setStaticChildSlotsCacheEnabled, r as clearDeferredHydrationBoundaries, t as installRendererBridge } from "./renderer-bZ0315dE.js";
7
- import { _ as teardownNodeSubtree, d as removeAllListeners } from "./cleanup-UyStxIHG.js";
6
+ import { a as withIntrinsicHydrationAdoption, c as beginHydrationListenerTransaction, d as setStaticChildSlotsCacheEnabled, i as registerDeferredHydrationBoundary, l as commitHydrationListenerTransaction, n as activateHydrationBoundary$1, o as beginHydrationDirectListenerMode, r as clearDeferredHydrationBoundaries, s as endHydrationDirectListenerMode, t as installRendererBridge, u as discardHydrationListenerTransaction } from "./renderer-DF0hyjEr.js";
7
+ import { _ as teardownNodeSubtree, d as removeAllListeners } from "./cleanup-B4BiQHx-.js";
8
8
  import { c as _applyManifest, d as getRouteRenderContext, f as getRouteRenderData, m as resolveRouteRequest, o as reviveDeferredValue, p as hasRouteRenderData, v as pageRenderEnvelope, w as assertExecutionModel } from "./deferred-zHtUheIQ.js";
9
9
  import { a as startHydrationRenderPhase, s as stopHydrationRenderPhase } from "./render-context-Clw3rFiO.js";
10
10
  import { a as disposeDefaultPortalScope, t as DefaultPortal } from "./portal-D7TC986A.js";
@@ -12,7 +12,7 @@ import { r as validateCspNonce, t as CspNonceScope } from "./csp-nonce-HGZ0vbqT.
12
12
  import { i as getDefaultDataRuntime } from "./data-runtime-SJ1BSUvk.js";
13
13
  import { a as hydrateDataRuntime } from "./query-registry-CQIT4mXr.js";
14
14
  import { d as _setActiveRouteAuthOptions, j as lockRouteRegistration, k as hasRegisteredRoutes, m as clearRouteState } from "./route-matching-DLBWDeXX.js";
15
- import { f as registerAppInstance, g as unregisterAppInstance, i as resolveRouteMeta, o as configureScrollRestoration, r as reconcileRouteMeta, t as initializeNavigation, v as setServerLocation, y as createAppRenderRuntime } from "./navigate-DpR-cML9.js";
15
+ import { f as registerAppInstance, g as unregisterAppInstance, i as resolveRouteMeta, o as configureScrollRestoration, r as reconcileRouteMeta, t as initializeNavigation, v as setServerLocation, y as createAppRenderRuntime } from "./navigate-BTPrVhqI.js";
16
16
  import "./ssr-CbQO5xd3.js";
17
17
  //#region src/boot/hydration.ts
18
18
  const DEFERRED_PAYLOAD = "__askr_deferred__";
@@ -617,12 +617,19 @@ async function hydrateSPA(config) {
617
617
  if (hydrateOptions.skipSelectors?.length) markSkippedElements(rootElement, hydrateOptions.skipSelectors);
618
618
  }
619
619
  if (hydrationRenderDataForApp) startHydrationRenderPhase(hydrationRenderDataForApp);
620
+ const listenerTransaction = beginHydrationListenerTransaction();
621
+ beginHydrationDirectListenerMode();
620
622
  try {
621
623
  mountHydratedRoot(rootElement, resolved.kind === "deny" ? bindDeniedStatus(resolved.status) : bindResolvedRouteHandler(hydrationResolved), {
622
624
  cleanupStrict: config.cleanupStrict,
623
625
  appRuntime: appRouteSource.runtime
624
626
  });
627
+ commitHydrationListenerTransaction(listenerTransaction);
628
+ } catch (error) {
629
+ discardHydrationListenerTransaction(listenerTransaction);
630
+ throw error;
625
631
  } finally {
632
+ endHydrationDirectListenerMode();
626
633
  if (hydrationRenderDataForApp) stopHydrationRenderPhase();
627
634
  }
628
635
  await registerAppNavigation(rootElement, path, { ...appRouteSource });
@@ -94,13 +94,20 @@ function attachDelegatedListener(container, element, eventName, handler, origina
94
94
  const delegatedHandler = (e) => {
95
95
  runRuntimeHandlerScope(() => {
96
96
  const path = [];
97
- if (typeof e.composedPath === "function") path.push(...e.composedPath());
98
- else {
99
- let node = e.target;
100
- while (node) {
97
+ const seenPathNodes = /* @__PURE__ */ new Set();
98
+ let node = e.target;
99
+ while (node) {
100
+ if (!seenPathNodes.has(node)) {
101
+ seenPathNodes.add(node);
101
102
  path.push(node);
102
- if (node === container) break;
103
- node = isElementNode(node) ? node.parentNode : node.parentNode;
103
+ }
104
+ if (node === container) break;
105
+ node = isElementNode(node) ? node.parentNode : node.parentNode;
106
+ }
107
+ if (typeof e.composedPath === "function") {
108
+ for (const composedNode of e.composedPath()) if (!seenPathNodes.has(composedNode)) {
109
+ seenPathNodes.add(composedNode);
110
+ path.push(composedNode);
104
111
  }
105
112
  }
106
113
  for (const node of path) {
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { h as readScope, u as defineScope } from "./component-internal-CPjM4n8M.
4
4
  import { f as syncDerivedDependencySubscriptions, l as notifyReadableReaders, o as markReactivePropsDirtySource, p as withDerivedReadTracking, r as clearDerivedDependencySubscriptions, s as markReadableDerivedSubscribersDirty, u as recordReadableRead } from "./readable-BYSoWJSv.js";
5
5
  import { g as getSignal, i as claimHookIndex, p as getCurrentInstance } from "./component-scope-CC3cojX9.js";
6
6
  import { n as isSnapshotSource } from "./snapshot-source-BB42xgwb.js";
7
- import { t as installRendererBridge } from "./renderer-bZ0315dE.js";
7
+ import { t as installRendererBridge } from "./renderer-DF0hyjEr.js";
8
8
  import { t as state } from "./state-CVuQVjvK.js";
9
9
  import { t as selector } from "./selector-DueeR6Oz.js";
10
10
  import { jsx, jsxs } from "./jsx-runtime.js";
@@ -5,7 +5,7 @@ import { l as notifyReadableReaders, o as markReactivePropsDirtySource, s as mar
5
5
  import { d as getCurrentAppRenderRuntime, f as getCurrentComponentInstance } from "./component-scope-CC3cojX9.js";
6
6
  import { n as cleanupComponentGeneration, t as cleanupComponent } from "./component-cleanup-1ZFoLLHt.js";
7
7
  import { i as drainLifecycleCommitErrors, p as isPromiseLike, r as discardLifecycleCommitBatch, s as flushLifecycleCommitBatch, t as beginLifecycleCommitBatch } from "./lifecycle-batch-COgl8jMS.js";
8
- import { _ as teardownNodeSubtree } from "./cleanup-UyStxIHG.js";
8
+ import { _ as teardownNodeSubtree } from "./cleanup-B4BiQHx-.js";
9
9
  import { d as getRouteRenderContext, f as getRouteRenderData, m as resolveRouteRequest, p as hasRouteRenderData } from "./deferred-zHtUheIQ.js";
10
10
  import { n as getActiveRenderContext } from "./render-context-Clw3rFiO.js";
11
11
  import { n as syncRouteActivitySnapshot } from "./route-activity-CNJfpwx-.js";
@@ -9,7 +9,7 @@ import { t as cleanupComponent } from "./component-cleanup-1ZFoLLHt.js";
9
9
  import { c as getCurrentLifecycleCommitBatch, l as registerLifecycleRollback, p as isPromiseLike, r as discardLifecycleCommitBatch, s as flushLifecycleCommitBatch, t as beginLifecycleCommitBatch, u as registerLifecycleTransaction } from "./lifecycle-batch-COgl8jMS.js";
10
10
  import { _ as createChildScope, a as registerForStateTransaction, c as captureForFallbackTransactionSnapshot, d as clearCaseDomUpdateState, f as clearShowDomUpdateState, g as evaluateShowState, h as evaluateCaseState, i as evaluateForState, l as captureForItemTransactionSnapshot, n as clearForDomUpdateState, o as rollbackForStateTransaction, t as beginForStateTransaction, v as disposeChildScope, y as rerenderChildScope } from "./for-internal-BtK9Htl0.js";
11
11
  import { n as createOwnedFineGrainedEffect, r as markFineGrainedEffectsDirtySource, t as createFineGrainedEffect } from "./effect-CFUzIpqX.js";
12
- import { C as getDelegatedHandlersForElement, D as updateDelegatedListener, E as removeDelegatedListener, S as getDelegatedHandlerForElement, T as isEventDelegationEnabled, _ as teardownNodeSubtree, a as elementReactivePropsCleanup, b as addFreshDelegatedListener, c as forEachElementReactivePropCleanup, d as removeAllListeners, f as removeElementReactiveProps, g as setFreshElementReactivePropCleanup, h as setDirectElementReactivePropCleanup, i as elementListeners, l as getElementReactivePropCleanupSize, m as replaceElementRefBookkeeping, n as cleanupInstanceIfPresent, o as elementRefs, p as removeElementRef, r as cleanupInstancesUnder, s as forEachDescendantNode, t as REACTIVE_CHILDREN_KEY, u as getElementReactivePropsCleanupMap, v as updateElementRef, w as isDelegatedEvent, x as clearDelegatedHandlersForElement, y as addDelegatedListener } from "./cleanup-UyStxIHG.js";
12
+ import { C as getDelegatedHandlersForElement, D as updateDelegatedListener, E as removeDelegatedListener, S as getDelegatedHandlerForElement, T as isEventDelegationEnabled, _ as teardownNodeSubtree, a as elementReactivePropsCleanup, b as addFreshDelegatedListener, c as forEachElementReactivePropCleanup, d as removeAllListeners, f as removeElementReactiveProps, g as setFreshElementReactivePropCleanup, h as setDirectElementReactivePropCleanup, i as elementListeners, l as getElementReactivePropCleanupSize, m as replaceElementRefBookkeeping, n as cleanupInstanceIfPresent, o as elementRefs, p as removeElementRef, r as cleanupInstancesUnder, s as forEachDescendantNode, t as REACTIVE_CHILDREN_KEY, u as getElementReactivePropsCleanupMap, v as updateElementRef, w as isDelegatedEvent, x as clearDelegatedHandlersForElement, y as addDelegatedListener } from "./cleanup-B4BiQHx-.js";
13
13
  import { t as getPublicAttributeName } from "./attr-names-CjhzmHOn.js";
14
14
  import { i as ROUTE_ROOT_COMPONENT } from "./csp-nonce-HGZ0vbqT.js";
15
15
  //#region src/runtime/error-boundary.ts
@@ -3149,6 +3149,9 @@ function stageHydrationListener(stage) {
3149
3149
  currentTransaction.stages.push(stage);
3150
3150
  return true;
3151
3151
  }
3152
+ function hasStagedHydrationListener(target, eventName, capture) {
3153
+ return !!currentTransaction?.stages.some((stage) => stage.target === target && stage.eventName === eventName && stage.capture === capture);
3154
+ }
3152
3155
  function closeTransaction(transaction) {
3153
3156
  if (!transaction.active) return false;
3154
3157
  transaction.active = false;
@@ -3186,14 +3189,52 @@ function getCurrentHydrationListenerTransaction() {
3186
3189
  //#endregion
3187
3190
  //#region src/renderer/prop-bindings.ts
3188
3191
  const reactivePropRegistry = /* @__PURE__ */ new Set();
3192
+ const hydrationDirectListeners = /* @__PURE__ */ new WeakMap();
3193
+ let hydrationDirectListenerDepth = 0;
3194
+ function beginHydrationDirectListenerMode() {
3195
+ hydrationDirectListenerDepth += 1;
3196
+ }
3197
+ function endHydrationDirectListenerMode() {
3198
+ hydrationDirectListenerDepth = Math.max(0, hydrationDirectListenerDepth - 1);
3199
+ }
3200
+ function markHydrationDirectListener(element, listenerKey) {
3201
+ let listeners = hydrationDirectListeners.get(element);
3202
+ if (!listeners) {
3203
+ listeners = /* @__PURE__ */ new Set();
3204
+ hydrationDirectListeners.set(element, listeners);
3205
+ }
3206
+ listeners.add(listenerKey);
3207
+ }
3208
+ function isHydrationDirectListener(element, listenerKey) {
3209
+ return hydrationDirectListeners.get(element)?.has(listenerKey) ?? false;
3210
+ }
3211
+ function clearHydrationDirectListener(element, listenerKey) {
3212
+ const listeners = hydrationDirectListeners.get(element);
3213
+ listeners?.delete(listenerKey);
3214
+ if (listeners?.size === 0) hydrationDirectListeners.delete(element);
3215
+ }
3189
3216
  function addTrackedListener(el, eventName, handler, capture = false, fresh = false, forceDirect = false) {
3190
- const useDelegation = !forceDirect && !capture && isEventDelegationEnabled() && isDelegatedEvent(eventName);
3217
+ const effectiveForceDirect = forceDirect || hydrationDirectListenerDepth > 0;
3218
+ const useDelegation = !effectiveForceDirect && !capture && isEventDelegationEnabled() && isDelegatedEvent(eventName);
3191
3219
  const listenerKey = getEventListenerKey(eventName, capture);
3192
- if (!forceDirect && stageHydrationListener({
3220
+ if (effectiveForceDirect && isHydrationDirectListener(el, listenerKey)) {
3221
+ const existing = elementListeners.get(el)?.get(listenerKey);
3222
+ if (existing) {
3223
+ existing.updateHandler?.(handler);
3224
+ existing.original = handler;
3225
+ return;
3226
+ }
3227
+ }
3228
+ if (!effectiveForceDirect && !hasStagedHydrationListener(el, eventName, capture) && stageHydrationListener({
3193
3229
  kind: "direct",
3230
+ target: el,
3194
3231
  eventName,
3232
+ capture,
3195
3233
  publish: () => addTrackedListener(el, eventName, handler, capture, fresh, true),
3196
- rollback: () => removeTrackedListener(el, eventName, capture)
3234
+ rollback: () => {
3235
+ removeTrackedListener(el, eventName, capture);
3236
+ clearHydrationDirectListener(el, listenerKey);
3237
+ }
3197
3238
  })) return;
3198
3239
  if (useDelegation) {
3199
3240
  if (fresh) addFreshDelegatedListener(el, eventName, handler, handler, void 0);
@@ -3205,6 +3246,10 @@ function addTrackedListener(el, eventName, handler, capture = false, fresh = fal
3205
3246
  const trackedHandler = mutableHandler.handler;
3206
3247
  if (options !== void 0) el.addEventListener(eventName, trackedHandler, options);
3207
3248
  else el.addEventListener(eventName, trackedHandler);
3249
+ if (effectiveForceDirect) {
3250
+ if (!capture && getDelegatedHandlerForElement(el, eventName)) removeDelegatedListener(el, eventName);
3251
+ markHydrationDirectListener(el, listenerKey);
3252
+ }
3208
3253
  if (!elementListeners.has(el)) elementListeners.set(el, /* @__PURE__ */ new Map());
3209
3254
  elementListeners.get(el).set(listenerKey, {
3210
3255
  handler: trackedHandler,
@@ -3391,16 +3436,26 @@ function syncElementPropBindings(el, domVNode, props, usesReactiveChildren) {
3391
3436
  if (eventProp && listenerKey) {
3392
3437
  const eventName = eventProp.eventName;
3393
3438
  const eventCapture = eventProp.capture;
3394
- if (getCurrentHydrationListenerTransaction() && !existingListeners?.has(listenerKey) && !getDelegatedHandlerForElement(el, eventName)) {
3395
- stageHydrationListener({
3439
+ const preserveHydrationDirect = existingListeners?.get(listenerKey)?.isDelegated === false && isHydrationDirectListener(el, listenerKey);
3440
+ if (getCurrentHydrationListenerTransaction() && !existingListeners?.has(listenerKey) && !getDelegatedHandlerForElement(el, eventName) && !isHydrationDirectListener(el, listenerKey)) {
3441
+ if (!hasStagedHydrationListener(el, eventName, eventCapture)) stageHydrationListener({
3396
3442
  kind: "direct",
3443
+ target: el,
3397
3444
  eventName,
3445
+ capture: eventCapture,
3398
3446
  publish: () => addTrackedListener(el, eventName, value, eventCapture, false, true),
3399
- rollback: () => removeTrackedListener(el, eventName, eventCapture)
3447
+ rollback: () => {
3448
+ removeTrackedListener(el, eventName, eventCapture);
3449
+ clearHydrationDirectListener(el, listenerKey);
3450
+ }
3400
3451
  });
3401
3452
  continue;
3402
3453
  }
3403
- const useDelegation = !eventCapture && isEventDelegationEnabled() && isDelegatedEvent(eventName);
3454
+ if (hydrationDirectListenerDepth > 0 && !existingListeners?.has(listenerKey) && !getDelegatedHandlerForElement(el, eventName)) {
3455
+ addTrackedListener(el, eventName, value, eventCapture, false, true);
3456
+ continue;
3457
+ }
3458
+ const useDelegation = !preserveHydrationDirect && !eventCapture && isEventDelegationEnabled() && isDelegatedEvent(eventName);
3404
3459
  if (useDelegation) (desiredDelegatedEventNames ??= /* @__PURE__ */ new Set()).add(eventName);
3405
3460
  if (useDelegation) {
3406
3461
  const existingDelegated = getDelegatedHandlerForElement(el, eventName);
@@ -6339,4 +6394,4 @@ function installRendererBridge(runtime = getDefaultRuntimeInstance()) {
6339
6394
  return true;
6340
6395
  }
6341
6396
  //#endregion
6342
- export { withIntrinsicHydrationAdoption as a, registerDeferredHydrationBoundary as i, activateHydrationBoundary as n, setStaticChildSlotsCacheEnabled as o, clearDeferredHydrationBoundaries as r, installRendererBridge as t };
6397
+ export { withIntrinsicHydrationAdoption as a, beginHydrationListenerTransaction as c, setStaticChildSlotsCacheEnabled as d, registerDeferredHydrationBoundary as i, commitHydrationListenerTransaction as l, activateHydrationBoundary as n, beginHydrationDirectListenerMode as o, clearDeferredHydrationBoundaries as r, endHydrationDirectListenerMode as s, installRendererBridge as t, discardHydrationListenerTransaction as u };
@@ -1,7 +1,7 @@
1
1
  import { C as lazy, a as resolveDeferredValues, b as Outlet, i as isDeferred, l as createRouteRegistry, m as resolveRouteRequest, n as Resolve, r as defer, s as routeData, y as currentAuth } from "../deferred-zHtUheIQ.js";
2
2
  import { jsx } from "../jsx-runtime.js";
3
3
  import { a as route, i as page, n as group, r as index, t as fallback } from "../authoring-uaJ556aG.js";
4
- import { _ as currentRoute, a as serializeRouteMeta, c as getCurrentHref, d as parseTargetUrl, h as syncRegisteredRouteSnapshot, i as resolveRouteMeta, l as getRegisteredAppsSnapshot, m as syncAppRegistrationLocation, n as navigate, p as setCurrentRouteLocation, r as reconcileRouteMeta, s as saveScrollPosition, u as getWindowHref } from "../navigate-DpR-cML9.js";
4
+ import { _ as currentRoute, a as serializeRouteMeta, c as getCurrentHref, d as parseTargetUrl, h as syncRegisteredRouteSnapshot, i as resolveRouteMeta, l as getRegisteredAppsSnapshot, m as syncAppRegistrationLocation, n as navigate, p as setCurrentRouteLocation, r as reconcileRouteMeta, s as saveScrollPosition, u as getWindowHref } from "../navigate-BTPrVhqI.js";
5
5
  import { o as mergeProps } from "../compose-ref-Cc_YkUpM.js";
6
6
  import { t as applyInteractionPolicy } from "../interactions-w7gQN4ha.js";
7
7
  //#region src/router/route-query.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askrjs/askr",
3
- "version": "0.0.68",
3
+ "version": "0.0.70",
4
4
  "description": "Actor-backed deterministic UI framework",
5
5
  "keywords": [
6
6
  "askr",