foldkit 0.168.0 → 0.169.0

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 (54) hide show
  1. package/dist/dom/inert.d.ts +7 -3
  2. package/dist/dom/inert.d.ts.map +1 -1
  3. package/dist/dom/inert.js +19 -9
  4. package/dist/dom/streamFromKeyBindings.d.ts +5 -3
  5. package/dist/dom/streamFromKeyBindings.d.ts.map +1 -1
  6. package/dist/dom/streamFromKeyBindings.js +7 -4
  7. package/dist/experimental/server/fragment.d.ts +15 -0
  8. package/dist/experimental/server/fragment.d.ts.map +1 -0
  9. package/dist/experimental/server/fragment.js +14 -0
  10. package/dist/experimental/server/server.d.ts +3 -2
  11. package/dist/experimental/server/server.d.ts.map +1 -1
  12. package/dist/experimental/server/server.js +20 -23
  13. package/dist/experimental/server/template.d.ts.map +1 -1
  14. package/dist/experimental/server/template.js +20 -19
  15. package/dist/html/boundary.d.ts +17 -16
  16. package/dist/html/boundary.d.ts.map +1 -1
  17. package/dist/html/boundary.js +9 -9
  18. package/dist/html/childAttribute.d.ts +5 -5
  19. package/dist/html/index.d.ts.map +1 -1
  20. package/dist/html/index.js +24 -17
  21. package/dist/html/lazy.d.ts +130 -0
  22. package/dist/html/lazy.d.ts.map +1 -1
  23. package/dist/html/lazy.js +54 -6
  24. package/dist/html/runtimeSingleton.d.ts +2 -2
  25. package/dist/html/runtimeSingleton.d.ts.map +1 -1
  26. package/dist/html/runtimeSingleton.js +2 -2
  27. package/dist/html/submodel.d.ts.map +1 -1
  28. package/dist/html/submodel.js +20 -11
  29. package/dist/imeComposition.d.ts +3 -0
  30. package/dist/imeComposition.d.ts.map +1 -0
  31. package/dist/imeComposition.js +6 -0
  32. package/dist/mount/index.d.ts +6 -5
  33. package/dist/mount/index.d.ts.map +1 -1
  34. package/dist/route/transition.d.ts +50 -0
  35. package/dist/route/transition.d.ts.map +1 -1
  36. package/dist/route/transition.js +48 -0
  37. package/dist/runtime/messageQueue.d.ts +1 -0
  38. package/dist/runtime/messageQueue.d.ts.map +1 -1
  39. package/dist/runtime/messageQueue.js +2 -0
  40. package/dist/runtime/renderer.d.ts.map +1 -1
  41. package/dist/runtime/renderer.js +18 -3
  42. package/dist/snabbdom/hooks.d.ts +2 -0
  43. package/dist/snabbdom/hooks.d.ts.map +1 -1
  44. package/dist/snabbdom/init.d.ts.map +1 -1
  45. package/dist/snabbdom/init.js +42 -12
  46. package/dist/test/internal.d.ts.map +1 -1
  47. package/dist/test/internal.js +9 -2
  48. package/dist/test/lazy.d.ts +26 -0
  49. package/dist/test/lazy.d.ts.map +1 -0
  50. package/dist/test/lazy.js +103 -0
  51. package/dist/test/public.d.ts +1 -0
  52. package/dist/test/public.d.ts.map +1 -1
  53. package/dist/test/public.js +1 -0
  54. package/package.json +1 -1
package/dist/html/lazy.js CHANGED
@@ -1,7 +1,22 @@
1
- import { Predicate } from 'effect';
1
+ import { Array, Data, Predicate, Result } from 'effect';
2
2
  import { dedupeMemoizedResult, memoizedVNodes } from '../vdom.js';
3
3
  import { beginLazyTracking, endLazyTracking, registerBoundaryWrapTransactionRollback, restoreBoundaryWrapsForLazyHit, } from './boundary.js';
4
4
  import { requireBoundary, requireDispatch, requireMountDispatch, requireMountRenderOwner, } from './runtimeSingleton.js';
