ballerina-core 1.0.149 → 1.0.150

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ballerina-core",
3
3
  "author": "Dr. Giuseppe Maggiore",
4
4
  "private": false,
5
- "version": "1.0.149",
5
+ "version": "1.0.150",
6
6
  "main": "main.ts",
7
7
  "scripts": {
8
8
  "prettier": "prettier --write ."
@@ -160,7 +160,7 @@ export type AbstractTableRendererView<
160
160
  clearRows: SimpleCallback<void>;
161
161
  add: SimpleCallback<void>;
162
162
  remove: SimpleCallback<string>;
163
- moveTo: (key: string, to: number) => void;
163
+ moveTo: (key: string, to: string) => void;
164
164
  duplicate: SimpleCallback<string>;
165
165
  },
166
166
  {
@@ -442,7 +442,7 @@ export const TableAbstractRenderer = <
442
442
  ),
443
443
  );
444
444
  },
445
- moveTo: (k: string, to: number) => {
445
+ moveTo: (k: string, to: string) => {
446
446
  const delta: DispatchDelta = {
447
447
  kind: "TableMoveTo",
448
448
  id: k,
@@ -205,7 +205,7 @@ export type DispatchDeltaTable =
205
205
  | {
206
206
  kind: "TableMoveTo";
207
207
  id: string;
208
- to: number;
208
+ to: string;
209
209
  type: DispatchParsedType<any>;
210
210
  }
211
211
  | {
@@ -320,10 +320,10 @@ export type DispatchDeltaTransferTable<DispatchDeltaTransferCustom> =
320
320
  Item2: DispatchDeltaTransfer<DispatchDeltaTransferCustom>;
321
321
  };
322
322
  }
323
- | { Discriminator: "TableAdd" }
324
- | { Discriminator: "TableRemove"; Remove: string }
325
- | { Discriminator: "TableDuplicate"; Dup: string }
326
- | { Discriminator: "TableMoveTo"; Move: string; To: number };
323
+ | { Discriminator: "TableAddEmpty" }
324
+ | { Discriminator: "TableRemoveAt"; RemoveAt: string }
325
+ | { Discriminator: "TableDuplicateAt"; DuplicateAt: string }
326
+ | { Discriminator: "TableMoveFromTo"; MoveFromTo: [string, string] };
327
327
 
328
328
  export type DispatchDeltaTransfer<DispatchDeltaTransferCustom> =
329
329
  | DispatchDeltaTransferPrimitive
@@ -1131,9 +1131,9 @@ export const DispatchDeltaTransfer = {
1131
1131
  string
1132
1132
  >([
1133
1133
  {
1134
- Discriminator: "TableAdd",
1134
+ Discriminator: "TableAddEmpty",
1135
1135
  },
1136
- `[TableAdd]`,
1136
+ `[TableAddEmpty]`,
1137
1137
  delta.isWholeEntityMutation,
1138
1138
  ]);
1139
1139
  }
@@ -1147,10 +1147,10 @@ export const DispatchDeltaTransfer = {
1147
1147
  string
1148
1148
  >([
1149
1149
  {
1150
- Discriminator: "TableRemove",
1151
- Remove: delta.id,
1150
+ Discriminator: "TableRemoveAt",
1151
+ RemoveAt: delta.id,
1152
1152
  },
1153
- `[TableRemove][${delta.id}]`,
1153
+ `[TableRemoveAt][${delta.id}]`,
1154
1154
  delta.isWholeEntityMutation,
1155
1155
  ]);
1156
1156
  }
@@ -1164,10 +1164,10 @@ export const DispatchDeltaTransfer = {
1164
1164
  string
1165
1165
  >([
1166
1166
  {
1167
- Discriminator: "TableDuplicate",
1168
- Dup: delta.id,
1167
+ Discriminator: "TableDuplicateAt",
1168
+ DuplicateAt: delta.id,
1169
1169
  },
1170
- `[TableDuplicate][${delta.id}]`,
1170
+ `[TableDuplicateAt][${delta.id}]`,
1171
1171
  delta.isWholeEntityMutation,
1172
1172
  ]);
1173
1173
  }
@@ -1181,11 +1181,10 @@ export const DispatchDeltaTransfer = {
1181
1181
  string
1182
1182
  >([
1183
1183
  {
1184
- Discriminator: "TableMoveTo",
1185
- Move: delta.id,
1186
- To: delta.to,
1184
+ Discriminator: "TableMoveFromTo",
1185
+ MoveFromTo: [delta.id, delta.to],
1187
1186
  },
1188
- `[TableMoveTo][${delta.id}][${delta.to}]`,
1187
+ `[TableMoveFromTo][${delta.id}][${delta.to}]`,
1189
1188
  delta.isWholeEntityMutation,
1190
1189
  ]);
1191
1190
  }
@@ -12,6 +12,7 @@ import {
12
12
  FormLayout,
13
13
  Unit,
14
14
  unit,
15
+ TableLayout,
15
16
  } from "ballerina-core";
16
17
  import { List, Map, Set } from "immutable";
17
18
 
@@ -64,12 +65,20 @@ export const RendererTraversal = {
64
65
 
65
66
  const traverseNode = traversalContext.traverseSingleType(type);
66
67
 
67
- if (type.kind == "primitive") {
68
+ if (
69
+ type.kind == "primitive" ||
70
+ type.kind == "singleSelection" ||
71
+ type.kind == "multiSelection"
72
+ ) {
68
73
  return ValueOrErrors.Default.return(traverseNode);
69
74
  }
70
75
 
76
+ // TODO -- later when we only resolve lookups at the last moment, we can remove the other type checks
71
77
  if (
72
- (type.kind == "lookup" || type.kind == "record") &&
78
+ (type.kind == "lookup" ||
79
+ type.kind == "record" ||
80
+ type.kind == "union" ||
81
+ type.kind == "table") &&
73
82
  renderer.kind == "lookupRenderer"
74
83
  ) {
75
84
  if (traversalContext.primitiveRendererNamesByType.has(type.name)) {
@@ -147,7 +156,11 @@ export const RendererTraversal = {
147
156
  )
148
157
  )
149
158
  return ValueOrErrors.Default.throwOne(
150
- `Error: traversal iterator is not a record, got ${evalContext.traversalIterator}`,
159
+ `Error: traversal iterator is not a record, got ${JSON.stringify(
160
+ evalContext.traversalIterator,
161
+ undefined,
162
+ 2,
163
+ )}`,
151
164
  );
152
165
  const visibleFieldsRes =
153
166
  FormLayout.Operations.ComputeVisibleFieldsForRecord(
@@ -235,10 +248,7 @@ export const RendererTraversal = {
235
248
  );
236
249
  }
237
250
  if (renderer.kind == "sumRenderer") {
238
- const res: ValueOrErrors<
239
- Option<ValueTraversal<T, Res>>,
240
- string
241
- > = rec(type.args[0], renderer, traversalContext).Then(
251
+ return rec(type.args[0], renderer, traversalContext).Then(
242
252
  (leftTraversal) =>
243
253
  rec(type.args[1], renderer, traversalContext).Then(
244
254
  (rightTraversal) => {
@@ -340,7 +350,6 @@ export const RendererTraversal = {
340
350
  },
341
351
  ),
342
352
  );
343
- return res;
344
353
  }
345
354
  }
346
355
 
@@ -411,6 +420,409 @@ export const RendererTraversal = {
411
420
  });
412
421
  }
413
422
 
423
+ if (type.kind == "union" && renderer.kind == "unionRenderer") {
424
+ return ValueOrErrors.Operations.All(
425
+ List(
426
+ renderer.cases
427
+ .map((caseRenderer, caseName) =>
428
+ rec(caseRenderer.type, caseRenderer, traversalContext).Then(
429
+ (caseTraversal) =>
430
+ ValueOrErrors.Default.return({
431
+ caseName: caseName,
432
+ caseTraversal: caseTraversal,
433
+ }),
434
+ ),
435
+ )
436
+ .valueSeq(),
437
+ ),
438
+ ).Then((caseTraversals) => {
439
+ if (
440
+ caseTraversals.every((c) => c.caseTraversal.kind == "l") &&
441
+ traverseNode.kind == "l"
442
+ ) {
443
+ return ValueOrErrors.Default.return(Option.Default.none());
444
+ }
445
+ return ValueOrErrors.Default.return(
446
+ Option.Default.some((evalContext: EvalContext<T, Res>) => {
447
+ const iterator = evalContext.traversalIterator;
448
+ if (!PredicateValue.Operations.IsUnionCase(iterator)) {
449
+ return ValueOrErrors.Default.throwOne(
450
+ `Error: traversal iterator is not a union case, got ${evalContext.traversalIterator}`,
451
+ );
452
+ }
453
+ const caseName = iterator.caseName;
454
+ const caseTraversal = caseTraversals.find(
455
+ (c) => c.caseName == caseName,
456
+ )?.caseTraversal;
457
+ if (!caseTraversal) {
458
+ return ValueOrErrors.Default.throwOne(
459
+ `Error: cannot find case traversal for case ${caseName}`,
460
+ );
461
+ }
462
+ return caseTraversal.kind == "r"
463
+ ? caseTraversal
464
+ .value({
465
+ ...evalContext,
466
+ traversalIterator: iterator.fields,
467
+ })
468
+ .Then((caseRes) => {
469
+ return traverseNode.kind == "r"
470
+ ? traverseNode
471
+ .value(evalContext)
472
+ .Then((nodeResult: Res) => {
473
+ return ValueOrErrors.Default.return(
474
+ traversalContext.joinRes([nodeResult, caseRes]),
475
+ );
476
+ })
477
+ : ValueOrErrors.Default.return(caseRes);
478
+ })
479
+ : traverseNode.kind == "r"
480
+ ? traverseNode.value(evalContext).Then((nodeResult: Res) => {
481
+ return ValueOrErrors.Default.return(nodeResult);
482
+ })
483
+ : ValueOrErrors.Default.return(
484
+ traversalContext.zeroRes(unit),
485
+ );
486
+ }),
487
+ );
488
+ });
489
+ }
490
+ // TODO -- add recursion for the detailsRenderer, but requires state
491
+ if (type.kind == "table" && renderer.kind == "tableRenderer") {
492
+ return ValueOrErrors.Operations.All(
493
+ List(
494
+ renderer.columns
495
+ .map((column, columnName) => {
496
+ return rec(
497
+ column.renderer.type,
498
+ column.renderer,
499
+ traversalContext,
500
+ ).Then((columnTraversal) => {
501
+ return ValueOrErrors.Default.return({
502
+ columnName: columnName,
503
+ columnTraversal: columnTraversal,
504
+ });
505
+ });
506
+ })
507
+ .valueSeq(),
508
+ ),
509
+ ).Then((columnTraversals) => {
510
+ if (
511
+ columnTraversals.every((c) => c.columnTraversal.kind == "l") &&
512
+ traverseNode.kind == "l"
513
+ ) {
514
+ return ValueOrErrors.Default.return(Option.Default.none());
515
+ }
516
+ return ValueOrErrors.Default.return(
517
+ Option.Default.some((evalContext: EvalContext<T, Res>) => {
518
+ const iterator = evalContext.traversalIterator;
519
+ if (!PredicateValue.Operations.IsTable(iterator)) {
520
+ return ValueOrErrors.Default.throwOne(
521
+ `Error: traversal iterator is not a table, got ${evalContext.traversalIterator}`,
522
+ );
523
+ }
524
+ return TableLayout.Operations.ComputeLayout(
525
+ Map([
526
+ ["global", evalContext.global],
527
+ ["local", evalContext.local],
528
+ ["root", evalContext.root],
529
+ ]),
530
+ renderer.visibleColumns,
531
+ ).Then((visibleColumns) => {
532
+ // Note: we do not allow visiblity predicates on individual column cells
533
+ return ValueOrErrors.Operations.All<Res, string>(
534
+ columnTraversals.flatMap((c) => {
535
+ const colTraversal = c.columnTraversal;
536
+ if (
537
+ colTraversal.kind == "l" ||
538
+ !visibleColumns.columns.includes(c.columnName)
539
+ ) {
540
+ return [];
541
+ }
542
+ return iterator.data.valueSeq().flatMap((row) => {
543
+ // TODO make this monadic
544
+ const columnValue = row.fields.get(c.columnName);
545
+ if (!columnValue) {
546
+ return [
547
+ ValueOrErrors.Default.throwOne(
548
+ `Error: cannot find column ${
549
+ c.columnName
550
+ } in row ${JSON.stringify(row)}`,
551
+ ),
552
+ ];
553
+ }
554
+ return [
555
+ colTraversal.value({
556
+ ...evalContext,
557
+ traversalIterator: columnValue,
558
+ }),
559
+ ];
560
+ });
561
+ }),
562
+ ).Then((columnResults) => {
563
+ return traverseNode.kind == "r"
564
+ ? traverseNode
565
+ .value(evalContext)
566
+ .Then((nodeResult: Res) =>
567
+ ValueOrErrors.Default.return(
568
+ columnResults.reduce(
569
+ (acc, res) =>
570
+ traversalContext.joinRes([acc, res]),
571
+ nodeResult,
572
+ ),
573
+ ),
574
+ )
575
+ : ValueOrErrors.Default.return(
576
+ columnResults.reduce(
577
+ (acc, res) => traversalContext.joinRes([acc, res]),
578
+ traversalContext.zeroRes(unit),
579
+ ),
580
+ );
581
+ });
582
+ });
583
+ }),
584
+ );
585
+ });
586
+ }
587
+ // TODO -- should we also look at the previewRenderer? Woud also requite state
588
+ if (type.kind == "one" && renderer.kind == "oneRenderer") {
589
+ return rec(
590
+ renderer.detailsRenderer.renderer.type,
591
+ renderer.detailsRenderer.renderer,
592
+ traversalContext,
593
+ ).Then((itemTraversal) => {
594
+ if (itemTraversal.kind == "l" && traverseNode.kind == "l") {
595
+ return ValueOrErrors.Default.return(Option.Default.none());
596
+ }
597
+ return ValueOrErrors.Default.return(
598
+ Option.Default.some<ValueTraversal<T, Res>>(
599
+ (evalContext: EvalContext<T, Res>) => {
600
+ const iterator = evalContext.traversalIterator;
601
+
602
+ // Handle partial ones
603
+ if (PredicateValue.Operations.IsUnit(iterator)) {
604
+ return traverseNode.kind == "r"
605
+ ? traverseNode.value(evalContext)
606
+ : ValueOrErrors.Default.return(
607
+ traversalContext.zeroRes(unit),
608
+ );
609
+ }
610
+ if (!PredicateValue.Operations.IsOption(iterator)) {
611
+ return ValueOrErrors.Default.throwOne<Res, string>(
612
+ `Error: traversal iterator for one is not an option, got ${iterator}`,
613
+ );
614
+ }
615
+ const isSome =
616
+ PredicateValue.Operations.IsOption(iterator) &&
617
+ iterator.isSome;
618
+
619
+ if (!isSome) {
620
+ return traverseNode.kind == "r"
621
+ ? traverseNode.value(evalContext)
622
+ : ValueOrErrors.Default.return(
623
+ traversalContext.zeroRes(unit),
624
+ );
625
+ }
626
+
627
+ return traverseNode.kind == "r"
628
+ ? traverseNode.value(evalContext).Then((nodeResult: Res) => {
629
+ return itemTraversal.kind == "r"
630
+ ? itemTraversal
631
+ .value({
632
+ ...evalContext,
633
+ traversalIterator: iterator.value,
634
+ })
635
+ .Then((itemResult: Res) => {
636
+ return ValueOrErrors.Default.return(
637
+ traversalContext.joinRes([
638
+ nodeResult,
639
+ itemResult,
640
+ ]),
641
+ );
642
+ })
643
+ : ValueOrErrors.Default.return(nodeResult);
644
+ })
645
+ : itemTraversal.kind == "r"
646
+ ? itemTraversal.value({
647
+ ...evalContext,
648
+ traversalIterator: iterator.value,
649
+ })
650
+ : ValueOrErrors.Default.return(
651
+ traversalContext.zeroRes(unit),
652
+ );
653
+ },
654
+ ),
655
+ );
656
+ });
657
+ }
658
+
659
+ if (type.kind == "list" && renderer.kind == "listRenderer") {
660
+ return rec(type.args[0], renderer, traversalContext).Then(
661
+ (elementTraversal) => {
662
+ if (elementTraversal.kind == "l" && traverseNode.kind == "l") {
663
+ return ValueOrErrors.Default.return(Option.Default.none());
664
+ }
665
+ return ValueOrErrors.Default.return(
666
+ Option.Default.some((evalContext: EvalContext<T, Res>) => {
667
+ const iterator = evalContext.traversalIterator;
668
+ if (!PredicateValue.Operations.IsTuple(iterator)) {
669
+ return ValueOrErrors.Default.throwOne<Res, string>(
670
+ `Error: traversal iterator for list is not a tuple, got ${JSON.stringify(
671
+ iterator,
672
+ null,
673
+ 2,
674
+ )}`,
675
+ );
676
+ }
677
+ return ValueOrErrors.Operations.All<Res, string>(
678
+ iterator.values.map((value) =>
679
+ elementTraversal.kind == "r"
680
+ ? elementTraversal.value({
681
+ ...evalContext,
682
+ traversalIterator: value,
683
+ })
684
+ : ValueOrErrors.Default.return(
685
+ traversalContext.zeroRes(unit),
686
+ ),
687
+ ),
688
+ ).Then((elementResults) =>
689
+ traverseNode.kind == "r"
690
+ ? traverseNode
691
+ .value(evalContext)
692
+ .Then((nodeResult: Res) =>
693
+ ValueOrErrors.Default.return(
694
+ elementResults.reduce(
695
+ (acc, res) =>
696
+ traversalContext.joinRes([acc, res]),
697
+ nodeResult,
698
+ ),
699
+ ),
700
+ )
701
+ : ValueOrErrors.Default.return(
702
+ elementResults.reduce(
703
+ (acc, res) => traversalContext.joinRes([acc, res]),
704
+ traversalContext.zeroRes(unit),
705
+ ),
706
+ ),
707
+ );
708
+ }),
709
+ );
710
+ },
711
+ );
712
+ }
713
+
714
+ if (type.kind == "map" && renderer.kind == "mapRenderer") {
715
+ return rec(
716
+ type.args[0],
717
+ renderer.keyRenderer.renderer,
718
+ traversalContext,
719
+ ).Then((keyTraversal) => {
720
+ return rec(
721
+ type.args[1],
722
+ renderer.valueRenderer.renderer,
723
+ traversalContext,
724
+ ).Then((valueTraversal) => {
725
+ if (
726
+ keyTraversal.kind == "l" &&
727
+ valueTraversal.kind == "l" &&
728
+ traverseNode.kind == "l"
729
+ ) {
730
+ return ValueOrErrors.Default.return(Option.Default.none());
731
+ }
732
+ return ValueOrErrors.Default.return(
733
+ Option.Default.some<ValueTraversal<T, Res>>(
734
+ (evalContext: EvalContext<T, Res>) => {
735
+ if (keyTraversal.kind == "l" && valueTraversal.kind == "l") {
736
+ return traverseNode.kind == "r"
737
+ ? traverseNode.value(evalContext)
738
+ : ValueOrErrors.Default.return<Res, string>(
739
+ traversalContext.zeroRes(unit),
740
+ );
741
+ }
742
+
743
+ const iterator = evalContext.traversalIterator;
744
+ if (!PredicateValue.Operations.IsTuple(iterator)) {
745
+ return ValueOrErrors.Default.throwOne<Res, string>(
746
+ `Error: traversal iterator for map is not a tuple, got ${JSON.stringify(
747
+ iterator,
748
+ null,
749
+ 2,
750
+ )}`,
751
+ );
752
+ }
753
+
754
+ return ValueOrErrors.Operations.All<Res, string>(
755
+ iterator.values.map((value) => {
756
+ if (!PredicateValue.Operations.IsTuple(value)) {
757
+ return ValueOrErrors.Default.throwOne<Res, string>(
758
+ `Error: traversal iterator for map keyValue is not a tuple, got ${JSON.stringify(
759
+ value,
760
+ null,
761
+ 2,
762
+ )}`,
763
+ );
764
+ }
765
+ const keyRes =
766
+ keyTraversal.kind == "r"
767
+ ? keyTraversal.value({
768
+ ...evalContext,
769
+ traversalIterator: value.values.get(0)!,
770
+ })
771
+ : ValueOrErrors.Default.return(
772
+ traversalContext.zeroRes(unit),
773
+ );
774
+
775
+ const valueRes =
776
+ valueTraversal.kind == "r"
777
+ ? valueTraversal.value({
778
+ ...evalContext,
779
+ traversalIterator: value.values.get(1)!,
780
+ })
781
+ : ValueOrErrors.Default.return(
782
+ traversalContext.zeroRes(unit),
783
+ );
784
+
785
+ if (keyRes.kind == "errors") {
786
+ return keyRes as ValueOrErrors<Res, string>;
787
+ }
788
+ if (valueRes.kind == "errors") {
789
+ return valueRes as ValueOrErrors<Res, string>;
790
+ }
791
+
792
+ return ValueOrErrors.Default.return<Res, string>(
793
+ traversalContext.joinRes([
794
+ keyRes.value,
795
+ valueRes.value,
796
+ ]),
797
+ );
798
+ }),
799
+ ).Then((keyValueResults) => {
800
+ return traverseNode.kind == "r"
801
+ ? traverseNode
802
+ .value(evalContext)
803
+ .Then((nodeResult: Res) => {
804
+ return ValueOrErrors.Default.return<Res, string>(
805
+ keyValueResults.reduce(
806
+ (acc, res) =>
807
+ traversalContext.joinRes([acc, res]),
808
+ nodeResult,
809
+ ),
810
+ );
811
+ })
812
+ : ValueOrErrors.Default.return<Res, string>(
813
+ keyValueResults.reduce(
814
+ (acc, res) => traversalContext.joinRes([acc, res]),
815
+ traversalContext.zeroRes(unit),
816
+ ),
817
+ );
818
+ });
819
+ },
820
+ ),
821
+ );
822
+ });
823
+ });
824
+ }
825
+
414
826
  return ValueOrErrors.Default.return(Option.Default.none());
415
827
  },
416
828
  },
@@ -179,6 +179,7 @@ export const InfiniteMultiselectDropdownForm = <
179
179
  ),
180
180
  ),
181
181
  toggleSelection: (elementRecord: ValueRecord) => {
182
+ // TODO - updater logic is using old value rather than inside an updater
182
183
  const updater = props.context.value.fields.has(
183
184
  elementRecord.fields.get("Id")! as string,
184
185
  )
@@ -192,7 +193,7 @@ export const InfiniteMultiselectDropdownForm = <
192
193
 
193
194
  const delta: Delta = {
194
195
  kind: "SetReplace",
195
- // Maybe unsafe - check
196
+ // TODO: Maybe unsafe - check
196
197
  replace: updater(props.context.value),
197
198
  state: {
198
199
  commonFormState: props.context.commonFormState,