nesoi 3.0.21 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +1 -0
- package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +8 -0
- package/lib/compiler/compiler.js +1 -1
- package/lib/compiler/elements/bucket.element.d.ts +3 -2
- package/lib/compiler/elements/bucket.element.js +86 -128
- package/lib/compiler/elements/element.js +4 -2
- package/lib/compiler/elements/externals.element.js +3 -0
- package/lib/compiler/elements/machine.element.js +2 -2
- package/lib/compiler/elements/message.element.js +35 -57
- package/lib/compiler/elements/queue.element.js +1 -1
- package/lib/compiler/helpers/dump_helpers.d.ts +5 -3
- package/lib/compiler/helpers/dump_helpers.js +43 -26
- package/lib/compiler/stages/4_build_schemas_stage.js +12 -0
- package/lib/compiler/stages/5_inject_ts_stage.js +4 -1
- package/lib/compiler/stages/7_dump_stage.js +7 -1
- package/lib/compiler/treeshake.js +4 -2
- package/lib/compiler/typescript/bridge/extract.js +37 -107
- package/lib/compiler/typescript/bridge/inject.d.ts +1 -1
- package/lib/compiler/typescript/bridge/inject.js +73 -45
- package/lib/compiler/typescript/bridge/organize.js +9 -5
- package/lib/compiler/typescript/typescript_compiler.d.ts +4 -6
- package/lib/compiler/typescript/typescript_compiler.js +139 -75
- package/lib/elements/blocks/block.builder.d.ts +1 -10
- package/lib/elements/blocks/block.builder.js +0 -32
- package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +3 -21
- package/lib/elements/blocks/job/job.builder.d.ts +6 -20
- package/lib/elements/blocks/job/job.builder.js +0 -4
- package/lib/elements/blocks/machine/machine.builder.d.ts +5 -14
- package/lib/elements/blocks/machine/machine.builder.js +2 -2
- package/lib/elements/blocks/queue/queue.builder.d.ts +6 -15
- package/lib/elements/blocks/queue/queue.builder.js +2 -2
- package/lib/elements/edge/externals/externals.builder.d.ts +2 -0
- package/lib/elements/edge/externals/externals.builder.js +6 -1
- package/lib/elements/edge/externals/externals.schema.d.ts +2 -1
- package/lib/elements/edge/externals/externals.schema.js +3 -1
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +1 -1
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +7 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +46 -36
- package/lib/elements/entities/bucket/adapters/memory.nql.js +1 -1
- package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
- package/lib/elements/entities/bucket/bucket.js +42 -43
- package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
- package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +1 -4
- package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +7 -5
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -1
- package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
- package/lib/elements/entities/bucket/model/bucket_model.infer.d.ts +41 -9
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +8 -6
- package/lib/elements/entities/bucket/model/bucket_model.schema.js +184 -21
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +89 -56
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +22 -30
- package/lib/elements/entities/bucket/query/nql.schema.d.ts +13 -10
- package/lib/elements/entities/bucket/query/nql_compiler.js +46 -21
- package/lib/elements/entities/bucket/view/bucket_view.builder.js +1 -1
- package/lib/elements/entities/bucket/view/bucket_view.d.ts +19 -0
- package/lib/elements/entities/bucket/view/bucket_view.js +230 -108
- package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -10
- package/lib/elements/entities/bucket/view/bucket_view.schema.js +3 -5
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +16 -12
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +55 -40
- package/lib/elements/entities/message/message.builder.d.ts +1 -11
- package/lib/elements/entities/message/message.infer.d.ts +6 -30
- package/lib/elements/entities/message/message.schema.js +2 -2
- package/lib/elements/entities/message/template/message_template.builder.js +1 -1
- package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -15
- package/lib/elements/entities/message/template/message_template.schema.js +29 -12
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +45 -209
- package/lib/elements/entities/message/template/message_template_field.builder.js +69 -85
- package/lib/elements/entities/message/template/message_template_parser.js +52 -64
- package/lib/engine/apps/inline.app.js +1 -0
- package/lib/engine/data/trash.js +7 -7
- package/lib/engine/data/tree.d.ts +3 -0
- package/lib/engine/data/tree.js +36 -0
- package/lib/engine/space.js +1 -1
- package/lib/engine/transaction/trx_engine.config.d.ts +3 -2
- package/lib/engine/transaction/trx_engine.d.ts +9 -1
- package/lib/engine/transaction/trx_engine.js +52 -9
- package/lib/engine/util/deep.js +4 -0
- package/lib/engine/util/parse.d.ts +22 -14
- package/lib/engine/util/parse.js +20 -5
- package/lib/engine/util/type.d.ts +3 -0
- package/package.json +1 -1
- package/tools/joaquin/bucket.d.ts +9 -0
- package/tools/joaquin/bucket.js +49 -0
- package/tools/joaquin/message.d.ts +2 -1
- package/tools/joaquin/message.js +9 -2
- package/tools/joaquin/mock.d.ts +1 -0
- package/tools/joaquin/mock.js +13 -5
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -3,9 +3,10 @@ import { $Queue } from './queue.schema';
|
|
|
3
3
|
import { ResolvedBuilderNode } from "../../../engine/dependency";
|
|
4
4
|
import { BlockBuilder } from '../block.builder';
|
|
5
5
|
import { Overlay } from "../../../engine/util/type";
|
|
6
|
-
import {
|
|
6
|
+
import { MessageTemplateDef } from "../../entities/message/template/message_template.builder";
|
|
7
7
|
import { $MessageInfer } from "../../entities/message/message.infer";
|
|
8
8
|
import { ModuleTree } from "../../../engine/tree";
|
|
9
|
+
import { $Message } from "../../entities/message/message.schema";
|
|
9
10
|
/**
|
|
10
11
|
* @category Builders
|
|
11
12
|
* @subcategory Block
|
|
@@ -16,25 +17,15 @@ export declare class QueueBuilder<Space extends $Space, M extends $Module, $ ext
|
|
|
16
17
|
authn<U extends keyof Space['authnUsers']>(...providers: U[]): QueueBuilder<Space, M, $ & {
|
|
17
18
|
"#authn": U extends any[] ? U[number] : U;
|
|
18
19
|
}>;
|
|
19
|
-
|
|
20
|
-
messages: Overlay<M["messages"], { [K in
|
|
21
|
-
path: `${K_1 & string}${keyof I & string}`;
|
|
22
|
-
data: I[keyof I];
|
|
23
|
-
opt: Opt[0];
|
|
24
|
-
nul: Nul[0];
|
|
25
|
-
} : never; } : never>, import("../../entities/message/message.infer").$MessageOutputInfer<ReturnType<Def>[K], ReturnType<Def>[K] extends infer T_1 ? { [K_2 in keyof T_1]: ReturnType<Def>[K][K_2] extends import("../../entities/message/template/message_template_field.builder").MessageTemplateFieldBuilder<any, any, any, infer O, any, infer Opt_1 extends [undefined, undefined], infer Nul_1 extends [null, null]> ? {
|
|
26
|
-
path: `${K_2 & string}${keyof O & string}`;
|
|
27
|
-
data: O[keyof O];
|
|
28
|
-
opt: Opt_1[1];
|
|
29
|
-
nul: Nul_1[1];
|
|
30
|
-
} : never; } : never>>; }>;
|
|
20
|
+
message<Name extends string, Def extends MessageTemplateDef<Space, M, Name>, FullName extends string = `${$['name']}${Name extends '' ? '' : '.'}${Name & string}`, Msg extends $Message = $MessageInfer<FullName, ($: any) => ReturnType<Def>>>(name: Name, def: Def): QueueBuilder<Space, Overlay<M, {
|
|
21
|
+
messages: Overlay<M["messages"], { [K in FullName]: Msg; }>;
|
|
31
22
|
}>, $>;
|
|
32
23
|
input<MsgName extends ScopedMessageName<M, $['name']>, Msg extends ScopedMessage<M, $['name'], MsgName>>(...def: MsgName[]): QueueBuilder<Space, M, Overlay<$, {
|
|
33
|
-
"#input": Msg;
|
|
24
|
+
"#input": $["#input"] | Msg;
|
|
34
25
|
}>>;
|
|
35
26
|
static build(node: QueueBuilderNode, tree: ModuleTree, module: $Module): {
|
|
36
27
|
schema: $Queue;
|
|
37
|
-
inlineMessages: Record<string,
|
|
28
|
+
inlineMessages: Record<string, $Message>;
|
|
38
29
|
};
|
|
39
30
|
}
|
|
40
31
|
export type AnyQueueBuilder = QueueBuilder<any, any, any>;
|
|
@@ -17,8 +17,8 @@ class QueueBuilder extends block_builder_1.BlockBuilder {
|
|
|
17
17
|
authn(...providers) {
|
|
18
18
|
return super.authn(...providers);
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
return super.
|
|
20
|
+
message(name, def) {
|
|
21
|
+
return super.message(name, def);
|
|
22
22
|
}
|
|
23
23
|
input(...def) {
|
|
24
24
|
return super._input(...def);
|
|
@@ -17,10 +17,12 @@ export declare class ExternalsBuilder<Space extends $Space, ModuleName extends k
|
|
|
17
17
|
$b: "externals";
|
|
18
18
|
name: string;
|
|
19
19
|
private buckets;
|
|
20
|
+
private messages;
|
|
20
21
|
private jobs;
|
|
21
22
|
private machines;
|
|
22
23
|
constructor(module: string);
|
|
23
24
|
bucket<M extends keyof Space['modules'], B extends ExternalBucketRefName<Space, ModuleName>>(ref: B): this;
|
|
25
|
+
message<M extends Exclude<keyof Space['modules'], ModuleName>, B extends keyof Space['modules'][M]['messages']>(ref: `${M & string}::${B & string}`): this;
|
|
24
26
|
job<M extends Exclude<keyof Space['modules'], ModuleName>, B extends keyof Space['modules'][M]['jobs']>(ref: `${M & string}::${B & string}`): this;
|
|
25
27
|
machine<M extends Exclude<keyof Space['modules'], ModuleName>, B extends keyof Space['modules'][M]['machines']>(ref: `${M & string}::${B & string}`): this;
|
|
26
28
|
static merge(to: AnyExternalsBuilder, from: AnyExternalsBuilder): void;
|
|
@@ -13,6 +13,7 @@ class ExternalsBuilder {
|
|
|
13
13
|
this.$b = 'externals';
|
|
14
14
|
this.name = '*';
|
|
15
15
|
this.buckets = {};
|
|
16
|
+
this.messages = {};
|
|
16
17
|
this.jobs = {};
|
|
17
18
|
this.machines = {};
|
|
18
19
|
}
|
|
@@ -20,6 +21,10 @@ class ExternalsBuilder {
|
|
|
20
21
|
this.buckets[ref] = new dependency_1.$Dependency(this.module, 'bucket', ref);
|
|
21
22
|
return this;
|
|
22
23
|
}
|
|
24
|
+
message(ref) {
|
|
25
|
+
this.messages[ref] = new dependency_1.$Dependency(this.module, 'message', ref);
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
23
28
|
job(ref) {
|
|
24
29
|
this.jobs[ref] = new dependency_1.$Dependency(this.module, 'job', ref);
|
|
25
30
|
return this;
|
|
@@ -34,7 +39,7 @@ class ExternalsBuilder {
|
|
|
34
39
|
}
|
|
35
40
|
// Build
|
|
36
41
|
static build(node) {
|
|
37
|
-
node.schema = new externals_schema_1.$Externals(node.module, node.builder.buckets, node.builder.jobs, node.builder.machines);
|
|
42
|
+
node.schema = new externals_schema_1.$Externals(node.module, node.builder.buckets, node.builder.messages, node.builder.jobs, node.builder.machines);
|
|
38
43
|
return node.schema;
|
|
39
44
|
}
|
|
40
45
|
}
|
|
@@ -6,10 +6,11 @@ import { $Dependency } from "../../../engine/dependency";
|
|
|
6
6
|
export declare class $Externals {
|
|
7
7
|
name: string;
|
|
8
8
|
buckets: Record<string, $Dependency>;
|
|
9
|
+
messages: Record<string, $Dependency>;
|
|
9
10
|
jobs: Record<string, $Dependency>;
|
|
10
11
|
machines: Record<string, $Dependency>;
|
|
11
12
|
$t: "externals";
|
|
12
13
|
module: string;
|
|
13
|
-
constructor(name: string, buckets?: Record<string, $Dependency>, jobs?: Record<string, $Dependency>, machines?: Record<string, $Dependency>);
|
|
14
|
+
constructor(name: string, buckets?: Record<string, $Dependency>, messages?: Record<string, $Dependency>, jobs?: Record<string, $Dependency>, machines?: Record<string, $Dependency>);
|
|
14
15
|
static merge(to: $Externals, from: $Externals): void;
|
|
15
16
|
}
|
|
@@ -6,9 +6,10 @@ exports.$Externals = void 0;
|
|
|
6
6
|
* @subcategory Edge
|
|
7
7
|
*/
|
|
8
8
|
class $Externals {
|
|
9
|
-
constructor(name, buckets = {}, jobs = {}, machines = {}) {
|
|
9
|
+
constructor(name, buckets = {}, messages = {}, jobs = {}, machines = {}) {
|
|
10
10
|
this.name = name;
|
|
11
11
|
this.buckets = buckets;
|
|
12
|
+
this.messages = messages;
|
|
12
13
|
this.jobs = jobs;
|
|
13
14
|
this.machines = machines;
|
|
14
15
|
this.$t = 'externals';
|
|
@@ -16,6 +17,7 @@ class $Externals {
|
|
|
16
17
|
}
|
|
17
18
|
static merge(to, from) {
|
|
18
19
|
Object.assign(to.buckets, from.buckets);
|
|
20
|
+
Object.assign(to.messages, from.messages);
|
|
19
21
|
Object.assign(to.jobs, from.jobs);
|
|
20
22
|
Object.assign(to.machines, from.machines);
|
|
21
23
|
}
|
|
@@ -141,7 +141,7 @@ export declare abstract class BucketAdapter<Obj extends NesoiObj> {
|
|
|
141
141
|
}): Promise<NQL_Result<MetadataOnly extends true ? {
|
|
142
142
|
id: Obj['id'];
|
|
143
143
|
[x: string]: any;
|
|
144
|
-
}
|
|
144
|
+
} : Obj>>;
|
|
145
145
|
/**
|
|
146
146
|
* Return the epoch of the last update of an object
|
|
147
147
|
* @param {Obj} obj An object of this bucket
|
|
@@ -6,6 +6,13 @@ import { BucketCacheSync } from '../cache/bucket_cache';
|
|
|
6
6
|
/**
|
|
7
7
|
* @category Adapters
|
|
8
8
|
* @subcategory Entity
|
|
9
|
+
*
|
|
10
|
+
* > Every method that alters data makes a `Deep.copy` of the input
|
|
11
|
+
* > before processing it, to avoid side-effects to the input data
|
|
12
|
+
* > by modifying the external data on the adapter.
|
|
13
|
+
* > It also makes a `Deep.copy` of the data before outputting it,
|
|
14
|
+
* > to avoid side-effects on the adapter data by modifying the returned
|
|
15
|
+
* > object externally.
|
|
9
16
|
* */
|
|
10
17
|
export declare class MemoryBucketAdapter<B extends $Bucket, Obj extends B['#data']> extends BucketAdapter<Obj> {
|
|
11
18
|
schema: B;
|
|
@@ -4,9 +4,17 @@ exports.MemoryBucketAdapter = void 0;
|
|
|
4
4
|
const bucket_adapter_1 = require("./bucket_adapter");
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
6
|
const memory_nql_1 = require("./memory.nql");
|
|
7
|
+
const bucket_model_schema_1 = require("../model/bucket_model.schema");
|
|
7
8
|
/**
|
|
8
9
|
* @category Adapters
|
|
9
10
|
* @subcategory Entity
|
|
11
|
+
*
|
|
12
|
+
* > Every method that alters data makes a `Deep.copy` of the input
|
|
13
|
+
* > before processing it, to avoid side-effects to the input data
|
|
14
|
+
* > by modifying the external data on the adapter.
|
|
15
|
+
* > It also makes a `Deep.copy` of the data before outputting it,
|
|
16
|
+
* > to avoid side-effects on the adapter data by modifying the returned
|
|
17
|
+
* > object externally.
|
|
10
18
|
* */
|
|
11
19
|
class MemoryBucketAdapter extends bucket_adapter_1.BucketAdapter {
|
|
12
20
|
constructor(schema, data = {}, config) {
|
|
@@ -37,12 +45,14 @@ class MemoryBucketAdapter extends bucket_adapter_1.BucketAdapter {
|
|
|
37
45
|
}
|
|
38
46
|
/* Write Operations */
|
|
39
47
|
async create(trx, obj) {
|
|
48
|
+
const input = bucket_model_schema_1.$BucketModel.copy(this.schema.model, obj, this.config.meta);
|
|
40
49
|
const lastId = (await this.index(trx))
|
|
41
|
-
.map((
|
|
50
|
+
.map((_obj) => parseInt(_obj.id))
|
|
42
51
|
.sort((a, b) => b - a)[0] || 0;
|
|
43
|
-
|
|
44
|
-
this.data[
|
|
45
|
-
|
|
52
|
+
input.id = lastId + 1;
|
|
53
|
+
this.data[input.id] = input;
|
|
54
|
+
const output = bucket_model_schema_1.$BucketModel.copy(this.schema.model, input, this.config.meta);
|
|
55
|
+
return Promise.resolve(output);
|
|
46
56
|
}
|
|
47
57
|
async createMany(trx, objs) {
|
|
48
58
|
const out = [];
|
|
@@ -55,17 +65,16 @@ class MemoryBucketAdapter extends bucket_adapter_1.BucketAdapter {
|
|
|
55
65
|
if (!obj.id || !this.data[obj.id]) {
|
|
56
66
|
throw new Error(`Object with id ${obj.id} not found for replace`);
|
|
57
67
|
}
|
|
58
|
-
this.
|
|
59
|
-
|
|
68
|
+
const input = bucket_model_schema_1.$BucketModel.copy(this.schema.model, obj, this.config.meta);
|
|
69
|
+
this.data[input.id] = input;
|
|
70
|
+
const output = bucket_model_schema_1.$BucketModel.copy(this.schema.model, input, this.config.meta);
|
|
71
|
+
return Promise.resolve(output);
|
|
60
72
|
}
|
|
61
|
-
replaceMany(trx, objs) {
|
|
73
|
+
async replaceMany(trx, objs) {
|
|
62
74
|
const out = [];
|
|
63
75
|
for (const obj of objs) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
this.data[obj.id] = obj;
|
|
68
|
-
out.push(obj);
|
|
76
|
+
const output = await this.replace(trx, obj);
|
|
77
|
+
out.push(output);
|
|
69
78
|
}
|
|
70
79
|
return Promise.resolve(out);
|
|
71
80
|
}
|
|
@@ -73,39 +82,38 @@ class MemoryBucketAdapter extends bucket_adapter_1.BucketAdapter {
|
|
|
73
82
|
if (!obj.id || !this.data[obj.id]) {
|
|
74
83
|
throw new Error(`Object with id ${obj.id} not found for patch`);
|
|
75
84
|
}
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
for (const key in
|
|
79
|
-
if (
|
|
80
|
-
delete
|
|
85
|
+
const data = this.data[obj.id];
|
|
86
|
+
const input = bucket_model_schema_1.$BucketModel.copy(this.schema.model, obj, this.config.meta);
|
|
87
|
+
for (const key in input) {
|
|
88
|
+
if (input[key] === null) {
|
|
89
|
+
delete data[key];
|
|
81
90
|
}
|
|
82
|
-
else if (
|
|
83
|
-
|
|
91
|
+
else if (input[key] !== undefined) {
|
|
92
|
+
data[key] = input[key];
|
|
84
93
|
}
|
|
85
94
|
}
|
|
86
|
-
|
|
95
|
+
const output = bucket_model_schema_1.$BucketModel.copy(this.schema.model, data, this.config.meta);
|
|
96
|
+
return Promise.resolve(output);
|
|
87
97
|
}
|
|
88
|
-
patchMany(trx, objs) {
|
|
98
|
+
async patchMany(trx, objs) {
|
|
89
99
|
const out = [];
|
|
90
100
|
for (const obj of objs) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
// TODO: Implement patch
|
|
95
|
-
this.data[obj.id] = obj;
|
|
96
|
-
out.push(obj);
|
|
101
|
+
const output = await this.patch(trx, obj);
|
|
102
|
+
out.push(output);
|
|
97
103
|
}
|
|
98
104
|
return Promise.resolve(out);
|
|
99
105
|
}
|
|
100
106
|
async put(trx, obj) {
|
|
101
|
-
|
|
107
|
+
const input = bucket_model_schema_1.$BucketModel.copy(this.schema.model, obj, this.config.meta);
|
|
108
|
+
if (!input.id) {
|
|
102
109
|
const lastId = (await this.index(trx))
|
|
103
|
-
.map((
|
|
110
|
+
.map((_obj) => parseInt(_obj.id))
|
|
104
111
|
.sort((a, b) => b - a)[0] || 0;
|
|
105
|
-
|
|
112
|
+
input.id = lastId + 1;
|
|
106
113
|
}
|
|
107
|
-
this.data[
|
|
108
|
-
|
|
114
|
+
this.data[input.id] = input;
|
|
115
|
+
const output = bucket_model_schema_1.$BucketModel.copy(this.schema.model, input, this.config.meta);
|
|
116
|
+
return Promise.resolve(output);
|
|
109
117
|
}
|
|
110
118
|
async putMany(trx, objs) {
|
|
111
119
|
const lastId = (await this.index(trx))
|
|
@@ -114,11 +122,13 @@ class MemoryBucketAdapter extends bucket_adapter_1.BucketAdapter {
|
|
|
114
122
|
let id = lastId + 1;
|
|
115
123
|
const out = [];
|
|
116
124
|
for (const obj of objs) {
|
|
117
|
-
|
|
118
|
-
|
|
125
|
+
const input = bucket_model_schema_1.$BucketModel.copy(this.schema.model, obj, this.config.meta);
|
|
126
|
+
if (!input.id) {
|
|
127
|
+
input.id = id;
|
|
119
128
|
}
|
|
120
|
-
this.data[
|
|
121
|
-
|
|
129
|
+
this.data[input.id] = input;
|
|
130
|
+
const output = bucket_model_schema_1.$BucketModel.copy(this.schema.model, input, this.config.meta);
|
|
131
|
+
out.push(output);
|
|
122
132
|
id++;
|
|
123
133
|
}
|
|
124
134
|
return Promise.resolve(out);
|
|
@@ -66,7 +66,7 @@ class MemoryNQLRunner extends nql_engine_1.NQLRunner {
|
|
|
66
66
|
if (pagination.returnTotal) {
|
|
67
67
|
totalItems = output.length;
|
|
68
68
|
}
|
|
69
|
-
if (pagination.page || pagination.perPage) {
|
|
69
|
+
if (pagination.page !== undefined || pagination.perPage !== undefined) {
|
|
70
70
|
const a = ((pagination.page || 1) - 1) * (pagination.perPage || 10);
|
|
71
71
|
const b = a + (pagination.perPage || 10);
|
|
72
72
|
output = output.slice(a, b);
|
|
@@ -10,7 +10,7 @@ import { $BucketGraphLinksInfer } from './graph/bucket_graph.infer';
|
|
|
10
10
|
import { $BucketGraph } from './graph/bucket_graph.schema';
|
|
11
11
|
import { $Dependency, ResolvedBuilderNode } from "../../../engine/dependency";
|
|
12
12
|
import { ModuleTree } from "../../../engine/tree";
|
|
13
|
-
import {
|
|
13
|
+
import { BucketModelpathInfer, BucketModelInfer, BucketQuerypathInfer } from './model/bucket_model.infer';
|
|
14
14
|
import { Overlay } from "../../../engine/util/type";
|
|
15
15
|
import { $Constants } from '../constants/constants.schema';
|
|
16
16
|
import { NesoiObj } from "../../../engine/data/obj";
|
|
@@ -33,14 +33,16 @@ export declare class BucketBuilder<Space extends $Space, Module extends $Module,
|
|
|
33
33
|
constructor(module: string, name: string);
|
|
34
34
|
as(alias: string): this;
|
|
35
35
|
extend<N extends Exclude<BucketName<Module>, Bucket['name']>>(name: N): BucketBuilder<Space, Module, Module["buckets"][N]>;
|
|
36
|
-
model<Def extends BucketModelDef<Space, Module>, Obj = BucketModelInfer<Def>,
|
|
36
|
+
model<Def extends BucketModelDef<Space, Module>, Obj = BucketModelInfer<Def>, Modelpath extends {} = BucketModelpathInfer<Def>, Querypath extends {} = BucketQuerypathInfer<Def>>($: Def): BucketBuilder<Space, Overlay<Module, {
|
|
37
37
|
buckets: Overlay<Module["buckets"], { [K in Bucket["name"]]: Overlay<Bucket, {
|
|
38
38
|
'#data': Obj & NesoiObj;
|
|
39
|
-
'#
|
|
39
|
+
'#modelpath': Modelpath;
|
|
40
|
+
'#querypath': Querypath;
|
|
40
41
|
}>; }>;
|
|
41
42
|
}>, Overlay<Bucket, {
|
|
42
43
|
'#data': Obj & NesoiObj;
|
|
43
|
-
'#
|
|
44
|
+
'#modelpath': Modelpath;
|
|
45
|
+
'#querypath': Querypath;
|
|
44
46
|
}>>;
|
|
45
47
|
/**
|
|
46
48
|
* Optional query to be appended to every read of this bucket, based on the user
|
|
@@ -425,11 +425,13 @@ class Bucket {
|
|
|
425
425
|
continue;
|
|
426
426
|
const linkObj = composition[link.name];
|
|
427
427
|
if (!linkObj) {
|
|
428
|
-
|
|
428
|
+
if (mode === 'patch')
|
|
429
|
+
continue;
|
|
430
|
+
throw error_1.NesoiError.Bucket.MissingComposition({ method: 'replace', bucket: this.schema.name, link: link.name });
|
|
429
431
|
}
|
|
430
432
|
if (link.many) {
|
|
431
433
|
if (!Array.isArray(linkObj)) {
|
|
432
|
-
throw error_1.NesoiError.Bucket.CompositionValueShouldBeArray({ method: '
|
|
434
|
+
throw error_1.NesoiError.Bucket.CompositionValueShouldBeArray({ method: 'replace', bucket: this.schema.name, link: link.name });
|
|
433
435
|
}
|
|
434
436
|
for (const linkObjItem of linkObj) {
|
|
435
437
|
await trx.bucket(link.bucket.refName)[mode](linkObjItem);
|
|
@@ -525,20 +527,44 @@ class Bucket {
|
|
|
525
527
|
}
|
|
526
528
|
}
|
|
527
529
|
// Delete compositions (with other key)
|
|
530
|
+
// Currently there's only 'self' key
|
|
531
|
+
//
|
|
532
|
+
// for(const link of Object.values(this.schema.graph.links)) {
|
|
533
|
+
// if (link.rel !== 'composition') continue;
|
|
534
|
+
// if (link.keyOwner !== 'other') continue;
|
|
535
|
+
// const linked = await this.graph.readLink(trx, id, link.name, {
|
|
536
|
+
// silent: true
|
|
537
|
+
// }) as any;
|
|
538
|
+
// if (!linked) continue;
|
|
539
|
+
// if (link.many) {
|
|
540
|
+
// for (const linkedItem of linked) {
|
|
541
|
+
// await trx.bucket(link.bucket.refName).delete(linkedItem.id);
|
|
542
|
+
// }
|
|
543
|
+
// }
|
|
544
|
+
// else {
|
|
545
|
+
// await trx.bucket(link.bucket.refName).delete(linked.id);
|
|
546
|
+
// }
|
|
547
|
+
// }
|
|
548
|
+
// Composition (with self key)
|
|
528
549
|
for (const link of Object.values(this.schema.graph.links)) {
|
|
529
550
|
if (link.rel !== 'composition')
|
|
530
551
|
continue;
|
|
531
|
-
if (link.keyOwner !== '
|
|
552
|
+
if (link.keyOwner !== 'self')
|
|
532
553
|
continue;
|
|
533
|
-
const linked =
|
|
534
|
-
|
|
535
|
-
|
|
554
|
+
const linked = result
|
|
555
|
+
// If safe, avoid reading the object again inside readLink.
|
|
556
|
+
// Instead, use graph's readLink which takes the object.
|
|
557
|
+
? await this.graph.readLink(trx, result.data[0], link.name, {
|
|
558
|
+
silent: true
|
|
559
|
+
})
|
|
560
|
+
// If unsafe, read the link base by id.
|
|
561
|
+
: await this.readLink(trx, id, link.name, {
|
|
562
|
+
silent: true
|
|
563
|
+
});
|
|
536
564
|
if (!linked)
|
|
537
565
|
continue;
|
|
538
566
|
if (link.many) {
|
|
539
|
-
|
|
540
|
-
await trx.bucket(link.bucket.refName).delete(linkedItem.id);
|
|
541
|
-
}
|
|
567
|
+
await trx.bucket(link.bucket.refName).unsafe.deleteMany(linked.map((l) => l.id));
|
|
542
568
|
}
|
|
543
569
|
else {
|
|
544
570
|
await trx.bucket(link.bucket.refName).delete(linked.id);
|
|
@@ -550,24 +576,6 @@ class Bucket {
|
|
|
550
576
|
await trash_1.Trash.add(trx, this.module, this.schema.name, obj);
|
|
551
577
|
}
|
|
552
578
|
await this.adapter.delete(trx, id);
|
|
553
|
-
// Composition (with self key)
|
|
554
|
-
for (const link of Object.values(this.schema.graph.links)) {
|
|
555
|
-
if (link.rel !== 'composition')
|
|
556
|
-
continue;
|
|
557
|
-
if (link.keyOwner !== 'self')
|
|
558
|
-
continue;
|
|
559
|
-
const linked = await this.readLink(trx, id, link.name, {
|
|
560
|
-
silent: true
|
|
561
|
-
});
|
|
562
|
-
if (!linked)
|
|
563
|
-
continue;
|
|
564
|
-
if (link.many) {
|
|
565
|
-
await trx.bucket(link.bucket.refName).unsafe.deleteMany(linked.map((l) => l.id));
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
await trx.bucket(link.bucket.refName).delete(linked.id);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
579
|
}
|
|
572
580
|
/**
|
|
573
581
|
* Delete many entities
|
|
@@ -735,22 +743,13 @@ class Bucket {
|
|
|
735
743
|
if (!this.drive) {
|
|
736
744
|
throw error_1.NesoiError.Bucket.Drive.NoAdapter({ bucket: this.schema.alias });
|
|
737
745
|
}
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
}
|
|
746
|
-
tree_1.Tree.set(obj, field.path, () => remoteFiles);
|
|
747
|
-
}
|
|
748
|
-
else {
|
|
749
|
-
const file = tree_1.Tree.get(obj, field.path);
|
|
750
|
-
const remoteFile = await this.drive.upload(file);
|
|
751
|
-
tree_1.Tree.set(obj, field.path, () => remoteFile);
|
|
752
|
-
}
|
|
753
|
-
}
|
|
746
|
+
await bucket_model_schema_1.$BucketModel.forEachField(this.schema.model, async (field) => {
|
|
747
|
+
if (field.type !== 'file')
|
|
748
|
+
return;
|
|
749
|
+
const file = tree_1.Tree.get(obj, field.path);
|
|
750
|
+
const remoteFile = await this.drive.upload(file);
|
|
751
|
+
tree_1.Tree.set(obj, field.path, () => remoteFile);
|
|
752
|
+
});
|
|
754
753
|
}
|
|
755
754
|
}
|
|
756
755
|
exports.Bucket = Bucket;
|
|
@@ -28,7 +28,8 @@ export declare class $Bucket {
|
|
|
28
28
|
many: boolean;
|
|
29
29
|
optional: boolean;
|
|
30
30
|
}>;
|
|
31
|
-
'#
|
|
31
|
+
'#modelpath': {};
|
|
32
|
+
'#querypath': {};
|
|
32
33
|
'#defaults': Record<string, any>;
|
|
33
34
|
constructor(module: string, name: string, alias: string, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, tenancy?: $BucketTenancy<any, any> | undefined, extended?: $Dependency | undefined);
|
|
34
35
|
}
|
|
@@ -35,10 +35,7 @@ export declare class BucketCache<Obj extends NesoiObj> {
|
|
|
35
35
|
constructor(bucketName: string, outerAdapter: AnyBucketAdapter, config: NonNullable<BucketConfig<any, any, any>['cache']>);
|
|
36
36
|
get(trx: AnyTrxNode, id: NesoiObj['id']): Promise<any>;
|
|
37
37
|
index(trx: AnyTrxNode): Promise<any[]>;
|
|
38
|
-
query(trx: AnyTrxNode, view: $BucketView, query: NQL_AnyQuery, pagination?: NQL_Pagination): Promise<NQL_Result<any
|
|
39
|
-
[x: string]: any;
|
|
40
|
-
id: any;
|
|
41
|
-
}[]> | Obj[]>;
|
|
38
|
+
query(trx: AnyTrxNode, view: $BucketView, query: NQL_AnyQuery, pagination?: NQL_Pagination): Promise<NQL_Result<any> | Obj[]>;
|
|
42
39
|
private syncOne;
|
|
43
40
|
private syncOneAndPast;
|
|
44
41
|
private syncAll;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Overlay } from "../../../../engine/util/type";
|
|
2
2
|
import { $BucketGraphLink } from './bucket_graph.schema';
|
|
3
|
-
import {
|
|
3
|
+
import { BucketGraphLinkBuilders } from './bucket_graph_link.builder';
|
|
4
|
+
type Replace<T extends string> = T extends `${infer L}$${infer R}` ? `${L}${string}${Replace<R>}` : T;
|
|
4
5
|
export type $BucketGraphLinksInfer<Builders extends BucketGraphLinkBuilders> = {
|
|
5
|
-
[K in keyof Builders
|
|
6
|
-
'#bucket':
|
|
7
|
-
'#data':
|
|
8
|
-
}
|
|
6
|
+
[K in keyof Builders as Replace<K & string>]: Overlay<$BucketGraphLink, {
|
|
7
|
+
'#bucket': Builders[K]['#other'];
|
|
8
|
+
'#data': Builders[K]['#other']['#data'];
|
|
9
|
+
}>;
|
|
9
10
|
};
|
|
11
|
+
export {};
|
|
@@ -8,7 +8,7 @@ import { NQL_AnyQuery, NQL_Query } from '../query/nql.schema';
|
|
|
8
8
|
* @category Builders
|
|
9
9
|
* @subcategory Entity
|
|
10
10
|
* */
|
|
11
|
-
export declare class BucketGraphLinkFactory<Module extends $Module, SelfBucket extends $Bucket, Fieldpaths = NoInfer<SelfBucket['#
|
|
11
|
+
export declare class BucketGraphLinkFactory<Module extends $Module, SelfBucket extends $Bucket, Fieldpaths = NoInfer<SelfBucket['#modelpath']>> {
|
|
12
12
|
private module;
|
|
13
13
|
private alias?;
|
|
14
14
|
private type;
|
|
@@ -28,6 +28,7 @@ export declare class BucketGraphLinkBuilder<Module extends $Module, SelfBucket e
|
|
|
28
28
|
private query;
|
|
29
29
|
private many;
|
|
30
30
|
private alias?;
|
|
31
|
+
'#other': OtherBucket;
|
|
31
32
|
private _optional;
|
|
32
33
|
constructor(bucket: $Dependency, rel: 'aggregation' | 'composition', query: NQL_AnyQuery, many: boolean, alias?: string | undefined);
|
|
33
34
|
as(alias: string): this;
|
|
@@ -13,5 +13,5 @@ export declare class BucketModelBuilder<Module extends $Module> {
|
|
|
13
13
|
static build(builder: BucketModelBuilder<any>): $BucketModel;
|
|
14
14
|
}
|
|
15
15
|
export type BucketModelDef<Space extends $Space, Module extends $Module> = ($: BucketModelFieldFactory<Space, Module>) => {
|
|
16
|
-
id: BucketModelFieldBuilder<Module, any>;
|
|
16
|
+
id: BucketModelFieldBuilder<Module, any, any, any, any, any>;
|
|
17
17
|
} & BucketModelFieldBuilders<Module>;
|
|
@@ -5,7 +5,7 @@ import { $Message } from "../../message/message.schema";
|
|
|
5
5
|
* @category Elements
|
|
6
6
|
* @subcategory Entity
|
|
7
7
|
* */
|
|
8
|
-
export declare function convertToView<Model extends $BucketModel>(model: Model, name: string, fields?: $BucketModelFields, path?: string): $BucketView;
|
|
8
|
+
export declare function convertToView<Model extends $BucketModel>(model: Model, name: string, fields?: $BucketModelFields, path?: string, depth?: number): $BucketView;
|
|
9
9
|
/**
|
|
10
10
|
* @category Elements
|
|
11
11
|
* @subcategory Entity
|
|
@@ -13,7 +13,7 @@ const dependency_1 = require("../../../../engine/dependency");
|
|
|
13
13
|
* @category Elements
|
|
14
14
|
* @subcategory Entity
|
|
15
15
|
* */
|
|
16
|
-
function convertToView(model, name, fields = model.fields, path) {
|
|
16
|
+
function convertToView(model, name, fields = model.fields, path, depth = 0) {
|
|
17
17
|
const view = new bucket_view_builder_1.BucketViewBuilder(name);
|
|
18
18
|
const convertFields = (fields) => {
|
|
19
19
|
const viewFields = {};
|
|
@@ -24,7 +24,7 @@ function convertToView(model, name, fields = model.fields, path) {
|
|
|
24
24
|
+ field.name;
|
|
25
25
|
const builder = $.model(key);
|
|
26
26
|
const graph = new bucket_graph_schema_1.$BucketGraph();
|
|
27
|
-
viewFields[f] = bucket_view_field_builder_1.BucketViewFieldBuilder.build(builder, model, graph, {}, field.name);
|
|
27
|
+
viewFields[f] = bucket_view_field_builder_1.BucketViewFieldBuilder.build(builder, model, graph, {}, field.name, depth);
|
|
28
28
|
}
|
|
29
29
|
return viewFields;
|
|
30
30
|
};
|
|
@@ -36,12 +36,12 @@ function convertToView(model, name, fields = model.fields, path) {
|
|
|
36
36
|
* */
|
|
37
37
|
function convertToMessage(module, model, name, alias, include = [], exclude = []) {
|
|
38
38
|
const convertField = (field) => {
|
|
39
|
-
return new message_template_schema_1.$MessageTemplateField(field.type, field.name, field.alias, field.
|
|
39
|
+
return new message_template_schema_1.$MessageTemplateField(field.type, field.name, field.alias, field.path, field.path, field.required, undefined, false, [], {
|
|
40
40
|
enum: field.meta?.enum ? {
|
|
41
41
|
options: field.meta.enum.options,
|
|
42
42
|
dep: field.meta.enum.dep ? new dependency_1.$Dependency(module, 'constants', `${field.meta.enum.dep.module}::${field.meta.enum.dep.name}`) : undefined
|
|
43
43
|
} : undefined
|
|
44
|
-
}, field.children ? convertFields(field.children, include, exclude) : undefined
|
|
44
|
+
}, field.children ? convertFields(field.children, include, exclude) : undefined);
|
|
45
45
|
};
|
|
46
46
|
const convertFields = (fields, include = [], exclude = [], root = '') => {
|
|
47
47
|
const msgFields = {};
|
|
@@ -1,13 +1,45 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UnionToIntersection } from "../../../../engine/util/type";
|
|
2
2
|
import { BucketModelDef } from './bucket_model.builder';
|
|
3
|
-
import {
|
|
4
|
-
export type BucketModelObjInfer<
|
|
5
|
-
[K in keyof
|
|
3
|
+
import { AnyBucketModelFieldBuilder, BucketModelFieldBuilders } from './bucket_model_field.builder';
|
|
4
|
+
export type BucketModelObjInfer<Fields extends BucketModelFieldBuilders<any>, Prefix = ''> = {
|
|
5
|
+
[K in keyof Fields as Fields[K]['#optional'][1] extends true ? never : `${Prefix & string}${K & string}`]: Fields[K]['#output'];
|
|
6
|
+
} & {
|
|
7
|
+
[K in keyof Fields as Fields[K]['#optional'][1] extends true ? `${Prefix & string}${K & string}` : never]?: Fields[K]['#output'];
|
|
6
8
|
};
|
|
7
9
|
export type BucketModelInfer<Def extends BucketModelDef<any, any>> = BucketModelObjInfer<ReturnType<Def>>;
|
|
8
|
-
|
|
9
|
-
[K in keyof Builders]:
|
|
10
|
-
[J in keyof
|
|
11
|
-
}
|
|
10
|
+
type BucketModelpathRawInfer<Builders extends BucketModelFieldBuilders<any>> = UnionToIntersection<{
|
|
11
|
+
[K in keyof Builders]: {
|
|
12
|
+
[J in keyof Builders[K]['#modelpath'] as `${K & string}${J & string}`]: Builders[K]['#modelpath'][J];
|
|
13
|
+
};
|
|
12
14
|
}[keyof Builders]>;
|
|
13
|
-
export type
|
|
15
|
+
export type BucketModelpathObjInfer<Builders extends BucketModelFieldBuilders<any>> = UnionToIntersection<{
|
|
16
|
+
[K in keyof Builders]: {
|
|
17
|
+
[J in keyof Builders[K]['#modelpath'] as `.${K & string}${J & string}`]: Builders[K]['#modelpath'][J];
|
|
18
|
+
};
|
|
19
|
+
}[keyof Builders]>;
|
|
20
|
+
export type BucketModelpathListInfer<Builder extends AnyBucketModelFieldBuilder> = {
|
|
21
|
+
[J in keyof Builder['#modelpath'] as `.*${J & string}` | `.$${number}${J & string}` | `.${number}${J & string}`]: Builder['#modelpath'][J];
|
|
22
|
+
};
|
|
23
|
+
export type BucketModelpathDictInfer<Builder extends AnyBucketModelFieldBuilder> = {
|
|
24
|
+
[J in keyof Builder['#modelpath'] as `.*${J & string}` | `.$${number}${J & string}` | `.${string}${J & string}`]: Builder['#modelpath'][J];
|
|
25
|
+
};
|
|
26
|
+
export type BucketModelpathUnionInfer<Builders extends AnyBucketModelFieldBuilder[]> = Builders[0]['#modelpath'] | Builders[1]['#modelpath'];
|
|
27
|
+
export type BucketModelpathInfer<Def extends BucketModelDef<any, any>> = BucketModelpathRawInfer<ReturnType<Def>>;
|
|
28
|
+
type BucketQuerypathRawInfer<Builders extends BucketModelFieldBuilders<any>> = {
|
|
29
|
+
[K in keyof Builders]: {
|
|
30
|
+
[J in keyof Builders[K]['#querypath'] as `${K & string}${J & string}`]: Builders[K]['#querypath'][J];
|
|
31
|
+
};
|
|
32
|
+
}[keyof Builders];
|
|
33
|
+
export type BucketQuerypathObjInfer<Builders extends BucketModelFieldBuilders<any>> = UnionToIntersection<{
|
|
34
|
+
[K in keyof Builders]: {
|
|
35
|
+
[J in keyof Builders[K]['#querypath'] as `.${K & string}${J & string}`]: Builders[K]['#querypath'][J];
|
|
36
|
+
};
|
|
37
|
+
}[keyof Builders]>;
|
|
38
|
+
export type BucketQuerypathListInfer<Builder extends AnyBucketModelFieldBuilder> = {
|
|
39
|
+
[J in keyof Builder['#querypath'] as `.${number | '#' | '*'}${J & string}`]: Builder['#querypath'][J];
|
|
40
|
+
};
|
|
41
|
+
export type BucketQuerypathDictInfer<Builder extends AnyBucketModelFieldBuilder> = {
|
|
42
|
+
[J in keyof Builder['#querypath'] as `.${string | '#' | '*'}${J & string}`]: Builder['#querypath'][J];
|
|
43
|
+
};
|
|
44
|
+
export type BucketQuerypathInfer<Def extends BucketModelDef<any, any>> = UnionToIntersection<BucketQuerypathRawInfer<ReturnType<Def>>>;
|
|
45
|
+
export {};
|