@farm.js/react 0.1.0-beta.18 → 0.1.0-beta.19

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.
@@ -2254,6 +2254,249 @@ function keyedMapLookupChangedKeys(previousSnapshot, nextSnapshot) {
2254
2254
  }
2255
2255
  return keys;
2256
2256
  }
2257
+ function createSingleKindKeyedTargetRuntime(props, kind, snapshot, changedKeys) {
2258
+ if (!props.bindings.some(
2259
+ (binding) => binding.identityTarget || binding.membershipTarget || binding.mapLookupTarget
2260
+ ))
2261
+ return void 0;
2262
+ const previous = /* @__PURE__ */ new Map();
2263
+ let next = /* @__PURE__ */ new Map();
2264
+ const compatible = (binding) => (kind === "identityTarget" || !binding.identityTarget) && (kind === "membershipTarget" || !binding.membershipTarget) && (kind === "mapLookupTarget" || !binding.mapLookupTarget);
2265
+ return {
2266
+ hasSafeTargets(props2, dirtyState) {
2267
+ for (const binding of props2.bindings) {
2268
+ if (!compatible(binding)) return false;
2269
+ const target = binding[kind];
2270
+ if (kind !== "identityTarget" && target && (!dirtyState || dirtyState.has(target.dependency)) && !snapshot(target.read()).eligible)
2271
+ return false;
2272
+ }
2273
+ return true;
2274
+ },
2275
+ commit(props2, dirtyState) {
2276
+ if (!dirtyState) previous.clear();
2277
+ for (let index = 0; index < props2.bindings.length; index++) {
2278
+ const target = props2.bindings[index][kind];
2279
+ if (!target) previous.delete(index);
2280
+ else if (!dirtyState || dirtyState.has(target.dependency))
2281
+ previous.set(index, snapshot(target.read()));
2282
+ }
2283
+ },
2284
+ prepare(props2, indices) {
2285
+ next = /* @__PURE__ */ new Map();
2286
+ for (const index of indices) {
2287
+ const binding = props2.bindings[index];
2288
+ if (!compatible(binding)) return false;
2289
+ const target = binding[kind];
2290
+ if (!target) continue;
2291
+ const value = snapshot(target.read(), previous.get(index));
2292
+ if (kind !== "identityTarget" && !value.eligible) return false;
2293
+ next.set(index, value);
2294
+ }
2295
+ return true;
2296
+ },
2297
+ select(props2, index, dirtyState, fallbackKeys, fallbackCount) {
2298
+ const binding = props2.bindings[index];
2299
+ const target = binding[kind];
2300
+ const before = previous.get(index);
2301
+ const after = next.get(index);
2302
+ if (target && binding.dependencies?.length === 1 && binding.dependencies[0] === target.dependency && dirtyState.has(target.dependency) && before?.eligible && after?.eligible) {
2303
+ const keys = changedKeys(before, after);
2304
+ return { keys, count: keys.size };
2305
+ }
2306
+ return { keys: fallbackKeys, count: fallbackCount };
2307
+ },
2308
+ commitPrepared(indices) {
2309
+ for (const index of indices) {
2310
+ const value = next.get(index);
2311
+ if (value) previous.set(index, value);
2312
+ else previous.delete(index);
2313
+ }
2314
+ },
2315
+ clear() {
2316
+ previous.clear();
2317
+ next.clear();
2318
+ }
2319
+ };
2320
+ }
2321
+ function createKeyedIdentityTargetRuntime(props) {
2322
+ return createSingleKindKeyedTargetRuntime(
2323
+ props,
2324
+ "identityTarget",
2325
+ keyedIdentityTargetSnapshot,
2326
+ (previous, next) => {
2327
+ const keys = /* @__PURE__ */ new Set();
2328
+ if (previous.key !== void 0) keys.add(previous.key);
2329
+ if (next.key !== void 0) keys.add(next.key);
2330
+ return keys;
2331
+ }
2332
+ );
2333
+ }
2334
+ function createKeyedMembershipTargetRuntime(props) {
2335
+ return createSingleKindKeyedTargetRuntime(
2336
+ props,
2337
+ "membershipTarget",
2338
+ keyedMembershipTargetSnapshot,
2339
+ keyedMembershipChangedKeys
2340
+ );
2341
+ }
2342
+ function createKeyedMapLookupTargetRuntime(props) {
2343
+ return createSingleKindKeyedTargetRuntime(
2344
+ props,
2345
+ "mapLookupTarget",
2346
+ keyedMapLookupTargetSnapshot,
2347
+ keyedMapLookupChangedKeys
2348
+ );
2349
+ }
2350
+ function createKeyedTargetRuntime(props) {
2351
+ if (!props.bindings.some(
2352
+ (binding) => binding.identityTarget || binding.membershipTarget || binding.mapLookupTarget
2353
+ )) {
2354
+ return void 0;
2355
+ }
2356
+ const identityTargets = /* @__PURE__ */ new Map();
2357
+ const membershipTargets = /* @__PURE__ */ new Map();
2358
+ const mapLookupTargets = /* @__PURE__ */ new Map();
2359
+ let nextIdentityTargets = /* @__PURE__ */ new Map();
2360
+ let nextMembershipTargets = /* @__PURE__ */ new Map();
2361
+ let nextMapLookupTargets = /* @__PURE__ */ new Map();
2362
+ return {
2363
+ hasSafeTargets(props2, dirtyState) {
2364
+ for (const binding of props2.bindings) {
2365
+ const membershipTarget = binding.membershipTarget;
2366
+ if (membershipTarget && (!dirtyState || dirtyState.has(membershipTarget.dependency)) && !keyedMembershipTargetSnapshot(membershipTarget.read()).eligible) {
2367
+ return false;
2368
+ }
2369
+ const mapLookupTarget = binding.mapLookupTarget;
2370
+ if (mapLookupTarget && (!dirtyState || dirtyState.has(mapLookupTarget.dependency)) && !keyedMapLookupTargetSnapshot(mapLookupTarget.read()).eligible) {
2371
+ return false;
2372
+ }
2373
+ }
2374
+ return true;
2375
+ },
2376
+ commit(props2, dirtyState) {
2377
+ if (!dirtyState) {
2378
+ identityTargets.clear();
2379
+ membershipTargets.clear();
2380
+ mapLookupTargets.clear();
2381
+ }
2382
+ for (let bindingIndex = 0; bindingIndex < props2.bindings.length; bindingIndex += 1) {
2383
+ const binding = props2.bindings[bindingIndex];
2384
+ const identityTarget = binding.identityTarget;
2385
+ if (!identityTarget) {
2386
+ identityTargets.delete(bindingIndex);
2387
+ } else if (!dirtyState || dirtyState.has(identityTarget.dependency)) {
2388
+ identityTargets.set(bindingIndex, keyedIdentityTargetSnapshot(identityTarget.read()));
2389
+ }
2390
+ const membershipTarget = binding.membershipTarget;
2391
+ if (!membershipTarget) {
2392
+ membershipTargets.delete(bindingIndex);
2393
+ } else if (!dirtyState || dirtyState.has(membershipTarget.dependency)) {
2394
+ membershipTargets.set(
2395
+ bindingIndex,
2396
+ keyedMembershipTargetSnapshot(membershipTarget.read())
2397
+ );
2398
+ }
2399
+ const mapLookupTarget = binding.mapLookupTarget;
2400
+ if (!mapLookupTarget) {
2401
+ mapLookupTargets.delete(bindingIndex);
2402
+ } else if (!dirtyState || dirtyState.has(mapLookupTarget.dependency)) {
2403
+ mapLookupTargets.set(bindingIndex, keyedMapLookupTargetSnapshot(mapLookupTarget.read()));
2404
+ }
2405
+ }
2406
+ },
2407
+ prepare(props2, bindingIndices) {
2408
+ nextIdentityTargets = /* @__PURE__ */ new Map();
2409
+ nextMembershipTargets = /* @__PURE__ */ new Map();
2410
+ nextMapLookupTargets = /* @__PURE__ */ new Map();
2411
+ for (const bindingIndex of bindingIndices) {
2412
+ const binding = props2.bindings[bindingIndex];
2413
+ if (binding.identityTarget) {
2414
+ nextIdentityTargets.set(
2415
+ bindingIndex,
2416
+ keyedIdentityTargetSnapshot(binding.identityTarget.read())
2417
+ );
2418
+ }
2419
+ if (binding.membershipTarget) {
2420
+ const snapshot = keyedMembershipTargetSnapshot(
2421
+ binding.membershipTarget.read(),
2422
+ membershipTargets.get(bindingIndex)
2423
+ );
2424
+ if (!snapshot.eligible) return false;
2425
+ nextMembershipTargets.set(bindingIndex, snapshot);
2426
+ }
2427
+ if (binding.mapLookupTarget) {
2428
+ const snapshot = keyedMapLookupTargetSnapshot(
2429
+ binding.mapLookupTarget.read(),
2430
+ mapLookupTargets.get(bindingIndex)
2431
+ );
2432
+ if (!snapshot.eligible) return false;
2433
+ nextMapLookupTargets.set(bindingIndex, snapshot);
2434
+ }
2435
+ }
2436
+ return true;
2437
+ },
2438
+ select(props2, bindingIndex, dirtyState, fallbackKeys, fallbackCount) {
2439
+ const binding = props2.bindings[bindingIndex];
2440
+ const identityTarget = binding.identityTarget;
2441
+ const previousIdentityTarget = identityTargets.get(bindingIndex);
2442
+ const nextIdentityTarget = nextIdentityTargets.get(bindingIndex);
2443
+ const canTargetIdentity = Boolean(
2444
+ identityTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === identityTarget.dependency && dirtyState.has(identityTarget.dependency) && previousIdentityTarget?.eligible && nextIdentityTarget?.eligible
2445
+ );
2446
+ const membershipTarget = binding.membershipTarget;
2447
+ const previousMembershipTarget = membershipTargets.get(bindingIndex);
2448
+ const nextMembershipTarget = nextMembershipTargets.get(bindingIndex);
2449
+ const canTargetMembership = Boolean(
2450
+ membershipTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === membershipTarget.dependency && dirtyState.has(membershipTarget.dependency) && previousMembershipTarget?.eligible && nextMembershipTarget?.eligible
2451
+ );
2452
+ const mapLookupTarget = binding.mapLookupTarget;
2453
+ const previousMapLookupTarget = mapLookupTargets.get(bindingIndex);
2454
+ const nextMapLookupTarget = nextMapLookupTargets.get(bindingIndex);
2455
+ const canTargetMapLookup = Boolean(
2456
+ mapLookupTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === mapLookupTarget.dependency && dirtyState.has(mapLookupTarget.dependency) && previousMapLookupTarget?.eligible && nextMapLookupTarget?.eligible
2457
+ );
2458
+ if (canTargetMapLookup && previousMapLookupTarget && nextMapLookupTarget) {
2459
+ const keys = keyedMapLookupChangedKeys(previousMapLookupTarget, nextMapLookupTarget);
2460
+ return { keys, count: keys.size };
2461
+ }
2462
+ if (canTargetMembership && previousMembershipTarget && nextMembershipTarget) {
2463
+ const keys = keyedMembershipChangedKeys(previousMembershipTarget, nextMembershipTarget);
2464
+ return { keys, count: keys.size };
2465
+ }
2466
+ if (canTargetIdentity && previousIdentityTarget && nextIdentityTarget) {
2467
+ const keys = /* @__PURE__ */ new Set();
2468
+ if (previousIdentityTarget.key !== void 0) keys.add(previousIdentityTarget.key);
2469
+ if (nextIdentityTarget.key !== void 0) keys.add(nextIdentityTarget.key);
2470
+ return { keys, count: keys.size };
2471
+ }
2472
+ return { keys: fallbackKeys, count: fallbackCount };
2473
+ },
2474
+ commitPrepared(bindingIndices) {
2475
+ for (const bindingIndex of bindingIndices) {
2476
+ const nextIdentityTarget = nextIdentityTargets.get(bindingIndex);
2477
+ const nextMembershipTarget = nextMembershipTargets.get(bindingIndex);
2478
+ const nextMapLookupTarget = nextMapLookupTargets.get(bindingIndex);
2479
+ if (nextIdentityTarget) identityTargets.set(bindingIndex, nextIdentityTarget);
2480
+ else identityTargets.delete(bindingIndex);
2481
+ if (nextMembershipTarget) {
2482
+ membershipTargets.set(bindingIndex, nextMembershipTarget);
2483
+ } else {
2484
+ membershipTargets.delete(bindingIndex);
2485
+ }
2486
+ if (nextMapLookupTarget) {
2487
+ mapLookupTargets.set(bindingIndex, nextMapLookupTarget);
2488
+ } else {
2489
+ mapLookupTargets.delete(bindingIndex);
2490
+ }
2491
+ }
2492
+ },
2493
+ clear() {
2494
+ identityTargets.clear();
2495
+ membershipTargets.clear();
2496
+ mapLookupTargets.clear();
2497
+ }
2498
+ };
2499
+ }
2257
2500
  function normalizedKeyedRowBindingValue(binding, value) {
2258
2501
  return binding.kind === "text" ? renderTextValue(value) : value;
2259
2502
  }
