nesoi 3.3.5 → 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.
Files changed (39) hide show
  1. package/lib/elements/blocks/job/internal/resource_job.builder.js +3 -1
  2. package/lib/elements/blocks/resource/resource.builder.js +1 -1
  3. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +1 -1
  4. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +2 -2
  5. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +1 -1
  6. package/lib/elements/entities/bucket/adapters/memory.nql.js +33 -15
  7. package/lib/elements/entities/bucket/bucket.builder.js +1 -1
  8. package/lib/elements/entities/bucket/bucket.d.ts +4 -0
  9. package/lib/elements/entities/bucket/bucket.infer.d.ts +7 -7
  10. package/lib/elements/entities/bucket/bucket.js +9 -9
  11. package/lib/elements/entities/bucket/cache/bucket_cache.js +3 -3
  12. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +13 -3
  13. package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +1 -1
  14. package/lib/elements/entities/bucket/graph/bucket_graph.js +21 -11
  15. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +6 -5
  16. package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
  17. package/lib/elements/entities/bucket/query/nql.schema.d.ts +2 -0
  18. package/lib/elements/entities/bucket/query/nql_compiler.js +6 -1
  19. package/lib/elements/entities/bucket/query/nql_engine.d.ts +2 -2
  20. package/lib/elements/entities/bucket/query/nql_engine.js +2 -2
  21. package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +3 -2
  22. package/lib/elements/entities/bucket/view/bucket_view.builder.js +3 -3
  23. package/lib/elements/entities/bucket/view/bucket_view.js +123 -32
  24. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +6 -3
  25. package/lib/elements/entities/bucket/view/bucket_view.schema.js +2 -1
  26. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +25 -24
  27. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +65 -25
  28. package/lib/engine/app/inline.app.js +6 -0
  29. package/lib/engine/app/native/distributed_node.app.js +6 -0
  30. package/lib/engine/app/service.d.ts +7 -0
  31. package/lib/engine/app/service.js +2 -0
  32. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +2 -2
  33. package/lib/engine/transaction/nodes/bucket.trx_node.js +6 -4
  34. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +2 -0
  35. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +15 -4
  36. package/lib/engine/transaction/trx_engine.js +1 -1
  37. package/lib/engine/transaction/trx_node.js +3 -3
  38. package/package.json +1 -1
  39. 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(this);
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 links;
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
- links = await trx.bucket(node.bucket.tag.short).readManyLinks(node.data.map(entry => entry.raw.id), meta.link);
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
- links = await bucket.graph.readManyLinks(trx, node.data.map(entry => entry.raw), meta.link, { silent: true });
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
- for (let i = 0; i < links.length; i++) {
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
- const link = node.bucket.schema.graph.links[meta.link];
296
- node.data[i].target[node.field.name] = link.many
297
- ? []
298
- : (links[i] ? {} : undefined);
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] = links[i];
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 = 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
- target.push(__raw ? { ..._links[i][j] } : {});
321
- target[j].$v = meta.view;
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
- nextData = _links.map((ll, i) => ll.map((l, j) => ({ value: l, target: node.data[i].target[node.field.name][j] }))).flat(1);
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 = 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
- const target = node.data[i].target[node.field.name];
333
- if (__raw) {
334
- Object.assign(target, _links[i]);
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
- // TODODO: support external bucket on transitive graph
381
+ // (still step 3) Add link bucket view fields to queue
343
382
  next = [];
344
- for (const field of Object.values(v)) {
345
- const bucket = await daemon_1.Daemon.getBucketMetadata(module.daemon, otherBucketDep);
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: nextData.map($ => ({
350
- raw: $.value,
351
- value: $.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: $.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 { BucketViewBuilder } from './bucket_view.builder';
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 GraphLinkBucket<Bucket extends $Bucket, L extends keyof Bucket['graph']['links']> = Bucket['graph']['links'][L]['#bucket'];
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'], SubModel extends BucketViewFieldBuilders>(path: K, submodel?: SubModel): BucketViewFieldBuilder<Bucket["#modelpath"][K], "model", never>;
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'], LinkBucket extends GraphLinkBucket<Bucket, L>, V extends (keyof LinkBucket['views']) | undefined>(link: L, view?: V): BucketViewFieldBuilder<undefined extends V ? LinkBucket["#data"] : ViewObj<LinkBucket, NonNullable<V>>, "graph", `${LinkBucket["name"]}.${V & string}`>;
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>(view: ViewName, fields: Builders): $BucketViewFieldBuilderInfer<Bucket["views"][ViewName]["#data"]> & Builders;
34
- static group(name: string, children: $BucketViewFields): $BucketViewField;
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 submodel?: BucketViewFieldBuilders | undefined;
41
+ protected subview?: (BucketViewFieldBuilders<any> | BucketViewDef<any, any, any>) | undefined;
44
42
  $b: "view.field";
45
- protected _chain?: BucketViewFieldBuilder<any, any, any>;
46
- constructor(scope: $BucketViewField['scope'], meta: $BucketViewFieldMeta, submodel?: BucketViewFieldBuilders | undefined);
47
- chain<Fn extends $BucketViewFieldFn<any, any>>(fn: Fn): void;
48
- static build(builder: BucketViewFieldBuilder<any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string, n_indexes: number): $BucketViewField;
49
- static buildFields(fields: BucketViewFieldBuilders, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, n_indexes?: number): $BucketViewFields;
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, submodel) {
20
+ model(path) {
24
21
  return new BucketViewFieldBuilder('model', {
25
22
  model: {
26
23
  path: path
27
24
  }
28
- }, submodel);
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
- static group(name, children) {
73
- return new bucket_view_schema_1.$BucketViewField(name, 'group', name, {}, children);
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, submodel) {
87
+ constructor(scope, meta, subview) {
86
88
  this.scope = scope;
87
89
  this.meta = meta;
88
- this.submodel = submodel;
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 chain = builder._chain;
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
- const spread_n = path.match(/\.\*(\.|$)/g)?.length || 0;
105
- if (spread_n === 0 && builder.submodel) {
106
- throw new Error('Submodels can only be specified for modelpaths with at least one \'*\'');
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 submodel');
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 graphLink = builder.meta.graph.link ? graph.links[builder.meta.graph.link] : undefined;
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
- return new bucket_view_schema_1.$BucketViewField(name, builder.scope, name, builder.meta, children, chain);
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 {};
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Service = void 0;
4
4
  class Service {
5
+ init($) {
6
+ }
5
7
  constructor(arg1, arg2) {
6
8
  if (typeof arg1 === 'string') {
7
9
  this.name = arg1;