@bikky/replication 1.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.
Files changed (140) hide show
  1. package/Constants/Errors.d.ts +27 -0
  2. package/Constants/Errors.js +75 -0
  3. package/Constants/Logging.d.ts +17 -0
  4. package/Constants/Logging.js +97 -0
  5. package/Constants/ReplicableRegistry.d.ts +37 -0
  6. package/Constants/ReplicableRegistry.js +234 -0
  7. package/Constants/SerialisationTypes.d.ts +82 -0
  8. package/Constants/SerialisationTypes.js +160 -0
  9. package/Constants/SourceMaps.d.ts +10 -0
  10. package/Constants/SourceMaps.js +12 -0
  11. package/Constants/TraversalStep.d.ts +5 -0
  12. package/Constants/TraversalStep.js +2 -0
  13. package/Constants/Versions.d.ts +15 -0
  14. package/Constants/Versions.js +63 -0
  15. package/Expressions/Compiler/BuiltinGrammar.d.ts +234 -0
  16. package/Expressions/Compiler/BuiltinGrammar.js +446 -0
  17. package/Expressions/Compiler/ExpressionGrammar.d.ts +89 -0
  18. package/Expressions/Compiler/ExpressionGrammar.js +70 -0
  19. package/Expressions/Compiler/Parser.d.ts +56 -0
  20. package/Expressions/Compiler/Parser.js +314 -0
  21. package/Expressions/Compiler/Tokenizer.d.ts +52 -0
  22. package/Expressions/Compiler/Tokenizer.js +222 -0
  23. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.d.ts +1 -0
  24. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.js +516 -0
  25. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.d.ts +1 -0
  26. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.js +68 -0
  27. package/Expressions/CreateEvaluator.d.ts +4 -0
  28. package/Expressions/CreateEvaluator.js +85 -0
  29. package/Expressions/EvaluatorChain.d.ts +19 -0
  30. package/Expressions/EvaluatorChain.js +137 -0
  31. package/Expressions/EvaluatorSteps.d.ts +19 -0
  32. package/Expressions/EvaluatorSteps.js +12 -0
  33. package/Expressions/EvaluatorString.d.ts +21 -0
  34. package/Expressions/EvaluatorString.js +26 -0
  35. package/Expressions/Expression.d.ts +36 -0
  36. package/Expressions/Expression.js +147 -0
  37. package/Expressions/Traverser.d.ts +28 -0
  38. package/Expressions/Traverser.js +348 -0
  39. package/Expressions/TypeRegistry/Accessors.d.ts +26 -0
  40. package/Expressions/TypeRegistry/Accessors.js +58 -0
  41. package/Expressions/TypeRegistry/ChainCollections.d.ts +51 -0
  42. package/Expressions/TypeRegistry/ChainCollections.js +134 -0
  43. package/Expressions/TypeRegistry/ChainTypes.d.ts +23 -0
  44. package/Expressions/TypeRegistry/ChainTypes.js +46 -0
  45. package/Expressions/TypeRegistry/CustomAPI.d.ts +36 -0
  46. package/Expressions/TypeRegistry/CustomAPI.js +181 -0
  47. package/Expressions/TypeRegistry/Primitive.d.ts +19 -0
  48. package/Expressions/TypeRegistry/Primitive.js +47 -0
  49. package/Expressions/TypeRegistry/Registry.d.ts +27 -0
  50. package/Expressions/TypeRegistry/Registry.js +270 -0
  51. package/Expressions/TypeRegistry/ReplAPI.d.ts +41 -0
  52. package/Expressions/TypeRegistry/ReplAPI.js +220 -0
  53. package/Expressions/TypeRegistry/Scope.d.ts +24 -0
  54. package/Expressions/TypeRegistry/Scope.js +44 -0
  55. package/Expressions/TypeRegistry/Types.d.ts +23 -0
  56. package/Expressions/TypeRegistry/Types.js +1 -0
  57. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.d.ts +1 -0
  58. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.js +31 -0
  59. package/Expressions/__tests__/ExpressionExamples.d.ts +28 -0
  60. package/Expressions/__tests__/ExpressionExamples.js +50 -0
  61. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.d.ts +1 -0
  62. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.js +166 -0
  63. package/IDPool.d.ts +18 -0
  64. package/IDPool.data.d.ts +17 -0
  65. package/IDPool.js +139 -0
  66. package/License.txt +1 -0
  67. package/Main.d.ts +13 -0
  68. package/Main.js +13 -0
  69. package/Networking.d.ts +60 -0
  70. package/Networking.js +626 -0
  71. package/Replicatable.d.ts +66 -0
  72. package/Replicatable.js +123 -0
  73. package/Tracking/Buffable.d.ts +68 -0
  74. package/Tracking/Buffable.js +194 -0
  75. package/Tracking/Class.d.ts +97 -0
  76. package/Tracking/Class.js +221 -0
  77. package/Tracking/Functions.d.ts +14 -0
  78. package/Tracking/Functions.js +27 -0
  79. package/Tracking/GlobalGroup.d.ts +5 -0
  80. package/Tracking/GlobalGroup.js +39 -0
  81. package/Tracking/Property.d.ts +95 -0
  82. package/Tracking/Property.js +125 -0
  83. package/Tracking/Types.d.ts +33 -0
  84. package/Tracking/Types.js +1 -0
  85. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.d.ts +1 -0
  86. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.js +151 -0
  87. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.d.ts +1 -0
  88. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.js +253 -0
  89. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.d.ts +1 -0
  90. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.js +135 -0
  91. package/Tracking/__tests__/Replicable.Tracking.Struct.test.d.ts +1 -0
  92. package/Tracking/__tests__/Replicable.Tracking.Struct.test.js +66 -0
  93. package/Tracking/__tests__/Replicable.Tracking.Type.test.d.ts +1 -0
  94. package/Tracking/__tests__/Replicable.Tracking.Type.test.js +67 -0
  95. package/Transformers/Configurer.d.ts +39 -0
  96. package/Transformers/Configurer.js +415 -0
  97. package/Transformers/Constructor.d.ts +12 -0
  98. package/Transformers/Constructor.js +44 -0
  99. package/Transformers/Definitions.d.ts +102 -0
  100. package/Transformers/Definitions.js +626 -0
  101. package/Transformers/Loader.d.ts +45 -0
  102. package/Transformers/Loader.js +350 -0
  103. package/Transformers/Progress.d.ts +32 -0
  104. package/Transformers/Progress.js +429 -0
  105. package/Transformers/Reference.d.ts +37 -0
  106. package/Transformers/Reference.js +212 -0
  107. package/Transformers/SchemaGenerator.d.ts +102 -0
  108. package/Transformers/SchemaGenerator.js +564 -0
  109. package/Transformers/Serialiser.d.ts +31 -0
  110. package/Transformers/Serialiser.js +366 -0
  111. package/Transformers/Utils.d.ts +33 -0
  112. package/Transformers/Utils.js +287 -0
  113. package/Transformers/__tests__/Examples.d.ts +168 -0
  114. package/Transformers/__tests__/Examples.js +263 -0
  115. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.d.ts +1 -0
  116. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.js +457 -0
  117. package/Transformers/__tests__/Replicable.Transformers.Loader.test.d.ts +1 -0
  118. package/Transformers/__tests__/Replicable.Transformers.Loader.test.js +339 -0
  119. package/Transformers/__tests__/Replicable.Transformers.Progress.test.d.ts +1 -0
  120. package/Transformers/__tests__/Replicable.Transformers.Progress.test.js +256 -0
  121. package/Transformers/__tests__/Replicable.Transformers.Reference.test.d.ts +1 -0
  122. package/Transformers/__tests__/Replicable.Transformers.Reference.test.js +167 -0
  123. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.d.ts +1 -0
  124. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.js +400 -0
  125. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.d.ts +1 -0
  126. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.js +441 -0
  127. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.d.ts +1 -0
  128. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.js +320 -0
  129. package/Transformers/__tests__/Replicable.Transformers.Utils.test.d.ts +1 -0
  130. package/Transformers/__tests__/Replicable.Transformers.Utils.test.js +534 -0
  131. package/__tests__/Replicable.Expressions.test.d.ts +1 -0
  132. package/__tests__/Replicable.Expressions.test.js +166 -0
  133. package/__tests__/Replicable.IDPool.test.d.ts +1 -0
  134. package/__tests__/Replicable.IDPool.test.js +11 -0
  135. package/__tests__/Replicable.ReplicableRegistry.test.d.ts +1 -0
  136. package/__tests__/Replicable.ReplicableRegistry.test.js +154 -0
  137. package/__tests__/Replicable.Serialisation.test.d.ts +1 -0
  138. package/__tests__/Replicable.Serialisation.test.js +283 -0
  139. package/package.json +14 -0
  140. package/tsconfig.json +19 -0
