agency-lang 0.0.15 → 0.0.17

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 (41) hide show
  1. package/dist/lib/backends/agencyGenerator.js +24 -6
  2. package/dist/lib/backends/agencyGenerator.test.d.ts +1 -0
  3. package/dist/lib/backends/agencyGenerator.test.js +205 -0
  4. package/dist/lib/backends/baseGenerator.d.ts +1 -0
  5. package/dist/lib/backends/baseGenerator.js +12 -2
  6. package/dist/lib/backends/graphGenerator.js +7 -5
  7. package/dist/lib/backends/typescriptGenerator.d.ts +3 -3
  8. package/dist/lib/backends/typescriptGenerator.js +17 -11
  9. package/dist/lib/parsers/access.d.ts +3 -5
  10. package/dist/lib/parsers/access.js +54 -13
  11. package/dist/lib/parsers/access.test.js +40 -500
  12. package/dist/lib/parsers/assignment.js +2 -2
  13. package/dist/lib/parsers/assignment.test.d.ts +1 -0
  14. package/dist/lib/parsers/assignment.test.js +279 -0
  15. package/dist/lib/parsers/dataStructures.js +3 -3
  16. package/dist/lib/parsers/function.d.ts +3 -1
  17. package/dist/lib/parsers/function.js +6 -4
  18. package/dist/lib/parsers/function.test.js +653 -8
  19. package/dist/lib/parsers/functionCall.js +3 -2
  20. package/dist/lib/parsers/functionCall.test.js +310 -0
  21. package/dist/lib/parsers/literals.d.ts +2 -1
  22. package/dist/lib/parsers/literals.js +15 -5
  23. package/dist/lib/parsers/literals.test.js +189 -16
  24. package/dist/lib/parsers/matchBlock.js +2 -2
  25. package/dist/lib/parsers/parserUtils.test.d.ts +1 -0
  26. package/dist/lib/parsers/parserUtils.test.js +46 -0
  27. package/dist/lib/parsers/returnStatement.js +2 -2
  28. package/dist/lib/parsers/returnStatement.test.d.ts +1 -0
  29. package/dist/lib/parsers/returnStatement.test.js +268 -0
  30. package/dist/lib/parsers/specialVar.test.d.ts +1 -0
  31. package/dist/lib/parsers/specialVar.test.js +219 -0
  32. package/dist/lib/types/access.d.ts +5 -5
  33. package/dist/lib/types/access.js +6 -1
  34. package/dist/lib/types/dataStructures.d.ts +3 -3
  35. package/dist/lib/types/function.d.ts +10 -4
  36. package/dist/lib/types/literals.d.ts +5 -1
  37. package/dist/lib/types/matchBlock.d.ts +2 -2
  38. package/dist/lib/types/returnStatement.d.ts +2 -2
  39. package/dist/lib/types/whileLoop.d.ts +2 -2
  40. package/dist/lib/types.d.ts +3 -3
  41. package/package.json +2 -2
