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.
- package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +8 -0
- package/lib/compiler/compiler.js +1 -1
- package/lib/compiler/elements/bucket.element.d.ts +2 -1
- package/lib/compiler/elements/bucket.element.js +68 -122
- package/lib/compiler/elements/element.js +2 -1
- package/lib/compiler/elements/externals.element.js +3 -0
- package/lib/compiler/elements/message.element.js +34 -57
- package/lib/compiler/elements/queue.element.js +1 -1
- package/lib/compiler/helpers/dump_helpers.d.ts +2 -0
- package/lib/compiler/helpers/dump_helpers.js +12 -2
- package/lib/compiler/stages/4_build_schemas_stage.js +12 -0
- package/lib/compiler/stages/5_inject_ts_stage.js +4 -1
- package/lib/compiler/stages/7_dump_stage.js +7 -1
- package/lib/compiler/treeshake.js +4 -2
- package/lib/compiler/typescript/bridge/extract.js +37 -107
- package/lib/compiler/typescript/bridge/inject.d.ts +1 -1
- package/lib/compiler/typescript/bridge/inject.js +73 -45
- package/lib/compiler/typescript/bridge/organize.js +9 -5
- package/lib/compiler/typescript/typescript_compiler.d.ts +4 -6
- package/lib/compiler/typescript/typescript_compiler.js +139 -75
- package/lib/elements/blocks/block.builder.d.ts +1 -10
- package/lib/elements/blocks/block.builder.js +0 -32
- package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +3 -21
- package/lib/elements/blocks/job/job.builder.d.ts +6 -20
- package/lib/elements/blocks/job/job.builder.js +0 -4
- package/lib/elements/blocks/machine/machine.builder.d.ts +5 -14
- package/lib/elements/blocks/machine/machine.builder.js +2 -2
- package/lib/elements/blocks/queue/queue.builder.d.ts +6 -15
- package/lib/elements/blocks/queue/queue.builder.js +2 -2
- package/lib/elements/edge/externals/externals.builder.d.ts +2 -0
- package/lib/elements/edge/externals/externals.builder.js +6 -1
- package/lib/elements/edge/externals/externals.schema.d.ts +2 -1
- package/lib/elements/edge/externals/externals.schema.js +3 -1
- package/lib/elements/entities/bucket/adapters/memory.nql.js +1 -1
- package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
- package/lib/elements/entities/bucket/bucket.js +7 -16
- package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
- package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +7 -5
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -1
- package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
- package/lib/elements/entities/bucket/model/bucket_model.infer.d.ts +45 -9
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +5 -6
- package/lib/elements/entities/bucket/model/bucket_model.schema.js +64 -21
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +88 -55
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +22 -30
- package/lib/elements/entities/bucket/query/nql.schema.d.ts +13 -10
- package/lib/elements/entities/bucket/query/nql_compiler.js +46 -21
- package/lib/elements/entities/bucket/view/bucket_view.builder.js +1 -1
- package/lib/elements/entities/bucket/view/bucket_view.d.ts +19 -0
- package/lib/elements/entities/bucket/view/bucket_view.js +230 -108
- package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -10
- package/lib/elements/entities/bucket/view/bucket_view.schema.js +3 -5
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +16 -12
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +55 -40
- package/lib/elements/entities/message/message.builder.d.ts +1 -11
- package/lib/elements/entities/message/message.builder.js +2 -2
- package/lib/elements/entities/message/message.infer.d.ts +6 -30
- package/lib/elements/entities/message/message.schema.js +2 -2
- package/lib/elements/entities/message/message_parser.d.ts +0 -1
- package/lib/elements/entities/message/message_parser.js +1 -68
- package/lib/elements/entities/message/template/message_template.builder.js +1 -1
- package/lib/elements/entities/message/template/message_template.schema.d.ts +11 -6
- package/lib/elements/entities/message/template/message_template.schema.js +29 -6
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +50 -203
- package/lib/elements/entities/message/template/message_template_field.builder.js +74 -74
- package/lib/elements/entities/message/template/message_template_parser.d.ts +2 -2
- package/lib/elements/entities/message/template/message_template_parser.js +137 -71
- package/lib/engine/apps/inline.app.js +1 -0
- package/lib/engine/data/error.d.ts +12 -11
- package/lib/engine/data/error.js +7 -7
- package/lib/engine/data/trash.js +7 -7
- package/lib/engine/data/tree.d.ts +3 -0
- package/lib/engine/data/tree.js +36 -0
- package/lib/engine/util/parse.d.ts +36 -28
- package/lib/engine/util/parse.js +53 -43
- package/lib/engine/util/type.d.ts +3 -0
- package/package.json +1 -1
- package/tools/joaquin/bucket.d.ts +9 -0
- package/tools/joaquin/bucket.js +49 -0
- package/tools/joaquin/message.d.ts +2 -1
- package/tools/joaquin/message.js +9 -2
- package/tools/joaquin/mock.d.ts +1 -0
- package/tools/joaquin/mock.js +13 -5
- 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 {
|
|
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,
|
|
19
|
+
get any(): BucketModelFieldBuilder<Module, any, any, [false, false], {
|
|
20
|
+
'': any;
|
|
21
|
+
}, {
|
|
20
22
|
'': any;
|
|
21
23
|
}>;
|
|
22
|
-
get boolean(): BucketModelFieldBuilder<Module, boolean,
|
|
24
|
+
get boolean(): BucketModelFieldBuilder<Module, boolean, boolean, [false, false], {
|
|
25
|
+
'': boolean;
|
|
26
|
+
}, {
|
|
23
27
|
'': boolean;
|
|
24
28
|
}>;
|
|
25
|
-
get date(): BucketModelFieldBuilder<Module, NesoiDate,
|
|
29
|
+
get date(): BucketModelFieldBuilder<Module, NesoiDate, NesoiDate, [false, false], {
|
|
30
|
+
'': NesoiDate;
|
|
31
|
+
}, {
|
|
26
32
|
'': NesoiDate;
|
|
27
33
|
}>;
|
|
28
|
-
get datetime(): BucketModelFieldBuilder<Module, NesoiDatetime,
|
|
34
|
+
get datetime(): BucketModelFieldBuilder<Module, NesoiDatetime, NesoiDatetime, [false, false], {
|
|
35
|
+
'': NesoiDatetime;
|
|
36
|
+
}, {
|
|
29
37
|
'': NesoiDatetime;
|
|
30
38
|
}>;
|
|
31
|
-
get duration(): BucketModelFieldBuilder<Module, 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,
|
|
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],
|
|
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,
|
|
57
|
+
get int(): BucketModelFieldBuilder<Module, number, number, [false, false], {
|
|
58
|
+
'': number;
|
|
59
|
+
}, {
|
|
44
60
|
'': number;
|
|
45
61
|
}>;
|
|
46
|
-
get float(): BucketModelFieldBuilder<Module, number,
|
|
62
|
+
get float(): BucketModelFieldBuilder<Module, number, number, [false, false], {
|
|
63
|
+
'': number;
|
|
64
|
+
}, {
|
|
47
65
|
'': number;
|
|
48
66
|
}>;
|
|
49
|
-
get string(): BucketModelFieldBuilder<Module, 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>,
|
|
83
|
+
obj<T extends BucketModelFieldBuilders<Module>>(fields?: T): BucketModelFieldBuilder<Module, BucketModelObjInfer<T>, BucketModelObjInfer<T>, [false, false], {
|
|
56
84
|
'': BucketModelObjInfer<T>;
|
|
57
|
-
} &
|
|
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
|
|
64
|
-
'':
|
|
65
|
-
}
|
|
66
|
-
'':
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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,
|
|
86
|
-
'':
|
|
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
|
-
|
|
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,
|
|
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
|
|
108
|
-
*
|
|
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:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
123
|
-
*
|
|
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
|
|
159
|
+
const childrenPath = path + '.';
|
|
163
160
|
const children = builder.children
|
|
164
|
-
? BucketModelFieldBuilder.buildChildren(builder.module, builder.children,
|
|
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
|
|
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<
|
|
53
|
-
by?: keyof
|
|
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
|
|
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,
|
|
101
|
-
[X in keyof
|
|
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 = {},
|
|
124
|
-
[Field in keyof
|
|
125
|
-
[Op in NQL_OpFromField<
|
|
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<
|
|
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
|
|
90
|
-
if (!
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
145
|
-
if (!
|
|
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,
|
|
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,
|
|
154
|
+
parseOp(bucketName, fields, op) {
|
|
153
155
|
const _op = (op === '' ? '==' : op);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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.
|
|
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',
|
|
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
|
}
|