@vesk/runtime 0.2.41 → 0.2.42

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.
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,UAAU;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAsCD,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAErD;AAED,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAElD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEhE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEhF;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAoDhH;AA+GD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CA8C9G"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,UAAU;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAsCD,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAErD;AAED,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAElD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEhE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAEhF;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAoDhH;AA+GD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAoD9G"}
package/dist/form.js CHANGED
@@ -244,7 +244,13 @@ export function Form(props, registry, hydrate) {
244
244
  return `<form ${attrStr}>${children || ''}</form>`;
245
245
  }
246
246
  if (hydrate && hydrate.nextElement) {
247
- let form = hydrate.nextElement('form');
247
+ // The compiler may deposit the static residue that precedes this
248
+ // self-claiming component (for example <h1> before <Form>). Consume it
249
+ // before claiming the form root; otherwise the runtime would inspect
250
+ // the heading as the form slot, detach it as a mismatch, and only find
251
+ // the real form through the broad querySelector fallback.
252
+ const skipK = typeof hydrate.takeSkipK === 'function' ? hydrate.takeSkipK() : 0;
253
+ let form = hydrate.nextElement('form', skipK);
248
254
  if (form && !form.parentNode && hydrate.root) {
249
255
  const existing = hydrate.root.querySelector('form');
250
256
  if (existing)
package/dist/hydrate.d.ts CHANGED
@@ -20,7 +20,7 @@ export interface ClaimByKeyOptions {
20
20
  export interface HydrateWalker {
21
21
  root: HTMLElement | null;
22
22
  done(): boolean;
23
- nextElement(tag?: string): Element;
23
+ nextElement(tag?: string, skipK?: number): Element;
24
24
  /**
25
25
  * Claim an element like `nextElement` but without stripping its direct text
26
26
  * children. Used by static-component stubs whose SSR content is preserved
@@ -1 +1 @@
1
- {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"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"}
package/dist/hydrate.js CHANGED
@@ -38,16 +38,32 @@ export function reactiveProps(props) {
38
38
  // ---------------------------------------------------------------------------
39
39
  // Dev-mode hydration-integrity canary (T1)
40
40
  //
41
- // Claiming the SSR DOM is inherently positional: a element claimed from the
42
- // wrong slot fails silently in production (the SSR node is adopted as-is). To
43
- // surface SSR/client divergence early, dev mode:
44
- // * stamps every adopted node with `data-vsk-claimed`,
45
- // * warns with the container fragment when a positional claim misses, and
46
- // * runs `assertFullyHydrated()` at the end of every full hydration so
47
- // unclaimed phantom markers are reported instead of rotting in the DOM.
41
+ // Claiming the SSR DOM is inherently positional: an element claimed from the
42
+ // wrong slot fails silently in production. Hydration bookkeeping therefore
43
+ // lives in WeakMaps, never in DOM attributes. The canary audits the records at
44
+ // the end of every full hydration and warns when markers or structural claim
45
+ // records remain unresolved.
48
46
  // ---------------------------------------------------------------------------
49
47
  let __hydrateDevMode = true;
50
- const CLAIMED_ATTR = 'data-vsk-claimed';
48
+ // The first map answers "was this element adopted?" without observable DOM
49
+ // mutation. The second lets auditHydration inspect records even after a safe
50
+ // recovery detached a ghost: walker records stay reachable from their live
51
+ // owner root without keeping an otherwise-unreachable node globally alive.
52
+ const claimRegistry = new WeakMap();
53
+ const walkerClaimRecords = new WeakMap();
54
+ function recordClaim(root, record) {
55
+ claimRegistry.set(record.el, record);
56
+ if (!root)
57
+ return;
58
+ const records = walkerClaimRecords.get(root);
59
+ if (records)
60
+ records.push(record);
61
+ else
62
+ walkerClaimRecords.set(root, [record]);
63
+ }
64
+ function isAdopted(el) {
65
+ return claimRegistry.get(el)?.state === 'adopted';
66
+ }
51
67
  export function setHydrateDevMode(enabled) {
52
68
  __hydrateDevMode = enabled;
53
69
  }
@@ -89,16 +105,15 @@ function reportMiss(kind, detail, loud) {
89
105
  if (loud)
90
106
  devWarn(`${kind}: ${detail}`);
91
107
  }
92
- function stampClaimed(el) {
93
- if (__hydrateDevMode) {
94
- try {
95
- el.setAttribute(CLAIMED_ATTR, '');
96
- }
97
- catch {
98
- // Some hosts restrict attribute writes on special nodes (SVG,
99
- // <template> children); claiming is still valid.
100
- }
101
- }
108
+ function recordAdopted(root, el, expectedTag) {
109
+ recordClaim(root, {
110
+ state: 'adopted',
111
+ el,
112
+ owner: root,
113
+ expectedTag,
114
+ actualTag: el.tagName.toLowerCase(),
115
+ detached: false,
116
+ });
102
117
  }
103
118
  // Strip the direct text children of a claimed element. Static text inside a
104
119
  // claimed subtree is re-created client-side as fresh text nodes, so the
@@ -176,8 +191,8 @@ function scanTwins(container) {
176
191
  let a = false;
177
192
  let b = false;
178
193
  try {
179
- a = el.hasAttribute(CLAIMED_ATTR);
180
- b = prev.hasAttribute(CLAIMED_ATTR);
194
+ a = isAdopted(el);
195
+ b = isAdopted(prev);
181
196
  }
182
197
  catch {
183
198
  continue;
@@ -236,6 +251,32 @@ export function auditHydration(container) {
236
251
  if (!sample && container.outerHTML)
237
252
  sample = String(container.outerHTML).slice(0, 800);
238
253
  }
254
+ const structuralRecords = [];
255
+ const seenRecords = new Set();
256
+ const collectWalkerRecords = (el) => {
257
+ const records = walkerClaimRecords.get(el);
258
+ if (records) {
259
+ for (const record of records) {
260
+ if (!seenRecords.has(record)) {
261
+ seenRecords.add(record);
262
+ structuralRecords.push(record);
263
+ }
264
+ }
265
+ }
266
+ for (let i = 0; i < el.children.length; i++)
267
+ collectWalkerRecords(el.children[i]);
268
+ };
269
+ collectWalkerRecords(container);
270
+ const structuralGhosts = structuralRecords.filter((record) => record.state === 'ghost');
271
+ if (structuralGhosts.length > 0) {
272
+ unclaimed += structuralGhosts.length;
273
+ if (orphanNames.length < 5) {
274
+ orphanNames.push(`${structuralGhosts.length} structural hydration ghost(s) (${structuralGhosts
275
+ .slice(0, 3)
276
+ .map((record) => `<${record.actualTag}> expected <${record.expectedTag}>`)
277
+ .join(', ')})`);
278
+ }
279
+ }
239
280
  const twinRes = scanTwins(container);
240
281
  const issues = [];
241
282
  if (unclaimed > 0) {
@@ -268,6 +309,19 @@ export function auditHydration(container) {
268
309
  // Best-effort repair; the report above already recorded it.
269
310
  }
270
311
  }
312
+ for (const record of structuralGhosts) {
313
+ try {
314
+ // Only detach a still-connected ghost whose immediate parent is
315
+ // the walker's own root. Never sweep arbitrary descendants.
316
+ if (record.detached || !record.owner || record.el.parentNode !== record.owner)
317
+ continue;
318
+ record.el.remove();
319
+ record.detached = true;
320
+ }
321
+ catch {
322
+ // Best-effort repair; the report above already recorded it.
323
+ }
324
+ }
271
325
  }
272
326
  if (__mismatchHandler) {
273
327
  for (const issue of issues) {
@@ -308,7 +362,7 @@ export function assertFullyHydrated(container) {
308
362
  }
309
363
  function underClaimedAncestor(el, container) {
310
364
  for (let n = el; n && n !== container; n = n.parentElement) {
311
- if (n.nodeType === 1 && n.hasAttribute(CLAIMED_ATTR))
365
+ if (n.nodeType === 1 && isAdopted(n))
312
366
  return true;
313
367
  }
314
368
  return false;
@@ -384,7 +438,7 @@ function checkMarkerIdentity(marker, el) {
384
438
  }
385
439
  }
386
440
  }
387
- function adoptElement(marker, tag) {
441
+ function adoptElement(root, marker, tag) {
388
442
  const el = marker.nextElementSibling;
389
443
  if (!el) {
390
444
  marker.remove();
@@ -401,12 +455,12 @@ function adoptElement(marker, tag) {
401
455
  marker.remove();
402
456
  stripDirectTextNodes(el);
403
457
  captureSsrElementChildren(el);
404
- stampClaimed(el);
458
+ recordAdopted(root, el, tag || el.tagName.toLowerCase());
405
459
  return el;
406
460
  }
407
461
  // Like adoptElement but preserves direct text children. Used by static-component
408
462
  // stubs whose SSR content is kept as-is (no client-side re-rendering).
409
- function adoptElementRaw(marker, tag) {
463
+ function adoptElementRaw(root, marker, tag) {
410
464
  const el = marker.nextElementSibling;
411
465
  if (!el) {
412
466
  marker.remove();
@@ -417,7 +471,7 @@ function adoptElementRaw(marker, tag) {
417
471
  checkMarkerIdentity(marker, el);
418
472
  marker.remove();
419
473
  captureSsrElementChildren(el);
420
- stampClaimed(el);
474
+ recordAdopted(root, el, tag || el.tagName.toLowerCase());
421
475
  return el;
422
476
  }
423
477
  class WalkerEngine {
@@ -513,7 +567,7 @@ class WalkerEngine {
513
567
  break;
514
568
  }
515
569
  this.idx++;
516
- const adopted = adoptElement(tm.comment, tag);
570
+ const adopted = adoptElement(this.root, tm.comment, tag);
517
571
  if (adopted === null) {
518
572
  // SSR rendered no element after this marker. Fall out to a
519
573
  // fresh element instead of hunting through the remaining
@@ -589,7 +643,7 @@ class WalkerEngine {
589
643
  break;
590
644
  }
591
645
  this.idx++;
592
- const adopted = adoptElementRaw(tm.comment, tag);
646
+ const adopted = adoptElementRaw(this.root, tm.comment, tag);
593
647
  if (adopted === null) {
594
648
  tm.state = 'claimed';
595
649
  break;
@@ -694,7 +748,7 @@ class WalkerEngine {
694
748
  tm.comment.remove();
695
749
  stripDirectTextNodes(el);
696
750
  captureSsrElementChildren(el);
697
- stampClaimed(el);
751
+ recordAdopted(this.root, el, el.tagName.toLowerCase());
698
752
  return { el };
699
753
  }
700
754
  claimByKey(key, options) {
@@ -822,8 +876,9 @@ class WalkerEngine {
822
876
  // caller already consumed — static residues it retrieved from `__vsk_ssrEls`)
823
877
  // and by tag. The compiler emits `nextElement(tag, skipK)` claims with the
824
878
  // descriptor implicit in the tag; divergence follows §2.2 step 4: a tag
825
- // mismatch consumes exactly one slot, reports, and hands back a fresh element
826
- // that the caller mounts — the SSR node is never bound, never deleted.
879
+ // mismatch consumes exactly one slot, reports, detaches the provably-owned
880
+ // direct-child ghost, and hands back a fresh element that the caller mounts.
881
+ // The SSR node is never bound.
827
882
  //
828
883
  // The same engine backs `createHydrateChildWalker`, so runtime components that
829
884
  // claim offspring positionally (loading stubs, slot content) keep working with
@@ -923,12 +978,41 @@ class StructuralWalker {
923
978
  const el = this.els[target];
924
979
  if (tag && el.tagName.toLowerCase() !== tag) {
925
980
  // §2.2 step 4: descriptor failed. Consume exactly ONE slot and
926
- // hand back a fresh element — the SSR node is never bound, never
927
- // deleted. The caller detaches the fresh node when provably safe
928
- // or leaves it inert for the sweep.
981
+ // hand back a fresh element. The direct-child SSR ghost is
982
+ // detached below; nested recovery remains owned by its child walker.
929
983
  this.idx = this.advancePastSkippable(target + 1);
930
- reportMiss('tag-mismatch', `descriptor wanted <${tag}> but the SSR slot holds <${el.tagName.toLowerCase()}>; consuming one slot and rendering fresh.`, false);
931
- return document.createElement(tag || 'div');
984
+ const ghost = {
985
+ state: 'ghost',
986
+ el,
987
+ owner: this.root,
988
+ expectedTag: tag || 'div',
989
+ actualTag: el.tagName.toLowerCase(),
990
+ detached: false,
991
+ };
992
+ recordClaim(this.root, ghost);
993
+ // This is the walker's own immediate child slot, so detachment is
994
+ // provably boundary-local. Never remove nested content here: a
995
+ // nested mismatch belongs to the child walker's own recovery.
996
+ if (this.root && el.parentNode === this.root) {
997
+ try {
998
+ el.remove();
999
+ ghost.detached = true;
1000
+ }
1001
+ catch {
1002
+ // The final sweep will report/repair a still-owned ghost.
1003
+ }
1004
+ }
1005
+ const fresh = document.createElement(tag || 'div');
1006
+ recordClaim(this.root, {
1007
+ state: 'fresh',
1008
+ el: fresh,
1009
+ owner: this.root,
1010
+ expectedTag: tag || 'div',
1011
+ actualTag: fresh.tagName.toLowerCase(),
1012
+ detached: false,
1013
+ });
1014
+ reportMiss('tag-mismatch', `descriptor wanted <${tag}> but the SSR slot holds <${el.tagName.toLowerCase()}>; consumed one slot, detached the local ghost, and rendered fresh.`, false);
1015
+ return fresh;
932
1016
  }
933
1017
  if (this.adopted.has(el)) {
934
1018
  // Double-claim guard: a node already adopted (cross-position
@@ -941,16 +1025,25 @@ class StructuralWalker {
941
1025
  if (!raw)
942
1026
  stripDirectTextNodes(el);
943
1027
  captureSsrElementChildren(el);
944
- stampClaimed(el);
1028
+ recordAdopted(this.root, el, tag || el.tagName.toLowerCase());
945
1029
  return el;
946
1030
  }
947
1031
  this.idx = this.els.length;
1032
+ const fresh = document.createElement(tag || 'div');
1033
+ recordClaim(this.root, {
1034
+ state: 'fresh',
1035
+ el: fresh,
1036
+ owner: this.root,
1037
+ expectedTag: tag || 'div',
1038
+ actualTag: fresh.tagName.toLowerCase(),
1039
+ detached: false,
1040
+ });
948
1041
  reportMiss('exhausted', `hydration claim missed <${tag || 'element'}>; the client rendered more or different content than SSR.`,
949
1042
  // Not loud: an exhausted walker is the normal post-hydration
950
1043
  // re-render shape (every further claim legitimately builds fresh
951
1044
  // nodes) — telemetry-only, mirroring the marker engine.
952
1045
  false);
953
- return document.createElement(tag || 'div');
1046
+ return fresh;
954
1047
  }
955
1048
  nextElement(tag, skipK = 0) {
956
1049
  return this.claimAt(tag, skipK, false);
@@ -1016,7 +1109,7 @@ class StructuralWalker {
1016
1109
  this.adopted.add(el);
1017
1110
  stripDirectTextNodes(el);
1018
1111
  captureSsrElementChildren(el);
1019
- stampClaimed(el);
1112
+ recordAdopted(this.root, el, el.tagName.toLowerCase());
1020
1113
  return { el };
1021
1114
  }
1022
1115
  this.idx = this.els.length;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vesk/runtime",
3
- "version": "0.2.41",
3
+ "version": "0.2.42",
4
4
  "type": "module",
5
5
  "description": "Vesk runtime — reactivity, blocks, DOM operations, hydration",
6
6
  "main": "./dist/index-client.js",
@@ -51,7 +51,7 @@
51
51
  }
52
52
  },
53
53
  "dependencies": {
54
- "@vesk/compiler": "^0.2.41"
54
+ "@vesk/compiler": "^0.2.42"
55
55
  },
56
56
  "scripts": {
57
57
  "typecheck": "tsc --noEmit",