@platforma-sdk/workflow-tengo 3.0.3 → 3.2.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.
Files changed (51) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +2 -1
  3. package/dist/index.mjs +2 -1
  4. package/dist/tengo/lib/canonical.lib.tengo +73 -0
  5. package/dist/tengo/lib/exec.lib.tengo +4 -7
  6. package/dist/tengo/lib/exec.limits.lib.tengo +63 -1
  7. package/dist/tengo/lib/exec.monetization.lib.tengo +3 -1
  8. package/dist/tengo/lib/exec.monetization_internal.lib.tengo +2 -1
  9. package/dist/tengo/lib/exec.runcmd.lib.tengo +47 -7
  10. package/dist/tengo/lib/feats.lib.tengo +5 -4
  11. package/dist/tengo/lib/maps.lib.tengo +1 -1
  12. package/dist/tengo/lib/pframes.builder.lib.tengo +5 -1
  13. package/dist/tengo/lib/pframes.bundle.lib.tengo +544 -0
  14. package/dist/tengo/lib/pframes.constants.lib.tengo +5 -1
  15. package/dist/tengo/lib/pframes.lib.tengo +3 -0
  16. package/dist/tengo/lib/pframes.spec.lib.tengo +224 -1
  17. package/dist/tengo/lib/pframes.xsv-import-file.lib.tengo +3 -3
  18. package/dist/tengo/lib/pframes.xsv.lib.tengo +79 -4
  19. package/dist/tengo/lib/sets.lib.tengo +2 -0
  20. package/dist/tengo/lib/slices.lib.tengo +4 -1
  21. package/dist/tengo/lib/smart.lib.tengo +24 -6
  22. package/dist/tengo/lib/tpl.base.lib.tengo +582 -0
  23. package/dist/tengo/lib/tpl.lib.tengo +6 -567
  24. package/dist/tengo/lib/tpl.light.lib.tengo +9 -0
  25. package/dist/tengo/lib/workdir.lib.tengo +1 -1
  26. package/dist/tengo/lib/workdir.proc.lib.tengo +1 -1
  27. package/dist/tengo/lib/workflow.lib.tengo +41 -2
  28. package/dist/tengo/lib/workflow.model.lib.tengo +3 -2
  29. package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
  30. package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
  31. package/dist/tengo/tpl/exec.monetization_info.plj.gz +0 -0
  32. package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
  33. package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
  34. package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
  35. package/dist/tengo/tpl/ll.get-field.plj.gz +0 -0
  36. package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
  37. package/dist/tengo/tpl/pframes.export-pframe-for-ui.plj.gz +0 -0
  38. package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
  39. package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
  40. package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
  41. package/dist/tengo/tpl/pframes.process-pcolumn-data.plj.gz +0 -0
  42. package/dist/tengo/tpl/pframes.remove-nulls.plj.gz +0 -0
  43. package/dist/tengo/tpl/pframes.slice-data.plj.gz +0 -0
  44. package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
  45. package/dist/tengo/tpl/pframes.xsv-import-if-not-null.plj.gz +0 -0
  46. package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
  47. package/dist/tengo/tpl/waiter.waiter.plj.gz +0 -0
  48. package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
  49. package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
  50. package/dist/tengo/tpl/workflow.query-anchored.plj.gz +0 -0
  51. package/package.json +2 -2
@@ -1,575 +1,14 @@
1
1
 
2
+ base := import("@platforma-sdk/workflow-tengo:tpl.base")
2
3
 
3
- tx := import("tx")
4
- ll := import("@platforma-sdk/workflow-tengo:ll")
5
- render := import("@platforma-sdk/workflow-tengo:render")
6
- smart := import("@platforma-sdk/workflow-tengo:smart")
7
- sets := import("@platforma-sdk/workflow-tengo:sets")
8
- maps := import("@platforma-sdk/workflow-tengo:maps")
9
- tplutil := import("@platforma-sdk/workflow-tengo:tpl.util")
10
- constants := import("@platforma-sdk/workflow-tengo:constants")
11
- stateAwait := import("@platforma-sdk/workflow-tengo:tpl.state-await")
12
- validation := import("@platforma-sdk/workflow-tengo:validation")
13
-
4
+ bundle := import("@platforma-sdk/workflow-tengo:pframes.bundle")
14
5
  bquery := import("@platforma-sdk/workflow-tengo:workflow.bquery")
15
6
 
16
7
 
17
8
 
18
9
 
