nesoi 3.0.21 → 3.1.1

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 (91) hide show
  1. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +1 -0
  2. package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +8 -0
  3. package/lib/compiler/compiler.js +1 -1
  4. package/lib/compiler/elements/bucket.element.d.ts +3 -2
  5. package/lib/compiler/elements/bucket.element.js +86 -128
  6. package/lib/compiler/elements/element.js +4 -2
  7. package/lib/compiler/elements/externals.element.js +3 -0
  8. package/lib/compiler/elements/machine.element.js +2 -2
  9. package/lib/compiler/elements/message.element.js +35 -57
  10. package/lib/compiler/elements/queue.element.js +1 -1
  11. package/lib/compiler/helpers/dump_helpers.d.ts +5 -3
  12. package/lib/compiler/helpers/dump_helpers.js +43 -26
  13. package/lib/compiler/stages/4_build_schemas_stage.js +12 -0
  14. package/lib/compiler/stages/5_inject_ts_stage.js +4 -1
  15. package/lib/compiler/stages/7_dump_stage.js +7 -1
  16. package/lib/compiler/treeshake.js +4 -2
  17. package/lib/compiler/typescript/bridge/extract.js +37 -107
  18. package/lib/compiler/typescript/bridge/inject.d.ts +1 -1
  19. package/lib/compiler/typescript/bridge/inject.js +73 -45
  20. package/lib/compiler/typescript/bridge/organize.js +9 -5
  21. package/lib/compiler/typescript/typescript_compiler.d.ts +4 -6
  22. package/lib/compiler/typescript/typescript_compiler.js +139 -75
  23. package/lib/elements/blocks/block.builder.d.ts +1 -10
  24. package/lib/elements/blocks/block.builder.js +0 -32
  25. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +3 -21
  26. package/lib/elements/blocks/job/job.builder.d.ts +6 -20
  27. package/lib/elements/blocks/job/job.builder.js +0 -4
  28. package/lib/elements/blocks/machine/machine.builder.d.ts +5 -14
  29. package/lib/elements/blocks/machine/machine.builder.js +2 -2
  30. package/lib/elements/blocks/queue/queue.builder.d.ts +6 -15
  31. package/lib/elements/blocks/queue/queue.builder.js +2 -2
  32. package/lib/elements/edge/externals/externals.builder.d.ts +2 -0
  33. package/lib/elements/edge/externals/externals.builder.js +6 -1
  34. package/lib/elements/edge/externals/externals.schema.d.ts +2 -1
  35. package/lib/elements/edge/externals/externals.schema.js +3 -1
  36. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +1 -1
  37. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +7 -0
  38. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +46 -36
  39. package/lib/elements/entities/bucket/adapters/memory.nql.js +1 -1
  40. package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
  41. package/lib/elements/entities/bucket/bucket.js +42 -43
  42. package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
  43. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +1 -4
  44. package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +7 -5
  45. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -1
  46. package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +1 -1
  47. package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +1 -1
  48. package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
  49. package/lib/elements/entities/bucket/model/bucket_model.infer.d.ts +41 -9
  50. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +8 -6
  51. package/lib/elements/entities/bucket/model/bucket_model.schema.js +184 -21
  52. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +89 -56
  53. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +22 -30
  54. package/lib/elements/entities/bucket/query/nql.schema.d.ts +13 -10
  55. package/lib/elements/entities/bucket/query/nql_compiler.js +46 -21
  56. package/lib/elements/entities/bucket/view/bucket_view.builder.js +1 -1
  57. package/lib/elements/entities/bucket/view/bucket_view.d.ts +19 -0
  58. package/lib/elements/entities/bucket/view/bucket_view.js +230 -108
  59. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -10
  60. package/lib/elements/entities/bucket/view/bucket_view.schema.js +3 -5
  61. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +16 -12
  62. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +55 -40
  63. package/lib/elements/entities/message/message.builder.d.ts +1 -11
  64. package/lib/elements/entities/message/message.infer.d.ts +6 -30
  65. package/lib/elements/entities/message/message.schema.js +2 -2
  66. package/lib/elements/entities/message/template/message_template.builder.js +1 -1
  67. package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -15
  68. package/lib/elements/entities/message/template/message_template.schema.js +29 -12
  69. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +45 -209
  70. package/lib/elements/entities/message/template/message_template_field.builder.js +69 -85
  71. package/lib/elements/entities/message/template/message_template_parser.js +52 -64
  72. package/lib/engine/apps/inline.app.js +1 -0
  73. package/lib/engine/data/trash.js +7 -7
  74. package/lib/engine/data/tree.d.ts +3 -0
  75. package/lib/engine/data/tree.js +36 -0
  76. package/lib/engine/space.js +1 -1
  77. package/lib/engine/transaction/trx_engine.config.d.ts +3 -2
  78. package/lib/engine/transaction/trx_engine.d.ts +9 -1
  79. package/lib/engine/transaction/trx_engine.js +52 -9
  80. package/lib/engine/util/deep.js +4 -0
  81. package/lib/engine/util/parse.d.ts +22 -14
  82. package/lib/engine/util/parse.js +20 -5
  83. package/lib/engine/util/type.d.ts +3 -0
  84. package/package.json +1 -1
  85. package/tools/joaquin/bucket.d.ts +9 -0
  86. package/tools/joaquin/bucket.js +49 -0
  87. package/tools/joaquin/message.d.ts +2 -1
  88. package/tools/joaquin/message.js +9 -2
  89. package/tools/joaquin/mock.d.ts +1 -0
  90. package/tools/joaquin/mock.js +13 -5
  91. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1,5 +1,6 @@
