nesoi 3.3.4 → 3.3.6
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 +1 -1
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +1 -1
- package/lib/elements/entities/bucket/adapters/bucket_adapter.js +2 -2
- package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +1 -1
- package/lib/elements/entities/bucket/adapters/memory.nql.js +33 -15
- 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 +9 -9
- 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 +21 -11
- 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 +2 -0
- package/lib/elements/entities/bucket/query/nql_compiler.js +6 -1
- package/lib/elements/entities/bucket/query/nql_engine.d.ts +2 -2
- package/lib/elements/entities/bucket/query/nql_engine.js +2 -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/module.js +1 -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/nodes/job.trx_node.js +1 -1
- package/lib/engine/transaction/trx_engine.js +1 -1
- package/lib/engine/transaction/trx_node.d.ts +1 -1
- package/lib/engine/transaction/trx_node.js +3 -3
- package/package.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -22,7 +22,7 @@ class NQL_Engine {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
async run(trx, query, pagination, params = [{}], view, customRunners) {
|
|
25
|
+
async run(trx, query, pagination, params = [{}], path_params = [], view, customRunners) {
|
|
26
26
|
if (!params.length)
|
|
27
27
|
params = [{}];
|
|
28
28
|
let result = {
|
|
@@ -36,7 +36,7 @@ class NQL_Engine {
|
|
|
36
36
|
? { ...this.runners, ...customRunners }
|
|
37
37
|
: this.runners;
|
|
38
38
|
const _runner = runners[part.union.meta.scope];
|
|
39
|
-
const out = await _runner.run(trx, part, params, pagination, view);
|
|
39
|
+
const out = await _runner.run(trx, part, params, path_params, pagination, view);
|
|
40
40
|
result = out;
|
|
41
41
|
// Part failed, return
|
|
42
42
|
// Failure here is only when a single value is expected,
|
|
@@ -4,6 +4,7 @@ import { $BucketGraph } from '../graph/bucket_graph.schema';
|
|
|
4
4
|
import { BucketViewFieldBuilders, BucketViewFieldFactory } from './bucket_view_field.builder';
|
|
5
5
|
import { $Bucket } from '../bucket.schema';
|
|
6
6
|
import { $Module, $Space } from "../../..";
|
|
7
|
+
import { ModuleTree } from "../../../../engine/tree";
|
|
7
8
|
/**
|
|
8
9
|
* @category Builders
|
|
9
10
|
* @subcategory Entity
|
|
@@ -13,6 +14,6 @@ export declare class BucketViewBuilder<Space extends $Space, Module extends $Mod
|
|
|
13
14
|
private _fields;
|
|
14
15
|
constructor(name: string);
|
|
15
16
|
fields($: BucketViewDef<Space, Module, Bucket>): this;
|
|
16
|
-
static build(builder: BucketViewBuilder<any, any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews): $BucketView;
|
|
17
|
+
static build(builder: BucketViewBuilder<any, any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, tree: ModuleTree): $BucketView;
|
|
17
18
|
}
|
|
18
|
-
export type BucketViewDef<Space extends $Space, Module extends $Module, Bucket extends $Bucket> = ($: BucketViewFieldFactory<Space, Module, Bucket>) => BucketViewFieldBuilders
|
|
19
|
+
export type BucketViewDef<Space extends $Space, Module extends $Module, Bucket extends $Bucket> = ($: BucketViewFieldFactory<Space, Module, Bucket>) => BucketViewFieldBuilders<Bucket>;
|
|
@@ -13,13 +13,13 @@ class BucketViewBuilder {
|
|
|
13
13
|
this._fields = {};
|
|
14
14
|
}
|
|
15
15
|
fields($) {
|
|
16
|
-
const fieldBuilder = new bucket_view_field_builder_1.BucketViewFieldFactory(
|
|
16
|
+
const fieldBuilder = new bucket_view_field_builder_1.BucketViewFieldFactory();
|
|
17
17
|
this._fields = $(fieldBuilder);
|
|
18
18
|
return this;
|
|
19
19
|
}
|
|
20
20
|
// Build
|
|
21
|
-
static build(builder, model, graph, views) {
|
|
22
|
-
const fields = bucket_view_field_builder_1.BucketViewFieldBuilder.buildFields(builder._fields, model, graph, views);
|
|
21
|
+
static build(builder, model, graph, views, tree) {
|
|
22
|
+
const fields = bucket_view_field_builder_1.BucketViewFieldBuilder.buildFields(builder._fields, model, graph, views, undefined, tree);
|
|
23
23
|
const schema = new bucket_view_schema_1.$BucketView(builder.name, fields);
|
|
24
24
|
schema.fields.id = new bucket_view_schema_1.$BucketViewField('id', 'model', 'id', { model: { path: 'id' } });
|
|
25
25
|
return schema;
|
|
@@ -153,6 +153,7 @@ class BucketView {
|
|
|
153
153
|
if (!node.field.children)
|
|
154
154
|
return [];
|
|
155
155
|
const next = [];
|
|
156
|
+
// subview
|
|
156
157
|
for (const key in node.field.children) {
|
|
157
158
|
if (key === '__raw')
|
|
158
159
|
continue;
|
|
@@ -258,6 +259,12 @@ class BucketView {
|
|
|
258
259
|
}
|
|
259
260
|
}
|
|
260
261
|
}
|
|
262
|
+
// Apply prop
|
|
263
|
+
for (const data of poll) {
|
|
264
|
+
if (node.field.prop) {
|
|
265
|
+
data.target[data.key] = data.target[data.key][node.field.prop];
|
|
266
|
+
}
|
|
267
|
+
}
|
|
261
268
|
return poll.map(p => ({
|
|
262
269
|
index: p.index,
|
|
263
270
|
raw: p.raw,
|
|
@@ -271,7 +278,7 @@ class BucketView {
|
|
|
271
278
|
async parseComputedProp(trx, node) {
|
|
272
279
|
const meta = node.field.meta.computed;
|
|
273
280
|
for (const entry of node.data) {
|
|
274
|
-
entry.target[node.field.name] = await promise_1.default.solve(meta.fn({ trx, raw: entry.raw, bucket: node.bucket.schema }));
|
|
281
|
+
entry.target[node.field.name] = await promise_1.default.solve(meta.fn({ trx, raw: entry.raw, value: entry.value, bucket: node.bucket.schema }));
|
|
275
282
|
}
|
|
276
283
|
}
|
|
277
284
|
/**
|
|
@@ -279,29 +286,47 @@ class BucketView {
|
|
|
279
286
|
*/
|
|
280
287
|
async parseGraphProp(trx, node) {
|
|
281
288
|
const meta = node.field.meta.graph;
|
|
282
|
-
let
|
|
289
|
+
let linksObjs;
|
|
283
290
|
const module = trx_node_1.TrxNode.getModule(trx);
|
|
291
|
+
// Step 1: Read many links from bucket
|
|
284
292
|
// External
|
|
285
293
|
if (node.bucket.tag.module !== module.name) {
|
|
286
|
-
|
|
294
|
+
linksObjs = await trx.bucket(node.bucket.tag.short).readManyLinks(node.data.map(entry => entry.raw.id), meta.path, node.data.map(entry => entry.index.map(i => i.toString())));
|
|
287
295
|
}
|
|
288
296
|
// Internal
|
|
289
297
|
else {
|
|
290
298
|
const bucket = module.buckets[node.bucket.tag.name];
|
|
291
|
-
|
|
299
|
+
linksObjs = await bucket.graph.readManyLinks(trx, node.data.map(entry => entry.raw), {
|
|
300
|
+
name: meta.link,
|
|
301
|
+
indexes: node.data.map(entry => entry.index.map(i => i.toString()))
|
|
302
|
+
}, { silent: true });
|
|
292
303
|
}
|
|
293
|
-
|
|
304
|
+
// Step 2: Initialize target values
|
|
305
|
+
const link = node.bucket.schema.graph.links[meta.link];
|
|
306
|
+
for (let i = 0; i < linksObjs.length; i++) {
|
|
294
307
|
if (meta.view) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
308
|
+
if (link.many) {
|
|
309
|
+
node.data[i].target[node.field.name] = [];
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
node.data[i].target[node.field.name] = linksObjs[i] ? {} : undefined;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else if (node.field.prop) {
|
|
316
|
+
if (link.many) {
|
|
317
|
+
node.data[i].target[node.field.name] = linksObjs[i].map((link) => link[node.field.prop]);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
node.data[i].target[node.field.name] = linksObjs[i]?.[node.field.prop];
|
|
321
|
+
}
|
|
299
322
|
}
|
|
300
323
|
else {
|
|
301
|
-
node.data[i].target[node.field.name] =
|
|
324
|
+
node.data[i].target[node.field.name] = linksObjs[i];
|
|
302
325
|
}
|
|
303
326
|
}
|
|
327
|
+
// Step 3: Build view
|
|
304
328
|
let next = [];
|
|
329
|
+
let nextData = linksObjs;
|
|
305
330
|
if (meta.view) {
|
|
306
331
|
const schema = node.bucket.schema;
|
|
307
332
|
const otherBucketDep = schema.graph.links[meta.link].bucket;
|
|
@@ -311,46 +336,112 @@ class BucketView {
|
|
|
311
336
|
const view = otherBucket.schema.views[meta.view];
|
|
312
337
|
const { __raw, ...v } = view.fields;
|
|
313
338
|
const link = node.bucket.schema.graph.links[meta.link];
|
|
314
|
-
let nextData;
|
|
315
339
|
if (link.many) {
|
|
316
|
-
const _links =
|
|
340
|
+
const _links = linksObjs;
|
|
317
341
|
for (let i = 0; i < _links.length; i++) {
|
|
318
342
|
const target = node.data[i].target[node.field.name];
|
|
319
343
|
for (let j = 0; j < _links[i].length; j++) {
|
|
320
|
-
|
|
321
|
-
|
|
344
|
+
if (node.field.prop) {
|
|
345
|
+
target.push(_links[i][j][node.field.prop]);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
target.push(__raw ? { ..._links[i][j] } : {});
|
|
349
|
+
target[j].$v = meta.view;
|
|
350
|
+
}
|
|
322
351
|
}
|
|
323
352
|
}
|
|
324
|
-
|
|
353
|
+
if (!node.field.prop) {
|
|
354
|
+
nextData = _links.map((ll, i) => ll.map((l, j) => ({ value: l, target: node.data[i].target[node.field.name][j] }))).flat(1);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
nextData = [];
|
|
358
|
+
}
|
|
325
359
|
}
|
|
326
360
|
else {
|
|
327
|
-
const _links =
|
|
361
|
+
const _links = linksObjs;
|
|
328
362
|
nextData = [];
|
|
329
363
|
for (let i = 0; i < _links.length; i++) {
|
|
330
364
|
if (!_links[i])
|
|
331
365
|
continue;
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
366
|
+
if (node.field.prop) {
|
|
367
|
+
node.data[i].target[node.field.name] = _links[i][node.field.prop];
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
const target = node.data[i].target[node.field.name];
|
|
371
|
+
if (__raw) {
|
|
372
|
+
Object.assign(target, _links[i]);
|
|
373
|
+
}
|
|
374
|
+
target.$v = meta.view;
|
|
375
|
+
nextData.push({
|
|
376
|
+
value: _links[i], target: node.data[i].target[node.field.name]
|
|
377
|
+
});
|
|
335
378
|
}
|
|
336
|
-
target.$v = meta.view;
|
|
337
|
-
nextData.push({
|
|
338
|
-
value: _links[i], target: node.data[i].target[node.field.name]
|
|
339
|
-
});
|
|
340
379
|
}
|
|
341
380
|
}
|
|
342
|
-
//
|
|
381
|
+
// (still step 3) Add link bucket view fields to queue
|
|
343
382
|
next = [];
|
|
344
|
-
|
|
345
|
-
|
|
383
|
+
const bucket = await daemon_1.Daemon.getBucketMetadata(module.daemon, otherBucketDep);
|
|
384
|
+
// Next data is empty if meta.prop is defined, since there's no need to go deeper
|
|
385
|
+
if (nextData.length) {
|
|
386
|
+
for (const field of Object.values(v)) {
|
|
387
|
+
next.push({
|
|
388
|
+
bucket,
|
|
389
|
+
field,
|
|
390
|
+
data: nextData.map($ => ({
|
|
391
|
+
raw: $.value,
|
|
392
|
+
value: $.value,
|
|
393
|
+
index: [],
|
|
394
|
+
target: $.target
|
|
395
|
+
}))
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// Step 4: Add subview fields to queue
|
|
401
|
+
if (node.field.children) {
|
|
402
|
+
// Prepare subview data
|
|
403
|
+
const subview_data = [];
|
|
404
|
+
for (let i = 0; i < linksObjs.length; i++) {
|
|
405
|
+
const objs = linksObjs[i];
|
|
406
|
+
let target;
|
|
407
|
+
if (link.many) {
|
|
408
|
+
target = [];
|
|
409
|
+
for (const tobj of node.data[i].target[node.field.name]) {
|
|
410
|
+
if ('__raw' in node.field.children) {
|
|
411
|
+
target.push({ ...tobj });
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
target.push({ id: tobj.id });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
subview_data.push(...objs.map((obj, i) => ({
|
|
418
|
+
obj: { ...obj },
|
|
419
|
+
target: target[i]
|
|
420
|
+
})));
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
target = { id: objs.id };
|
|
424
|
+
if ('__raw' in node.field.children) {
|
|
425
|
+
Object.assign(target, node.data[i].target[node.field.name]);
|
|
426
|
+
}
|
|
427
|
+
subview_data.push({ obj: { ...objs }, target });
|
|
428
|
+
}
|
|
429
|
+
node.data[i].target[node.field.name] = target;
|
|
430
|
+
}
|
|
431
|
+
const module = trx_node_1.TrxNode.getModule(trx);
|
|
432
|
+
const subview_bucket = daemon_1.Daemon.getBucketMetadata(module.daemon, link.bucket);
|
|
433
|
+
// Add subview data to queue
|
|
434
|
+
for (const key in node.field.children) {
|
|
435
|
+
if (key === '__raw')
|
|
436
|
+
continue;
|
|
346
437
|
next.push({
|
|
347
|
-
bucket,
|
|
348
|
-
field,
|
|
349
|
-
data:
|
|
350
|
-
raw:
|
|
351
|
-
value:
|
|
438
|
+
bucket: subview_bucket,
|
|
439
|
+
field: node.field.children[key],
|
|
440
|
+
data: subview_data.map(data => ({
|
|
441
|
+
raw: data.obj,
|
|
442
|
+
value: data.obj,
|
|
352
443
|
index: [],
|
|
353
|
-
target:
|
|
444
|
+
target: data.target
|
|
354
445
|
}))
|
|
355
446
|
});
|
|
356
447
|
}
|
|
@@ -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 {};
|