19
-
20
-
21
-
22
-
23
-
24
-
25
- _unmarshal := func(resource, preprocessors) {
26
- ll.assert(smart.isResource(resource), "expected resource, found ", resource)
27
-
28
-
29
- self := func(resource) { return _unmarshal(resource, preprocessors) }
30
-
31
- for preproc in preprocessors {
32
- if preproc.canParse(resource) {
33
- return preproc.parse(resource, self)
34
- }
35
- }
36
-
37
- if smart.isReference(resource) && resource.hasError() {
38
- err := resource.getError().getDataAsJson()
39
- if !is_undefined(err.message) {
40
- err = err.message
41
- }
42
- ll.panic("input resource has errors: %v", err)
43
- }
44
-
45
- if smart.isResource(resource) && resource.checkResourceType(constants.RTYPE_NULL) {
46
- return undefined
47
- }
48
-
49
- if smart.isJsonResource(resource) || resource.checkResourceType(constants.RTYPE_BOBJECT_SPEC) {
50
-
51
-
52
- return resource.getDataAsJson()
53
- } else if smart.isMapResource(resource) || smart.isLockedEphMapResource(resource) {
54
-
55
-
56
- result := {}
57
- for field, value in resource.inputs() {
58
- if value.isErrorSet() {
59
- ll.panic("input %v field has error: %v", field, field.getError().getDataAsJson().message)
60
- } else if value.isSet() {
61
- result[field] = _unmarshal(value.getValue(), preprocessors)
62
- } else {
63
- result[field] = value
64
- }
65
-
66
- }
67
- return result
68
- } else {
69
-
70
- return resource
71
- }
72
- }
73
-
74
-
75
-
76
-
77
- tpl := func() {
78
- self := undefined
79
-
80
- _renderer := smart.resourceBuilder(ll.getCurrentTemplateRenderer())
81
-
82
- _rendererType := _renderer.info().Type
83
-
84
- _isEphemeral := _rendererType.Name == constants.RTYPE_RENDER_EPH_TEMPLATE.Name
85
-
86
- _hasPrepared := _renderer.get(tplutil.INPUTS_MAP_FIELD).hasField(tplutil.PREPARE_MAP_FIELD_NAME)
87
-
88
- _preparedMap := _hasPrepared ? _renderer.get(tplutil.INPUTS_MAP_FIELD).get(tplutil.PREPARE_MAP_FIELD_NAME) : undefined
89
-
90
- _templateId := _renderer.get(tplutil.TEMPLATE_FIELD).id
91
-
92
- _stateRequests := []
93
- _delegatedOutputs := []
94
-
95
- self = {
96
-
97
-
98
-
99
-
100
- renderer: func() {
101
- return _renderer
102
- },
103
-
104
-
105
-
106
-
107
- isEphemeral: func() {
108
- return _isEphemeral
109
- },
110
-
111
-
112
-
113
-
114
- template: func() {
115
- return smart.resource(_templateId)
116
- },
117
-
118
- _unmarshallers: [bquery.resultUnmarshaller()],
119
-
120
-
121
-
122
-
123
-
124
-
125
- registerUnmarshaller: func(preproc) {
126
- ll.assert(is_undefined(self._inputs), "input preprocessors must be registered before getting inputs")
127
- self._unmarshallers = append(self._unmarshallers, preproc)
128
- },
129
-
130
-
131
-
132
-
133
- rawInputs: func() {
134
- return self.renderer().get(tplutil.INPUTS_MAP_FIELD).inputs()
135
- },
136
-
137
- _inputs: undefined,
138
-
139
-
140
-
141
-
142
- inputs: func() {
143
- if self._inputs == undefined {
144
- inputs := _unmarshal(self.renderer().get(tplutil.INPUTS_MAP_FIELD), self._unmarshallers)
145
-
146
-
147
- pp := inputs[tplutil.PREPARE_MAP_FIELD_NAME]
148
- if !is_undefined(pp) {
149
- delete(inputs, tplutil.PREPARE_MAP_FIELD_NAME)
150
- for k, v in pp {
151
- ll.assert(is_undefined(inputs[k]), k, " key already exists in inputs map")
152
- inputs[k] = v
153
- }
154
- }
155
-
156
- self._inputs = inputs
157
- }
158
- return self._inputs
159
- },
160
-
161
-
162
-
163
-
164
- hasInput: func(name) {
165
- return self.renderer().get(tplutil.INPUTS_MAP_FIELD).hasField(name)
166
- },
167
-
168
-
169
- definedOutputs : [],
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
- defineOutputs : func(...name) {
178
- if len(name) == 1 && is_array(name[0]) {
179
- for v in name[0] {
180
- self.definedOutputs = append(self.definedOutputs, v)
181
- }
182
- } else {
183
- self.definedOutputs = append(self.definedOutputs, name...)
184
- }
185
- },
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
- awaitState: func(...pathAndState) {
221
- if !self.isEphemeral() {
222
- ll.panic("awaitState allowed only in ephemeral templates")
223
- }
224
- self.awaitStateIfEphemeral(pathAndState...)
225
- },
226
-
227
-
228
-
229
-
230
-
231
-
232
-
233
-
234
-
235
-
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
-
246
-
247
-
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
-
258
-
259
-
260
- awaitStateIfEphemeral: func(...pathAndState) {
261
- if !self.isEphemeral() {
262
- return
263
- }
264
- path := pathAndState[:len(pathAndState) - 1]
265
- state := pathAndState[len(pathAndState) - 1]
266
- _stateRequests = append(_stateRequests, {
267
- path: path,
268
- state: state
269
- })
270
- },
271
-
272
-
273
-
274
-
275
-
276
- ignorePrepare: _hasPrepared,
277
-
278
-
279
-
280
-
281
- preparedMapResource: func() {
282
- return _preparedMap
283
- },
284
-
285
-
286
-
287
-
288
- prepareQueue : [],
289
-
290
-
291
-
292
-
293
-
294
-
295
-
296
- prepare : func(codeFn) {
297
- if self.ignorePrepare {
298
- return
299
- }
300
-
301
- ll.assert(len(self.prepareQueue) == 0, "multiple prepare statements are not supported yet")
302
-
303
- self.prepareQueue = append(self.prepareQueue, codeFn)
304
- },
305
-
306
-
307
-
308
-
309
-
310
- renderPrepare: func() {
311
- ll.assert(!self.ignorePrepare, "expected !ignorePrepare")
312
-
313
- inputs := self.inputs()
314
-
315
-
316
- newInputs := copy(inputs)
317
-
318
-
319
- builder := undefined
320
- if self.isEphemeral() {
321
- builder = smart.ephemeralMapBuilder()
322
- } else {
323
- builder = smart.mapBuilder()
324
- }
325
-
326
-
327
- self._validateInputs()
328
- for cb in self.prepareQueue {
329
-
330
- r := cb(inputs)
331
-
332
- ll.assert(is_map(r), "expected map, got ", r)
333
-
334
- for name, ref in r {
335
- ll.assert(is_undefined(newInputs[name]), "prepare name is already in use: %s", name)
336
-
337
- builder.add(name, ref)
338
- }
339
- }
340
- newInputs[tplutil.PREPARE_MAP_FIELD_NAME] = builder.build()
341
-
342
-
343
- renderer := undefined
344
- if self.isEphemeral() {
345
- renderer = render.createEphemeral(self.template(), newInputs)
346
- } else {
347
- renderer = render.create(self.template(), newInputs)
348
- }
349
-
350
- for output in self.definedOutputs {
351
- self.getOutputField(output).set(renderer.output(output))
352
- }
353
- },
354
-
355
-
356
-
357
-
358
-
359
- setOutputs : func(resultMap) {
360
- ll.assert(ll.isMap(resultMap), "expected map, got ", resultMap)
361
-
362
-
363
- for name, value in resultMap {
364
- f := self.getOutputField(name)
365
- if !f.isSet() {
366
- f.setRefOrJson(value)
367
- }
368
- }
369
- },
370
-
371
-
372
-
373
-
374
- getOutputField: func(name) {
375
- return self.renderer().getField(tplutil.TEMPLATE_OUTPUT_PREFIX + name)
376
- },
377
-
378
-
379
-
380
-
381
- createOutputsAndLock: func(outputs) {
382
- for name in outputs {
383
- self.renderer().createOutputField(tplutil.TEMPLATE_OUTPUT_PREFIX + name)
384
- }
385
- self.renderer().lockOutputs()
386
- },
387
-
388
- _inputsSchema: undefined,
389
-
390
-
391
-
392
-
393
- validateInputs: func(schema) {
394
- ll.assert(is_undefined(self._inputsSchema), "validateInputs was already invoked")
395
- self._inputsSchema = schema
396
- },
397
-
398
- _validateInputs: func() {
399
- schema := self._inputsSchema
400
- if is_undefined(schema) {
401
- return
402
- }
403
- validation.assertType(self.inputs(), schema)
404
- },
405
-
406
-
407
-
408
-
409
- body: func(bodyFn){
410
- if self.isEphemeral() {
411
-
412
- self.routeEph(bodyFn)
413
- } else {
414
-
415
- self.routePure(bodyFn)
416
- }
417
- },
418
-
419
-
420
-
421
-
422
- routePure: func(bodyFn){
423
-
424
- if len(self.definedOutputs) == 0 {
425
- ll.panic("please define outputs before template body")
426
- }
427
-
428
-
429
-
430
-
431
-
432
-
433
-
434
-
435
-
436
-
437
-
438
-
439
-
440
- if ll.isInitializing() {
441
-
442
-
443
- self.createOutputsAndLock(self.definedOutputs)
444
- } else {
445
-
446
-
447
- if len(self.prepareQueue) != 0 {
448
-
449
-
450
- self.renderPrepare()
451
- } else {
452
-
453
- self._validateInputs()
454
- result := bodyFn(self.inputs())
455
-
456
- ll.assert(ll.isMap(result),
457
- "expected map from tpl.body() callback. Did you forget 'return' statement?")
458
-
459
- outputsWithValues := sets.fromMapKeys(result)
460
- outputsWithValues = sets.add(outputsWithValues, _delegatedOutputs...)
461
-
462
- ll.assert(sets.fromSlice(self.definedOutputs) == outputsWithValues,
463
- "tpl.body() callback must return the same list of outputs as were given to 'defineOutputs()'. Want %s, got %s",
464
- self.definedOutputs, sets.toSlice(outputsWithValues))
465
-
466
-
467
- self.setOutputs(result)
468
- }
469
- }
470
- },
471
-
472
-
473
-
474
-
475
- routeEph: func(bodyFn) {
476
-
477
- if len(_stateRequests) == 0 {
478
- _stateRequests = [{
479
- path: [],
480
- state: "AllInputsSet"
481
- }]
482
- }
483
-
484
- if _hasPrepared {
485
- _stateRequests = append(_stateRequests, {
486
- path: [tplutil.PREPARE_MAP_FIELD_NAME],
487
- state: "ResourceReady"
488
- })
489
- }
490
-
491
- stateReached := stateAwait.await(
492
- _renderer.getField(tplutil.INPUTS_MAP_FIELD),
493
- _renderer,
494
- _stateRequests
495
- )
496
-
497
- if stateReached {
498
-
499
- if len(self.prepareQueue) > 0 {
500
- ll.assert(len(self.definedOutputs) > 0, "outputs should be defined prior to prepare")
501
-
502
- self.createOutputsAndLock(self.definedOutputs)
503
-
504
- self.renderPrepare()
505
- } else {
506
-
507
-
508
- self._validateInputs()
509
- result := bodyFn(self.inputs())
510
- ll.assert(ll.isMap(result),
511
- "expected map from tpl-eph.body() callback. Did you forget 'return' statement?")
512
-
513
- self.createOutputsAndLock(maps.getKeys(result))
514
-
515
-
516
- self.setOutputs(result)
517
- }
518
- }
519
- },
520
-
521
-
522
-
523
-
524
-
525
-
526
-
527
-
528
-
529
- routeDelegate: func(tpl, extraInputs, outputs) {
530
- _delegatedOutputs = outputs
531
-
532
- inputs := self.rawInputs()
533
- for k, v in extraInputs {
534
- inputs[k] = v
535
- }
536
-
537
- renderer := undefined
538
- if self.isEphemeral() {
539
- renderer = render.createEphemeral(tpl, inputs)
540
- } else {
541
- renderer = render.create(tpl, inputs)
542
- }
543
-
544
- tplOutputs := {}
545
- for o in outputs {
546
- tplOutputs[o] = renderer.output(o)
547
- }
548
-
549
- self.createOutputsAndLock(outputs)
550
- self.setOutputs(tplOutputs)
551
- }
552
- }
553
- return ll.toStrict(self)
554
- }
555
-
556
-
557
-
558
-
559
- instance := tpl()
560
-
561
- export ll.toStrict({
562
- renderer : instance.renderer,
563
- registerUnmarshaller : instance.registerUnmarshaller,
564
- rawInputs : instance.rawInputs,
565
- hasInput : instance.hasInput,
566
- inputs : instance.inputs,
567
- defineOutputs : instance.defineOutputs,
568
- prepare : instance.prepare,
569
- awaitState : instance.awaitState,
570
- awaitStateIfEphemeral : instance.awaitStateIfEphemeral,
571
- delegate : instance.routeDelegate,
572
- validateInputs : instance.validateInputs,
573
- body : instance.body,
574
- template : instance.template
10
+ instance := base.tpl({
11
+ unmarshallers: [bquery.resultUnmarshaller(), bundle.pColumnBundleUnmarshaller()]
575
12
  })
13
+
14
+ export instance.api()
@@ -0,0 +1,9 @@
1
+
2
+ base := import("@platforma-sdk/workflow-tengo:tpl.base")
3
+
4
+
5
+
6
+
7
+ instance := base.tpl({})
8
+
9
+ export instance.api()
@@ -6,6 +6,7 @@ json := import("json")
6
6
 
7
7
  ll := import("@platforma-sdk/workflow-tengo:ll")
8
8
  feats := import("@platforma-sdk/workflow-tengo:feats")
9
+ validation := import("@platforma-sdk/workflow-tengo:validation")
9
10
 
10
11
  assets := import("@platforma-sdk/workflow-tengo:assets")
11
12
  constants := import("@platforma-sdk/workflow-tengo:constants")
@@ -15,7 +16,6 @@ sets := import("@platforma-sdk/workflow-tengo:sets")
15
16
  slices := import("@platforma-sdk/workflow-tengo:slices")
16
17
  path := import("@platforma-sdk/workflow-tengo:path")
17
18
  enum := import("enum")
18
- validation := import("@platforma-sdk/workflow-tengo:validation")
19
19
  render := import("@platforma-sdk/workflow-tengo:render")
20
20
 
21
21
  _WD_CREATE_FIELD_ALLOCATION := "allocation"
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- tpl := import("@platforma-sdk/workflow-tengo:tpl")
3
+ tpl := import("@platforma-sdk/workflow-tengo:tpl.light")
4
4
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
5
  wdSave := import("@platforma-sdk/workflow-tengo:workdir.save")
6
6
 
@@ -15,7 +15,7 @@ sets := import("@platforma-sdk/workflow-tengo:sets")
15
15
  oop := import("@platforma-sdk/workflow-tengo:oop")
16
16
  bobject := import("@platforma-sdk/workflow-tengo:workflow.bobject")
17
17
  bquery := import("@platforma-sdk/workflow-tengo:workflow.bquery")
18
-
18
+ pBundle := import("@platforma-sdk/workflow-tengo:pframes.bundle")
19
19
 
20
20
 
21
21
  self := import("@platforma-sdk/workflow-tengo:tpl")
@@ -320,6 +320,44 @@ validateArgs := func(argsSchema) {
320
320
 
321
321
 
322
322
 
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+ createPBundleBuilder := func() {
355
+ return pBundle.createBuilder(_parentContext())
356
+ }
357
+
358
+
359
+
360
+
323
361
  body := func(bodyFn) {
324
362
 
325
363
  if _isProduction() {
@@ -360,5 +398,6 @@ export ll.toStrict({
360
398
  body: body,
361
399
  setPreRun: setPreRun,
362
400
  blockId: blockId,
363
- validateArgs: validateArgs
401
+ validateArgs: validateArgs,
402
+ createPBundleBuilder: createPBundleBuilder
364
403
  })
@@ -45,7 +45,7 @@ A_DOMAIN_SCHEMA := ["or",
45
45
  ]
46
46
 
47
47
 
48
- AP_COLUMN_SELECTOR_SCHEMA := {
48
+ ANCHORED_P_COLUMN_SELECTOR_SCHEMA := {
49
49
  `__options__,closed`: true,
50
50
  `name,?`: `string`,
51
51
  `namePattern,?`: `string`,
@@ -60,7 +60,8 @@ AP_COLUMN_SELECTOR_SCHEMA := {
60
60
  }
61
61
 
62
62
  export ll.toStrict({
63
- AP_COLUMN_SELECTOR_SCHEMA: AP_COLUMN_SELECTOR_SCHEMA,
63
+ ANCHORED_P_COLUMN_SELECTOR_SCHEMA: ANCHORED_P_COLUMN_SELECTOR_SCHEMA,
64
+ AP_COLUMN_SELECTOR_SCHEMA: ANCHORED_P_COLUMN_SELECTOR_SCHEMA, // Keep for backward compatibility
64
65
  AXIS_SELECTOR_SCHEMA: AXIS_SELECTOR_SCHEMA,
65
66
  ANCHOR_AXIS_REF_BY_IDX_SCHEMA: ANCHOR_AXIS_REF_BY_IDX_SCHEMA,
66
67
  ANCHOR_AXIS_REF_BY_NAME_SCHEMA: ANCHOR_AXIS_REF_BY_NAME_SCHEMA,
Binary file
Binary file