@barefootjs/client 0.34.0 → 0.35.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.
- package/dist/csr-adapter.js +37 -29
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/runtime/component.d.ts +29 -7
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +2 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +101 -13
- package/dist/runtime/map-array-lazy.d.ts +29 -0
- package/dist/runtime/map-array-lazy.d.ts.map +1 -1
- package/dist/runtime/map-array.d.ts +12 -2
- package/dist/runtime/map-array.d.ts.map +1 -1
- package/dist/runtime/portal.d.ts +44 -0
- package/dist/runtime/portal.d.ts.map +1 -1
- package/dist/runtime/standalone.js +98 -10
- package/dist/runtime/track-position.d.ts +37 -0
- package/dist/runtime/track-position.d.ts.map +1 -0
- package/dist/shims.d.ts +1 -0
- package/dist/shims.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -0
- package/src/runtime/component.ts +33 -7
- package/src/runtime/index.ts +4 -0
- package/src/runtime/map-array-lazy.ts +45 -2
- package/src/runtime/map-array.ts +54 -13
- package/src/runtime/portal.ts +154 -0
- package/src/runtime/track-position.ts +47 -0
- package/src/shims.ts +4 -0
package/dist/csr-adapter.js
CHANGED
|
@@ -168757,7 +168757,7 @@ Additional information: BADCLIENT: Bad error code, ${badCode} not found in range
|
|
|
168757
168757
|
var import_typescript25 = __toESM(require_typescript(), 1);
|
|
168758
168758
|
|
|
168759
168759
|
// ../jsx/src/analyzer.ts
|
|
168760
|
-
var
|
|
168760
|
+
var import_typescript11 = __toESM(require_typescript(), 1);
|
|
168761
168761
|
|
|
168762
168762
|
// ../jsx/src/expression-parser.ts
|
|
168763
168763
|
var import_typescript = __toESM(require_typescript(), 1);
|
|
@@ -169095,6 +169095,12 @@ class BindingScope {
|
|
|
169095
169095
|
}
|
|
169096
169096
|
}
|
|
169097
169097
|
|
|
169098
|
+
// ../jsx/src/ir-to-client-js/safe-html.ts
|
|
169099
|
+
function safeHtml(expr) {
|
|
169100
|
+
return expr;
|
|
169101
|
+
}
|
|
169102
|
+
var EMPTY_MARKUP = safeHtml("''");
|
|
169103
|
+
|
|
169098
169104
|
// ../jsx/src/ir-to-client-js/html-template.ts
|
|
169099
169105
|
var VOID_ELEMENTS = new Set([
|
|
169100
169106
|
"area",
|
|
@@ -169152,14 +169158,17 @@ function freshCounters() {
|
|
|
169152
169158
|
}
|
|
169153
169159
|
|
|
169154
169160
|
// ../jsx/src/analyzer-context.ts
|
|
169155
|
-
var
|
|
169161
|
+
var import_typescript10 = __toESM(require_typescript(), 1);
|
|
169156
169162
|
|
|
169157
169163
|
// ../jsx/src/strip-types.ts
|
|
169158
169164
|
var import_typescript8 = __toESM(require_typescript(), 1);
|
|
169159
169165
|
|
|
169166
|
+
// ../jsx/src/reactivity-checker.ts
|
|
169167
|
+
var import_typescript9 = __toESM(require_typescript(), 1);
|
|
169168
|
+
|
|
169160
169169
|
// ../jsx/src/analyzer-context.ts
|
|
169161
|
-
var _typePrinter =
|
|
169162
|
-
var _blankTypeSourceFile =
|
|
169170
|
+
var _typePrinter = import_typescript10.default.createPrinter({ removeComments: true, omitTrailingSemicolon: true });
|
|
169171
|
+
var _blankTypeSourceFile = import_typescript10.default.createSourceFile("__bf_types__.ts", "", import_typescript10.default.ScriptTarget.Latest);
|
|
169163
169172
|
|
|
169164
169173
|
// ../jsx/src/errors.ts
|
|
169165
169174
|
var ErrorCodes = {
|
|
@@ -169381,6 +169390,7 @@ var CLIENT_EXPORTS = new Set([
|
|
|
169381
169390
|
"isSSRPortal",
|
|
169382
169391
|
"findSiblingSlot",
|
|
169383
169392
|
"cleanupPortalPlaceholder",
|
|
169393
|
+
"trackPosition",
|
|
169384
169394
|
"createSearchParams",
|
|
169385
169395
|
"queryHref",
|
|
169386
169396
|
"formatDate",
|
|
@@ -169391,46 +169401,46 @@ function extractFreeIdentifiersFromNode(node) {
|
|
|
169391
169401
|
const ids = new Set;
|
|
169392
169402
|
const boundNames = new Set;
|
|
169393
169403
|
function addBindingNames(name, out) {
|
|
169394
|
-
if (
|
|
169404
|
+
if (import_typescript11.default.isIdentifier(name))
|
|
169395
169405
|
out.push(name.text);
|
|
169396
|
-
else if (
|
|
169406
|
+
else if (import_typescript11.default.isObjectBindingPattern(name))
|
|
169397
169407
|
name.elements.forEach((e) => addBindingNames(e.name, out));
|
|
169398
|
-
else if (
|
|
169408
|
+
else if (import_typescript11.default.isArrayBindingPattern(name))
|
|
169399
169409
|
name.elements.forEach((e) => {
|
|
169400
|
-
if (!
|
|
169410
|
+
if (!import_typescript11.default.isOmittedExpression(e))
|
|
169401
169411
|
addBindingNames(e.name, out);
|
|
169402
169412
|
});
|
|
169403
169413
|
}
|
|
169404
169414
|
function visit(n) {
|
|
169405
|
-
if (
|
|
169415
|
+
if (import_typescript11.default.isTypeNode(n))
|
|
169406
169416
|
return;
|
|
169407
|
-
if (
|
|
169417
|
+
if (import_typescript11.default.isIdentifier(n)) {
|
|
169408
169418
|
const parent = n.parent;
|
|
169409
|
-
if (parent &&
|
|
169419
|
+
if (parent && import_typescript11.default.isPropertyAccessExpression(parent) && parent.name === n)
|
|
169410
169420
|
return;
|
|
169411
|
-
if (parent &&
|
|
169421
|
+
if (parent && import_typescript11.default.isPropertyAssignment(parent) && parent.name === n)
|
|
169412
169422
|
return;
|
|
169413
|
-
if (parent &&
|
|
169423
|
+
if (parent && import_typescript11.default.isParameter(parent) && parent.name === n)
|
|
169414
169424
|
return;
|
|
169415
|
-
if (parent &&
|
|
169425
|
+
if (parent && import_typescript11.default.isVariableDeclaration(parent) && parent.name === n)
|
|
169416
169426
|
return;
|
|
169417
169427
|
if (boundNames.has(n.text))
|
|
169418
169428
|
return;
|
|
169419
169429
|
ids.add(n.text);
|
|
169420
169430
|
return;
|
|
169421
169431
|
}
|
|
169422
|
-
if (
|
|
169432
|
+
if (import_typescript11.default.isArrowFunction(n)) {
|
|
169423
169433
|
const params = [];
|
|
169424
169434
|
for (const p of n.parameters)
|
|
169425
169435
|
addBindingNames(p.name, params);
|
|
169426
169436
|
for (const name of params)
|
|
169427
169437
|
boundNames.add(name);
|
|
169428
|
-
|
|
169438
|
+
import_typescript11.default.forEachChild(n, visit);
|
|
169429
169439
|
for (const name of params)
|
|
169430
169440
|
boundNames.delete(name);
|
|
169431
169441
|
return;
|
|
169432
169442
|
}
|
|
169433
|
-
|
|
169443
|
+
import_typescript11.default.forEachChild(n, visit);
|
|
169434
169444
|
}
|
|
169435
169445
|
visit(node);
|
|
169436
169446
|
return ids;
|
|
@@ -169441,7 +169451,8 @@ var BROWSER_ONLY_CLIENT_APIS = new Set([
|
|
|
169441
169451
|
"createPortal",
|
|
169442
169452
|
"isSSRPortal",
|
|
169443
169453
|
"findSiblingSlot",
|
|
169444
|
-
"cleanupPortalPlaceholder"
|
|
169454
|
+
"cleanupPortalPlaceholder",
|
|
169455
|
+
"trackPosition"
|
|
169445
169456
|
]);
|
|
169446
169457
|
var REACTIVE_PRIMITIVES = new Set([
|
|
169447
169458
|
"createSignal",
|
|
@@ -169489,7 +169500,7 @@ var REACTIVE_BINDING_KINDS = new Set([
|
|
|
169489
169500
|
]);
|
|
169490
169501
|
|
|
169491
169502
|
// ../jsx/src/module-exports.ts
|
|
169492
|
-
var
|
|
169503
|
+
var import_typescript12 = __toESM(require_typescript(), 1);
|
|
169493
169504
|
function formatParamWithType(p) {
|
|
169494
169505
|
const rest = p.isRest ? "..." : "";
|
|
169495
169506
|
const optional = p.optional ? "?" : "";
|
|
@@ -169524,21 +169535,21 @@ function findAssignedNames(bodyText, candidates) {
|
|
|
169524
169535
|
const assigned = new Set;
|
|
169525
169536
|
if (candidates.size === 0)
|
|
169526
169537
|
return assigned;
|
|
169527
|
-
const sf =
|
|
169538
|
+
const sf = import_typescript12.default.createSourceFile("bf-assignment-scan.tsx", bodyText, import_typescript12.default.ScriptTarget.Latest, false, import_typescript12.default.ScriptKind.TSX);
|
|
169528
169539
|
const record = (target) => {
|
|
169529
|
-
if (
|
|
169540
|
+
if (import_typescript12.default.isIdentifier(target) && candidates.has(target.text)) {
|
|
169530
169541
|
assigned.add(target.text);
|
|
169531
169542
|
}
|
|
169532
169543
|
};
|
|
169533
169544
|
const visit = (node) => {
|
|
169534
|
-
if (
|
|
169545
|
+
if (import_typescript12.default.isBinaryExpression(node) && isAssignmentOperator(node.operatorToken.kind)) {
|
|
169535
169546
|
record(node.left);
|
|
169536
|
-
} else if ((
|
|
169547
|
+
} else if ((import_typescript12.default.isPrefixUnaryExpression(node) || import_typescript12.default.isPostfixUnaryExpression(node)) && (node.operator === import_typescript12.default.SyntaxKind.PlusPlusToken || node.operator === import_typescript12.default.SyntaxKind.MinusMinusToken)) {
|
|
169537
169548
|
record(node.operand);
|
|
169538
169549
|
}
|
|
169539
|
-
|
|
169550
|
+
import_typescript12.default.forEachChild(node, visit);
|
|
169540
169551
|
};
|
|
169541
|
-
|
|
169552
|
+
import_typescript12.default.forEachChild(sf, visit);
|
|
169542
169553
|
return assigned;
|
|
169543
169554
|
}
|
|
169544
169555
|
function closeOverWritersOfMutableBindings(primaryRefs, declarations, mutableNames) {
|
|
@@ -169561,12 +169572,9 @@ function closeOverWritersOfMutableBindings(primaryRefs, declarations, mutableNam
|
|
|
169561
169572
|
return reachable;
|
|
169562
169573
|
}
|
|
169563
169574
|
function isAssignmentOperator(kind) {
|
|
169564
|
-
return kind >=
|
|
169575
|
+
return kind >= import_typescript12.default.SyntaxKind.FirstAssignment && kind <= import_typescript12.default.SyntaxKind.LastAssignment;
|
|
169565
169576
|
}
|
|
169566
169577
|
|
|
169567
|
-
// ../jsx/src/reactivity-checker.ts
|
|
169568
|
-
var import_typescript12 = __toESM(require_typescript(), 1);
|
|
169569
|
-
|
|
169570
169578
|
// ../jsx/src/free-refs.ts
|
|
169571
169579
|
var import_typescript13 = __toESM(require_typescript(), 1);
|
|
169572
169580
|
var _bindingMapCache = new WeakMap;
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export { unwrap } from './unwrap.ts';
|
|
|
7
7
|
export { queryHref, type QueryParams, type QueryParamValue } from './query-href.ts';
|
|
8
8
|
export { formatDate } from './format-date.ts';
|
|
9
9
|
export { createContext, type Context } from './context.ts';
|
|
10
|
-
export { useContext, provideContext, createPortal, isSSRPortal, findSiblingSlot, cleanupPortalPlaceholder, type Portal, type PortalChildren, type PortalOptions, type Renderable, } from './shims.ts';
|
|
10
|
+
export { useContext, provideContext, createPortal, isSSRPortal, findSiblingSlot, cleanupPortalPlaceholder, trackPosition, type Portal, type PortalChildren, type PortalOptions, type Renderable, } from './shims.ts';
|
|
11
11
|
export { Async, Region, type AsyncProps, type RegionProps, } from './builtins.ts';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,eAAe,EACf,SAAS,EACT,OAAO,EACP,gBAAgB,EAMhB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAA;AAKnB,OAAO,EACL,KAAK,EACL,MAAM,EACN,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,eAAe,EACf,SAAS,EACT,OAAO,EACP,gBAAgB,EAMhB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,aAAa,EACb,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAA;AAKnB,OAAO,EACL,KAAK,EACL,MAAM,EACN,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -285,6 +285,9 @@ function findSiblingSlot(_el, _slotSelector) {
|
|
|
285
285
|
function cleanupPortalPlaceholder(_portalId) {
|
|
286
286
|
return browserOnly("cleanupPortalPlaceholder");
|
|
287
287
|
}
|
|
288
|
+
function trackPosition(_update) {
|
|
289
|
+
return browserOnly("trackPosition");
|
|
290
|
+
}
|
|
288
291
|
// src/builtins.ts
|
|
289
292
|
function compiledAway(name) {
|
|
290
293
|
throw new Error(`[barefootjs] <${name}> is a compiler built-in and is compiled away. ` + `If you are seeing this at runtime, the JSX was rendered without going ` + `through the BarefootJS compiler — please report a bug.`);
|
|
@@ -299,6 +302,7 @@ export {
|
|
|
299
302
|
useContext,
|
|
300
303
|
unwrap,
|
|
301
304
|
untrack,
|
|
305
|
+
trackPosition,
|
|
302
306
|
splitProps,
|
|
303
307
|
setProfilerSink,
|
|
304
308
|
queryHref,
|
|
@@ -189,6 +189,29 @@ export declare function escapeAttr(value: unknown): string;
|
|
|
189
189
|
* the reactive path.
|
|
190
190
|
*/
|
|
191
191
|
export declare function escapeText(value: unknown): string;
|
|
192
|
+
/**
|
|
193
|
+
* Neutralize a value for splicing into an HTML COMMENT (`<!--...-->`), the
|
|
194
|
+
* whole-item loop conditional's `bf-loop-i:<key>` anchor (#1665,
|
|
195
|
+
* `itemAnchorTemplate` in `ir-to-client-js/html-template.ts`) being the one
|
|
196
|
+
* caller today. Standard HTML escaping (`escapeAttr`/`escapeText`) does
|
|
197
|
+
* NOT help here: `-`, `<`, `>` are not special in comment content the way
|
|
198
|
+
* `& < > " '` are in text/attributes — the only thing that terminates a
|
|
199
|
+
* comment early is the literal three-character sequence `-->`, which
|
|
200
|
+
* `escapeAttr` never touches.
|
|
201
|
+
*
|
|
202
|
+
* The key's exact text does not need to round-trip: nothing reads it back
|
|
203
|
+
* out of the DOM (`mapArrayAnchored` matches items positionally on first
|
|
204
|
+
* hydration and by its own JS-computed key afterward, never by re-parsing
|
|
205
|
+
* `Comment.nodeValue`, `map-array.ts`'s `isItemAnchor`/`findItemAnchors`).
|
|
206
|
+
* So replacing every ASCII hyphen with the visually-similar U+2010 HYPHEN
|
|
207
|
+
* is sufficient and simpler than a reversible escape: it makes `-->`
|
|
208
|
+
* unconstructible from the result (a hyphen adjacent to the template's own
|
|
209
|
+
* literal `-->` can no longer complete the sequence), and — because it is
|
|
210
|
+
* a different Unicode character rather than an HTML entity — needs no
|
|
211
|
+
* decoding: HTML comments do not interpret character references at all,
|
|
212
|
+
* so `-` would appear as literal text `-`, not `-`.
|
|
213
|
+
*/
|
|
214
|
+
export declare function escapeCommentText(value: unknown): string;
|
|
192
215
|
/**
|
|
193
216
|
* Brand carried by `bfMarkup()` — see that function's docstring. A string
|
|
194
217
|
* key (not a `Symbol`) because the brand must survive `structuredClone`
|
|
@@ -213,7 +236,7 @@ export interface BfMarkup {
|
|
|
213
236
|
* itself assembled from a JSX element passed at a non-`children` component
|
|
214
237
|
* prop position (`header={<strong>Title</strong>}`) — every text segment
|
|
215
238
|
* inside that assembly was already escaped node-by-node during the
|
|
216
|
-
* assembly (the same `escapeHtml` / `
|
|
239
|
+
* assembly (the same `escapeHtml` calls / `spliceChildValue` door
|
|
217
240
|
* `html-template.ts` uses for ordinary element children), so the
|
|
218
241
|
* concatenated result is exactly as safe as any other compiler-emitted
|
|
219
242
|
* template fragment.
|
|
@@ -231,8 +254,8 @@ export declare function isBfMarkup(value: unknown): value is BfMarkup;
|
|
|
231
254
|
/**
|
|
232
255
|
* `escapeText`'s counterpart for a claim-plan slot the compiler has
|
|
233
256
|
* classified `kind: 'markup'` at STATIC/initial-render time
|
|
234
|
-
* (`html-template.ts`'s `
|
|
235
|
-
* `ctx.dynamicElements` membership `emit-reactive.ts` reads to pick the
|
|
257
|
+
* (`html-template.ts`'s `spliceChildValue` door, `safe-html.ts`, gated on
|
|
258
|
+
* the same `ctx.dynamicElements` membership `emit-reactive.ts` reads to pick the
|
|
236
259
|
* writer kind for the REACTIVE side, below) — #2651. A `bfMarkup()`-branded
|
|
237
260
|
* value is compiler-built HTML the compiler already escaped piecewise
|
|
238
261
|
* while assembling it, and must reach the template raw, unescaped a second
|
|
@@ -245,9 +268,8 @@ export declare function isBfMarkup(value: unknown): value is BfMarkup;
|
|
|
245
268
|
export declare function escapeTextOrMarkup(value: unknown): string;
|
|
246
269
|
/**
|
|
247
270
|
* Nullish guard for a bare `${children}` passthrough splice
|
|
248
|
-
* (`ir-to-client-js/html
|
|
249
|
-
* —
|
|
250
|
-
* describes) — #2775. The value here is ALREADY-STRINGIFIED MARKUP, not an
|
|
271
|
+
* (`ir-to-client-js/safe-html.ts`'s `spliceChildValue` door, no-`slotId`
|
|
272
|
+
* `'expression'` branches) — #2775. The value here is ALREADY-STRINGIFIED MARKUP, not an
|
|
251
273
|
* arbitrary prop: `materializeComponent` (this file, "Template functions
|
|
252
274
|
* expect children as an HTML string, not an array") joins a component's
|
|
253
275
|
* `children` into an HTML string before the template lambda ever runs, so by
|
|
@@ -278,7 +300,7 @@ export declare function markupOrEmpty(value: unknown): string;
|
|
|
278
300
|
* interpret HTML, so a raw un-escaped string is an injection/corruption
|
|
279
301
|
* risk exactly where the initial SSR/CSR TEMPLATE already calls
|
|
280
302
|
* `escapeText` on the same expression (`html-template.ts`'s
|
|
281
|
-
* `
|
|
303
|
+
* `spliceChildValue` door, `safe-html.ts`). A live `Node`, by contrast, must pass through
|
|
282
304
|
* untouched — `escapeText(node)` would stringify it to garbage, and
|
|
283
305
|
* `writeMarkup`'s own `instanceof Node` check needs the real object to
|
|
284
306
|
* splice in by identity. This is the single call every "dynamic JSX/text
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/runtime/component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/runtime/component.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { queryHref, type QueryParams, type QueryParamValue } from '../query-href
|
|
|
8
8
|
export { formatDate } from '../format-date.ts';
|
|
9
9
|
export { createContext, useContext, provideContext, setCurrentScope, type Context, } from './context.ts';
|
|
10
10
|
export { createPortal, isSSRPortal, findSiblingSlot, cleanupPortalPlaceholder, type Portal, type PortalOptions, type Renderable, type PortalChildren, } from './portal.ts';
|
|
11
|
+
export { trackPosition } from './track-position.ts';
|
|
11
12
|
export { getLoopChildren, getLoopNodes } from './loop-markers.ts';
|
|
12
13
|
export { qsaItem, upsertChildItem } from './qsa-item.ts';
|
|
13
14
|
export { mapArray, mapArrayAnchored } from './map-array.ts';
|
|
@@ -15,7 +16,7 @@ export { mapArrayLazy, type LazyRowEntry, type LazyRowPlan } from './map-array-l
|
|
|
15
16
|
export { patchLeaf } from './patch-leaf.ts';
|
|
16
17
|
export { claimSlots, lazySlots, lazyClaimSlots, textOrNode, type SlotSpec, type ClaimPlan, type ClaimedSlots, type ClaimedSlotsRW, type SlotWriter } from './claim-slots.ts';
|
|
17
18
|
export { registerTemplate, getTemplate, hasTemplate, type TemplateFn } from './template.ts';
|
|
18
|
-
export { createComponent, mountRowRoot, renderChild, withParentScope, parseHTML, escapeAttr, escapeText, escapeTextOrNode, bfMarkup, isBfMarkup, escapeTextOrMarkup, markupOrEmpty, type BfMarkup, } from './component.ts';
|
|
19
|
+
export { createComponent, mountRowRoot, renderChild, withParentScope, parseHTML, escapeAttr, escapeText, escapeCommentText, escapeTextOrNode, bfMarkup, isBfMarkup, escapeTextOrMarkup, markupOrEmpty, type BfMarkup, } from './component.ts';
|
|
19
20
|
export { applyRestAttrs } from './apply-rest-attrs.ts';
|
|
20
21
|
export { spreadAttrs } from './spread-attrs.ts';
|
|
21
22
|
export { styleToCss } from './style.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,eAAe,EACf,SAAS,EACT,OAAO,EACP,gBAAgB,EAOhB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAI9C,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,KAAK,OAAO,GACb,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
onCleanup,
|
|
10
10
|
onMount,
|
|
11
11
|
untrack as untrack4,
|
|
12
|
-
batch,
|
|
12
|
+
batch as batch2,
|
|
13
13
|
setProfilerSink,
|
|
14
14
|
beginTurn,
|
|
15
15
|
endTurn,
|
|
@@ -1614,6 +1614,11 @@ function escapeText(value) {
|
|
|
1614
1614
|
return "";
|
|
1615
1615
|
return escapeAttr(value);
|
|
1616
1616
|
}
|
|
1617
|
+
function escapeCommentText(value) {
|
|
1618
|
+
if (value == null)
|
|
1619
|
+
return "";
|
|
1620
|
+
return String(value).replace(/-/g, "‐");
|
|
1621
|
+
}
|
|
1617
1622
|
var BF_MARKUP_BRAND = "__bfMarkup";
|
|
1618
1623
|
function bfMarkup(html) {
|
|
1619
1624
|
return { [BF_MARKUP_BRAND]: html };
|
|
@@ -1747,6 +1752,46 @@ function cleanupPortalPlaceholder(portalId) {
|
|
|
1747
1752
|
const placeholder = document.querySelector(`template[${BF_PORTAL_PLACEHOLDER}="${portalId}"]`);
|
|
1748
1753
|
placeholder?.remove();
|
|
1749
1754
|
}
|
|
1755
|
+
var pendingPortals = [];
|
|
1756
|
+
var pendingObserver = null;
|
|
1757
|
+
function moveToContainerEnd(container, element) {
|
|
1758
|
+
const moveBefore = container.moveBefore;
|
|
1759
|
+
if (typeof moveBefore === "function") {
|
|
1760
|
+
moveBefore.call(container, element, null);
|
|
1761
|
+
} else {
|
|
1762
|
+
container.appendChild(element);
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
function flushPendingPortals() {
|
|
1766
|
+
for (const pending of pendingPortals.slice()) {
|
|
1767
|
+
if (!pending.subject.isConnected)
|
|
1768
|
+
continue;
|
|
1769
|
+
pendingPortals.splice(pendingPortals.indexOf(pending), 1);
|
|
1770
|
+
if (pending.element.parentNode === pending.container) {
|
|
1771
|
+
moveToContainerEnd(pending.container, pending.element);
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
if (pendingPortals.length === 0 && pendingObserver) {
|
|
1775
|
+
pendingObserver.disconnect();
|
|
1776
|
+
pendingObserver = null;
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
function enqueuePendingPortal(pending) {
|
|
1780
|
+
pendingPortals.push(pending);
|
|
1781
|
+
if (!pendingObserver) {
|
|
1782
|
+
pendingObserver = new MutationObserver(flushPendingPortals);
|
|
1783
|
+
pendingObserver.observe(document, { childList: true, subtree: true });
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
function cancelPendingPortal(element) {
|
|
1787
|
+
const idx = pendingPortals.findIndex((p) => p.element === element);
|
|
1788
|
+
if (idx >= 0)
|
|
1789
|
+
pendingPortals.splice(idx, 1);
|
|
1790
|
+
if (pendingPortals.length === 0 && pendingObserver) {
|
|
1791
|
+
pendingObserver.disconnect();
|
|
1792
|
+
pendingObserver = null;
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1750
1795
|
function createPortal(children, container = document.body, options) {
|
|
1751
1796
|
let element;
|
|
1752
1797
|
if (children instanceof HTMLElement) {
|
|
@@ -1768,16 +1813,35 @@ function createPortal(children, container = document.body, options) {
|
|
|
1768
1813
|
element.setAttribute(BF_PORTAL_OWNER, scopeId);
|
|
1769
1814
|
}
|
|
1770
1815
|
}
|
|
1816
|
+
const owner = options?.ownerScope;
|
|
1817
|
+
const formerParent = children instanceof HTMLElement ? children.parentNode : null;
|
|
1818
|
+
const subject = owner && !element.contains(owner) ? owner : formerParent instanceof Element ? formerParent : null;
|
|
1771
1819
|
container.appendChild(element);
|
|
1820
|
+
if (subject && !subject.isConnected && typeof MutationObserver !== "undefined") {
|
|
1821
|
+
enqueuePendingPortal({ element, container, subject });
|
|
1822
|
+
}
|
|
1772
1823
|
return {
|
|
1773
1824
|
element,
|
|
1774
1825
|
unmount() {
|
|
1826
|
+
cancelPendingPortal(element);
|
|
1775
1827
|
if (element.parentNode) {
|
|
1776
1828
|
element.parentNode.removeChild(element);
|
|
1777
1829
|
}
|
|
1778
1830
|
}
|
|
1779
1831
|
};
|
|
1780
1832
|
}
|
|
1833
|
+
// src/runtime/track-position.ts
|
|
1834
|
+
function trackPosition(update) {
|
|
1835
|
+
update();
|
|
1836
|
+
const onChange = () => update();
|
|
1837
|
+
window.addEventListener("scroll", onChange, true);
|
|
1838
|
+
window.addEventListener("resize", onChange);
|
|
1839
|
+
return () => {
|
|
1840
|
+
window.removeEventListener("scroll", onChange, true);
|
|
1841
|
+
window.removeEventListener("resize", onChange);
|
|
1842
|
+
update();
|
|
1843
|
+
};
|
|
1844
|
+
}
|
|
1781
1845
|
// src/runtime/loop-markers.ts
|
|
1782
1846
|
function findLoopMarkers(container, markerId) {
|
|
1783
1847
|
let startMarker = null;
|
|
@@ -1904,7 +1968,7 @@ function upsertChildItem(primaryEl, name, slotId, props, key, anchorScope) {
|
|
|
1904
1968
|
return null;
|
|
1905
1969
|
}
|
|
1906
1970
|
// src/runtime/map-array.ts
|
|
1907
|
-
import { createSignal, createEffect, createRoot as createRoot2 } from "@barefootjs/client/reactive";
|
|
1971
|
+
import { createSignal, createEffect, createRoot as createRoot2, batch } from "@barefootjs/client/reactive";
|
|
1908
1972
|
function scopeIdOf(start) {
|
|
1909
1973
|
const rest = (start.nodeValue ?? "").slice(BF_SCOPE_COMMENT_PREFIX.length);
|
|
1910
1974
|
const pipe = rest.indexOf("|");
|
|
@@ -2049,17 +2113,20 @@ function createItemScope(item, index, renderItem, existingPrimary, existingExtra
|
|
|
2049
2113
|
let primaryEl;
|
|
2050
2114
|
let dispose;
|
|
2051
2115
|
let setItem;
|
|
2116
|
+
let setIndex;
|
|
2052
2117
|
let extras = [];
|
|
2053
2118
|
let startMarker = null;
|
|
2054
2119
|
let scopeComments = null;
|
|
2055
2120
|
createRoot2((d) => {
|
|
2056
2121
|
dispose = d;
|
|
2057
2122
|
const [itemAccessor, itemSetter] = createSignal(item);
|
|
2123
|
+
const [indexAccessor, indexSetter] = createSignal(index);
|
|
2058
2124
|
setItem = itemSetter;
|
|
2125
|
+
setIndex = indexSetter;
|
|
2059
2126
|
const ownsRowMount = !existingPrimary && !!rowMount;
|
|
2060
2127
|
const prevRowMount = ownsRowMount ? setRowMountPoint(rowMount) : null;
|
|
2061
2128
|
try {
|
|
2062
|
-
primaryEl = renderItem(itemAccessor,
|
|
2129
|
+
primaryEl = renderItem(itemAccessor, indexAccessor, existingPrimary);
|
|
2063
2130
|
} catch (err) {
|
|
2064
2131
|
const parked = rowMount?.mounted;
|
|
2065
2132
|
if (parked?.parentNode)
|
|
@@ -2092,7 +2159,7 @@ function createItemScope(item, index, renderItem, existingPrimary, existingExtra
|
|
|
2092
2159
|
if (rowMount && !existingPrimary && extras.length > 0 && primaryEl.parentNode) {
|
|
2093
2160
|
primaryEl.remove();
|
|
2094
2161
|
}
|
|
2095
|
-
return { startMarker, primaryEl, extras, scopeComments, dispose, setItem };
|
|
2162
|
+
return { startMarker, primaryEl, extras, scopeComments, dispose, setItem, setIndex };
|
|
2096
2163
|
}
|
|
2097
2164
|
function mapArray(accessor, container, getKey, renderItem, markerId, bfId, keyAttrName2 = BF_KEY) {
|
|
2098
2165
|
if (!container)
|
|
@@ -2170,7 +2237,8 @@ function mapArray(accessor, container, getKey, renderItem, markerId, bfId, keyAt
|
|
|
2170
2237
|
extras: range.extras,
|
|
2171
2238
|
scopeComments: range.scopeComments,
|
|
2172
2239
|
dispose: () => {},
|
|
2173
|
-
setItem: () => {}
|
|
2240
|
+
setItem: () => {},
|
|
2241
|
+
setIndex: () => {}
|
|
2174
2242
|
});
|
|
2175
2243
|
}
|
|
2176
2244
|
}
|
|
@@ -2216,7 +2284,10 @@ function mapArray(accessor, container, getKey, renderItem, markerId, bfId, keyAt
|
|
|
2216
2284
|
newKeys.add(key);
|
|
2217
2285
|
const existing = scopes.get(key);
|
|
2218
2286
|
if (existing) {
|
|
2219
|
-
|
|
2287
|
+
batch(() => {
|
|
2288
|
+
existing.setItem(item);
|
|
2289
|
+
existing.setIndex(i2);
|
|
2290
|
+
});
|
|
2220
2291
|
desiredOrder.push(existing);
|
|
2221
2292
|
} else {
|
|
2222
2293
|
const scope = createItemScope(item, i2, renderItem, undefined, undefined, undefined, undefined, { container, anchor });
|
|
@@ -2314,23 +2385,26 @@ function removeAnchorScope(scope, end) {
|
|
|
2314
2385
|
function createAnchorScope(item, index, key, renderItem, existingAnchor) {
|
|
2315
2386
|
let dispose;
|
|
2316
2387
|
let setItem;
|
|
2388
|
+
let setIndex;
|
|
2317
2389
|
let returned;
|
|
2318
2390
|
createRoot2((d) => {
|
|
2319
2391
|
dispose = d;
|
|
2320
2392
|
const [itemAccessor, itemSetter] = createSignal(item);
|
|
2393
|
+
const [indexAccessor, indexSetter] = createSignal(index);
|
|
2321
2394
|
setItem = itemSetter;
|
|
2322
|
-
|
|
2395
|
+
setIndex = indexSetter;
|
|
2396
|
+
returned = renderItem(itemAccessor, indexAccessor, existingAnchor);
|
|
2323
2397
|
return;
|
|
2324
2398
|
});
|
|
2325
2399
|
if (existingAnchor) {
|
|
2326
|
-
return { anchor: existingAnchor, pending: null, dispose, setItem };
|
|
2400
|
+
return { anchor: existingAnchor, pending: null, dispose, setItem, setIndex };
|
|
2327
2401
|
}
|
|
2328
2402
|
const frag = returned;
|
|
2329
2403
|
const anchor = frag.firstChild;
|
|
2330
2404
|
if (anchor && !anchor.nodeValue?.startsWith(ITEM_PREFIX)) {
|
|
2331
2405
|
anchor.nodeValue = loopItemMarker(key);
|
|
2332
2406
|
}
|
|
2333
|
-
return { anchor, pending: frag, dispose, setItem };
|
|
2407
|
+
return { anchor, pending: frag, dispose, setItem, setIndex };
|
|
2334
2408
|
}
|
|
2335
2409
|
function mapArrayAnchored(accessor, container, getKey, renderItem, markerId, bfId) {
|
|
2336
2410
|
if (!container)
|
|
@@ -2381,7 +2455,10 @@ function mapArrayAnchored(accessor, container, getKey, renderItem, markerId, bfI
|
|
|
2381
2455
|
newKeys.add(key);
|
|
2382
2456
|
const existing = scopes.get(key);
|
|
2383
2457
|
if (existing) {
|
|
2384
|
-
|
|
2458
|
+
batch(() => {
|
|
2459
|
+
existing.setItem(item);
|
|
2460
|
+
existing.setIndex(i);
|
|
2461
|
+
});
|
|
2385
2462
|
desiredOrder.push(existing);
|
|
2386
2463
|
} else {
|
|
2387
2464
|
const scope = createAnchorScope(item, i, key, renderItem);
|
|
@@ -2452,6 +2529,7 @@ function mapArrayLazy(accessor, container, getKey, plan, markerId, bfId, keyAttr
|
|
|
2452
2529
|
key,
|
|
2453
2530
|
primaryEl: undefined,
|
|
2454
2531
|
item,
|
|
2532
|
+
index,
|
|
2455
2533
|
refs: null,
|
|
2456
2534
|
last: null
|
|
2457
2535
|
};
|
|
@@ -2481,7 +2559,7 @@ function mapArrayLazy(accessor, container, getKey, plan, markerId, bfId, keyAttr
|
|
|
2481
2559
|
const el = doms[i2];
|
|
2482
2560
|
const ssrKey = el.getAttribute(keyAttrName2);
|
|
2483
2561
|
const key = ssrKey !== null ? ssrKey : getKey ? getKey(items[i2], i2) : String(i2);
|
|
2484
|
-
const entry = { key, primaryEl: el, item: items[i2], refs: null, last: null };
|
|
2562
|
+
const entry = { key, primaryEl: el, item: items[i2], index: i2, refs: null, last: null };
|
|
2485
2563
|
entries.set(key, entry);
|
|
2486
2564
|
list.push(entry);
|
|
2487
2565
|
}
|
|
@@ -2536,11 +2614,19 @@ function mapArrayLazy(accessor, container, getKey, plan, markerId, bfId, keyAttr
|
|
|
2536
2614
|
newKeys.add(key);
|
|
2537
2615
|
const existing = entries.get(key);
|
|
2538
2616
|
if (existing) {
|
|
2539
|
-
|
|
2617
|
+
const itemChanged = !Object.is(existing.item, item);
|
|
2618
|
+
const indexChanged = plan.indexDriven === true && existing.index !== i2;
|
|
2619
|
+
if (itemChanged) {
|
|
2540
2620
|
const prevItem = existing.item;
|
|
2541
2621
|
existing.item = item;
|
|
2622
|
+
existing.index = i2;
|
|
2542
2623
|
untrack2(() => plan.applyItem(existing, prevItem));
|
|
2543
2624
|
markStranded();
|
|
2625
|
+
} else if (indexChanged) {
|
|
2626
|
+
existing.index = i2;
|
|
2627
|
+
untrack2(() => plan.applyItem(existing, item));
|
|
2628
|
+
} else {
|
|
2629
|
+
existing.index = i2;
|
|
2544
2630
|
}
|
|
2545
2631
|
desiredOrder.push(existing);
|
|
2546
2632
|
} else {
|
|
@@ -3402,6 +3488,7 @@ export {
|
|
|
3402
3488
|
upsertChild,
|
|
3403
3489
|
unwrap,
|
|
3404
3490
|
untrack4 as untrack,
|
|
3491
|
+
trackPosition,
|
|
3405
3492
|
textOrNode,
|
|
3406
3493
|
textNodeAfterComment as tAfter,
|
|
3407
3494
|
styleToCss,
|
|
@@ -3455,6 +3542,7 @@ export {
|
|
|
3455
3542
|
escapeTextOrNode,
|
|
3456
3543
|
escapeTextOrMarkup,
|
|
3457
3544
|
escapeText,
|
|
3545
|
+
escapeCommentText,
|
|
3458
3546
|
escapeAttr,
|
|
3459
3547
|
endTurn,
|
|
3460
3548
|
disposeScope,
|
|
@@ -3475,7 +3563,7 @@ export {
|
|
|
3475
3563
|
claimSlots,
|
|
3476
3564
|
bfMarkup,
|
|
3477
3565
|
beginTurn,
|
|
3478
|
-
batch,
|
|
3566
|
+
batch2 as batch,
|
|
3479
3567
|
applyRestAttrs,
|
|
3480
3568
|
__slot,
|
|
3481
3569
|
__bf_swap,
|
|
@@ -65,6 +65,18 @@
|
|
|
65
65
|
* (a misclassification must be harmless, not silently wrong) and for the
|
|
66
66
|
* three stranding sequences it prevents, each reproduced before it existed.
|
|
67
67
|
*
|
|
68
|
+
* **Index-driven bindings (#2859 follow-up).** A row's position is tracked
|
|
69
|
+
* on `entry.index`, updated on every reconcile whether or not any binding
|
|
70
|
+
* reads it. A plan that sets `indexDriven: true` (emitted when
|
|
71
|
+
* `LazyRowPlanData.readsIndex`) is telling the runtime that some binding of
|
|
72
|
+
* `applyItem` reads `entry.index` — so the reconciler also calls
|
|
73
|
+
* `applyItem` on a pure reorder (item unchanged, position changed), not only
|
|
74
|
+
* on an item change. This mirrors the eager `mapArray` runtime's per-row
|
|
75
|
+
* index SIGNAL (`ItemScope.setIndex`) with no per-row reactive resource: the
|
|
76
|
+
* reconciler already knows a row's position changed the same way it already
|
|
77
|
+
* knows its item changed, so re-delivering that fact through a signal would
|
|
78
|
+
* be exactly the redundant machinery this design exists to avoid.
|
|
79
|
+
*
|
|
68
80
|
* **Plan (compiler-emitted) obligations:**
|
|
69
81
|
* - `createRow` MUST write ALL bindings — item-driven AND outer-involving —
|
|
70
82
|
* with current values (it is CSR creation; it computes everything anyway)
|
|
@@ -121,6 +133,13 @@ export interface LazyRowEntry<T> {
|
|
|
121
133
|
key: string;
|
|
122
134
|
primaryEl: HTMLElement;
|
|
123
135
|
item: T;
|
|
136
|
+
/**
|
|
137
|
+
* The row's current position in the reconciled list (#2859 follow-up).
|
|
138
|
+
* Kept current on EVERY reconcile, whether or not the plan reads it —
|
|
139
|
+
* cheap bookkeeping, and it is what makes a bare reorder (no item change)
|
|
140
|
+
* detectable for `plan.indexDriven` loops.
|
|
141
|
+
*/
|
|
142
|
+
index: number;
|
|
124
143
|
/** plan-owned: claimed DOM refs, null until the row's first item-driven write */
|
|
125
144
|
refs: unknown | null;
|
|
126
145
|
/** plan-owned: per-binding last-value dedup state */
|
|
@@ -149,6 +168,16 @@ export interface LazyRowPlan<T> {
|
|
|
149
168
|
* nodeValue) to initialize its dedup value and write only where the
|
|
150
169
|
* computed value differs (read-compare-write, spec §9.3(1)). */
|
|
151
170
|
applyOuter?(entries: ReadonlyArray<LazyRowEntry<T>>, seed: boolean): void;
|
|
171
|
+
/**
|
|
172
|
+
* True when some binding, condition, or preamble-substituted dependency of
|
|
173
|
+
* this row reads the loop's INDEX (#2859 follow-up,
|
|
174
|
+
* `LazyRowPlanData.readsIndex`). Such a binding is always `readsItem`
|
|
175
|
+
* (compiler-side), so the runtime must also call `applyItem` when a row's
|
|
176
|
+
* POSITION changes with no item change — a plain reorder — not only when
|
|
177
|
+
* `!Object.is(oldItem, newItem)`. Absent/false for every other loop, which
|
|
178
|
+
* keeps a bare reorder exactly as cheap as before this widening.
|
|
179
|
+
*/
|
|
180
|
+
indexDriven?: boolean;
|
|
152
181
|
}
|
|
153
182
|
/**
|
|
154
183
|
* Lazy-row-graph keyed list rendering (spec/slot-unification.md §9).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-array-lazy.d.ts","sourceRoot":"","sources":["../../src/runtime/map-array-lazy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"map-array-lazy.d.ts","sourceRoot":"","sources":["../../src/runtime/map-array-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8HG;AAMH;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,WAAW,CAAA;IACtB,IAAI,EAAE,CAAC,CAAA;IACP;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,iFAAiF;IACjF,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACpB,qDAAqD;IACrD,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B;gFAC4E;IAC5E,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7D;;;4EAGwE;IACxE,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAA;IACpD;;;;;;;qEAOiE;IACjE,UAAU,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACzE;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,QAAQ,EAAE,MAAM,CAAC,EAAE,EACnB,SAAS,EAAE,WAAW,GAAG,IAAI,EAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,EACnD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,GAAE,MAAe,GAC3B,IAAI,CAwTN"}
|