@platforma-sdk/workflow-tengo 2.13.6 → 2.15.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 (80) hide show
  1. package/README.md +17 -1
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +4 -1
  4. package/dist/index.mjs +4 -1
  5. package/dist/tengo/lib/assets.lib.tengo +28 -28
  6. package/dist/tengo/lib/assets.swinfo.lib.tengo +24 -24
  7. package/dist/tengo/lib/constants.lib.tengo +6 -3
  8. package/dist/tengo/lib/exec.R.internal.lib.tengo +2 -2
  9. package/dist/tengo/lib/exec.R.lib.tengo +41 -41
  10. package/dist/tengo/lib/exec.descriptor.lib.tengo +3 -3
  11. package/dist/tengo/lib/exec.internal.lib.tengo +41 -41
  12. package/dist/tengo/lib/exec.lib.tengo +289 -289
  13. package/dist/tengo/lib/exec.limits.lib.tengo +49 -49
  14. package/dist/tengo/lib/exec.monetization.lib.tengo +1 -1
  15. package/dist/tengo/lib/exec.monetization_internal.lib.tengo +38 -38
  16. package/dist/tengo/lib/exec.package.lib.tengo +53 -53
  17. package/dist/tengo/lib/exec.python.internal.lib.tengo +1 -1
  18. package/dist/tengo/lib/exec.python.lib.tengo +37 -37
  19. package/dist/tengo/lib/exec.runcmd.lib.tengo +138 -138
  20. package/dist/tengo/lib/exec.runenv.lib.tengo +18 -18
  21. package/dist/tengo/lib/exec.stream.lib.tengo +25 -25
  22. package/dist/tengo/lib/feats.lib.tengo +3 -3
  23. package/dist/tengo/lib/file.internal.lib.tengo +31 -31
  24. package/dist/tengo/lib/file.lib.tengo +29 -29
  25. package/dist/tengo/lib/ll.get-future-field-default.lib.tengo +137 -0
  26. package/dist/tengo/lib/ll.lib.tengo +129 -129
  27. package/dist/tengo/lib/maps.lib.tengo +38 -38
  28. package/dist/tengo/lib/objects.lib.tengo +6 -6
  29. package/dist/tengo/lib/oop.lib.tengo +11 -11
  30. package/dist/tengo/lib/path.lib.tengo +60 -60
  31. package/dist/tengo/lib/pframes.builder.lib.tengo +3 -3
  32. package/dist/tengo/lib/pframes.constants.lib.tengo +20 -20
  33. package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +5 -5
  34. package/dist/tengo/lib/pframes.lib.tengo +206 -198
  35. package/dist/tengo/lib/pframes.ll.lib.tengo +59 -59
  36. package/dist/tengo/lib/pframes.pcolumn.lib.tengo +18 -18
  37. package/dist/tengo/lib/pframes.remove-nulls.lib.tengo +36 -0
  38. package/dist/tengo/lib/pframes.spec.lib.tengo +83 -83
  39. package/dist/tengo/lib/pframes.util.lib.tengo +176 -176
  40. package/dist/tengo/lib/pframes.xsv-import-file.lib.tengo +160 -0
  41. package/dist/tengo/lib/pframes.xsv.lib.tengo +84 -167
  42. package/dist/tengo/lib/render.lib.tengo +100 -45
  43. package/dist/tengo/lib/sets.lib.tengo +44 -44
  44. package/dist/tengo/lib/slices.lib.tengo +126 -126
  45. package/dist/tengo/lib/smart.lib.tengo +654 -507
  46. package/dist/tengo/lib/test.lib.tengo +120 -120
  47. package/dist/tengo/lib/tpl.lib.tengo +206 -170
  48. package/dist/tengo/lib/tpl.state-await.lib.tengo +17 -17
  49. package/dist/tengo/lib/tpl.util.lib.tengo +5 -5
  50. package/dist/tengo/lib/units.lib.tengo +2 -2
  51. package/dist/tengo/lib/validation.lib.tengo +130 -130
  52. package/dist/tengo/lib/waiter.lib.tengo +59 -0
  53. package/dist/tengo/lib/workdir.lib.tengo +126 -126
  54. package/dist/tengo/lib/workdir.proc.lib.tengo +47 -47
  55. package/dist/tengo/lib/workdir.save.lib.tengo +53 -53
  56. package/dist/tengo/lib/workflow.bobject.lib.tengo +11 -11
  57. package/dist/tengo/lib/workflow.bquery.lib.tengo +40 -40
  58. package/dist/tengo/lib/workflow.constants.lib.tengo +1 -1
  59. package/dist/tengo/lib/workflow.context.lib.tengo +16 -16
  60. package/dist/tengo/lib/workflow.lib.tengo +76 -76
  61. package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
  62. package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
  63. package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
  64. package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
  65. package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
  66. package/dist/tengo/tpl/ll.get-field.plj.gz +0 -0
  67. package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
  68. package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
  69. package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
  70. package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
  71. package/dist/tengo/tpl/pframes.process-pcolumn-data.plj.gz +0 -0
  72. package/dist/tengo/tpl/pframes.remove-nulls.plj.gz +0 -0
  73. package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
  74. package/dist/tengo/tpl/pframes.xsv-import-if-not-null.plj.gz +0 -0
  75. package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
  76. package/dist/tengo/tpl/waiter.waiter.plj.gz +0 -0
  77. package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
  78. package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
  79. package/package.json +2 -2
  80. package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
