@colyseus/schema 4.0.1 → 4.0.2

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 (239) hide show
  1. package/build/cjs/{index.js → index.cjs} +1 -1
  2. package/build/cjs/index.cjs.map +1 -0
  3. package/build/esm/index.mjs.map +1 -1
  4. package/lib/Metadata.js +54 -58
  5. package/lib/Metadata.js.map +1 -1
  6. package/lib/Reflection.js +29 -32
  7. package/lib/Reflection.js.map +1 -1
  8. package/lib/Schema.js +41 -45
  9. package/lib/Schema.js.map +1 -1
  10. package/lib/annotations.d.ts +1 -1
  11. package/lib/annotations.js +58 -69
  12. package/lib/annotations.js.map +1 -1
  13. package/lib/bench_encode.js +24 -59
  14. package/lib/bench_encode.js.map +1 -1
  15. package/lib/benchmark.d.ts +1 -0
  16. package/lib/benchmark.js +218 -0
  17. package/lib/benchmark.js.map +1 -0
  18. package/lib/codegen/api.js +10 -41
  19. package/lib/codegen/api.js.map +1 -1
  20. package/lib/codegen/argv.js +1 -3
  21. package/lib/codegen/argv.js.map +1 -1
  22. package/lib/codegen/cli.js +4 -9
  23. package/lib/codegen/cli.js.map +1 -1
  24. package/lib/codegen/languages/cpp.js +5 -8
  25. package/lib/codegen/languages/cpp.js.map +1 -1
  26. package/lib/codegen/languages/csharp.js +5 -8
  27. package/lib/codegen/languages/csharp.js.map +1 -1
  28. package/lib/codegen/languages/haxe.js +3 -6
  29. package/lib/codegen/languages/haxe.js.map +1 -1
  30. package/lib/codegen/languages/java.js +3 -6
  31. package/lib/codegen/languages/java.js.map +1 -1
  32. package/lib/codegen/languages/js.js +4 -7
  33. package/lib/codegen/languages/js.js.map +1 -1
  34. package/lib/codegen/languages/lua.js +4 -7
  35. package/lib/codegen/languages/lua.js.map +1 -1
  36. package/lib/codegen/languages/ts.js +5 -8
  37. package/lib/codegen/languages/ts.js.map +1 -1
  38. package/lib/codegen/parser.js +22 -59
  39. package/lib/codegen/parser.js.map +1 -1
  40. package/lib/codegen/types.js +12 -51
  41. package/lib/codegen/types.js.map +1 -1
  42. package/lib/decoder/DecodeOperation.js +44 -51
  43. package/lib/decoder/DecodeOperation.js.map +1 -1
  44. package/lib/decoder/Decoder.js +24 -28
  45. package/lib/decoder/Decoder.js.map +1 -1
  46. package/lib/decoder/ReferenceTracker.js +10 -14
  47. package/lib/decoder/ReferenceTracker.js.map +1 -1
  48. package/lib/decoder/strategy/Callbacks.js +39 -43
  49. package/lib/decoder/strategy/Callbacks.js.map +1 -1
  50. package/lib/decoder/strategy/RawChanges.js +1 -4
  51. package/lib/decoder/strategy/RawChanges.js.map +1 -1
  52. package/lib/decoder/strategy/getDecoderStateCallbacks.js +24 -27
  53. package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -1
  54. package/lib/encoder/ChangeTree.js +36 -44
  55. package/lib/encoder/ChangeTree.js.map +1 -1
  56. package/lib/encoder/EncodeOperation.js +25 -32
  57. package/lib/encoder/EncodeOperation.js.map +1 -1
  58. package/lib/encoder/Encoder.js +25 -29
  59. package/lib/encoder/Encoder.js.map +1 -1
  60. package/lib/encoder/Root.js +17 -21
  61. package/lib/encoder/Root.js.map +1 -1
  62. package/lib/encoder/StateView.js +40 -45
  63. package/lib/encoder/StateView.js.map +1 -1
  64. package/lib/encoding/assert.js +3 -9
  65. package/lib/encoding/assert.js.map +1 -1
  66. package/lib/encoding/decode.js +2 -6
  67. package/lib/encoding/decode.js.map +1 -1
  68. package/lib/encoding/encode.js +1 -4
  69. package/lib/encoding/encode.js.map +1 -1
  70. package/lib/encoding/spec.js +4 -7
  71. package/lib/encoding/spec.js.map +1 -1
  72. package/lib/index.d.ts +2 -2
  73. package/lib/index.js +33 -75
  74. package/lib/index.js.map +1 -1
  75. package/lib/src/Metadata.d.ts +49 -0
  76. package/lib/src/Metadata.js +256 -0
  77. package/lib/src/Metadata.js.map +1 -0
  78. package/lib/src/Reflection.d.ts +71 -0
  79. package/lib/src/Reflection.js +179 -0
  80. package/lib/src/Reflection.js.map +1 -0
  81. package/lib/src/Schema.d.ts +86 -0
  82. package/lib/src/Schema.js +352 -0
  83. package/lib/src/Schema.js.map +1 -0
  84. package/lib/src/annotations.d.ts +109 -0
  85. package/lib/src/annotations.js +473 -0
  86. package/lib/src/annotations.js.map +1 -0
  87. package/lib/src/bench_encode.d.ts +1 -0
  88. package/lib/src/bench_encode.js +91 -0
  89. package/lib/src/bench_encode.js.map +1 -0
  90. package/lib/src/codegen/api.d.ts +7 -0
  91. package/lib/src/codegen/api.js +56 -0
  92. package/lib/src/codegen/api.js.map +1 -0
  93. package/lib/src/codegen/argv.d.ts +6 -0
  94. package/lib/src/codegen/argv.js +39 -0
  95. package/lib/src/codegen/argv.js.map +1 -0
  96. package/lib/src/codegen/cli.d.ts +1 -0
  97. package/lib/src/codegen/cli.js +58 -0
  98. package/lib/src/codegen/cli.js.map +1 -0
  99. package/lib/src/codegen/languages/cpp.d.ts +3 -0
  100. package/lib/src/codegen/languages/cpp.js +258 -0
  101. package/lib/src/codegen/languages/cpp.js.map +1 -0
  102. package/lib/src/codegen/languages/csharp.d.ts +4 -0
  103. package/lib/src/codegen/languages/csharp.js +154 -0
  104. package/lib/src/codegen/languages/csharp.js.map +1 -0
  105. package/lib/src/codegen/languages/haxe.d.ts +3 -0
  106. package/lib/src/codegen/languages/haxe.js +100 -0
  107. package/lib/src/codegen/languages/haxe.js.map +1 -0
  108. package/lib/src/codegen/languages/java.d.ts +6 -0
  109. package/lib/src/codegen/languages/java.js +100 -0
  110. package/lib/src/codegen/languages/java.js.map +1 -0
  111. package/lib/src/codegen/languages/js.d.ts +3 -0
  112. package/lib/src/codegen/languages/js.js +101 -0
  113. package/lib/src/codegen/languages/js.js.map +1 -0
  114. package/lib/src/codegen/languages/lua.d.ts +3 -0
  115. package/lib/src/codegen/languages/lua.js +103 -0
  116. package/lib/src/codegen/languages/lua.js.map +1 -0
  117. package/lib/src/codegen/languages/ts.d.ts +3 -0
  118. package/lib/src/codegen/languages/ts.js +116 -0
  119. package/lib/src/codegen/languages/ts.js.map +1 -0
  120. package/lib/src/codegen/parser.d.ts +13 -0
  121. package/lib/src/codegen/parser.js +327 -0
  122. package/lib/src/codegen/parser.js.map +1 -0
  123. package/lib/src/codegen/types.d.ts +52 -0
  124. package/lib/src/codegen/types.js +142 -0
  125. package/lib/src/codegen/types.js.map +1 -0
  126. package/lib/src/decoder/DecodeOperation.d.ts +23 -0
  127. package/lib/src/decoder/DecodeOperation.js +248 -0
  128. package/lib/src/decoder/DecodeOperation.js.map +1 -0
  129. package/lib/src/decoder/Decoder.d.ts +21 -0
  130. package/lib/src/decoder/Decoder.js +114 -0
  131. package/lib/src/decoder/Decoder.js.map +1 -0
  132. package/lib/src/decoder/ReferenceTracker.d.ts +25 -0
  133. package/lib/src/decoder/ReferenceTracker.js +135 -0
  134. package/lib/src/decoder/ReferenceTracker.js.map +1 -0
  135. package/lib/src/decoder/strategy/Callbacks.d.ts +154 -0
  136. package/lib/src/decoder/strategy/Callbacks.js +336 -0
  137. package/lib/src/decoder/strategy/Callbacks.js.map +1 -0
  138. package/lib/src/decoder/strategy/RawChanges.d.ts +3 -0
  139. package/lib/src/decoder/strategy/RawChanges.js +4 -0
  140. package/lib/src/decoder/strategy/RawChanges.js.map +1 -0
  141. package/lib/src/decoder/strategy/getDecoderStateCallbacks.d.ts +76 -0
  142. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js +274 -0
  143. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
  144. package/lib/src/encoder/ChangeTree.d.ts +135 -0
  145. package/lib/src/encoder/ChangeTree.js +534 -0
  146. package/lib/src/encoder/ChangeTree.js.map +1 -0
  147. package/lib/src/encoder/EncodeOperation.d.ts +22 -0
  148. package/lib/src/encoder/EncodeOperation.js +132 -0
  149. package/lib/src/encoder/EncodeOperation.js.map +1 -0
  150. package/lib/src/encoder/Encoder.d.ts +22 -0
  151. package/lib/src/encoder/Encoder.js +204 -0
  152. package/lib/src/encoder/Encoder.js.map +1 -0
  153. package/lib/src/encoder/Root.d.ts +28 -0
  154. package/lib/src/encoder/Root.js +229 -0
  155. package/lib/src/encoder/Root.js.map +1 -0
  156. package/lib/src/encoder/StateView.d.ts +34 -0
  157. package/lib/src/encoder/StateView.js +279 -0
  158. package/lib/src/encoder/StateView.js.map +1 -0
  159. package/lib/src/encoding/assert.d.ts +10 -0
  160. package/lib/src/encoding/assert.js +49 -0
  161. package/lib/src/encoding/assert.js.map +1 -0
  162. package/lib/src/encoding/decode.d.ts +67 -0
  163. package/lib/src/encoding/decode.js +217 -0
  164. package/lib/src/encoding/decode.js.map +1 -0
  165. package/lib/src/encoding/encode.d.ts +40 -0
  166. package/lib/src/encoding/encode.js +279 -0
  167. package/lib/src/encoding/encode.js.map +1 -0
  168. package/lib/src/encoding/spec.d.ts +24 -0
  169. package/lib/src/encoding/spec.js +26 -0
  170. package/lib/src/encoding/spec.js.map +1 -0
  171. package/lib/src/index.d.ts +32 -0
  172. package/lib/src/index.js +39 -0
  173. package/lib/src/index.js.map +1 -0
  174. package/lib/src/symbol.shim.d.ts +6 -0
  175. package/lib/src/symbol.shim.js +3 -0
  176. package/lib/src/symbol.shim.js.map +1 -0
  177. package/lib/src/types/HelperTypes.d.ts +77 -0
  178. package/lib/src/types/HelperTypes.js +2 -0
  179. package/lib/src/types/HelperTypes.js.map +1 -0
  180. package/lib/src/types/TypeContext.d.ts +31 -0
  181. package/lib/src/types/TypeContext.js +143 -0
  182. package/lib/src/types/TypeContext.js.map +1 -0
  183. package/lib/src/types/custom/ArraySchema.d.ts +270 -0
  184. package/lib/src/types/custom/ArraySchema.js +733 -0
  185. package/lib/src/types/custom/ArraySchema.js.map +1 -0
  186. package/lib/src/types/custom/CollectionSchema.d.ts +51 -0
  187. package/lib/src/types/custom/CollectionSchema.js +170 -0
  188. package/lib/src/types/custom/CollectionSchema.js.map +1 -0
  189. package/lib/src/types/custom/MapSchema.d.ts +51 -0
  190. package/lib/src/types/custom/MapSchema.js +222 -0
  191. package/lib/src/types/custom/MapSchema.js.map +1 -0
  192. package/lib/src/types/custom/SetSchema.d.ts +48 -0
  193. package/lib/src/types/custom/SetSchema.js +178 -0
  194. package/lib/src/types/custom/SetSchema.js.map +1 -0
  195. package/lib/src/types/registry.d.ts +16 -0
  196. package/lib/src/types/registry.js +30 -0
  197. package/lib/src/types/registry.js.map +1 -0
  198. package/lib/src/types/symbols.d.ts +33 -0
  199. package/lib/src/types/symbols.js +34 -0
  200. package/lib/src/types/symbols.js.map +1 -0
  201. package/lib/src/types/utils.d.ts +1 -0
  202. package/lib/src/types/utils.js +13 -0
  203. package/lib/src/types/utils.js.map +1 -0
  204. package/lib/src/utils.d.ts +13 -0
  205. package/lib/src/utils.js +49 -0
  206. package/lib/src/utils.js.map +1 -0
  207. package/lib/src/v3_bench.d.ts +1 -0
  208. package/lib/src/v3_bench.js +128 -0
  209. package/lib/src/v3_bench.js.map +1 -0
  210. package/lib/symbol.shim.js +1 -2
  211. package/lib/symbol.shim.js.map +1 -1
  212. package/lib/types/HelperTypes.js +1 -2
  213. package/lib/types/TypeContext.js +8 -12
  214. package/lib/types/TypeContext.js.map +1 -1
  215. package/lib/types/custom/ArraySchema.js +63 -67
  216. package/lib/types/custom/ArraySchema.js.map +1 -1
  217. package/lib/types/custom/CollectionSchema.js +27 -31
  218. package/lib/types/custom/CollectionSchema.js.map +1 -1
  219. package/lib/types/custom/MapSchema.js +37 -41
  220. package/lib/types/custom/MapSchema.js.map +1 -1
  221. package/lib/types/custom/SetSchema.js +28 -32
  222. package/lib/types/custom/SetSchema.js.map +1 -1
  223. package/lib/types/registry.js +13 -20
  224. package/lib/types/registry.js.map +1 -1
  225. package/lib/types/symbols.js +16 -19
  226. package/lib/types/symbols.js.map +1 -1
  227. package/lib/types/utils.js +1 -4
  228. package/lib/types/utils.js.map +1 -1
  229. package/lib/utils.js +9 -14
  230. package/lib/utils.js.map +1 -1
  231. package/lib/v3_bench.js +17 -19
  232. package/lib/v3_bench.js.map +1 -1
  233. package/package.json +9 -7
  234. package/src/codegen/api.ts +7 -0
  235. package/src/codegen/parser.ts +2 -2
  236. package/src/codegen/types.ts +5 -0
  237. package/src/index.ts +2 -2
  238. package/build/cjs/index.js.map +0 -1
  239. package/src/bench_encode.ts +0 -64