@@ -401,7 +401,7 @@ describe("functionParser", () => {
401
401
  result: {
402
402
  type: "function",
403
403
  functionName: "add",
404
- parameters: ["x"],
404
+ parameters: [{ type: "functionParameter", name: "x" }],
405
405
  docString: undefined,
406
406
  body: [
407
407
  {
@@ -419,7 +419,7 @@ describe("functionParser", () => {
419
419
  result: {
420
420
  type: "function",
421
421
  functionName: "greet",
422
- parameters: ["name"],
422
+ parameters: [{ type: "functionParameter", name: "name" }],
423
423
  docString: undefined,
424
424
  body: [
425
425
  {
@@ -445,7 +445,10 @@ describe("functionParser", () => {
445
445
  result: {
446
446
  type: "function",
447
447
  functionName: "add",
448
- parameters: ["x", "y"],
448
+ parameters: [
449
+ { type: "functionParameter", name: "x" },
450
+ { type: "functionParameter", name: "y" },
451
+ ],
449
452
  docString: undefined,
450
453
  body: [
451
454
  {
@@ -463,7 +466,11 @@ describe("functionParser", () => {
463
466
  result: {
464
467
  type: "function",
465
468
  functionName: "calculate",
466
- parameters: ["a", "b", "c"],
469
+ parameters: [
470
+ { type: "functionParameter", name: "a" },
471
+ { type: "functionParameter", name: "b" },
472
+ { type: "functionParameter", name: "c" },
473
+ ],
467
474
  docString: undefined,
468
475
  body: [
469
476
  {
@@ -486,7 +493,10 @@ describe("functionParser", () => {
486
493
  result: {
487
494
  type: "function",
488
495
  functionName: "multiply",
489
- parameters: ["x", "y"],
496
+ parameters: [
497
+ { type: "functionParameter", name: "x" },
498
+ { type: "functionParameter", name: "y" },
499
+ ],
490
500
  docString: undefined,
491
501
  body: [
492
502
  {
@@ -504,7 +514,10 @@ describe("functionParser", () => {
504
514
  result: {
505
515
  type: "function",
506
516
  functionName: "process",
507
- parameters: ["a", "b"],
517
+ parameters: [
518
+ { type: "functionParameter", name: "a" },
519
+ { type: "functionParameter", name: "b" },
520
+ ],
508
521
  docString: undefined,
509
522
  body: [
510
523
  {
@@ -523,7 +536,10 @@ describe("functionParser", () => {
523
536
  result: {
524
537
  type: "function",
525
538
  functionName: "add",
526
- parameters: ["x", "y"],
539
+ parameters: [
540
+ { type: "functionParameter", name: "x" },
541
+ { type: "functionParameter", name: "y" },
542
+ ],
527
543
  docString: {
528
544
  type: "docString",
529
545
  value: "Adds two numbers",
@@ -544,7 +560,10 @@ describe("functionParser", () => {
544
560
  result: {
545
561
  type: "function",
546
562
  functionName: "greet",
547
- parameters: ["name", "greeting"],
563
+ parameters: [
564
+ { type: "functionParameter", name: "name" },
565
+ { type: "functionParameter", name: "greeting" },
566
+ ],
548
567
  docString: {
549
568
  type: "docString",
550
569
  value: "Greets someone with a custom greeting",
@@ -570,6 +589,632 @@ describe("functionParser", () => {
570
589
  },
571
590
  },
572
591
  },
592
+ // Functions with single parameter with type hint
593
+ {
594
+ input: "def add(x: number) { x }",
595
+ expected: {
596
+ success: true,
597
+ result: {
598
+ type: "function",
599
+ functionName: "add",
600
+ parameters: [
601
+ {
602
+ type: "functionParameter",
603
+ name: "x",
604
+ typeHint: { type: "primitiveType", value: "number" },
605
+ },
606
+ ],
607
+ docString: undefined,
608
+ body: [{ type: "variableName", value: "x" }],
609
+ },
610
+ },
611
+ },
612
+ {
613
+ input: "def greet(name: string) { name }",
614
+ expected: {
615
+ success: true,
616
+ result: {
617
+ type: "function",
618
+ functionName: "greet",
619
+ parameters: [
620
+ {
621
+ type: "functionParameter",
622
+ name: "name",
623
+ typeHint: { type: "primitiveType", value: "string" },
624
+ },
625
+ ],
626
+ docString: undefined,
627
+ body: [{ type: "variableName", value: "name" }],
628
+ },
629
+ },
630
+ },
631
+ {
632
+ input: "def check(active: boolean) { active }",
633
+ expected: {
634
+ success: true,
635
+ result: {
636
+ type: "function",
637
+ functionName: "check",
638
+ parameters: [
639
+ {
640
+ type: "functionParameter",
641
+ name: "active",
642
+ typeHint: { type: "primitiveType", value: "boolean" },
643
+ },
644
+ ],
645
+ docString: undefined,
646
+ body: [{ type: "variableName", value: "active" }],
647
+ },
648
+ },
649
+ },
650
+ {
651
+ input: "def process(data: any) { data }",
652
+ expected: {
653
+ success: true,
654
+ result: {
655
+ type: "function",
656
+ functionName: "process",
657
+ parameters: [
658
+ {
659
+ type: "functionParameter",
660
+ name: "data",
661
+ typeHint: { type: "typeAliasVariable", aliasName: "any" },
662
+ },
663
+ ],
664
+ docString: undefined,
665
+ body: [{ type: "variableName", value: "data" }],
666
+ },
667
+ },
668
+ },
669
+ {
670
+ input: "def handle(x : number) { x }",
671
+ expected: {
672
+ success: true,
673
+ result: {
674
+ type: "function",
675
+ functionName: "handle",
676
+ parameters: [
677
+ {
678
+ type: "functionParameter",
679
+ name: "x",
680
+ typeHint: { type: "primitiveType", value: "number" },
681
+ },
682
+ ],
683
+ docString: undefined,
684
+ body: [{ type: "variableName", value: "x" }],
685
+ },
686
+ },
687
+ },
688
+ // Functions with multiple parameters with type hints
689
+ {
690
+ input: "def add(x: number, y: number) { x }",
691
+ expected: {
692
+ success: true,
693
+ result: {
694
+ type: "function",
695
+ functionName: "add",
696
+ parameters: [
697
+ {
698
+ type: "functionParameter",
699
+ name: "x",
700
+ typeHint: { type: "primitiveType", value: "number" },
701
+ },
702
+ {
703
+ type: "functionParameter",
704
+ name: "y",
705
+ typeHint: { type: "primitiveType", value: "number" },
706
+ },
707
+ ],
708
+ docString: undefined,
709
+ body: [{ type: "variableName", value: "x" }],
710
+ },
711
+ },
712
+ },
713
+ {
714
+ input: "def concat(a: string, b: string, c: string) { a }",
715
+ expected: {
716
+ success: true,
717
+ result: {
718
+ type: "function",
719
+ functionName: "concat",
720
+ parameters: [
721
+ {
722
+ type: "functionParameter",
723
+ name: "a",
724
+ typeHint: { type: "primitiveType", value: "string" },
725
+ },
726
+ {
727
+ type: "functionParameter",
728
+ name: "b",
729
+ typeHint: { type: "primitiveType", value: "string" },
730
+ },
731
+ {
732
+ type: "functionParameter",
733
+ name: "c",
734
+ typeHint: { type: "primitiveType", value: "string" },
735
+ },
736
+ ],
737
+ docString: undefined,
738
+ body: [{ type: "variableName", value: "a" }],
739
+ },
740
+ },
741
+ },
742
+ {
743
+ input: "def compare(x: number, y: string) { x }",
744
+ expected: {
745
+ success: true,
746
+ result: {
747
+ type: "function",
748
+ functionName: "compare",
749
+ parameters: [
750
+ {
751
+ type: "functionParameter",
752
+ name: "x",
753
+ typeHint: { type: "primitiveType", value: "number" },
754
+ },
755
+ {
756
+ type: "functionParameter",
757
+ name: "y",
758
+ typeHint: { type: "primitiveType", value: "string" },
759
+ },
760
+ ],
761
+ docString: undefined,
762
+ body: [{ type: "variableName", value: "x" }],
763
+ },
764
+ },
765
+ },
766
+ {
767
+ input: "def calc(x:number,y:number) { x }",
768
+ expected: {
769
+ success: true,
770
+ result: {
771
+ type: "function",
772
+ functionName: "calc",
773
+ parameters: [
774
+ {
775
+ type: "functionParameter",
776
+ name: "x",
777
+ typeHint: { type: "primitiveType", value: "number" },
778
+ },
779
+ {
780
+ type: "functionParameter",
781
+ name: "y",
782
+ typeHint: { type: "primitiveType", value: "number" },
783
+ },
784
+ ],
785
+ docString: undefined,
786
+ body: [{ type: "variableName", value: "x" }],
787
+ },
788
+ },
789
+ },
790
+ // Functions with mixed typed and untyped parameters
791
+ {
792
+ input: "def mixed(x: number, y) { x }",
793
+ expected: {
794
+ success: true,
795
+ result: {
796
+ type: "function",
797
+ functionName: "mixed",
798
+ parameters: [
799
+ {
800
+ type: "functionParameter",
801
+ name: "x",
802
+ typeHint: { type: "primitiveType", value: "number" },
803
+ },
804
+ { type: "functionParameter", name: "y" },
805
+ ],
806
+ docString: undefined,
807
+ body: [{ type: "variableName", value: "x" }],
808
+ },
809
+ },
810
+ },
811
+ {
812
+ input: "def partial(a, b: string, c) { a }",
813
+ expected: {
814
+ success: true,
815
+ result: {
816
+ type: "function",
817
+ functionName: "partial",
818
+ parameters: [
819
+ { type: "functionParameter", name: "a" },
820
+ {
821
+ type: "functionParameter",
822
+ name: "b",
823
+ typeHint: { type: "primitiveType", value: "string" },
824
+ },
825
+ { type: "functionParameter", name: "c" },
826
+ ],
827
+ docString: undefined,
828
+ body: [{ type: "variableName", value: "a" }],
829
+ },
830
+ },
831
+ },
832
+ {
833
+ input: "def combo(typed: number, untyped) { typed }",
834
+ expected: {
835
+ success: true,
836
+ result: {
837
+ type: "function",
838
+ functionName: "combo",
839
+ parameters: [
840
+ {
841
+ type: "functionParameter",
842
+ name: "typed",
843
+ typeHint: { type: "primitiveType", value: "number" },
844
+ },
845
+ { type: "functionParameter", name: "untyped" },
846
+ ],
847
+ docString: undefined,
848
+ body: [{ type: "variableName", value: "typed" }],
849
+ },
850
+ },
851
+ },
852
+ // Functions with complex type hints (arrays)
853
+ {
854
+ input: "def processArray(items: number[]) { items }",
855
+ expected: {
856
+ success: true,
857
+ result: {
858
+ type: "function",
859
+ functionName: "processArray",
860
+ parameters: [
861
+ {
862
+ type: "functionParameter",
863
+ name: "items",
864
+ typeHint: {
865
+ type: "arrayType",
866
+ elementType: { type: "primitiveType", value: "number" },
867
+ },
868
+ },
869
+ ],
870
+ docString: undefined,
871
+ body: [{ type: "variableName", value: "items" }],
872
+ },
873
+ },
874
+ },
875
+ {
876
+ input: "def handleStrings(names: string[]) { names }",
877
+ expected: {
878
+ success: true,
879
+ result: {
880
+ type: "function",
881
+ functionName: "handleStrings",
882
+ parameters: [
883
+ {
884
+ type: "functionParameter",
885
+ name: "names",
886
+ typeHint: {
887
+ type: "arrayType",
888
+ elementType: { type: "primitiveType", value: "string" },
889
+ },
890
+ },
891
+ ],
892
+ docString: undefined,
893
+ body: [{ type: "variableName", value: "names" }],
894
+ },
895
+ },
896
+ },
897
+ {
898
+ input: "def processData(obj: object) { obj }",
899
+ expected: {
900
+ success: true,
901
+ result: {
902
+ type: "function",
903
+ functionName: "processData",
904
+ parameters: [
905
+ {
906
+ type: "functionParameter",
907
+ name: "obj",
908
+ typeHint: { type: "typeAliasVariable", aliasName: "object" },
909
+ },
910
+ ],
911
+ docString: undefined,
912
+ body: [{ type: "variableName", value: "obj" }],
913
+ },
914
+ },
915
+ },
916
+ {
917
+ input: "def multi(arr: string[], count: number) { arr }",
918
+ expected: {
919
+ success: true,
920
+ result: {
921
+ type: "function",
922
+ functionName: "multi",
923
+ parameters: [
924
+ {
925
+ type: "functionParameter",
926
+ name: "arr",
927
+ typeHint: {
928
+ type: "arrayType",
929
+ elementType: { type: "primitiveType", value: "string" },
930
+ },
931
+ },
932
+ {
933
+ type: "functionParameter",
934
+ name: "count",
935
+ typeHint: { type: "primitiveType", value: "number" },
936
+ },
937
+ ],
938
+ docString: undefined,
939
+ body: [{ type: "variableName", value: "arr" }],
940
+ },
941
+ },
942
+ },
943
+ {
944
+ input: "def nested(matrix: number[][]) { matrix }",
945
+ expected: {
946
+ success: true,
947
+ result: {
948
+ type: "function",
949
+ functionName: "nested",
950
+ parameters: [
951
+ {
952
+ type: "functionParameter",
953
+ name: "matrix",
954
+ typeHint: {
955
+ type: "arrayType",
956
+ elementType: {
957
+ type: "arrayType",
958
+ elementType: { type: "primitiveType", value: "number" },
959
+ },
960
+ },
961
+ },
962
+ ],
963
+ docString: undefined,
964
+ body: [{ type: "variableName", value: "matrix" }],
965
+ },
966
+ },
967
+ },
968
+ // Functions with union type hints
969
+ {
970
+ input: "def flexible(value: string | number) { value }",
971
+ expected: {
972
+ success: true,
973
+ result: {
974
+ type: "function",
975
+ functionName: "flexible",
976
+ parameters: [
977
+ {
978
+ type: "functionParameter",
979
+ name: "value",
980
+ typeHint: {
981
+ type: "unionType",
982
+ types: [
983
+ { type: "primitiveType", value: "string" },
984
+ { type: "primitiveType", value: "number" },
985
+ ],
986
+ },
987
+ },
988
+ ],
989
+ docString: undefined,
990
+ body: [{ type: "variableName", value: "value" }],
991
+ },
992
+ },
993
+ },
994
+ {
995
+ input: "def multiUnion(x: number | string | boolean) { x }",
996
+ expected: {
997
+ success: true,
998
+ result: {
999
+ type: "function",
1000
+ functionName: "multiUnion",
1001
+ parameters: [
1002
+ {
1003
+ type: "functionParameter",
1004
+ name: "x",
1005
+ typeHint: {
1006
+ type: "unionType",
1007
+ types: [
1008
+ { type: "primitiveType", value: "number" },
1009
+ { type: "primitiveType", value: "string" },
1010
+ { type: "primitiveType", value: "boolean" },
1011
+ ],
1012
+ },
1013
+ },
1014
+ ],
1015
+ docString: undefined,
1016
+ body: [{ type: "variableName", value: "x" }],
1017
+ },
1018
+ },
1019
+ },
1020
+ {
1021
+ input: "def dual(a: string | number, b: boolean) { a }",
1022
+ expected: {
1023
+ success: true,
1024
+ result: {
1025
+ type: "function",
1026
+ functionName: "dual",
1027
+ parameters: [
1028
+ {
1029
+ type: "functionParameter",
1030
+ name: "a",
1031
+ typeHint: {
1032
+ type: "unionType",
1033
+ types: [
1034
+ { type: "primitiveType", value: "string" },
1035
+ { type: "primitiveType", value: "number" },
1036
+ ],
1037
+ },
1038
+ },
1039
+ {
1040
+ type: "functionParameter",
1041
+ name: "b",
1042
+ typeHint: { type: "primitiveType", value: "boolean" },
1043
+ },
1044
+ ],
1045
+ docString: undefined,
1046
+ body: [{ type: "variableName", value: "a" }],
1047
+ },
1048
+ },
1049
+ },
1050
+ // Functions with type hints and docstrings
1051
+ {
1052
+ input: 'def add(x: number, y: number) {\n """Adds two numbers"""\n x\n}',
1053
+ expected: {
1054
+ success: true,
1055
+ result: {
1056
+ type: "function",
1057
+ functionName: "add",
1058
+ parameters: [
1059
+ {
1060
+ type: "functionParameter",
1061
+ name: "x",
1062
+ typeHint: { type: "primitiveType", value: "number" },
1063
+ },
1064
+ {
1065
+ type: "functionParameter",
1066
+ name: "y",
1067
+ typeHint: { type: "primitiveType", value: "number" },
1068
+ },
1069
+ ],
1070
+ docString: {
1071
+ type: "docString",
1072
+ value: "Adds two numbers",
1073
+ },
1074
+ body: [{ type: "variableName", value: "x" }],
1075
+ },
1076
+ },
1077
+ },
1078
+ {
1079
+ input: 'def greet(name: string) {\n """Greets a person by name"""\n name\n}',
1080
+ expected: {
1081
+ success: true,
1082
+ result: {
1083
+ type: "function",
1084
+ functionName: "greet",
1085
+ parameters: [
1086
+ {
1087
+ type: "functionParameter",
1088
+ name: "name",
1089
+ typeHint: { type: "primitiveType", value: "string" },
1090
+ },
1091
+ ],
1092
+ docString: {
1093
+ type: "docString",
1094
+ value: "Greets a person by name",
1095
+ },
1096
+ body: [{ type: "variableName", value: "name" }],
1097
+ },
1098
+ },
1099
+ },
1100
+ {
1101
+ input: 'def mixedWithDoc(typed: number, untyped) {\n """Mix of typed and untyped params"""\n typed\n}',
1102
+ expected: {
1103
+ success: true,
1104
+ result: {
1105
+ type: "function",
1106
+ functionName: "mixedWithDoc",
1107
+ parameters: [
1108
+ {
1109
+ type: "functionParameter",
1110
+ name: "typed",
1111
+ typeHint: { type: "primitiveType", value: "number" },
1112
+ },
1113
+ { type: "functionParameter", name: "untyped" },
1114
+ ],
1115
+ docString: {
1116
+ type: "docString",
1117
+ value: "Mix of typed and untyped params",
1118
+ },
1119
+ body: [{ type: "variableName", value: "typed" }],
1120
+ },
1121
+ },
1122
+ },
1123
+ // Edge cases for type hints
1124
+ {
1125
+ input: "def f(x: number) { x }",
1126
+ expected: {
1127
+ success: true,
1128
+ result: {
1129
+ type: "function",
1130
+ functionName: "f",
1131
+ parameters: [
1132
+ {
1133
+ type: "functionParameter",
1134
+ name: "x",
1135
+ typeHint: { type: "primitiveType", value: "number" },
1136
+ },
1137
+ ],
1138
+ docString: undefined,
1139
+ body: [{ type: "variableName", value: "x" }],
1140
+ },
1141
+ },
1142
+ },
1143
+ {
1144
+ input: "def add(x : number , y : string) { x }",
1145
+ expected: {
1146
+ success: true,
1147
+ result: {
1148
+ type: "function",
1149
+ functionName: "add",
1150
+ parameters: [
1151
+ {
1152
+ type: "functionParameter",
1153
+ name: "x",
1154
+ typeHint: { type: "primitiveType", value: "number" },
1155
+ },
1156
+ {
1157
+ type: "functionParameter",
1158
+ name: "y",
1159
+ typeHint: { type: "primitiveType", value: "string" },
1160
+ },
1161
+ ],
1162
+ docString: undefined,
1163
+ body: [{ type: "variableName", value: "x" }],
1164
+ },
1165
+ },
1166
+ },
1167
+ {
1168
+ input: "def process(my_var: string) { my_var }",
1169
+ expected: {
1170
+ success: true,
1171
+ result: {
1172
+ type: "function",
1173
+ functionName: "process",
1174
+ parameters: [
1175
+ {
1176
+ type: "functionParameter",
1177
+ name: "my_var",
1178
+ typeHint: { type: "primitiveType", value: "string" },
1179
+ },
1180
+ ],
1181
+ docString: undefined,
1182
+ body: [{ type: "variableName", value: "my_var" }],
1183
+ },
1184
+ },
1185
+ },
1186
+ {
1187
+ input: "def handle(data: SomeLongTypeName) { data }",
1188
+ expected: {
1189
+ success: true,
1190
+ result: {
1191
+ type: "function",
1192
+ functionName: "handle",
1193
+ parameters: [
1194
+ {
1195
+ type: "functionParameter",
1196
+ name: "data",
1197
+ typeHint: { type: "typeAliasVariable", aliasName: "SomeLongTypeName" },
1198
+ },
1199
+ ],
1200
+ docString: undefined,
1201
+ body: [{ type: "variableName", value: "data" }],
1202
+ },
1203
+ },
1204
+ },
1205
+ // Failure cases for type hints
1206
+ {
1207
+ input: "def bad(x:) { x }",
1208
+ expected: { success: false },
1209
+ },
1210
+ {
1211
+ input: "def bad(: number) { x }",
1212
+ expected: { success: false },
1213
+ },
1214
+ {
1215
+ input: "def bad(x: number y: string) { x }",
1216
+ expected: { success: false },
1217
+ },
573
1218
  ];
574
1219
  testCases.forEach(({ input, expected }) => {
575
1220
  if (expected.success) {