nesoi 3.0.17 → 3.0.19
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/lib/compiler/elements/bucket.element.d.ts +1 -1
- package/lib/compiler/elements/bucket.element.js +25 -27
- package/lib/compiler/elements/message.element.js +50 -20
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +11 -9
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +11 -8
- package/lib/elements/entities/bucket/view/bucket_view.js +2 -2
- package/lib/elements/entities/message/message_parser.d.ts +0 -4
- package/lib/elements/entities/message/message_parser.js +2 -57
- package/lib/elements/entities/message/template/message_template.schema.d.ts +3 -2
- package/lib/elements/entities/message/template/message_template.schema.js +3 -2
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +7 -2
- package/lib/elements/entities/message/template/message_template_field.builder.js +15 -10
- package/lib/elements/entities/message/template/message_template_parser.d.ts +6 -2
- package/lib/elements/entities/message/template/message_template_parser.js +121 -69
- package/lib/engine/data/error.d.ts +11 -0
- package/lib/engine/data/error.js +4 -0
- package/lib/engine/util/parse.d.ts +29 -28
- package/lib/engine/util/parse.js +155 -186
- package/package.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -14,7 +14,7 @@ export declare class BucketElement extends Element<$Bucket> {
|
|
|
14
14
|
private buildModelFieldType;
|
|
15
15
|
private buildCompositionType;
|
|
16
16
|
buildModelType(fields?: $BucketModelFields): ObjTypeAsObj;
|
|
17
|
-
buildModelFieldNamesType(model: ObjTypeAsObj, fields?: $BucketModelFields
|
|
17
|
+
buildModelFieldNamesType(model: ObjTypeAsObj, fields?: $BucketModelFields): Record<string, TypeAsObj>;
|
|
18
18
|
private buildGraphType;
|
|
19
19
|
private buildViewsType;
|
|
20
20
|
private buildViewType;
|
|
@@ -64,7 +64,7 @@ class BucketElement extends element_1.Element {
|
|
|
64
64
|
bucket
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
-
buildModelFieldType(field) {
|
|
67
|
+
buildModelFieldType(field, isUnion = false) {
|
|
68
68
|
let type = 'unknown';
|
|
69
69
|
if (field.type === 'boolean') {
|
|
70
70
|
type = 'boolean';
|
|
@@ -119,35 +119,38 @@ class BucketElement extends element_1.Element {
|
|
|
119
119
|
'[x in string]': field.children.__dict
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
|
-
if (!field.required && field.defaultValue === undefined) {
|
|
123
|
-
if (typeof type === 'object') {
|
|
124
|
-
type.__optional = true;
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
type += ' | undefined';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (field.array) {
|
|
131
|
-
if (typeof type === 'object') {
|
|
132
|
-
type.__array = true;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
type += '[]';
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
122
|
if (field.or) {
|
|
139
|
-
const orType = this.buildModelFieldType(field.or);
|
|
123
|
+
const orType = this.buildModelFieldType(field.or, true);
|
|
140
124
|
if (typeof type === 'object') {
|
|
141
125
|
type.__or = orType;
|
|
142
126
|
}
|
|
143
127
|
else if (typeof orType === 'object') {
|
|
128
|
+
const nonObj = type;
|
|
144
129
|
type = orType;
|
|
145
|
-
type.__or =
|
|
130
|
+
type.__or = nonObj;
|
|
146
131
|
}
|
|
147
132
|
else {
|
|
148
133
|
type = `${type} | ${orType}`;
|
|
149
134
|
}
|
|
150
135
|
}
|
|
136
|
+
if (!isUnion) {
|
|
137
|
+
if (!field.required && field.defaultValue === undefined) {
|
|
138
|
+
if (typeof type === 'object') {
|
|
139
|
+
type.__optional = true;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
type = `(${type}) | undefined`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (field.array) {
|
|
146
|
+
if (typeof type === 'object') {
|
|
147
|
+
type.__array = true;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
type = `(${type})[]`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
151
154
|
return type;
|
|
152
155
|
}
|
|
153
156
|
buildCompositionType() {
|
|
@@ -171,25 +174,20 @@ class BucketElement extends element_1.Element {
|
|
|
171
174
|
});
|
|
172
175
|
return model;
|
|
173
176
|
}
|
|
174
|
-
buildModelFieldNamesType(model, fields = this.schema.model.fields
|
|
177
|
+
buildModelFieldNamesType(model, fields = this.schema.model.fields) {
|
|
175
178
|
const fieldPaths = {};
|
|
176
179
|
Object.entries(fields).forEach(([key, field]) => {
|
|
177
180
|
if (key === '__dict') {
|
|
178
181
|
return;
|
|
179
182
|
}
|
|
180
|
-
|
|
181
|
-
fieldPaths[keyPath] = model[key];
|
|
183
|
+
fieldPaths[field.path] = model[key];
|
|
182
184
|
if (field.children) {
|
|
183
185
|
let nextFields = field.children;
|
|
184
|
-
let nextKey = keyPath;
|
|
185
186
|
if ('__dict' in field.children) {
|
|
186
187
|
nextFields = field.children.__dict.children;
|
|
187
|
-
nextKey += '.#';
|
|
188
188
|
}
|
|
189
|
-
if (field.array)
|
|
190
|
-
nextKey += '.#';
|
|
191
189
|
if (nextFields) {
|
|
192
|
-
Object.assign(fieldPaths, this.buildModelFieldNamesType(model[key], nextFields
|
|
190
|
+
Object.assign(fieldPaths, this.buildModelFieldNamesType(model[key], nextFields));
|
|
193
191
|
}
|
|
194
192
|
}
|
|
195
193
|
});
|
|
@@ -44,7 +44,7 @@ class MessageElement extends element_1.Element {
|
|
|
44
44
|
buildIO(fields = this.schema.template.fields) {
|
|
45
45
|
const input = {};
|
|
46
46
|
const output = {};
|
|
47
|
-
|
|
47
|
+
const buildField = (key, field, isUnion = false) => {
|
|
48
48
|
if (field.type === 'boolean') {
|
|
49
49
|
input[key] = 'boolean';
|
|
50
50
|
output[key] = 'boolean';
|
|
@@ -138,36 +138,66 @@ class MessageElement extends element_1.Element {
|
|
|
138
138
|
input[key] = 'unknown';
|
|
139
139
|
output[key] = 'unknown';
|
|
140
140
|
}
|
|
141
|
-
if (
|
|
141
|
+
if (field.or) {
|
|
142
|
+
const orType = buildField(key, field.or, true);
|
|
142
143
|
if (typeof input[key] === 'object') {
|
|
143
|
-
input[key].
|
|
144
|
+
input[key].__or = orType;
|
|
145
|
+
}
|
|
146
|
+
else if (typeof orType === 'object') {
|
|
147
|
+
const nonObj = input[key];
|
|
148
|
+
input[key] = orType;
|
|
149
|
+
input[key].__or = nonObj;
|
|
144
150
|
}
|
|
145
151
|
else {
|
|
146
|
-
input[key]
|
|
152
|
+
input[key] = `${input[key]} | ${orType}`;
|
|
147
153
|
}
|
|
148
|
-
if (
|
|
149
|
-
|
|
150
|
-
output[key].__optional = true;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
output[key] += ' | undefined';
|
|
154
|
-
}
|
|
154
|
+
if (typeof output[key] === 'object') {
|
|
155
|
+
output[key].__or = orType;
|
|
155
156
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
else if (typeof orType === 'object') {
|
|
158
|
+
const nonObj = output[key];
|
|
159
|
+
output[key] = orType;
|
|
160
|
+
output[key].__or = nonObj;
|
|
160
161
|
}
|
|
161
162
|
else {
|
|
162
|
-
|
|
163
|
+
output[key] = `${output[key]} | ${orType}`;
|
|
163
164
|
}
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
}
|
|
166
|
+
if (!isUnion) {
|
|
167
|
+
if (!field.required) {
|
|
168
|
+
if (typeof input[key] === 'object') {
|
|
169
|
+
input[key].__optional = true;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
input[key] = `(${input[key]}) | undefined`;
|
|
173
|
+
}
|
|
174
|
+
if (field.defaultValue === undefined) {
|
|
175
|
+
if (typeof output[key] === 'object') {
|
|
176
|
+
output[key].__optional = true;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
output[key] = `(${output[key]}) | undefined`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
166
182
|
}
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
if (field.array) {
|
|
184
|
+
if (typeof input[key] === 'object') {
|
|
185
|
+
input[key].__array = true;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
input[key] = `(${input[key]})[]`;
|
|
189
|
+
}
|
|
190
|
+
if (typeof output[key] === 'object') {
|
|
191
|
+
output[key].__array = true;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
output[key] = `(${output[key]})[]`;
|
|
195
|
+
}
|
|
169
196
|
}
|
|
170
197
|
}
|
|
198
|
+
};
|
|
199
|
+
Object.entries(fields).forEach(([key, field]) => {
|
|
200
|
+
buildField(key, field);
|
|
171
201
|
});
|
|
172
202
|
return { input, output };
|
|
173
203
|
}
|
|
@@ -35,21 +35,23 @@ function convertToView(model, name, fields = model.fields, path) {
|
|
|
35
35
|
* @subcategory Entity
|
|
36
36
|
* */
|
|
37
37
|
function convertToMessage(module, model, name, alias, include = [], exclude = []) {
|
|
38
|
+
const convertField = (field) => {
|
|
39
|
+
return new message_template_schema_1.$MessageTemplateField(field.type, field.name, field.alias, field.path, field.path, field.array, field.required, undefined, false, [], {
|
|
40
|
+
enum: field.meta?.enum ? {
|
|
41
|
+
options: field.meta.enum.options,
|
|
42
|
+
dep: field.meta.enum.dep ? new dependency_1.$Dependency(module, 'constants', `${field.meta.enum.dep.module}::${field.meta.enum.dep.name}`) : undefined
|
|
43
|
+
} : undefined
|
|
44
|
+
}, field.children ? convertFields(field.children, include, exclude) : undefined, field.or ? convertField(field.or) : undefined);
|
|
45
|
+
};
|
|
38
46
|
const convertFields = (fields, include = [], exclude = [], root = '') => {
|
|
39
47
|
const msgFields = {};
|
|
40
48
|
for (const f in fields) {
|
|
41
49
|
const field = fields[f];
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|| exclude.includes(path)) {
|
|
50
|
+
if ((include.length && !include.includes(field.path))
|
|
51
|
+
|| exclude.includes(field.path)) {
|
|
45
52
|
continue;
|
|
46
53
|
}
|
|
47
|
-
msgFields[f] =
|
|
48
|
-
enum: field.meta?.enum ? {
|
|
49
|
-
options: field.meta.enum.options,
|
|
50
|
-
dep: field.meta.enum.dep ? new dependency_1.$Dependency(module, 'constants', `${field.meta.enum.dep.module}::${field.meta.enum.dep.name}`) : undefined
|
|
51
|
-
} : undefined
|
|
52
|
-
}, field.children ? convertFields(field.children, include, exclude) : undefined);
|
|
54
|
+
msgFields[f] = convertField(field);
|
|
53
55
|
}
|
|
54
56
|
return msgFields;
|
|
55
57
|
};
|
|
@@ -132,7 +132,7 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
|
|
|
132
132
|
*/
|
|
133
133
|
maxLength(val: number | null): void;
|
|
134
134
|
encrypt(key: keyof Module['constants']['values'], algorithm?: string): void;
|
|
135
|
-
static build(builder: BucketModelFieldBuilder<any, any>, name: string,
|
|
135
|
+
static build(builder: BucketModelFieldBuilder<any, any>, name: string, basePath?: string): {
|
|
136
136
|
schema: $BucketModelField;
|
|
137
137
|
hasFile: boolean;
|
|
138
138
|
hasEncrypted: boolean;
|
|
@@ -129,11 +129,15 @@ class BucketModelFieldBuilder {
|
|
|
129
129
|
}
|
|
130
130
|
get array() {
|
|
131
131
|
this._array = true;
|
|
132
|
+
if (this._or) {
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
134
|
+
this._or.array;
|
|
135
|
+
}
|
|
132
136
|
return this;
|
|
133
137
|
}
|
|
134
138
|
or(def) {
|
|
135
|
-
|
|
136
|
-
return
|
|
139
|
+
def._or = this;
|
|
140
|
+
return def;
|
|
137
141
|
}
|
|
138
142
|
/**
|
|
139
143
|
* This can be applied to `string` and `enum` fields,
|
|
@@ -153,18 +157,17 @@ class BucketModelFieldBuilder {
|
|
|
153
157
|
};
|
|
154
158
|
}
|
|
155
159
|
// Build
|
|
156
|
-
static build(builder, name,
|
|
157
|
-
path
|
|
160
|
+
static build(builder, name, basePath = '') {
|
|
161
|
+
const path = basePath + name;
|
|
162
|
+
const itemPath = builder._array ? path + '.#.' : path + '.';
|
|
158
163
|
const children = builder.children
|
|
159
|
-
? BucketModelFieldBuilder.buildChildren(builder.module, builder.children,
|
|
160
|
-
? path + '.#.'
|
|
161
|
-
: path + '.')
|
|
164
|
+
? BucketModelFieldBuilder.buildChildren(builder.module, builder.children, itemPath)
|
|
162
165
|
: undefined;
|
|
163
166
|
const defaults = builder._defaultValue && builder.children
|
|
164
167
|
? Object.assign({}, builder._defaultValue, children?.defaults)
|
|
165
168
|
: builder._defaultValue;
|
|
166
169
|
const or = builder._or
|
|
167
|
-
? this.build(builder._or, name)
|
|
170
|
+
? this.build(builder._or, name, basePath)
|
|
168
171
|
: undefined;
|
|
169
172
|
const schema = new bucket_model_schema_1.$BucketModelField(name, path, builder.type, builder.alias || name, builder._array, builder._required, builder.meta, defaults, children?.schema, or?.schema, builder.crypto);
|
|
170
173
|
const hasFile = builder.type === 'file'
|
|
@@ -95,7 +95,6 @@ class BucketView {
|
|
|
95
95
|
}
|
|
96
96
|
parsedObj[k] = await doParse(prop.children || {}, index);
|
|
97
97
|
}
|
|
98
|
-
parsedObj['$v'] = this.schema.name;
|
|
99
98
|
return parsedObj;
|
|
100
99
|
};
|
|
101
100
|
const parseModelProp = async (obj, prop, index, key) => {
|
|
@@ -129,7 +128,8 @@ class BucketView {
|
|
|
129
128
|
}
|
|
130
129
|
return rawValue;
|
|
131
130
|
};
|
|
132
|
-
const parsedObj = await doParse(this.schema.fields
|
|
131
|
+
const parsedObj = await doParse(this.schema.fields);
|
|
132
|
+
parsedObj['$v'] = this.schema.name;
|
|
133
133
|
return {
|
|
134
134
|
id: raw.id,
|
|
135
135
|
...parsedObj
|
|
@@ -12,9 +12,5 @@ export declare class MessageParser<$ extends $Message> {
|
|
|
12
12
|
static parseWithTrxModule(trx: AnyTrxNode, raw: RawMessageInput<any, any>, sigKey?: string): Promise<any>;
|
|
13
13
|
parse(trx: AnyTrxNode, raw: $['#raw'], sigKey?: string): Promise<Message<$>>;
|
|
14
14
|
private sanitize;
|
|
15
|
-
/**
|
|
16
|
-
* Empty values: `{}`, `[]`, `''`, `null`, `undefined`
|
|
17
|
-
*/
|
|
18
|
-
static isEmpty(value: any): boolean;
|
|
19
15
|
}
|
|
20
16
|
export type AnyMessageParser = MessageParser<$Message>;
|
|
@@ -37,11 +37,7 @@ class MessageParser {
|
|
|
37
37
|
const parsedObj = {};
|
|
38
38
|
for (const k in fields) {
|
|
39
39
|
const field = fields[k];
|
|
40
|
-
|
|
41
|
-
const parsedField = await parseField(trx, field, obj[keyWithSuffix]);
|
|
42
|
-
for (const suffix in parsedField) {
|
|
43
|
-
parsedObj[field.name + suffix] = parsedField[suffix];
|
|
44
|
-
}
|
|
40
|
+
parsedObj[k] = await parseField(trx, field, obj[k]);
|
|
45
41
|
}
|
|
46
42
|
return parsedObj;
|
|
47
43
|
};
|
|
@@ -49,40 +45,7 @@ class MessageParser {
|
|
|
49
45
|
// 1. Sanitize input
|
|
50
46
|
this.sanitize(value);
|
|
51
47
|
// 2. Check for required fields
|
|
52
|
-
|
|
53
|
-
if (MessageParser.isEmpty(value)) {
|
|
54
|
-
if (field.required) {
|
|
55
|
-
const pathWithSuffix = field.type === 'id' ? `${field.path}_id` : field.path;
|
|
56
|
-
throw error_1.NesoiError.Message.FieldIsRequired({ field: field.alias, path: pathWithSuffix, value });
|
|
57
|
-
}
|
|
58
|
-
else if (field.defaultValue !== undefined) {
|
|
59
|
-
parsedValue = { '': field.defaultValue };
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
parsedValue = { '': undefined };
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
if (field.array) {
|
|
67
|
-
if (!Array.isArray(value)) {
|
|
68
|
-
throw error_1.NesoiError.Message.InvalidFieldType({ field: field.alias, value, type: 'list' });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// 3. Run parse method
|
|
72
|
-
try {
|
|
73
|
-
parsedValue = await (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value, parseFields);
|
|
74
|
-
}
|
|
75
|
-
catch (e) {
|
|
76
|
-
// If this error was not triggered by a nested field,
|
|
77
|
-
// and we have another option, we try that option.
|
|
78
|
-
if (field.or && !e.__msg_deep_error) {
|
|
79
|
-
return parseField(trx, field.or, value);
|
|
80
|
-
}
|
|
81
|
-
e.__msg_deep_error = true;
|
|
82
|
-
throw e;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return parsedValue;
|
|
48
|
+
return (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value);
|
|
86
49
|
};
|
|
87
50
|
const applyRules = async (fields, parsed, parsedValue = parsed) => {
|
|
88
51
|
for (const f in fields) {
|
|
@@ -115,23 +78,5 @@ class MessageParser {
|
|
|
115
78
|
});
|
|
116
79
|
}
|
|
117
80
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Empty values: `{}`, `[]`, `''`, `null`, `undefined`
|
|
120
|
-
*/
|
|
121
|
-
static isEmpty(value) {
|
|
122
|
-
if (value === null || value === undefined) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
if (Array.isArray(value)) {
|
|
126
|
-
return value.length === 0;
|
|
127
|
-
}
|
|
128
|
-
if (typeof value === 'object') {
|
|
129
|
-
return Object.keys(value).length === 0;
|
|
130
|
-
}
|
|
131
|
-
if (typeof value === 'string') {
|
|
132
|
-
return value.length === 0;
|
|
133
|
-
}
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
81
|
}
|
|
137
82
|
exports.MessageParser = MessageParser;
|
|
@@ -39,7 +39,8 @@ export declare class $MessageTemplateField {
|
|
|
39
39
|
type: $MessageTemplateFieldType;
|
|
40
40
|
name: string;
|
|
41
41
|
alias: string;
|
|
42
|
-
|
|
42
|
+
path_raw: string;
|
|
43
|
+
path_parsed: string;
|
|
43
44
|
array: boolean;
|
|
44
45
|
required: boolean;
|
|
45
46
|
defaultValue: any;
|
|
@@ -51,7 +52,7 @@ export declare class $MessageTemplateField {
|
|
|
51
52
|
'#raw': unknown;
|
|
52
53
|
'#parsed': unknown;
|
|
53
54
|
$t: string;
|
|
54
|
-
constructor(type: $MessageTemplateFieldType, name: string, alias: string,
|
|
55
|
+
constructor(type: $MessageTemplateFieldType, name: string, alias: string, path_raw: string, path_parsed: string, array: boolean, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined, or?: $MessageTemplateField | undefined);
|
|
55
56
|
}
|
|
56
57
|
export type $MessageTemplateFields = {
|
|
57
58
|
[x: string]: $MessageTemplateField;
|
|
@@ -6,11 +6,12 @@ exports.$MessageTemplate = exports.$MessageTemplateField = void 0;
|
|
|
6
6
|
* @subcategory Entity
|
|
7
7
|
* */
|
|
8
8
|
class $MessageTemplateField {
|
|
9
|
-
constructor(type, name, alias,
|
|
9
|
+
constructor(type, name, alias, path_raw, path_parsed, array, required, defaultValue, nullable, rules, meta, children, or) {
|
|
10
10
|
this.type = type;
|
|
11
11
|
this.name = name;
|
|
12
12
|
this.alias = alias;
|
|
13
|
-
this.
|
|
13
|
+
this.path_raw = path_raw;
|
|
14
|
+
this.path_parsed = path_parsed;
|
|
14
15
|
this.array = array;
|
|
15
16
|
this.required = required;
|
|
16
17
|
this.defaultValue = defaultValue;
|
|
@@ -24,6 +24,11 @@ export declare class MessageTemplateFieldFactory<Space extends $Space, Module ex
|
|
|
24
24
|
}, {
|
|
25
25
|
'': any;
|
|
26
26
|
}, {}, [never, never], [never, never]>;
|
|
27
|
+
ts<T = any>(): MessageTemplateFieldBuilder<Module, Message, {
|
|
28
|
+
'': T;
|
|
29
|
+
}, {
|
|
30
|
+
'': T;
|
|
31
|
+
}, {}, [never, never], [never, never]>;
|
|
27
32
|
get boolean(): MessageTemplateFieldBuilder<Module, Message, {
|
|
28
33
|
'': boolean;
|
|
29
34
|
}, {
|
|
@@ -231,8 +236,8 @@ Nullable extends [null | never, null | never] = [never, never]> {
|
|
|
231
236
|
rule(rule: MessageTemplateRuleDef<DefinedOutput[keyof DefinedOutput], Message['#raw']>): this;
|
|
232
237
|
get array(): MessageTemplateFieldBuilder<Module, Message, { [K in keyof DefinedInput]: DefinedInput[K][]; }, { [K in keyof DefinedOutput]: DefinedOutput[K][]; }, Children, Optional, Nullable>;
|
|
233
238
|
or<Def extends AnyMessageTemplateFieldBuilder>(def: Def): MessageTemplateFieldBuilder<Module, Message, { [K in keyof DefinedInput]: DefinedInput[K] | (Def extends MessageTemplateFieldBuilder<any, any, infer X, any, any, [never, never], [never, never]> ? X : never)[keyof (Def extends MessageTemplateFieldBuilder<any, any, infer X, any, any, [never, never], [never, never]> ? X : never)]; }, { [K in keyof DefinedOutput]: DefinedOutput[K] | (Def extends MessageTemplateFieldBuilder<any, any, any, infer X, any, [never, never], [never, never]> ? X : never)[keyof (Def extends MessageTemplateFieldBuilder<any, any, any, infer X, any, [never, never], [never, never]> ? X : never)]; }, Children, Optional, Nullable>;
|
|
234
|
-
static build(builder: AnyMessageTemplateFieldBuilder, name: string, tree: ModuleTree, module: $Module,
|
|
235
|
-
static buildChildren(fields: MessageTemplateFieldBuilders, tree: ModuleTree, module: $Module,
|
|
239
|
+
static build(builder: AnyMessageTemplateFieldBuilder, name: string, tree: ModuleTree, module: $Module, basePathRaw: string, basePathParsed: string): $MessageTemplateField;
|
|
240
|
+
static buildChildren(fields: MessageTemplateFieldBuilders, tree: ModuleTree, module: $Module, basePathRaw?: string, basePathParsed?: string): $MessageTemplateFields;
|
|
236
241
|
}
|
|
237
242
|
export type MessageTemplateFieldBuilders = {
|
|
238
243
|
[x: string]: AnyMessageTemplateFieldBuilder;
|
|
@@ -19,6 +19,9 @@ class MessageTemplateFieldFactory {
|
|
|
19
19
|
get any() {
|
|
20
20
|
return new MessageTemplateFieldBuilder('unknown', {}, this.alias);
|
|
21
21
|
}
|
|
22
|
+
ts() {
|
|
23
|
+
return new MessageTemplateFieldBuilder('unknown', {}, this.alias);
|
|
24
|
+
}
|
|
22
25
|
get boolean() {
|
|
23
26
|
return new MessageTemplateFieldBuilder('boolean', {}, this.alias);
|
|
24
27
|
}
|
|
@@ -154,21 +157,23 @@ class MessageTemplateFieldBuilder {
|
|
|
154
157
|
return this;
|
|
155
158
|
}
|
|
156
159
|
// Build
|
|
157
|
-
static build(builder, name, tree, module,
|
|
160
|
+
static build(builder, name, tree, module, basePathRaw, basePathParsed) {
|
|
158
161
|
const or = builder._or
|
|
159
|
-
? this.build(builder._or, name, tree, module,
|
|
160
|
-
: undefined;
|
|
161
|
-
const path = basePath + name + (builder.type === 'id' ? '_id' : '') + '.';
|
|
162
|
-
const childrenBasePath = builder.children
|
|
163
|
-
? path + (builder._array ? '*.' : '')
|
|
162
|
+
? this.build(builder._or, name, tree, module, basePathRaw, basePathParsed)
|
|
164
163
|
: undefined;
|
|
164
|
+
const pathParsed = basePathParsed + name;
|
|
165
|
+
const pathRaw = basePathParsed + (builder.type === 'id'
|
|
166
|
+
? builder.array ? `${name.slice(0, -1)}_ids` : `${name}_id`
|
|
167
|
+
: name);
|
|
168
|
+
const childrenBasePathRaw = pathRaw + (builder._array ? '#.' : '');
|
|
169
|
+
const childrenBasePathParsed = pathParsed + (builder._array ? '#.' : '');
|
|
165
170
|
if (builder.value.id) {
|
|
166
171
|
const bucket = tree.getSchema(builder.value.id.bucket);
|
|
167
172
|
builder.value.id.type = bucket.model.fields.id.type;
|
|
168
173
|
}
|
|
169
|
-
return new message_template_schema_1.$MessageTemplateField(builder.type, name, builder.alias || name,
|
|
174
|
+
return new message_template_schema_1.$MessageTemplateField(builder.type, name, builder.alias || name, pathRaw, pathParsed, builder._array, builder._required, builder._defaultValue, builder._nullable, builder._rules, builder.value, builder.children ? MessageTemplateFieldBuilder.buildChildren(builder.children, tree, module, childrenBasePathRaw, childrenBasePathParsed) : undefined, or);
|
|
170
175
|
}
|
|
171
|
-
static buildChildren(fields, tree, module,
|
|
176
|
+
static buildChildren(fields, tree, module, basePathRaw = '', basePathParsed = '') {
|
|
172
177
|
const schema = {};
|
|
173
178
|
for (const c in fields) {
|
|
174
179
|
const child = fields[c];
|
|
@@ -194,13 +199,13 @@ class MessageTemplateFieldBuilder {
|
|
|
194
199
|
builder._nullable = child._nullable;
|
|
195
200
|
builder._rules = child._rules.slice(0, -1);
|
|
196
201
|
builder.children = child.children;
|
|
197
|
-
schema[param] = MessageTemplateFieldBuilder.build(builder, c, tree, module,
|
|
202
|
+
schema[param] = MessageTemplateFieldBuilder.build(builder, c, tree, module, basePathRaw, basePathParsed);
|
|
198
203
|
schema[param].children = schema[param].children || {};
|
|
199
204
|
Object.assign(schema[param].children, $msg.template.fields);
|
|
200
205
|
continue;
|
|
201
206
|
}
|
|
202
207
|
// All other parameters are built directly
|
|
203
|
-
schema[param] = MessageTemplateFieldBuilder.build(child, c, tree, module,
|
|
208
|
+
schema[param] = MessageTemplateFieldBuilder.build(child, c, tree, module, basePathRaw, basePathParsed);
|
|
204
209
|
}
|
|
205
210
|
return schema;
|
|
206
211
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
import { $MessageTemplateField
|
|
1
|
+
import { $MessageTemplateField } from './message_template.schema';
|
|
2
2
|
import { AnyTrxNode } from "../../../../engine/transaction/trx_node";
|
|
3
|
-
export declare function MessageTemplateFieldParser(raw: Record<string, any>, trx: AnyTrxNode, field: $MessageTemplateField, value: any
|
|
3
|
+
export declare function MessageTemplateFieldParser(raw: Record<string, any>, trx: AnyTrxNode, field: $MessageTemplateField, value: any): Promise<any>;
|
|
4
|
+
/**
|
|
5
|
+
* Empty values: `{}`, `[]`, `''`, `null`, `undefined`
|
|
6
|
+
*/
|
|
7
|
+
export declare function isEmpty(value: any): boolean;
|