@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.
- package/README.md +0 -4
- package/build/cjs/index.js +48 -48
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +130 -104
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +50 -50
- package/lib/Reflection.js +87 -119
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.js +195 -257
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +6 -6
- package/lib/annotations.js +64 -92
- package/lib/annotations.js.map +1 -1
- package/lib/changes/ChangeTree.d.ts +1 -1
- package/lib/changes/ChangeTree.js +63 -70
- package/lib/changes/ChangeTree.js.map +1 -1
- package/lib/changes/ReferenceTracker.js +24 -27
- package/lib/changes/ReferenceTracker.js.map +1 -1
- package/lib/codegen/api.js +9 -9
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/argv.d.ts +1 -1
- package/lib/codegen/argv.js +11 -11
- package/lib/codegen/argv.js.map +1 -1
- package/lib/codegen/cli.js +21 -10
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/languages/cpp.js +126 -77
- package/lib/codegen/languages/cpp.js.map +1 -1
- package/lib/codegen/languages/csharp.js +121 -62
- package/lib/codegen/languages/csharp.js.map +1 -1
- package/lib/codegen/languages/haxe.js +34 -26
- package/lib/codegen/languages/haxe.js.map +1 -1
- package/lib/codegen/languages/java.js +39 -27
- package/lib/codegen/languages/java.js.map +1 -1
- package/lib/codegen/languages/js.js +48 -32
- package/lib/codegen/languages/js.js.map +1 -1
- package/lib/codegen/languages/lua.js +35 -24
- package/lib/codegen/languages/lua.js.map +1 -1
- package/lib/codegen/languages/ts.js +63 -68
- package/lib/codegen/languages/ts.js.map +1 -1
- package/lib/codegen/parser.d.ts +9 -1
- package/lib/codegen/parser.js +88 -46
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.d.ts +8 -0
- package/lib/codegen/types.js +64 -54
- package/lib/codegen/types.js.map +1 -1
- package/lib/encoding/decode.js +15 -15
- package/lib/encoding/decode.js.map +1 -1
- package/lib/encoding/encode.js +14 -14
- package/lib/encoding/encode.js.map +1 -1
- package/lib/events/EventEmitter.d.ts +1 -1
- package/lib/events/EventEmitter.js +16 -47
- package/lib/events/EventEmitter.js.map +1 -1
- package/lib/filters/index.js +7 -8
- package/lib/filters/index.js.map +1 -1
- package/lib/index.js +11 -11
- package/lib/index.js.map +1 -1
- package/lib/types/ArraySchema.d.ts +1 -1
- package/lib/types/ArraySchema.js +161 -219
- package/lib/types/ArraySchema.js.map +1 -1
- package/lib/types/CollectionSchema.d.ts +1 -1
- package/lib/types/CollectionSchema.js +63 -71
- package/lib/types/CollectionSchema.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +9 -9
- package/lib/types/MapSchema.d.ts +16 -16
- package/lib/types/MapSchema.js +68 -78
- package/lib/types/MapSchema.js.map +1 -1
- package/lib/types/SetSchema.js +62 -71
- package/lib/types/SetSchema.js.map +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/index.js.map +1 -1
- package/lib/types/typeRegistry.js +1 -1
- package/lib/types/typeRegistry.js.map +1 -1
- package/lib/types/utils.js +9 -10
- package/lib/types/utils.js.map +1 -1
- package/lib/utils.js +10 -13
- package/lib/utils.js.map +1 -1
- package/package.json +18 -15
- package/src/Reflection.ts +159 -0
- package/src/Schema.ts +1024 -0
- package/src/annotations.ts +400 -0
- package/src/changes/ChangeTree.ts +295 -0
- package/src/changes/ReferenceTracker.ts +81 -0
- package/src/codegen/api.ts +46 -0
- package/src/codegen/argv.ts +40 -0
- package/src/codegen/cli.ts +65 -0
- package/src/codegen/languages/cpp.ts +297 -0
- package/src/codegen/languages/csharp.ts +208 -0
- package/src/codegen/languages/haxe.ts +110 -0
- package/src/codegen/languages/java.ts +115 -0
- package/src/codegen/languages/js.ts +115 -0
- package/src/codegen/languages/lua.ts +125 -0
- package/src/codegen/languages/ts.ts +129 -0
- package/src/codegen/parser.ts +299 -0
- package/src/codegen/types.ts +177 -0
- package/src/encoding/decode.ts +278 -0
- package/src/encoding/encode.ts +283 -0
- package/src/filters/index.ts +23 -0
- package/src/index.ts +59 -0
- package/src/spec.ts +49 -0
- package/src/types/ArraySchema.ts +612 -0
- package/src/types/CollectionSchema.ts +199 -0
- package/src/types/HelperTypes.ts +34 -0
- package/src/types/MapSchema.ts +268 -0
- package/src/types/SetSchema.ts +208 -0
- package/src/types/typeRegistry.ts +19 -0
- package/src/types/utils.ts +62 -0
- package/src/utils.ts +28 -0
|
@@ -1,29 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
-
if (!m) return o;
|
|
5
|
-
var i = m.call(o), r, ar = [], e;
|
|
6
|
-
try {
|
|
7
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
-
}
|
|
9
|
-
catch (error) { e = { error: error }; }
|
|
10
|
-
finally {
|
|
11
|
-
try {
|
|
12
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
-
}
|
|
14
|
-
finally { if (e) throw e.error; }
|
|
15
|
-
}
|
|
16
|
-
return ar;
|
|
17
|
-
};
|
|
18
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
19
|
-
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
20
|
-
to[j] = from[i];
|
|
21
|
-
return to;
|
|
22
|
-
};
|
|
23
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
3
|
exports.generate = void 0;
|
|
25
|
-
|
|
26
|
-
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const typeMaps = {
|
|
27
6
|
"string": "string",
|
|
28
7
|
"number": "float",
|
|
29
8
|
"boolean": "bool",
|
|
@@ -41,89 +20,169 @@ var typeMaps = {
|
|
|
41
20
|
/**
|
|
42
21
|
* C# Code Generator
|
|
43
22
|
*/
|
|
44
|
-
|
|
23
|
+
const capitalize = (s) => {
|
|
45
24
|
if (typeof s !== 'string')
|
|
46
25
|
return '';
|
|
47
26
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
48
27
|
};
|
|
49
28
|
function generate(context, options) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
29
|
+
// enrich typeMaps with enums
|
|
30
|
+
context.enums.forEach((structure) => {
|
|
31
|
+
typeMaps[structure.name] = structure.name;
|
|
32
|
+
});
|
|
33
|
+
return [
|
|
34
|
+
...context.classes.map(structure => ({
|
|
35
|
+
name: `${structure.name}.cs`,
|
|
36
|
+
content: generateClass(structure, options.namespace)
|
|
37
|
+
})),
|
|
38
|
+
...context.interfaces.map(structure => ({
|
|
39
|
+
name: `${structure.name}.cs`,
|
|
40
|
+
content: generateInterface(structure, options.namespace),
|
|
41
|
+
})),
|
|
42
|
+
...context.enums.filter(structure => structure.name !== 'OPERATION').map((structure) => ({
|
|
43
|
+
name: `${structure.name}.cs`,
|
|
44
|
+
content: generateEnum(structure, options.namespace),
|
|
45
|
+
})),
|
|
46
|
+
];
|
|
57
47
|
}
|
|
58
48
|
exports.generate = generate;
|
|
59
49
|
function generateClass(klass, namespace) {
|
|
60
|
-
|
|
61
|
-
return
|
|
50
|
+
const indent = (namespace) ? "\t" : "";
|
|
51
|
+
return `${(0, types_1.getCommentHeader)()}
|
|
52
|
+
|
|
53
|
+
using Colyseus.Schema;
|
|
54
|
+
using Action = System.Action;
|
|
55
|
+
${namespace ? `\nnamespace ${namespace} {` : ""}
|
|
56
|
+
${indent}public partial class ${klass.name} : ${klass.extends} {
|
|
57
|
+
${klass.properties.map((prop) => generateProperty(prop, indent)).join("\n\n")}
|
|
58
|
+
|
|
59
|
+
${indent}\t/*
|
|
60
|
+
${indent}\t * Support for individual property change callbacks below...
|
|
61
|
+
${indent}\t */
|
|
62
|
+
|
|
63
|
+
${generateAllFieldCallbacks(klass, indent)}
|
|
64
|
+
${indent}}
|
|
65
|
+
${namespace ? "}" : ""}
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
function generateEnum(_enum, namespace) {
|
|
69
|
+
const indent = namespace ? "\t" : "";
|
|
70
|
+
return `${(0, types_1.getCommentHeader)()}
|
|
71
|
+
${namespace ? `\nnamespace ${namespace} {` : ""}
|
|
72
|
+
${indent}public struct ${_enum.name} {
|
|
73
|
+
|
|
74
|
+
${_enum.properties
|
|
75
|
+
.map((prop) => {
|
|
76
|
+
let dataType = "int";
|
|
77
|
+
let value;
|
|
78
|
+
if (prop.type) {
|
|
79
|
+
if (isNaN(Number(prop.type))) {
|
|
80
|
+
value = prop.type;
|
|
81
|
+
dataType = "string";
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
value = Number(prop.type);
|
|
85
|
+
dataType = Number.isInteger(value) ? 'int' : 'float';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
value = _enum.properties.indexOf(prop);
|
|
90
|
+
}
|
|
91
|
+
return `${indent}\tpublic const ${dataType} ${prop.name} = ${value};`;
|
|
92
|
+
})
|
|
93
|
+
.join("\n")}
|
|
94
|
+
${indent}}`;
|
|
62
95
|
}
|
|
63
|
-
function generateProperty(prop, indent) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
var initializer = "";
|
|
96
|
+
function generateProperty(prop, indent = "") {
|
|
97
|
+
let typeArgs = `"${prop.type}"`;
|
|
98
|
+
let property = "public";
|
|
99
|
+
let langType;
|
|
100
|
+
let initializer = "";
|
|
69
101
|
if (prop.childType) {
|
|
70
|
-
|
|
102
|
+
const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
71
103
|
langType = getType(prop);
|
|
72
|
-
typeArgs +=
|
|
104
|
+
typeArgs += `, typeof(${langType})`;
|
|
73
105
|
if (!isUpcaseFirst) {
|
|
74
|
-
typeArgs +=
|
|
106
|
+
typeArgs += `, "${prop.childType}"`;
|
|
75
107
|
}
|
|
76
|
-
initializer =
|
|
108
|
+
initializer = `new ${langType}()`;
|
|
77
109
|
}
|
|
78
110
|
else {
|
|
79
111
|
langType = getType(prop);
|
|
80
|
-
initializer =
|
|
112
|
+
initializer = `default(${langType})`;
|
|
81
113
|
}
|
|
82
|
-
property +=
|
|
83
|
-
|
|
84
|
-
return ret +
|
|
114
|
+
property += ` ${langType} ${prop.name}`;
|
|
115
|
+
let ret = (prop.deprecated) ? `\t\t[System.Obsolete("field '${prop.name}' is deprecated.", true)]\n` : '';
|
|
116
|
+
return ret + `\t${indent}[Type(${prop.index}, ${typeArgs})]
|
|
117
|
+
\t${indent}${property} = ${initializer};`;
|
|
85
118
|
}
|
|
86
119
|
function generateInterface(struct, namespace) {
|
|
87
|
-
|
|
88
|
-
return
|
|
120
|
+
const indent = (namespace) ? "\t" : "";
|
|
121
|
+
return `${(0, types_1.getCommentHeader)()}
|
|
122
|
+
|
|
123
|
+
using Colyseus.Schema;
|
|
124
|
+
${namespace ? `\nnamespace ${namespace} {` : ""}
|
|
125
|
+
${indent}public class ${struct.name} {
|
|
126
|
+
${struct.properties.map(prop => `\t${indent}public ${getType(prop)} ${prop.name};`).join("\n")}
|
|
127
|
+
${indent}}
|
|
128
|
+
${namespace ? "}" : ""}
|
|
129
|
+
`;
|
|
89
130
|
}
|
|
90
131
|
function generateAllFieldCallbacks(klass, indent) {
|
|
91
132
|
//
|
|
92
133
|
// TODO: improve me. It would be great to generate less boilerplate in favor
|
|
93
134
|
// of a single implementation on C# Schema class itself.
|
|
94
135
|
//
|
|
95
|
-
|
|
96
|
-
return klass.properties
|
|
97
|
-
|
|
136
|
+
const eventNames = [];
|
|
137
|
+
return `${klass.properties
|
|
138
|
+
.filter(prop => !prop.deprecated) // generate only for properties that haven't been deprecated.
|
|
139
|
+
.map(prop => {
|
|
140
|
+
const eventName = `_${prop.name}Change`;
|
|
98
141
|
eventNames.push(eventName);
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
142
|
+
return `\t${indent}protected event PropertyChangeHandler<${getType(prop)}> ${eventName};
|
|
143
|
+
\t${indent}public Action On${capitalize(prop.name)}Change(PropertyChangeHandler<${getType(prop)}> handler) {
|
|
144
|
+
\t${indent}\tif (__callbacks == null) { __callbacks = new SchemaCallbacks(); }
|
|
145
|
+
\t${indent}\t__callbacks.AddPropertyCallback(nameof(${prop.name}));
|
|
146
|
+
\t${indent}\t${eventName} += handler;
|
|
147
|
+
\t${indent}\treturn () => {
|
|
148
|
+
\t${indent}\t\t__callbacks.RemovePropertyCallback(nameof(${prop.name}));
|
|
149
|
+
\t${indent}\t\t${eventName} -= handler;
|
|
150
|
+
\t${indent}\t};
|
|
151
|
+
\t${indent}}`;
|
|
152
|
+
}).join("\n\n")}
|
|
153
|
+
|
|
154
|
+
\t${indent}protected override void TriggerFieldChange(DataChange change) {
|
|
155
|
+
\t${indent}\tswitch (change.Field) {
|
|
156
|
+
${klass.properties.filter(prop => !prop.deprecated).map((prop, i) => {
|
|
157
|
+
return `\t${indent}\t\tcase nameof(${prop.name}): ${eventNames[i]}?.Invoke((${getType(prop)}) change.Value, (${getType(prop)}) change.PreviousValue); break;`;
|
|
158
|
+
}).join("\n")}
|
|
159
|
+
\t${indent}\t\tdefault: break;
|
|
160
|
+
\t\t${indent}}
|
|
161
|
+
\t${indent}}`;
|
|
103
162
|
}
|
|
104
163
|
function getChildType(prop) {
|
|
105
164
|
return typeMaps[prop.childType];
|
|
106
165
|
}
|
|
107
166
|
function getType(prop) {
|
|
108
167
|
if (prop.childType) {
|
|
109
|
-
|
|
110
|
-
|
|
168
|
+
const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
169
|
+
let type;
|
|
111
170
|
if (prop.type === "ref") {
|
|
112
171
|
type = (isUpcaseFirst)
|
|
113
172
|
? prop.childType
|
|
114
173
|
: getChildType(prop);
|
|
115
174
|
}
|
|
116
175
|
else {
|
|
117
|
-
|
|
176
|
+
const containerClass = capitalize(prop.type);
|
|
118
177
|
type = (isUpcaseFirst)
|
|
119
|
-
? containerClass
|
|
120
|
-
: containerClass
|
|
178
|
+
? `${containerClass}Schema<${prop.childType}>`
|
|
179
|
+
: `${containerClass}Schema<${getChildType(prop)}>`;
|
|
121
180
|
}
|
|
122
181
|
return type;
|
|
123
182
|
}
|
|
124
183
|
else {
|
|
125
184
|
return (prop.type === "array")
|
|
126
|
-
?
|
|
185
|
+
? `${typeMaps[prop.childType] || prop.childType}[]`
|
|
127
186
|
: typeMaps[prop.type];
|
|
128
187
|
}
|
|
129
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csharp.js","sourceRoot":"","sources":["../../../src/codegen/languages/csharp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, Interface } from \"../types\";\nimport { GenerateOptions } from \"../api\";\nimport { Context } from \"../types\";\n\nconst typeMaps = {\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) => {\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 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 ];\n}\n\nfunction generateClass(klass: Class, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n\nusing Colyseus.Schema;\nusing Action = System.Action;\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public partial class ${klass.name} : ${klass.extends} {\n${klass.properties.map(prop => generateProperty(prop, indent)).join(\"\\n\\n\")}\n\n${indent}\\t/*\n${indent}\\t * Support for individual property change callbacks below...\n${indent}\\t */\n\n${generateAllFieldCallbacks(klass, indent)}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\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 = `new ${langType}()`;\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 generateAllFieldCallbacks(klass: Class, indent: string) {\n //\n // TODO: improve me. It would be great to generate less boilerplate in favor\n // of a single implementation on C# Schema class itself.\n //\n const eventNames: string[] = [];\n return `${klass.properties.map(prop => {\n const eventName = `_${prop.name}Change`;\n eventNames.push(eventName);\n return `\\t${indent}protected event PropertyChangeHandler<${getType(prop)}> ${eventName};\n\\t${indent}public Action On${capitalize(prop.name)}Change(PropertyChangeHandler<${getType(prop)}> handler) {\n\\t${indent}\\tif (__callbacks == null) { __callbacks = new SchemaCallbacks(); }\n\\t${indent}\\t__callbacks.AddPropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t${eventName} += handler;\n\\t${indent}\\treturn () => {\n\\t${indent}\\t\\t__callbacks.RemovePropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t\\t${eventName} -= handler;\n\\t${indent}\\t};\n\\t${indent}}`;\n }).join(\"\\n\\n\")}\n\n\\t${indent}protected override void TriggerFieldChange(DataChange change) {\n\\t${indent}\\tswitch (change.Field) {\n${klass.properties.map((prop, i) => {\n return `\\t${indent}\\t\\tcase nameof(${prop.name}): ${eventNames[i]}?.Invoke((${getType(prop)}) change.Value, (${getType(prop)}) change.PreviousValue); break;`;\n}).join(\"\\n\")}\n\\t${indent}\\t\\tdefault: break;\n\\t\\t${indent}}\n\\t${indent}}`;\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}"]}
|
|
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 = {\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) => {\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;\nusing Action = System.Action;\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public partial class ${klass.name} : ${klass.extends} {\n${klass.properties.map((prop) => generateProperty(prop, indent)).join(\"\\n\\n\")}\n\n${indent}\\t/*\n${indent}\\t * Support for individual property change callbacks below...\n${indent}\\t */\n\n${generateAllFieldCallbacks(klass, indent)}\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}\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 = `new ${langType}()`;\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 generateAllFieldCallbacks(klass: Class, indent: string) {\n //\n // TODO: improve me. It would be great to generate less boilerplate in favor\n // of a single implementation on C# Schema class itself.\n //\n const eventNames: string[] = [];\n return `${klass.properties\n .filter(prop => !prop.deprecated) // generate only for properties that haven't been deprecated.\n .map(prop => {\n const eventName = `_${prop.name}Change`;\n eventNames.push(eventName);\n return `\\t${indent}protected event PropertyChangeHandler<${getType(prop)}> ${eventName};\n\\t${indent}public Action On${capitalize(prop.name)}Change(PropertyChangeHandler<${getType(prop)}> handler) {\n\\t${indent}\\tif (__callbacks == null) { __callbacks = new SchemaCallbacks(); }\n\\t${indent}\\t__callbacks.AddPropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t${eventName} += handler;\n\\t${indent}\\treturn () => {\n\\t${indent}\\t\\t__callbacks.RemovePropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t\\t${eventName} -= handler;\n\\t${indent}\\t};\n\\t${indent}}`;\n }).join(\"\\n\\n\")}\n\n\\t${indent}protected override void TriggerFieldChange(DataChange change) {\n\\t${indent}\\tswitch (change.Field) {\n${klass.properties.filter(prop => !prop.deprecated).map((prop, i) => {\n return `\\t${indent}\\t\\tcase nameof(${prop.name}): ${eventNames[i]}?.Invoke((${getType(prop)}) change.Value, (${getType(prop)}) change.PreviousValue); break;`;\n}).join(\"\\n\")}\n\\t${indent}\\t\\tdefault: break;\n\\t\\t${indent}}\n\\t${indent}}`;\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}"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generate = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const typeMaps = {
|
|
6
6
|
"string": "String",
|
|
7
7
|
"number": "Dynamic",
|
|
8
8
|
"boolean": "Bool",
|
|
@@ -17,7 +17,7 @@ var typeMaps = {
|
|
|
17
17
|
"float32": "Float",
|
|
18
18
|
"float64": "Float",
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
const typeInitializer = {
|
|
21
21
|
"string": '""',
|
|
22
22
|
"number": "0",
|
|
23
23
|
"boolean": "false",
|
|
@@ -33,61 +33,69 @@ var typeInitializer = {
|
|
|
33
33
|
"float64": "0",
|
|
34
34
|
};
|
|
35
35
|
function generate(context, options) {
|
|
36
|
-
return context.classes.map(
|
|
36
|
+
return context.classes.map(klass => ({
|
|
37
37
|
name: klass.name + ".hx",
|
|
38
38
|
content: generateClass(klass, options.namespace, context.classes)
|
|
39
|
-
})
|
|
39
|
+
}));
|
|
40
40
|
}
|
|
41
41
|
exports.generate = generate;
|
|
42
|
-
function getInheritanceTree(klass, allClasses, includeSelf) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
var inheritanceTree = [];
|
|
42
|
+
function getInheritanceTree(klass, allClasses, includeSelf = true) {
|
|
43
|
+
let currentClass = klass;
|
|
44
|
+
let inheritanceTree = [];
|
|
46
45
|
if (includeSelf) {
|
|
47
46
|
inheritanceTree.push(currentClass);
|
|
48
47
|
}
|
|
49
48
|
while (currentClass.extends !== "Schema") {
|
|
50
|
-
currentClass = allClasses.find(
|
|
49
|
+
currentClass = allClasses.find(klass => klass.name == currentClass.extends);
|
|
51
50
|
inheritanceTree.push(currentClass);
|
|
52
51
|
}
|
|
53
52
|
return inheritanceTree;
|
|
54
53
|
}
|
|
55
54
|
function generateClass(klass, namespace, allClasses) {
|
|
56
|
-
return types_1.getCommentHeader
|
|
55
|
+
return `${(0, types_1.getCommentHeader)()}
|
|
56
|
+
|
|
57
|
+
${namespace ? `package ${namespace};` : ""}
|
|
58
|
+
import io.colyseus.serializer.schema.Schema;
|
|
59
|
+
import io.colyseus.serializer.schema.types.*;
|
|
60
|
+
|
|
61
|
+
class ${klass.name} extends ${klass.extends} {
|
|
62
|
+
${klass.properties.map(prop => generateProperty(prop)).join("\n")}
|
|
63
|
+
}
|
|
64
|
+
`;
|
|
57
65
|
}
|
|
58
66
|
function generateProperty(prop) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
67
|
+
let langType;
|
|
68
|
+
let initializer = "";
|
|
69
|
+
let typeArgs = `"${prop.type}"`;
|
|
62
70
|
if (prop.childType) {
|
|
63
|
-
|
|
71
|
+
const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
64
72
|
if (isUpcaseFirst) {
|
|
65
|
-
typeArgs +=
|
|
73
|
+
typeArgs += `, ${prop.childType}`;
|
|
66
74
|
}
|
|
67
75
|
else {
|
|
68
|
-
typeArgs +=
|
|
76
|
+
typeArgs += `, "${prop.childType}"`;
|
|
69
77
|
}
|
|
70
78
|
if (prop.type === "ref") {
|
|
71
|
-
langType =
|
|
72
|
-
initializer =
|
|
79
|
+
langType = `${prop.childType}`;
|
|
80
|
+
initializer = `new ${prop.childType}()`;
|
|
73
81
|
}
|
|
74
82
|
else if (prop.type === "array") {
|
|
75
83
|
langType = (isUpcaseFirst)
|
|
76
|
-
?
|
|
77
|
-
:
|
|
78
|
-
initializer =
|
|
84
|
+
? `ArraySchema<${prop.childType}>`
|
|
85
|
+
: `ArraySchema<${typeMaps[prop.childType]}>`;
|
|
86
|
+
initializer = `new ${langType}()`;
|
|
79
87
|
}
|
|
80
88
|
else if (prop.type === "map") {
|
|
81
89
|
langType = (isUpcaseFirst)
|
|
82
|
-
?
|
|
83
|
-
:
|
|
84
|
-
initializer =
|
|
90
|
+
? `MapSchema<${prop.childType}>`
|
|
91
|
+
: `MapSchema<${typeMaps[prop.childType]}>`;
|
|
92
|
+
initializer = `new ${langType}()`;
|
|
85
93
|
}
|
|
86
94
|
}
|
|
87
95
|
else {
|
|
88
96
|
langType = typeMaps[prop.type];
|
|
89
97
|
initializer = typeInitializer[prop.type];
|
|
90
98
|
}
|
|
91
|
-
return
|
|
99
|
+
return `\t@:type(${typeArgs})\n\tpublic var ${prop.name}: ${langType} = ${initializer};\n`;
|
|
92
100
|
}
|
|
93
101
|
//# sourceMappingURL=haxe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haxe.js","sourceRoot":"","sources":["../../../src/codegen/languages/haxe.ts"],"names":[],"mappings":";;;AAAA,
|
|
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 = {\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 = {\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 return `\\t@:type(${typeArgs})\\n\\tpublic var ${prop.name}: ${langType} = ${initializer};\\n`\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
|
-
|
|
5
|
-
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const typeMaps = {
|
|
6
6
|
"string": "String",
|
|
7
7
|
"number": "float",
|
|
8
8
|
"boolean": "boolean",
|
|
@@ -17,7 +17,7 @@ var typeMaps = {
|
|
|
17
17
|
"float32": "float",
|
|
18
18
|
"float64": "double",
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
const typeInitializer = {
|
|
21
21
|
"string": '""',
|
|
22
22
|
"number": "0",
|
|
23
23
|
"boolean": "false",
|
|
@@ -36,57 +36,69 @@ var typeInitializer = {
|
|
|
36
36
|
* C# Code Generator
|
|
37
37
|
*/
|
|
38
38
|
function generate(context, options) {
|
|
39
|
-
return context.classes.map(
|
|
39
|
+
return context.classes.map(klass => ({
|
|
40
40
|
name: klass.name + ".java",
|
|
41
41
|
content: generateClass(klass, options.namespace)
|
|
42
|
-
})
|
|
42
|
+
}));
|
|
43
43
|
}
|
|
44
44
|
exports.generate = generate;
|
|
45
45
|
function generateClass(klass, namespace) {
|
|
46
|
-
|
|
47
|
-
return
|
|
46
|
+
const indent = (namespace) ? "\t" : "";
|
|
47
|
+
return `${(0, types_1.getCommentHeader)()}
|
|
48
|
+
${namespace ? `\npackage ${namespace};` : ""}
|
|
49
|
+
|
|
50
|
+
import io.colyseus.serializer.schema.Schema;
|
|
51
|
+
import io.colyseus.serializer.schema.annotations.SchemaClass;
|
|
52
|
+
import io.colyseus.serializer.schema.annotations.SchemaField;
|
|
53
|
+
|
|
54
|
+
@SchemaClass
|
|
55
|
+
${indent}public class ${klass.name} extends ${klass.extends} {
|
|
56
|
+
${klass.properties.map(prop => generateProperty(prop, indent)).join("\n\n")}
|
|
57
|
+
${indent}}
|
|
58
|
+
${namespace ? "}" : ""}
|
|
59
|
+
`;
|
|
48
60
|
}
|
|
49
|
-
function generateProperty(prop, indent) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
var initializer = "";
|
|
61
|
+
function generateProperty(prop, indent = "") {
|
|
62
|
+
let typeArgs = `${prop.index}/${prop.type}`;
|
|
63
|
+
let property = "public";
|
|
64
|
+
let langType;
|
|
65
|
+
let ctorArgs = "";
|
|
66
|
+
let initializer = "";
|
|
56
67
|
if (prop.childType) {
|
|
57
|
-
|
|
68
|
+
const isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
58
69
|
if (prop.type !== "ref" && isUpcaseFirst) {
|
|
59
|
-
ctorArgs = prop.childType
|
|
70
|
+
ctorArgs = `${prop.childType}.class`;
|
|
60
71
|
}
|
|
61
72
|
if (prop.type === "ref") {
|
|
62
73
|
langType = (isUpcaseFirst)
|
|
63
74
|
? prop.childType
|
|
64
75
|
: typeMaps[prop.childType];
|
|
65
|
-
initializer =
|
|
76
|
+
initializer = `new ${langType}${(prop.type !== "ref" && isUpcaseFirst) ? "<>" : ""}(${ctorArgs})`;
|
|
66
77
|
}
|
|
67
78
|
else if (prop.type === "array") {
|
|
68
79
|
langType = (isUpcaseFirst)
|
|
69
|
-
?
|
|
70
|
-
:
|
|
71
|
-
initializer =
|
|
80
|
+
? `ArraySchema<${prop.childType}>`
|
|
81
|
+
: `ArraySchema`;
|
|
82
|
+
initializer = `new ArraySchema${(isUpcaseFirst) ? "<>" : ""}(${ctorArgs})`;
|
|
72
83
|
}
|
|
73
84
|
else if (prop.type === "map") {
|
|
74
85
|
langType = (isUpcaseFirst)
|
|
75
|
-
?
|
|
76
|
-
:
|
|
77
|
-
initializer =
|
|
86
|
+
? `MapSchema<${prop.childType}>`
|
|
87
|
+
: `MapSchema`;
|
|
88
|
+
initializer = `new MapSchema${(isUpcaseFirst) ? "<>" : ""}(${ctorArgs})`;
|
|
78
89
|
}
|
|
79
90
|
if (prop.type !== "ref") {
|
|
80
91
|
typeArgs += (isUpcaseFirst)
|
|
81
|
-
?
|
|
82
|
-
:
|
|
92
|
+
? `/ref`
|
|
93
|
+
: `/${prop.childType}`;
|
|
83
94
|
}
|
|
84
95
|
}
|
|
85
96
|
else {
|
|
86
97
|
langType = typeMaps[prop.type];
|
|
87
98
|
initializer = typeInitializer[prop.type];
|
|
88
99
|
}
|
|
89
|
-
property +=
|
|
90
|
-
return
|
|
100
|
+
property += ` ${langType} ${prop.name}`;
|
|
101
|
+
return `\t@SchemaField("${typeArgs}")\t${indent}
|
|
102
|
+
\t${indent}${property} = ${initializer};`;
|
|
91
103
|
}
|
|
92
104
|
//# sourceMappingURL=java.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/codegen/languages/java.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/codegen/languages/java.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, Context } from \"../types\";\nimport { GenerateOptions } from \"../api\";\n\nconst typeMaps = {\n \"string\": \"String\",\n \"number\": \"float\",\n \"boolean\": \"boolean\",\n \"int8\": \"byte\",\n \"uint8\": \"short\",\n \"int16\": \"short\",\n \"uint16\": \"int\",\n \"int32\": \"int\",\n \"uint32\": \"long\",\n \"int64\": \"long\",\n \"uint64\": \"long\",\n \"float32\": \"float\",\n \"float64\": \"double\",\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\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return context.classes.map(klass => ({\n name: klass.name + \".java\",\n content: generateClass(klass, options.namespace)\n }));\n}\n\nfunction generateClass(klass: Class, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n${namespace ? `\\npackage ${namespace};` : \"\"}\n\nimport io.colyseus.serializer.schema.Schema;\nimport io.colyseus.serializer.schema.annotations.SchemaClass;\nimport io.colyseus.serializer.schema.annotations.SchemaField;\n\n@SchemaClass\n${indent}public class ${klass.name} extends ${klass.extends} {\n${klass.properties.map(prop => generateProperty(prop, indent)).join(\"\\n\\n\")}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\n}\n\nfunction generateProperty(prop: Property, indent: string = \"\") {\n let typeArgs = `${prop.index}/${prop.type}`;\n let property = \"public\";\n let langType: string;\n let ctorArgs: string = \"\";\n let initializer = \"\";\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n if (prop.type !== \"ref\" && isUpcaseFirst) {\n ctorArgs = `${prop.childType}.class`;\n }\n\n if(prop.type === \"ref\") {\n langType = (isUpcaseFirst)\n ? prop.childType\n : typeMaps[prop.childType];\n\n initializer = `new ${langType}${(prop.type !== \"ref\" && isUpcaseFirst) ? \"<>\" : \"\"}(${ctorArgs})`;\n\n } else if(prop.type === \"array\") {\n langType = (isUpcaseFirst)\n ? `ArraySchema<${prop.childType}>`\n : `ArraySchema`;\n\n initializer = `new ArraySchema${(isUpcaseFirst) ? \"<>\" : \"\"}(${ctorArgs})`;\n\n } else if(prop.type === \"map\") {\n langType = (isUpcaseFirst)\n ? `MapSchema<${prop.childType}>`\n : `MapSchema`;\n\n initializer = `new MapSchema${(isUpcaseFirst) ? \"<>\" : \"\"}(${ctorArgs})`;\n }\n\n if (prop.type !== \"ref\") {\n typeArgs += (isUpcaseFirst)\n ? `/ref`\n : `/${prop.childType}`;\n }\n\n } else {\n langType = typeMaps[prop.type];\n initializer = typeInitializer[prop.type];\n }\n\n property += ` ${langType} ${prop.name}`;\n\n return `\\t@SchemaField(\"${typeArgs}\")\\t${indent}\n\\t${indent}${property} = ${initializer};`\n}\n"]}
|