@colyseus/schema 2.0.4 → 2.0.6

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 (107) hide show
  1. package/README.md +0 -4
  2. package/build/cjs/index.js +48 -48
  3. package/build/cjs/index.js.map +1 -1
  4. package/build/esm/index.mjs +130 -104
  5. package/build/esm/index.mjs.map +1 -1
  6. package/build/umd/index.js +50 -50
  7. package/lib/Reflection.js +87 -119
  8. package/lib/Reflection.js.map +1 -1
  9. package/lib/Schema.js +195 -257
  10. package/lib/Schema.js.map +1 -1
  11. package/lib/annotations.d.ts +6 -6
  12. package/lib/annotations.js +64 -92
  13. package/lib/annotations.js.map +1 -1
  14. package/lib/changes/ChangeTree.d.ts +1 -1
  15. package/lib/changes/ChangeTree.js +63 -70
  16. package/lib/changes/ChangeTree.js.map +1 -1
  17. package/lib/changes/ReferenceTracker.js +24 -27
  18. package/lib/changes/ReferenceTracker.js.map +1 -1
  19. package/lib/codegen/api.js +9 -9
  20. package/lib/codegen/api.js.map +1 -1
  21. package/lib/codegen/argv.d.ts +1 -1
  22. package/lib/codegen/argv.js +11 -11
  23. package/lib/codegen/argv.js.map +1 -1
  24. package/lib/codegen/cli.js +21 -10
  25. package/lib/codegen/cli.js.map +1 -1
  26. package/lib/codegen/languages/cpp.js +126 -77
  27. package/lib/codegen/languages/cpp.js.map +1 -1
  28. package/lib/codegen/languages/csharp.js +121 -62
  29. package/lib/codegen/languages/csharp.js.map +1 -1
  30. package/lib/codegen/languages/haxe.js +34 -26
  31. package/lib/codegen/languages/haxe.js.map +1 -1
  32. package/lib/codegen/languages/java.js +39 -27
  33. package/lib/codegen/languages/java.js.map +1 -1
  34. package/lib/codegen/languages/js.js +48 -32
  35. package/lib/codegen/languages/js.js.map +1 -1
  36. package/lib/codegen/languages/lua.js +35 -24
  37. package/lib/codegen/languages/lua.js.map +1 -1
  38. package/lib/codegen/languages/ts.js +63 -68
  39. package/lib/codegen/languages/ts.js.map +1 -1
  40. package/lib/codegen/parser.d.ts +9 -1
  41. package/lib/codegen/parser.js +88 -46
  42. package/lib/codegen/parser.js.map +1 -1
  43. package/lib/codegen/types.d.ts +8 -0
  44. package/lib/codegen/types.js +64 -54
  45. package/lib/codegen/types.js.map +1 -1
  46. package/lib/encoding/decode.js +15 -15
  47. package/lib/encoding/decode.js.map +1 -1
  48. package/lib/encoding/encode.js +14 -14
  49. package/lib/encoding/encode.js.map +1 -1
  50. package/lib/events/EventEmitter.d.ts +1 -1
  51. package/lib/events/EventEmitter.js +16 -47
  52. package/lib/events/EventEmitter.js.map +1 -1
  53. package/lib/filters/index.js +7 -8
  54. package/lib/filters/index.js.map +1 -1
  55. package/lib/index.js +11 -11
  56. package/lib/index.js.map +1 -1
  57. package/lib/types/ArraySchema.d.ts +1 -1
  58. package/lib/types/ArraySchema.js +161 -219
  59. package/lib/types/ArraySchema.js.map +1 -1
  60. package/lib/types/CollectionSchema.d.ts +1 -1
  61. package/lib/types/CollectionSchema.js +63 -71
  62. package/lib/types/CollectionSchema.js.map +1 -1
  63. package/lib/types/HelperTypes.d.ts +9 -9
  64. package/lib/types/MapSchema.d.ts +16 -16
  65. package/lib/types/MapSchema.js +68 -78
  66. package/lib/types/MapSchema.js.map +1 -1
  67. package/lib/types/SetSchema.js +62 -71
  68. package/lib/types/SetSchema.js.map +1 -1
  69. package/lib/types/index.js +1 -1
  70. package/lib/types/index.js.map +1 -1
  71. package/lib/types/typeRegistry.js +1 -1
  72. package/lib/types/typeRegistry.js.map +1 -1
  73. package/lib/types/utils.js +9 -10
  74. package/lib/types/utils.js.map +1 -1
  75. package/lib/utils.js +10 -13
  76. package/lib/utils.js.map +1 -1
  77. package/package.json +18 -15
  78. package/src/Reflection.ts +159 -0
  79. package/src/Schema.ts +1024 -0
  80. package/src/annotations.ts +400 -0
  81. package/src/changes/ChangeTree.ts +295 -0
  82. package/src/changes/ReferenceTracker.ts +81 -0
  83. package/src/codegen/api.ts +46 -0
  84. package/src/codegen/argv.ts +40 -0
  85. package/src/codegen/cli.ts +65 -0
  86. package/src/codegen/languages/cpp.ts +297 -0
  87. package/src/codegen/languages/csharp.ts +208 -0
  88. package/src/codegen/languages/haxe.ts +110 -0
  89. package/src/codegen/languages/java.ts +115 -0
  90. package/src/codegen/languages/js.ts +115 -0
  91. package/src/codegen/languages/lua.ts +125 -0
  92. package/src/codegen/languages/ts.ts +129 -0
  93. package/src/codegen/parser.ts +299 -0
  94. package/src/codegen/types.ts +177 -0
  95. package/src/encoding/decode.ts +278 -0
  96. package/src/encoding/encode.ts +283 -0
  97. package/src/filters/index.ts +23 -0
  98. package/src/index.ts +59 -0
  99. package/src/spec.ts +49 -0
  100. package/src/types/ArraySchema.ts +612 -0
  101. package/src/types/CollectionSchema.ts +199 -0
  102. package/src/types/HelperTypes.ts +34 -0
  103. package/src/types/MapSchema.ts +268 -0
  104. package/src/types/SetSchema.ts +208 -0
  105. package/src/types/typeRegistry.ts +19 -0
  106. package/src/types/utils.ts +62 -0
  107. package/src/utils.ts +28 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/codegen/cli.ts"],"names":[],"mappings":";;AAAA,+BAA0B;AAC1B,6BAAiC;AAEjC,IAAM,gBAAgB,GAAG;IACrB,MAAM,EAAE,uBAAuB;IAC/B,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,mBAAmB;IACzB,EAAE,EAAE,yBAAyB;IAC7B,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,mBAAmB;IACzB,GAAG,EAAE,kBAAkB;CAC1B,CAAA;AAED,SAAS,WAAW;IAChB,OAAO,CAAC,GAAG,CAAC,uPAOd,MAAM;QACJ,IAAI,CAAC,gBAAgB,CAAC;QACtB,GAAG,CAAC,UAAC,QAAQ,IAAK,OAAA,CACtB,WAAS,QAAQ,UAAK,gBAAgB,CAAC,QAAQ,CAAG,CAC7C,EAFiB,CAEjB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,oIAI+C,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,EAAE,CAAC;AACnB,CAAC;AAED,IAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,IAAI,IAAI,CAAC,IAAI,EAAE;IACX,WAAW,EAAE,CAAC;CACjB;AAED,IAAI,QAAgB,CAAC;AACrB,KAAK,IAAI,MAAM,IAAI,gBAAgB,EAAE;IACjC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;QACd,QAAQ,GAAG,MAAM,CAAC;KACrB;CACJ;AAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;IACd,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9D,WAAW,EAAE,CAAC;CACjB;AAED,IAAI;IACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACpB,cAAQ,CAAC,QAAQ,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC5B,CAAC,CAAC;CAEN;AAAC,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC;CACjB","sourcesContent":["import argv from \"./argv\";\nimport { generate } from \"./api\";\n\nconst supportedTargets = {\n csharp: 'generate for C#/Unity',\n cpp: 'generate for C++',\n haxe: 'generate for Haxe',\n ts: 'generate for TypeScript',\n js: 'generate for JavaScript',\n java: 'generate for Java',\n lua: 'generate for LUA',\n}\n\nfunction displayHelp() {\n console.log(`\\nschema-codegen [path/to/Schema.ts]\n\nUsage (C#/Unity)\n schema-codegen src/Schema.ts --output client-side/ --csharp --namespace MyGame.Schema\n\nValid options:\n --output: the output directory for generated client-side schema files\n${Object.\n keys(supportedTargets).\n map((targetId) => (\n` --${targetId}: ${supportedTargets[targetId]}`\n )).\n join(\"\\n\")}\n\nOptional:\n --namespace: generate namespace on output code\n --decorator: custom name for @type decorator to scan for`);\n process.exit();\n}\n\nconst args = argv(process.argv.slice(2));\nif (args.help) {\n displayHelp();\n}\n\nlet targetId: string;\nfor (let target in supportedTargets) {\n if (args[target]) {\n targetId = target;\n }\n}\n\nif (!args.output) {\n console.error(\"You must provide a valid --output directory.\");\n displayHelp();\n}\n\ntry {\n args.files = args._;\n generate(targetId, {\n files: args._,\n decorator: args.decorator,\n output: args.output,\n namespace: args.namespace\n });\n\n} catch (e) {\n console.error(e.message);\n console.error(e.stack);\n displayHelp();\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/codegen/cli.ts"],"names":[],"mappings":";;AAAA,iCAA0B;AAC1B,+BAAiC;AAEjC,MAAM,gBAAgB,GAAG;IACrB,MAAM,EAAE,uBAAuB;IAC/B,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,mBAAmB;IACzB,EAAE,EAAE,yBAAyB;IAC7B,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,mBAAmB;IACzB,GAAG,EAAE,kBAAkB;CAC1B,CAAA;AAED,SAAS,WAAW;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;EAOd,MAAM;QACJ,IAAI,CAAC,gBAAgB,CAAC;QACtB,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACtB,SAAS,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAC7C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC;;;;6DAI+C,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,IAAI,GAAG,IAAA,cAAI,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,IAAI,IAAI,CAAC,IAAI,EAAE;IACX,WAAW,EAAE,CAAC;CACjB;AAED,IAAI,QAAgB,CAAC;AACrB,KAAK,IAAI,MAAM,IAAI,gBAAgB,EAAE;IACjC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;QACd,QAAQ,GAAG,MAAM,CAAC;KACrB;CACJ;AAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;IACd,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9D,WAAW,EAAE,CAAC;CACjB;AAED,IAAI;IACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACpB,IAAA,cAAQ,EAAC,QAAQ,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC5B,CAAC,CAAC;CAEN;AAAC,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC;CACjB","sourcesContent":["import argv from \"./argv\";\nimport { generate } from \"./api\";\n\nconst supportedTargets = {\n csharp: 'generate for C#/Unity',\n cpp: 'generate for C++',\n haxe: 'generate for Haxe',\n ts: 'generate for TypeScript',\n js: 'generate for JavaScript',\n java: 'generate for Java',\n lua: 'generate for LUA',\n}\n\nfunction displayHelp() {\n console.log(`\\nschema-codegen [path/to/Schema.ts]\n\nUsage (C#/Unity)\n schema-codegen src/Schema.ts --output client-side/ --csharp --namespace MyGame.Schema\n\nValid options:\n --output: the output directory for generated client-side schema files\n${Object.\n keys(supportedTargets).\n map((targetId) => (\n` --${targetId}: ${supportedTargets[targetId]}`\n )).\n join(\"\\n\")}\n\nOptional:\n --namespace: generate namespace on output code\n --decorator: custom name for @type decorator to scan for`);\n process.exit();\n}\n\nconst args = argv(process.argv.slice(2));\nif (args.help) {\n displayHelp();\n}\n\nlet targetId: string;\nfor (let target in supportedTargets) {\n if (args[target]) {\n targetId = target;\n }\n}\n\nif (!args.output) {\n console.error(\"You must provide a valid --output directory.\");\n displayHelp();\n}\n\ntry {\n args.files = args._;\n generate(targetId, {\n files: args._,\n decorator: args.decorator,\n output: args.output,\n namespace: args.namespace\n });\n\n} catch (e) {\n console.error(e.message);\n console.error(e.stack);\n displayHelp();\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generate = void 0;
4
- var types_1 = require("../types");
5
- var typeMaps = {
4
+ const types_1 = require("../types");
5
+ const typeMaps = {
6
6
  "string": "string",
7
7
  "number": "varint_t",
8
8
  "boolean": "bool",
@@ -17,7 +17,7 @@ var typeMaps = {
17
17
  "float32": "float32_t",
18
18
  "float64": "float64_t",
19
19
  };
20
- var typeInitializer = {
20
+ const typeInitializer = {
21
21
  "string": '""',
22
22
  "number": "0",
23
23
  "boolean": "false",
@@ -35,24 +35,24 @@ var typeInitializer = {
35
35
  /**
36
36
  * C++ Code Generator
37
37
  */
38
- var capitalize = function (s) {
38
+ const capitalize = (s) => {
39
39
  if (typeof s !== 'string')
40
40
  return '';
41
41
  return s.charAt(0).toUpperCase() + s.slice(1);
42
42
  };
43
- var distinct = function (value, index, self) { return self.indexOf(value) === index; };
43
+ const distinct = (value, index, self) => self.indexOf(value) === index;
44
44
  function generate(context, options) {
45
- return context.classes.map(function (klass) { return ({
45
+ return context.classes.map(klass => ({
46
46
  name: klass.name + ".hpp",
47
47
  content: generateClass(klass, options.namespace, context.classes)
48
- }); });
48
+ }));
49
49
  }
50
50
  exports.generate = generate;
51
51
  function generateClass(klass, namespace, allClasses) {
52
- var propertiesPerType = {};
53
- var allRefs = [];
54
- klass.properties.forEach(function (property) {
55
- var type = property.type;
52
+ const propertiesPerType = {};
53
+ const allRefs = [];
54
+ klass.properties.forEach(property => {
55
+ let type = property.type;
56
56
  if (!propertiesPerType[type]) {
57
57
  propertiesPerType[type] = [];
58
58
  }
@@ -62,42 +62,79 @@ function generateClass(klass, namespace, allClasses) {
62
62
  allRefs.push(property);
63
63
  }
64
64
  });
65
- var allProperties = getAllProperties(klass, allClasses);
66
- var createInstanceMethod = (allRefs.length === 0) ? "" :
67
- "\tinline Schema* createInstance(std::type_index type) {\n\t\t" + generateFieldIfElseChain(allRefs, function (property) { return "type == typeid(" + property.childType + ")"; }, function (property) { return "return new " + property.childType + "();"; }, function (property) { return typeMaps[property.childType] === undefined; }) + "\n\t\treturn " + klass.extends + "::createInstance(type);\n\t}";
68
- return types_1.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.
69
- filter(function (ref) { return ref.childType && typeMaps[ref.childType] === undefined; }).
70
- map(function (ref) { return ref.childType; }).
71
- concat(types_1.getInheritanceTree(klass, allClasses, false).map(function (klass) { return klass.name; })).
65
+ const allProperties = getAllProperties(klass, allClasses);
66
+ const createInstanceMethod = (allRefs.length === 0) ? "" :
67
+ `\tinline Schema* createInstance(std::type_index type) {
68
+ \t\t${generateFieldIfElseChain(allRefs, (property) => `type == typeid(${property.childType})`, (property) => `return new ${property.childType}();`, (property) => typeMaps[property.childType] === undefined)}
69
+ \t\treturn ${klass.extends}::createInstance(type);
70
+ \t}`;
71
+ return `${(0, types_1.getCommentHeader)()}
72
+ #ifndef __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__
73
+ #define __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__ 1
74
+
75
+ #include "schema.h"
76
+ #include <typeinfo>
77
+ #include <typeindex>
78
+
79
+ ${allRefs.
80
+ filter(ref => ref.childType && typeMaps[ref.childType] === undefined).
81
+ map(ref => ref.childType).
82
+ concat((0, types_1.getInheritanceTree)(klass, allClasses, false).map(klass => klass.name)).
72
83
  filter(distinct).
73
- map(function (childType) { return "#include \"" + childType + ".hpp\""; }).
74
- join("\n") + "\n\nusing namespace colyseus::schema;\n\n" + (namespace ? "namespace " + namespace + " {" : "") + "\nclass " + klass.name + " : public " + klass.extends + " {\npublic:\n" + klass.properties.map(function (prop) { return 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(function (type) {
75
- return generateGettersAndSetters(klass, type, propertiesPerType[type]);
76
- }).
77
- join("\n") + "\n\n" + createInstanceMethod + "\n};\n" + (namespace ? "}" : "") + "\n\n#endif\n";
84
+ map(childType => `#include "${childType}.hpp"`).
85
+ join("\n")}
86
+
87
+ using namespace colyseus::schema;
88
+
89
+ ${namespace ? `namespace ${namespace} {` : ""}
90
+ class ${klass.name} : public ${klass.extends} {
91
+ public:
92
+ ${klass.properties.map(prop => generateProperty(prop)).join("\n")}
93
+
94
+ \t${klass.name}() {
95
+ \t\tthis->_indexes = ${generateAllIndexes(allProperties)};
96
+ \t\tthis->_types = ${generateAllTypes(allProperties)};
97
+ \t\tthis->_childPrimitiveTypes = ${generateAllChildPrimitiveTypes(allProperties)};
98
+ \t\tthis->_childSchemaTypes = ${generateAllChildSchemaTypes(allProperties)};
99
+ \t}
100
+
101
+ \tvirtual ~${klass.name}() {
102
+ \t\t${generateDestructors(allProperties).join("\n\t\t")}
103
+ \t}
104
+
105
+ protected:
106
+ ${Object.keys(propertiesPerType).map(type => generateGettersAndSetters(klass, type, propertiesPerType[type])).
107
+ join("\n")}
108
+
109
+ ${createInstanceMethod}
110
+ };
111
+ ${namespace ? "}" : ""}
112
+
113
+ #endif
114
+ `;
78
115
  }
79
116
  function generateProperty(prop) {
80
- var property = "";
81
- var langType;
82
- var initializer = "";
83
- var isPropPointer = "";
117
+ let property = "";
118
+ let langType;
119
+ let initializer = "";
120
+ let isPropPointer = "";
84
121
  if (prop.childType) {
85
- var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
122
+ const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
86
123
  if (prop.type === "ref") {
87
- langType = "" + prop.childType;
88
- initializer = "new " + prop.childType + "()";
124
+ langType = `${prop.childType}`;
125
+ initializer = `new ${prop.childType}()`;
89
126
  }
90
127
  else if (prop.type === "array") {
91
128
  langType = (isUpcaseFirst)
92
- ? "ArraySchema<" + prop.childType + "*>"
93
- : "ArraySchema<" + typeMaps[prop.childType] + ">";
94
- initializer = "new " + langType + "()";
129
+ ? `ArraySchema<${prop.childType}*>`
130
+ : `ArraySchema<${typeMaps[prop.childType]}>`;
131
+ initializer = `new ${langType}()`;
95
132
  }
96
133
  else if (prop.type === "map") {
97
134
  langType = (isUpcaseFirst)
98
- ? "MapSchema<" + prop.childType + "*>"
99
- : "MapSchema<" + typeMaps[prop.childType] + ">";
100
- initializer = "new " + langType + "()";
135
+ ? `MapSchema<${prop.childType}*>`
136
+ : `MapSchema<${typeMaps[prop.childType]}>`;
137
+ initializer = `new ${langType}()`;
101
138
  }
102
139
  isPropPointer = "*";
103
140
  }
@@ -105,52 +142,61 @@ function generateProperty(prop) {
105
142
  langType = typeMaps[prop.type];
106
143
  initializer = typeInitializer[prop.type];
107
144
  }
108
- property += " " + langType + " " + isPropPointer + prop.name;
109
- return "\t" + property + " = " + initializer + ";";
145
+ property += ` ${langType} ${isPropPointer}${prop.name}`;
146
+ return `\t${property} = ${initializer};`;
110
147
  }
111
148
  function generateGettersAndSetters(klass, type, properties) {
112
- var langType = typeMaps[type];
113
- var typeCast = "";
114
- var getMethodName = "get" + capitalize(type);
115
- var setMethodName = "set" + capitalize(type);
149
+ let langType = typeMaps[type];
150
+ let typeCast = "";
151
+ const getMethodName = `get${capitalize(type)}`;
152
+ const setMethodName = `set${capitalize(type)}`;
116
153
  if (type === "ref") {
117
154
  langType = "Schema*";
118
155
  }
119
156
  else if (type === "array") {
120
- langType = "ArraySchema<char*> *";
121
- typeCast = "(ArraySchema<char*> *)";
157
+ langType = `ArraySchema<char*> *`;
158
+ typeCast = `(ArraySchema<char*> *)`;
122
159
  }
123
160
  else if (type === "map") {
124
- langType = "MapSchema<char*> *";
125
- typeCast = "(MapSchema<char*> *)";
161
+ langType = `MapSchema<char*> *`;
162
+ typeCast = `(MapSchema<char*> *)`;
126
163
  }
127
- return "\tinline " + langType + " " + getMethodName + "(const string &field)\n\t{\n\t\t" + generateFieldIfElseChain(properties, function (property) { return "field == \"" + property.name + "\""; }, function (property) { return "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, function (property) { return "field == \"" + property.name + "\""; }, function (property) {
128
- var isSchemaType = (typeMaps[property.childType] === undefined);
164
+ return `\tinline ${langType} ${getMethodName}(const string &field)
165
+ \t{
166
+ \t\t${generateFieldIfElseChain(properties, (property) => `field == "${property.name}"`, (property) => `return ${typeCast}this->${property.name};`)}
167
+ \t\treturn ${klass.extends}::${getMethodName}(field);
168
+ \t}
169
+
170
+ \tinline void ${setMethodName}(const string &field, ${langType} value)
171
+ \t{
172
+ \t\t${generateFieldIfElseChain(properties, (property) => `field == "${property.name}"`, (property) => {
173
+ const isSchemaType = (typeMaps[property.childType] === undefined);
129
174
  if (type === "ref") {
130
- langType = property.childType + "*";
175
+ langType = `${property.childType}*`;
131
176
  typeCast = (isSchemaType)
132
- ? "(" + property.childType + "*)"
133
- : "/* bug? */";
177
+ ? `(${property.childType}*)`
178
+ : `/* bug? */`;
134
179
  }
135
180
  else if (type === "array") {
136
181
  typeCast = (isSchemaType)
137
- ? "(ArraySchema<" + property.childType + "*> *)"
138
- : "(ArraySchema<" + typeMaps[property.childType] + "> *)";
182
+ ? `(ArraySchema<${property.childType}*> *)`
183
+ : `(ArraySchema<${typeMaps[property.childType]}> *)`;
139
184
  }
140
185
  else if (type === "map") {
141
186
  typeCast = (isSchemaType)
142
- ? "(MapSchema<" + property.childType + "*> *)"
143
- : "(MapSchema<" + typeMaps[property.childType] + "> *)";
187
+ ? `(MapSchema<${property.childType}*> *)`
188
+ : `(MapSchema<${typeMaps[property.childType]}> *)`;
144
189
  }
145
- return "this->" + property.name + " = " + typeCast + "value;\n\t\t\treturn;";
146
- }) + "\n\t\treturn " + klass.extends + "::" + setMethodName + "(field, value);\n\t}";
190
+ return `this->${property.name} = ${typeCast}value;\n\t\t\treturn;`;
191
+ })}
192
+ \t\treturn ${klass.extends}::${setMethodName}(field, value);
193
+ \t}`;
147
194
  }
148
- function generateFieldIfElseChain(properties, ifCallback, callback, filter) {
149
- if (filter === void 0) { filter = function (_) { return true; }; }
150
- var chain = "";
151
- var uniqueChecks = [];
152
- properties.filter(filter).forEach(function (property, i) {
153
- var check = ifCallback(property);
195
+ function generateFieldIfElseChain(properties, ifCallback, callback, filter = (_) => true) {
196
+ let chain = "";
197
+ const uniqueChecks = [];
198
+ properties.filter(filter).forEach((property, i) => {
199
+ const check = ifCallback(property);
154
200
  if (uniqueChecks.indexOf(check) === -1) {
155
201
  uniqueChecks.push(check);
156
202
  }
@@ -163,49 +209,52 @@ function generateFieldIfElseChain(properties, ifCallback, callback, filter) {
163
209
  else {
164
210
  chain += " else if ";
165
211
  }
166
- chain += "(" + check + ")\n\t\t{\n\t\t\t" + callback(property) + "\n\n\t\t}";
212
+ chain += `(${check})
213
+ \t\t{
214
+ \t\t\t${callback(property)}\n
215
+ \t\t}`;
167
216
  });
168
217
  return chain;
169
218
  }
170
219
  function generateAllIndexes(properties) {
171
- return "{" + properties.map(function (property, i) { return "{" + i + ", \"" + property.name + "\"}"; }).join(", ") + "}";
220
+ return `{${properties.map((property, i) => `{${i}, "${property.name}"}`).join(", ")}}`;
172
221
  }
173
222
  function generateAllTypes(properties) {
174
- return "{" + properties.map(function (property, i) { return "{" + i + ", \"" + property.type + "\"}"; }).join(", ") + "}";
223
+ return `{${properties.map((property, i) => `{${i}, "${property.type}"}`).join(", ")}}`;
175
224
  }
176
225
  function generateAllChildSchemaTypes(properties) {
177
- return "{" + properties.map(function (property, i) {
226
+ return `{${properties.map((property, i) => {
178
227
  if (property.childType && typeMaps[property.childType] === undefined) {
179
- return "{" + i + ", typeid(" + property.childType + ")}";
228
+ return `{${i}, typeid(${property.childType})}`;
180
229
  }
181
230
  else {
182
231
  return null;
183
232
  }
184
- }).filter(function (r) { return r !== null; }).join(", ") + "}";
233
+ }).filter(r => r !== null).join(", ")}}`;
185
234
  }
186
235
  function generateAllChildPrimitiveTypes(properties) {
187
- return "{" + properties.map(function (property, i) {
236
+ return `{${properties.map((property, i) => {
188
237
  if (typeMaps[property.childType] !== undefined) {
189
- return "{" + i + ", \"" + property.childType + "\"}";
238
+ return `{${i}, "${property.childType}"}`;
190
239
  }
191
240
  else {
192
241
  return null;
193
242
  }
194
- }).filter(function (r) { return r !== null; }).join(", ") + "}";
243
+ }).filter(r => r !== null).join(", ")}}`;
195
244
  }
196
245
  function generateDestructors(properties) {
197
- return properties.map(function (property, i) {
246
+ return properties.map((property, i) => {
198
247
  if (property.childType) {
199
- return "delete this->" + property.name + ";";
248
+ return `delete this->${property.name};`;
200
249
  }
201
250
  else {
202
251
  return null;
203
252
  }
204
- }).filter(function (r) { return r !== null; });
253
+ }).filter(r => r !== null);
205
254
  }
206
255
  function getAllProperties(klass, allClasses) {
207
- var properties = [];
208
- types_1.getInheritanceTree(klass, allClasses).reverse().forEach(function (klass) {
256
+ let properties = [];
257
+ (0, types_1.getInheritanceTree)(klass, allClasses).reverse().forEach((klass) => {
209
258
  properties = properties.concat(klass.properties);
210
259
  });
211
260
  return properties;
@@ -1 +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 = {\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 = {\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) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nconst distinct = (value, index, self) => 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}"]}
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 = {\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 = {\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) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nconst distinct = (value, index, self) => 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}"]}