nesoi 3.3.5 → 3.3.7
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/elements/blocks/job/internal/resource_job.builder.js +3 -1
- package/lib/elements/blocks/resource/resource.builder.js +2 -3
- package/lib/elements/blocks/resource/resource.js +1 -0
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +5 -1
- package/lib/elements/entities/bucket/adapters/bucket_adapter.js +6 -2
- package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +1 -1
- package/lib/elements/entities/bucket/adapters/memory.nql.js +55 -35
- package/lib/elements/entities/bucket/bucket.builder.js +1 -1
- package/lib/elements/entities/bucket/bucket.d.ts +4 -0
- package/lib/elements/entities/bucket/bucket.infer.d.ts +7 -7
- package/lib/elements/entities/bucket/bucket.js +14 -9
- package/lib/elements/entities/bucket/bucket.schema.d.ts +1 -1
- package/lib/elements/entities/bucket/cache/bucket_cache.js +3 -3
- package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +13 -3
- package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +1 -1
- package/lib/elements/entities/bucket/graph/bucket_graph.js +23 -13
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +6 -5
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
- package/lib/elements/entities/bucket/query/nql.schema.d.ts +8 -9
- package/lib/elements/entities/bucket/query/nql_compiler.d.ts +1 -1
- package/lib/elements/entities/bucket/query/nql_compiler.js +38 -27
- package/lib/elements/entities/bucket/query/nql_engine.d.ts +2 -2
- package/lib/elements/entities/bucket/query/nql_engine.js +4 -2
- package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +3 -2
- package/lib/elements/entities/bucket/view/bucket_view.builder.js +3 -3
- package/lib/elements/entities/bucket/view/bucket_view.js +123 -32
- package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +6 -3
- package/lib/elements/entities/bucket/view/bucket_view.schema.js +2 -1
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +25 -24
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +65 -25
- package/lib/engine/app/inline.app.js +6 -0
- package/lib/engine/app/native/distributed_node.app.js +6 -0
- package/lib/engine/app/service.d.ts +7 -0
- package/lib/engine/app/service.js +2 -0
- package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +2 -2
- package/lib/engine/transaction/nodes/bucket.trx_node.js +6 -4
- package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +2 -0
- package/lib/engine/transaction/nodes/bucket_query.trx_node.js +15 -4
- package/lib/engine/transaction/trx_engine.js +1 -1
- package/lib/engine/transaction/trx_node.js +3 -3
- package/package.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { $Bucket } from '../bucket.schema';
|
|
2
2
|
import { AnyTrxNode } from "../../../../engine/transaction/trx_node";
|
|
3
|
-
export type $BucketViewFieldFn<TrxNode extends AnyTrxNode, B extends $Bucket> = (ctx: {
|
|
3
|
+
export type $BucketViewFieldFn<TrxNode extends AnyTrxNode, B extends $Bucket, Raw, Value> = (ctx: {
|
|
4
4
|
trx: TrxNode;
|
|
5
5
|
raw: B['#data'];
|
|
6
|
+
value: Value;
|
|
6
7
|
bucket: $Bucket;
|
|
7
8
|
}) => any | Promise<any>;
|
|
8
9
|
export type $BucketViewFieldMeta = {
|
|
@@ -11,10 +12,11 @@ export type $BucketViewFieldMeta = {
|
|
|
11
12
|
};
|
|
12
13
|
graph?: {
|
|
13
14
|
link: string;
|
|
15
|
+
path: string;
|
|
14
16
|
view?: string;
|
|
15
17
|
};
|
|
16
18
|
computed?: {
|
|
17
|
-
fn: $BucketViewFieldFn<any, any>;
|
|
19
|
+
fn: $BucketViewFieldFn<any, any, any, any>;
|
|
18
20
|
};
|
|
19
21
|
view?: {
|
|
20
22
|
view: string;
|
|
@@ -32,11 +34,12 @@ export declare class $BucketViewField {
|
|
|
32
34
|
scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive';
|
|
33
35
|
alias: string;
|
|
34
36
|
meta: $BucketViewFieldMeta;
|
|
37
|
+
prop?: string | undefined;
|
|
35
38
|
children?: $BucketViewFields | undefined;
|
|
36
39
|
chain?: $BucketViewField | undefined;
|
|
37
40
|
$t: string;
|
|
38
41
|
'#data': unknown;
|
|
39
|
-
constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive', alias: string, meta: $BucketViewFieldMeta, children?: $BucketViewFields | undefined, chain?: $BucketViewField | undefined);
|
|
42
|
+
constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive', alias: string, meta: $BucketViewFieldMeta, prop?: string | undefined, children?: $BucketViewFields | undefined, chain?: $BucketViewField | undefined);
|
|
40
43
|
}
|
|
41
44
|
export type $BucketViewFields = {
|
|
42
45
|
[x: string]: $BucketViewField;
|
|
@@ -6,11 +6,12 @@ exports.$BucketView = exports.$BucketViewField = void 0;
|
|
|
6
6
|
* @subcategory Entity
|
|
7
7
|
* */
|
|
8
8
|
class $BucketViewField {
|
|
9
|
-
constructor(name, scope, alias, meta, children, chain) {
|
|
9
|
+
constructor(name, scope, alias, meta, prop, children, chain) {
|
|
10
10
|
this.name = name;
|
|
11
11
|
this.scope = scope;
|
|
12
12
|
this.alias = alias;
|
|
13
13
|
this.meta = meta;
|
|
14
|
+
this.prop = prop;
|
|
14
15
|
this.children = children;
|
|
15
16
|
this.chain = chain;
|
|
16
17
|
this.$t = 'bucket.view.field';
|
|
@@ -2,53 +2,54 @@ import { $BucketViewField, $BucketViewFieldFn, $BucketViewFieldMeta, $BucketView
|
|
|
2
2
|
import { $Module, $Space, ViewObj } from "../../../../schema";
|
|
3
3
|
import { $BucketModel } from '../model/bucket_model.schema';
|
|
4
4
|
import { $BucketGraph } from '../graph/bucket_graph.schema';
|
|
5
|
-
import {
|
|
5
|
+
import { BucketViewDef } from './bucket_view.builder';
|
|
6
6
|
import { $Bucket } from '../bucket.schema';
|
|
7
|
-
import { $BucketViewFieldBuilderInfer } from '../bucket.infer';
|
|
7
|
+
import { $BucketViewDataInfer, $BucketViewFieldBuilderInfer } from '../bucket.infer';
|
|
8
8
|
import { TrxNode } from "../../../../engine/transaction/trx_node";
|
|
9
9
|
import { NesoiFile } from "../../../../engine/data/file";
|
|
10
|
+
import { ModuleTree } from "../../../../engine/tree";
|
|
10
11
|
type DriveFieldpath<Bucket extends $Bucket> = {
|
|
11
12
|
[K in keyof Bucket['#modelpath']]: NonNullable<Bucket['#modelpath'][K]> extends NesoiFile ? K : never;
|
|
12
13
|
}[keyof Bucket['#modelpath']];
|
|
13
|
-
type
|
|
14
|
-
type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> = R extends Promise<infer X> ? X : R;
|
|
14
|
+
type ComputedData<Fn extends $BucketViewFieldFn<any, any, any, any>, R = ReturnType<Fn>> = R extends Promise<infer X> ? X : R;
|
|
15
15
|
/**
|
|
16
16
|
* @category Builders
|
|
17
17
|
* @subcategory Entity
|
|
18
18
|
* */
|
|
19
19
|
export declare class BucketViewFieldFactory<Space extends $Space, Module extends $Module, Bucket extends $Bucket> {
|
|
20
|
-
private _view;
|
|
21
20
|
protected scope: $BucketViewField['scope'];
|
|
22
21
|
protected meta: $BucketViewField['meta'];
|
|
23
|
-
constructor(_view: BucketViewBuilder<any, any, any>);
|
|
24
22
|
raw(): {
|
|
25
|
-
[K in keyof Bucket['#data']]: BucketViewFieldBuilder<Bucket['#data'][K], 'model'>;
|
|
23
|
+
[K in keyof Bucket['#data']]: BucketViewFieldBuilder<Module, Bucket, Bucket, Bucket['#data'][K], 'model'>;
|
|
26
24
|
};
|
|
27
|
-
model<K extends keyof Bucket['#modelpath']
|
|
28
|
-
value(): BucketViewFieldBuilder<any, "model", never>;
|
|
29
|
-
computed<Fn extends $BucketViewFieldFn<TrxNode<Space, Module, Space['authnUsers']>, Bucket>>(fn: Fn): BucketViewFieldBuilder<ComputedData<Fn, ReturnType<Fn>>, "computed", never>;
|
|
30
|
-
graph<L extends keyof Bucket['graph']['links'],
|
|
31
|
-
drive<F extends DriveFieldpath<Bucket>>(path: F): BucketViewFieldBuilder<string, "drive", never>;
|
|
32
|
-
view<ViewName extends keyof Bucket['views'], View extends Bucket['views'][ViewName]>(view: ViewName): BucketViewFieldBuilder<View["#data"], "view", never>;
|
|
33
|
-
extend<ViewName extends keyof Bucket['views'], Builders extends BucketViewFieldBuilders
|
|
34
|
-
|
|
25
|
+
model<K extends keyof Bucket['#modelpath']>(path: K): BucketViewFieldBuilder<Module, Bucket, Bucket, Bucket["#modelpath"][K], "model", never>;
|
|
26
|
+
value(): BucketViewFieldBuilder<Module, Bucket, Bucket, any, "model", never>;
|
|
27
|
+
computed<Fn extends $BucketViewFieldFn<TrxNode<Space, Module, Space['authnUsers']>, Bucket, Bucket['#data'], Bucket['#data']>>(fn: Fn): BucketViewFieldBuilder<Module, Bucket, Bucket, ComputedData<Fn, ReturnType<Fn>>, "computed", never>;
|
|
28
|
+
graph<L extends keyof Bucket['graph']['links'], V extends (keyof Bucket['graph']['links'][L]['#bucket']['views']) | undefined>(link: L, view?: V): BucketViewFieldBuilder<Module, Bucket, Bucket["graph"]["links"][L]["#bucket"], Bucket["graph"]["links"][L]["#many"] extends true ? (undefined extends V ? Bucket["graph"]["links"][L]["#bucket"]["#data"] : ViewObj<Bucket["graph"]["links"][L]["#bucket"], NonNullable<V>>)[] : undefined extends V ? Bucket["graph"]["links"][L]["#bucket"]["#data"] : ViewObj<Bucket["graph"]["links"][L]["#bucket"], NonNullable<V>>, "graph", `${Bucket["graph"]["links"][L]["#bucket"]["name"]}.${V & string}`>;
|
|
29
|
+
drive<F extends DriveFieldpath<Bucket>>(path: F): BucketViewFieldBuilder<Module, Bucket, Bucket, string, "drive", never>;
|
|
30
|
+
view<ViewName extends keyof Bucket['views'], View extends Bucket['views'][ViewName]>(view: ViewName): BucketViewFieldBuilder<Module, Bucket, Bucket, View["#data"], "view", never>;
|
|
31
|
+
extend<ViewName extends keyof Bucket['views'], Builders extends BucketViewFieldBuilders<any>>(view: ViewName, fields: Builders): $BucketViewFieldBuilderInfer<Bucket["views"][ViewName]["#data"]> & Builders;
|
|
32
|
+
obj<Builders extends BucketViewFieldBuilders<Bucket>>(children: Builders): BucketViewFieldBuilder<Module, Bucket, Bucket, $BucketViewDataInfer<Builders>, "group", never>;
|
|
35
33
|
}
|
|
36
34
|
/**
|
|
37
35
|
* @category Builders
|
|
38
36
|
* @subcategory Entity
|
|
39
37
|
* */
|
|
40
|
-
export declare class BucketViewFieldBuilder<Data, Scope extends $BucketViewField['scope'], GraphLink extends string = never> {
|
|
38
|
+
export declare class BucketViewFieldBuilder<Module extends $Module, Bucket extends $Bucket, ChainBucket extends $Bucket, Data, Scope extends $BucketViewField['scope'], GraphLink extends string = never> {
|
|
41
39
|
protected scope: $BucketViewField['scope'];
|
|
42
40
|
protected meta: $BucketViewFieldMeta;
|
|
43
|
-
protected
|
|
41
|
+
protected subview?: (BucketViewFieldBuilders<any> | BucketViewDef<any, any, any>) | undefined;
|
|
44
42
|
$b: "view.field";
|
|
45
|
-
protected
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
protected _prop?: string;
|
|
44
|
+
protected _chain?: BucketViewFieldBuilder<any, any, any, any, any>;
|
|
45
|
+
constructor(scope: $BucketViewField['scope'], meta: $BucketViewFieldMeta, subview?: (BucketViewFieldBuilders<any> | BucketViewDef<any, any, any>) | undefined);
|
|
46
|
+
prop<Obj extends Data extends any[] ? Data[number] : Data, K extends keyof Obj>(prop: K): BucketViewFieldBuilder<Module, Bucket, ChainBucket, Obj[K], Scope, GraphLink>;
|
|
47
|
+
map<Def extends BucketViewDef<any, Module, ChainBucket>>(def: Def): BucketViewFieldBuilder<Module, Bucket, ChainBucket, { [K in keyof Def]: Def extends BucketViewFieldBuilder<any, any, infer X, any, any> ? X : never; }, Scope, GraphLink>;
|
|
48
|
+
chain<Fn extends $BucketViewFieldFn<TrxNode<any, Module, never>, ChainBucket, Bucket['#data'], Data>>(fn: Fn): BucketViewFieldBuilder<Module, Bucket, ChainBucket, ComputedData<Fn, ReturnType<Fn>>, Scope, GraphLink>;
|
|
49
|
+
static build(builder: BucketViewFieldBuilder<any, any, any, any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string, n_indexes: number, tree?: ModuleTree): $BucketViewField;
|
|
50
|
+
static buildFields(fields: BucketViewFieldBuilders<any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, n_indexes?: number, tree?: ModuleTree): $BucketViewFields;
|
|
50
51
|
}
|
|
51
|
-
export type BucketViewFieldBuilders = {
|
|
52
|
-
[x: string]: BucketViewFieldBuilder<any, any, any>;
|
|
52
|
+
export type BucketViewFieldBuilders<Bucket extends $Bucket> = {
|
|
53
|
+
[x: string]: BucketViewFieldBuilder<any, Bucket, any, any, any>;
|
|
53
54
|
};
|
|
54
55
|
export {};
|
|
@@ -12,20 +12,17 @@ const bucket_model_schema_1 = require("../model/bucket_model.schema");
|
|
|
12
12
|
* @subcategory Entity
|
|
13
13
|
* */
|
|
14
14
|
class BucketViewFieldFactory {
|
|
15
|
-
constructor(_view) {
|
|
16
|
-
this._view = _view;
|
|
17
|
-
}
|
|
18
15
|
raw() {
|
|
19
16
|
return {
|
|
20
17
|
__raw: {}
|
|
21
18
|
};
|
|
22
19
|
}
|
|
23
|
-
model(path
|
|
20
|
+
model(path) {
|
|
24
21
|
return new BucketViewFieldBuilder('model', {
|
|
25
22
|
model: {
|
|
26
23
|
path: path
|
|
27
24
|
}
|
|
28
|
-
}
|
|
25
|
+
});
|
|
29
26
|
}
|
|
30
27
|
value() {
|
|
31
28
|
return new BucketViewFieldBuilder('model', {
|
|
@@ -44,7 +41,8 @@ class BucketViewFieldFactory {
|
|
|
44
41
|
graph(link, view) {
|
|
45
42
|
return new BucketViewFieldBuilder('graph', {
|
|
46
43
|
graph: {
|
|
47
|
-
link: link,
|
|
44
|
+
link: link.replace(/\$\d+/g, '$'),
|
|
45
|
+
path: link,
|
|
48
46
|
view: view
|
|
49
47
|
}
|
|
50
48
|
});
|
|
@@ -63,14 +61,18 @@ class BucketViewFieldFactory {
|
|
|
63
61
|
}
|
|
64
62
|
});
|
|
65
63
|
}
|
|
64
|
+
// from<
|
|
65
|
+
// >(
|
|
66
|
+
// ) {
|
|
67
|
+
// }
|
|
66
68
|
extend(view, fields) {
|
|
67
69
|
return {
|
|
68
70
|
__ext: view,
|
|
69
71
|
...fields
|
|
70
72
|
};
|
|
71
73
|
}
|
|
72
|
-
|
|
73
|
-
return new
|
|
74
|
+
obj(children) {
|
|
75
|
+
return new BucketViewFieldBuilder('group', {}, children);
|
|
74
76
|
}
|
|
75
77
|
}
|
|
76
78
|
exports.BucketViewFieldFactory = BucketViewFieldFactory;
|
|
@@ -82,35 +84,52 @@ exports.BucketViewFieldFactory = BucketViewFieldFactory;
|
|
|
82
84
|
* @subcategory Entity
|
|
83
85
|
* */
|
|
84
86
|
class BucketViewFieldBuilder {
|
|
85
|
-
constructor(scope, meta,
|
|
87
|
+
constructor(scope, meta, subview) {
|
|
86
88
|
this.scope = scope;
|
|
87
89
|
this.meta = meta;
|
|
88
|
-
this.
|
|
90
|
+
this.subview = subview;
|
|
89
91
|
this.$b = 'view.field';
|
|
90
92
|
}
|
|
93
|
+
prop(prop) {
|
|
94
|
+
if (this.subview) {
|
|
95
|
+
throw new Error('Prop not allowed for view field with subview');
|
|
96
|
+
}
|
|
97
|
+
this._prop = prop;
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
map(def) {
|
|
101
|
+
if (this._prop) {
|
|
102
|
+
throw new Error('Subview not allowed for view field which picks a prop');
|
|
103
|
+
}
|
|
104
|
+
this.subview = def;
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
91
107
|
chain(fn) {
|
|
92
108
|
this._chain = new BucketViewFieldBuilder('computed', {
|
|
93
109
|
computed: {
|
|
94
110
|
fn: fn
|
|
95
111
|
}
|
|
96
112
|
});
|
|
113
|
+
return this;
|
|
97
114
|
}
|
|
98
115
|
// Build
|
|
99
|
-
static build(builder, model, graph, views, name, n_indexes) {
|
|
116
|
+
static build(builder, model, graph, views, name, n_indexes, tree) {
|
|
100
117
|
let children = undefined;
|
|
101
|
-
const
|
|
118
|
+
const chainBuilder = builder._chain;
|
|
119
|
+
let spread_n = 0;
|
|
120
|
+
let graphLink = undefined;
|
|
102
121
|
if (builder.scope === 'model') {
|
|
103
122
|
const path = builder.meta.model.path;
|
|
104
|
-
|
|
105
|
-
if (spread_n === 0 && builder.
|
|
106
|
-
throw new Error('
|
|
123
|
+
spread_n = path.match(/\.\*(\.|$)/g)?.length || 0;
|
|
124
|
+
if (spread_n === 0 && builder.subview) {
|
|
125
|
+
throw new Error('Subviews can only be specified for modelpaths with at least one \'*\'');
|
|
107
126
|
}
|
|
108
127
|
// Check if indexes are valid
|
|
109
128
|
// $0, $1, $2.. should be up to n_indexes
|
|
110
129
|
const path_indexes = path.match(/\.\$\d+(\.|$)/g)?.map(d => parseInt(d.slice(2))) || [];
|
|
111
130
|
if (Math.max(...path_indexes) >= n_indexes) {
|
|
112
131
|
if (n_indexes === 0) {
|
|
113
|
-
throw new Error('Index $ can only be specified inside a
|
|
132
|
+
throw new Error('Index $ can only be specified inside a subview');
|
|
114
133
|
}
|
|
115
134
|
throw new Error(`Maximum index allowed: $${n_indexes - 1}`);
|
|
116
135
|
}
|
|
@@ -121,14 +140,10 @@ class BucketViewFieldBuilder {
|
|
|
121
140
|
if (!modelFields.length) {
|
|
122
141
|
throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.meta.model.path);
|
|
123
142
|
}
|
|
124
|
-
// If there's a submodel, add it as children
|
|
125
|
-
if (builder.submodel) {
|
|
126
|
-
const overrides = this.buildFields(builder.submodel, model, graph, views, n_indexes + spread_n);
|
|
127
|
-
children = Object.assign({}, children, overrides);
|
|
128
|
-
}
|
|
129
143
|
}
|
|
130
144
|
else if (builder.scope === 'graph') {
|
|
131
|
-
const
|
|
145
|
+
const key = builder.meta.graph.link?.replace(/\$\d+/g, '$');
|
|
146
|
+
graphLink = builder.meta.graph.link ? graph.links[key] : undefined;
|
|
132
147
|
if (!graphLink) {
|
|
133
148
|
throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.meta.graph.link || '');
|
|
134
149
|
}
|
|
@@ -140,9 +155,34 @@ class BucketViewFieldBuilder {
|
|
|
140
155
|
}
|
|
141
156
|
children = view.fields;
|
|
142
157
|
}
|
|
143
|
-
|
|
158
|
+
// If there's a subview, add it as children
|
|
159
|
+
if (builder.subview) {
|
|
160
|
+
let subview;
|
|
161
|
+
if (typeof builder.subview === 'function') {
|
|
162
|
+
const factory = new BucketViewFieldFactory();
|
|
163
|
+
subview = builder.subview(factory);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
subview = builder.subview;
|
|
167
|
+
}
|
|
168
|
+
let submodelBucket = { model, graph, views };
|
|
169
|
+
if (builder.scope === 'graph') {
|
|
170
|
+
const tag = graphLink.bucket;
|
|
171
|
+
if (tree) {
|
|
172
|
+
submodelBucket = tree.allNodes()
|
|
173
|
+
.find(node => node.tag.full === tag.full).schema;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const overrides = this.buildFields(subview, submodelBucket.model, submodelBucket.graph, submodelBucket.views, n_indexes + spread_n, tree);
|
|
177
|
+
children = Object.assign({}, children, overrides);
|
|
178
|
+
}
|
|
179
|
+
let chain;
|
|
180
|
+
if (chainBuilder) {
|
|
181
|
+
chain = BucketViewFieldBuilder.build(chainBuilder, model, graph, views, name, n_indexes, tree);
|
|
182
|
+
}
|
|
183
|
+
return new bucket_view_schema_1.$BucketViewField(name, builder.scope, name, builder.meta, builder._prop, children, chain);
|
|
144
184
|
}
|
|
145
|
-
static buildFields(fields, model, graph, views, n_indexes = 0) {
|
|
185
|
+
static buildFields(fields, model, graph, views, n_indexes = 0, tree) {
|
|
146
186
|
const schema = {};
|
|
147
187
|
// Extended fields inherit from other views
|
|
148
188
|
if ('__ext' in fields) {
|
|
@@ -157,7 +197,7 @@ class BucketViewFieldBuilder {
|
|
|
157
197
|
schema['__raw'] = {};
|
|
158
198
|
}
|
|
159
199
|
const field = fields[f];
|
|
160
|
-
schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f, n_indexes);
|
|
200
|
+
schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f, n_indexes, tree);
|
|
161
201
|
}
|
|
162
202
|
return schema;
|
|
163
203
|
}
|
|
@@ -107,6 +107,12 @@ class InlineApp extends app_1.App {
|
|
|
107
107
|
const module = app.modules[m];
|
|
108
108
|
module.daemon = this._daemon;
|
|
109
109
|
}
|
|
110
|
+
// Run init method of services
|
|
111
|
+
for (const key in app.services) {
|
|
112
|
+
await promise_1.default.solve(app.services[key].init({
|
|
113
|
+
daemon: this._daemon
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
110
116
|
return this._daemon;
|
|
111
117
|
}
|
|
112
118
|
makeDaemon(trxEngines, services) {
|
|
@@ -117,6 +117,12 @@ class DistributedNodeApp extends app_1.App {
|
|
|
117
117
|
const module = app.modules[m];
|
|
118
118
|
module.daemon = this._daemon;
|
|
119
119
|
}
|
|
120
|
+
// Run init method of services
|
|
121
|
+
for (const key in app.services) {
|
|
122
|
+
await promise_1.default.solve(app.services[key].init({
|
|
123
|
+
daemon: this._daemon
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
120
126
|
return this._daemon;
|
|
121
127
|
}
|
|
122
128
|
host(config) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AnyDaemon } from '../daemon';
|
|
1
2
|
import { AnyModule } from '../module';
|
|
2
3
|
/**
|
|
3
4
|
* Service
|
|
@@ -15,6 +16,9 @@ export declare abstract class Service<out Name extends string, Config = never> {
|
|
|
15
16
|
modules: Record<string, AnyModule>;
|
|
16
17
|
}): void | Promise<void>;
|
|
17
18
|
abstract down(): void | Promise<void>;
|
|
19
|
+
init($: {
|
|
20
|
+
daemon: AnyDaemon;
|
|
21
|
+
}): void | Promise<void>;
|
|
18
22
|
constructor(...cfg: Optional<Config>);
|
|
19
23
|
constructor(name: Name, ...cfg: Optional<Config>);
|
|
20
24
|
}
|
|
@@ -25,6 +29,9 @@ export interface IService {
|
|
|
25
29
|
up(this: IService, $: {
|
|
26
30
|
modules: Record<string, AnyModule>;
|
|
27
31
|
}): void | Promise<void>;
|
|
32
|
+
init(this: IService, $: {
|
|
33
|
+
daemon: AnyDaemon;
|
|
34
|
+
}): void | Promise<void>;
|
|
28
35
|
down(this: IService): void | Promise<void>;
|
|
29
36
|
}
|
|
30
37
|
export {};
|
|
@@ -67,12 +67,12 @@ export declare class BucketTrxNode<M extends $Module, $ extends $Bucket> {
|
|
|
67
67
|
* Returns one or more objects referenced by the graph link,
|
|
68
68
|
* or `undefined` if the graph link doesn't resolve.
|
|
69
69
|
*/
|
|
70
|
-
readLink<LinkName extends keyof $['graph']['links'], Link extends $['graph']['links'][LinkName], Obj extends Link['#bucket']['#data']>(id: $['#data']['id'], link: LinkName): Promise<Link['#many'] extends true ? Obj[] : (Obj | undefined)>;
|
|
70
|
+
readLink<LinkName extends keyof $['graph']['links'], Link extends $['graph']['links'][LinkName], Obj extends Link['#bucket']['#data']>(id: $['#data']['id'], link: LinkName, index?: string[]): Promise<Link['#many'] extends true ? Obj[] : (Obj | undefined)>;
|
|
71
71
|
/**
|
|
72
72
|
* Returns one or more objects referenced by the graph link,
|
|
73
73
|
* or `undefined` if the graph link doesn't resolve.
|
|
74
74
|
*/
|
|
75
|
-
readManyLinks<LinkName extends keyof $['graph']['links'], Link extends $['graph']['links'][LinkName], Obj extends Link['#bucket']['#data']>(ids: $['#data']['id'][], link: LinkName): Promise<Link['#many'] extends true ? Obj[] : (Obj | undefined)>;
|
|
75
|
+
readManyLinks<LinkName extends keyof $['graph']['links'], Link extends $['graph']['links'][LinkName], Obj extends Link['#bucket']['#data']>(ids: $['#data']['id'][], link: LinkName, indexes?: string[][]): Promise<Link['#many'] extends true ? Obj[] : (Obj | undefined)>;
|
|
76
76
|
/**
|
|
77
77
|
* Returns one or more objects referenced by the graph link built with a view,
|
|
78
78
|
* or `undefined` if the graph link doesn't resolve.
|
|
@@ -145,20 +145,22 @@ class BucketTrxNode {
|
|
|
145
145
|
* Returns one or more objects referenced by the graph link,
|
|
146
146
|
* or `undefined` if the graph link doesn't resolve.
|
|
147
147
|
*/
|
|
148
|
-
async readLink(id, link) {
|
|
148
|
+
async readLink(id, link, index) {
|
|
149
149
|
return this.wrap('readLink', { id, link }, (trx, bucket) => bucket.readLink(trx, id, link, {
|
|
150
150
|
silent: true,
|
|
151
|
-
no_tenancy: !this.enableTenancy
|
|
151
|
+
no_tenancy: !this.enableTenancy,
|
|
152
|
+
index
|
|
152
153
|
}));
|
|
153
154
|
}
|
|
154
155
|
/**
|
|
155
156
|
* Returns one or more objects referenced by the graph link,
|
|
156
157
|
* or `undefined` if the graph link doesn't resolve.
|
|
157
158
|
*/
|
|
158
|
-
async readManyLinks(ids, link) {
|
|
159
|
+
async readManyLinks(ids, link, indexes) {
|
|
159
160
|
return this.wrap('readLinks', { ids, link }, (trx, bucket) => bucket.readManyLinks(trx, ids, link, {
|
|
160
161
|
silent: true,
|
|
161
|
-
no_tenancy: !this.enableTenancy
|
|
162
|
+
no_tenancy: !this.enableTenancy,
|
|
163
|
+
indexes
|
|
162
164
|
}));
|
|
163
165
|
}
|
|
164
166
|
/**
|
|
@@ -16,11 +16,13 @@ export declare class BucketQueryTrxNode<M extends $Module, B extends $Bucket, V
|
|
|
16
16
|
private enableTenancy;
|
|
17
17
|
private view?;
|
|
18
18
|
private _params?;
|
|
19
|
+
private _param_templates?;
|
|
19
20
|
private external;
|
|
20
21
|
private bucket?;
|
|
21
22
|
constructor(trx: TrxNode<any, M, any>, tag: Tag, query: NQL_AnyQuery, enableTenancy: boolean, view?: V | undefined);
|
|
22
23
|
merge($: NQL_Query<M, B>): void;
|
|
23
24
|
params(value?: Record<string, any> | Record<string, any>[]): this;
|
|
25
|
+
param_templates(value?: Record<string, any> | Record<string, any>[]): this;
|
|
24
26
|
wrap(action: string, input: Record<string, any>, fn: (trx: AnyTrxNode, element: Bucket<M, B>) => Promise<any>): Promise<{
|
|
25
27
|
data: any[];
|
|
26
28
|
}>;
|
|
@@ -17,6 +17,7 @@ class BucketQueryTrxNode {
|
|
|
17
17
|
this.enableTenancy = enableTenancy;
|
|
18
18
|
this.view = view;
|
|
19
19
|
this._params = [];
|
|
20
|
+
this._param_templates = [];
|
|
20
21
|
const module = trx_node_1.TrxNode.getModule(trx);
|
|
21
22
|
this.external = tag.module !== module.name;
|
|
22
23
|
if (!this.external) {
|
|
@@ -38,6 +39,12 @@ class BucketQueryTrxNode {
|
|
|
38
39
|
: [];
|
|
39
40
|
return this;
|
|
40
41
|
}
|
|
42
|
+
param_templates(value) {
|
|
43
|
+
this._param_templates = value
|
|
44
|
+
? Array.isArray(value) ? value : [value]
|
|
45
|
+
: undefined;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
41
48
|
/*
|
|
42
49
|
Wrap
|
|
43
50
|
*/
|
|
@@ -69,7 +76,8 @@ class BucketQueryTrxNode {
|
|
|
69
76
|
perPage: 1
|
|
70
77
|
}, this.view, {
|
|
71
78
|
no_tenancy: !this.enableTenancy,
|
|
72
|
-
params: this._params
|
|
79
|
+
params: this._params,
|
|
80
|
+
param_templates: this._param_templates
|
|
73
81
|
});
|
|
74
82
|
});
|
|
75
83
|
return results.data.length
|
|
@@ -80,7 +88,8 @@ class BucketQueryTrxNode {
|
|
|
80
88
|
const results = await this.wrap('queryFirstOrFail', { schema: this.query, view: this.view }, async (trx, bucket) => {
|
|
81
89
|
const results = await bucket.query(trx, this.query, undefined, this.view, {
|
|
82
90
|
no_tenancy: !this.enableTenancy,
|
|
83
|
-
params: this._params
|
|
91
|
+
params: this._params,
|
|
92
|
+
param_templates: this._param_templates
|
|
84
93
|
});
|
|
85
94
|
if (!results.data.length) {
|
|
86
95
|
throw error_1.NesoiError.Bucket.Query.NoResults({ bucket: bucket.schema.alias, query: this.query });
|
|
@@ -92,7 +101,8 @@ class BucketQueryTrxNode {
|
|
|
92
101
|
async all() {
|
|
93
102
|
const results = await this.wrap('queryAll', { schema: this.query, view: this.view }, async (trx, bucket) => {
|
|
94
103
|
return bucket.query(trx, this.query, undefined, this.view, {
|
|
95
|
-
params: this._params
|
|
104
|
+
params: this._params,
|
|
105
|
+
param_templates: this._param_templates
|
|
96
106
|
});
|
|
97
107
|
});
|
|
98
108
|
return results.data;
|
|
@@ -106,7 +116,8 @@ class BucketQueryTrxNode {
|
|
|
106
116
|
}
|
|
107
117
|
const results = await this.wrap('queryPage', { schema: this.query, view: this.view }, async (trx, bucket) => {
|
|
108
118
|
return bucket.query(trx, this.query, pagination, this.view, {
|
|
109
|
-
params: this._params
|
|
119
|
+
params: this._params,
|
|
120
|
+
param_templates: this._param_templates
|
|
110
121
|
});
|
|
111
122
|
});
|
|
112
123
|
return results;
|
|
@@ -237,11 +237,11 @@ class TrxNode {
|
|
|
237
237
|
static async checkAuth(node, options) {
|
|
238
238
|
if (!options?.length)
|
|
239
239
|
return;
|
|
240
|
-
if (!Object.keys(node.auth?.tokens || {}).length) {
|
|
240
|
+
if (!node.auth || !Object.keys(node.auth?.tokens || {}).length) {
|
|
241
241
|
throw error_1.NesoiError.Trx.Unauthorized({ providers: options.map(opt => opt.provider) });
|
|
242
242
|
}
|
|
243
|
-
const users = node.auth
|
|
244
|
-
const tokens = node.auth
|
|
243
|
+
const users = node.auth.users;
|
|
244
|
+
const tokens = node.auth.tokens;
|
|
245
245
|
for (const opt of options) {
|
|
246
246
|
// Eager provider or previously authenticated user
|
|
247
247
|
if (opt.provider in users) {
|