@@ -5745,7 +5988,7 @@ function createKeyedRowHostRuntime() {
5745
5988
  mount: (element, descriptor, requestFallback) => mountCompilerHostTree(owner, element, descriptor, requestFallback)
5746
5989
  };
5747
5990
  }
5748
- function createKeyedRowsBlockComponent(owner, options = {}) {
5991
+ function createKeyedRowsBlockComponentCore(owner, options = {}) {
5749
5992
  class FarmKeyedRowsBlock extends React__default.default.Component {
5750
5993
  constructor() {
5751
5994
  super(...arguments);
@@ -5759,9 +6002,7 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
5759
6002
  this.currentProps = this.props;
5760
6003
  this.definitionVersion = owner.getDefinitionVersion?.();
5761
6004
  this.instances = /* @__PURE__ */ new Map();
5762
- this.identityTargets = /* @__PURE__ */ new Map();
5763
- this.membershipTargets = /* @__PURE__ */ new Map();
5764
- this.mapLookupTargets = /* @__PURE__ */ new Map();
6005
+ this.keyedTargets = options.keyedTargets?.(this.props);
5765
6006
  this.renderVersion = 0;
5766
6007
  this.eventHandlers = /* @__PURE__ */ new Map();
5767
6008
  this.conditionalListeners = /* @__PURE__ */ new Map();
@@ -6075,64 +6316,11 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6075
6316
  this.currentProps.items(),
6076
6317
  this.instances
6077
6318
  );
6078
- this.commitKeyedTargets(dirtyState);
6079
- }
6080
- hasSafeMembershipTargets(dirtyState) {
6081
- for (const binding of this.currentProps.bindings) {
6082
- const target = binding.membershipTarget;
6083
- if (!target || dirtyState && !dirtyState.has(target.dependency)) continue;
6084
- if (!keyedMembershipTargetSnapshot(target.read()).eligible) return false;
6085
- }
6086
- return true;
6087
- }
6088
- hasSafeMapLookupTargets(dirtyState) {
6089
- for (const binding of this.currentProps.bindings) {
6090
- const target = binding.mapLookupTarget;
6091
- if (!target || dirtyState && !dirtyState.has(target.dependency)) continue;
6092
- if (!keyedMapLookupTargetSnapshot(target.read()).eligible) return false;
6093
- }
6094
- return true;
6095
- }
6096
- commitKeyedTargets(dirtyState) {
6097
- if (!dirtyState) {
6098
- this.identityTargets.clear();
6099
- this.membershipTargets.clear();
6100
- this.mapLookupTargets.clear();
6101
- }
6102
- for (let bindingIndex = 0; bindingIndex < this.currentProps.bindings.length; bindingIndex += 1) {
6103
- const binding = this.currentProps.bindings[bindingIndex];
6104
- const identityTarget = binding.identityTarget;
6105
- if (!identityTarget) {
6106
- this.identityTargets.delete(bindingIndex);
6107
- } else if (!dirtyState || dirtyState.has(identityTarget.dependency)) {
6108
- this.identityTargets.set(
6109
- bindingIndex,
6110
- keyedIdentityTargetSnapshot(identityTarget.read())
6111
- );
6112
- }
6113
- const membershipTarget = binding.membershipTarget;
6114
- if (!membershipTarget) {
6115
- this.membershipTargets.delete(bindingIndex);
6116
- } else if (!dirtyState || dirtyState.has(membershipTarget.dependency)) {
6117
- this.membershipTargets.set(
6118
- bindingIndex,
6119
- keyedMembershipTargetSnapshot(membershipTarget.read())
6120
- );
6121
- }
6122
- const mapLookupTarget = binding.mapLookupTarget;
6123
- if (!mapLookupTarget) {
6124
- this.mapLookupTargets.delete(bindingIndex);
6125
- } else if (!dirtyState || dirtyState.has(mapLookupTarget.dependency)) {
6126
- this.mapLookupTargets.set(
6127
- bindingIndex,
6128
- keyedMapLookupTargetSnapshot(mapLookupTarget.read())
6129
- );
6130
- }
6131
- }
6319
+ this.keyedTargets?.commit(this.currentProps, dirtyState);
6132
6320
  }
6133
6321
  adopt() {
6134
6322
  if (!this.root) return false;
6135
- if (!this.hasSafeMembershipTargets() || !this.hasSafeMapLookupTargets()) return false;
6323
+ if (this.keyedTargets && !this.keyedTargets.hasSafeTargets(this.currentProps)) return false;
6136
6324
  const rows = this.readRows(this.currentProps);
6137
6325
  const elements = [...this.root.children];
6138
6326
  if (!rows || rows.items.length !== elements.length) return false;
@@ -6240,81 +6428,22 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6240
6428
  affectedBindingIndices.push(bindingIndex);
6241
6429
  }
6242
6430
  }
6243
- const nextIdentityTargets = /* @__PURE__ */ new Map();
6244
- const nextMembershipTargets = /* @__PURE__ */ new Map();
6245
- const nextMapLookupTargets = /* @__PURE__ */ new Map();
6246
- for (const bindingIndex of affectedBindingIndices) {
6247
- const binding = this.currentProps.bindings[bindingIndex];
6248
- if (binding.identityTarget) {
6249
- nextIdentityTargets.set(
6250
- bindingIndex,
6251
- keyedIdentityTargetSnapshot(binding.identityTarget.read())
6252
- );
6253
- }
6254
- if (binding.membershipTarget) {
6255
- const snapshot = keyedMembershipTargetSnapshot(
6256
- binding.membershipTarget.read(),
6257
- this.membershipTargets.get(bindingIndex)
6258
- );
6259
- if (!snapshot.eligible) {
6260
- this.activateFallback(afterCommit);
6261
- return true;
6262
- }
6263
- nextMembershipTargets.set(bindingIndex, snapshot);
6264
- }
6265
- if (binding.mapLookupTarget) {
6266
- const snapshot = keyedMapLookupTargetSnapshot(
6267
- binding.mapLookupTarget.read(),
6268
- this.mapLookupTargets.get(bindingIndex)
6269
- );
6270
- if (!snapshot.eligible) {
6271
- this.activateFallback(afterCommit);
6272
- return true;
6273
- }
6274
- nextMapLookupTargets.set(bindingIndex, snapshot);
6275
- }
6431
+ const targetsPrepared = this.keyedTargets?.prepare(this.currentProps, affectedBindingIndices);
6432
+ if (targetsPrepared === false) {
6433
+ this.activateFallback(afterCommit);
6434
+ return true;
6276
6435
  }
6277
6436
  let preparedBindingUpdates;
6278
6437
  for (const bindingIndex of affectedBindingIndices) {
6279
- const binding = this.currentProps.bindings[bindingIndex];
6280
- const identityTarget = binding.identityTarget;
6281
- const previousIdentityTarget = this.identityTargets.get(bindingIndex);
6282
- const nextIdentityTarget = nextIdentityTargets.get(bindingIndex);
6283
- const canTargetIdentity = Boolean(
6284
- identityTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === identityTarget.dependency && dirtyState.has(identityTarget.dependency) && previousIdentityTarget?.eligible && nextIdentityTarget?.eligible
6285
- );
6286
- const membershipTarget = binding.membershipTarget;
6287
- const previousMembershipTarget = this.membershipTargets.get(bindingIndex);
6288
- const nextMembershipTarget = nextMembershipTargets.get(bindingIndex);
6289
- const canTargetMembership = Boolean(
6290
- membershipTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === membershipTarget.dependency && dirtyState.has(membershipTarget.dependency) && previousMembershipTarget?.eligible && nextMembershipTarget?.eligible
6291
- );
6292
- const mapLookupTarget = binding.mapLookupTarget;
6293
- const previousMapLookupTarget = this.mapLookupTargets.get(bindingIndex);
6294
- const nextMapLookupTarget = nextMapLookupTargets.get(bindingIndex);
6295
- const canTargetMapLookup = Boolean(
6296
- mapLookupTarget && binding.dependencies?.length === 1 && binding.dependencies[0] === mapLookupTarget.dependency && dirtyState.has(mapLookupTarget.dependency) && previousMapLookupTarget?.eligible && nextMapLookupTarget?.eligible
6438
+ const selection = this.keyedTargets?.select(
6439
+ this.currentProps,
6440
+ bindingIndex,
6441
+ dirtyState,
6442
+ this.instances.keys(),
6443
+ this.instances.size
6297
6444
  );
6298
- let selectedKeys;
6299
- let selectedCount;
6300
- if (canTargetMapLookup && previousMapLookupTarget && nextMapLookupTarget) {
6301
- const keys = keyedMapLookupChangedKeys(previousMapLookupTarget, nextMapLookupTarget);
6302
- selectedKeys = keys;
6303
- selectedCount = keys.size;
6304
- } else if (canTargetMembership && previousMembershipTarget && nextMembershipTarget) {
6305
- const keys = keyedMembershipChangedKeys(previousMembershipTarget, nextMembershipTarget);
6306
- selectedKeys = keys;
6307
- selectedCount = keys.size;
6308
- } else if (canTargetIdentity && previousIdentityTarget && nextIdentityTarget) {
6309
- const keys = /* @__PURE__ */ new Set();
6310
- if (previousIdentityTarget.key !== void 0) keys.add(previousIdentityTarget.key);
6311
- if (nextIdentityTarget.key !== void 0) keys.add(nextIdentityTarget.key);
6312
- selectedKeys = keys;
6313
- selectedCount = keys.size;
6314
- } else {
6315
- selectedKeys = this.instances.keys();
6316
- selectedCount = this.instances.size;
6317
- }
6445
+ const selectedKeys = selection?.keys || this.instances.keys();
6446
+ const selectedCount = selection?.count ?? this.instances.size;
6318
6447
  const prepare = affectedBindingIndices.length > 1 || selectedCount > 1;
6319
6448
  if (prepare) preparedBindingUpdates || (preparedBindingUpdates = []);
6320
6449
  for (const key of selectedKeys) {
@@ -6355,23 +6484,7 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6355
6484
  );
6356
6485
  }
6357
6486
  }
6358
- for (const bindingIndex of affectedBindingIndices) {
6359
- const nextIdentityTarget = nextIdentityTargets.get(bindingIndex);
6360
- const nextMembershipTarget = nextMembershipTargets.get(bindingIndex);
6361
- const nextMapLookupTarget = nextMapLookupTargets.get(bindingIndex);
6362
- if (nextIdentityTarget) this.identityTargets.set(bindingIndex, nextIdentityTarget);
6363
- else this.identityTargets.delete(bindingIndex);
6364
- if (nextMembershipTarget) {
6365
- this.membershipTargets.set(bindingIndex, nextMembershipTarget);
6366
- } else {
6367
- this.membershipTargets.delete(bindingIndex);
6368
- }
6369
- if (nextMapLookupTarget) {
6370
- this.mapLookupTargets.set(bindingIndex, nextMapLookupTarget);
6371
- } else {
6372
- this.mapLookupTargets.delete(bindingIndex);
6373
- }
6374
- }
6487
+ this.keyedTargets?.commitPrepared(affectedBindingIndices);
6375
6488
  afterCommit?.();
6376
6489
  return true;
6377
6490
  }
@@ -6510,11 +6623,7 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6510
6623
  this.forceUpdate(afterCommit);
6511
6624
  return;
6512
6625
  }
