nesoi 3.0.20 → 3.1.0

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 (86) hide show
  1. package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +8 -0
  2. package/lib/compiler/compiler.js +1 -1
  3. package/lib/compiler/elements/bucket.element.d.ts +2 -1
  4. package/lib/compiler/elements/bucket.element.js +68 -122
  5. package/lib/compiler/elements/element.js +2 -1
  6. package/lib/compiler/elements/externals.element.js +3 -0
  7. package/lib/compiler/elements/message.element.js +34 -57
  8. package/lib/compiler/elements/queue.element.js +1 -1
  9. package/lib/compiler/helpers/dump_helpers.d.ts +2 -0
  10. package/lib/compiler/helpers/dump_helpers.js +12 -2
  11. package/lib/compiler/stages/4_build_schemas_stage.js +12 -0
  12. package/lib/compiler/stages/5_inject_ts_stage.js +4 -1
  13. package/lib/compiler/stages/7_dump_stage.js +7 -1
  14. package/lib/compiler/treeshake.js +4 -2
  15. package/lib/compiler/typescript/bridge/extract.js +37 -107
  16. package/lib/compiler/typescript/bridge/inject.d.ts +1 -1
  17. package/lib/compiler/typescript/bridge/inject.js +73 -45
  18. package/lib/compiler/typescript/bridge/organize.js +9 -5
  19. package/lib/compiler/typescript/typescript_compiler.d.ts +4 -6
  20. package/lib/compiler/typescript/typescript_compiler.js +139 -75
  21. package/lib/elements/blocks/block.builder.d.ts +1 -10
  22. package/lib/elements/blocks/block.builder.js +0 -32
  23. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +3 -21
  24. package/lib/elements/blocks/job/job.builder.d.ts +6 -20
  25. package/lib/elements/blocks/job/job.builder.js +0 -4
  26. package/lib/elements/blocks/machine/machine.builder.d.ts +5 -14
  27. package/lib/elements/blocks/machine/machine.builder.js +2 -2
  28. package/lib/elements/blocks/queue/queue.builder.d.ts +6 -15
  29. package/lib/elements/blocks/queue/queue.builder.js +2 -2
  30. package/lib/elements/edge/externals/externals.builder.d.ts +2 -0
  31. package/lib/elements/edge/externals/externals.builder.js +6 -1
  32. package/lib/elements/edge/externals/externals.schema.d.ts +2 -1
  33. package/lib/elements/edge/externals/externals.schema.js +3 -1
  34. package/lib/elements/entities/bucket/adapters/memory.nql.js +1 -1
  35. package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
  36. package/lib/elements/entities/bucket/bucket.js +7 -16
  37. package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
  38. package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +7 -5
  39. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -1
  40. package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +1 -1
  41. package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +1 -1
  42. package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
  43. package/lib/elements/entities/bucket/model/bucket_model.infer.d.ts +45 -9
  44. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +5 -6
  45. package/lib/elements/entities/bucket/model/bucket_model.schema.js +64 -21
  46. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +88 -55
  47. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +22 -30
  48. package/lib/elements/entities/bucket/query/nql.schema.d.ts +13 -10
  49. package/lib/elements/entities/bucket/query/nql_compiler.js +46 -21
  50. package/lib/elements/entities/bucket/view/bucket_view.builder.js +1 -1
  51. package/lib/elements/entities/bucket/view/bucket_view.d.ts +19 -0
  52. package/lib/elements/entities/bucket/view/bucket_view.js +230 -108
  53. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -10
  54. package/lib/elements/entities/bucket/view/bucket_view.schema.js +3 -5
  55. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +16 -12
  56. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +55 -40
  57. package/lib/elements/entities/message/message.builder.d.ts +1 -11
  58. package/lib/elements/entities/message/message.builder.js +2 -2
  59. package/lib/elements/entities/message/message.infer.d.ts +6 -30
  60. package/lib/elements/entities/message/message.schema.js +2 -2
  61. package/lib/elements/entities/message/message_parser.d.ts +0 -1
  62. package/lib/elements/entities/message/message_parser.js +1 -68
  63. package/lib/elements/entities/message/template/message_template.builder.js +1 -1
  64. package/lib/elements/entities/message/template/message_template.schema.d.ts +11 -6
  65. package/lib/elements/entities/message/template/message_template.schema.js +29 -6
  66. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +50 -203
  67. package/lib/elements/entities/message/template/message_template_field.builder.js +74 -74
  68. package/lib/elements/entities/message/template/message_template_parser.d.ts +2 -2
  69. package/lib/elements/entities/message/template/message_template_parser.js +137 -71
  70. package/lib/engine/apps/inline.app.js +1 -0
  71. package/lib/engine/data/error.d.ts +12 -11
  72. package/lib/engine/data/error.js +7 -7
  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/util/parse.d.ts +36 -28
  77. package/lib/engine/util/parse.js +53 -43
  78. package/lib/engine/util/type.d.ts +3 -0
  79. package/package.json +1 -1
  80. package/tools/joaquin/bucket.d.ts +9 -0
  81. package/tools/joaquin/bucket.js +49 -0
  82. package/tools/joaquin/message.d.ts +2 -1
  83. package/tools/joaquin/message.js +9 -2
  84. package/tools/joaquin/mock.d.ts +1 -0
  85. package/tools/joaquin/mock.js +13 -5
  86. package/tsconfig.build.tsbuildinfo +1 -1
