@pilates/core 1.1.0 → 2.0.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/algorithm/cache.d.ts +7 -19
- package/dist/algorithm/cache.d.ts.map +1 -1
- package/dist/algorithm/cache.js +31 -27
- package/dist/algorithm/cache.js.map +1 -1
- package/dist/algorithm/index.js +22 -14
- package/dist/algorithm/index.js.map +1 -1
- package/dist/algorithm/round.d.ts.map +1 -1
- package/dist/algorithm/round.js +19 -19
- package/dist/algorithm/round.js.map +1 -1
- package/dist/algorithm/spineless/classify.d.ts +47 -0
- package/dist/algorithm/spineless/classify.d.ts.map +1 -0
- package/dist/algorithm/spineless/classify.js +109 -0
- package/dist/algorithm/spineless/classify.js.map +1 -0
- package/dist/algorithm/spineless/field-id-pool.d.ts +28 -0
- package/dist/algorithm/spineless/field-id-pool.d.ts.map +1 -0
- package/dist/algorithm/spineless/field-id-pool.js +35 -0
- package/dist/algorithm/spineless/field-id-pool.js.map +1 -0
- package/dist/algorithm/spineless/flex-grammar.d.ts.map +1 -1
- package/dist/algorithm/spineless/flex-grammar.js +194 -58
- package/dist/algorithm/spineless/flex-grammar.js.map +1 -1
- package/dist/algorithm/spineless/grammar.d.ts +6 -0
- package/dist/algorithm/spineless/grammar.d.ts.map +1 -1
- package/dist/algorithm/spineless/grammar.js +2 -1
- package/dist/algorithm/spineless/grammar.js.map +1 -1
- package/dist/algorithm/spineless/layout.d.ts +52 -15
- package/dist/algorithm/spineless/layout.d.ts.map +1 -1
- package/dist/algorithm/spineless/layout.js +450 -312
- package/dist/algorithm/spineless/layout.js.map +1 -1
- package/dist/algorithm/spineless/order-maintenance.d.ts +9 -0
- package/dist/algorithm/spineless/order-maintenance.d.ts.map +1 -1
- package/dist/algorithm/spineless/order-maintenance.js +6 -0
- package/dist/algorithm/spineless/order-maintenance.js.map +1 -1
- package/dist/algorithm/spineless/runtime.d.ts +61 -8
- package/dist/algorithm/spineless/runtime.d.ts.map +1 -1
- package/dist/algorithm/spineless/runtime.js +201 -50
- package/dist/algorithm/spineless/runtime.js.map +1 -1
- package/dist/algorithm/spineless/style-dirty.d.ts +8 -6
- package/dist/algorithm/spineless/style-dirty.d.ts.map +1 -1
- package/dist/algorithm/spineless/style-dirty.js +10 -11
- package/dist/algorithm/spineless/style-dirty.js.map +1 -1
- package/dist/dirty-flags.d.ts +30 -0
- package/dist/dirty-flags.d.ts.map +1 -0
- package/dist/dirty-flags.js +35 -0
- package/dist/dirty-flags.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/layout-pool.d.ts +49 -0
- package/dist/layout-pool.d.ts.map +1 -0
- package/dist/layout-pool.js +75 -0
- package/dist/layout-pool.js.map +1 -0
- package/dist/node.d.ts +20 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +63 -42
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
|
@@ -87,31 +87,19 @@ export interface LayoutCacheKey {
|
|
|
87
87
|
heightMode: MeasureMode;
|
|
88
88
|
}
|
|
89
89
|
/** @internal */
|
|
90
|
-
export interface
|
|
91
|
-
left: number;
|
|
92
|
-
top: number;
|
|
90
|
+
export interface LayoutCacheValue {
|
|
93
91
|
width: number;
|
|
94
92
|
height: number;
|
|
95
93
|
scrollWidth: number;
|
|
96
94
|
scrollHeight: number;
|
|
97
95
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* when re-laying out a dirty boundary node under a cache-hit root.
|
|
102
|
-
* See `Node._floatLeft` for the full explanation.
|
|
96
|
+
* Flat child-layout data — `CHILD_STRIDE` (8) floats per direct child:
|
|
97
|
+
* [left, top, width, height, scrollWidth, scrollHeight, floatLeft, floatTop].
|
|
98
|
+
* Leaf nodes share the module-level `EMPTY_CHILD_DATA`.
|
|
103
99
|
*/
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
/** @internal */
|
|
109
|
-
export interface LayoutCacheValue {
|
|
110
|
-
width: number;
|
|
111
|
-
height: number;
|
|
112
|
-
scrollWidth: number;
|
|
113
|
-
scrollHeight: number;
|
|
114
|
-
childLayouts: CachedChildLayout[];
|
|
100
|
+
childData: Float64Array;
|
|
101
|
+
/** Number of direct children captured. `childData.length === childCount * CHILD_STRIDE`. */
|
|
102
|
+
childCount: number;
|
|
115
103
|
}
|
|
116
104
|
/**
|
|
117
105
|
* Single-slot per-node layout cache. Matches Yoga's `cachedLayout`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,KAAK,CAAkD;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,SAAK;IACT,kCAAkC;IAClC,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAgB3D;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqB3D;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CAKzB;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,KAAK,CAAkD;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,SAAK;IACT,kCAAkC;IAClC,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAgB3D;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqB3D;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CAKzB;AAQD,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,EAAE,YAAY,CAAC;IACxB,4FAA4F;IAC5F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAyE;IAErF,gBAAgB;IAChB,IAAI,SAAK;IACT,gBAAgB;IAChB,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS;IAgBzD;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAIzD,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,EAAE,CAgBhE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI/C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAuB7D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CA2B1E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAe5E"}
|
package/dist/algorithm/cache.js
CHANGED
|
@@ -96,6 +96,10 @@ export class MeasureCache {
|
|
|
96
96
|
this.slots.length = 0;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
+
/** Number of Float64 slots per child in a `LayoutCacheValue.childData` array. */
|
|
100
|
+
const CHILD_STRIDE = 8;
|
|
101
|
+
/** Shared empty child-data array for leaf nodes — avoids per-leaf allocation. */
|
|
102
|
+
const EMPTY_CHILD_DATA = new Float64Array(0);
|
|
99
103
|
/**
|
|
100
104
|
* Single-slot per-node layout cache. Matches Yoga's `cachedLayout`
|
|
101
105
|
* (single overwrite-on-write) and Taffy's 1-slot layout-cache. Internal
|
|
@@ -223,27 +227,27 @@ export function markDirtyDeep(root) {
|
|
|
223
227
|
* @internal
|
|
224
228
|
*/
|
|
225
229
|
export function snapshotForCache(node) {
|
|
226
|
-
const childLayouts = [];
|
|
227
230
|
const count = node.getChildCount();
|
|
231
|
+
const childData = count === 0 ? EMPTY_CHILD_DATA : new Float64Array(count * CHILD_STRIDE);
|
|
228
232
|
for (let i = 0; i < count; i++) {
|
|
229
233
|
const c = node.getChild(i);
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
});
|
|
234
|
+
const base = i * CHILD_STRIDE;
|
|
235
|
+
childData[base] = c.layout.left;
|
|
236
|
+
childData[base + 1] = c.layout.top;
|
|
237
|
+
childData[base + 2] = c.layout.width;
|
|
238
|
+
childData[base + 3] = c.layout.height;
|
|
239
|
+
childData[base + 4] = c.layout.scrollWidth;
|
|
240
|
+
childData[base + 5] = c.layout.scrollHeight;
|
|
241
|
+
childData[base + 6] = c._floatLeft;
|
|
242
|
+
childData[base + 7] = c._floatTop;
|
|
240
243
|
}
|
|
241
244
|
return {
|
|
242
245
|
width: node.layout.width,
|
|
243
246
|
height: node.layout.height,
|
|
244
247
|
scrollWidth: node.layout.scrollWidth,
|
|
245
248
|
scrollHeight: node.layout.scrollHeight,
|
|
246
|
-
|
|
249
|
+
childData,
|
|
250
|
+
childCount: count,
|
|
247
251
|
};
|
|
248
252
|
}
|
|
249
253
|
/**
|
|
@@ -262,28 +266,28 @@ export function snapshotForCache(node) {
|
|
|
262
266
|
*/
|
|
263
267
|
export function restoreFromCache(node, value) {
|
|
264
268
|
if (process.env.PILATES_DIFFERENTIAL_LAYOUT === '1') {
|
|
265
|
-
if (node.getChildCount() !== value.
|
|
266
|
-
throw new Error(`[pilates layout cache] restored value has ${value.
|
|
269
|
+
if (node.getChildCount() !== value.childCount) {
|
|
270
|
+
throw new Error(`[pilates layout cache] restored value has ${value.childCount} children but node has ${node.getChildCount()} — cache invalidation bug`);
|
|
267
271
|
}
|
|
268
272
|
}
|
|
269
273
|
node._layout.width = value.width;
|
|
270
274
|
node._layout.height = value.height;
|
|
271
275
|
node._layout.scrollWidth = value.scrollWidth;
|
|
272
276
|
node._layout.scrollHeight = value.scrollHeight;
|
|
273
|
-
// node._layout.left/top are set by the caller before recursion starts
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
for (let i = 0; i <
|
|
277
|
+
// node._layout.left/top are set by the caller before recursion starts.
|
|
278
|
+
const cd = value.childData;
|
|
279
|
+
const count = node.getChildCount();
|
|
280
|
+
for (let i = 0; i < count; i++) {
|
|
277
281
|
const c = node.getChild(i);
|
|
278
|
-
const
|
|
279
|
-
c._layout.left =
|
|
280
|
-
c._layout.top =
|
|
281
|
-
c._layout.width =
|
|
282
|
-
c._layout.height =
|
|
283
|
-
c._layout.scrollWidth =
|
|
284
|
-
c._layout.scrollHeight =
|
|
285
|
-
c._floatLeft =
|
|
286
|
-
c._floatTop =
|
|
282
|
+
const base = i * CHILD_STRIDE;
|
|
283
|
+
c._layout.left = cd[base];
|
|
284
|
+
c._layout.top = cd[base + 1];
|
|
285
|
+
c._layout.width = cd[base + 2];
|
|
286
|
+
c._layout.height = cd[base + 3];
|
|
287
|
+
c._layout.scrollWidth = cd[base + 4];
|
|
288
|
+
c._layout.scrollHeight = cd[base + 5];
|
|
289
|
+
c._floatLeft = cd[base + 6];
|
|
290
|
+
c._floatTop = cd[base + 7];
|
|
287
291
|
}
|
|
288
292
|
}
|
|
289
293
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAU,WAAW,GAAG,CAAC,CAAC;IAChC,KAAK,GAA+C,EAAE,CAAC;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,GAAG,CAAC,CAAC;IACT,kCAAkC;IAClC,MAAM,GAAG,CAAC,CAAC;IAEX,MAAM,CAAC,GAAoB;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IACE,IAAI,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc;gBAC1C,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;gBAChC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe;gBAC5C,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,EAClC,CAAC;gBACD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAoB,EAAE,KAAwB;QAClD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IACE,IAAI,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc;gBAC1C,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;gBAChC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe;gBAC5C,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,EAClC,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/algorithm/index.js
CHANGED
|
@@ -70,7 +70,7 @@ export function calculateLayout(root, availableWidth, availableHeight) {
|
|
|
70
70
|
// engine takes over — build once, relay incrementally.
|
|
71
71
|
const engine = layoutEngines.get(root);
|
|
72
72
|
if (engine === undefined) {
|
|
73
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
73
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, false);
|
|
74
74
|
layoutEngines.set(root, 'cold');
|
|
75
75
|
}
|
|
76
76
|
else {
|
|
@@ -97,12 +97,12 @@ export function calculateLayout(root, availableWidth, availableHeight) {
|
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
99
99
|
// First pass: cached path (normal).
|
|
100
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
100
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
101
101
|
const cachedSnapshot = snapshotTreeLayouts(root);
|
|
102
102
|
// Second pass: clear caches, re-dirty, recompute cold.
|
|
103
103
|
clearAllCaches(root);
|
|
104
104
|
markDirtyDeep(root);
|
|
105
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
105
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
106
106
|
const coldSnapshot = snapshotTreeLayouts(root);
|
|
107
107
|
const diff = diffLayouts(cachedSnapshot, coldSnapshot);
|
|
108
108
|
if (diff !== '') {
|
|
@@ -118,9 +118,9 @@ export function calculateLayout(root, availableWidth, availableHeight) {
|
|
|
118
118
|
* @internal
|
|
119
119
|
*/
|
|
120
120
|
export function calculateLayoutImperative(root, availableWidth, availableHeight) {
|
|
121
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
121
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
122
122
|
}
|
|
123
|
-
function calculateLayoutImpl(root, availableWidth, availableHeight) {
|
|
123
|
+
function calculateLayoutImpl(root, availableWidth, availableHeight, populateCache) {
|
|
124
124
|
const widthMode = availableWidth === undefined ? 'undefined' : 'exactly';
|
|
125
125
|
const heightMode = availableHeight === undefined ? 'undefined' : 'exactly';
|
|
126
126
|
const aw = availableWidth ?? Number.POSITIVE_INFINITY;
|
|
@@ -180,12 +180,17 @@ function calculateLayoutImpl(root, availableWidth, availableHeight) {
|
|
|
180
180
|
root._layout.height = resolveRootAxisSize(root, 'column', availableHeight);
|
|
181
181
|
layoutChildren(root);
|
|
182
182
|
roundLayout(root);
|
|
183
|
-
computeScrollSizes(root);
|
|
183
|
+
computeScrollSizes(root, populateCache);
|
|
184
184
|
markClean(root);
|
|
185
185
|
// Store the root's result (computeScrollSizes already cached inner nodes).
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
// Skipped when populateCache is false — the router runs the imperative
|
|
187
|
+
// engine only once per root, then switches to Spineless, which never
|
|
188
|
+
// reads this cache.
|
|
189
|
+
if (populateCache) {
|
|
190
|
+
if (root._layoutCache === undefined)
|
|
191
|
+
root._layoutCache = new LayoutCache();
|
|
192
|
+
root._layoutCache.store(key, snapshotForCache(root));
|
|
193
|
+
}
|
|
189
194
|
}
|
|
190
195
|
function markClean(node) {
|
|
191
196
|
node.clearDirty();
|
|
@@ -204,9 +209,10 @@ function markClean(node) {
|
|
|
204
209
|
* Runs after `roundLayout` so the recorded extent is in integer cells and
|
|
205
210
|
* matches what the renderer paints.
|
|
206
211
|
*/
|
|
207
|
-
function computeScrollSizes(node) {
|
|
208
|
-
for (let i = 0; i < node.getChildCount(); i++)
|
|
209
|
-
computeScrollSizes(node.getChild(i));
|
|
212
|
+
function computeScrollSizes(node, populateCache) {
|
|
213
|
+
for (let i = 0; i < node.getChildCount(); i++) {
|
|
214
|
+
computeScrollSizes(node.getChild(i), populateCache);
|
|
215
|
+
}
|
|
210
216
|
let contentRight = 0;
|
|
211
217
|
let contentBottom = 0;
|
|
212
218
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
@@ -218,8 +224,10 @@ function computeScrollSizes(node) {
|
|
|
218
224
|
node._layout.scrollWidth = Math.max(node._layout.width, contentRight);
|
|
219
225
|
node._layout.scrollHeight = Math.max(node._layout.height, contentBottom);
|
|
220
226
|
// Cache the node's layout for next pass. Skip root (cached separately
|
|
221
|
-
// by calculateLayoutImpl with the original root key).
|
|
222
|
-
|
|
227
|
+
// by calculateLayoutImpl with the original root key). Skipped entirely
|
|
228
|
+
// when populateCache is false — the router's first-layout imperative pass
|
|
229
|
+
// populates a cache no subsequent layout reads (layout 2+ uses Spineless).
|
|
230
|
+
if (populateCache && node.getParent() !== null) {
|
|
223
231
|
const innerKey = {
|
|
224
232
|
availableWidth: node.layout.width,
|
|
225
233
|
widthMode: 'exactly',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAoB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;AAUrE,sEAAsE;AACtE,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA+B;IAC/D,QAAQ,GAAG,QAAQ,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,aAAa,GAAG,IAAI,OAAO,EAAkC,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,IAAI,OAAO,EAA6B,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU;IACvC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAU,EACV,cAAkC,EAClC,eAAmC;IAEnC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,8DAA8D;QAC9D,mEAAmE;QACnE,yDAAyD;QACzD,mEAAmE;QACnE,yDAAyD;QACzD,EAAE;QACF,gEAAgE;QAChE,2DAA2D;QAC3D,IAAI,MAAM,GAA2B,IAAI,CAAC;QAC1C,kEAAkE;QAClE,8DAA8D;QAC9D,kEAAkE;QAClE,uDAAuD;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG5C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAoB3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,IAAI,CAGN"}
|
package/dist/algorithm/round.js
CHANGED
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
*
|
|
16
16
|
* This mirrors Yoga's "round to pixel grid" pass.
|
|
17
17
|
*/
|
|
18
|
+
import { Pool } from '../layout-pool.js';
|
|
18
19
|
export function roundLayout(root) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
applyRounding(root, absolutes, 0, 0);
|
|
20
|
+
collectAbsolutes(root, 0, 0);
|
|
21
|
+
applyRounding(root, 0, 0);
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Round the layout of a subtree that sits at a known absolute position.
|
|
@@ -45,17 +45,16 @@ export function roundLayoutSubtree(node, parentAbsX, parentAbsY) {
|
|
|
45
45
|
// are computed in the same floating-point space as the full-tree roundLayout pass.
|
|
46
46
|
const nodeAbsX = parentAbsX + node._floatLeft;
|
|
47
47
|
const nodeAbsY = parentAbsY + node._floatTop;
|
|
48
|
-
const absolutes = new Map();
|
|
49
48
|
// Collect children relative to the node's absolute corner.
|
|
50
49
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
51
|
-
collectAbsolutes(node.getChild(i), nodeAbsX, nodeAbsY
|
|
50
|
+
collectAbsolutes(node.getChild(i), nodeAbsX, nodeAbsY);
|
|
52
51
|
}
|
|
53
52
|
// Round children (their positions are relative to `node`, so
|
|
54
53
|
// parentRoundedX/Y for each child is node's absolute corner rounded).
|
|
55
54
|
const roundedNodeX = Math.round(nodeAbsX);
|
|
56
55
|
const roundedNodeY = Math.round(nodeAbsY);
|
|
57
56
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
58
|
-
applyRounding(node.getChild(i),
|
|
57
|
+
applyRounding(node.getChild(i), roundedNodeX, roundedNodeY);
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
/**
|
|
@@ -71,30 +70,31 @@ export function roundLayoutSubtree(node, parentAbsX, parentAbsY) {
|
|
|
71
70
|
* @internal
|
|
72
71
|
*/
|
|
73
72
|
export function roundLayoutFrom(node, parentAbsX, parentAbsY, parentRoundedX, parentRoundedY) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
applyRounding(node, absolutes, parentRoundedX, parentRoundedY);
|
|
73
|
+
collectAbsolutes(node, parentAbsX, parentAbsY);
|
|
74
|
+
applyRounding(node, parentRoundedX, parentRoundedY);
|
|
77
75
|
}
|
|
78
|
-
function collectAbsolutes(node, parentX, parentY
|
|
76
|
+
function collectAbsolutes(node, parentX, parentY) {
|
|
79
77
|
const x = parentX + node.layout.left;
|
|
80
78
|
const y = parentY + node.layout.top;
|
|
81
|
-
|
|
79
|
+
Pool.absCornersX[node._id] = x;
|
|
80
|
+
Pool.absCornersY[node._id] = y;
|
|
82
81
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
83
|
-
collectAbsolutes(node.getChild(i), x, y
|
|
82
|
+
collectAbsolutes(node.getChild(i), x, y);
|
|
84
83
|
}
|
|
85
84
|
}
|
|
86
|
-
function applyRounding(node,
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
85
|
+
function applyRounding(node, parentRoundedX, parentRoundedY) {
|
|
86
|
+
const absX = Pool.absCornersX[node._id];
|
|
87
|
+
const absY = Pool.absCornersY[node._id];
|
|
88
|
+
const roundedX = Math.round(absX);
|
|
89
|
+
const roundedY = Math.round(absY);
|
|
90
|
+
const roundedR = Math.round(absX + node.layout.width);
|
|
91
|
+
const roundedB = Math.round(absY + node.layout.height);
|
|
92
92
|
node._layout.left = roundedX - parentRoundedX;
|
|
93
93
|
node._layout.top = roundedY - parentRoundedY;
|
|
94
94
|
node._layout.width = Math.max(0, roundedR - roundedX);
|
|
95
95
|
node._layout.height = Math.max(0, roundedB - roundedY);
|
|
96
96
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
97
|
-
applyRounding(node.getChild(i),
|
|
97
|
+
applyRounding(node.getChild(i), roundedX, roundedY);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
//# sourceMappingURL=round.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dirty-region classifier for the `calculateLayout` router (phase 14).
|
|
3
|
+
*
|
|
4
|
+
* Examines the dirty region of `root` against a snapshot map of the
|
|
5
|
+
* pre-mutation tree state. Returns a discriminated union telling the
|
|
6
|
+
* router which engine to use:
|
|
7
|
+
*
|
|
8
|
+
* - `value` — only value mutations on snapped nodes; Spineless wins
|
|
9
|
+
* - `structural` — one pivot node had its child list change; route to imperative
|
|
10
|
+
* - `multi-pivot` — two or more parents had children change; imperative for safety
|
|
11
|
+
* - `sig-change` — a snapped node had its signature or measure func change; imperative
|
|
12
|
+
* - `no-snap` — no snap map available (driver is cold or just invalidated)
|
|
13
|
+
*
|
|
14
|
+
* Pure function over `Node` reads + the snap map. No I/O, no
|
|
15
|
+
* side effects.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
import type { MeasureFunc } from '../../measure-func.js';
|
|
20
|
+
import type { Node } from '../../node.js';
|
|
21
|
+
/**
|
|
22
|
+
* The structural-signature payload the classifier compares per node.
|
|
23
|
+
* Mirrors the shape `SpinelessLayout.layout()` uses internally; lifted
|
|
24
|
+
* here so the router can classify without instantiating a driver.
|
|
25
|
+
*/
|
|
26
|
+
export interface NodeSnap {
|
|
27
|
+
sig: string;
|
|
28
|
+
measure: MeasureFunc | null;
|
|
29
|
+
children: Node[];
|
|
30
|
+
}
|
|
31
|
+
export type Classification = {
|
|
32
|
+
kind: 'value';
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'structural';
|
|
35
|
+
pivot: Node;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'multi-pivot';
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'sig-change';
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'no-snap';
|
|
42
|
+
};
|
|
43
|
+
/** Snapshot one node's structural shape for later comparison. */
|
|
44
|
+
export declare function snapNode(node: Node): NodeSnap;
|
|
45
|
+
/** Walk dirty region, classify against the snap map. */
|
|
46
|
+
export declare function classifyDirty(root: Node, snaps: ReadonlyMap<Node, NodeSnap> | null): Classification;
|
|
47
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/algorithm/spineless/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,IAAI,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AA4BxB,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAI7C;AAWD,wDAAwD;AACxD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,GACxC,cAAc,CAwChB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dirty-region classifier for the `calculateLayout` router (phase 14).
|
|
3
|
+
*
|
|
4
|
+
* Examines the dirty region of `root` against a snapshot map of the
|
|
5
|
+
* pre-mutation tree state. Returns a discriminated union telling the
|
|
6
|
+
* router which engine to use:
|
|
7
|
+
*
|
|
8
|
+
* - `value` — only value mutations on snapped nodes; Spineless wins
|
|
9
|
+
* - `structural` — one pivot node had its child list change; route to imperative
|
|
10
|
+
* - `multi-pivot` — two or more parents had children change; imperative for safety
|
|
11
|
+
* - `sig-change` — a snapped node had its signature or measure func change; imperative
|
|
12
|
+
* - `no-snap` — no snap map available (driver is cold or just invalidated)
|
|
13
|
+
*
|
|
14
|
+
* Pure function over `Node` reads + the snap map. No I/O, no
|
|
15
|
+
* side effects.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Build a structural signature for one node. Two nodes' sigs are equal
|
|
21
|
+
* iff their style-affecting-layout-shape fields are equal — see
|
|
22
|
+
* `SpinelessLayout`'s `nodeSig` for the inspiration.
|
|
23
|
+
*/
|
|
24
|
+
function nodeSig(node) {
|
|
25
|
+
const s = node.style;
|
|
26
|
+
return [
|
|
27
|
+
s.flexDirection,
|
|
28
|
+
s.flexWrap,
|
|
29
|
+
s.justifyContent,
|
|
30
|
+
s.alignItems,
|
|
31
|
+
s.alignContent,
|
|
32
|
+
s.alignSelf,
|
|
33
|
+
s.positionType,
|
|
34
|
+
s.display,
|
|
35
|
+
typeof s.width,
|
|
36
|
+
typeof s.height,
|
|
37
|
+
typeof s.flexBasis,
|
|
38
|
+
s.flexGrow > 0 ? 'g' : '_',
|
|
39
|
+
s.flexShrink > 0 ? 's' : '_',
|
|
40
|
+
s.aspectRatio === undefined ? 'n' : String(s.aspectRatio),
|
|
41
|
+
s.position.map((p) => (p === undefined ? '_' : String(p))).join(','),
|
|
42
|
+
].join('|');
|
|
43
|
+
}
|
|
44
|
+
/** Snapshot one node's structural shape for later comparison. */
|
|
45
|
+
export function snapNode(node) {
|
|
46
|
+
const children = [];
|
|
47
|
+
for (let i = 0; i < node.getChildCount(); i++)
|
|
48
|
+
children.push(node.getChild(i));
|
|
49
|
+
return { sig: nodeSig(node), measure: node.getMeasureFunc(), children };
|
|
50
|
+
}
|
|
51
|
+
/** True iff `node`'s current child list still matches `snap.children`. */
|
|
52
|
+
function childrenUnchanged(snap, node) {
|
|
53
|
+
if (node.getChildCount() !== snap.children.length)
|
|
54
|
+
return false;
|
|
55
|
+
for (let i = 0; i < snap.children.length; i++) {
|
|
56
|
+
if (node.getChild(i) !== snap.children[i])
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
/** Walk dirty region, classify against the snap map. */
|
|
62
|
+
export function classifyDirty(root, snaps) {
|
|
63
|
+
if (snaps === null)
|
|
64
|
+
return { kind: 'no-snap' };
|
|
65
|
+
let structuralPivot = null;
|
|
66
|
+
let multiPivot = false;
|
|
67
|
+
let sigChanged = false;
|
|
68
|
+
function visit(n) {
|
|
69
|
+
if (sigChanged || multiPivot)
|
|
70
|
+
return;
|
|
71
|
+
const dirty = n.isDirty();
|
|
72
|
+
const hasDirtyDescendant = n
|
|
73
|
+
._hasDirtyDescendant;
|
|
74
|
+
const snap = snaps.get(n);
|
|
75
|
+
if (snap === undefined) {
|
|
76
|
+
// A node with no snap that's part of the dirty walk = newly
|
|
77
|
+
// introduced node (e.g. an appended child). Its parent's child-list
|
|
78
|
+
// change is already tracked via childrenUnchanged(); don't escalate
|
|
79
|
+
// to multi-pivot just because the new subtree contains unseen nodes.
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (dirty) {
|
|
83
|
+
if (snap.sig !== nodeSig(n) || snap.measure !== n.getMeasureFunc()) {
|
|
84
|
+
sigChanged = true;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!childrenUnchanged(snap, n)) {
|
|
88
|
+
if (structuralPivot !== null && structuralPivot !== n) {
|
|
89
|
+
multiPivot = true;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
structuralPivot = n;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (dirty || hasDirtyDescendant) {
|
|
96
|
+
for (let i = 0; i < n.getChildCount(); i++)
|
|
97
|
+
visit(n.getChild(i));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
visit(root);
|
|
101
|
+
if (sigChanged)
|
|
102
|
+
return { kind: 'sig-change' };
|
|
103
|
+
if (multiPivot)
|
|
104
|
+
return { kind: 'multi-pivot' };
|
|
105
|
+
if (structuralPivot !== null)
|
|
106
|
+
return { kind: 'structural', pivot: structuralPivot };
|
|
107
|
+
return { kind: 'value' };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/algorithm/spineless/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monotonic integer ID allocator for Spineless `Field` objects.
|
|
3
|
+
* Phase 15I indexes the runtime's typed-array storage by field.id.
|
|
4
|
+
*
|
|
5
|
+
* IDs are never recycled — Fields are interned per (node, name) and
|
|
6
|
+
* live as long as their node. The max id is the live-field high-water
|
|
7
|
+
* mark, matching LayoutPool's accepted tradeoff.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
/** Allocate a fresh unique integer id for a Field. */
|
|
12
|
+
export declare function allocateFieldId(): number;
|
|
13
|
+
/** Current id count — the exclusive upper bound of allocated ids.
|
|
14
|
+
* Runtime typed arrays size to at least this. @internal */
|
|
15
|
+
export declare function fieldIdCount(): number;
|
|
16
|
+
/** Reset for tests. @internal
|
|
17
|
+
*
|
|
18
|
+
* WARNING: Only safe to call when no live `Field` objects exist
|
|
19
|
+
* anywhere — the `FIELD_REGISTRY` WeakMap in `grammar.ts` is NOT
|
|
20
|
+
* cleared, so any `Field` retained across this call still holds
|
|
21
|
+
* its old id. Newly-allocated fields will then collide with retained
|
|
22
|
+
* ids, aliasing entries in the runtime's typed-array storage. The
|
|
23
|
+
* standard test harness creates fresh `Node`s per test, so retained
|
|
24
|
+
* cross-test references are the only way to hit this; don't introduce
|
|
25
|
+
* them.
|
|
26
|
+
*/
|
|
27
|
+
export declare function _resetFieldIdsForTesting(): void;
|
|
28
|
+
//# sourceMappingURL=field-id-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-id-pool.d.ts","sourceRoot":"","sources":["../../../src/algorithm/spineless/field-id-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;4DAC4D;AAC5D,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|