6513
- if (!this.hasSafeMembershipTargets(dirtyState)) {
6514
- this.activateFallback(afterCommit);
6515
- return;
6516
- }
6517
- if (!this.hasSafeMapLookupTargets(dirtyState)) {
6626
+ if (this.keyedTargets && !this.keyedTargets.hasSafeTargets(this.currentProps, dirtyState)) {
6518
6627
  this.activateFallback(afterCommit);
6519
6628
  return;
6520
6629
  }
@@ -6666,6 +6775,7 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6666
6775
  const willBeReactOwned = this.hasReactOwnedRows(nextProps);
6667
6776
  const definitionChanged = this.definitionVersion !== owner.getDefinitionVersion?.();
6668
6777
  this.currentProps = nextProps;
6778
+ this.keyedTargets || (this.keyedTargets = options.keyedTargets?.(nextProps));
6669
6779
  if (this.state.fallback && nextState.fallback) {
6670
6780
  const unsafeKeys = this.hasUnsafeFallbackKeys();
6671
6781
  if (unsafeKeys || this.fallbackKeysWereUnsafe) this.fallbackVersion += 1;
@@ -6701,9 +6811,7 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6701
6811
  this.id = void 0;
6702
6812
  this.cleanupHostScopes();
6703
6813
  this.instances.clear();
6704
- this.identityTargets.clear();
6705
- this.membershipTargets.clear();
6706
- this.mapLookupTargets.clear();
6814
+ this.keyedTargets?.clear();
6707
6815
  this.instancesByElement = /* @__PURE__ */ new WeakMap();
6708
6816
  this.eventHandlers.clear();
6709
6817
  this.conditionalListeners.clear();
@@ -6726,6 +6834,12 @@ function createKeyedRowsBlockComponent(owner, options = {}) {
6726
6834
  FarmKeyedRowsBlock.displayName = "FarmCompiledKeyedRows";
6727
6835
  return FarmKeyedRowsBlock;
6728
6836
  }
6837
+ function createKeyedRowsBlockComponent(owner, options = {}) {
6838
+ return createKeyedRowsBlockComponentCore(owner, {
6839
+ ...options,
6840
+ keyedTargets: createKeyedTargetRuntime
6841
+ });
6842
+ }
6729
6843
  function createKeyedRangesBlockComponent(owner) {
6730
6844
  class FarmKeyedRangesBlock extends React__default.default.Component {
6731
6845
  constructor() {
@@ -7201,6 +7315,36 @@ var keyedRowsRuntimeFeature = {
7201
7315
  KeyedRows: createKeyedRowsBlockComponent(owner)
7202
7316
  })
7203
7317
  };
7318
+ var keyedRowsPlainRuntimeFeature = {
7319
+ name: "keyed-rows:plain",
7320
+ create: (owner) => ({
7321
+ KeyedRows: createKeyedRowsBlockComponentCore(owner)
7322
+ })
7323
+ };
7324
+ var keyedRowsIdentityRuntimeFeature = {
7325
+ name: "keyed-rows:identity",
7326
+ create: (owner) => ({
7327
+ KeyedRows: createKeyedRowsBlockComponentCore(owner, {
7328
+ keyedTargets: createKeyedIdentityTargetRuntime
7329
+ })
7330
+ })
7331
+ };
7332
+ var keyedRowsMembershipRuntimeFeature = {
7333
+ name: "keyed-rows:membership",
7334
+ create: (owner) => ({
7335
+ KeyedRows: createKeyedRowsBlockComponentCore(owner, {
7336
+ keyedTargets: createKeyedMembershipTargetRuntime
7337
+ })
7338
+ })
7339
+ };
7340
+ var keyedRowsMapLookupRuntimeFeature = {
7341
+ name: "keyed-rows:map-lookup",
7342
+ create: (owner) => ({
7343
+ KeyedRows: createKeyedRowsBlockComponentCore(owner, {
7344
+ keyedTargets: createKeyedMapLookupTargetRuntime
7345
+ })
7346
+ })
7347
+ };
7204
7348
  var keyedRowsHintedRuntimeFeature = {
7205
7349
  name: "keyed-rows:hinted",
7206
7350
  create: (owner) => ({
@@ -8431,8 +8575,12 @@ exports.keyedRowsHostStructuralPrependHintedRuntimeFeature = keyedRowsHostStruct
8431
8575
  exports.keyedRowsHostStructuralPrependMapHintedRuntimeFeature = keyedRowsHostStructuralPrependMapHintedRuntimeFeature;
8432
8576
  exports.keyedRowsHostWindowEveryHintedRuntimeFeature = keyedRowsHostWindowEveryHintedRuntimeFeature;
8433
8577
  exports.keyedRowsHostWindowPositionHintedRuntimeFeature = keyedRowsHostWindowPositionHintedRuntimeFeature;
8578
+ exports.keyedRowsIdentityRuntimeFeature = keyedRowsIdentityRuntimeFeature;
8579
+ exports.keyedRowsMapLookupRuntimeFeature = keyedRowsMapLookupRuntimeFeature;
8434
8580
  exports.keyedRowsMapReorderHintedRuntimeFeature = keyedRowsMapReorderHintedRuntimeFeature;
8435
8581
  exports.keyedRowsMappedRollingWindowHintedRuntimeFeature = keyedRowsMappedRollingWindowHintedRuntimeFeature;
8582
+ exports.keyedRowsMembershipRuntimeFeature = keyedRowsMembershipRuntimeFeature;
8583
+ exports.keyedRowsPlainRuntimeFeature = keyedRowsPlainRuntimeFeature;
8436
8584
  exports.keyedRowsPositionHintedRuntimeFeature = keyedRowsPositionHintedRuntimeFeature;
8437
8585
  exports.keyedRowsPrependHintedRuntimeFeature = keyedRowsPrependHintedRuntimeFeature;
8438
8586
  exports.keyedRowsReorderHintedRuntimeFeature = keyedRowsReorderHintedRuntimeFeature;