nesoi 3.0.20 → 3.1.0
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/4_dump_modules_stage.js +8 -0
- package/lib/compiler/compiler.js +1 -1
- package/lib/compiler/elements/bucket.element.d.ts +2 -1
- package/lib/compiler/elements/bucket.element.js +68 -122
- package/lib/compiler/elements/element.js +2 -1
- package/lib/compiler/elements/externals.element.js +3 -0
- package/lib/compiler/elements/message.element.js +34 -57
- package/lib/compiler/elements/queue.element.js +1 -1
- package/lib/compiler/helpers/dump_helpers.d.ts +2 -0
- package/lib/compiler/helpers/dump_helpers.js +12 -2
- 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/memory.nql.js +1 -1
- package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
- package/lib/elements/entities/bucket/bucket.js +7 -16
- package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
- 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 +45 -9
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +5 -6
- package/lib/elements/entities/bucket/model/bucket_model.schema.js +64 -21
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +88 -55
- 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.builder.js +2 -2
- 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/message_parser.d.ts +0 -1
- package/lib/elements/entities/message/message_parser.js +1 -68
- package/lib/elements/entities/message/template/message_template.builder.js +1 -1
- package/lib/elements/entities/message/template/message_template.schema.d.ts +11 -6
- package/lib/elements/entities/message/template/message_template.schema.js +29 -6
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +50 -203
- package/lib/elements/entities/message/template/message_template_field.builder.js +74 -74
- package/lib/elements/entities/message/template/message_template_parser.d.ts +2 -2
- package/lib/elements/entities/message/template/message_template_parser.js +137 -71
- package/lib/engine/apps/inline.app.js +1 -0
- package/lib/engine/data/error.d.ts +12 -11
- package/lib/engine/data/error.js +7 -7
- 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/util/parse.d.ts +36 -28
- package/lib/engine/util/parse.js +53 -43
- 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
|
@@ -5,8 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.BucketView = void 0;
|
|
7
7
|
const promise_1 = __importDefault(require("../../../../engine/util/promise"));
|
|
8
|
-
const tree_1 = require("../../../../engine/data/tree");
|
|
9
8
|
const error_1 = require("../../../../engine/data/error");
|
|
9
|
+
const tree_1 = require("../../../../engine/data/tree");
|
|
10
|
+
class ViewValue {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.value = undefined;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
10
15
|
/**
|
|
11
16
|
* @category Elements
|
|
12
17
|
* @subcategory Entity
|
|
@@ -17,123 +22,240 @@ class BucketView {
|
|
|
17
22
|
this.schema = schema;
|
|
18
23
|
}
|
|
19
24
|
async parse(trx, raw) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
25
|
+
const parsed = {};
|
|
26
|
+
if ('__raw' in this.schema.fields) {
|
|
27
|
+
Object.assign(parsed, raw);
|
|
28
|
+
}
|
|
29
|
+
let layer = Object.values(this.schema.fields).map(field => ({
|
|
30
|
+
field,
|
|
31
|
+
data: [{
|
|
32
|
+
value: raw,
|
|
33
|
+
index: [],
|
|
34
|
+
target: parsed
|
|
35
|
+
}]
|
|
36
|
+
}));
|
|
37
|
+
while (layer.length) {
|
|
38
|
+
layer = await this.parseLayer(trx, raw, layer);
|
|
39
|
+
}
|
|
40
|
+
parsed['$v'] = this.schema.name;
|
|
41
|
+
return {
|
|
42
|
+
id: raw.id,
|
|
43
|
+
...parsed
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async parseLayer(trx, raw, layer) {
|
|
47
|
+
const next = [];
|
|
48
|
+
// Model props
|
|
49
|
+
for (const node of layer) {
|
|
50
|
+
if (node.field.scope !== 'model')
|
|
51
|
+
continue;
|
|
52
|
+
next.push(...this.parseModelProp(raw, node));
|
|
53
|
+
}
|
|
54
|
+
// Computed props
|
|
55
|
+
for (const node of layer) {
|
|
56
|
+
if (node.field.scope !== 'computed')
|
|
57
|
+
continue;
|
|
58
|
+
await this.parseComputedProp(trx, raw, node);
|
|
59
|
+
}
|
|
60
|
+
// Graph props
|
|
61
|
+
for (const node of layer) {
|
|
62
|
+
if (node.field.scope !== 'graph')
|
|
63
|
+
continue;
|
|
64
|
+
await this.parseGraphProp(trx, raw, node);
|
|
65
|
+
}
|
|
66
|
+
// Drive props
|
|
67
|
+
for (const node of layer) {
|
|
68
|
+
if (node.field.scope !== 'drive')
|
|
69
|
+
continue;
|
|
70
|
+
await this.parseDriveProp(trx, raw, node);
|
|
71
|
+
}
|
|
72
|
+
// Group props
|
|
73
|
+
for (const node of layer) {
|
|
74
|
+
if (node.field.scope !== 'group')
|
|
75
|
+
continue;
|
|
76
|
+
if (!node.field.children)
|
|
77
|
+
continue;
|
|
78
|
+
if ('__raw' in node.field.children) {
|
|
79
|
+
for (const d of node.data) {
|
|
80
|
+
d.target[node.field.name] = d.value;
|
|
59
81
|
}
|
|
60
|
-
parsedObj[k] = await promise_1.default.solve(link);
|
|
61
82
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
next.push(...Object.values(node.field.children).map(field => ({
|
|
84
|
+
field,
|
|
85
|
+
data: node.data
|
|
86
|
+
})));
|
|
87
|
+
}
|
|
88
|
+
// Chains
|
|
89
|
+
for (const node of layer) {
|
|
90
|
+
if (!node.field.chain)
|
|
91
|
+
continue;
|
|
92
|
+
next.push({
|
|
93
|
+
field: node.field.chain,
|
|
94
|
+
data: node.data.map(d => ({
|
|
95
|
+
index: d.index,
|
|
96
|
+
target: d.target,
|
|
97
|
+
value: d.target[node.field.name]
|
|
98
|
+
}))
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return next;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* [model]
|
|
105
|
+
* Read one property from
|
|
106
|
+
*/
|
|
107
|
+
parseModelProp(raw, node) {
|
|
108
|
+
const initAs = (!node.field.children) ? 'value' : 'obj';
|
|
109
|
+
const rawChild = '__raw' in (node.field.children || {});
|
|
110
|
+
const nextData = this.doParseModelProp(raw, node, initAs, rawChild);
|
|
111
|
+
if (!node.field.children)
|
|
112
|
+
return [];
|
|
113
|
+
const next = [];
|
|
114
|
+
for (const key in node.field.children) {
|
|
115
|
+
if (key === '__raw')
|
|
116
|
+
continue;
|
|
117
|
+
next.push({
|
|
118
|
+
field: node.field.children[key],
|
|
119
|
+
data: nextData
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return next;
|
|
123
|
+
}
|
|
124
|
+
doParseModelProp(raw, node, initAs, rawChild) {
|
|
125
|
+
const modelpath = node.field.meta.model.path;
|
|
126
|
+
const paths = modelpath.split('.');
|
|
127
|
+
const name = node.field.name;
|
|
128
|
+
let poll = node.data.map(d => ({
|
|
129
|
+
...d,
|
|
130
|
+
value: raw,
|
|
131
|
+
key: name
|
|
132
|
+
}));
|
|
133
|
+
for (const path of paths) {
|
|
134
|
+
// *
|
|
135
|
+
if (path === '*') {
|
|
136
|
+
// Expand each value of the poll (assumed to be a dict or list)
|
|
137
|
+
poll = poll.map(item => {
|
|
138
|
+
if (typeof item.value !== 'object') {
|
|
139
|
+
throw new Error(`Failed to parse ${paths}, intermediate value ${item.value} is not a list or object`);
|
|
80
140
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
if (prop.scope !== 'group') {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
parsedObj[k] = await doParse(prop.children || {}, index);
|
|
97
|
-
}
|
|
98
|
-
return parsedObj;
|
|
99
|
-
};
|
|
100
|
-
const parseModelProp = async (obj, prop, index, key) => {
|
|
101
|
-
const value = prop.value.model;
|
|
102
|
-
const rawValue = tree_1.Tree.get(obj, key || value.key, index);
|
|
103
|
-
if (prop.children) {
|
|
104
|
-
if (prop.array) {
|
|
105
|
-
if (!Array.isArray(rawValue)) {
|
|
106
|
-
return undefined;
|
|
141
|
+
if (Array.isArray(item.value)) {
|
|
142
|
+
item.target[item.key] = initAs === 'value'
|
|
143
|
+
? [...item.value]
|
|
144
|
+
: item.value.map(() => ({}));
|
|
145
|
+
return item.value.map((v, i) => ({
|
|
146
|
+
index: [...item.index, i],
|
|
147
|
+
value: v,
|
|
148
|
+
target: item.target[item.key],
|
|
149
|
+
key: i
|
|
150
|
+
}));
|
|
107
151
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
152
|
+
else {
|
|
153
|
+
item.target[item.key] = initAs === 'value'
|
|
154
|
+
? { ...item.value }
|
|
155
|
+
: Object.fromEntries(Object.entries(item.value).map(([k]) => [k, {}]));
|
|
156
|
+
return Object.entries(item.value).map(([k, v]) => ({
|
|
157
|
+
index: [...item.index, k],
|
|
158
|
+
value: v,
|
|
159
|
+
target: item.target[item.key],
|
|
160
|
+
key: k
|
|
161
|
+
}));
|
|
112
162
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
163
|
+
}).flat(1);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// $1, $2.. or string|number
|
|
167
|
+
else {
|
|
168
|
+
// Walk each node
|
|
169
|
+
const next = [];
|
|
170
|
+
for (const item of poll) {
|
|
171
|
+
// $0, $1.. -> string
|
|
172
|
+
const idx = path.match(/^\$(\d+)/)?.[1];
|
|
173
|
+
let _path = path;
|
|
174
|
+
if (idx !== undefined) {
|
|
175
|
+
// Replace by index key
|
|
176
|
+
_path = item.index[parseInt(idx)];
|
|
118
177
|
}
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
178
|
+
const n = typeof item.value === 'object'
|
|
179
|
+
? item.value[_path]
|
|
180
|
+
: undefined;
|
|
181
|
+
item.target[item.key] = initAs === 'value'
|
|
182
|
+
? n
|
|
183
|
+
: {};
|
|
184
|
+
if (n !== undefined) {
|
|
185
|
+
next.push({
|
|
186
|
+
index: item.index,
|
|
187
|
+
value: n,
|
|
188
|
+
target: item.target,
|
|
189
|
+
key: item.key
|
|
190
|
+
});
|
|
122
191
|
}
|
|
123
|
-
return parsedDict;
|
|
124
192
|
}
|
|
125
|
-
|
|
126
|
-
|
|
193
|
+
poll = next;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// For each leaf, if it's an object (not an array),
|
|
197
|
+
// pre-fill with it's value.
|
|
198
|
+
// This means that ...$.raw() only works on modelpaths that
|
|
199
|
+
// result in an object. Otherwise, it's ignored.
|
|
200
|
+
if (rawChild) {
|
|
201
|
+
for (const data of poll) {
|
|
202
|
+
if (typeof data.value === 'object' && !Array.isArray(data.value)) {
|
|
203
|
+
data.target[data.key] = data.value;
|
|
127
204
|
}
|
|
128
205
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
206
|
+
}
|
|
207
|
+
return poll.map(p => ({
|
|
208
|
+
index: p.index,
|
|
209
|
+
value: p.value,
|
|
210
|
+
target: p.target[p.key]
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* [computed]
|
|
215
|
+
*/
|
|
216
|
+
async parseComputedProp(trx, raw, node) {
|
|
217
|
+
const meta = node.field.meta.computed;
|
|
218
|
+
for (const entry of node.data) {
|
|
219
|
+
entry.target[node.field.name] = await promise_1.default.solve(meta.fn({ trx, raw, bucket: this.bucket.schema }));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* [graph]
|
|
224
|
+
*/
|
|
225
|
+
async parseGraphProp(trx, raw, node) {
|
|
226
|
+
const meta = node.field.meta.graph;
|
|
227
|
+
for (const entry of node.data) {
|
|
228
|
+
let link;
|
|
229
|
+
if (!meta.view) {
|
|
230
|
+
link = this.bucket.graph.readLink(trx, raw, meta.link, { silent: true });
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
link = this.bucket.graph.viewLink(trx, raw, meta.link, meta.view, { silent: true });
|
|
234
|
+
}
|
|
235
|
+
entry.target[node.field.name] = await promise_1.default.solve(link);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* [drive]
|
|
240
|
+
*/
|
|
241
|
+
async parseDriveProp(trx, raw, node) {
|
|
242
|
+
if (!this.bucket.drive) {
|
|
243
|
+
throw error_1.NesoiError.Bucket.Drive.NoAdapter({ bucket: this.bucket.schema.alias });
|
|
244
|
+
}
|
|
245
|
+
const meta = node.field.meta.drive;
|
|
246
|
+
for (const entry of node.data) {
|
|
247
|
+
const value = tree_1.Tree.get(raw, meta.path);
|
|
248
|
+
if (Array.isArray(value)) {
|
|
249
|
+
const public_urls = [];
|
|
250
|
+
for (const obj of value) {
|
|
251
|
+
public_urls.push(await this.bucket.drive.public(obj));
|
|
252
|
+
}
|
|
253
|
+
entry.target[node.field.name] = public_urls;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
entry.target[node.field.name] = await this.bucket.drive.public(value);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
137
259
|
}
|
|
138
260
|
}
|
|
139
261
|
exports.BucketView = BucketView;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { $BucketModelFieldType } from '../model/bucket_model.schema';
|
|
2
1
|
import { $Bucket } from '../bucket.schema';
|
|
3
2
|
import { AnyTrxNode } from "../../../../engine/transaction/trx_node";
|
|
4
3
|
export type $BucketViewFieldFn<TrxNode extends AnyTrxNode, B extends $Bucket> = (ctx: {
|
|
@@ -6,10 +5,9 @@ export type $BucketViewFieldFn<TrxNode extends AnyTrxNode, B extends $Bucket> =
|
|
|
6
5
|
raw: B['#data'];
|
|
7
6
|
bucket: $Bucket;
|
|
8
7
|
}) => any | Promise<any>;
|
|
9
|
-
export type $
|
|
8
|
+
export type $BucketViewFieldMeta = {
|
|
10
9
|
model?: {
|
|
11
|
-
|
|
12
|
-
enumOptions?: string | string[];
|
|
10
|
+
path: string;
|
|
13
11
|
};
|
|
14
12
|
graph?: {
|
|
15
13
|
link: string;
|
|
@@ -24,7 +22,6 @@ export type $BucketViewFieldValue = {
|
|
|
24
22
|
drive?: {
|
|
25
23
|
path: string;
|
|
26
24
|
};
|
|
27
|
-
group?: {};
|
|
28
25
|
};
|
|
29
26
|
/**
|
|
30
27
|
* @category Schemas
|
|
@@ -33,15 +30,13 @@ export type $BucketViewFieldValue = {
|
|
|
33
30
|
export declare class $BucketViewField {
|
|
34
31
|
name: string;
|
|
35
32
|
scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive';
|
|
36
|
-
type: $BucketModelFieldType | 'id';
|
|
37
33
|
alias: string;
|
|
38
|
-
|
|
39
|
-
required: boolean;
|
|
40
|
-
value: $BucketViewFieldValue;
|
|
34
|
+
meta: $BucketViewFieldMeta;
|
|
41
35
|
children?: $BucketViewFields | undefined;
|
|
36
|
+
chain?: $BucketViewField | undefined;
|
|
42
37
|
$t: string;
|
|
43
38
|
'#data': unknown;
|
|
44
|
-
constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive',
|
|
39
|
+
constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive', alias: string, meta: $BucketViewFieldMeta, children?: $BucketViewFields | undefined, chain?: $BucketViewField | undefined);
|
|
45
40
|
}
|
|
46
41
|
export type $BucketViewFields = {
|
|
47
42
|
[x: string]: $BucketViewField;
|
|
@@ -6,15 +6,13 @@ exports.$BucketView = exports.$BucketViewField = void 0;
|
|
|
6
6
|
* @subcategory Entity
|
|
7
7
|
* */
|
|
8
8
|
class $BucketViewField {
|
|
9
|
-
constructor(name, scope,
|
|
9
|
+
constructor(name, scope, alias, meta, children, chain) {
|
|
10
10
|
this.name = name;
|
|
11
11
|
this.scope = scope;
|
|
12
|
-
this.type = type;
|
|
13
12
|
this.alias = alias;
|
|
14
|
-
this.
|
|
15
|
-
this.required = required;
|
|
16
|
-
this.value = value;
|
|
13
|
+
this.meta = meta;
|
|
17
14
|
this.children = children;
|
|
15
|
+
this.chain = chain;
|
|
18
16
|
this.$t = 'bucket.view.field';
|
|
19
17
|
}
|
|
20
18
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $BucketViewField, $BucketViewFieldFn, $
|
|
1
|
+
import { $BucketViewField, $BucketViewFieldFn, $BucketViewFieldMeta, $BucketViewFields, $BucketViews } from './bucket_view.schema';
|
|
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';
|
|
@@ -8,8 +8,8 @@ import { $BucketViewFieldBuilderInfer } from '../bucket.infer';
|
|
|
8
8
|
import { TrxNode } from "../../../../engine/transaction/trx_node";
|
|
9
9
|
import { NesoiFile } from "../../../../engine/data/file";
|
|
10
10
|
type DriveFieldpath<Bucket extends $Bucket> = {
|
|
11
|
-
[K in keyof Bucket['#
|
|
12
|
-
}[keyof Bucket['#
|
|
11
|
+
[K in keyof Bucket['#modelpath']]: NonNullable<Bucket['#modelpath'][K]> extends NesoiFile ? K : never;
|
|
12
|
+
}[keyof Bucket['#modelpath']];
|
|
13
13
|
type GraphLinkBucket<Bucket extends $Bucket, L extends keyof Bucket['graph']['links']> = Bucket['graph']['links'][L]['#bucket'];
|
|
14
14
|
type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> = R extends Promise<infer X> ? X : R;
|
|
15
15
|
/**
|
|
@@ -19,10 +19,12 @@ type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> =
|
|
|
19
19
|
export declare class BucketViewFieldFactory<Space extends $Space, Module extends $Module, Bucket extends $Bucket> {
|
|
20
20
|
private _view;
|
|
21
21
|
protected scope: $BucketViewField['scope'];
|
|
22
|
-
protected
|
|
23
|
-
protected value: $BucketViewField['value'];
|
|
22
|
+
protected value: $BucketViewField['meta'];
|
|
24
23
|
constructor(_view: BucketViewBuilder<any, any, any>);
|
|
25
|
-
|
|
24
|
+
raw(): {
|
|
25
|
+
[K in keyof Bucket['#data']]: BucketViewFieldBuilder<Bucket['#data'][K], 'model'>;
|
|
26
|
+
};
|
|
27
|
+
model<K extends keyof Bucket['#modelpath'], SubModel extends BucketViewFieldBuilderTree>(path: K, submodel?: SubModel): BucketViewFieldBuilder<Bucket["#modelpath"][K], "model", never>;
|
|
26
28
|
computed<Fn extends $BucketViewFieldFn<TrxNode<Space, Module, Space['authnUsers']>, Bucket>>(fn: Fn): BucketViewFieldBuilder<ComputedData<Fn, ReturnType<Fn>>, "computed", never>;
|
|
27
29
|
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}`>;
|
|
28
30
|
drive<F extends DriveFieldpath<Bucket>>(path: F): BucketViewFieldBuilder<string, "drive", never>;
|
|
@@ -36,12 +38,14 @@ export declare class BucketViewFieldFactory<Space extends $Space, Module extends
|
|
|
36
38
|
* */
|
|
37
39
|
export declare class BucketViewFieldBuilder<Data, Scope extends $BucketViewField['scope'], GraphLink extends string = never> {
|
|
38
40
|
protected scope: $BucketViewField['scope'];
|
|
39
|
-
protected
|
|
40
|
-
protected
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
protected meta: $BucketViewFieldMeta;
|
|
42
|
+
protected submodel?: BucketViewFieldBuilderTree | undefined;
|
|
43
|
+
$b: "view.field";
|
|
44
|
+
protected _chain?: BucketViewFieldBuilder<any, any, any>;
|
|
45
|
+
constructor(scope: $BucketViewField['scope'], meta: $BucketViewFieldMeta, submodel?: BucketViewFieldBuilderTree | undefined);
|
|
46
|
+
chain<Fn extends $BucketViewFieldFn<any, any>>(fn: Fn): void;
|
|
47
|
+
static build(builder: BucketViewFieldBuilder<any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string, n_indexes: number): $BucketViewField;
|
|
48
|
+
static buildFields(fields: BucketViewFieldBuilderTree, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, n_indexes?: number): $BucketViewFields;
|
|
45
49
|
}
|
|
46
50
|
export type BucketViewFieldBuilderTree = {
|
|
47
51
|
[x: string]: BucketViewFieldBuilder<any, any, any> | BucketViewFieldBuilderTree;
|
|
@@ -4,7 +4,6 @@ exports.BucketViewFieldBuilder = exports.BucketViewFieldFactory = void 0;
|
|
|
4
4
|
const error_1 = require("../../../../engine/data/error");
|
|
5
5
|
const bucket_view_schema_1 = require("./bucket_view.schema");
|
|
6
6
|
const bucket_model_schema_1 = require("../model/bucket_model.schema");
|
|
7
|
-
const bucket_model_convert_1 = require("../model/bucket_model.convert");
|
|
8
7
|
/*
|
|
9
8
|
Factory
|
|
10
9
|
*/
|
|
@@ -16,12 +15,17 @@ class BucketViewFieldFactory {
|
|
|
16
15
|
constructor(_view) {
|
|
17
16
|
this._view = _view;
|
|
18
17
|
}
|
|
19
|
-
|
|
18
|
+
raw() {
|
|
19
|
+
return {
|
|
20
|
+
__raw: {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
model(path, submodel) {
|
|
20
24
|
return new BucketViewFieldBuilder('model', {
|
|
21
25
|
model: {
|
|
22
|
-
|
|
26
|
+
path: path
|
|
23
27
|
}
|
|
24
|
-
},
|
|
28
|
+
}, submodel);
|
|
25
29
|
}
|
|
26
30
|
computed(fn) {
|
|
27
31
|
return new BucketViewFieldBuilder('computed', {
|
|
@@ -59,7 +63,7 @@ class BucketViewFieldFactory {
|
|
|
59
63
|
};
|
|
60
64
|
}
|
|
61
65
|
static group(name, children) {
|
|
62
|
-
return new bucket_view_schema_1.$BucketViewField(name, 'group',
|
|
66
|
+
return new bucket_view_schema_1.$BucketViewField(name, 'group', name, {}, children);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
69
|
exports.BucketViewFieldFactory = BucketViewFieldFactory;
|
|
@@ -71,59 +75,67 @@ exports.BucketViewFieldFactory = BucketViewFieldFactory;
|
|
|
71
75
|
* @subcategory Entity
|
|
72
76
|
* */
|
|
73
77
|
class BucketViewFieldBuilder {
|
|
74
|
-
constructor(scope,
|
|
78
|
+
constructor(scope, meta, submodel) {
|
|
75
79
|
this.scope = scope;
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
this
|
|
79
|
-
|
|
80
|
+
this.meta = meta;
|
|
81
|
+
this.submodel = submodel;
|
|
82
|
+
this.$b = 'view.field';
|
|
83
|
+
}
|
|
84
|
+
chain(fn) {
|
|
85
|
+
this._chain = new BucketViewFieldBuilder('computed', {
|
|
86
|
+
computed: {
|
|
87
|
+
fn: fn
|
|
88
|
+
}
|
|
89
|
+
});
|
|
80
90
|
}
|
|
81
91
|
// Build
|
|
82
|
-
static build(builder, model, graph, views, name) {
|
|
83
|
-
let type = 'unknown';
|
|
84
|
-
let array = 'unknown';
|
|
85
|
-
let required = true;
|
|
92
|
+
static build(builder, model, graph, views, name, n_indexes) {
|
|
86
93
|
let children = undefined;
|
|
94
|
+
const chain = builder._chain;
|
|
87
95
|
if (builder.scope === 'model') {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
const path = builder.meta.model.path;
|
|
97
|
+
const spread_n = path.match(/\.\*(\.|$)/g)?.length || 0;
|
|
98
|
+
if (spread_n === 0 && builder.submodel) {
|
|
99
|
+
throw new Error('Submodels can only be specified for modelpaths with at least one \'*\'');
|
|
91
100
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
|
|
101
|
+
// Check if indexes are valid
|
|
102
|
+
// $0, $1, $2.. should be up to n_indexes
|
|
103
|
+
const path_indexes = path.match(/\.\$\d+(\.|$)/g)?.map(d => parseInt(d.slice(2))) || [];
|
|
104
|
+
if (Math.max(...path_indexes) >= n_indexes) {
|
|
105
|
+
if (n_indexes === 0) {
|
|
106
|
+
throw new Error('Index $ can only be specified inside a submodel');
|
|
107
|
+
}
|
|
108
|
+
throw new Error(`Maximum index allowed: $${n_indexes - 1}`);
|
|
97
109
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
// Retrieve one or more BucketModelFields referenced by a modelpath.
|
|
111
|
+
// (It's only more than one when using unions)
|
|
112
|
+
// The field itself is not used, but serves to validate that the modelpath exists.
|
|
113
|
+
const modelFields = bucket_model_schema_1.$BucketModel.getField(model, path);
|
|
114
|
+
if (!modelFields.length) {
|
|
115
|
+
throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.meta.model.path);
|
|
102
116
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
// If there's a submodel, add it as children
|
|
118
|
+
if (builder.submodel) {
|
|
119
|
+
const overrides = this.buildFields(builder.submodel, model, graph, views, n_indexes + spread_n);
|
|
120
|
+
children = Object.assign({}, children, overrides);
|
|
106
121
|
}
|
|
107
122
|
}
|
|
108
123
|
else if (builder.scope === 'graph') {
|
|
109
|
-
const graphLink = builder.
|
|
124
|
+
const graphLink = builder.meta.graph.link ? graph.links[builder.meta.graph.link] : undefined;
|
|
110
125
|
if (!graphLink) {
|
|
111
|
-
throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.
|
|
126
|
+
throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.meta.graph.link || '');
|
|
112
127
|
}
|
|
113
|
-
array = graphLink.many;
|
|
114
128
|
}
|
|
115
129
|
else if (builder.scope === 'view') {
|
|
116
|
-
const view = builder.
|
|
130
|
+
const view = builder.meta.view?.view ? views[builder.meta.view?.view] : undefined;
|
|
117
131
|
if (!view) {
|
|
118
|
-
throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.
|
|
132
|
+
throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.meta.view?.view || '');
|
|
119
133
|
}
|
|
120
|
-
type = 'obj';
|
|
121
|
-
array = false;
|
|
122
134
|
children = view.fields;
|
|
123
135
|
}
|
|
124
|
-
return new bucket_view_schema_1.$BucketViewField(name, builder.scope,
|
|
136
|
+
return new bucket_view_schema_1.$BucketViewField(name, builder.scope, name, builder.meta, children, chain);
|
|
125
137
|
}
|
|
126
|
-
static buildFields(fields, model, graph, views) {
|
|
138
|
+
static buildFields(fields, model, graph, views, n_indexes = 0) {
|
|
127
139
|
const schema = {};
|
|
128
140
|
// Extended fields inherit from other views
|
|
129
141
|
if ('__ext' in fields) {
|
|
@@ -134,15 +146,18 @@ class BucketViewFieldBuilder {
|
|
|
134
146
|
if (f === '__ext') {
|
|
135
147
|
continue;
|
|
136
148
|
}
|
|
149
|
+
if (f === '__raw') {
|
|
150
|
+
schema['__raw'] = {};
|
|
151
|
+
}
|
|
137
152
|
const field = fields[f];
|
|
138
153
|
// Normal fields are built here
|
|
139
154
|
if (field instanceof BucketViewFieldBuilder) {
|
|
140
|
-
schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f);
|
|
155
|
+
schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f, n_indexes);
|
|
141
156
|
}
|
|
142
157
|
// Builders are allowed to implicitly declare nested fields.
|
|
143
158
|
// The code below transforms these groups into fields of the scope 'group'.
|
|
144
159
|
else {
|
|
145
|
-
const children = BucketViewFieldBuilder.buildFields(field, model, graph, views);
|
|
160
|
+
const children = BucketViewFieldBuilder.buildFields(field, model, graph, views, n_indexes);
|
|
146
161
|
schema[f] = BucketViewFieldFactory.group(f, children);
|
|
147
162
|
}
|
|
148
163
|
}
|