@@ -1,4 +1,4 @@
1
- /** A library providing workdir save resource builder */
1
+
2
2
 
3
3
  ll := import("@platforma-sdk/workflow-tengo:ll")
4
4
  oop := import("@platforma-sdk/workflow-tengo:oop")
@@ -15,12 +15,12 @@ _WORKDIR_AFTER_FIELD := "workdirOut"
15
15
  _PROGRESS_FIELD := "progress"
16
16
 
17
17
 
18
- /**
19
- * Generates a file save rule for a given file name.
20
- *
21
- * @param fileName: string - the name of the file.
22
- * @return rule: map - the file save rule.
23
- */
18
+
19
+
20
+
21
+
22
+
23
+
24
24
  getFileSaveRule := func(fileName) {
25
25
  return {
26
26
  blobKey: fileName,
@@ -29,12 +29,12 @@ getFileSaveRule := func(fileName) {
29
29
  }
30
30
  }
31
31
 
32
- /**
33
- * Generates a value save rule for a given file name.
34
- *
35
- * @param fileName: string - the name of the file.
36
- * @return rule: map - the value save rule.
37
- */
32
+
33
+
34
+
35
+
36
+
37
+
38
38
  getContentSaveRule := func(fileName) {
39
39
  return {
40
40
  blobKey: fileName,
@@ -43,90 +43,90 @@ getContentSaveRule := func(fileName) {
43
43
  }
44
44
  }
45
45
 
46
- /**
47
- * Creates a builder for workdir save resource
48
- */
46
+
47
+
48
+
49
49
  builder := func(wdBefore) {
50
50
 
51
51
  super := smart.ephemeralBuilder(constants.RTYPE_WORKDIR_SAVE)
52
- // set input wd
52
+
53
53
  super.getField(_WORKDIR_IN_FIELD).set(wdBefore)
54
54
 
55
- // file save rules
55
+
56
56
  fRules := {}
57
- // content save rules
57
+
58
58
  cRules := {}
59
59
 
60
60
  self := undefined
61
61
  self = ll.toStrict(oop.inherit(super, {
62
62
 
63
- /**
64
- * Save file.
65
- *
66
- * @param fName: string - file name
67
- *
68
- */
63
+
64
+
65
+
66
+
67
+
68
+
69
69
  saveFile: func(fName) {
70
70
  fRules = sets.add(fRules, fName)
71
71
  return self
72
72
  },
73
73
 
74
- /**
75
- * Save file content.
76
- *
77
- * @param fName: string - file name
78
- *
79
- */
74
+
75
+
76
+
77
+
78
+
79
+
80
80
  saveFileContent: func(fName) {
81
81
  cRules = sets.add(cRules, fName)
82
82
  return self
83
83
  },
84
84
 
85
- /**
86
- * Get field pointing to saved files map resource
87
- */
85
+
86
+
87
+
88
88
  getSavedFiles: func() {
89
89
  return self.getField(_SAVED_FILES_FIELD)
90
90
  },
91
91
 
92
- /**
93
- * Get field pointing to saved files content map resource
94
- */
92
+
93
+
94
+
95
95
  getSavedFilesContent: func() {
96
96
  return self.getField(_SAVED_CONTENT_FIELD)
97
97
  },
98
98
 
99
- /**
100
- * Get field pointing to workdir after resource
101
- */
99
+
100
+
101
+
102
102
  getWorkdirAfter: func() {
103
103
  return self.getField(_WORKDIR_AFTER_FIELD)
104
104
  },
105
105
 
106
- /**
107
- * Get field pointing to progress resource
108
- */
106
+
107
+
108
+
109
109
  getProgress: func() {
110
110
  return self.getField(_PROGRESS_FIELD)
111
111
  },
112
112
 
113
- /**
114
- * Get future field pointing to saved file resource
115
- */
113
+
114
+
115
+
116
116
  getSavedFile: func(fName) {
117
117
  return self.getSavedFiles().getFutureInputField(fName)
118
118
  },
119
119
 
120
- /**
121
- * Get future field pointing to saved file content value resource
122
- */
120
+
121
+
122
+
123
123
  getSavedFileContent: func(fName) {
124
124
  return self.getSavedFilesContent().getFutureInputField(fName)
125
125
  },
126
126
 
127
- /**
128
- * Build resource
129
- */
127
+
128
+
129
+
130
130
  build: func() {
131
131
  rules := []
132
132
  for fName, _ in fRules {
@@ -145,7 +145,7 @@ builder := func(wdBefore) {
145
145
 
146
146
  resource := super.lockAndBuild()
147
147
 
148
- // still return self to have all the methods
148
+
149
149
  return self
150
150
  }
151
151
  }))
@@ -1,6 +1,6 @@
1
- /**
2
- * Utility functions to work with export objects & p-frames
3
- */
1
+
2
+
3
+
4
4
 
5
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
6
  constants := import("@platforma-sdk/workflow-tengo:constants")
@@ -9,7 +9,7 @@ smart := import("@platforma-sdk/workflow-tengo:smart")
9
9
  validation := import("@platforma-sdk/workflow-tengo:validation")
10
10
 
11
11
 
12
- //
12
+
13
13
  _pObjectSpecSchema := {
14
14
  "__options__,closed": "",
15
15
 
@@ -32,16 +32,16 @@ _pObjectSpecSchema := {
32
32
  }
33
33
 
34
34
 
35
- /**
36
- * Creates export object spec from a given map
37
- *
38
- * @param spec: map
39
- */
35
+
36
+
37
+
38
+
39
+
40
40
  createSpec := func(spec) {
41
41
  ll.assert(ll.isMap(spec), "expected map got %v", spec)
42
42
 
43
- // @TODO fix validation
44
- // validation.assertValidJson(spec, _pObjectSpecSchema)
43
+
44
+
45
45
 
46
46
  return smart.createValueResource(constants.RTYPE_BOBJECT_SPEC, json.encode(spec))
47
47
  }
@@ -6,7 +6,7 @@ json := import("json")
6
6
 
7
7
  _CONTEXT_FIELD_NAME := "ctx"
8
8
 
9
- // options scheme for query
9
+
10
10
  _OPTIONS_SCHEME := {
11
11
  "spec,?": `bool`,
12
12
  "data,?": `bool`,
@@ -15,39 +15,39 @@ _OPTIONS_SCHEME := {
15
15
  "errIfMissing,?": `bool`
16
16
  }
17
17
 
18
- // default query options
18
+
19
19
  _DEFAULT_OPTIONS := {
20
- /** Return specs in the results */
20
+
21
21
  spec: true,
22
- /** Return data in the results */
22
+
23
23
  data: true,
24
- /** Asserts that the resulting list has one element and returns it */
24
+
25
25
  single: false,
26
- /** Returns first available result of the query */
26
+
27
27
  first: false,
28
- /** Throw error if no results found */
28
+
29
29
  errIfMissing: false
30
30
  }
31
31
 
32
- /**
33
- * Query results pool.
34
- *
35
- * @param spec: query spec
36
- * @param ctx: results pool (context) to query
37
- * @param options: an options map
38
- * @return result: a list of {ref: spec: data:} objects (data will be absent if not requested)
39
- */
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
40
  create := func(spec, ctx, ...options) {
41
41
 
42
- // @TODO validate spec
42
+
43
43
 
44
44
  ops := copy(_DEFAULT_OPTIONS)
45
45
  if len(options) > 0 {
46
46
  ll.assert(len(options) == 1, "expected map, got array: ", options)
47
47
 
48
- // @TODO validate options
49
48
 
50
- // override defaults
49
+
50
+
51
51
  for k, v in options[0] {
52
52
  ops[k] = v
53
53
  }
@@ -62,7 +62,7 @@ create := func(spec, ctx, ...options) {
62
62
  if ops.first {
63
63
  builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_FIRST, query)
64
64
  } else {
65
- // return all query results
65
+
66
66
  builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_CHOICE, query)
67
67
  }
68
68
 
@@ -70,24 +70,24 @@ create := func(spec, ctx, ...options) {
70
70
  resolve := builder.lockInputsAndBuild()
71
71
 
72
72
 
73
- // create a special type to store query results
73
+
74
74
 
75
75
  rb := smart.structBuilder(constants.RTYPE_QUERY_RESULT)
76
76
 
77
- // save options
77
+
78
78
  rb.createInputField("ops").setJson(ops)
79
79
 
80
80
  if ops.spec {
81
81
  rb.createInputField("spec").set(resolve.getFutureOutputField("spec"))
82
82
  }
83
83
 
84
- // pass data only if needed, otherwise we are not waiting for data to complete
84
+
85
85
  if ops.data {
86
86
  rb.createInputField("data").set(resolve.getFutureOutputField("data"))
87
87
  }
88
88
 
89
- // the data structure differs in this case; the single ref, data and spec are stored
90
- // directly as result fields
89
+
90
+
91
91
  if ops.first {
92
92
  rb.createInputField("ref").set(resolve.getFutureOutputField("address"))
93
93
  }
@@ -95,9 +95,9 @@ create := func(spec, ctx, ...options) {
95
95
  return rb.lockAndBuild()
96
96
  }
97
97
 
98
- /**
99
- * Inputs preprocessor used to convert query result into array of {ref: spec: data:} objects
100
- */
98
+
99
+
100
+
101
101
  resultUnmarshaller := func() {
102
102
  return {
103
103
  canParse: func(r) {
@@ -109,9 +109,9 @@ resultUnmarshaller := func() {
109
109
  ops := resource.get("ops").getDataAsJson()
110
110
 
111
111
  if ops.first {
112
- // special case, single element
113
112
 
114
- // is no result
113
+
114
+
115
115
  isNR := func(r) {
116
116
  return r.info().Type.Name == constants.RTYPE_BRESOLVE_NO_RESULT.Name
117
117
  }
@@ -125,10 +125,10 @@ resultUnmarshaller := func() {
125
125
  spec: resource.get("spec").getDataAsJson()
126
126
  }
127
127
 
128
- // only if the data is there
128
+
129
129
  if resource.hasInputField("data") {
130
130
 
131
- // even if spec is present, the data may be still not available
131
+
132
132
  if isNR(resource.get("data")) {
133
133
  result.data = undefined
134
134
  } else {
@@ -138,7 +138,7 @@ resultUnmarshaller := func() {
138
138
 
139
139
  return ll.toStrict(result)
140
140
  } else {
141
- // format list of results
141
+
142
142
 
143
143
  spec := resource.get("spec").inputs()
144
144
  data := undefined
@@ -153,7 +153,7 @@ resultUnmarshaller := func() {
153
153
  spec: s.getValueAsJson()
154
154
  }
155
155
 
156
- // only if the data is there
156
+
157
157
  if !is_undefined(data) {
158
158
  r.data = parser(data[ref].getValue())
159
159
  }
@@ -173,13 +173,13 @@ resultUnmarshaller := func() {
173
173
  }
174
174
  }
175
175
 
176
- /**
177
- * Query results pool to find spec & data for a given ref.
178
- *
179
- * @param ref: a ref object ({blockId: name:})
180
- * @param ctx: results pool (context) to query
181
- * @return result: a {ref: spec: data:} object
182
- */
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
183
  resolve := func(ref, ctx, ...options) {
184
184
 
185
185
  spec := {
@@ -1,6 +1,6 @@
1
1
  ll := import("@platforma-sdk/workflow-tengo:ll")
2
2
 
3
- // a dummy prefix used to mimic field with empty string name
3
+
4
4
  NO_PREFIX_EXPORT := "_"
5
5
 
6
6
  export ll.toStrict({
@@ -1,4 +1,4 @@
1
- /** Library to work with context resources */
1
+
2
2
 
3
3
  ll := import("@platforma-sdk/workflow-tengo:ll")
4
4
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -9,32 +9,32 @@ _BLOCK_ID_FIELD := "id"
9
9
  _PARENT_CTX_FIELD := "parent"
10
10
  _EXPORTS_OUTPUT_PREFIX := "values/"
11
11
 
12
- /**
13
- * Create a new context builder
14
- *
15
- * @param block block (smart.Resource)
16
- * @param parentContext parent context (smart.Resource)
17
- */
12
+
13
+
14
+
15
+
16
+
17
+
18
18
  builder := func(block, parentContext) {
19
19
 
20
20
  super := smart.ephemeralBuilder(constants.RTYPE_CONTEXT)
21
21
 
22
- // set blockId associated with this context
22
+
23
23
  super.createInputField(_BLOCK_ID_FIELD).setRefOrJson(block)
24
24
 
25
- // set parent context
25
+
26
26
  super.createInputField(_PARENT_CTX_FIELD).set(parentContext)
27
27
 
28
28
  self := undefined
29
29
  self = ll.toStrict(oop.inherit(super, {
30
30
 
31
- /**
32
- * Add export to the context
33
- *
34
- * @param name string name of the export field
35
- * @param value resource/field value
36
- *
37
- */
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
38
  add: func(name, value) {
39
39
  field := super.createInputField(_EXPORTS_OUTPUT_PREFIX + name)
40
40