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.
Files changed (42) hide show
  1. package/lib/elements/blocks/job/internal/resource_job.builder.js +3 -1
  2. package/lib/elements/blocks/resource/resource.builder.js +2 -3
  3. package/lib/elements/blocks/resource/resource.js +1 -0
  4. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +5 -1
  5. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +6 -2
  6. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +1 -1
  7. package/lib/elements/entities/bucket/adapters/memory.nql.js +55 -35
  8. package/lib/elements/entities/bucket/bucket.builder.js +1 -1
  9. package/lib/elements/entities/bucket/bucket.d.ts +4 -0
  10. package/lib/elements/entities/bucket/bucket.infer.d.ts +7 -7
  11. package/lib/elements/entities/bucket/bucket.js +14 -9
  12. package/lib/elements/entities/bucket/bucket.schema.d.ts +1 -1
  13. package/lib/elements/entities/bucket/cache/bucket_cache.js +3 -3
  14. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +13 -3
  15. package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +1 -1
  16. package/lib/elements/entities/bucket/graph/bucket_graph.js +23 -13
  17. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +6 -5
  18. package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
  19. package/lib/elements/entities/bucket/query/nql.schema.d.ts +8 -9
  20. package/lib/elements/entities/bucket/query/nql_compiler.d.ts +1 -1
  21. package/lib/elements/entities/bucket/query/nql_compiler.js +38 -27
  22. package/lib/elements/entities/bucket/query/nql_engine.d.ts +2 -2
  23. package/lib/elements/entities/bucket/query/nql_engine.js +4 -2
  24. package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +3 -2
  25. package/lib/elements/entities/bucket/view/bucket_view.builder.js +3 -3
  26. package/lib/elements/entities/bucket/view/bucket_view.js +123 -32
  27. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +6 -3
  28. package/lib/elements/entities/bucket/view/bucket_view.schema.js +2 -1
  29. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +25 -24
  30. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +65 -25
  31. package/lib/engine/app/inline.app.js +6 -0
  32. package/lib/engine/app/native/distributed_node.app.js +6 -0
  33. package/lib/engine/app/service.d.ts +7 -0
  34. package/lib/engine/app/service.js +2 -0
  35. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +2 -2
  36. package/lib/engine/transaction/nodes/bucket.trx_node.js +6 -4
  37. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +2 -0
  38. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +15 -4
  39. package/lib/engine/transaction/trx_engine.js +1 -1
  40. package/lib/engine/transaction/trx_node.js +3 -3
  41. package/package.json +1 -1
  42. 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 { 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;
@@ -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;
@@ -144,7 +144,7 @@ class TrxEngine {
144
144
  _tokens[providerName] = token;
145
145
  if (provider.eager || force) {
146
146
  const { user } = await provider.authenticate({ trx: node, token });
147
- users[providerName] = user;
147
+ _users[providerName] = user;
148
148
  }
149
149
  }
150
150
  }
@@ -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?.users || {};
244
- const tokens = node.auth?.tokens || {};
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nesoi",
3
- "version": "3.3.5",
3
+ "version": "3.3.7",
4
4
  "description": "Declarative framework for data-driven applications",
5
5
  "repository": {
6
6
  "type": "git",