nesoi 3.0.18 → 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.
@@ -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, path?: string): Record<string, TypeAsObj>;
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 = orType;
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, path) {
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
- const keyPath = (path ? path + '.' : '') + key;
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, nextKey));
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
- Object.entries(fields).forEach(([key, field]) => {
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 (!field.required) {
141
+ if (field.or) {
142
+ const orType = buildField(key, field.or, true);
142
143
  if (typeof input[key] === 'object') {
143
- input[key].__optional = true;
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] += ' | undefined';
152
+ input[key] = `${input[key]} | ${orType}`;
147
153
  }
148
- if (field.defaultValue === undefined) {
149
- if (typeof output[key] === 'object') {
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
- if (field.array) {
158
- if (typeof input[key] === 'object') {
159
- input[key].__array = true;
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
- input[key] += '[]';
163
+ output[key] = `${output[key]} | ${orType}`;
163
164
  }
164
- if (typeof output[key] === 'object') {
165
- output[key].__array = true;
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
- else {
168
- output[key] += '[]';
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
- const path = root.length ? `${root}.${f}` : f;
43
- if ((include.length && !include.includes(path))
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] = new message_template_schema_1.$MessageTemplateField(field.type, field.name, field.alias, path, field.array, field.required, undefined, false, [], {
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, path?: 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
- this._or = def;
136
- return this;
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, path = '') {
157
- path += name;
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, builder._array
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,13 +37,7 @@ class MessageParser {
37
37
  const parsedObj = {};
38
38
  for (const k in fields) {
39
39
  const field = fields[k];
40
- const keyWithSuffix = field.type === 'id'
41
- ? field.array ? `${k.slice(0, -1)}_ids` : `${k}_id`
42
- : k;
43
- const parsedField = await parseField(trx, field, obj[keyWithSuffix]);
44
- for (const suffix in parsedField) {
45
- parsedObj[field.name + suffix] = parsedField[suffix];
46
- }
40
+ parsedObj[k] = await parseField(trx, field, obj[k]);
47
41
  }
48
42
  return parsedObj;
49
43
  };
@@ -51,40 +45,7 @@ class MessageParser {
51
45
  // 1. Sanitize input
52
46
  this.sanitize(value);
53
47
  // 2. Check for required fields
54
- let parsedValue;
55
- if (MessageParser.isEmpty(value)) {
56
- if (field.required) {
57
- const pathWithSuffix = field.type === 'id' ? `${field.path}_id` : field.path;
58
- throw error_1.NesoiError.Message.FieldIsRequired({ field: field.alias, path: pathWithSuffix, value });
59
- }
60
- else if (field.defaultValue !== undefined) {
61
- parsedValue = { '': field.defaultValue };
62
- }
63
- else {
64
- parsedValue = { '': undefined };
65
- }
66
- }
67
- else {
68
- if (field.array) {
69
- if (!Array.isArray(value)) {
70
- throw error_1.NesoiError.Message.InvalidFieldType({ field: field.alias, value, type: 'list' });
71
- }
72
- }
73
- // 3. Run parse method
74
- try {
75
- parsedValue = await (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value, parseFields);
76
- }
77
- catch (e) {
78
- // If this error was not triggered by a nested field,
79
- // and we have another option, we try that option.
80
- if (field.or && !e.__msg_deep_error) {
81
- return parseField(trx, field.or, value);
82
- }
83
- e.__msg_deep_error = true;
84
- throw e;
85
- }
86
- }
87
- return parsedValue;
48
+ return (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value);
88
49
  };
89
50
  const applyRules = async (fields, parsed, parsedValue = parsed) => {
90
51
  for (const f in fields) {
@@ -117,23 +78,5 @@ class MessageParser {
117
78
  });
118
79
  }
119
80
  }
120
- /**
121
- * Empty values: `{}`, `[]`, `''`, `null`, `undefined`
122
- */
123
- static isEmpty(value) {
124
- if (value === null || value === undefined) {
125
- return true;
126
- }
127
- if (Array.isArray(value)) {
128
- return value.length === 0;
129
- }
130
- if (typeof value === 'object') {
131
- return Object.keys(value).length === 0;
132
- }
133
- if (typeof value === 'string') {
134
- return value.length === 0;
135
- }
136
- return false;
137
- }
138
81
  }
139
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
- path: string;
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, path: string, array: boolean, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined, or?: $MessageTemplateField | undefined);
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, path, array, required, defaultValue, nullable, rules, meta, children, or) {
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.path = path;
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;
@@ -236,8 +236,8 @@ Nullable extends [null | never, null | never] = [never, never]> {
236
236
  rule(rule: MessageTemplateRuleDef<DefinedOutput[keyof DefinedOutput], Message['#raw']>): this;
237
237
  get array(): MessageTemplateFieldBuilder<Module, Message, { [K in keyof DefinedInput]: DefinedInput[K][]; }, { [K in keyof DefinedOutput]: DefinedOutput[K][]; }, Children, Optional, Nullable>;
238
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>;
239
- static build(builder: AnyMessageTemplateFieldBuilder, name: string, tree: ModuleTree, module: $Module, basePath: string): $MessageTemplateField;
240
- static buildChildren(fields: MessageTemplateFieldBuilders, tree: ModuleTree, module: $Module, basePath?: string): $MessageTemplateFields;
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;
241
241
  }
242
242
  export type MessageTemplateFieldBuilders = {
243
243
  [x: string]: AnyMessageTemplateFieldBuilder;
@@ -157,21 +157,23 @@ class MessageTemplateFieldBuilder {
157
157
  return this;
158
158
  }
159
159
  // Build
160
- static build(builder, name, tree, module, basePath) {
160
+ static build(builder, name, tree, module, basePathRaw, basePathParsed) {
161
161
  const or = builder._or
162
- ? this.build(builder._or, name, tree, module, basePath)
163
- : undefined;
164
- const path = basePath + name + (builder.type === 'id' ? '_id' : '') + '.';
165
- const childrenBasePath = builder.children
166
- ? path + (builder._array ? '*.' : '')
162
+ ? this.build(builder._or, name, tree, module, basePathRaw, basePathParsed)
167
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 ? '#.' : '');
168
170
  if (builder.value.id) {
169
171
  const bucket = tree.getSchema(builder.value.id.bucket);
170
172
  builder.value.id.type = bucket.model.fields.id.type;
171
173
  }
172
- return new message_template_schema_1.$MessageTemplateField(builder.type, name, builder.alias || name, basePath + name, builder._array, builder._required, builder._defaultValue, builder._nullable, builder._rules, builder.value, builder.children ? MessageTemplateFieldBuilder.buildChildren(builder.children, tree, module, childrenBasePath) : undefined, or);
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);
173
175
  }
174
- static buildChildren(fields, tree, module, basePath = '') {
176
+ static buildChildren(fields, tree, module, basePathRaw = '', basePathParsed = '') {
175
177
  const schema = {};
176
178
  for (const c in fields) {
177
179
  const child = fields[c];
@@ -197,13 +199,13 @@ class MessageTemplateFieldBuilder {
197
199
  builder._nullable = child._nullable;
198
200
  builder._rules = child._rules.slice(0, -1);
199
201
  builder.children = child.children;
200
- schema[param] = MessageTemplateFieldBuilder.build(builder, c, tree, module, basePath);
202
+ schema[param] = MessageTemplateFieldBuilder.build(builder, c, tree, module, basePathRaw, basePathParsed);
201
203
  schema[param].children = schema[param].children || {};
202
204
  Object.assign(schema[param].children, $msg.template.fields);
203
205
  continue;
204
206
  }
205
207
  // All other parameters are built directly
206
- schema[param] = MessageTemplateFieldBuilder.build(child, c, tree, module, basePath);
208
+ schema[param] = MessageTemplateFieldBuilder.build(child, c, tree, module, basePathRaw, basePathParsed);
207
209
  }
208
210
  return schema;
209
211
  }
@@ -1,3 +1,7 @@
1
- import { $MessageTemplateField, $MessageTemplateFields } from './message_template.schema';
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, parseFields: (trx: AnyTrxNode, fields: $MessageTemplateFields, obj: Record<string, any>) => any): Promise<Record<string, 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;