1
1
  import { $Dependency } from "../../../../engine/dependency";
2
- export type $BucketModelFieldType = 'boolean' | 'date' | 'datetime' | 'duration' | 'decimal' | 'enum' | 'file' | 'float' | 'int' | 'string' | 'obj' | 'unknown' | 'dict';
2
+ import { BucketAdapterConfig } from '../adapters/bucket_adapter';
3
+ export type $BucketModelFieldType = 'boolean' | 'date' | 'datetime' | 'duration' | 'decimal' | 'enum' | 'file' | 'float' | 'int' | 'string' | 'obj' | 'unknown' | 'dict' | 'list' | 'union';
3
4
  export type $BucketModelFieldCrypto = {
4
5
  algorithm: string;
5
6
  key: string;
@@ -13,7 +14,6 @@ export declare class $BucketModelField {
13
14
  path: string;
14
15
  type: $BucketModelFieldType;
15
16
  alias: string;
16
- array: boolean;
17
17
  required: boolean;
18
18
  meta?: {
19
19
  enum?: {
@@ -31,10 +31,9 @@ export declare class $BucketModelField {
31
31
  } | undefined;
32
32
  defaultValue?: any | undefined;
33
33
  children?: $BucketModelFields | undefined;
34
- or?: $BucketModelField | undefined;
35
34
  crypto?: $BucketModelFieldCrypto | undefined;
36
35
  $t: string;
37
- constructor(name: string, path: string, type: $BucketModelFieldType, alias: string, array: boolean, required: boolean, meta?: {
36
+ constructor(name: string, path: string, type: $BucketModelFieldType, alias: string, required: boolean, meta?: {
38
37
  enum?: {
39
38
  options: string | string[];
40
39
  dep?: $Dependency;
@@ -47,7 +46,7 @@ export declare class $BucketModelField {
47
46
  extnames?: string[];
48
47
  maxsize?: number;
49
48
  };
50
- } | undefined, defaultValue?: any | undefined, children?: $BucketModelFields | undefined, or?: $BucketModelField | undefined, crypto?: $BucketModelFieldCrypto | undefined);
49
+ } | undefined, defaultValue?: any | undefined, children?: $BucketModelFields | undefined, crypto?: $BucketModelFieldCrypto | undefined);
51
50
  }
52
51
  export type $BucketModelFields = {
53
52
  [x: string]: $BucketModelField;
@@ -67,6 +66,9 @@ export declare class $BucketModel {
67
66
  constructor(fields: $BucketModelFields & {
68
67
  id: $BucketModelField;
69
68
  }, defaults?: Record<string, any>, hasFileField?: boolean, hasEncryptedField?: boolean);
70
- static get(model: $BucketModel, fieldpath: string): $BucketModelField | undefined;
69
+ static getField(model: $BucketModel, modelpath: string): $BucketModelField[];
71
70
  static fieldsOfType(model: $BucketModel, type: $BucketModelFieldType): $BucketModelField[];
71
+ static forEachField(model: $BucketModel, predicate: (field: $BucketModelField, path: string) => void): void;
72
+ static copy<T extends Record<string, any>>(model: $BucketModel, obj: T, meta?: BucketAdapterConfig['meta']): T;
73
+ static getModelpaths(model: $BucketModel): Record<string, $BucketModelField[]>;
72
74
  }
@@ -6,17 +6,15 @@ exports.$BucketModel = exports.$BucketModelField = void 0;
6
6
  * @subcategory Entity
7
7
  * */
8
8
  class $BucketModelField {
9
- constructor(name, path, type, alias, array, required, meta, defaultValue, children, or, crypto) {
9
+ constructor(name, path, type, alias, required, meta, defaultValue, children, crypto) {
10
10
  this.name = name;
11
11
  this.path = path;
12
12
  this.type = type;
13
13
  this.alias = alias;
14
- this.array = array;
15
14
  this.required = required;
16
15
  this.meta = meta;
17
16
  this.defaultValue = defaultValue;
18
17
  this.children = children;
19
- this.or = or;
20
18
  this.crypto = crypto;
21
19
  this.$t = 'bucket.model.field';
22
20
  }
@@ -34,26 +32,55 @@ class $BucketModel {
34
32
  this.hasEncryptedField = hasEncryptedField;
35
33
  this.$t = 'bucket.model';
36
34
  }
37
- static get(model, fieldpath) {
38
- const paths = fieldpath.split('.');
39
- let ref = model.fields;
40
- for (let i = 0; i < paths.length; i++) {
41
- const path = paths[i];
42
- if (path === '#') {
43
- continue;
44
- }
45
- else {
46
- ref = ref?.[path];
47
- }
48
- if (!ref?.children || i == paths.length - 1) {
49
- return ref;
50
- }
51
- if (!ref) {
52
- return undefined;
35
+ static getField(model, modelpath) {
36
+ const paths = modelpath.split('.');
37
+ const results = [];
38
+ let poll = [{ i: 0, field: { children: model.fields } }];
39
+ while (poll.length) {
40
+ const next = [];
41
+ for (const item of poll) {
42
+ const path = paths[item.i];
43
+ if (!path) {
44
+ results.push(item.field);
45
+ continue;
46
+ }
47
+ const field = item.field;
48
+ // If the field is a union, add all of it's children with the same path index
49
+ if (field.type === 'union') {
50
+ next.push(...Object.values(field.children).map(field => ({
51
+ i: item.i,
52
+ field
53
+ })));
54
+ continue;
55
+ }
56
+ // If it's a list or dict, or an object
57
+ if (field.type === 'list' || field.type === 'dict') {
58
+ // If not, iterate
59
+ next.push({
60
+ i: item.i + 1,
61
+ field: field.children['#']
62
+ });
63
+ continue;
64
+ }
65
+ // If it's an object and the path is '*', walk all of it's children
66
+ if (field.type === 'obj' && path === '*') {
67
+ next.push(...Object.values(field.children).map(field => ({
68
+ i: item.i + 1,
69
+ field
70
+ })));
71
+ continue;
72
+ }
73
+ const child = field.children[path];
74
+ if (child) {
75
+ next.push({
76
+ i: item.i + 1,
77
+ field: child
78
+ });
79
+ }
53
80
  }
54
- ref = ref.children;
81
+ poll = next;
55
82
  }
56
- return ref;
83
+ return results;
57
84
  }
58
85
  static fieldsOfType(model, type) {
59
86
  const fields = [];
@@ -72,5 +99,141 @@ class $BucketModel {
72
99
  }
73
100
  return fields;
74
101
  }
102
+ static forEachField(model, predicate) {
103
+ let poll = Object.entries(model.fields).map(([path, field]) => ({ path, field }));
104
+ while (poll.length) {
105
+ const next = [];
106
+ for (const obj of poll) {
107
+ predicate(obj.field, obj.path);
108
+ if (obj.field.children) {
109
+ next.push(...Object.values(obj.field.children)
110
+ .map((field, i) => ({
111
+ field,
112
+ path: obj.path + '.' + (obj.field.type === 'union' ? i : field.name)
113
+ })));
114
+ }
115
+ }
116
+ poll = next;
117
+ }
118
+ }
119
+ static copy(model, obj, meta = {
120
+ created_at: 'created_at',
121
+ created_by: 'created_by',
122
+ updated_at: 'updated_at',
123
+ updated_by: 'updated_by',
124
+ }) {
125
+ const copy = {};
126
+ let poll = Object.entries(model.fields).map(([path, field]) => ({ path, obj, copy, field }));
127
+ while (poll.length) {
128
+ const next = [];
129
+ for (const entry of poll) {
130
+ const val = obj[entry.path];
131
+ if (val === undefined) {
132
+ continue;
133
+ }
134
+ if (val === null) {
135
+ copy[entry.path] = null;
136
+ continue;
137
+ }
138
+ if (entry.field.type === 'list') {
139
+ if (!Array.isArray(val))
140
+ continue;
141
+ copy[entry.path] = [];
142
+ next.push(...val.map((_, i) => ({
143
+ path: i.toString(),
144
+ obj: val,
145
+ copy: copy[entry.path],
146
+ field: entry.field.children['*']
147
+ })));
148
+ }
149
+ else if (entry.field.type === 'dict') {
150
+ if (typeof val !== 'object' || Array.isArray(val))
151
+ continue;
152
+ copy[entry.path] = {};
153
+ next.push(...Object.keys(val).map((path) => ({
154
+ path,
155
+ obj: val,
156
+ copy: copy[entry.path],
157
+ field: entry.field.children['*']
158
+ })));
159
+ }
160
+ else if (entry.field.type === 'obj') {
161
+ if (typeof val !== 'object' || Array.isArray(val))
162
+ continue;
163
+ copy[entry.path] = {};
164
+ next.push(...Object.keys(entry.field.children).map(path => ({
165
+ path: path,
166
+ obj: val,
167
+ copy: copy[entry.path],
168
+ field: entry.field.children[path]
169
+ })));
170
+ }
171
+ else if (entry.field.type === 'union') {
172
+ // TODO: ??????????
173
+ copy[entry.path] = obj[entry.path];
174
+ }
175
+ else {
176
+ copy[entry.path] = obj[entry.path];
177
+ }
178
+ }
179
+ poll = next;
180
+ }
181
+ copy[meta.created_at] = obj[meta.created_at];
182
+ copy[meta.created_by] = obj[meta.created_by];
183
+ copy[meta.updated_at] = obj[meta.updated_at];
184
+ copy[meta.updated_by] = obj[meta.updated_by];
185
+ return copy;
186
+ }
187
+ static getModelpaths(model) {
188
+ const modelpaths = {};
189
+ let poll = Object.entries(model.fields).map(([path, field]) => ({ path, field }));
190
+ while (poll.length) {
191
+ const next = [];
192
+ for (const obj of poll) {
193
+ if (obj.field.type === 'union') {
194
+ modelpaths[obj.path] = [obj.field];
195
+ }
196
+ else {
197
+ modelpaths[obj.path] = [obj.field];
198
+ if (obj.field.children) {
199
+ if (obj.field.type === 'dict') {
200
+ modelpaths[obj.path + '{*}'] = [obj.field.children['#']];
201
+ }
202
+ else if (obj.field.type === 'list') {
203
+ modelpaths[obj.path + '[*]'] = [obj.field.children['#']];
204
+ }
205
+ else if (obj.field.type === 'obj') {
206
+ modelpaths[obj.path + '{*}'] = Object.values(obj.field.children);
207
+ }
208
+ for (const key in obj.field.children) {
209
+ const child = obj.field.children[key];
210
+ if (obj.field.type === 'dict') {
211
+ modelpaths[obj.path + '{$${number}}'] = [child];
212
+ next.push({
213
+ field: child,
214
+ path: obj.path + '{${string}}'
215
+ });
216
+ }
217
+ else if (obj.field.type === 'list') {
218
+ modelpaths[obj.path + '[$${number}]'] = [child];
219
+ next.push({
220
+ field: child,
221
+ path: obj.path + '[${number}]'
222
+ });
223
+ }
224
+ else {
225
+ next.push({
226
+ field: child,
227
+ path: obj.path + '.' + child.name
228
+ });
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ poll = next;
235
+ }
236
+ return modelpaths;
237
+ }
75
238
  }
76
239
  exports.$BucketModel = $BucketModel;
@@ -1,7 +1,7 @@
1
1
  import { $Module, $Space } from "../../../../schema";
2
2
  import { $BucketModelField, $BucketModelFieldType, $BucketModelFields } from './bucket_model.schema';
3
3
  import { NesoiDate } from "../../../../engine/data/date";
4
- import { BucketFieldpathObjInfer, BucketModelObjInfer } from './bucket_model.infer';
4
+ import { BucketModelpathObjInfer, BucketModelpathDictInfer, BucketModelpathListInfer, BucketModelObjInfer, BucketQuerypathDictInfer, BucketQuerypathListInfer, BucketQuerypathObjInfer, BucketModelpathUnionInfer } from './bucket_model.infer';
5
5
  import { EnumFromName, EnumName } from '../../constants/constants.schema';
6
6
  import { NesoiDecimal } from "../../../../engine/data/decimal";
7
7
  import { NesoiDatetime } from "../../../../engine/data/datetime";
@@ -16,111 +16,144 @@ export declare class BucketModelFieldFactory<Space extends $Space, Module extend
16
16
  constructor(module: string);
17
17
  private alias?;
18
18
  as(alias: string): Omit<typeof this, "as">;
19
- get any(): BucketModelFieldBuilder<Module, any, never, any, {
19
+ get any(): BucketModelFieldBuilder<Module, any, any, [false, false], {
20
+ '': any;
21
+ }, {
20
22
  '': any;
21
23
  }>;
22
- get boolean(): BucketModelFieldBuilder<Module, boolean, never, boolean, {
24
+ get boolean(): BucketModelFieldBuilder<Module, boolean, boolean, [false, false], {
25
+ '': boolean;
26
+ }, {
23
27
  '': boolean;
24
28
  }>;
25
- get date(): BucketModelFieldBuilder<Module, NesoiDate, never, NesoiDate, {
29
+ get date(): BucketModelFieldBuilder<Module, NesoiDate, NesoiDate, [false, false], {
30
+ '': NesoiDate;
31
+ }, {
26
32
  '': NesoiDate;
27
33
  }>;
28
- get datetime(): BucketModelFieldBuilder<Module, NesoiDatetime, never, NesoiDatetime, {
34
+ get datetime(): BucketModelFieldBuilder<Module, NesoiDatetime, NesoiDatetime, [false, false], {
35
+ '': NesoiDatetime;
36
+ }, {
29
37
  '': NesoiDatetime;
30
38
  }>;
31
- get duration(): BucketModelFieldBuilder<Module, NesoiDuration, never, NesoiDuration, {
39
+ get duration(): BucketModelFieldBuilder<Module, NesoiDuration, NesoiDuration, [false, false], {
40
+ '': NesoiDuration;
41
+ }, {
32
42
  '': NesoiDuration;
33
43
  }>;
34
44
  decimal(def?: {
35
45
  left?: number;
36
46
  right?: number;
37
- }): BucketModelFieldBuilder<Module, NesoiDecimal, never, NesoiDecimal, {
47
+ }): BucketModelFieldBuilder<Module, NesoiDecimal, NesoiDecimal, [false, false], {
48
+ '': NesoiDecimal;
49
+ }, {
38
50
  '': NesoiDecimal;
39
51
  }>;
40
- enum<Enums extends EnumName<Space>, Options extends (keyof Enums & string) | (readonly string[])>(options: Options): BucketModelFieldBuilder<Module, Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], never, Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], {
41
- '': Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options];
52
+ enum<Enums extends EnumName<Space>, Options extends (keyof Enums & string) | (readonly string[])>(options: Options): BucketModelFieldBuilder<Module, Options extends string ? keyof EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], Options extends string ? keyof EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], [false, false], {
53
+ '': Options extends string ? keyof EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options];
54
+ }, {
55
+ '': Options extends string ? keyof EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options];
42
56
  }>;
43
- get int(): BucketModelFieldBuilder<Module, number, never, number, {
57
+ get int(): BucketModelFieldBuilder<Module, number, number, [false, false], {
58
+ '': number;
59
+ }, {
44
60
  '': number;
45
61
  }>;
46
- get float(): BucketModelFieldBuilder<Module, number, never, number, {
62
+ get float(): BucketModelFieldBuilder<Module, number, number, [false, false], {
63
+ '': number;
64
+ }, {
47
65
  '': number;
48
66
  }>;
49
- get string(): BucketModelFieldBuilder<Module, string, never, string, {
67
+ get string(): BucketModelFieldBuilder<Module, string, string, [false, false], {
68
+ '': string;
69
+ }, {
50
70
  '': string;
51
71
  }>;
72
+ file(def?: {
73
+ extnames?: string[];
74
+ maxsize?: number;
75
+ }): BucketModelFieldBuilder<Module, NesoiFile, NesoiFile, [false, false], {
76
+ '': NesoiFile;
77
+ }, {
78
+ '': NesoiFile;
79
+ }>;
52
80
  /**
53
81
  * An object with a specific set of child fields.
54
82
  */
55
- obj<T extends BucketModelFieldBuilders<Module>>(fields?: T): BucketModelFieldBuilder<Module, BucketModelObjInfer<T>, never, BucketModelObjInfer<T>, {
83
+ obj<T extends BucketModelFieldBuilders<Module>>(fields?: T): BucketModelFieldBuilder<Module, BucketModelObjInfer<T>, BucketModelObjInfer<T>, [false, false], {
56
84
  '': BucketModelObjInfer<T>;
57
- } & BucketFieldpathObjInfer<T, ".">>;
85
+ } & {
86
+ '.*': BucketModelObjInfer<T>[keyof { [K in keyof T as T[K]["#optional"][1] extends true ? never : `${K & string}`]: T[K]["#output"]; } | keyof { [K_1 in keyof T as T[K_1]["#optional"][1] extends true ? `${K_1 & string}` : never]?: T[K_1]["#output"] | undefined; }];
87
+ } & BucketModelpathObjInfer<T>, {
88
+ '': BucketModelObjInfer<T>;
89
+ } & BucketQuerypathObjInfer<T>>;
58
90
  /**
59
91
  * An object with an unknown number of child fields of a given type.
60
92
  *
61
93
  * - All child fields are optional. You can specify a default value.
62
94
  */
63
- dict<T extends BucketModelFieldBuilder<Module, any>>(dictItem: T): BucketModelFieldBuilder<Module, Record<string, T extends BucketModelFieldBuilder<any, any, any, infer X, {
64
- '': infer X;
65
- }> ? X : never>, never, Record<string, T extends BucketModelFieldBuilder<any, any, any, infer X, {
66
- '': infer X;
67
- }> ? X : never>, {
68
- '': Record<string, T extends BucketModelFieldBuilder<any, any, any, infer X, {
69
- '': infer X;
70
- }> ? X : never>;
71
- } & BucketFieldpathObjInfer<{
72
- '': T;
73
- }, ".#">>;
74
- file(def?: {
75
- extnames?: string[];
76
- maxsize?: number;
77
- }): BucketModelFieldBuilder<Module, NesoiFile, never, NesoiFile, {
78
- '': NesoiFile;
79
- }>;
95
+ dict<T extends BucketModelFieldBuilder<Module, any, any, any, any>>(dictItem: T): BucketModelFieldBuilder<Module, Record<string, T["#input"]>, Record<string, T["#output"]>, [false, false], {
96
+ '': Record<string, T["#output"]>;
97
+ } & BucketModelpathDictInfer<T>, {
98
+ '': Record<string, T["#output"]>;
99
+ } & BucketQuerypathDictInfer<T>>;
100
+ /**
101
+ * A list of a given type
102
+ * - All child fields are optional. You can specify a default value.
103
+ */
104
+ list<T extends BucketModelFieldBuilder<Module, any, any, any, any>>(listItem: T): BucketModelFieldBuilder<Module, T["#input"][], T["#output"][], [false, false], {
105
+ '': T["#output"][];
106
+ } & BucketModelpathListInfer<T>, {
107
+ '': T["#output"][];
108
+ } & BucketQuerypathListInfer<T>>;
109
+ union<Builders extends AnyBucketModelFieldBuilder[]>(...children: Builders): BucketModelFieldBuilder<Module, Builders[number]["#input"], Builders[number]["#output"], [false, false], BucketModelpathUnionInfer<Builders>, Builders[number]["#querypath"]>;
80
110
  }
81
111
  /**
82
112
  * @category Builders
83
113
  * @subcategory Entity
84
114
  * */
85
- export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData, TypeAppend = never, Data = DefinedData | TypeAppend, Fieldpath = {
86
- '': Data;
115
+ export declare class BucketModelFieldBuilder<Module extends $Module, Input, Output, Optional = [false, false], Modelpath = {
116
+ '': Output;
117
+ }, Querypath = {
118
+ '': Output;
87
119
  }> {
88
120
  private module;
89
121
  private type;
90
122
  private alias?;
91
123
  private meta?;
92
124
  private children?;
93
- private _array;
125
+ '#input': Input;
126
+ '#output': Output;
127
+ '#optional': Optional;
128
+ '#modelpath': Modelpath;
129
+ '#querypath': Querypath;
94
130
  private _required;
95
131
  private _defaultValue?;
96
- private _or?;
97
132
  private crypto?;
98
133
  constructor(module: string, type: $BucketModelFieldType, alias?: string | undefined, meta?: $BucketModelField['meta'], children?: BucketModelFieldBuilders<Module> | undefined);
99
134
  as(alias: string): this;
100
135
  /**
101
- * This field can be `undefined`.
136
+ * This field can be `undefined` or `null`.
102
137
  */
103
- get optional(): BucketModelFieldBuilder<Module, DefinedData, undefined, DefinedData | undefined, { [K in keyof Fieldpath]: Fieldpath[K] | undefined; }>;
138
+ get optional(): BucketModelFieldBuilder<Module, Input | null | undefined, Output | null | undefined, [
139
+ true,
140
+ true
141
+ ], {
142
+ [K in keyof Modelpath]: Modelpath[K] | null | undefined;
143
+ }, {
144
+ [K in keyof Querypath]: Querypath[K] | null | undefined;
145
+ }>;
104
146
  /**
105
147
  * If this field is undefined on the source, it will be
106
148
  * read as the given value.
107
- * Also, when creating or updating the model through a default
108
- * resource method, this value is used if undefined is passed.
149
+ * Also, when a message is generated for this model,
150
+ * the field can be undefined on the input and will have this value
151
+ * after parsed.
109
152
  */
110
- default(defaultValue: DefinedData): BucketModelFieldBuilder<Module, DefinedData, never, DefinedData, Fieldpath>;
111
- get array(): BucketModelFieldBuilder<Module, DefinedData[], TypeAppend, DefinedData[] | TypeAppend, { [K in Exclude<keyof Fieldpath, ""> as `.#${K & string}`]: Fieldpath[K]; } & {
112
- "": DefinedData[] | TypeAppend;
113
- ".#": DefinedData | TypeAppend;
114
- }>;
115
- or<Def extends AnyBucketModelFieldBuilder>(def: Def): BucketModelFieldBuilder<Module, DefinedData | (Def extends BucketModelFieldBuilder<any, any, any, infer X, {
116
- '': infer X;
117
- }> ? X : never), TypeAppend, DefinedData | (Def extends BucketModelFieldBuilder<any, any, any, infer X, {
118
- '': infer X;
119
- }> ? X : never) | TypeAppend, { [K in Exclude<keyof Fieldpath, "">]: Fieldpath[K] | (K extends keyof (Def extends BucketModelFieldBuilder<any, any, any, any, infer X_1> ? X_1 : never) ? (Def extends BucketModelFieldBuilder<any, any, any, any, infer X_1> ? X_1 : never)[K] : undefined); } & {
120
- "": DefinedData | (Def extends BucketModelFieldBuilder<any, any, any, infer X, {
121
- '': infer X;
122
- }> ? X : never) | TypeAppend;
123
- } & { [K in Exclude<keyof (Def extends BucketModelFieldBuilder<any, any, any, any, infer X_1> ? X_1 : never), "">]: (Def extends BucketModelFieldBuilder<any, any, any, any, infer X_1> ? X_1 : never)[K]; }>;
153
+ default(defaultValue: Output): BucketModelFieldBuilder<Module, Input | undefined, Output, [
154
+ true,
155
+ (Optional & [boolean, boolean])[1]
156
+ ], Modelpath, Querypath>;
124
157
  /**
125
158
  * This can be applied to `string` and `enum` fields,
126
159
  * to control storage performance.
@@ -132,7 +165,7 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
132
165
  */
133
166
  maxLength(val: number | null): void;
134
167
  encrypt(key: keyof Module['constants']['values'], algorithm?: string): void;
135
- static build(builder: BucketModelFieldBuilder<any, any>, name: string, basePath?: string): {
168
+ static build(builder: AnyBucketModelFieldBuilder, name: string, basePath?: string): {
136
169
  schema: $BucketModelField;
137
170
  hasFile: boolean;
138
171
  hasEncrypted: boolean;
@@ -145,6 +178,6 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
145
178
  };
146
179
  }
147
180
  export type BucketModelFieldBuilders<Module extends $Module> = {
148
- [x: string]: BucketModelFieldBuilder<Module, any> | BucketModelFieldBuilders<Module>;
181
+ [x: string]: BucketModelFieldBuilder<Module, any, any, any, any, any> | BucketModelFieldBuilders<Module>;
149
182
  };
150
- export type AnyBucketModelFieldBuilder = BucketModelFieldBuilder<any, any>;
183
+ export type AnyBucketModelFieldBuilder = BucketModelFieldBuilder<any, any, any, any, any, any>;
@@ -65,6 +65,11 @@ class BucketModelFieldFactory {
65
65
  get string() {
66
66
  return new BucketModelFieldBuilder(this.module, 'string', this.alias);
67
67
  }
68
+ file(def) {
69
+ return new BucketModelFieldBuilder(this.module, 'file', this.alias, {
70
+ file: def
71
+ });
72
+ }
68
73
  /**
69
74
  * An object with a specific set of child fields.
70
75
  */
@@ -77,13 +82,17 @@ class BucketModelFieldFactory {
77
82
  * - All child fields are optional. You can specify a default value.
78
83
  */
79
84
  dict(dictItem) {
80
- dictItem = dictItem.optional;
81
- return new BucketModelFieldBuilder(this.module, 'dict', this.alias, undefined, { __dict: dictItem });
85
+ return new BucketModelFieldBuilder(this.module, 'dict', this.alias, undefined, { '#': dictItem });
82
86
  }
83
- file(def) {
84
- return new BucketModelFieldBuilder(this.module, 'file', this.alias, {
85
- file: def
86
- });
87
+ /**
88
+ * A list of a given type
89
+ * - All child fields are optional. You can specify a default value.
90
+ */
91
+ list(listItem) {
92
+ return new BucketModelFieldBuilder(this.module, 'list', this.alias, undefined, { '#': listItem });
93
+ }
94
+ union(...children) {
95
+ return new BucketModelFieldBuilder(this.module, 'union', this.alias, undefined, Object.fromEntries(children.map((c, i) => [i, c])));
87
96
  }
88
97
  }
89
98
  exports.BucketModelFieldFactory = BucketModelFieldFactory;
@@ -101,7 +110,6 @@ class BucketModelFieldBuilder {
101
110
  this.alias = alias;
102
111
  this.meta = meta;
103
112
  this.children = children;
104
- this._array = false;
105
113
  this._required = true;
106
114
  this._defaultValue = undefined;
107
115
  }
@@ -110,7 +118,7 @@ class BucketModelFieldBuilder {
110
118
  return this;
111
119
  }
112
120
  /**
113
- * This field can be `undefined`.
121
+ * This field can be `undefined` or `null`.
114
122
  */
115
123
  get optional() {
116
124
  this._required = false;
@@ -119,26 +127,15 @@ class BucketModelFieldBuilder {
119
127
  /**
120
128
  * If this field is undefined on the source, it will be
121
129
  * read as the given value.
122
- * Also, when creating or updating the model through a default
123
- * resource method, this value is used if undefined is passed.
130
+ * Also, when a message is generated for this model,
131
+ * the field can be undefined on the input and will have this value
132
+ * after parsed.
124
133
  */
125
134
  default(defaultValue) {
126
135
  this._required = false;
127
136
  this._defaultValue = defaultValue;
128
137
  return this;
129
138
  }
130
- get array() {
131
- this._array = true;
132
- if (this._or) {
133
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
134
- this._or.array;
135
- }
136
- return this;
137
- }
138
- or(def) {
139
- def._or = this;
140
- return def;
141
- }
142
139
  /**
143
140
  * This can be applied to `string` and `enum` fields,
144
141
  * to control storage performance.
@@ -159,24 +156,19 @@ class BucketModelFieldBuilder {
159
156
  // Build
160
157
  static build(builder, name, basePath = '') {
161
158
  const path = basePath + name;
162
- const itemPath = builder._array ? path + '.#.' : path + '.';
159
+ const childrenPath = path + '.';
163
160
  const children = builder.children
164
- ? BucketModelFieldBuilder.buildChildren(builder.module, builder.children, itemPath)
161
+ ? BucketModelFieldBuilder.buildChildren(builder.module, builder.children, childrenPath)
165
162
  : undefined;
166
163
  const defaults = builder._defaultValue && builder.children
167
164
  ? Object.assign({}, builder._defaultValue, children?.defaults)
168
165
  : builder._defaultValue;
169
- const or = builder._or
170
- ? this.build(builder._or, name, basePath)
171
- : undefined;
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);
166
+ const schema = new bucket_model_schema_1.$BucketModelField(name, path, builder.type, builder.alias || name, builder._required, builder.meta, defaults, children?.schema, builder.crypto);
173
167
  const hasFile = builder.type === 'file'
174
168
  || children?.hasFileField
175
- || or?.hasFile
176
169
  || false;
177
170
  const hasEncrypted = !!builder.crypto
178
171
  || children?.hasEncryptedField
179
- || or?.hasEncrypted
180
172
  || false;
181
173
  return { schema, hasFile, hasEncrypted };
182
174
  }