@milaboratories/pl-middle-layer 1.10.12
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/dist/block_registry/index.d.ts +4 -0
- package/dist/block_registry/index.d.ts.map +1 -0
- package/dist/block_registry/registry.d.ts +37 -0
- package/dist/block_registry/registry.d.ts.map +1 -0
- package/dist/block_registry/registry_spec.d.ts +12 -0
- package/dist/block_registry/registry_spec.d.ts.map +1 -0
- package/dist/block_registry/watcher.d.ts +15 -0
- package/dist/block_registry/watcher.d.ts.map +1 -0
- package/dist/block_registry/well_known_registries.d.ts +4 -0
- package/dist/block_registry/well_known_registries.d.ts.map +1 -0
- package/dist/cfg_render/executor.d.ts +8 -0
- package/dist/cfg_render/executor.d.ts.map +1 -0
- package/dist/cfg_render/operation.d.ts +29 -0
- package/dist/cfg_render/operation.d.ts.map +1 -0
- package/dist/cfg_render/renderer.d.ts +6 -0
- package/dist/cfg_render/renderer.d.ts.map +1 -0
- package/dist/cfg_render/traverse.d.ts +3 -0
- package/dist/cfg_render/traverse.d.ts.map +1 -0
- package/dist/cfg_render/util.d.ts +5 -0
- package/dist/cfg_render/util.d.ts.map +1 -0
- package/dist/dev/index.d.ts +21 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/util.d.ts +3 -0
- package/dist/dev/util.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3587 -0
- package/dist/index.mjs.map +1 -0
- package/dist/js_render/context.d.ts +68 -0
- package/dist/js_render/context.d.ts.map +1 -0
- package/dist/js_render/index.d.ts +6 -0
- package/dist/js_render/index.d.ts.map +1 -0
- package/dist/middle_layer/active_cfg.d.ts +6 -0
- package/dist/middle_layer/active_cfg.d.ts.map +1 -0
- package/dist/middle_layer/block.d.ts +9 -0
- package/dist/middle_layer/block.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx.d.ts +20 -0
- package/dist/middle_layer/block_ctx.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts +16 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -0
- package/dist/middle_layer/driver_kit.d.ts +31 -0
- package/dist/middle_layer/driver_kit.d.ts.map +1 -0
- package/dist/middle_layer/frontend_path.d.ts +6 -0
- package/dist/middle_layer/frontend_path.d.ts.map +1 -0
- package/dist/middle_layer/index.d.ts +5 -0
- package/dist/middle_layer/index.d.ts.map +1 -0
- package/dist/middle_layer/middle_layer.d.ts +78 -0
- package/dist/middle_layer/middle_layer.d.ts.map +1 -0
- package/dist/middle_layer/navigation_states.d.ts +10 -0
- package/dist/middle_layer/navigation_states.d.ts.map +1 -0
- package/dist/middle_layer/ops.d.ts +64 -0
- package/dist/middle_layer/ops.d.ts.map +1 -0
- package/dist/middle_layer/project.d.ts +110 -0
- package/dist/middle_layer/project.d.ts.map +1 -0
- package/dist/middle_layer/project_list.d.ts +11 -0
- package/dist/middle_layer/project_list.d.ts.map +1 -0
- package/dist/middle_layer/project_overview.d.ts +8 -0
- package/dist/middle_layer/project_overview.d.ts.map +1 -0
- package/dist/middle_layer/render.d.ts +6 -0
- package/dist/middle_layer/render.d.ts.map +1 -0
- package/dist/middle_layer/types.d.ts +11 -0
- package/dist/middle_layer/types.d.ts.map +1 -0
- package/dist/middle_layer/util.d.ts +3 -0
- package/dist/middle_layer/util.d.ts.map +1 -0
- package/dist/model/args.d.ts +12 -0
- package/dist/model/args.d.ts.map +1 -0
- package/dist/model/block_pack.d.ts +8 -0
- package/dist/model/block_pack.d.ts.map +1 -0
- package/dist/model/block_pack_spec.d.ts +40 -0
- package/dist/model/block_pack_spec.d.ts.map +1 -0
- package/dist/model/frontend.d.ts +10 -0
- package/dist/model/frontend.d.ts.map +1 -0
- package/dist/model/index.d.ts +3 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/project_model.d.ts +67 -0
- package/dist/model/project_model.d.ts.map +1 -0
- package/dist/model/project_model_util.d.ts +29 -0
- package/dist/model/project_model_util.d.ts.map +1 -0
- package/dist/model/template_spec.d.ts +16 -0
- package/dist/model/template_spec.d.ts.map +1 -0
- package/dist/mutator/block-pack/block_pack.d.ts +17 -0
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
- package/dist/mutator/block-pack/frontend.d.ts +4 -0
- package/dist/mutator/block-pack/frontend.d.ts.map +1 -0
- package/dist/mutator/context_export.d.ts +9 -0
- package/dist/mutator/context_export.d.ts.map +1 -0
- package/dist/mutator/project.d.ts +121 -0
- package/dist/mutator/project.d.ts.map +1 -0
- package/dist/mutator/template/render_block.d.ts +32 -0
- package/dist/mutator/template/render_block.d.ts.map +1 -0
- package/dist/mutator/template/render_template.d.ts +12 -0
- package/dist/mutator/template/render_template.d.ts.map +1 -0
- package/dist/mutator/template/template_loading.d.ts +13 -0
- package/dist/mutator/template/template_loading.d.ts.map +1 -0
- package/dist/pool/data.d.ts +24 -0
- package/dist/pool/data.d.ts.map +1 -0
- package/dist/pool/driver.d.ts +22 -0
- package/dist/pool/driver.d.ts.map +1 -0
- package/dist/pool/index.d.ts +3 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/p_object_collection.d.ts +29 -0
- package/dist/pool/p_object_collection.d.ts.map +1 -0
- package/dist/pool/ref_count_pool.d.ts +25 -0
- package/dist/pool/ref_count_pool.d.ts.map +1 -0
- package/dist/pool/result_pool.d.ts +25 -0
- package/dist/pool/result_pool.d.ts.map +1 -0
- package/dist/test/block_packs.d.ts +6 -0
- package/dist/test/block_packs.d.ts.map +1 -0
- package/dist/test/explicit_templates.d.ts +3 -0
- package/dist/test/explicit_templates.d.ts.map +1 -0
- package/dist/test/known_templates.d.ts +6 -0
- package/dist/test/known_templates.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/block_registry/index.ts +3 -0
- package/src/block_registry/registry.test.ts +35 -0
- package/src/block_registry/registry.ts +180 -0
- package/src/block_registry/registry_spec.ts +13 -0
- package/src/block_registry/watcher.ts +72 -0
- package/src/block_registry/well_known_registries.ts +13 -0
- package/src/cfg_render/executor.test.ts +120 -0
- package/src/cfg_render/executor.ts +253 -0
- package/src/cfg_render/operation.ts +38 -0
- package/src/cfg_render/renderer.ts +540 -0
- package/src/cfg_render/traverse.ts +58 -0
- package/src/cfg_render/util.ts +29 -0
- package/src/dev/index.ts +89 -0
- package/src/dev/util.ts +13 -0
- package/src/index.ts +21 -0
- package/src/js_render/context.ts +768 -0
- package/src/js_render/index.ts +41 -0
- package/src/middle_layer/active_cfg.ts +56 -0
- package/src/middle_layer/block.ts +70 -0
- package/src/middle_layer/block_ctx.ts +90 -0
- package/src/middle_layer/block_ctx_unsafe.ts +29 -0
- package/src/middle_layer/driver_kit.ts +107 -0
- package/src/middle_layer/frontend_path.ts +83 -0
- package/src/middle_layer/index.ts +4 -0
- package/src/middle_layer/middle_layer.test.ts +720 -0
- package/src/middle_layer/middle_layer.ts +235 -0
- package/src/middle_layer/navigation_states.ts +48 -0
- package/src/middle_layer/ops.ts +147 -0
- package/src/middle_layer/project.ts +380 -0
- package/src/middle_layer/project_list.ts +59 -0
- package/src/middle_layer/project_overview.ts +220 -0
- package/src/middle_layer/render.test.ts +129 -0
- package/src/middle_layer/render.ts +19 -0
- package/src/middle_layer/types.ts +16 -0
- package/src/middle_layer/util.ts +22 -0
- package/src/model/args.ts +62 -0
- package/src/model/block_pack.ts +8 -0
- package/src/model/block_pack_spec.ts +52 -0
- package/src/model/frontend.ts +10 -0
- package/src/model/index.ts +2 -0
- package/src/model/project_model.test.ts +26 -0
- package/src/model/project_model.ts +142 -0
- package/src/model/project_model_util.test.ts +88 -0
- package/src/model/project_model_util.ts +169 -0
- package/src/model/template_spec.ts +18 -0
- package/src/mutator/block-pack/block_pack.test.ts +53 -0
- package/src/mutator/block-pack/block_pack.ts +187 -0
- package/src/mutator/block-pack/frontend.ts +29 -0
- package/src/mutator/context_export.ts +25 -0
- package/src/mutator/project.test.ts +272 -0
- package/src/mutator/project.ts +1112 -0
- package/src/mutator/template/render_block.ts +91 -0
- package/src/mutator/template/render_template.ts +40 -0
- package/src/mutator/template/template_loading.ts +77 -0
- package/src/mutator/template/template_render.test.ts +272 -0
- package/src/pool/data.ts +239 -0
- package/src/pool/driver.ts +325 -0
- package/src/pool/index.ts +2 -0
- package/src/pool/p_object_collection.ts +122 -0
- package/src/pool/ref_count_pool.ts +76 -0
- package/src/pool/result_pool.ts +284 -0
- package/src/test/block_packs.ts +23 -0
- package/src/test/explicit_templates.ts +8 -0
- package/src/test/known_templates.ts +24 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Cfg,
|
|
3
|
+
CfgMapArrayValues,
|
|
4
|
+
CfgMapRecordValues,
|
|
5
|
+
CfgMapResourceFields
|
|
6
|
+
} from '@platforma-sdk/model';
|
|
7
|
+
import { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';
|
|
8
|
+
import { PlTreeEntry } from '@milaboratories/pl-tree';
|
|
9
|
+
import { mapRecord } from './util';
|
|
10
|
+
import { computableFromCfgUnsafe } from './executor';
|
|
11
|
+
import { assertNever } from '@milaboratories/ts-helpers';
|
|
12
|
+
import { Computable } from '@milaboratories/computable';
|
|
13
|
+
|
|
14
|
+
function res(result: unknown): OperationAction {
|
|
15
|
+
return {
|
|
16
|
+
type: 'ReturnResult',
|
|
17
|
+
result: result
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function resOp(result: unknown): Operation {
|
|
22
|
+
return () => res(result);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//
|
|
26
|
+
// Subroutines
|
|
27
|
+
//
|
|
28
|
+
|
|
29
|
+
const SRMakeObject: Subroutine = (args) => {
|
|
30
|
+
const result: Record<string | symbol, any> = {};
|
|
31
|
+
for (const [k, v] of Object.entries(args)) result[k] = v;
|
|
32
|
+
return resOp(result);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const SRFlatten: Subroutine = (args) => {
|
|
36
|
+
const source = args.source as unknown[] | undefined;
|
|
37
|
+
if (source === undefined) return resOp(undefined);
|
|
38
|
+
const result: unknown[] = [];
|
|
39
|
+
for (const nested of source) {
|
|
40
|
+
if (nested instanceof Array) result.push(...nested);
|
|
41
|
+
else result.push(nested);
|
|
42
|
+
}
|
|
43
|
+
return resOp(result);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const SRGetResourceField: Subroutine = (args) => {
|
|
47
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
48
|
+
const field = args.field as string | undefined;
|
|
49
|
+
if (source === undefined || field === undefined) return resOp(undefined);
|
|
50
|
+
return ({ cCtx }) => {
|
|
51
|
+
return res(cCtx.accessor(source).node().traverse(field)?.persist());
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function mapArrayToRecord<T, R>(elements: T[], cb: (e: T) => R): Record<string, R> {
|
|
56
|
+
const result: Record<string, R> = {};
|
|
57
|
+
const length = elements.length;
|
|
58
|
+
for (let i = 0; i < length; i++) result[String(i)] = cb(elements[i]);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function SRMapArrayValues1(
|
|
63
|
+
ctx: Record<string, unknown>,
|
|
64
|
+
ops: Pick<CfgMapArrayValues, 'itVar' | 'mapping'>
|
|
65
|
+
): Subroutine {
|
|
66
|
+
return (args) => {
|
|
67
|
+
const source = args.source as unknown[] | undefined;
|
|
68
|
+
if (source === undefined) return resOp(undefined);
|
|
69
|
+
return () => ({
|
|
70
|
+
type: 'ScheduleSubroutine',
|
|
71
|
+
subroutine: SRCollectArrayFromArgs(source.length),
|
|
72
|
+
args: mapArrayToRecord(source, (e) => renderCfg({ ...ctx, [ops.itVar]: e }, ops.mapping))
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function SRCollectArrayFromArgs(length: number): Subroutine {
|
|
78
|
+
return (args) => {
|
|
79
|
+
const result: unknown[] = [];
|
|
80
|
+
for (let i = 0; i < length; i++) result.push(args[String(i)]);
|
|
81
|
+
return resOp(result);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function SRMapRecordValues1(
|
|
86
|
+
ctx: Record<string, unknown>,
|
|
87
|
+
ops: Pick<CfgMapRecordValues, 'itVar' | 'mapping'>
|
|
88
|
+
): Subroutine {
|
|
89
|
+
return (args) => {
|
|
90
|
+
const source = args.source as Record<string, unknown> | undefined;
|
|
91
|
+
if (source === undefined) return resOp(undefined);
|
|
92
|
+
const nextArgs: ArgumentRequests = {};
|
|
93
|
+
for (const [k, v] of Object.entries(source)) {
|
|
94
|
+
const newCtx = { ...ctx, [ops.itVar]: v };
|
|
95
|
+
nextArgs[k] = renderCfg(newCtx, ops.mapping);
|
|
96
|
+
}
|
|
97
|
+
return () => ({
|
|
98
|
+
type: 'ScheduleSubroutine',
|
|
99
|
+
subroutine: SRMapRecordValues2,
|
|
100
|
+
args: nextArgs
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const SRMapRecordValues2: Subroutine = (args) => {
|
|
106
|
+
return resOp(args);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const SRIsEmpty: Subroutine = (args) => {
|
|
110
|
+
const arg = args.arg as unknown[] | string | undefined;
|
|
111
|
+
if (arg === undefined) return resOp(undefined);
|
|
112
|
+
return resOp(arg.length === 0);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const SRNot: Subroutine = (args) => {
|
|
116
|
+
const operand = args.operand as boolean | undefined;
|
|
117
|
+
if (operand === undefined) return resOp(undefined);
|
|
118
|
+
return resOp(!operand);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const SRAnd: Subroutine = (args) => {
|
|
122
|
+
const operand1 = args.operand1 as boolean | undefined;
|
|
123
|
+
const operand2 = args.operand2 as boolean | undefined;
|
|
124
|
+
if (operand1 === undefined || operand2 === undefined) return resOp(undefined);
|
|
125
|
+
return resOp(operand1 && operand2);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const SROr: Subroutine = (args) => {
|
|
129
|
+
const operand1 = args.operand1 as boolean | undefined;
|
|
130
|
+
const operand2 = args.operand2 as boolean | undefined;
|
|
131
|
+
if (operand1 === undefined || operand2 === undefined) return resOp(undefined);
|
|
132
|
+
return resOp(operand1 || operand2);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const SRResourceValueAsJson: Subroutine = (args) => {
|
|
136
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
137
|
+
if (source === undefined) return resOp(undefined);
|
|
138
|
+
return ({ cCtx }) => res(cCtx.accessor(source).node()?.getDataAsJson());
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const SRGetJsonField: Subroutine = (args) => {
|
|
142
|
+
const source = args.source as Record<string, unknown> | undefined;
|
|
143
|
+
const field = args.field as string | undefined;
|
|
144
|
+
if (source === undefined || field === undefined) return resOp(undefined);
|
|
145
|
+
return resOp(source[field]);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
function SRMapResourceFields1(
|
|
149
|
+
ctx: Record<string, unknown>,
|
|
150
|
+
ops: Pick<CfgMapResourceFields, 'itVar' | 'mapping'>
|
|
151
|
+
): Subroutine {
|
|
152
|
+
return (args) => {
|
|
153
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
154
|
+
if (source === undefined) return resOp(undefined);
|
|
155
|
+
|
|
156
|
+
return ({ cCtx }) => {
|
|
157
|
+
const node = cCtx.accessor(source).node();
|
|
158
|
+
|
|
159
|
+
const nextArgs: ArgumentRequests = {};
|
|
160
|
+
for (const fieldName of node.listInputFields()) {
|
|
161
|
+
const res = node.traverse(fieldName);
|
|
162
|
+
if (res === undefined) nextArgs[fieldName] = resOp(undefined);
|
|
163
|
+
else {
|
|
164
|
+
const newCtx = { ...ctx, [ops.itVar]: res.persist() };
|
|
165
|
+
nextArgs[fieldName] = renderCfg(newCtx, ops.mapping);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
type: 'ScheduleSubroutine',
|
|
171
|
+
subroutine: SRMapResourceFields2,
|
|
172
|
+
args: nextArgs
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const SRMapResourceFields2: Subroutine = (args) => {
|
|
179
|
+
return resOp(args);
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const SRGetBlobContent: Subroutine = (args) => {
|
|
183
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
184
|
+
if (source === undefined) return resOp(undefined);
|
|
185
|
+
|
|
186
|
+
return ({ drivers }) => {
|
|
187
|
+
return {
|
|
188
|
+
type: 'ScheduleComputable',
|
|
189
|
+
computable: Computable.make(
|
|
190
|
+
(ctx) => {
|
|
191
|
+
return drivers.blobDriver.getDownloadedBlob(ctx.accessor(source).node().resourceInfo);
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
postprocessValue: async (value) => {
|
|
195
|
+
if (value === undefined) return undefined;
|
|
196
|
+
return await drivers.blobDriver.getContent(value.handle);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const SRGetBlobContentAsString: Subroutine = (args) => {
|
|
205
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
206
|
+
if (source === undefined) return resOp(undefined);
|
|
207
|
+
|
|
208
|
+
return ({ cCtx, drivers }) => {
|
|
209
|
+
// getting target resource id and type
|
|
210
|
+
const resourceInfo = cCtx.accessor(source).node().resourceInfo;
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
type: 'ScheduleComputable',
|
|
214
|
+
computable: Computable.make(() => drivers.blobDriver.getDownloadedBlob(resourceInfo), {
|
|
215
|
+
postprocessValue: async (value) => {
|
|
216
|
+
if (value === undefined) return undefined;
|
|
217
|
+
const content = await drivers.blobDriver.getContent(value.handle);
|
|
218
|
+
return content.toString();
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const SRGetBlobContentAsJson: Subroutine = (args) => {
|
|
226
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
227
|
+
if (source === undefined) return resOp(undefined);
|
|
228
|
+
|
|
229
|
+
return ({ drivers }) => {
|
|
230
|
+
return {
|
|
231
|
+
type: 'ScheduleComputable',
|
|
232
|
+
computable: Computable.make(
|
|
233
|
+
(c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo),
|
|
234
|
+
{
|
|
235
|
+
postprocessValue: async (value) => {
|
|
236
|
+
if (value == undefined) return undefined;
|
|
237
|
+
const content = await drivers.blobDriver.getContent(value.handle);
|
|
238
|
+
if (content == undefined) return undefined;
|
|
239
|
+
return JSON.parse(Buffer.from(content).toString());
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const SRGetDownloadedBlobContent: Subroutine = (args) => {
|
|
248
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
249
|
+
if (source === undefined) return resOp(undefined);
|
|
250
|
+
|
|
251
|
+
return ({ drivers }) => {
|
|
252
|
+
return {
|
|
253
|
+
type: 'ScheduleComputable',
|
|
254
|
+
computable: drivers.blobDriver.getDownloadedBlob(source)
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const SRGetOnDemandBlobContent: Subroutine = (args) => {
|
|
260
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
261
|
+
if (source === undefined) return resOp(undefined);
|
|
262
|
+
|
|
263
|
+
return ({ drivers }) => {
|
|
264
|
+
return {
|
|
265
|
+
type: 'ScheduleComputable',
|
|
266
|
+
computable: drivers.blobDriver.getOnDemandBlob(source)
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const SRGetImportProgress: Subroutine = (args) => {
|
|
272
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
273
|
+
if (source === undefined) return resOp(undefined);
|
|
274
|
+
|
|
275
|
+
return ({ drivers }) => {
|
|
276
|
+
return {
|
|
277
|
+
type: 'ScheduleComputable',
|
|
278
|
+
computable: drivers.uploadDriver.getProgressId(source)
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const SRGetLastLogs: (lines: number) => Subroutine = (lines) => (args) => {
|
|
284
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
285
|
+
if (source === undefined) return resOp(undefined);
|
|
286
|
+
|
|
287
|
+
return ({ drivers }) => {
|
|
288
|
+
return {
|
|
289
|
+
type: 'ScheduleComputable',
|
|
290
|
+
computable: drivers.logDriver.getLastLogs(source, lines)
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
const SRGetProgressLog: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {
|
|
296
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
297
|
+
if (source === undefined) return resOp(undefined);
|
|
298
|
+
|
|
299
|
+
return ({ drivers }) => {
|
|
300
|
+
return {
|
|
301
|
+
type: 'ScheduleComputable',
|
|
302
|
+
computable: drivers.logDriver.getProgressLog(source, patternToSearch)
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
const SRGetLogHandle: Subroutine = (args) => {
|
|
308
|
+
const source = args.source as PlTreeEntry | undefined;
|
|
309
|
+
if (source === undefined) return resOp(undefined);
|
|
310
|
+
|
|
311
|
+
return ({ drivers }) => {
|
|
312
|
+
return {
|
|
313
|
+
type: 'ScheduleComputable',
|
|
314
|
+
computable: drivers.logDriver.getLogHandle(source)
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
/** Renders configuration into executor's Operation */
|
|
320
|
+
export function renderCfg(ctx: Record<string, unknown>, cfg: Cfg): Operation {
|
|
321
|
+
switch (cfg.type) {
|
|
322
|
+
case 'GetFromCtx':
|
|
323
|
+
const ctxValue = ctx[cfg.variable];
|
|
324
|
+
if (typeof ctxValue === 'function') return (e) => res(ctxValue(e.cCtx));
|
|
325
|
+
else {
|
|
326
|
+
if (ctxValue === undefined) console.log('asdasd');
|
|
327
|
+
return resOp(ctxValue);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
case 'Isolate':
|
|
331
|
+
return ({ drivers }) => ({
|
|
332
|
+
type: 'ScheduleComputable',
|
|
333
|
+
computable: computableFromCfgUnsafe(drivers, ctx, cfg.cfg)
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
case 'Immediate':
|
|
337
|
+
return resOp(cfg.value);
|
|
338
|
+
|
|
339
|
+
case 'GetJsonField':
|
|
340
|
+
return () => ({
|
|
341
|
+
type: 'ScheduleSubroutine',
|
|
342
|
+
subroutine: SRGetJsonField,
|
|
343
|
+
args: {
|
|
344
|
+
source: renderCfg(ctx, cfg.source),
|
|
345
|
+
field: renderCfg(ctx, cfg.field)
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
case 'MapArrayValues':
|
|
350
|
+
return () => ({
|
|
351
|
+
type: 'ScheduleSubroutine',
|
|
352
|
+
subroutine: SRMapArrayValues1(ctx, cfg),
|
|
353
|
+
args: {
|
|
354
|
+
source: renderCfg(ctx, cfg.source)
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
case 'MapRecordValues':
|
|
359
|
+
return () => ({
|
|
360
|
+
type: 'ScheduleSubroutine',
|
|
361
|
+
subroutine: SRMapRecordValues1(ctx, cfg),
|
|
362
|
+
args: {
|
|
363
|
+
source: renderCfg(ctx, cfg.source)
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
case 'MakeObject':
|
|
368
|
+
return () => ({
|
|
369
|
+
type: 'ScheduleSubroutine',
|
|
370
|
+
subroutine: SRMakeObject,
|
|
371
|
+
args: mapRecord(cfg.template, (c) => renderCfg(ctx, c))
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
case 'MakeArray':
|
|
375
|
+
return () => ({
|
|
376
|
+
type: 'ScheduleSubroutine',
|
|
377
|
+
subroutine: SRCollectArrayFromArgs(cfg.template.length),
|
|
378
|
+
args: mapArrayToRecord(cfg.template, (e) => renderCfg(ctx, e))
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
case 'Flatten':
|
|
382
|
+
return () => ({
|
|
383
|
+
type: 'ScheduleSubroutine',
|
|
384
|
+
subroutine: SRFlatten,
|
|
385
|
+
args: {
|
|
386
|
+
source: renderCfg(ctx, cfg.source)
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
case 'IsEmpty':
|
|
391
|
+
return () => ({
|
|
392
|
+
type: 'ScheduleSubroutine',
|
|
393
|
+
subroutine: SRIsEmpty,
|
|
394
|
+
args: {
|
|
395
|
+
arg: renderCfg(ctx, cfg.arg)
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
case 'Not':
|
|
400
|
+
return () => ({
|
|
401
|
+
type: 'ScheduleSubroutine',
|
|
402
|
+
subroutine: SRNot,
|
|
403
|
+
args: {
|
|
404
|
+
operand: renderCfg(ctx, cfg.operand)
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
case 'And':
|
|
409
|
+
return () => ({
|
|
410
|
+
type: 'ScheduleSubroutine',
|
|
411
|
+
subroutine: SRAnd,
|
|
412
|
+
args: {
|
|
413
|
+
operand1: renderCfg(ctx, cfg.operand1),
|
|
414
|
+
operand2: renderCfg(ctx, cfg.operand2)
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
case 'Or':
|
|
419
|
+
return () => ({
|
|
420
|
+
type: 'ScheduleSubroutine',
|
|
421
|
+
subroutine: SROr,
|
|
422
|
+
args: {
|
|
423
|
+
operand1: renderCfg(ctx, cfg.operand1),
|
|
424
|
+
operand2: renderCfg(ctx, cfg.operand2)
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
case 'MapResourceFields':
|
|
429
|
+
return () => ({
|
|
430
|
+
type: 'ScheduleSubroutine',
|
|
431
|
+
subroutine: SRMapResourceFields1(ctx, cfg),
|
|
432
|
+
args: {
|
|
433
|
+
source: renderCfg(ctx, cfg.source)
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
case 'GetResourceField':
|
|
438
|
+
return () => ({
|
|
439
|
+
type: 'ScheduleSubroutine',
|
|
440
|
+
subroutine: SRGetResourceField,
|
|
441
|
+
args: {
|
|
442
|
+
source: renderCfg(ctx, cfg.source),
|
|
443
|
+
field: renderCfg(ctx, cfg.field)
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
case 'GetResourceValueAsJson':
|
|
448
|
+
return () => ({
|
|
449
|
+
type: 'ScheduleSubroutine',
|
|
450
|
+
subroutine: SRResourceValueAsJson,
|
|
451
|
+
args: {
|
|
452
|
+
source: renderCfg(ctx, cfg.source)
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
case 'GetBlobContent':
|
|
457
|
+
return () => ({
|
|
458
|
+
type: 'ScheduleSubroutine',
|
|
459
|
+
subroutine: SRGetBlobContent,
|
|
460
|
+
args: {
|
|
461
|
+
source: renderCfg(ctx, cfg.source)
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
case 'GetBlobContentAsString':
|
|
466
|
+
return () => ({
|
|
467
|
+
type: 'ScheduleSubroutine',
|
|
468
|
+
subroutine: SRGetBlobContentAsString,
|
|
469
|
+
args: {
|
|
470
|
+
source: renderCfg(ctx, cfg.source)
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
case 'GetBlobContentAsJson':
|
|
475
|
+
return () => ({
|
|
476
|
+
type: 'ScheduleSubroutine',
|
|
477
|
+
subroutine: SRGetBlobContentAsJson,
|
|
478
|
+
args: {
|
|
479
|
+
source: renderCfg(ctx, cfg.source)
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
case 'GetDownloadedBlobContent':
|
|
484
|
+
return () => ({
|
|
485
|
+
type: 'ScheduleSubroutine',
|
|
486
|
+
subroutine: SRGetDownloadedBlobContent,
|
|
487
|
+
args: {
|
|
488
|
+
source: renderCfg(ctx, cfg.source)
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
case 'GetOnDemandBlobContent':
|
|
493
|
+
return () => ({
|
|
494
|
+
type: 'ScheduleSubroutine',
|
|
495
|
+
subroutine: SRGetOnDemandBlobContent,
|
|
496
|
+
args: {
|
|
497
|
+
source: renderCfg(ctx, cfg.source)
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
case 'GetImportProgress':
|
|
502
|
+
return () => ({
|
|
503
|
+
type: 'ScheduleSubroutine',
|
|
504
|
+
subroutine: SRGetImportProgress,
|
|
505
|
+
args: {
|
|
506
|
+
source: renderCfg(ctx, cfg.source)
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
case 'GetLastLogs':
|
|
511
|
+
return () => ({
|
|
512
|
+
type: 'ScheduleSubroutine',
|
|
513
|
+
subroutine: SRGetLastLogs(cfg.lines),
|
|
514
|
+
args: {
|
|
515
|
+
source: renderCfg(ctx, cfg.source)
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
case 'GetProgressLog':
|
|
520
|
+
return () => ({
|
|
521
|
+
type: 'ScheduleSubroutine',
|
|
522
|
+
subroutine: SRGetProgressLog(cfg.patternToSearch),
|
|
523
|
+
args: {
|
|
524
|
+
source: renderCfg(ctx, cfg.source)
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
case 'GetLogHandle':
|
|
529
|
+
return () => ({
|
|
530
|
+
type: 'ScheduleSubroutine',
|
|
531
|
+
subroutine: SRGetLogHandle,
|
|
532
|
+
args: {
|
|
533
|
+
source: renderCfg(ctx, cfg.source)
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
default:
|
|
538
|
+
return assertNever(cfg);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Cfg } from '@platforma-sdk/model';
|
|
2
|
+
import { assertNever } from '@milaboratories/ts-helpers';
|
|
3
|
+
|
|
4
|
+
export function* traverseCfg(cfg: Cfg, guide?: (cfg: Cfg) => boolean): Generator<Cfg> {
|
|
5
|
+
yield cfg;
|
|
6
|
+
if (guide !== undefined && !guide(cfg)) return;
|
|
7
|
+
switch (cfg.type) {
|
|
8
|
+
case 'GetFromCtx':
|
|
9
|
+
case 'Immediate':
|
|
10
|
+
return;
|
|
11
|
+
case 'Isolate':
|
|
12
|
+
yield* traverseCfg(cfg.cfg);
|
|
13
|
+
return;
|
|
14
|
+
case 'MakeObject':
|
|
15
|
+
for (const [, child] of Object.entries(cfg.template)) yield* traverseCfg(child);
|
|
16
|
+
return;
|
|
17
|
+
case 'MakeArray':
|
|
18
|
+
for (const child of cfg.template) yield* traverseCfg(child);
|
|
19
|
+
return;
|
|
20
|
+
case 'GetJsonField':
|
|
21
|
+
case 'GetResourceField':
|
|
22
|
+
yield* traverseCfg(cfg.source);
|
|
23
|
+
yield* traverseCfg(cfg.field);
|
|
24
|
+
return;
|
|
25
|
+
case 'MapRecordValues':
|
|
26
|
+
case 'MapArrayValues':
|
|
27
|
+
case 'MapResourceFields':
|
|
28
|
+
yield* traverseCfg(cfg.source);
|
|
29
|
+
yield* traverseCfg(cfg.mapping);
|
|
30
|
+
return;
|
|
31
|
+
case 'Flatten':
|
|
32
|
+
case 'GetResourceValueAsJson':
|
|
33
|
+
case 'GetBlobContent':
|
|
34
|
+
case 'GetBlobContentAsString':
|
|
35
|
+
case 'GetBlobContentAsJson':
|
|
36
|
+
case 'GetDownloadedBlobContent':
|
|
37
|
+
case 'GetOnDemandBlobContent':
|
|
38
|
+
case 'GetImportProgress':
|
|
39
|
+
case 'GetLastLogs':
|
|
40
|
+
case 'GetProgressLog':
|
|
41
|
+
case 'GetLogHandle':
|
|
42
|
+
yield* traverseCfg(cfg.source);
|
|
43
|
+
return;
|
|
44
|
+
case 'IsEmpty':
|
|
45
|
+
yield* traverseCfg(cfg.arg);
|
|
46
|
+
return;
|
|
47
|
+
case 'Not':
|
|
48
|
+
yield* traverseCfg(cfg.operand);
|
|
49
|
+
return;
|
|
50
|
+
case 'And':
|
|
51
|
+
case 'Or':
|
|
52
|
+
yield* traverseCfg(cfg.operand1);
|
|
53
|
+
yield* traverseCfg(cfg.operand2);
|
|
54
|
+
return;
|
|
55
|
+
default:
|
|
56
|
+
assertNever(cfg);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Cfg } from '@platforma-sdk/model';
|
|
2
|
+
import { traverseCfg } from './traverse';
|
|
3
|
+
|
|
4
|
+
export function mapRecord<T1, T2, Key extends string>(
|
|
5
|
+
obj: Record<Key, T1>,
|
|
6
|
+
mapper: (value: T1) => T2
|
|
7
|
+
): Record<Key, T2> {
|
|
8
|
+
const result = {} as Record<Key, T2>;
|
|
9
|
+
for (const [key, value] of Object.entries(obj)) result[key as Key] = mapper(value as T1);
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function ifNotUndef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {
|
|
14
|
+
return value === undefined ? undefined : cb(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isActiveCfg(cfg: Cfg): boolean {
|
|
18
|
+
switch (cfg.type) {
|
|
19
|
+
case 'GetImportProgress':
|
|
20
|
+
return true;
|
|
21
|
+
default:
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function hasActiveCfgComponents(cfg: Cfg): boolean {
|
|
27
|
+
for (const nested of traverseCfg(cfg)) if (isActiveCfg(nested)) return true;
|
|
28
|
+
return false;
|
|
29
|
+
}
|
package/src/dev/index.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { RegistryV1 } from '@platforma-sdk/block-tools';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { tryStat } from './util';
|
|
4
|
+
|
|
5
|
+
export const LegacyDevBlockPackMetaYaml = [RegistryV1.PlPackageYamlConfigFile];
|
|
6
|
+
export const LegacyDevBlockPackMetaJson = [RegistryV1.PlPackageJsonConfigFile];
|
|
7
|
+
export const LegacyDevBlockPackTemplate = ['backend', 'dist', 'tengo', 'tpl', 'main.plj.gz'];
|
|
8
|
+
export const LegacyDevBlockPackConfig = ['config', 'dist', 'config.json'];
|
|
9
|
+
export const LegacyDevBlockPackFrontendFolder = ['frontend', 'dist'];
|
|
10
|
+
|
|
11
|
+
export const CanonicalBlockWorkflowRequest = 'block-workflow/dist/tengo/tpl/main.plj.gz';
|
|
12
|
+
export const CanonicalBlockConfigRequest = 'block-model/dist/config.json';
|
|
13
|
+
export const CanonicalBlockUiRequestPackageJson = 'block-ui/package.json';
|
|
14
|
+
|
|
15
|
+
export const LegacyDevBlockPackFiles = [
|
|
16
|
+
LegacyDevBlockPackTemplate,
|
|
17
|
+
LegacyDevBlockPackConfig,
|
|
18
|
+
LegacyDevBlockPackMetaYaml,
|
|
19
|
+
LegacyDevBlockPackMetaJson,
|
|
20
|
+
LegacyDevBlockPackFrontendFolder
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
export type DevPacketPaths = {
|
|
24
|
+
/** main.plj.gz */
|
|
25
|
+
readonly workflow: string;
|
|
26
|
+
/** config.json */
|
|
27
|
+
readonly config: string;
|
|
28
|
+
/** ui dist folder */
|
|
29
|
+
readonly ui: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export async function isLegacyDevPackage(packageRoot: string): Promise<boolean> {
|
|
33
|
+
return (
|
|
34
|
+
(await tryStat(path.join(packageRoot, ...LegacyDevBlockPackConfig))) !== undefined ||
|
|
35
|
+
(await tryStat(path.join(packageRoot, ...LegacyDevBlockPackTemplate))) !== undefined
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function tryResolve(root: string, request: string): string | undefined {
|
|
40
|
+
try {
|
|
41
|
+
return require.resolve(request, {
|
|
42
|
+
paths: [root]
|
|
43
|
+
});
|
|
44
|
+
} catch (err: any) {
|
|
45
|
+
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function mustResolve(root: string, request: string): string {
|
|
51
|
+
const res = tryResolve(root, request);
|
|
52
|
+
if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);
|
|
53
|
+
return res;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function resolveDevPacket(
|
|
57
|
+
packageRoot: string,
|
|
58
|
+
ignoreErrors: true
|
|
59
|
+
): Promise<DevPacketPaths | undefined>;
|
|
60
|
+
export async function resolveDevPacket(
|
|
61
|
+
packageRoot: string,
|
|
62
|
+
ignoreErrors: false
|
|
63
|
+
): Promise<DevPacketPaths>;
|
|
64
|
+
export async function resolveDevPacket(
|
|
65
|
+
packageRoot: string,
|
|
66
|
+
ignoreErrors: boolean
|
|
67
|
+
): Promise<DevPacketPaths | undefined> {
|
|
68
|
+
if (!path.isAbsolute(packageRoot)) packageRoot = path.resolve(packageRoot);
|
|
69
|
+
if (await isLegacyDevPackage(packageRoot))
|
|
70
|
+
return {
|
|
71
|
+
workflow: path.join(packageRoot, ...LegacyDevBlockPackTemplate),
|
|
72
|
+
config: path.join(packageRoot, ...LegacyDevBlockPackConfig),
|
|
73
|
+
ui: path.join(packageRoot, ...LegacyDevBlockPackFrontendFolder)
|
|
74
|
+
};
|
|
75
|
+
if (ignoreErrors) {
|
|
76
|
+
const workflow = tryResolve(packageRoot, CanonicalBlockConfigRequest);
|
|
77
|
+
if (workflow === undefined) return undefined;
|
|
78
|
+
const config = tryResolve(packageRoot, CanonicalBlockConfigRequest);
|
|
79
|
+
if (config === undefined) return undefined;
|
|
80
|
+
const uiPackageJson = tryResolve(packageRoot, CanonicalBlockUiRequestPackageJson);
|
|
81
|
+
if (uiPackageJson === undefined) return undefined;
|
|
82
|
+
return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };
|
|
83
|
+
} else {
|
|
84
|
+
const workflow = mustResolve(packageRoot, CanonicalBlockConfigRequest);
|
|
85
|
+
const config = mustResolve(packageRoot, CanonicalBlockConfigRequest);
|
|
86
|
+
const uiPackageJson = mustResolve(packageRoot, CanonicalBlockUiRequestPackageJson);
|
|
87
|
+
return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };
|
|
88
|
+
}
|
|
89
|
+
}
|