@@ -0,0 +1,167 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { describe, expect, test } from "vitest";
8
+ import { Property, Referencer, Struct, Type, Versions } from "../../Main.js";
9
+ import { Pointer } from "../Reference.js";
10
+ import { Progress } from "../Progress.js";
11
+ //TODO: Test referencing & dereferencing custom types that are represented by strings in code (e.g. UUID).
12
+ // And have custom reference/dereference functions.
13
+ describe.sequential("Referencer", () => {
14
+ Progress.ClearCaches();
15
+ class TestRefClass {
16
+ }
17
+ __decorate([
18
+ Property(Versions.v1_0_0, String)
19
+ ], TestRefClass.prototype, "val", void 0);
20
+ let classDef = TestRefClass;
21
+ classDef.Reference = (obj) => {
22
+ return [obj.val];
23
+ };
24
+ classDef.Dereference = (data) => {
25
+ let obj = new TestRefClass();
26
+ obj.val = data[0];
27
+ return obj;
28
+ };
29
+ Type(Versions.v1_0_0)(classDef);
30
+ let TestRefStructClass = class TestRefStructClass {
31
+ };
32
+ __decorate([
33
+ Property(Versions.v1_0_0, String)
34
+ ], TestRefStructClass.prototype, "val2", void 0);
35
+ TestRefStructClass = __decorate([
36
+ Struct(Versions.v1_0_0)
37
+ ], TestRefStructClass);
38
+ Progress.FinishedAllLoading();
39
+ let validVal = new TestRefClass();
40
+ validVal.val = "test";
41
+ let invalidVal = new TestRefStructClass();
42
+ invalidVal.val2 = "test";
43
+ test.sequential("Get valid reference for TestRefClass", () => {
44
+ let ref = Referencer.Reference(validVal);
45
+ expect(ref).toContainAtLeast([TestRefClass.name, "test"]);
46
+ });
47
+ test.sequential("Try get invalid reference for TestRefStructClass", () => {
48
+ expect(() => Referencer.Reference(invalidVal))
49
+ .toThrowError(`Tried to create a reference for a TestRefStructClass which doesn't support references.`);
50
+ });
51
+ test.sequential("Can reference TestRefClass", () => {
52
+ expect(Referencer.CanReference(validVal)).toBe(true);
53
+ });
54
+ test.sequential("Cannot reference TestRefStructClass", () => {
55
+ expect(Referencer.CanReference(invalidVal)).toBe(false);
56
+ });
57
+ test.sequential("Is not reference for unknown class", () => {
58
+ expect(Referencer.CanReference({ debugName: "UnknownClass" }))
59
+ .toBe(false);
60
+ });
61
+ test.sequential("Non-arrays are not references", () => {
62
+ expect(Referencer.IsReference("test")).toBe(false);
63
+ });
64
+ test.sequential("Is reference for TestRefClass", () => {
65
+ expect(Referencer.IsReference([TestRefClass.name, "test"])).toBe(true);
66
+ });
67
+ test.sequential("Is not reference for TestRefStructClass", () => {
68
+ expect(Referencer.IsReference([TestRefStructClass.name, "test"])).toBe(false);
69
+ });
70
+ test.sequential("Is not reference for unknown class", () => {
71
+ expect(Referencer.IsReference(["UnknownClass", "test"]))
72
+ .toBe(false);
73
+ });
74
+ test.sequential("Dereference TestRefClass", () => {
75
+ let obj = Referencer.Dereference([TestRefClass.name, "test"]);
76
+ expect(obj).toBeDefined();
77
+ expect(obj.val).toBe("test");
78
+ });
79
+ test.sequential("Dereference an invalid reference", () => {
80
+ expect(() => Referencer.Dereference(["UnknownClass", "test"]))
81
+ .toThrowError("Tried to dereference UnknownClass which is an unregistered/non-replicable type.");
82
+ });
83
+ });
84
+ describe.sequential("Pointer", () => {
85
+ Progress.ClearCaches();
86
+ let validVal;
87
+ let invalidVal;
88
+ class TestPointerClass {
89
+ }
90
+ __decorate([
91
+ Property(Versions.v1_0_0, String)
92
+ ], TestPointerClass.prototype, "val", void 0);
93
+ let classDef = TestPointerClass;
94
+ classDef.Reference = (obj) => {
95
+ return [obj.val];
96
+ };
97
+ classDef.Dereference = (data) => {
98
+ if (data[0] == validVal.val) {
99
+ return validVal;
100
+ }
101
+ return null;
102
+ // let obj = new TestPointerClass();
103
+ // obj.val = data[0];
104
+ // return obj;
105
+ };
106
+ Type(Versions.v1_0_0)(classDef);
107
+ let TestStructClass = class TestStructClass {
108
+ };
109
+ __decorate([
110
+ Property(Versions.v1_0_0, String)
111
+ ], TestStructClass.prototype, "val2", void 0);
112
+ TestStructClass = __decorate([
113
+ Struct(Versions.v1_0_0)
114
+ ], TestStructClass);
115
+ Progress.FinishedAllLoading();
116
+ validVal = new TestPointerClass();
117
+ validVal.val = "test";
118
+ invalidVal = new TestStructClass();
119
+ invalidVal.val2 = "test2";
120
+ let secondaryVal = new TestPointerClass();
121
+ secondaryVal.val = "test3";
122
+ test.sequential("Create empty Pointer", () => {
123
+ let ptr = new Pointer();
124
+ expect(ptr).toBeDefined();
125
+ expect(() => ptr.val).toThrowError(`Cannot get value before value is set!`);
126
+ expect(ptr.ref).toBe(null);
127
+ expect(ptr.valOrNull).toBeNull();
128
+ });
129
+ test.sequential("Create new Pointer", () => {
130
+ let ptr = new Pointer(validVal);
131
+ expect(ptr).toBeDefined();
132
+ expect(ptr.val).toBe(validVal);
133
+ expect(ptr.val.val).toBe("test");
134
+ expect(ptr.ref).toContainAtLeast([TestPointerClass.name, "test"]);
135
+ expect(ptr.valOrNull).toBe(validVal);
136
+ });
137
+ test.sequential("Create new Pointer from Reference", () => {
138
+ let ptr = new Pointer();
139
+ ptr.ref = [TestPointerClass.name, "test"];
140
+ expect(ptr).toBeDefined();
141
+ expect(ptr.val).toBe(validVal);
142
+ expect(ptr.ref).toContainAtLeast([TestPointerClass.name, "test"]);
143
+ expect(ptr.valOrNull).toBe(validVal);
144
+ });
145
+ test.sequential("Create new Pointer from Reference in valOrNull", () => {
146
+ let ptr = new Pointer();
147
+ ptr.ref = [TestPointerClass.name, "test"];
148
+ expect(ptr).toBeDefined();
149
+ //Call valOrNull first so it's forced to do the lookup instead of .val
150
+ expect(ptr.valOrNull).toBe(validVal);
151
+ });
152
+ test.sequential("Create new Pointer from Reference that doesn't exist", () => {
153
+ let ptr = new Pointer();
154
+ ptr.ref = [TestPointerClass.name, "test2"];
155
+ expect(ptr).toBeDefined();
156
+ expect(() => ptr.val).toThrowError(`Attempt to access invalid value.`);
157
+ expect(ptr.ref).toContainAtLeast([TestPointerClass.name, "test2"]);
158
+ expect(ptr.valOrNull).toBeNull();
159
+ });
160
+ test.sequential("Change ptr from A to B", () => {
161
+ let ptr = new Pointer(secondaryVal);
162
+ Referencer.UpdateReferences(ptr.ref, [TestPointerClass.name, "test"]);
163
+ expect(ptr.val).toBe(validVal);
164
+ expect(ptr.ref).toContainAtLeast([TestPointerClass.name, "test"]);
165
+ expect(ptr.valOrNull).toBe(validVal);
166
+ });
167
+ });
@@ -0,0 +1,400 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { GeneratorUtilities } from "../SchemaGenerator.js";
3
+ import { ReplicableRegistry } from "../../Constants/ReplicableRegistry.js";
4
+ import { TestPropertyDecorators } from "./Examples.js";
5
+ import { BikPath } from "@bikky/path";
6
+ import { Expression, Versions } from "../../Main.js";
7
+ import { ExpressionScopes } from "../../Expressions/TypeRegistry/Registry.js";
8
+ var TransformersTheLotClass = TestPropertyDecorators.TransformersTheLotClass;
9
+ import { SetMap } from "@bikky/smart-collections";
10
+ var TransformersBasicStruct = TestPropertyDecorators.TransformersBasicStruct;
11
+ var TransformersBasicClass = TestPropertyDecorators.TransformersBasicClass;
12
+ var TransformersBasicChild = TestPropertyDecorators.TransformersBasicChild;
13
+ //TODO: Test expressions as map keys.
14
+ //TODO: Test serialised values allow null.
15
+ //TODO: Test serialised values allow child class names.
16
+ describe("SchemaGenerator", async () => {
17
+ const TestRepl = ReplicableRegistry.__GetReplicableForDataName(TestPropertyDecorators.TransformersTheLotClass.name);
18
+ const Source = {
19
+ SourceFile: BikPath.getCurrentFilepath(),
20
+ Version: Versions.v1_0_0
21
+ };
22
+ ExpressionScopes.addLocalVariable("TransformersTheLotClass", "thisEntity", [TransformersTheLotClass]);
23
+ Expression.setCurrentStartScopeType("TransformersTheLotClass");
24
+ let example = TransformersTheLotClass.MakeExampleObj();
25
+ ExpressionScopes.setLocalScope("TransformersTheLotClass", { thisEntity: example });
26
+ let def = TestRepl.getPropDefinition(Versions.v1_0_0, "val");
27
+ // let info = Utils.GetPropertyDecoratorTypesInfo(def, TestPropertyDecorators.TransformersTheLotClass.name)!;
28
+ let config = def.expressionForProperty[Versions.v1_0_0];
29
+ let evalChain = Expression.Parse("${thisEntity.Val}", BikPath.getCurrentFilepath(), config);
30
+ let expr = new Expression(evalChain);
31
+ let def2 = TestRepl.getPropDefinition(Versions.v1_0_0, "val2");
32
+ // let info2 = Utils.GetPropertyDecoratorTypesInfo(def2, TestPropertyDecorators.TransformersTheLotClass.name)!;
33
+ let def3 = TestRepl.getPropDefinition(Versions.v1_0_0, "val3");
34
+ // let info3 = Utils.GetPropertyDecoratorTypesInfo(def3, TestPropertyDecorators.TransformersTheLotClass.name)!;
35
+ let def4 = TestRepl.getPropDefinition(Versions.v1_0_0, "val4");
36
+ // let info4 = Utils.GetPropertyDecoratorTypesInfo(def4, TestPropertyDecorators.TransformersTheLotClass.name)!;
37
+ let def5 = TestRepl.getPropDefinition(Versions.v1_0_0, "val5");
38
+ // let info5 = Utils.GetPropertyDecoratorTypesInfo(def5, TestPropertyDecorators.TransformersTheLotClass.name)!;
39
+ let def6 = TestRepl.getPropDefinition(Versions.v1_0_0, "val6");
40
+ // let info6 = Utils.GetPropertyDecoratorTypesInfo(def6, TestPropertyDecorators.TransformersTheLotClass.name)!;
41
+ let def7 = TestRepl.getPropDefinition(Versions.v1_0_0, "val7");
42
+ // let info7 = Utils.GetPropertyDecoratorTypesInfo(def7, TestPropertyDecorators.TransformersTheLotClass.name)!;
43
+ let def8 = TestRepl.getPropDefinition(Versions.v1_0_0, "val8");
44
+ // let info8 = Utils.GetPropertyDecoratorTypesInfo(def8, TestPropertyDecorators.TransformersTheLotClass.name)!;
45
+ let def9 = TestRepl.getPropDefinition(Versions.v1_0_0, "val9");
46
+ // let info9 = Utils.GetPropertyDecoratorTypesInfo(def9, TestPropertyDecorators.TransformersTheLotClass.name)!;
47
+ let def10 = TestRepl.getPropDefinition(Versions.v1_0_0, "val10");
48
+ // let info10 = Utils.GetPropertyDecoratorTypesInfo(def10, TestPropertyDecorators.TransformersTheLotClass.name)!;
49
+ let def11 = TestRepl.getPropDefinition(Versions.v1_0_0, "val11");
50
+ // let info11 = Utils.GetPropertyDecoratorTypesInfo(def11, TestPropertyDecorators.TransformersTheLotClass.name)!;
51
+ let def13 = TestRepl.getPropDefinition(Versions.v1_0_0, "val13");
52
+ // let info13 = Utils.GetPropertyDecoratorTypesInfo(def13, TestPropertyDecorators.TransformersTheLotClass.name)!;
53
+ function getRepls(def) {
54
+ return def.types.flatMap((e) => e.types);
55
+ }
56
+ test("1. ExpressionString", () => {
57
+ expect(GeneratorUtilities.ExpressionString).toBe("`@{${string}}`");
58
+ expect(GeneratorUtilities.SerialisedExpressionString).toBe(`[ "Expression", string ]`);
59
+ });
60
+ describe("2. GenerateSingleValue", () => {
61
+ let gen = { blocks: [], includes: new SetMap() };
62
+ test(" 1. Plain values definition.", () => {
63
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def.load), gen, false, "definition"))
64
+ .toBe(`string`);
65
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def2.serialisation), gen, false, "definition"))
66
+ .toBe(`number | undefined`);
67
+ });
68
+ test(" 2. Plain values serialised.", () => {
69
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def.load), gen, false, "serialised"))
70
+ .toBe(`[ "Primitive", string ]`);
71
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def2.serialisation), gen, false, "serialised"))
72
+ .toBe(`[ "Primitive", number | undefined ]`);
73
+ });
74
+ test(" 3. Map values.", () => {
75
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def3.load), gen, false, "definition"))
76
+ .toBe(`number`);
77
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def3.serialisation), gen, false, "serialised"))
78
+ .toBe(`[ "Primitive", number | undefined ]`);
79
+ });
80
+ test(" 4. Dict values.", () => {
81
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def4.load), gen, false, "definition"))
82
+ .toBe(`string`);
83
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def4.serialisation), gen, false, "serialised"))
84
+ .toBe(`[ "Primitive", string | undefined ]`);
85
+ });
86
+ test(" 5. Array values.", () => {
87
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def5.load), gen, false, "definition"))
88
+ .toBe(`string`);
89
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def5.serialisation), gen, false, "serialised"))
90
+ .toBe(`[ "Primitive", string ]`);
91
+ });
92
+ test(" 6. Array2 values.", () => {
93
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def6.load), gen, false, "definition"))
94
+ .toBe(`number`);
95
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def6.serialisation), gen, false, "serialised"))
96
+ .toBe(`[ "Primitive", number ]`);
97
+ });
98
+ test(" 7. Struct values.", () => {
99
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def7.load), gen, false, "definition"))
100
+ .toBe(`${TransformersBasicStruct.name}Definition`);
101
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def7.serialisation), gen, false, "serialised"))
102
+ .toBe(`[ "${TransformersBasicStruct.name}" | string, ${TransformersBasicStruct.name}Serialised | null ]`);
103
+ });
104
+ test(" 8. Inline class values.", () => {
105
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def9.load), gen, true, "definition"))
106
+ .toBe(`${TransformersBasicClass.name}Definition`);
107
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def9.serialisation), gen, true, "serialised"))
108
+ .toBe(`[ "${TransformersBasicClass.name}" | string, ${TransformersBasicClass.name}Serialised | null ]`);
109
+ });
110
+ test(" 9. Class values.", () => {
111
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def10.load), gen, false, "definition"))
112
+ .toBe(`${TransformersBasicClass.name}Definition`);
113
+ expect(GeneratorUtilities.GenerateValueGroup(TestRepl.opts.dataTypeName, getRepls(def10.serialisation), gen, false, "serialised"))
114
+ .toBe(`${TransformersBasicClass.name}SerialisedReference`);
115
+ });
116
+ });
117
+ describe("3. Generate Property", () => {
118
+ test(" 1. Plain value.", () => {
119
+ let gen = { blocks: [], includes: new SetMap() };
120
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def, gen, "definition");
121
+ expect(gen.blocks[0])
122
+ .toBe(`\tVal: string | ${GeneratorUtilities.ExpressionString};`);
123
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def, gen, "serialised");
124
+ expect(gen.blocks[1])
125
+ .toBe(`\tval: [ "Primitive", string ] | ${GeneratorUtilities.SerialisedExpressionString};`);
126
+ });
127
+ test(" 2. Optional value.", () => {
128
+ let gen = { blocks: [], includes: new SetMap() };
129
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def2, gen, "definition");
130
+ expect(gen.blocks[0])
131
+ .toBe(`\tVal2?: number | ${GeneratorUtilities.ExpressionString};`);
132
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def2, gen, "serialised");
133
+ expect(gen.blocks[1])
134
+ .toBe(`\tval2: [ "Primitive", number ] | [ "Primitive", undefined ] | ${GeneratorUtilities.SerialisedExpressionString};`);
135
+ });
136
+ test(" 3. Map values.", () => {
137
+ let gen = { blocks: [], includes: new SetMap() };
138
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def3, gen, "definition");
139
+ expect(gen.blocks[0])
140
+ .toBe(`\tVal3?: {[key: string]: (number | ${GeneratorUtilities.ExpressionString})} | ` + GeneratorUtilities.ExpressionString + `;`);
141
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def3, gen, "serialised");
142
+ expect(gen.blocks[1])
143
+ .toBe(`\tval3: [ "Map", {[key: string]: ([ "Primitive", number ] | ${GeneratorUtilities.SerialisedExpressionString})} ] | [ "Primitive", undefined ] | ${GeneratorUtilities.SerialisedExpressionString};`);
144
+ });
145
+ test(" 4. Dict values.", () => {
146
+ let gen = { blocks: [], includes: new SetMap() };
147
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def4, gen, "definition");
148
+ expect(gen.blocks[0])
149
+ .toBe(`\tVal4?: {[key in 1 | 2 | 3]: (string | ${GeneratorUtilities.ExpressionString})} | ` + GeneratorUtilities.ExpressionString + `;`);
150
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def4, gen, "serialised");
151
+ expect(gen.blocks[1])
152
+ .toBe(`\tval4: [ "Dict", {[key in 1 | 2 | 3]: ([ "Primitive", string ] | ${GeneratorUtilities.SerialisedExpressionString})} ] | [ "Primitive", undefined ] | ${GeneratorUtilities.SerialisedExpressionString};`);
153
+ });
154
+ test(" 5. Array values.", () => {
155
+ let gen = { blocks: [], includes: new SetMap() };
156
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def5, gen, "definition");
157
+ expect(gen.blocks[0])
158
+ .toBe(`\tVal5: (string | ${GeneratorUtilities.ExpressionString})[] | ${GeneratorUtilities.ExpressionString};`);
159
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def5, gen, "serialised");
160
+ expect(gen.blocks[1])
161
+ .toBe(`\tval5: [ "Array", ([ "Primitive", string ] | ${GeneratorUtilities.SerialisedExpressionString})[] ] | ${GeneratorUtilities.SerialisedExpressionString};`);
162
+ });
163
+ test(" 6. Array2 values.", () => {
164
+ let gen = { blocks: [], includes: new SetMap() };
165
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def6, gen, "definition");
166
+ expect(gen.blocks[0])
167
+ .toBe(`\tVal6: (number | ${GeneratorUtilities.ExpressionString})[][] | ${GeneratorUtilities.ExpressionString};`);
168
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def6, gen, "serialised");
169
+ expect(gen.blocks[1])
170
+ .toBe(`\tval6: [ "Array2", ([ "Primitive", number ] | ${GeneratorUtilities.SerialisedExpressionString})[][] ] | ${GeneratorUtilities.SerialisedExpressionString};`);
171
+ });
172
+ test(" 7. Struct values.", () => {
173
+ let gen = { blocks: [], includes: new SetMap() };
174
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def7, gen, "definition");
175
+ expect(gen.blocks[0])
176
+ .toBe(`\tVal7: ${TransformersBasicStruct.name}Definition | ` + GeneratorUtilities.ExpressionString + `;`);
177
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def7, gen, "serialised");
178
+ expect(gen.blocks[1])
179
+ .toBe(`\tval7: [ "${TransformersBasicStruct.name}" | string, ${TransformersBasicStruct.name}Serialised | null ] | ${GeneratorUtilities.SerialisedExpressionString};`);
180
+ });
181
+ test(" 8. Inline class values.", () => {
182
+ let gen = { blocks: [], includes: new SetMap() };
183
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def9, gen, "definition");
184
+ expect(gen.blocks[0])
185
+ .toBe(`\tVal9: ${TransformersBasicClass.name}Definition | ` + GeneratorUtilities.ExpressionString + `;`);
186
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def9, gen, "serialised");
187
+ expect(gen.blocks[1])
188
+ .toBe(`\tval9: [ "${TransformersBasicClass.name}" | string, ${TransformersBasicClass.name}Serialised | null ] | ${GeneratorUtilities.SerialisedExpressionString};`);
189
+ });
190
+ test(" 9. Class values.", () => {
191
+ let gen = { blocks: [], includes: new SetMap() };
192
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def10, gen, "definition");
193
+ expect(gen.blocks[0])
194
+ .toBe(`\tVal10: ${TransformersBasicClass.name}Definition | ` + GeneratorUtilities.ExpressionString + `;`);
195
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def10, gen, "serialised");
196
+ expect(gen.blocks[1])
197
+ .toBe(`\tval10: ${TransformersBasicClass.name}SerialisedReference | ${GeneratorUtilities.SerialisedExpressionString};`);
198
+ });
199
+ test("10. No expressions", () => {
200
+ let gen = { blocks: [], includes: new SetMap() };
201
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def13, gen, "definition");
202
+ expect(gen.blocks[0])
203
+ .toBe(`\tVal13: number[][];`);
204
+ GeneratorUtilities.GenerateProperty(TestRepl.opts.dataTypeName, def13, gen, "serialised");
205
+ expect(gen.blocks[1])
206
+ .toBe(`\tval13: [ "Array2", [ "Primitive", number ][][] ];`);
207
+ });
208
+ });
209
+ describe("4. Generate Class", () => {
210
+ let includeDataFile = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./Examples.data.d.ts").replace(/\//g, "\\");
211
+ let includeClassFile = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./Examples.ts").replace(/\//g, "\\");
212
+ test("Class definition", () => {
213
+ let expr = GeneratorUtilities.ExpressionString;
214
+ let gen = { blocks: [], includes: new SetMap() };
215
+ GeneratorUtilities.GenerateClass(TestRepl, gen, "definition");
216
+ expect(gen.blocks[0])
217
+ .toBe(`export interface ${TestRepl.opts.dataTypeName}Definition {
218
+ Class: "${TransformersTheLotClass.name}";
219
+ Val: string | ${expr};
220
+ Val10: ${TransformersBasicClass.name}Definition | ${expr};
221
+ Val11: string | ${expr};
222
+ Val13: number[][];
223
+ Val2?: number | ${expr};
224
+ Val3?: {[key: string]: (number | ${expr})} | ${expr};
225
+ Val4?: {[key in 1 | 2 | 3]: (string | ${expr})} | ${expr};
226
+ Val5: (string | ${expr})[] | ${expr};
227
+ Val6: (number | ${expr})[][] | ${expr};
228
+ Val7: ${TransformersBasicStruct.name}Definition | ${expr};
229
+ Val8: null | number | string | ${expr};
230
+ Val9: ${TransformersBasicClass.name}Definition | ${expr};
231
+ }`.replace(/^\t{4}/gm, ""));
232
+ let imports = new SetMap();
233
+ imports.push(includeDataFile, TransformersBasicClass.name + "Definition");
234
+ imports.push(includeDataFile, TransformersBasicStruct.name + "Definition");
235
+ expect(gen.includes).toStrictEqual(imports);
236
+ });
237
+ test("Class serialised", () => {
238
+ let expr = GeneratorUtilities.SerialisedExpressionString;
239
+ let gen = { blocks: [], includes: new SetMap() };
240
+ GeneratorUtilities.GenerateClass(TestRepl, gen, "serialised");
241
+ expect(gen.blocks[0])
242
+ .toBe(`export interface ${TestRepl.opts.dataTypeName}Serialised {
243
+ version: string;
244
+ val: [ "Primitive", string ] | ${expr};
245
+ val10: ${TransformersBasicClass.name}SerialisedReference | ${expr};
246
+ val13: [ "Array2", [ "Primitive", number ][][] ];
247
+ val14: [ "Primitive", number ] | ${expr};
248
+ val2: [ "Primitive", number ] | [ "Primitive", undefined ] | ${expr};
249
+ val3: [ "Map", {[key: string]: ([ "Primitive", number ] | ${expr})} ] | [ "Primitive", undefined ] | ${expr};
250
+ val4: [ "Dict", {[key in 1 | 2 | 3]: ([ "Primitive", string ] | ${expr})} ] | [ "Primitive", undefined ] | ${expr};
251
+ val5: [ "Array", ([ "Primitive", string ] | ${expr})[] ] | ${expr};
252
+ val6: [ "Array2", ([ "Primitive", number ] | ${expr})[][] ] | ${expr};
253
+ val7: [ "${TransformersBasicStruct.name}" | string, ${TransformersBasicStruct.name}Serialised | null ] | ${expr};
254
+ val8: [ "Primitive", null ] | [ "Primitive", number ] | [ "Primitive", string ] | ${expr};
255
+ val9: [ "${TransformersBasicClass.name}" | string, ${TransformersBasicClass.name}Serialised | null ] | ${expr};
256
+ }`.replace(/^\t{4}/gm, ""));
257
+ let imports = new SetMap();
258
+ imports.push(includeDataFile, TransformersBasicClass.name + "Serialised");
259
+ imports.push(includeDataFile, TransformersBasicClass.name + "SerialisedReference");
260
+ imports.push(includeDataFile, TransformersBasicStruct.name + "Serialised");
261
+ expect(gen.includes).toStrictEqual(imports);
262
+ });
263
+ test("Class creation", () => {
264
+ let expr = GeneratorUtilities.ExpressionString;
265
+ let gen = { blocks: [], includes: new SetMap() };
266
+ GeneratorUtilities.GenerateClass(TestRepl, gen, "creation");
267
+ expect(gen.blocks[0])
268
+ .toBe(`export interface ${TestRepl.opts.dataTypeName}Creation {
269
+ Val: string | ${expr};
270
+ Val10: ${TransformersBasicClass.name} | ${TransformersBasicClass.name}Definition | ${expr};
271
+ Val11: string | ${expr};
272
+ Val13: number[][];
273
+ Val2?: number | ${expr};
274
+ Val3?: {[key: string]: (number | ${expr})} | Map<string, (number)> | ${expr};
275
+ Val4?: {[key in 1 | 2 | 3]: (string | ${expr})} | ${expr};
276
+ Val5: (string | ${expr})[] | ${expr};
277
+ Val6: (number | ${expr})[][] | ${expr};
278
+ Val7: ${TransformersBasicStruct.name} | ${TransformersBasicStruct.name}Definition | ${expr};
279
+ Val8: null | number | string | ${expr};
280
+ Val9: ${TransformersBasicClass.name} | ${TransformersBasicClass.name}Definition | ${expr};
281
+ }`.replace(/^\t{4}/gm, ""));
282
+ let imports = new SetMap();
283
+ imports.push(includeDataFile, TransformersBasicClass.name + "Definition");
284
+ imports.push(includeDataFile, TransformersBasicStruct.name + "Definition");
285
+ imports.push(includeClassFile, TransformersBasicClass.name);
286
+ imports.push(includeClassFile, TransformersBasicStruct.name);
287
+ expect(gen.includes).toStrictEqual(imports);
288
+ });
289
+ });
290
+ describe("5. GenerateClassExtends", () => {
291
+ const ChildRepl = ReplicableRegistry.__GetReplicableForDataName(TransformersBasicChild.name);
292
+ let importPath1 = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./Examples.data.d.ts").replace(/\//g, "\\");
293
+ let importPath2 = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./ExampleTerritories.ts").replace(/\//g, "\\");
294
+ test("Class extends for definition", () => {
295
+ let includes = new SetMap();
296
+ let extend = GeneratorUtilities.GenerateClassExtends(ChildRepl, includes, "definition");
297
+ expect(extend).toBe(`extends Omit<${TestRepl.opts.dataTypeName}Definition, "Class"> `);
298
+ let imports = new SetMap();
299
+ imports.push(importPath1, TestRepl.opts.dataTypeName + "Definition");
300
+ expect(includes).toStrictEqual(imports);
301
+ });
302
+ test("Class extends for serialised", () => {
303
+ let includes = new SetMap();
304
+ let extend = GeneratorUtilities.GenerateClassExtends(ChildRepl, includes, "serialised");
305
+ expect(extend).toBe(`extends ${TestRepl.opts.dataTypeName}Serialised `);
306
+ let imports = new SetMap();
307
+ imports.push(importPath1, TestRepl.opts.dataTypeName + "Serialised");
308
+ expect(includes).toStrictEqual(imports);
309
+ });
310
+ test("Class extends for creation", () => {
311
+ let includes = new SetMap();
312
+ let extend = GeneratorUtilities.GenerateClassExtends(ChildRepl, includes, "creation");
313
+ expect(extend).toBe(`extends ${TestRepl.opts.dataTypeName}Creation `);
314
+ let imports = new SetMap();
315
+ imports.push(importPath1, TestRepl.opts.dataTypeName + "Creation");
316
+ expect(includes).toStrictEqual(imports);
317
+ });
318
+ });
319
+ describe("6. GenerateDefinitionFile", () => {
320
+ let startPath = BikPath.join(BikPath.dir(BikPath.fsStyle(import.meta.url)), "./Examples.js").replace(/\//g, "\\");
321
+ let includeClassFile = "./Examples.js";
322
+ let expr = GeneratorUtilities.ExpressionString;
323
+ let sExpr = GeneratorUtilities.SerialisedExpressionString;
324
+ const MatchMultipleBlankLines = /(?:\n\t*)(?:\n\t*)+/g;
325
+ test("Definition file with the lot", () => {
326
+ let text = GeneratorUtilities.GenerateDefinitionFile(startPath, [TestRepl], undefined);
327
+ expect(text.trim().replace(MatchMultipleBlankLines, "\n")).toBe(`
328
+ import { ${TransformersBasicClass.name}, ${TransformersBasicStruct.name} } from "${includeClassFile}";
329
+ ${GeneratorUtilities.DefinitionForward}
330
+ export interface ${TestRepl.opts.dataTypeName}Definition {
331
+ Class: "${TransformersTheLotClass.name}";
332
+ Val: string | ${expr};
333
+ Val10: ${TransformersBasicClass.name}Definition | ${expr};
334
+ Val11: string | ${expr};
335
+ Val13: number[][];
336
+ Val2?: number | ${expr};
337
+ Val3?: {[key: string]: (number | ${expr})} | ${expr};
338
+ Val4?: {[key in 1 | 2 | 3]: (string | ${expr})} | ${expr};
339
+ Val5: (string | ${expr})[] | ${expr};
340
+ Val6: (number | ${expr})[][] | ${expr};
341
+ Val7: ${TransformersBasicStruct.name}Definition | ${expr};
342
+ Val8: null | number | string | ${expr};
343
+ Val9: ${TransformersBasicClass.name}Definition | ${expr};
344
+ }
345
+ export interface ${TestRepl.opts.dataTypeName}Serialised {
346
+ version: string;
347
+ val: [ "Primitive", string ] | ${sExpr};
348
+ val10: ${TransformersBasicClass.name}SerialisedReference | ${sExpr};
349
+ val13: [ "Array2", [ "Primitive", number ][][] ];
350
+ val14: [ "Primitive", number ] | ${sExpr};
351
+ val2: [ "Primitive", number ] | [ "Primitive", undefined ] | ${sExpr};
352
+ val3: [ "Map", {[key: string]: ([ "Primitive", number ] | ${sExpr})} ] | [ "Primitive", undefined ] | ${sExpr};
353
+ val4: [ "Dict", {[key in 1 | 2 | 3]: ([ "Primitive", string ] | ${sExpr})} ] | [ "Primitive", undefined ] | ${sExpr};
354
+ val5: [ "Array", ([ "Primitive", string ] | ${sExpr})[] ] | ${sExpr};
355
+ val6: [ "Array2", ([ "Primitive", number ] | ${sExpr})[][] ] | ${sExpr};
356
+ val7: [ "${TransformersBasicStruct.name}" | string, ${TransformersBasicStruct.name}Serialised | null ] | ${sExpr};
357
+ val8: [ "Primitive", null ] | [ "Primitive", number ] | [ "Primitive", string ] | ${sExpr};
358
+ val9: [ "${TransformersBasicClass.name}" | string, ${TransformersBasicClass.name}Serialised | null ] | ${sExpr};
359
+ }
360
+ export type ${TestRepl.opts.dataTypeName}SerialisedReference = [ string, ...(string | number)[] ];
361
+ export interface ${TestRepl.opts.dataTypeName}Creation {
362
+ Val: string | ${expr};
363
+ Val10: ${TransformersBasicClass.name} | ${TransformersBasicClass.name}Definition | ${expr};
364
+ Val11: string | ${expr};
365
+ Val13: number[][];
366
+ Val2?: number | ${expr};
367
+ Val3?: {[key: string]: (number | ${expr})} | Map<string, (number)> | ${expr};
368
+ Val4?: {[key in 1 | 2 | 3]: (string | ${expr})} | ${expr};
369
+ Val5: (string | ${expr})[] | ${expr};
370
+ Val6: (number | ${expr})[][] | ${expr};
371
+ Val7: ${TransformersBasicStruct.name} | ${TransformersBasicStruct.name}Definition | ${expr};
372
+ Val8: null | number | string | ${expr};
373
+ Val9: ${TransformersBasicClass.name} | ${TransformersBasicClass.name}Definition | ${expr};
374
+ }
375
+ `.replace(/^\t{4}/gm, "").trim());
376
+ });
377
+ const ChildRepl = ReplicableRegistry.__GetReplicableForDataName(TransformersBasicChild.name);
378
+ let importPath1 = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./Examples.data.d.ts").replace(/\//g, "\\");
379
+ let importPath2 = BikPath.join(BikPath.dir(BikPath.getCurrentFilepath()), "./Examples.ts").replace(/\//g, "\\");
380
+ test("Definition file with child", () => {
381
+ let text = GeneratorUtilities.GenerateDefinitionFile(startPath, [ChildRepl], undefined);
382
+ expect(text.trim().replace(MatchMultipleBlankLines, "\n")).toBe(`
383
+ // This file is automatically generated. Do not edit it, all edits will be overwritten on compile.// This file contains the typescript types for the data definitions for the corresponding
384
+ // types in the .ts file this file is named after.
385
+ export interface ${TransformersBasicChild.name}Definition extends Omit<${TransformersTheLotClass.name}Definition, "Class"> {
386
+ Class: "${TransformersBasicChild.name}";
387
+ ValX: string | ${expr};
388
+ }
389
+ export interface ${TransformersBasicChild.name}Serialised extends ${TransformersTheLotClass.name}Serialised {
390
+ version: string;
391
+ valX: [ "Primitive", string ] | [ "Expression", string ];
392
+ }
393
+ export type ${TransformersBasicChild.name}SerialisedReference = [ string, ${TransformersBasicChild.name}Serialised ];
394
+ export interface ${TransformersBasicChild.name}Creation extends ${TransformersTheLotClass.name}Creation {
395
+ ValX: string | ${expr};
396
+ }
397
+ `.replace(/^\t{4}/gm, "").trim());
398
+ });
399
+ });
400
+ });