@player-ui/player 0.8.0-next.4 → 0.8.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/Player.native.js +240 -252
  2. package/dist/Player.native.js.map +1 -1
  3. package/dist/cjs/index.cjs +208 -268
  4. package/dist/cjs/index.cjs.map +1 -1
  5. package/dist/index.legacy-esm.js +206 -270
  6. package/dist/index.mjs +206 -270
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +4 -4
  9. package/src/plugins/default-view-plugin.ts +4 -0
  10. package/src/view/__tests__/view.immutable.test.ts +8 -1
  11. package/src/view/__tests__/view.test.ts +4 -0
  12. package/src/view/parser/__tests__/parser.test.ts +16 -1
  13. package/src/view/parser/index.ts +46 -262
  14. package/src/view/parser/utils.ts +23 -3
  15. package/src/view/plugins/__tests__/__snapshots__/asset.test.ts.snap +215 -0
  16. package/src/view/plugins/__tests__/__snapshots__/multi-node.test.ts.snap +67 -0
  17. package/src/view/plugins/__tests__/__snapshots__/template.test.ts.snap +56 -54
  18. package/src/view/plugins/__tests__/applicability.test.ts +24 -16
  19. package/src/view/plugins/__tests__/asset.test.ts +140 -0
  20. package/src/view/plugins/__tests__/multi-node.test.ts +38 -0
  21. package/src/view/plugins/__tests__/template.test.ts +48 -388
  22. package/src/view/plugins/applicability.ts +39 -23
  23. package/src/view/plugins/asset.ts +42 -0
  24. package/src/view/plugins/index.ts +3 -1
  25. package/src/view/plugins/multi-node.ts +73 -0
  26. package/src/view/plugins/switch.ts +81 -50
  27. package/src/view/plugins/{template-plugin.ts → template.ts} +38 -24
  28. package/src/view/resolver/__tests__/edgecases.test.ts +14 -1
  29. package/src/view/view.ts +2 -7
  30. package/types/view/parser/index.d.ts +6 -11
  31. package/types/view/parser/utils.d.ts +11 -2
  32. package/types/view/plugins/applicability.d.ts +1 -0
  33. package/types/view/plugins/asset.d.ts +8 -0
  34. package/types/view/plugins/index.d.ts +3 -1
  35. package/types/view/plugins/multi-node.d.ts +8 -0
  36. package/types/view/plugins/switch.d.ts +2 -1
  37. package/types/view/plugins/{template-plugin.d.ts → template.d.ts} +2 -2
@@ -2386,7 +2386,7 @@ import dlv from "dlv";
2386
2386
  import { dequal } from "dequal";
2387
2387
 
2388
2388
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/index.ts
2389
- import { omit as omit2, setIn as setIn4 } from "timm";
2389
+ import { setIn as setIn4 } from "timm";
2390
2390
  import { SyncBailHook as SyncBailHook3, SyncWaterfallHook as SyncWaterfallHook4 } from "tapable-ts";
2391
2391
 
2392
2392
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/types.ts
@@ -2405,8 +2405,14 @@ var NodeType = /* @__PURE__ */ ((NodeType2) => {
2405
2405
  })(NodeType || {});
2406
2406
 