@@ -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, 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], {
52
+ 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], Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], [false, false], {
53
+ '': Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options];
54
+ }, {
41
55
  '': Options extends string ? 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>;
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
+ } & { [J in keyof T["#modelpath"] as `.$${number}${J & string}` | `.${string}${J & string}`]: T["#modelpath"][J]; } & { [J_1 in keyof T["#modelpath"] as `.*${J_1 & string}`]: Record<string, T["#modelpath"][J_1]>; }, {
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
+ } & { [J in keyof T["#modelpath"] as `.$${number}${J & string}` | `.${number}${J & string}`]: T["#modelpath"][J]; } & { [J_1 in keyof T["#modelpath"] as `.*${J_1 & string}`]: T["#modelpath"][J_1][]; }, {
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
  }
@@ -2,6 +2,7 @@ import { $Bucket } from '../bucket.schema';
2
2
  import { $Module } from "../../../../schema";
3
3
  import { NesoiDate } from "../../../../engine/data/date";
4
4
  import { NesoiDatetime } from "../../../../engine/data/datetime";
5
+ import { NesoiDuration } from "../../../../engine/data/duration";
5
6
  export type NQL_QueryMeta = {
6
7
  bucket?: $Bucket;
7
8
  scope?: string;
@@ -49,8 +50,8 @@ export type NQL_Node = NQL_Union | NQL_Intersection | NQL_Rule;
49
50
  * All operations
50
51
  */
51
52
  export type NQL_Operation = '==' | '>' | '<' | '>=' | '<=' | 'in' | 'contains' | 'contains_any' | 'present';
52
- export type NQL_Order<Fieldpath> = {
53
- by?: keyof Fieldpath[];
53
+ export type NQL_Order<Querypath> = {
54
+ by?: keyof Querypath[];
54
55
  dir?: ('asc' | 'desc')[];
55
56
  };
56
57
  export type NQL_Pagination = {
@@ -61,7 +62,7 @@ export type NQL_Pagination = {
61
62
  /**
62
63
  * A union of all operators which apply to the selected field
63
64
  */
64
- type NQL_OpFromField<T> = T extends boolean ? '' | ' ==' | ' in' | ' present' : T extends number | NesoiDate | NesoiDatetime ? '' | ' ==' | ' >' | ' <' | ' >=' | ' <=' | ' in' | ' present' : T extends string ? '' | ' ==' | ' in' | ' contains' | ' contains_any' | ' present' | ' ~' | ' ~in' | ' ~contains' | ' ~contains_any' : T extends boolean[] | number[] | NesoiDate[] | NesoiDatetime[] | string[] ? '' | ' ==' | ' in' | ' contains' | ' contains_any' | ' present' : T extends object ? ' contains' | ' contains_any' | ' present' : ' present';
65
+ type NQL_OpFromField<T> = T extends boolean ? '' | ' ==' | ' in' | ' present' : T extends number | NesoiDate | NesoiDatetime | NesoiDuration ? '' | ' ==' | ' >' | ' <' | ' >=' | ' <=' | ' in' | ' present' : T extends string ? '' | ' ==' | ' in' | ' contains' | ' contains_any' | ' present' | ' ~' | ' ~in' | ' ~contains' | ' ~contains_any' : T extends object ? ' contains' | ' contains_any' | ' present' : ' present';
65
66
  /**
66
67
  * A dict of accepted values for a given operator on a bucket field
67
68
  */
@@ -92,13 +93,15 @@ type NQL_ConditionValue<T, Parameters, Titem = NoInfer<T extends (infer X)[] ? X
92
93
  '.': P;
93
94
  } | {
94
95
  '.': PArr;
95
- }[];
96
+ }[] | {
97
+ '$': string;
98
+ };
96
99
  /**
97
100
  * A field name of the subquery bucket which resolves to
98
101
  * a type that's compatible with the query
99
102
  */
100
- type NQL_SubQueryField<$ extends $Bucket, Field, Fieldpath = NoInfer<$['#fieldpath']>, T = NoInfer<Fieldpath[Field & keyof Fieldpath]>> = keyof {
101
- [X in keyof Fieldpath as NonNullable<T> extends NonNullable<Fieldpath[X]> ? X : never]: any;
103
+ type NQL_SubQueryField<$ extends $Bucket, Field, Querypath = NoInfer<$['#modelpath']>, T = NoInfer<Querypath[Field & keyof Querypath]>> = keyof {
104
+ [X in keyof Querypath as NonNullable<T> extends NonNullable<Querypath[X]> ? X : never]: any;
102
105
  };
103
106
  /**
104
107
  * A subquery passed as value to a query
@@ -120,14 +123,14 @@ type NQL_GraphLinks<M extends $Module, $ extends $Bucket, Parameters = {}> = {
120
123
  All possible query rules on the format:
121
124
  (or |)FIELDNAME( not|)OPERATOR
122
125
  */
123
- type NQL_Terms<M extends $Module, $ extends $Bucket, Parameters = {}, Fieldpath = NoInfer<$['#fieldpath']>, Conditions = NoInfer<{
124
- [Field in keyof Fieldpath as Field]: {
125
- [Op in NQL_OpFromField<Fieldpath[Field]> as `${'or ' | ''}${Field & string}${' not' | ''}${Op}`]?: NQL_ConditionValue<NQL_ValueFromOp<Fieldpath[Field]>[Op], Parameters> | NQL_SubQuery<M, Field, Parameters>;
126
+ type NQL_Terms<M extends $Module, $ extends $Bucket, Parameters = {}, Querypath = NoInfer<$['#querypath']>, Conditions = NoInfer<{
127
+ [Field in keyof Querypath as Field]: {
128
+ [Op in NQL_OpFromField<Querypath[Field]> as `${'or ' | ''}${Field & string}${' not' | ''}${Op}`]?: NQL_ConditionValue<NQL_ValueFromOp<Querypath[Field]>[Op], Parameters> | NQL_SubQuery<M, Field, Parameters>;
126
129
  };
127
130
  }>> = Conditions[keyof Conditions] & {
128
131
  [K in `${'#and' | '#or'}${string}`]?: NQL_Terms<M, $, Parameters>;
129
132
  } & NQL_GraphLinks<M, $, Parameters> & {
130
- '#order'?: NQL_Order<Fieldpath>;
133
+ '#order'?: NQL_Order<Querypath>;
131
134
  };
132
135
  /**
133
136
  * NQL Dynamic Query Type
@@ -86,14 +86,16 @@ class NQL_RuleTree {
86
86
  let by = value['by'];
87
87
  if (by) {
88
88
  for (const key of by) {
89
- const field = bucket_model_schema_1.$BucketModel.get(bucket.schema.model, key);
90
- if (!field) {
89
+ const fields = bucket_model_schema_1.$BucketModel.getField(bucket.schema.model, key);
90
+ if (!fields.length) {
91
91
  throw new Error(`Field '${key}' not found on bucket '${bucket.schema.name}'`);
92
92
  }
93
- if (![
94
- 'date', 'datetime', 'duration', 'decimal', 'enum', 'float', 'int', 'string'
95
- ].includes(field.type)) {
96
- throw new Error(`Field '${key}' is not sortable`);
93
+ for (const field of fields) {
94
+ if (![
95
+ 'date', 'datetime', 'duration', 'decimal', 'enum', 'float', 'int', 'string'
96
+ ].includes(field.type)) {
97
+ throw new Error(`Field '${key}' is not sortable`);
98
+ }
97
99
  }
98
100
  }
99
101
  }
@@ -141,25 +143,46 @@ class NQL_RuleTree {
141
143
  throw new Error(`Invalid term '${key}'`);
142
144
  }
143
145
  const [_, or, fieldpath, not, case_i, op] = term;
144
- const field = bucket_model_schema_1.$BucketModel.get(bucket.schema.model, fieldpath);
145
- if (!field) {
146
+ const fields = bucket_model_schema_1.$BucketModel.getField(bucket.schema.model, fieldpath);
147
+ if (!fields.length) {
146
148
  throw new Error(`Field '${fieldpath}' not found on bucket '${bucket.schema.name}'`);
147
149
  }
148
- const _op = this.parseOp(bucket.schema.name, field, op);
150
+ const _op = this.parseOp(bucket.schema.name, fields, op);
149
151
  return { type: 'fieldpath', or: !!or, fieldpath, not: !!not, case_i: !!case_i, op: _op };
150
152
  }
151
153
  }
152
- parseOp(bucketName, field, op) {
154
+ parseOp(bucketName, fields, op) {
153
155
  const _op = (op === '' ? '==' : op);
154
- if (![
155
- '==', '>', '<', '>=', '<=',
156
- 'in', 'contains', 'contains_any', 'present'
157
- ].includes(_op)) {
158
- throw new Error(`Invalid operation '${_op}' not found on bucket '${bucketName}'`);
159
- }
160
- const allowedOps = NQL_RuleTree.OpByType[field.type];
161
- if (!allowedOps.includes(_op)) {
162
- throw new Error(`Field '${field.name}' of type '${field.type}' doesn't support operation '${op}'`);
156
+ for (const field of fields) {
157
+ if (![
158
+ '==', '>', '<', '>=', '<=',
159
+ 'in', 'contains', 'contains_any', 'present'
160
+ ].includes(_op)) {
161
+ throw new Error(`Invalid operation '${_op}'`);
162
+ }
163
+ let allowedOps;
164
+ // If field is a union, use the intersection of allowed operations
165
+ if (field.type === 'union') {
166
+ const children = Object.values(field.children);
167
+ const opsUnion = children
168
+ .map(f => NQL_RuleTree.OpByType[f.type])
169
+ .flat(1);
170
+ const dict = {};
171
+ for (const op of opsUnion) {
172
+ dict[op] ?? (dict[op] = 0);
173
+ dict[op]++;
174
+ }
175
+ allowedOps = Object.entries(dict)
176
+ .filter(([k, v]) => v === children.length)
177
+ .map(([k]) => k);
178
+ }
179
+ // If not, use the field allowed operations
180
+ else {
181
+ allowedOps = NQL_RuleTree.OpByType[field.type];
182
+ }
183
+ if (!allowedOps.includes(_op)) {
184
+ throw new Error(`Field '${field.name}' of type '${field.type}' doesn't support operation '${_op}'`);
185
+ }
163
186
  }
164
187
  return _op;
165
188
  }
@@ -223,7 +246,7 @@ class NQL_RuleTree {
223
246
  if (!bucket) {
224
247
  throw new Error(`Bucket '${bucket}' not found on module`);
225
248
  }
226
- const field = bucket_model_schema_1.$BucketModel.get(bucket.schema.model, fieldpath);
249
+ const field = bucket_model_schema_1.$BucketModel.getField(bucket.schema.model, fieldpath);
227
250
  if (!field) {
228
251
  throw new Error(`Field '${fieldpath}' not found on bucket '${bucket.schema.name}'`);
229
252
  }
@@ -442,8 +465,10 @@ NQL_RuleTree.OpByType = {
442
465
  'file': [],
443
466
  'float': ['<', '<=', '==', '>', '>=', 'in', 'present'],
444
467
  'int': ['<', '<=', '==', '>', '>=', 'in', 'present'],
445
- 'obj': ['==', 'contains', 'contains_any', 'in', 'present'],
446
468
  'string': ['==', 'contains', 'contains_any', 'in', 'present'],
469
+ 'obj': ['contains_any', 'in', 'present'],
470
+ 'list': ['contains', 'contains_any', 'present'],
471
+ 'union': [],
447
472
  'unknown': ['present']
448
473
  };
449
474
  /**
@@ -21,7 +21,7 @@ class BucketViewBuilder {
21
21
  static build(builder, model, graph, views) {
22
22
  const fields = bucket_view_field_builder_1.BucketViewFieldBuilder.buildFields(builder._fields, model, graph, views);
23
23
  const schema = new bucket_view_schema_1.$BucketView(builder.name, fields);
24
- schema.fields.id = new bucket_view_schema_1.$BucketViewField('id', 'model', 'id', 'id', false, true, { model: { key: 'id' } });
24
+ schema.fields.id = new bucket_view_schema_1.$BucketViewField('id', 'model', 'id', { model: { path: 'id' } });
25
25
  return schema;
26
26
  }
27
27
  }
@@ -11,4 +11,23 @@ export declare class BucketView<$ extends $BucketView> {
11
11
  schema: $;
12
12
  constructor(bucket: Bucket<any, any>, schema: $);
13
13
  parse<Obj extends NesoiObj>(trx: AnyTrxNode, raw: Obj): Promise<$['#data']>;
14
+ private parseLayer;
15
+ /**
16
+ * [model]
17
+ * Read one property from
18
+ */
19
+ private parseModelProp;
20
+ private doParseModelProp;
21
+ /**
22
+ * [computed]
23
+ */
24
+ private parseComputedProp;
25
+ /**
26
+ * [graph]
27
+ */
28
+ private parseGraphProp;
29
+ /**
30
+ * [drive]
31
+ */
32
+ private parseDriveProp;
14
33
  }