5
+ /** @internal Constructors and matching for lazy cache miss reasons. */
6
+ export const LazyMissReason = Data.taggedEnum();
7
+ let resolutionObserver;
8
+ /** @internal Reports lazy cache hits and misses while `run` executes.
9
+ * Restores the previous observer when `run` returns or throws. */
10
+ export const observeLazyResolutions = (observer, run) => {
11
+ const previousObserver = resolutionObserver;
12
+ resolutionObserver = observer;
13
+ try {
14
+ return run();
15
+ }
16
+ finally {
17
+ resolutionObserver = previousObserver;
18
+ }
19
+ };
5
20
  const argsEqual = (previous, current) => {
6
21
  if (previous.length !== current.length) {
7
22
  return false;
@@ -13,7 +28,28 @@ const argsEqual = (previous, current) => {
13
28
  }
14
29
  return true;
15
30
  };
16
- const resolveOrCache = (previousEntry, fn, args, onCache) => {
31
+ const findMissReason = (previousEntry, fn, args, dispatch, mountDispatch, mountRenderOwner) => {
32
+ if (previousEntry === undefined) {
33
+ return LazyMissReason.NoCachedEntry();
34
+ }
35
+ if (previousEntry.fn !== fn) {
36
+ return LazyMissReason.FunctionChanged();
37
+ }
38
+ if (previousEntry.dispatch !== dispatch ||
39
+ previousEntry.mountDispatch !== mountDispatch ||
40
+ previousEntry.mountRenderOwner !== mountRenderOwner) {
41
+ return LazyMissReason.FrameChanged();
42
+ }
43
+ if (previousEntry.args.length !== args.length) {
44
+ return LazyMissReason.ArgumentCountChanged({
45
+ previousCount: previousEntry.args.length,
46
+ currentCount: args.length,
47
+ });
48
+ }
49
+ const indices = Array.filterMap(Array.zip(previousEntry.args, args), ([previousArg, arg], index) => previousArg === arg ? Result.failVoid : Result.succeed(index));
50
+ return LazyMissReason.ArgumentsChanged({ indices });
51
+ };
52
+ const resolveOrCache = (slot, key, previousEntry, fn, args, onCache) => {
17
53
  const dispatch = requireDispatch();
18
54
  const mountDispatch = requireMountDispatch();
19
55
  const mountRenderOwner = requireMountRenderOwner();
@@ -26,12 +62,22 @@ const resolveOrCache = (previousEntry, fn, args, onCache) => {
26
62
  // future renderer that separates them from retaining stale handler or Mount
27
63
  // lifecycle closures. Custom renderers can also use one dispatcher for both
28
64
  // owners, so the owner remains a separate key member.
29
- if (Predicate.isNotUndefined(previousEntry) &&
65
+ const isHit = Predicate.isNotUndefined(previousEntry) &&
30
66
  previousEntry.fn === fn &&
31
67
  previousEntry.dispatch === dispatch &&
32
68
  previousEntry.mountDispatch === mountDispatch &&
33
69
  previousEntry.mountRenderOwner === mountRenderOwner &&
34
- argsEqual(previousEntry.args, args)) {
70
+ argsEqual(previousEntry.args, args);
71
+ if (resolutionObserver !== undefined) {
72
+ resolutionObserver({
73
+ slot,
74
+ key,
75
+ missReason: isHit
76
+ ? undefined
77
+ : findMissReason(previousEntry, fn, args, dispatch, mountDispatch, mountRenderOwner),
78
+ });
79
+ }
80
+ if (isHit) {
35
81
  restoreBoundaryWrapsForLazyHit(registry, previousEntry.trackedBoundaries);
36
82
  return previousEntry.vnode;
37
83
  }
@@ -85,7 +131,8 @@ const resolveOrCache = (previousEntry, fn, args, onCache) => {
85
131
  * create one slot per position. */
86
132
  export const createLazy = () => {
87
133
  let cached;
88
- return (fn, args) => resolveOrCache(cached, fn, args, entry => {
134
+ const slot = {};
135
+ return (fn, args) => resolveOrCache(slot, undefined, cached, fn, args, entry => {
89
136
  cached = entry;
90
137
  });
91
138
  };
@@ -114,7 +161,8 @@ export const createLazy = () => {
114
161
  * positions, give each position its own key. */
115
162
  export const createKeyedLazy = () => {
116
163
  const cache = new Map();
117
- return (key, fn, args) => resolveOrCache(cache.get(key), fn, args, entry => {
164
+ const slot = {};
165
+ return (key, fn, args) => resolveOrCache(slot, key, cache.get(key), fn, args, entry => {
118
166
  if (entry === undefined) {
119
167
  cache.delete(key);
120
168
  }
@@ -73,8 +73,8 @@ export declare const requireMountRenderOwner: () => MountRenderOwner;
73
73
  export type UnmountResolver = (message: unknown) => () => void;
74
74
  /** Returns an {@link UnmountResolver} bound to the current frame's boundary.
75
75
  * `OnUnmount` calls the resolver at build time (boundary alive) to capture a
76
- * dispatch thunk that survives the boundary being torn down during the same
77
- * patch. Throws when called outside of a runtime frame. */
76
+ * dispatch thunk that does not depend on what the registry holds when the
77
+ * element is torn down. Throws when called outside of a runtime frame. */
78
78
  export declare const requireUnmountResolver: () => UnmountResolver;
79
79
  /** Returns the current frame's Submodel wrapping chain (innermost first), or an
80
80
  * empty array at the root boundary. `OnMount` records this build-time snapshot
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeSingleton.d.ts","sourceRoot":"","sources":["../../src/html/runtimeSingleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAOtB,MAAM,eAAe,CAAA;AAEtB,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAErD,wDAAwD;AACxD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhD,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,gBAAgB,CAAA;IACvB,OAAO,EAAE,MAAM,YAAY,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,YAAY,CAAA;IAC3B,kBAAkB,EAAE,YAAY,CAAA;IAChC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAC,CAAA;AAiBF;;;;;;;;;;gBAUgB;AAChB,eAAO,MAAM,UAAU,aACX,YAAY,kBACN,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,qBACpB,gBAAgB,qBAChB,gBAAgB,KACjC,IASF,CAAA;AAED;;;4BAG4B;AAC5B,eAAO,MAAM,YAAY,eAAgB,UAAU,KAAG,IAerD,CAAA;AAED;;;;;;;;;;;0DAW0D;AAC1D,eAAO,MAAM,SAAS,UAAW,KAAK,KAAG,IAExC,CAAA;AAED;;;;;;;6BAO6B;AAC7B,eAAO,MAAM,YAAY,QAAO,IAU/B,CAAA;AAED;;;sEAGsE;AACtE,eAAO,MAAM,eAAe,QAAO,YAOlC,CAAA;AAED;;6CAE6C;AAC7C,eAAO,MAAM,oBAAoB,QAAO,YAEvC,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,QAAO,gBAE1C,CAAA;AAED;;sCAEsC;AACtC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAA;AAE9D;;;4DAG4D;AAC5D,eAAO,MAAM,sBAAsB,QAAO,eASzC,CAAA;AAED;;;;;gDAKgD;AAChD,eAAO,MAAM,sBAAsB,QAAO,aAAa,CACrD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAO9B,CAAA;AAED;;;;+BAI+B;AAC/B,eAAO,MAAM,4BAA4B,QAAO,qBAW/C,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,qBAAqB,QAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAE7D,CAAA;AAED;;mEAEmE;AACnE,eAAO,MAAM,eAAe,QAAO,QAAQ,CAAC;IAC1C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,CAQA,CAAA;AAED;;;;;8CAK8C;AAC9C,eAAO,MAAM,eAAe,QAAO,KAQlC,CAAA"}
1
+ {"version":3,"file":"runtimeSingleton.d.ts","sourceRoot":"","sources":["../../src/html/runtimeSingleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAOtB,MAAM,eAAe,CAAA;AAEtB,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAErD,wDAAwD;AACxD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhD,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,gBAAgB,CAAA;IACvB,OAAO,EAAE,MAAM,YAAY,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,YAAY,CAAA;IAC3B,kBAAkB,EAAE,YAAY,CAAA;IAChC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAC,CAAA;AAiBF;;;;;;;;;;gBAUgB;AAChB,eAAO,MAAM,UAAU,aACX,YAAY,kBACN,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,qBACpB,gBAAgB,qBAChB,gBAAgB,KACjC,IASF,CAAA;AAED;;;4BAG4B;AAC5B,eAAO,MAAM,YAAY,eAAgB,UAAU,KAAG,IAerD,CAAA;AAED;;;;;;;;;;;0DAW0D;AAC1D,eAAO,MAAM,SAAS,UAAW,KAAK,KAAG,IAExC,CAAA;AAED;;;;;;;6BAO6B;AAC7B,eAAO,MAAM,YAAY,QAAO,IAU/B,CAAA;AAED;;;sEAGsE;AACtE,eAAO,MAAM,eAAe,QAAO,YAOlC,CAAA;AAED;;6CAE6C;AAC7C,eAAO,MAAM,oBAAoB,QAAO,YAEvC,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,QAAO,gBAE1C,CAAA;AAED;;sCAEsC;AACtC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAA;AAE9D;;;2EAG2E;AAC3E,eAAO,MAAM,sBAAsB,QAAO,eASzC,CAAA;AAED;;;;;gDAKgD;AAChD,eAAO,MAAM,sBAAsB,QAAO,aAAa,CACrD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAO9B,CAAA;AAED;;;;+BAI+B;AAC/B,eAAO,MAAM,4BAA4B,QAAO,qBAW/C,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,qBAAqB,QAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAE7D,CAAA;AAED;;mEAEmE;AACnE,eAAO,MAAM,eAAe,QAAO,QAAQ,CAAC;IAC1C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,CAQA,CAAA;AAED;;;;;8CAK8C;AAC9C,eAAO,MAAM,eAAe,QAAO,KAQlC,CAAA"}
@@ -101,8 +101,8 @@ export const requireMountRenderOwner = () => {
101
101
  };
102
102
  /** Returns an {@link UnmountResolver} bound to the current frame's boundary.
103
103
  * `OnUnmount` calls the resolver at build time (boundary alive) to capture a
104
- * dispatch thunk that survives the boundary being torn down during the same
105
- * patch. Throws when called outside of a runtime frame. */
104
+ * dispatch thunk that does not depend on what the registry holds when the
105
+ * element is torn down. Throws when called outside of a runtime frame. */
106
106
  export const requireUnmountResolver = () => {
107
107
  const frame = requireFrame();
108
108
  return message => resolveBoundaryDispatchThunk(frame.boundaryRegistry, frame.outerDispatch, frame.boundaryId, message);
@@ -1 +1 @@
1
- {"version":3,"file":"submodel.d.ts","sourceRoot":"","sources":["../../src/html/submodel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submodel.d.ts","sourceRoot":"","sources":["../../src/html/submodel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAkB,MAAM,YAAY,CAAA;AAYvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAa7C,QAAA,MAAM,sBAAsB,sBAAsB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA4BgC;AAChC,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,IAAI,CAAC;IAC7D,UAAU;CACX,SAAS,CAAC,IAAI,CAAC,GACZ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,GAAG,IAAI,GACvD,CACE,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KACpB,KAAK,GAAG,IAAI,CAAC,GAAG;IACvB,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;mDAsBmD;AACnD,eAAO,MAAM,UAAU,GAAI,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,UAAU,GAAG,IAAI,MAC9D,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAC3B,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,GAAG,IAAI,GACvD,CACE,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KACpB,KAAK,GAAG,IAAI,KACpB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAOM,CAAA;AAEhD;;;;kBAIkB;AAClB,MAAM,MAAM,eAAe,GAAG,CAAC,CAC7B,GAAG,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,KACxB,KAAK,GAAG,IAAI,CAAC,GAAG;IACnB,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED,KAAK,WAAW,CAAC,IAAI,SAAS,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpE,KAAK,YAAY,CAAC,IAAI,SAAS,eAAe,IAC5C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,UAAU,EAAE,OAAO,CAAC,GACzD,UAAU,GACV,IAAI,CAAA;AAEV,KAAK,aAAa,CAAC,IAAI,SAAS,eAAe,IAAI,IAAI,SAAS;IAC9D,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAA;CACjD,GACG,OAAO,GACP,KAAK,CAAA;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2CgB;AAChB,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,eAAe,EAC5B,aAAa,IACX,QAAQ,CAAC;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,eAAe,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,aAAa,CAAA;CACjE,CAAC,GAKA,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAChC,QAAQ,CAAC;IAAE,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GAChC,QAAQ,CAAC;IAAE,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC,CAAA;AA8JnD;;;;;gEAKgE;AAChE,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,eAAe,UAC3C,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,wBACf,WAAW,CAAC,OAAO,CAAC,KACzC,KAAK,GAAG,IA8EV,CAAA"}
@@ -119,36 +119,45 @@ const wrapViewInputsForOuterBoundary = (viewInputs, outerFrame) => {
119
119
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
120
120
  return wrapped;
121
121
  };
122
- /** Returns a copy of the vnode with a snabbdom `destroy` hook that
123
- * deregisters this Submodel's boundary when the DOM node is removed.
124
- * Composes with any existing destroy hook the user's view may have set.
122
+ /** Returns a copy of the vnode with a snabbdom `postdestroy` hook that
123
+ * deregisters this Submodel's boundary when snabbdom destroys the vnode.
124
+ * Composes with any existing `postdestroy` hook, including one from a
125
+ * Submodel nested at the same vnode.
126
+ *
127
+ * snabbdom runs a vnode's `destroy` hook before it detaches that vnode's
128
+ * listeners and before it visits the descendants. A `destroy` hook in the
129
+ * subtree can make the browser fire an event on an element that still
130
+ * listens. For example, Chromium fires `blur` when a Mount release removes a
131
+ * focused element. `postdestroy` runs after every `destroy` hook
132
+ * in the subtree, so the wrap is still registered when that listener
133
+ * dispatches.
125
134
  *
126
135
  * Copies the vnode (rather than mutating in place) so module-level
127
136
  * cached vnodes a user might return from view are not contaminated with
128
- * a destroy hook bound to this boundary id.
137
+ * a hook bound to this boundary id.
129
138
  *
130
139
  * This is what lets `h.submodel` survive cache hits from
131
140
  * `createKeyedLazy`. When a cached vnode is reused across renders,
132
- * snabbdom doesn't fire destroy, so the wrap stays registered and
141
+ * snabbdom doesn't fire `postdestroy`, so the wrap stays registered and
133
142
  * dispatches continue to route correctly. When the vnode is actually
134
143
  * removed (entry deleted from a list, conditional render flips),
135
- * destroy fires and the wrap is evicted: bounded memory, no leaks.
144
+ * `postdestroy` fires and the wrap is evicted: bounded memory, no leaks.
136
145
  *
137
146
  * See `submodel.test.ts` for the cache-hit-survival and
138
147
  * destroy-deregisters-wrap assertions. */
139
148
  const withBoundaryCleanup = (vnode, registry, boundaryId, descriptor, mountOuterDispatch) => {
140
149
  const data = vnode.data ?? {};
141
150
  const hook = data.hook ?? {};
142
- const previousDestroy = hook.destroy;
143
- const compositeDestroy = (removed) => {
151
+ const previousPostDestroy = hook.postdestroy;
152
+ const compositePostDestroy = (removed) => {
144
153
  deregisterBoundaryWrap(registry, boundaryId, descriptor, mountOuterDispatch);
145
- if (previousDestroy !== undefined) {
146
- previousDestroy(removed);
154
+ if (previousPostDestroy !== undefined) {
155
+ previousPostDestroy(removed);
147
156
  }
148
157
  };
149
158
  const wrapped = {
150
159
  ...vnode,
151
- data: { ...data, hook: { ...hook, destroy: compositeDestroy } },
160
+ data: { ...data, hook: { ...hook, postdestroy: compositePostDestroy } },
152
161
  };
153
162
  // NOTE: a memoized child view returns the same vnode by reference each render;
154
163
  // this wrapper is fresh but shares its cached children. Propagate membership
@@ -0,0 +1,3 @@
1
+ /** Whether a keydown belongs to an input method composition. */
2
+ export declare const isImeCompositionKeydown: (event: KeyboardEvent) => boolean;
3
+ //# sourceMappingURL=imeComposition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imeComposition.d.ts","sourceRoot":"","sources":["../src/imeComposition.ts"],"names":[],"mappings":"AAKA,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,UAAW,aAAa,KAAG,OACE,CAAA"}
@@ -0,0 +1,6 @@
1
+ // NOTE: some browsers report the keydown that confirms an IME conversion
2
+ // with keyCode 229 and isComposing false. That keydown belongs to the
3
+ // input method, the same as one with isComposing set.
4
+ const IME_COMPOSITION_KEY_CODE = 229;
5
+ /** Whether a keydown belongs to an input method composition. */
6
+ export const isImeCompositionKeydown = (event) => event.isComposing || event.keyCode === IME_COMPOSITION_KEY_CODE;
@@ -140,9 +140,10 @@ export declare const liveViewStateChanges: Stream.Stream<ViewState>;
140
140
  * effect stays observable; `update` simply has nothing meaningful to
141
141
  * do with the acknowledgment.
142
142
  *
143
- * Cleanup is asynchronous with respect to snabbdom's `destroy` hook: the
144
- * runtime forks `Fiber.interrupt` and returns immediately, so finalizers run
145
- * on a separate fiber after `destroy` has already completed. For idempotent
143
+ * The runtime starts cleanup from snabbdom's `destroy` hook by forking
144
+ * `Fiber.interrupt` without waiting. A release with no asynchronous step
145
+ * normally finishes inside `destroy`, before snabbdom removes the element's
146
+ * event listeners; one with an asynchronous step finishes later. For idempotent
146
147
  * DOM operations (`element.remove()`, observer `disconnect()`,
147
148
  * `removeEventListener`) this is fine; if your cleanup has ordering
148
149
  * requirements relative to other DOM removals, prefer doing the imperative
@@ -286,8 +287,8 @@ export declare function define<const Name extends string, const Messages extends
286
287
  * effect stays observable; `update` simply has nothing meaningful to
287
288
  * do with the acknowledgment. Re-check the cause.
288
289
  *
289
- * Cleanup timing relative to snabbdom's `destroy` hook is the same as
290
- * `Mount.define` (asynchronous via `Fiber.interrupt`).
290
+ * Cleanup has the same timing relative to snabbdom's `destroy` hook as
291
+ * `Mount.define`.
291
292
  *
292
293
  * For a Mount that produces exactly one Message at acquire and then holds
293
294
  * lifecycle-scoped resources, use `Mount.define` with `Effect<Message>`.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mount/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mount/index.ts"],"names":[],"mappings":"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"}
@@ -88,4 +88,54 @@ export declare const stayed: <Route extends Readonly<{
88
88
  export declare const isEntering: <Route extends Readonly<{
89
89
  _tag: string;
90
90
  }>, Tag extends Route['_tag']>(transition: Transition<Route>, routeTag: Tag) => boolean;
91
+ /** Whether the transition left the selected route. A cold load never exits.
92
+ * Use {@link exited} when its payload is needed. */
93
+ export declare const isExiting: <Route extends Readonly<{
94
+ _tag: string;
95
+ }>, Tag extends Route['_tag']>(transition: Transition<Route>, routeTag: Tag) => boolean;
96
+ /** Whether both routes have the selected tag. A cold load never stays. Use
97
+ * {@link stayed} for both payloads. */
98
+ export declare const isStaying: <Route extends Readonly<{
99
+ _tag: string;
100
+ }>, Tag extends Route['_tag']>(transition: Transition<Route>, routeTag: Tag) => boolean;
101
+ /** Handlers for {@link match}, with Route narrowed to the selected tag. */
102
+ export type MatchHandlers<Route, Entered, Exited, Stayed, Unrelated> = Readonly<{
103
+ Entered: (nextRoute: Route) => Entered;
104
+ Exited: (previousRoute: Route) => Exited;
105
+ Stayed: (routes: Readonly<{
106
+ previousRoute: Route;
107
+ nextRoute: Route;
108
+ }>) => Stayed;
109
+ Unrelated: () => Unrelated;
110
+ }>;
111
+ /** Runs exactly one handler for the selected route tag. A cold load is
112
+ * `Entered` or `Unrelated`. When both routes have the selected tag, the case
113
+ * is `Stayed`, even when their payloads differ. Handler routes are narrowed
114
+ * to the tag. The direct form infers a union of handler returns.
115
+ * `match<Output>()(...)` constrains every handler to `Output` while inferring
116
+ * the Route and tag. */
117
+ export declare function match<Output>(): <Route extends Readonly<{
118
+ _tag: string;
119
+ }>, Tag extends Route['_tag']>(transition: Transition<Route>, routeTag: Tag, handlers: MatchHandlers<Extract<Route, {
120
+ _tag: Tag;
121
+ }>, Output, Output, Output, Output>) => Output;
122
+ export declare function match<Route extends Readonly<{
123
+ _tag: string;
124
+ }>, Tag extends Route['_tag'], Entered, Exited, Stayed, Unrelated>(transition: Transition<Route>, routeTag: Tag, handlers: MatchHandlers<Extract<Route, {
125
+ _tag: Tag;
126
+ }>, Entered, Exited, Stayed, Unrelated>): Entered | Exited | Stayed | Unrelated;
127
+ /** Runs the matching handler, or the fallback when that handler is omitted.
128
+ * A handler that returns `undefined` has handled the case. The direct form
129
+ * infers a union of callback returns. `matchOrElse<Output>()(...)` constrains
130
+ * every callback to `Output` while inferring the Route and tag. */
131
+ export declare function matchOrElse<Output>(): <Route extends Readonly<{
132
+ _tag: string;
133
+ }>, Tag extends Route['_tag']>(transition: Transition<Route>, routeTag: Tag, handlers: Partial<MatchHandlers<Extract<Route, {
134
+ _tag: Tag;
135
+ }>, Output, Output, Output, Output>>, fallback: () => Output) => Output;
136
+ export declare function matchOrElse<Route extends Readonly<{
137
+ _tag: string;
138
+ }>, Tag extends Route['_tag'], Entered = never, Exited = never, Stayed = never, Unrelated = never, Fallback = never>(transition: Transition<Route>, routeTag: Tag, handlers: Partial<MatchHandlers<Extract<Route, {
139
+ _tag: Tag;
140
+ }>, Entered, Exited, Stayed, Unrelated>>, fallback: () => Fallback): Entered | Exited | Stayed | Unrelated | Fallback;
91
141
  //# sourceMappingURL=transition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../src/route/transition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B;;;;;+CAK+C;AAC/C,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI,QAAQ,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACxC,SAAS,EAAE,KAAK,CAAA;CACjB,CAAC,CAAA;AAEF;;yDAEyD;AACzD,eAAO,MAAM,IAAI,GAAI,KAAK,iBACT,KAAK,aACT,KAAK,KACf,UAAU,CAAC,KAAK,CAGjB,CAAA;AAEF;;yCAEyC;AACzC,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,KAAK,KAAG,UAAU,CAAC,KAAK,CAGjE,CAAA;AAEF;;;;;;8DAM8D;AAC9D,eAAO,MAAM,UAAU,GAAI,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,sCAGhE,UAAU,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAKtC,CAAA;AASJ;;;;iDAIiD;AACjD,eAAO,MAAM,OAAO,GAClB,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,GAAG,SAAS,KAAK,CAAC,MAAM,CAAC,cAEb,UAAU,CAAC,KAAK,CAAC,YACnB,GAAG,KACZ,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC,CACW,CAAA;AAEzD;;;;;;;;8CAQ8C;AAC9C,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,sCAG/D,UAAU,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAIvC,CAAA;AAEH;;0EAE0E;AAC1E,eAAO,MAAM,MAAM,GACjB,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,GAAG,SAAS,KAAK,CAAC,MAAM,CAAC,cAEb,UAAU,CAAC,KAAK,CAAC,YACnB,GAAG,KACZ,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC,CACU,CAAA;AAExD;;;;;;;;;yEASyE;AACzE,eAAO,MAAM,MAAM,GACjB,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,GAAG,SAAS,KAAK,CAAC,MAAM,CAAC,cAEb,UAAU,CAAC,KAAK,CAAC,YACnB,GAAG,KACZ,MAAM,CAAC,MAAM,CACd,QAAQ,CAAC;IACP,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IAC5C,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CACzC,CAAC,CASH,CAAA;AAED;;;;;;;YAOY;AACZ,eAAO,MAAM,UAAU,GACrB,KAAK,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACxC,GAAG,SAAS,KAAK,CAAC,MAAM,CAAC,cAEb,UAAU,CAAC,KAAK,CAAC,YACnB,GAAG,KACZ,OAAuD,CAAA"}
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../src/route/transition.ts"],"names":[],"mappings":"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"}
@@ -71,3 +71,51 @@ export const stayed = (transition, routeTag) => {
71
71
  * transition argument, so the tag is checked against the union's
72
72
  * tags. */
73
73
  export const isEntering = (transition, routeTag) => Option.isSome(entered(transition, routeTag));
74
+ /** Whether the transition left the selected route. A cold load never exits.
75
+ * Use {@link exited} when its payload is needed. */
76
+ export const isExiting = (transition, routeTag) => Option.isSome(exited(transition, routeTag));
77
+ /** Whether both routes have the selected tag. A cold load never stays. Use
78
+ * {@link stayed} for both payloads. */
79
+ export const isStaying = (transition, routeTag) => Option.isSome(stayed(transition, routeTag));
80
+ const matchTransition = (transition, routeTag, handlers) => {
81
+ const { maybePreviousRoute, nextRoute } = transition;
82
+ const isTagged = hasTag(routeTag);
83
+ if (Option.isSome(maybePreviousRoute) && isTagged(maybePreviousRoute.value)) {
84
+ const previousRoute = maybePreviousRoute.value;
85
+ if (isTagged(nextRoute)) {
86
+ return handlers.Stayed({ previousRoute, nextRoute });
87
+ }
88
+ else {
89
+ return handlers.Exited(previousRoute);
90
+ }
91
+ }
92
+ if (isTagged(nextRoute)) {
93
+ return handlers.Entered(nextRoute);
94
+ }
95
+ else {
96
+ return handlers.Unrelated();
97
+ }
98
+ };
99
+ export function match(transition, routeTag, handlers) {
100
+ if (transition === undefined ||
101
+ routeTag === undefined ||
102
+ handlers === undefined) {
103
+ return match;
104
+ }
105
+ return matchTransition(transition, routeTag, handlers);
106
+ }
107
+ const matchOrElseTransition = (transition, routeTag, handlers, fallback) => matchTransition(transition, routeTag, {
108
+ Entered: handlers.Entered ?? fallback,
109
+ Exited: handlers.Exited ?? fallback,
110
+ Stayed: handlers.Stayed ?? fallback,
111
+ Unrelated: handlers.Unrelated ?? fallback,
112
+ });
113
+ export function matchOrElse(transition, routeTag, handlers, fallback) {
114
+ if (transition === undefined ||
115
+ routeTag === undefined ||
116
+ handlers === undefined ||
117
+ fallback === undefined) {
118
+ return matchOrElse;
119
+ }
120
+ return matchOrElseTransition(transition, routeTag, handlers, fallback);
121
+ }
@@ -6,6 +6,7 @@ export type MessageQueue<Message> = Readonly<{
6
6
  enqueueMessageEffect: (message: Message) => Effect.Effect<void>;
7
7
  drainPendingMessages: () => void;
8
8
  resetDrainBudget: () => void;
9
+ isAnyMessageDeferred: () => boolean;
9
10
  completeBoot: () => void;
10
11
  }>;
11
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"messageQueue.d.ts","sourceRoot":"","sources":["../../src/runtime/messageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIvD,gFAAgF;AAChF,MAAM,MAAM,YAAY,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/D,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB,CAAC,CAAA;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,0CAIrC,QAAQ,CAAC;IACV,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,SAAS,EAAE,CACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EACzB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACzB,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAyIxD,CAAA"}
1
+ {"version":3,"file":"messageQueue.d.ts","sourceRoot":"","sources":["../../src/runtime/messageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIvD,gFAAgF;AAChF,MAAM,MAAM,YAAY,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/D,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,oBAAoB,EAAE,MAAM,OAAO,CAAA;IACnC,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB,CAAC,CAAA;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,0CAIrC,QAAQ,CAAC;IACV,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,SAAS,EAAE,CACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EACzB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACzB,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CA6IxD,CAAA"}
@@ -119,6 +119,7 @@ export const makeMessageQueue = ({ status, processMessage, crashWith, }) => Effe
119
119
  const resetDrainBudget = () => {
120
120
  syncWorkMsSinceYield = 0;
121
121
  };
122
+ const isAnyMessageDeferred = () => isDrainDeferredToNextTask && pendingMessages.length > 0;
122
123
  const completeBoot = () => {
123
124
  isBootComplete = true;
124
125
  drainPendingMessages();
@@ -128,6 +129,7 @@ export const makeMessageQueue = ({ status, processMessage, crashWith, }) => Effe
128
129
  enqueueMessageEffect,
129
130
  drainPendingMessages,
130
131
  resetDrainBudget,
132
+ isAnyMessageDeferred,
131
133
  completeBoot,
132
134
  };
133
135
  });
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/runtime/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/runtime/renderer.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ import { __decideViewTransition, __silenceViewTransitionRejections, } from './vi
22
22
  * those fibers are interrupted.
23
23
  */
24
24
  export const makeRenderer = ({ status, container, view, htmlBuilder, manageDocument, crash, buildId, initModel, maybeHydrationRoot, maybeSlowView, maybeSlowPatch, duplicateIdScanner, maybeResolvedViewTransition, commitNotifier, runtimeContext, readLiveModel, messageQueue, devToolsIntegration, }) => Effect.gen(function* () {
25
- const { enqueueMessage, enqueueMessageEffect, drainPendingMessages, resetDrainBudget, } = messageQueue;
25
+ const { enqueueMessage, enqueueMessageEffect, drainPendingMessages, resetDrainBudget, isAnyMessageDeferred, } = messageQueue;
26
26
  const { mountTracker, mountRuntime, drainMountEvents, readViewState, setViewState, isPausedNow, resumeDevTools, attachRenderedMounts, } = devToolsIntegration;
27
27
  const settlePendingCommit = () => {
28
28
  if (commitNotifier.service.isCommitPending()) {
@@ -169,8 +169,8 @@ export const makeRenderer = ({ status, container, view, htmlBuilder, manageDocum
169
169
  // h.submodel persist between renders. The render function calls
170
170
  // `beginHtmlRender` at the start of each pass; wraps for
171
171
  // unmounted Submodels (e.g. an entry removed from a list) are
172
- // dropped from the registry via snabbdom destroy hooks attached
173
- // by `h.submodel` to each child vnode.
172
+ // dropped from the registry via snabbdom `postdestroy` hooks
173
+ // attached by `h.submodel` to each child vnode.
174
174
  const boundaryRegistry = createHtmlBoundaryRegistry();
175
175
  // NOTE: callers set `isRenderingFrame` before calling this and clear
176
176
  // it after. Without it, a Message dispatched while the patch is still
@@ -257,6 +257,9 @@ export const makeRenderer = ({ status, container, view, htmlBuilder, manageDocum
257
257
  drainPendingMessages();
258
258
  })), Effect.provideService(Dispatch, dispatchService), Effect.provideService(MountTracker, mountTracker), Effect.provideService(MountRuntime, mountRuntime));
259
259
  const liveRenderContext = Context.add(Context.add(Context.add(runtimeContext, Dispatch, dispatch), MountTracker, mountTracker), MountRuntime, mountRuntime);
260
+ // NOTE: rendering before a deferred drain resumes would restore stale
261
+ // controlled input values. Disposed or crashed runtimes use the frame guards.
262
+ const isLiveModelBehindQueue = () => isAnyMessageDeferred() && !status.isRuntimeDisposed && !status.isCrashed;
260
263
  // NOTE: the render, Mount drain, DevTools attribution, and
261
264
  // patch-time-buffer flush. Shared by the plain path (called directly)
262
265
  // and the View Transition path (called from the transition's update
@@ -349,6 +352,13 @@ export const makeRenderer = ({ status, container, view, htmlBuilder, manageDocum
349
352
  return;
350
353
  }
351
354
  update.didRun = true;
355
+ // NOTE: a drain may have been deferred since the preceding frame
356
+ // started the transition. Leave the DOM unchanged until it catches up.
357
+ if (isLiveModelBehindQueue()) {
358
+ skipPendingViewTransition();
359
+ scheduleRenderFrame();
360
+ return;
361
+ }
352
362
  // NOTE: the view state closes the resume window after the
353
363
  // store is live but before its plain frame has restored the live
354
364
  // DOM. A transition invalidated by jumpTo stays invalid forever,
@@ -379,6 +389,11 @@ export const makeRenderer = ({ status, container, view, htmlBuilder, manageDocum
379
389
  // would strand any `Render.afterCommit` registered against it, and
380
390
  // the Dom helpers that gate on it would never run their DOM work.
381
391
  const renderFramePlain = () => {
392
+ // NOTE: retain the scheduled frame's pending commit while the drain waits.
393
+ if (isLiveModelBehindQueue()) {
394
+ requestAnimationFrame(renderFramePlain);
395
+ return;
396
+ }
382
397
  isRenderFrameScheduled = false;
383
398
  const isRestoringLiveView = isLiveViewRestorePending;
384
399
  isLiveViewRestorePending = false;
@@ -7,6 +7,7 @@ export type PrePatchHook = (oldVNode: VNode, vNode: VNode) => any;
7
7
  export type UpdateHook = (oldVNode: VNode, vNode: VNode) => any;
8
8
  export type PostPatchHook = (oldVNode: VNode, vNode: VNode) => any;
9
9
  export type DestroyHook = (vNode: VNode) => any;
10
+ export type PostDestroyHook = (vNode: VNode) => any;
10
11
  export type RemoveHook = (vNode: VNode, removeCallback: () => void) => any;
11
12
  export type PostHook = () => any;
12
13
  export interface Hooks {
@@ -18,6 +19,7 @@ export interface Hooks {
18
19
  update?: UpdateHook;
19
20
  postpatch?: PostPatchHook;
20
21
  destroy?: DestroyHook;
22
+ postdestroy?: PostDestroyHook;
21
23
  remove?: RemoveHook;
22
24
  post?: PostHook;
23
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/snabbdom/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,CAAA;AAC/B,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC5C,MAAM,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC9C,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,KAAK,GAAG,CAAA;AAC1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAA;AAEhC,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/snabbdom/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,CAAA;AAC/B,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC5C,MAAM,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC9C,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAC/C,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AACnD,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,KAAK,GAAG,CAAA;AAC1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAA;AAEhC,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/snabbdom/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,iBAAiB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAY,KAAK,KAAK,EAA2B,MAAM,YAAY,CAAA;AAwF1E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,CAAC,EAAE;QACb,SAAS,CAAC,EAAE,OAAO,CAAA;KACpB,CAAA;CACF,CAAA;AAID;;qCAEqC;AACrC,eAAO,MAAM,6BAA6B,aAC9B,OAAO,GAAG,SAAS,KAC5B,IAEF,CAAA;AASD,wBAAgB,IAAI,CAClB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,cAskBL,KAAK,GAAG,OAAO,GAAG,gBAAgB,SACrC,KAAK,kBACI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KACrC,KAAK,CAsDT"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/snabbdom/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,iBAAiB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAY,KAAK,KAAK,EAA2B,MAAM,YAAY,CAAA;AAwF1E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,CAAC,EAAE;QACb,SAAS,CAAC,EAAE,OAAO,CAAA;KACpB,CAAA;CACF,CAAA;AAID;;qCAEqC;AACrC,eAAO,MAAM,6BAA6B,aAC9B,OAAO,GAAG,SAAS,KAC5B,IAEF,CAAA;AASD,wBAAgB,IAAI,CAClB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,cAurBL,KAAK,GAAG,OAAO,GAAG,gBAAgB,SACrC,KAAK,kBACI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KACrC,KAAK,CAsDT"}