2407
2407
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/utils.ts
2408
- function hasAsync(obj) {
2409
- return Object.prototype.hasOwnProperty.call(obj, "async");
2408
+ function hasTemplateValues(obj, localKey) {
2409
+ return Object.hasOwnProperty.call(obj, "template") && Array.isArray(obj?.template) && obj.template.length && obj.template.find((tmpl) => tmpl.output === localKey);
2410
+ }
2411
+ function hasSwitchKey(localKey) {
2412
+ return localKey === "staticSwitch";
2413
+ }
2414
+ function hasTemplateKey(localKey) {
2415
+ return localKey === "template";
2410
2416
  }
2411
2417
  function getNodeID(node) {
2412
2418
  if (!node) {
@@ -2443,7 +2449,6 @@ var Parser = class {
2443
2449
  * If null, we ignore this node all together
2444
2450
  */
2445
2451
  onCreateASTNode: new SyncWaterfallHook4(),
2446
- determineNodeType: new SyncBailHook3(),
2447
2452
  parseNode: new SyncBailHook3()
2448
2453
  };
2449
2454
  }
@@ -2454,21 +2459,6 @@ var Parser = class {
2454
2459
  }
2455
2460
  return viewNode;
2456
2461
  }
2457
- parseAsync(obj, type, options) {
2458
- const parsedAsync = this.parseObject(omit2(obj, "async"), type, options);
2459
- const parsedNodeId = getNodeID(parsedAsync);
2460
- if (parsedAsync !== null && parsedNodeId) {
2461
- return this.createASTNode(
2462
- {
2463
- id: parsedNodeId,
2464
- type: "async" /* Async */,
2465
- value: parsedAsync
2466
- },
2467
- obj
2468
- );
2469
- }
2470
- return null;
2471
- }
2472
2462
  createASTNode(node, value) {
2473
2463
  const tapped = this.hooks.onCreateASTNode.call(node, value);
2474
2464
  if (tapped === void 0) {
@@ -2476,30 +2466,14 @@ var Parser = class {
2476
2466
  }
2477
2467
  return tapped;
2478
2468
  }
2479
- /**
2480
- * Checks if there are templated values in the object
2481
- *
2482
- * @param obj - The Parsed Object to check to see if we have a template array type for
2483
- * @param localKey - The key being checked
2484
- */
2485
- hasTemplateValues(obj, localKey) {
2486
- return Object.hasOwnProperty.call(obj, "template") && Array.isArray(obj?.template) && obj.template.length && obj.template.find((tmpl) => tmpl.output === localKey);
2487
- }
2488
- hasSwitchKey(localKey) {
2489
- return localKey === "staticSwitch";
2490
- }
2491
2469
  parseObject(obj, type = "value" /* Value */, options = { templateDepth: 0 }) {
2492
- const nodeType = this.hooks.determineNodeType.call(obj);
2493
- if (nodeType !== void 0) {
2494
- const parsedNode = this.hooks.parseNode.call(
2495
- obj,
2496
- type,
2497
- options,
2498
- nodeType
2499
- );
2500
- if (parsedNode) {
2501
- return parsedNode;
2502
- }
2470
+ const parsedNode = this.hooks.parseNode.call(
2471
+ obj,
2472
+ type,
2473
+ options
2474
+ );
2475
+ if (parsedNode || parsedNode === null) {
2476
+ return parsedNode;
2503
2477
  }
2504
2478
  const parseLocalObject = (currentValue, objToParse, path = []) => {
2505
2479
  if (typeof objToParse !== "object" || objToParse === null) {
@@ -2521,182 +2495,44 @@ var Parser = class {
2521
2495
  value: currentValue
2522
2496
  };
2523
2497
  const newValue = objEntries.reduce((accumulation, current) => {
2524
- const { children: children2, ...rest } = accumulation;
2498
+ let { value: value2 } = accumulation;
2499
+ const { children: children2 } = accumulation;
2525
2500
  const [localKey, localValue] = current;
2526
- if (localKey === "asset" && typeof localValue === "object") {
2527
- const assetAST = this.parseObject(
2528
- localValue,
2529
- "asset" /* Asset */,
2530
- options
2531
- );
2532
- if (assetAST) {
2533
- return {
2534
- ...rest,
2535
- children: [
2536
- ...children2,
2537
- {
2538
- path: [...path, "asset"],
2539
- value: assetAST
2540
- }
2541
- ]
2542
- };
2543
- }
2544
- } else if (this.hooks.determineNodeType.call(localKey) === "template" /* Template */ && Array.isArray(localValue)) {
2545
- const templateChildren = localValue.map((template) => {
2546
- const templateAST = this.hooks.onCreateASTNode.call(
2547
- {
2548
- type: "template" /* Template */,
2549
- depth: options.templateDepth ?? 0,
2550
- data: template.data,
2551
- template: template.value,
2552
- dynamic: template.dynamic ?? false
2553
- },
2554
- template
2555
- );
2556
- if (templateAST?.type === "multi-node" /* MultiNode */) {
2557
- templateAST.values.forEach((v) => {
2558
- v.parent = templateAST;
2559
- });
2560
- }
2561
- if (templateAST) {
2562
- return {
2563
- path: [...path, template.output],
2564
- value: templateAST
2565
- };
2566
- }
2567
- return;
2568
- }).filter((element) => !!element);
2569
- return {
2570
- ...rest,
2571
- children: [...children2, ...templateChildren]
2572
- };
2573
- } else if (localValue && this.hooks.determineNodeType.call(localValue) === "switch" /* Switch */ || this.hasSwitchKey(localKey)) {
2574
- const localSwitch = this.hooks.parseNode.call(
2575
- this.hasSwitchKey(localKey) ? { [localKey]: localValue } : localValue,
2576
- "value" /* Value */,
2577
- options,
2578
- "switch" /* Switch */
2579
- );
2580
- if (localSwitch && localSwitch.type === "value" /* Value */ && localSwitch.children?.length === 1 && localSwitch.value === void 0) {
2581
- const firstChild = localSwitch.children[0];
2582
- return {
2583
- ...rest,
2584
- children: [
2585
- ...children2,
2586
- {
2587
- path: [...path, localKey, ...firstChild.path],
2588
- value: firstChild.value
2589
- }
2590
- ]
2591
- };
2592
- }
2593
- if (localSwitch) {
2594
- return {
2595
- ...rest,
2596
- children: [
2597
- ...children2,
2598
- {
2599
- path: [...path, localKey],
2600
- value: localSwitch
2601
- }
2602
- ]
2603
- };
2604
- }
2605
- } else if (localValue && hasAsync(localValue)) {
2606
- const localAsync = this.parseAsync(
2607
- localValue,
2608
- "value" /* Value */,
2609
- options
2610
- );
2611
- if (localAsync) {
2612
- children2.push({
2613
- path: [...path, localKey],
2614
- value: localAsync
2615
- });
2616
- }
2617
- } else if (localValue && Array.isArray(localValue)) {
2618
- const childValues = localValue.map(
2619
- (childVal) => this.parseObject(childVal, "value" /* Value */, options)
2620
- ).filter((child) => !!child);
2621
- if (childValues.length > 0) {
2622
- const multiNode = this.hooks.onCreateASTNode.call(
2623
- {
2624
- type: "multi-node" /* MultiNode */,
2625
- override: !this.hasTemplateValues(localObj, localKey),
2626
- values: childValues
2627
- },
2628
- localValue
2629
- );
2630
- if (multiNode?.type === "multi-node" /* MultiNode */) {
2631
- multiNode.values.forEach((v) => {
2632
- v.parent = multiNode;
2633
- });
2634
- }
2635
- if (multiNode) {
2636
- return {
2637
- ...rest,
2638
- children: [
2639
- ...children2,
2640
- {
2641
- path: [...path, localKey],
2642
- value: multiNode
2643
- }
2644
- ]
2645
- };
2646
- }
2501
+ const newChildren = this.hooks.parseNode.call(
2502
+ localValue,
2503
+ "value" /* Value */,
2504
+ options,
2505
+ {
2506
+ path,
2507
+ key: localKey,
2508
+ parentObj: localObj
2647
2509
  }
2510
+ );
2511
+ if (newChildren) {
2512
+ children2.push(...newChildren);
2648
2513
  } else if (localValue && typeof localValue === "object") {
2649
- const determineNodeType = this.hooks.determineNodeType.call(localValue);
2650
- if (determineNodeType === "applicability" /* Applicability */) {
2651
- const parsedNode = this.hooks.parseNode.call(
2652
- localValue,
2653
- "value" /* Value */,
2654
- options,
2655
- determineNodeType
2656
- );
2657
- if (parsedNode) {
2658
- return {
2659
- ...rest,
2660
- children: [
2661
- ...children2,
2662
- {
2663
- path: [...path, localKey],
2664
- value: parsedNode
2665
- }
2666
- ]
2667
- };
2668
- }
2669
- } else {
2670
- const result = parseLocalObject(accumulation.value, localValue, [
2671
- ...path,
2672
- localKey
2673
- ]);
2674
- return {
2675
- value: result.value,
2676
- children: [...children2, ...result.children]
2677
- };
2678
- }
2514
+ const result = parseLocalObject(accumulation.value, localValue, [
2515
+ ...path,
2516
+ localKey
2517
+ ]);
2518
+ value2 = result.value;
2519
+ children2.push(...result.children);
2679
2520
  } else {
2680
- const value2 = setIn4(
2681
- accumulation.value,
2682
- [...path, localKey],
2683
- localValue
2684
- );
2685
- return {
2686
- children: children2,
2687
- value: value2
2688
- };
2521
+ value2 = setIn4(accumulation.value, [...path, localKey], localValue);
2689
2522
  }
2690
- return accumulation;
2523
+ return {
2524
+ value: value2,
2525
+ children: children2
2526
+ };
2691
2527
  }, defaultValue);
2692
2528
  return newValue;
2693
2529
  };
2694
2530
  const { value, children } = parseLocalObject(void 0, obj);
2695
- const baseAst = value === void 0 && children.length === 0 ? void 0 : {
2531
+ const baseAst = value === void 0 && !children.length ? void 0 : {
2696
2532
  type,
2697
2533
  value
2698
2534
  };
2699
- if (baseAst !== void 0 && children.length > 0) {
2535
+ if (baseAst && children.length) {
2700
2536
  const parent = baseAst;
2701
2537
  parent.children = children;
2702
2538
  children.forEach((child) => {
@@ -3206,7 +3042,7 @@ var Builder = class {
3206
3042
  }
3207
3043
  };
3208
3044
 
3209
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/template-plugin.ts
3045
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/template.ts
3210
3046
  import { SyncWaterfallHook as SyncWaterfallHook6 } from "tapable-ts";
3211
3047
  var TemplatePlugin = class {
3212
3048
  constructor(options) {
@@ -3272,28 +3108,33 @@ var TemplatePlugin = class {
3272
3108
  }
3273
3109
  return node;
3274
3110
  });
3275
- parser.hooks.determineNodeType.tap("template", (obj) => {
3276
- if (obj === "template") {
3277
- return "template" /* Template */;
3278
- }
3279
- });
3280
3111
  parser.hooks.parseNode.tap(
3281
3112
  "template",
3282
- (obj, _nodeType, options, determinedNodeType) => {
3283
- if (determinedNodeType === "template" /* Template */) {
3284
- const templateNode = parser.createASTNode(
3285
- {
3286
- type: "template" /* Template */,
3287
- depth: options.templateDepth ?? 0,
3288
- data: obj.data,
3289
- template: obj.value,
3290
- dynamic: obj.dynamic ?? false
3291
- },
3292
- obj
3293
- );
3294
- if (templateNode) {
3295
- return templateNode;
3296
- }
3113
+ (obj, _nodeType, options, childOptions) => {
3114
+ if (childOptions && hasTemplateKey(childOptions.key)) {
3115
+ return obj.map((template) => {
3116
+ const templateAST = parser.createASTNode(
3117
+ {
3118
+ type: "template" /* Template */,
3119
+ depth: options.templateDepth ?? 0,
3120
+ data: template.data,
3121
+ template: template.value,
3122
+ dynamic: template.dynamic ?? false
3123
+ },
3124
+ template
3125
+ );
3126
+ if (!templateAST)
3127
+ return;
3128
+ if (templateAST.type === "multi-node" /* MultiNode */) {
3129
+ templateAST.values.forEach((v) => {
3130
+ v.parent = templateAST;
3131
+ });
3132
+ }
3133
+ return {
3134
+ path: [...childOptions.path, template.output],
3135
+ value: templateAST
3136
+ };
3137
+ }).filter(Boolean);
3297
3138
  }
3298
3139
  }
3299
3140
  );
@@ -3417,8 +3258,11 @@ var StringResolverPlugin = class {
3417
3258
  };
3418
3259
 
3419
3260
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/applicability.ts
3420
- import { omit as omit3 } from "timm";
3261
+ import { omit as omit2 } from "timm";
3421
3262
  var ApplicabilityPlugin = class {
3263
+ isApplicability(obj) {
3264
+ return obj && Object.prototype.hasOwnProperty.call(obj, "applicability");
3265
+ }
3422
3266
  applyResolver(resolver) {
3423
3267
  resolver.hooks.beforeResolve.tap(
3424
3268
  "applicability",
@@ -3436,34 +3280,38 @@ var ApplicabilityPlugin = class {
3436
3280
  );
3437
3281
  }
3438
3282
  applyParser(parser) {
3439
- parser.hooks.determineNodeType.tap("applicability", (obj) => {
3440
- if (Object.prototype.hasOwnProperty.call(obj, "applicability")) {
3441
- return "applicability" /* Applicability */;
3442
- }
3443
- });
3444
3283
  parser.hooks.parseNode.tap(
3445
3284
  "applicability",
3446
- (obj, nodeType, options, determinedNodeType) => {
3447
- if (determinedNodeType === "applicability" /* Applicability */) {
3285
+ (obj, nodeType, options, childOptions) => {
3286
+ if (this.isApplicability(obj)) {
3448
3287
  const parsedApplicability = parser.parseObject(
3449
- omit3(obj, "applicability"),
3288
+ omit2(obj, "applicability"),
3450
3289
  nodeType,
3451
3290
  options
3452
3291
  );
3453
- if (parsedApplicability !== null) {
3454
- const applicabilityNode = parser.createASTNode(
3455
- {
3456
- type: "applicability" /* Applicability */,
3457
- expression: obj.applicability,
3458
- value: parsedApplicability
3459
- },
3460
- obj
3461
- );
3462
- if (applicabilityNode?.type === "applicability" /* Applicability */) {
3463
- applicabilityNode.value.parent = applicabilityNode;
3464
- }
3465
- return applicabilityNode;
3292
+ if (!parsedApplicability) {
3293
+ return childOptions ? [] : null;
3294
+ }
3295
+ const applicabilityNode = parser.createASTNode(
3296
+ {
3297
+ type: "applicability" /* Applicability */,
3298
+ expression: obj.applicability,
3299
+ value: parsedApplicability
3300
+ },
3301
+ obj
3302
+ );
3303
+ if (!applicabilityNode) {
3304
+ return childOptions ? [] : null;
3305
+ }
3306
+ if (applicabilityNode.type === "applicability" /* Applicability */) {
3307
+ applicabilityNode.value.parent = applicabilityNode;
3466
3308
  }
3309
+ return childOptions ? [
3310
+ {
3311
+ path: [...childOptions.path, childOptions.key],
3312
+ value: applicabilityNode
3313
+ }
3314
+ ] : applicabilityNode;
3467
3315
  }
3468
3316
  }
3469
3317
  );
@@ -3488,6 +3336,9 @@ var SwitchPlugin = class {
3488
3336
  }
3489
3337
  return EMPTY_NODE;
3490
3338
  }
3339
+ isSwitch(obj) {
3340
+ return obj && (Object.prototype.hasOwnProperty.call(obj, "dynamicSwitch") || Object.prototype.hasOwnProperty.call(obj, "staticSwitch"));
3341
+ }
3491
3342
  applyParser(parser) {
3492
3343
  parser.hooks.onCreateASTNode.tap("switch", (node) => {
3493
3344
  if (node && node.type === "switch" /* Switch */ && !node.dynamic) {
@@ -3495,19 +3346,14 @@ var SwitchPlugin = class {
3495
3346
  }
3496
3347
  return node;
3497
3348
  });
3498
- parser.hooks.determineNodeType.tap("switch", (obj) => {
3499
- if (Object.prototype.hasOwnProperty.call(obj, "dynamicSwitch") || Object.prototype.hasOwnProperty.call(obj, "staticSwitch")) {
3500
- return "switch" /* Switch */;
3501
- }
3502
- });
3503
3349
  parser.hooks.parseNode.tap(
3504
3350
  "switch",
3505
- (obj, _nodeType, options, determinedNodeType) => {
3506
- if (determinedNodeType === "switch" /* Switch */) {
3507
- const dynamic = "dynamicSwitch" in obj;
3508
- const switchContent = "dynamicSwitch" in obj ? obj.dynamicSwitch : obj.staticSwitch;
3509
- const cases = [];
3510
- switchContent.forEach(
3351
+ (obj, _nodeType, options, childOptions) => {
3352
+ if (this.isSwitch(obj) || childOptions && hasSwitchKey(childOptions.key)) {
3353
+ const objToParse = childOptions && hasSwitchKey(childOptions.key) ? { [childOptions.key]: obj } : obj;
3354
+ const dynamic = "dynamicSwitch" in objToParse;
3355
+ const switchContent = dynamic ? objToParse.dynamicSwitch : objToParse.staticSwitch;
3356
+ const cases = switchContent.map(
3511
3357
  (switchCase) => {
3512
3358
  const { case: switchCaseExpr, ...switchBody } = switchCase;
3513
3359
  const value = parser.parseObject(
@@ -3516,30 +3362,41 @@ var SwitchPlugin = class {
3516
3362
  options
3517
3363
  );
3518
3364
  if (value) {
3519
- cases.push({
3365
+ return {
3520
3366
  case: switchCaseExpr,
3521
3367
  value
3522
- });
3368
+ };
3523
3369
  }
3370
+ return;
3524
3371
  }
3525
- );
3526
- const switchAST = parser.hooks.onCreateASTNode.call(
3372
+ ).filter(Boolean);
3373
+ const switchAST = parser.createASTNode(
3527
3374
  {
3528
3375
  type: "switch" /* Switch */,
3529
3376
  dynamic,
3530
3377
  cases
3531
3378
  },
3532
- obj
3379
+ objToParse
3533
3380
  );
3534
- if (switchAST?.type === "switch" /* Switch */) {
3381
+ if (!switchAST || switchAST.type === "empty" /* Empty */) {
3382
+ return childOptions ? [] : null;
3383
+ }
3384
+ if (switchAST.type === "switch" /* Switch */) {
3535
3385
  switchAST.cases.forEach((sCase) => {
3536
3386
  sCase.value.parent = switchAST;
3537
3387
  });
3538
3388
  }
3539
- if (switchAST?.type === "empty" /* Empty */) {
3540
- return null;
3389
+ if (childOptions) {
3390
+ let path = [...childOptions.path, childOptions.key];
3391
+ let value = switchAST;
3392
+ if (switchAST.type === "value" /* Value */ && switchAST.children?.length === 1 && switchAST.value === void 0) {
3393
+ const firstChild = switchAST.children[0];
3394
+ path = [...path, ...firstChild.path];
3395
+ value = firstChild.value;
3396
+ }
3397
+ return [{ path, value }];
3541
3398
  }
3542
- return switchAST ?? null;
3399
+ return switchAST;
3543
3400
  }
3544
3401
  }
3545
3402
  );
@@ -3558,6 +3415,79 @@ var SwitchPlugin = class {
3558
3415
  }
3559
3416
  };
3560
3417
 
3418
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/multi-node.ts
3419
+ var MultiNodePlugin = class {
3420
+ applyParser(parser) {
3421
+ parser.hooks.parseNode.tap(
3422
+ "multi-node",
3423
+ (obj, nodeType, options, childOptions) => {
3424
+ if (childOptions && !hasTemplateKey(childOptions.key) && Array.isArray(obj)) {
3425
+ const values = obj.map(
3426
+ (childVal) => parser.parseObject(childVal, "value" /* Value */, options)
3427
+ ).filter((child) => !!child);
3428
+ if (!values.length) {
3429
+ return [];
3430
+ }
3431
+ const multiNode = parser.createASTNode(
3432
+ {
3433
+ type: "multi-node" /* MultiNode */,
3434
+ override: !hasTemplateValues(
3435
+ childOptions.parentObj,
3436
+ childOptions.key
3437
+ ),
3438
+ values
3439
+ },
3440
+ obj
3441
+ );
3442
+ if (!multiNode) {
3443
+ return [];
3444
+ }
3445
+ if (multiNode.type === "multi-node" /* MultiNode */) {
3446
+ multiNode.values.forEach((v) => {
3447
+ v.parent = multiNode;
3448
+ });
3449
+ }
3450
+ return [
3451
+ {
3452
+ path: [...childOptions.path, childOptions.key],
3453
+ value: multiNode
3454
+ }
3455
+ ];
3456
+ }
3457
+ }
3458
+ );
3459
+ }
3460
+ apply(view) {
3461
+ view.hooks.parser.tap("multi-node", this.applyParser.bind(this));
3462
+ }
3463
+ };
3464
+
3465
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/asset.ts
3466
+ var AssetPlugin = class {
3467
+ applyParser(parser) {
3468
+ parser.hooks.parseNode.tap(
3469
+ "asset",
3470
+ (obj, nodeType, options, childOptions) => {
3471
+ if (childOptions?.key === "asset" && typeof obj === "object") {
3472
+ const assetAST = parser.parseObject(obj, "asset" /* Asset */, options);
3473
+ if (!assetAST) {
3474
+ return [];
3475
+ }
3476
+ return [
3477
+ {
3478
+ path: [...childOptions.path, childOptions.key],
3479
+ value: assetAST
3480
+ }
3481
+ ];
3482
+ }
3483
+ }
3484
+ );
3485
+ }
3486
+ apply(view) {
3487
+ view.hooks.parser.tap("asset", this.applyParser.bind(this));
3488
+ }
3489
+ };
3490
+
3561
3491
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/player.ts
3562
3492
  import { setIn as setIn7 } from "timm";
3563
3493
  import deferred from "p-defer";
@@ -5047,12 +4977,14 @@ var DefaultViewPlugin = class {
5047
4977
  player.hooks.viewController.tap(this.name, (viewController) => {
5048
4978
  viewController.hooks.view.tap(this.name, (view) => {
5049
4979
  const pluginOptions = toNodeResolveOptions(view.resolverOptions);
4980
+ new AssetPlugin().apply(view);
5050
4981
  new SwitchPlugin(pluginOptions).apply(view);
5051
4982
  new ApplicabilityPlugin().apply(view);
5052
4983
  new StringResolverPlugin().apply(view);
5053
4984
  const templatePlugin = new TemplatePlugin(pluginOptions);
5054
4985
  templatePlugin.apply(view);
5055
4986
  view.hooks.onTemplatePluginCreated.call(templatePlugin);
4987
+ new MultiNodePlugin().apply(view);
5056
4988
  });
5057
4989
  });
5058
4990
  }
@@ -5397,6 +5329,7 @@ _Player.info = {
5397
5329
  var Player = _Player;
5398
5330
  export {
5399
5331
  ApplicabilityPlugin,
5332
+ AssetPlugin,
5400
5333
  AssetTransformCorePlugin,
5401
5334
  BINDING_BRACKETS_REGEX,
5402
5335
  BindingInstance,
@@ -5416,6 +5349,7 @@ export {
5416
5349
  FlowInstance,
5417
5350
  LocalModel,
5418
5351
  LocalStateStore,
5352
+ MultiNodePlugin,
5419
5353
  NOOPDataModel,
5420
5354
  NOOP_MODEL,
5421
5355
  NOT_STARTED_STATE,
@@ -5449,7 +5383,9 @@ export {
5449
5383
  findNextExp,
5450
5384
  getBindingSegments,
5451
5385
  getNodeID,
5452
- hasAsync,
5386
+ hasSwitchKey,
5387
+ hasTemplateKey,
5388
+ hasTemplateValues,
5453
5389
  isBinding,
5454
5390
  isErrorWithLocation,
5455
5391
  isExpressionNode,