@@ -0,0 +1,258 @@
1
+ import { getCommentHeader, getInheritanceTree } from "../types";
2
+ const typeMaps = {
3
+ "string": "string",
4
+ "number": "varint_t",
5
+ "boolean": "bool",
6
+ "int8": "int8_t",
7
+ "uint8": "uint8_t",
8
+ "int16": "int16_t",
9
+ "uint16": "uint16_t",
10
+ "int32": "int32_t",
11
+ "uint32": "uint32_t",
12
+ "int64": "int64_t",
13
+ "uint64": "uint64_t",
14
+ "float32": "float32_t",
15
+ "float64": "float64_t",
16
+ };
17
+ const typeInitializer = {
18
+ "string": '""',
19
+ "number": "0",
20
+ "boolean": "false",
21
+ "int8": "0",
22
+ "uint8": "0",
23
+ "int16": "0",
24
+ "uint16": "0",
25
+ "int32": "0",
26
+ "uint32": "0",
27
+ "int64": "0",
28
+ "uint64": "0",
29
+ "float32": "0",
30
+ "float64": "0",
31
+ };
32
+ /**
33
+ * C++ Code Generator
34
+ */
35
+ const capitalize = (s) => {
36
+ if (typeof s !== 'string')
37
+ return '';
38
+ return s.charAt(0).toUpperCase() + s.slice(1);
39
+ };
40
+ const distinct = (value, index, self) => self.indexOf(value) === index;
41
+ export function generate(context, options) {
42
+ return context.classes.map(klass => ({
43
+ name: klass.name + ".hpp",
44
+ content: generateClass(klass, options.namespace, context.classes)
45
+ }));
46
+ }
47
+ function generateClass(klass, namespace, allClasses) {
48
+ const propertiesPerType = {};
49
+ const allRefs = [];
50
+ klass.properties.forEach(property => {
51
+ let type = property.type;
52
+ if (!propertiesPerType[type]) {
53
+ propertiesPerType[type] = [];
54
+ }
55
+ propertiesPerType[type].push(property);
56
+ // keep all refs list
57
+ if ((type === "ref" || type === "array" || type === "map")) {
58
+ allRefs.push(property);
59
+ }
60
+ });
61
+ const allProperties = getAllProperties(klass, allClasses);
62
+ const createInstanceMethod = (allRefs.length === 0) ? "" :
63
+ `\tinline Schema* createInstance(std::type_index type) {
64
+ \t\t${generateFieldIfElseChain(allRefs, (property) => `type == typeid(${property.childType})`, (property) => `return new ${property.childType}();`, (property) => typeMaps[property.childType] === undefined)}
65
+ \t\treturn ${klass.extends}::createInstance(type);
66
+ \t}`;
67
+ return `${getCommentHeader()}
68
+ #ifndef __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__
69
+ #define __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__ 1
70
+
71
+ #include "schema.h"
72
+ #include <typeinfo>
73
+ #include <typeindex>
74
+
75
+ ${allRefs.
76
+ filter(ref => ref.childType && typeMaps[ref.childType] === undefined).
77
+ map(ref => ref.childType).
78
+ concat(getInheritanceTree(klass, allClasses, false).map(klass => klass.name)).
79
+ filter(distinct).
80
+ map(childType => `#include "${childType}.hpp"`).
81
+ join("\n")}
82
+
83
+ using namespace colyseus::schema;
84
+
85
+ ${namespace ? `namespace ${namespace} {` : ""}
86
+ class ${klass.name} : public ${klass.extends} {
87
+ public:
88
+ ${klass.properties.map(prop => generateProperty(prop)).join("\n")}
89
+
90
+ \t${klass.name}() {
91
+ \t\tthis->_indexes = ${generateAllIndexes(allProperties)};
92
+ \t\tthis->_types = ${generateAllTypes(allProperties)};
93
+ \t\tthis->_childPrimitiveTypes = ${generateAllChildPrimitiveTypes(allProperties)};
94
+ \t\tthis->_childSchemaTypes = ${generateAllChildSchemaTypes(allProperties)};
95
+ \t}
96
+
97
+ \tvirtual ~${klass.name}() {
98
+ \t\t${generateDestructors(allProperties).join("\n\t\t")}
99
+ \t}
100
+
101
+ protected:
102
+ ${Object.keys(propertiesPerType).map(type => generateGettersAndSetters(klass, type, propertiesPerType[type])).
103
+ join("\n")}
104
+
105
+ ${createInstanceMethod}
106
+ };
107
+ ${namespace ? "}" : ""}
108
+
109
+ #endif
110
+ `;
111
+ }
112
+ function generateProperty(prop) {
113
+ let property = "";
114
+ let langType;
115
+ let initializer = "";
116
+ let isPropPointer = "";
117
+ if (prop.childType) {
118
+ const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
119
+ if (prop.type === "ref") {
120
+ langType = `${prop.childType}`;
121
+ initializer = `new ${prop.childType}()`;
122
+ }
123
+ else if (prop.type === "array") {
124
+ langType = (isUpcaseFirst)
125
+ ? `ArraySchema<${prop.childType}*>`
126
+ : `ArraySchema<${typeMaps[prop.childType]}>`;
127
+ initializer = `new ${langType}()`;
128
+ }
129
+ else if (prop.type === "map") {
130
+ langType = (isUpcaseFirst)
131
+ ? `MapSchema<${prop.childType}*>`
132
+ : `MapSchema<${typeMaps[prop.childType]}>`;
133
+ initializer = `new ${langType}()`;
134
+ }
135
+ isPropPointer = "*";
136
+ }
137
+ else {
138
+ langType = typeMaps[prop.type];
139
+ initializer = typeInitializer[prop.type];
140
+ }
141
+ property += ` ${langType} ${isPropPointer}${prop.name}`;
142
+ return `\t${property} = ${initializer};`;
143
+ }
144
+ function generateGettersAndSetters(klass, type, properties) {
145
+ let langType = typeMaps[type];
146
+ let typeCast = "";
147
+ const getMethodName = `get${capitalize(type)}`;
148
+ const setMethodName = `set${capitalize(type)}`;
149
+ if (type === "ref") {
150
+ langType = "Schema*";
151
+ }
152
+ else if (type === "array") {
153
+ langType = `ArraySchema<char*> *`;
154
+ typeCast = `(ArraySchema<char*> *)`;
155
+ }
156
+ else if (type === "map") {
157
+ langType = `MapSchema<char*> *`;
158
+ typeCast = `(MapSchema<char*> *)`;
159
+ }
160
+ return `\tinline ${langType} ${getMethodName}(const string &field)
161
+ \t{
162
+ \t\t${generateFieldIfElseChain(properties, (property) => `field == "${property.name}"`, (property) => `return ${typeCast}this->${property.name};`)}
163
+ \t\treturn ${klass.extends}::${getMethodName}(field);
164
+ \t}
165
+
166
+ \tinline void ${setMethodName}(const string &field, ${langType} value)
167
+ \t{
168
+ \t\t${generateFieldIfElseChain(properties, (property) => `field == "${property.name}"`, (property) => {
169
+ const isSchemaType = (typeMaps[property.childType] === undefined);
170
+ if (type === "ref") {
171
+ langType = `${property.childType}*`;
172
+ typeCast = (isSchemaType)
173
+ ? `(${property.childType}*)`
174
+ : `/* bug? */`;
175
+ }
176
+ else if (type === "array") {
177
+ typeCast = (isSchemaType)
178
+ ? `(ArraySchema<${property.childType}*> *)`
179
+ : `(ArraySchema<${typeMaps[property.childType]}> *)`;
180
+ }
181
+ else if (type === "map") {
182
+ typeCast = (isSchemaType)
183
+ ? `(MapSchema<${property.childType}*> *)`
184
+ : `(MapSchema<${typeMaps[property.childType]}> *)`;
185
+ }
186
+ return `this->${property.name} = ${typeCast}value;\n\t\t\treturn;`;
187
+ })}
188
+ \t\treturn ${klass.extends}::${setMethodName}(field, value);
189
+ \t}`;
190
+ }
191
+ function generateFieldIfElseChain(properties, ifCallback, callback, filter = (_) => true) {
192
+ let chain = "";
193
+ const uniqueChecks = [];
194
+ properties.filter(filter).forEach((property, i) => {
195
+ const check = ifCallback(property);
196
+ if (uniqueChecks.indexOf(check) === -1) {
197
+ uniqueChecks.push(check);
198
+ }
199
+ else {
200
+ return;
201
+ }
202
+ if (i === 0) {
203
+ chain += "if ";
204
+ }
205
+ else {
206
+ chain += " else if ";
207
+ }
208
+ chain += `(${check})
209
+ \t\t{
210
+ \t\t\t${callback(property)}\n
211
+ \t\t}`;
212
+ });
213
+ return chain;
214
+ }
215
+ function generateAllIndexes(properties) {
216
+ return `{${properties.map((property, i) => `{${i}, "${property.name}"}`).join(", ")}}`;
217
+ }
218
+ function generateAllTypes(properties) {
219
+ return `{${properties.map((property, i) => `{${i}, "${property.type}"}`).join(", ")}}`;
220
+ }
221
+ function generateAllChildSchemaTypes(properties) {
222
+ return `{${properties.map((property, i) => {
223
+ if (property.childType && typeMaps[property.childType] === undefined) {
224
+ return `{${i}, typeid(${property.childType})}`;
225
+ }
226
+ else {
227
+ return null;
228
+ }
229
+ }).filter(r => r !== null).join(", ")}}`;
230
+ }
231
+ function generateAllChildPrimitiveTypes(properties) {
232
+ return `{${properties.map((property, i) => {
233
+ if (typeMaps[property.childType] !== undefined) {
234
+ return `{${i}, "${property.childType}"}`;
235
+ }
236
+ else {
237
+ return null;
238
+ }
239
+ }).filter(r => r !== null).join(", ")}}`;
240
+ }
241
+ function generateDestructors(properties) {
242
+ return properties.map((property, i) => {
243
+ if (property.childType) {
244
+ return `delete this->${property.name};`;
245
+ }
246
+ else {
247
+ return null;
248
+ }
249
+ }).filter(r => r !== null);
250
+ }
251
+ function getAllProperties(klass, allClasses) {
252
+ let properties = [];
253
+ getInheritanceTree(klass, allClasses).reverse().forEach((klass) => {
254
+ properties = properties.concat(klass.properties);
255
+ });
256
+ return properties;
257
+ }
258
+ //# sourceMappingURL=cpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpp.js","sourceRoot":"","sources":["../../../../src/codegen/languages/cpp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, getInheritanceTree, Context } from \"../types\";\nimport { GenerateOptions } from \"../api\";\n\nconst typeMaps: { [key: string]: string } = {\n \"string\": \"string\",\n \"number\": \"varint_t\",\n \"boolean\": \"bool\",\n \"int8\": \"int8_t\",\n \"uint8\": \"uint8_t\",\n \"int16\": \"int16_t\",\n \"uint16\": \"uint16_t\",\n \"int32\": \"int32_t\",\n \"uint32\": \"uint32_t\",\n \"int64\": \"int64_t\",\n \"uint64\": \"uint64_t\",\n \"float32\": \"float32_t\",\n \"float64\": \"float64_t\",\n}\n\nconst typeInitializer: { [key: string]: string } = {\n \"string\": '\"\"',\n \"number\": \"0\",\n \"boolean\": \"false\",\n \"int8\": \"0\",\n \"uint8\": \"0\",\n \"int16\": \"0\",\n \"uint16\": \"0\",\n \"int32\": \"0\",\n \"uint32\": \"0\",\n \"int64\": \"0\",\n \"uint64\": \"0\",\n \"float32\": \"0\",\n \"float64\": \"0\",\n}\n\n/**\n * C++ Code Generator\n */\n\nconst capitalize = (s: string) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nconst distinct = (value: string, index: number, self: string[]) =>\n self.indexOf(value) === index;\n\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return context.classes.map(klass => ({\n name: klass.name + \".hpp\",\n content: generateClass(klass, options.namespace, context.classes)\n }));\n}\n\nfunction generateClass(klass: Class, namespace: string, allClasses: Class[]) {\n const propertiesPerType: {[type: string]: Property[]} = {};\n const allRefs: Property[] = [];\n klass.properties.forEach(property => {\n let type = property.type;\n\n if (!propertiesPerType[type]) {\n propertiesPerType[type] = [];\n }\n\n propertiesPerType[type].push(property);\n\n // keep all refs list\n if ((type === \"ref\" || type === \"array\" || type === \"map\")) {\n allRefs.push(property);\n }\n });\n\n const allProperties = getAllProperties(klass, allClasses);\n const createInstanceMethod = (allRefs.length === 0) ? \"\" :\n `\\tinline Schema* createInstance(std::type_index type) {\n\\t\\t${generateFieldIfElseChain(allRefs,\n (property) => `type == typeid(${property.childType})`,\n (property) => `return new ${property.childType}();`,\n (property) => typeMaps[property.childType] === undefined)}\n\\t\\treturn ${klass.extends}::createInstance(type);\n\\t}`;\n\n return `${getCommentHeader()}\n#ifndef __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__\n#define __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__ 1\n\n#include \"schema.h\"\n#include <typeinfo>\n#include <typeindex>\n\n${allRefs.\n filter(ref => ref.childType && typeMaps[ref.childType] === undefined).\n map(ref => ref.childType).\n concat(getInheritanceTree(klass, allClasses, false).map(klass => klass.name)).\n filter(distinct).\n map(childType => `#include \"${childType}.hpp\"`).\n join(\"\\n\")}\n\nusing namespace colyseus::schema;\n\n${namespace ? `namespace ${namespace} {` : \"\"}\nclass ${klass.name} : public ${klass.extends} {\npublic:\n${klass.properties.map(prop => generateProperty(prop)).join(\"\\n\")}\n\n\\t${klass.name}() {\n\\t\\tthis->_indexes = ${generateAllIndexes(allProperties)};\n\\t\\tthis->_types = ${generateAllTypes(allProperties)};\n\\t\\tthis->_childPrimitiveTypes = ${generateAllChildPrimitiveTypes(allProperties)};\n\\t\\tthis->_childSchemaTypes = ${generateAllChildSchemaTypes(allProperties)};\n\\t}\n\n\\tvirtual ~${klass.name}() {\n\\t\\t${generateDestructors(allProperties).join(\"\\n\\t\\t\")}\n\\t}\n\nprotected:\n${Object.keys(propertiesPerType).map(type =>\n generateGettersAndSetters(klass, type, propertiesPerType[type])).\n join(\"\\n\")}\n\n${createInstanceMethod}\n};\n${namespace ? \"}\" : \"\"}\n\n#endif\n`;\n}\n\nfunction generateProperty(prop: Property) {\n let property = \"\";\n let langType: string;\n let initializer = \"\";\n let isPropPointer = \"\";\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n if(prop.type === \"ref\") {\n langType = `${prop.childType}`;\n initializer = `new ${prop.childType}()`;\n\n } else if(prop.type === \"array\") {\n langType = (isUpcaseFirst)\n ? `ArraySchema<${prop.childType}*>`\n : `ArraySchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n\n } else if(prop.type === \"map\") {\n langType = (isUpcaseFirst)\n ? `MapSchema<${prop.childType}*>`\n : `MapSchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n }\n isPropPointer = \"*\";\n\n } else {\n langType = typeMaps[prop.type];\n initializer = typeInitializer[prop.type];\n }\n\n property += ` ${langType} ${isPropPointer}${prop.name}`;\n\n return `\\t${property} = ${initializer};`\n}\n\nfunction generateGettersAndSetters(klass: Class, type: string, properties: Property[]) {\n let langType = typeMaps[type];\n let typeCast = \"\";\n\n const getMethodName = `get${capitalize(type)}`;\n const setMethodName = `set${capitalize(type)}`;\n\n if (type === \"ref\") {\n langType = \"Schema*\";\n\n } else if (type === \"array\") {\n langType = `ArraySchema<char*> *`;\n typeCast = `(ArraySchema<char*> *)`;\n\n } else if (type === \"map\") {\n langType = `MapSchema<char*> *`;\n typeCast = `(MapSchema<char*> *)`;\n }\n\n return `\\tinline ${langType} ${getMethodName}(const string &field)\n\\t{\n\\t\\t${generateFieldIfElseChain(properties,\n (property) => `field == \"${property.name}\"`,\n (property) => `return ${typeCast}this->${property.name};`)}\n\\t\\treturn ${klass.extends}::${getMethodName}(field);\n\\t}\n\n\\tinline void ${setMethodName}(const string &field, ${langType} value)\n\\t{\n\\t\\t${generateFieldIfElseChain(properties,\n (property) => `field == \"${property.name}\"`,\n (property) => {\n const isSchemaType = (typeMaps[property.childType] === undefined)\n\n if (type === \"ref\") {\n langType = `${property.childType}*`;\n typeCast = (isSchemaType)\n ? `(${property.childType}*)`\n : `/* bug? */`;\n\n } else if (type === \"array\") {\n typeCast = (isSchemaType)\n ? `(ArraySchema<${property.childType}*> *)`\n : `(ArraySchema<${typeMaps[property.childType]}> *)`;\n\n } else if (type === \"map\") {\n typeCast = (isSchemaType)\n ? `(MapSchema<${property.childType}*> *)`\n : `(MapSchema<${typeMaps[property.childType]}> *)`;\n }\n\n return `this->${property.name} = ${typeCast}value;\\n\\t\\t\\treturn;`\n })}\n\\t\\treturn ${klass.extends}::${setMethodName}(field, value);\n\\t}`;\n}\n\nfunction generateFieldIfElseChain(\n properties: Property[],\n ifCallback: (property: Property) => string,\n callback: (property: Property) => string,\n filter: (property: Property) => boolean = (_) => true,\n) {\n let chain = \"\";\n\n const uniqueChecks: string[] = [];\n properties.filter(filter).forEach((property, i) => {\n const check = ifCallback(property);\n if (uniqueChecks.indexOf(check) === -1) {\n uniqueChecks.push(check);\n\n } else {\n return;\n }\n\n if (i === 0) { chain += \"if \" } else { chain += \" else if \" }\n chain += `(${check})\n\\t\\t{\n\\t\\t\\t${callback(property)}\\n\n\\t\\t}`\n });\n\n return chain;\n}\n\nfunction generateAllIndexes(properties: Property[]) {\n return `{${properties.map((property, i) => `{${i}, \"${property.name}\"}`).join(\", \")}}`\n\n}\n\nfunction generateAllTypes(properties: Property[]) {\n return `{${properties.map((property, i) => `{${i}, \"${property.type}\"}`).join(\", \")}}`\n}\n\nfunction generateAllChildSchemaTypes(properties: Property[]) {\n return `{${properties.map((property, i) => {\n if (property.childType && typeMaps[property.childType] === undefined) {\n return `{${i}, typeid(${property.childType})}`\n } else {\n return null;\n }\n }).filter(r => r !== null).join(\", \")}}`\n}\n\nfunction generateAllChildPrimitiveTypes(properties: Property[]) {\n return `{${properties.map((property, i) => {\n if (typeMaps[property.childType] !== undefined) {\n return `{${i}, \"${property.childType}\"}`\n } else {\n return null;\n }\n }).filter(r => r !== null).join(\", \")}}`\n}\n\nfunction generateDestructors(properties: Property[]) {\n return properties.map((property, i) => {\n if (property.childType) {\n return `delete this->${property.name};`;\n } else {\n return null;\n }\n }).filter(r => r !== null);\n}\n\nfunction getAllProperties (klass: Class, allClasses: Class[]) {\n let properties: Property[] = [];\n\n getInheritanceTree(klass, allClasses).reverse().forEach((klass) => {\n properties = properties.concat(klass.properties);\n });\n\n return properties;\n}"]}
@@ -0,0 +1,4 @@
1
+ import { File } from "../types";
2
+ import { GenerateOptions } from "../api";
3
+ import { Context } from "../types";
4
+ export declare function generate(context: Context, options: GenerateOptions): File[];
@@ -0,0 +1,154 @@
1
+ import { getCommentHeader, } from "../types";
2
+ const typeMaps = {
3
+ "string": "string",
4
+ "number": "float",
5
+ "boolean": "bool",
6
+ "int8": "sbyte",
7
+ "uint8": "byte",
8
+ "int16": "short",
9
+ "uint16": "ushort",
10
+ "int32": "int",
11
+ "uint32": "uint",
12
+ "int64": "long",
13
+ "uint64": "ulong",
14
+ "float32": "float",
15
+ "float64": "double",
16
+ };
17
+ /**
18
+ * C# Code Generator
19
+ */
20
+ const capitalize = (s) => {
21
+ if (typeof s !== 'string')
22
+ return '';
23
+ return s.charAt(0).toUpperCase() + s.slice(1);
24
+ };
25
+ export function generate(context, options) {
26
+ // enrich typeMaps with enums
27
+ context.enums.forEach((structure) => {
28
+ typeMaps[structure.name] = structure.name;
29
+ });
30
+ return [
31
+ ...context.classes.map(structure => ({
32
+ name: `${structure.name}.cs`,
33
+ content: generateClass(structure, options.namespace)
34
+ })),
35
+ ...context.interfaces.map(structure => ({
36
+ name: `${structure.name}.cs`,
37
+ content: generateInterface(structure, options.namespace),
38
+ })),
39
+ ...context.enums.filter(structure => structure.name !== 'OPERATION').map((structure) => ({
40
+ name: `${structure.name}.cs`,
41
+ content: generateEnum(structure, options.namespace),
42
+ })),
43
+ ];
44
+ }
45
+ function generateClass(klass, namespace) {
46
+ const indent = (namespace) ? "\t" : "";
47
+ return `${getCommentHeader()}
48
+
49
+ using Colyseus.Schema;
50
+ #if UNITY_5_3_OR_NEWER
51
+ using UnityEngine.Scripting;
52
+ #endif
53
+ ${namespace ? `\nnamespace ${namespace} {` : ""}
54
+ ${indent}public partial class ${klass.name} : ${klass.extends} {
55
+ #if UNITY_5_3_OR_NEWER
56
+ [Preserve]
57
+ #endif
58
+ public ${klass.name}() { }
59
+ ${klass.properties.map((prop) => generateProperty(prop, indent)).join("\n\n")}
60
+ ${indent}}
61
+ ${namespace ? "}" : ""}
62
+ `;
63
+ }
64
+ function generateEnum(_enum, namespace) {
65
+ const indent = namespace ? "\t" : "";
66
+ return `${getCommentHeader()}
67
+ ${namespace ? `\nnamespace ${namespace} {` : ""}
68
+ ${indent}public struct ${_enum.name} {
69
+
70
+ ${_enum.properties
71
+ .map((prop) => {
72
+ let dataType = "int";
73
+ let value;
74
+ if (prop.type) {
75
+ if (isNaN(Number(prop.type))) {
76
+ value = `"${prop.type}"`;
77
+ dataType = "string";
78
+ }
79
+ else {
80
+ value = Number(prop.type);
81
+ dataType = Number.isInteger(value) ? 'int' : 'float';
82
+ }
83
+ }
84
+ else {
85
+ value = _enum.properties.indexOf(prop);
86
+ }
87
+ return `${indent}\tpublic const ${dataType} ${prop.name} = ${value};`;
88
+ })
89
+ .join("\n")}
90
+ ${indent}}
91
+ ${namespace ? "}" : ""}`;
92
+ }
93
+ function generateProperty(prop, indent = "") {
94
+ let typeArgs = `"${prop.type}"`;
95
+ let property = "public";
96
+ let langType;
97
+ let initializer = "";
98
+ if (prop.childType) {
99
+ const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
100
+ langType = getType(prop);
101
+ typeArgs += `, typeof(${langType})`;
102
+ if (!isUpcaseFirst) {
103
+ typeArgs += `, "${prop.childType}"`;
104
+ }
105
+ initializer = `null`;
106
+ }
107
+ else {
108
+ langType = getType(prop);
109
+ initializer = `default(${langType})`;
110
+ }
111
+ property += ` ${langType} ${prop.name}`;
112
+ let ret = (prop.deprecated) ? `\t\t[System.Obsolete("field '${prop.name}' is deprecated.", true)]\n` : '';
113
+ return ret + `\t${indent}[Type(${prop.index}, ${typeArgs})]
114
+ \t${indent}${property} = ${initializer};`;
115
+ }
116
+ function generateInterface(struct, namespace) {
117
+ const indent = (namespace) ? "\t" : "";
118
+ return `${getCommentHeader()}
119
+
120
+ using Colyseus.Schema;
121
+ ${namespace ? `\nnamespace ${namespace} {` : ""}
122
+ ${indent}public class ${struct.name} {
123
+ ${struct.properties.map(prop => `\t${indent}public ${getType(prop)} ${prop.name};`).join("\n")}
124
+ ${indent}}
125
+ ${namespace ? "}" : ""}
126
+ `;
127
+ }
128
+ function getChildType(prop) {
129
+ return typeMaps[prop.childType];
130
+ }
131
+ function getType(prop) {
132
+ if (prop.childType) {
133
+ const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
134
+ let type;
135
+ if (prop.type === "ref") {
136
+ type = (isUpcaseFirst)
137
+ ? prop.childType
138
+ : getChildType(prop);
139
+ }
140
+ else {
141
+ const containerClass = capitalize(prop.type);
142
+ type = (isUpcaseFirst)
143
+ ? `${containerClass}Schema<${prop.childType}>`
144
+ : `${containerClass}Schema<${getChildType(prop)}>`;
145
+ }
146
+ return type;
147
+ }
148
+ else {
149
+ return (prop.type === "array")
150
+ ? `${typeMaps[prop.childType] || prop.childType}[]`
151
+ : typeMaps[prop.type];
152
+ }
153
+ }
154
+ //# sourceMappingURL=csharp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharp.js","sourceRoot":"","sources":["../../../../src/codegen/languages/csharp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Class,\n Property,\n File,\n getCommentHeader,\n Interface,\n Enum,\n} from \"../types\";\nimport { GenerateOptions } from \"../api\";\nimport { Context } from \"../types\";\n\nconst typeMaps: { [key: string]: string } = {\n \"string\": \"string\",\n \"number\": \"float\",\n \"boolean\": \"bool\",\n \"int8\": \"sbyte\",\n \"uint8\": \"byte\",\n \"int16\": \"short\",\n \"uint16\": \"ushort\",\n \"int32\": \"int\",\n \"uint32\": \"uint\",\n \"int64\": \"long\",\n \"uint64\": \"ulong\",\n \"float32\": \"float\",\n \"float64\": \"double\",\n}\n\n/**\n * C# Code Generator\n */\nconst capitalize = (s: string) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function generate(context: Context, options: GenerateOptions): File[] {\n // enrich typeMaps with enums\n context.enums.forEach((structure) => {\n typeMaps[structure.name] = structure.name;\n });\n return [\n ...context.classes.map(structure => ({\n name: `${structure.name}.cs`,\n content: generateClass(structure, options.namespace)\n })),\n ...context.interfaces.map(structure => ({\n name: `${structure.name}.cs`,\n content: generateInterface(structure, options.namespace),\n })),\n ...context.enums.filter(structure => structure.name !== 'OPERATION').map((structure) => ({\n name: `${structure.name}.cs`,\n content: generateEnum(structure, options.namespace),\n })),\n ];\n}\n\nfunction generateClass(klass: Class, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n\nusing Colyseus.Schema;\n#if UNITY_5_3_OR_NEWER\nusing UnityEngine.Scripting;\n#endif\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public partial class ${klass.name} : ${klass.extends} {\n#if UNITY_5_3_OR_NEWER\n[Preserve]\n#endif\npublic ${klass.name}() { }\n${klass.properties.map((prop) => generateProperty(prop, indent)).join(\"\\n\\n\")}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\n}\n\nfunction generateEnum(_enum: Enum, namespace: string) {\n const indent = namespace ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public struct ${_enum.name} {\n\n${_enum.properties\n .map((prop) => {\n let dataType: string = \"int\";\n let value: any;\n\n if(prop.type) {\n if(isNaN(Number(prop.type))) {\n value = `\"${prop.type}\"`;\n dataType = \"string\";\n } else {\n value = Number(prop.type);\n dataType = Number.isInteger(value)? 'int': 'float';\n }\n } else {\n value = _enum.properties.indexOf(prop);\n }\n return `${indent}\\tpublic const ${dataType} ${prop.name} = ${value};`;\n })\n .join(\"\\n\")}\n${indent}}\n${namespace ? \"}\" : \"\"}`\n}\n\nfunction generateProperty(prop: Property, indent: string = \"\") {\n let typeArgs = `\"${prop.type}\"`;\n let property = \"public\";\n let langType: string;\n let initializer = \"\";\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n langType = getType(prop);\n typeArgs += `, typeof(${langType})`;\n\n if (!isUpcaseFirst) {\n typeArgs += `, \"${prop.childType}\"`;\n }\n\n initializer = `null`;\n\n } else {\n langType = getType(prop);\n initializer = `default(${langType})`;\n }\n\n property += ` ${langType} ${prop.name}`;\n\n let ret = (prop.deprecated) ? `\\t\\t[System.Obsolete(\"field '${prop.name}' is deprecated.\", true)]\\n` : '';\n\n return ret + `\\t${indent}[Type(${prop.index}, ${typeArgs})]\n\\t${indent}${property} = ${initializer};`;\n}\n\nfunction generateInterface(struct: Interface, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n\nusing Colyseus.Schema;\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public class ${struct.name} {\n${struct.properties.map(prop => `\\t${indent}public ${getType(prop)} ${prop.name};`).join(\"\\n\")}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\n}\n\nfunction getChildType(prop: Property) {\n return typeMaps[prop.childType];\n}\n\nfunction getType(prop: Property) {\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n let type: string;\n\n if(prop.type === \"ref\") {\n type = (isUpcaseFirst)\n ? prop.childType\n : getChildType(prop);\n } else {\n const containerClass = capitalize(prop.type);\n type = (isUpcaseFirst)\n ? `${containerClass}Schema<${prop.childType}>`\n : `${containerClass}Schema<${getChildType(prop)}>`;\n }\n return type;\n\n } else {\n return (prop.type === \"array\")\n ? `${typeMaps[prop.childType] || prop.childType}[]`\n : typeMaps[prop.type];\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { File, Context } from "../types";
2
+ import { GenerateOptions } from "../api";
3
+ export declare function generate(context: Context, options: GenerateOptions): File[];
@@ -0,0 +1,100 @@
1
+ import { getCommentHeader } from "../types";
2
+ const typeMaps = {
3
+ "string": "String",
4
+ "number": "Dynamic",
5
+ "boolean": "Bool",
6
+ "int8": "Int",
7
+ "uint8": "UInt",
8
+ "int16": "Int",
9
+ "uint16": "UInt",
10
+ "int32": "Int",
11
+ "uint32": "UInt",
12
+ "int64": "Int",
13
+ "uint64": "UInt",
14
+ "float32": "Float",
15
+ "float64": "Float",
16
+ };
17
+ const typeInitializer = {
18
+ "string": '""',
19
+ "number": "0",
20
+ "boolean": "false",
21
+ "int8": "0",
22
+ "uint8": "0",
23
+ "int16": "0",
24
+ "uint16": "0",
25
+ "int32": "0",
26
+ "uint32": "0",
27
+ "int64": "0",
28
+ "uint64": "0",
29
+ "float32": "0",
30
+ "float64": "0",
31
+ };
32
+ export function generate(context, options) {
33
+ return context.classes.map(klass => ({
34
+ name: klass.name + ".hx",
35
+ content: generateClass(klass, options.namespace, context.classes)
36
+ }));
37
+ }
38
+ function getInheritanceTree(klass, allClasses, includeSelf = true) {
39
+ let currentClass = klass;
40
+ let inheritanceTree = [];
41
+ if (includeSelf) {
42
+ inheritanceTree.push(currentClass);
43
+ }
44
+ while (currentClass.extends !== "Schema") {
45
+ currentClass = allClasses.find(klass => klass.name == currentClass.extends);
46
+ inheritanceTree.push(currentClass);
47
+ }
48
+ return inheritanceTree;
49
+ }
50
+ function generateClass(klass, namespace, allClasses) {
51
+ return `${getCommentHeader()}
52
+
53
+ ${namespace ? `package ${namespace};` : ""}
54
+ import io.colyseus.serializer.schema.Schema;
55
+ import io.colyseus.serializer.schema.types.*;
56
+
57
+ class ${klass.name} extends ${klass.extends} {
58
+ ${klass.properties.map(prop => generateProperty(prop)).join("\n")}
59
+ }
60
+ `;
61
+ }
62
+ function generateProperty(prop) {
63
+ let langType;
64
+ let initializer = "";
65
+ let typeArgs = `"${prop.type}"`;
66
+ if (prop.childType) {
67
+ const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
68
+ if (isUpcaseFirst) {
69
+ typeArgs += `, ${prop.childType}`;
70
+ }
71
+ else {
72
+ typeArgs += `, "${prop.childType}"`;
73
+ }
74
+ if (prop.type === "ref") {
75
+ langType = `${prop.childType}`;
76
+ initializer = `new ${prop.childType}()`;
77
+ }
78
+ else if (prop.type === "array") {
79
+ langType = (isUpcaseFirst)
80
+ ? `ArraySchema<${prop.childType}>`
81
+ : `ArraySchema<${typeMaps[prop.childType]}>`;
82
+ initializer = `new ${langType}()`;
83
+ }
84
+ else if (prop.type === "map") {
85
+ langType = (isUpcaseFirst)
86
+ ? `MapSchema<${prop.childType}>`
87
+ : `MapSchema<${typeMaps[prop.childType]}>`;
88
+ initializer = `new ${langType}()`;
89
+ }
90
+ }
91
+ else {
92
+ langType = typeMaps[prop.type];
93
+ initializer = typeInitializer[prop.type];
94
+ }
95
+ // TODO: remove initializer. The callbacks at the Haxe decoder side have a
96
+ // "FIXME" comment about this on Decoder.hx
97
+ return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType} = ${initializer};\n`;
98
+ // return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType};\n`
99
+ }
100
+ //# sourceMappingURL=haxe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"haxe.js","sourceRoot":"","sources":["../../../../src/codegen/languages/haxe.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, Context } from \"../types\";\nimport { GenerateOptions } from \"../api\";\n\nconst typeMaps: { [key: string]: string } = {\n \"string\": \"String\",\n \"number\": \"Dynamic\",\n \"boolean\": \"Bool\",\n \"int8\": \"Int\",\n \"uint8\": \"UInt\",\n \"int16\": \"Int\",\n \"uint16\": \"UInt\",\n \"int32\": \"Int\",\n \"uint32\": \"UInt\",\n \"int64\": \"Int\",\n \"uint64\": \"UInt\",\n \"float32\": \"Float\",\n \"float64\": \"Float\",\n}\n\nconst typeInitializer: { [key: string]: string } = {\n \"string\": '\"\"',\n \"number\": \"0\",\n \"boolean\": \"false\",\n \"int8\": \"0\",\n \"uint8\": \"0\",\n \"int16\": \"0\",\n \"uint16\": \"0\",\n \"int32\": \"0\",\n \"uint32\": \"0\",\n \"int64\": \"0\",\n \"uint64\": \"0\",\n \"float32\": \"0\",\n \"float64\": \"0\",\n}\n\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return context.classes.map(klass => ({\n name: klass.name + \".hx\",\n content: generateClass(klass, options.namespace, context.classes)\n }));\n}\n\nfunction getInheritanceTree(klass: Class, allClasses: Class[], includeSelf: boolean = true) {\n let currentClass = klass;\n let inheritanceTree: Class[] = [];\n\n if (includeSelf) {\n inheritanceTree.push(currentClass);\n }\n\n while (currentClass.extends !== \"Schema\") {\n currentClass = allClasses.find(klass => klass.name == currentClass.extends);\n inheritanceTree.push(currentClass);\n }\n\n return inheritanceTree;\n}\n\nfunction generateClass(klass: Class, namespace: string, allClasses: Class[]) {\n return `${getCommentHeader()}\n\n${namespace ? `package ${namespace};` : \"\"}\nimport io.colyseus.serializer.schema.Schema;\nimport io.colyseus.serializer.schema.types.*;\n\nclass ${klass.name} extends ${klass.extends} {\n${klass.properties.map(prop => generateProperty(prop)).join(\"\\n\")}\n}\n`;\n}\n\nfunction generateProperty(prop: Property) {\n let langType: string;\n let initializer = \"\";\n let typeArgs = `\"${prop.type}\"`;\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n if (isUpcaseFirst) {\n typeArgs += `, ${prop.childType}`;\n\n } else {\n typeArgs += `, \"${prop.childType}\"`;\n }\n\n if(prop.type === \"ref\") {\n langType = `${prop.childType}`;\n initializer = `new ${prop.childType}()`;\n\n } else if(prop.type === \"array\") {\n langType = (isUpcaseFirst)\n ? `ArraySchema<${prop.childType}>`\n : `ArraySchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n\n } else if(prop.type === \"map\") {\n langType = (isUpcaseFirst)\n ? `MapSchema<${prop.childType}>`\n : `MapSchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n }\n\n } else {\n langType = typeMaps[prop.type];\n initializer = typeInitializer[prop.type];\n }\n\n // TODO: remove initializer. The callbacks at the Haxe decoder side have a\n // \"FIXME\" comment about this on Decoder.hx\n\n return `\\t@:type(${typeArgs})\\n\\tpublic var ${prop.name}: ${langType} = ${initializer};\\n`\n // return `\\t@:type(${typeArgs})\\n\\tpublic var ${prop.name}: ${langType};\\n`\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { File, Context } from "../types";
2
+ import { GenerateOptions } from "../api";
3
+ /**
4
+ * C# Code Generator
5
+ */
6
+ export declare function generate(context: Context, options: GenerateOptions): File[];