@platforma-sdk/workflow-tengo 2.14.0 → 2.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/index.mjs +3 -1
- package/dist/tengo/lib/assets.lib.tengo +28 -28
- package/dist/tengo/lib/assets.swinfo.lib.tengo +24 -24
- package/dist/tengo/lib/constants.lib.tengo +6 -3
- package/dist/tengo/lib/exec.R.internal.lib.tengo +2 -2
- package/dist/tengo/lib/exec.R.lib.tengo +41 -41
- package/dist/tengo/lib/exec.descriptor.lib.tengo +3 -3
- package/dist/tengo/lib/exec.internal.lib.tengo +41 -41
- package/dist/tengo/lib/exec.lib.tengo +289 -289
- package/dist/tengo/lib/exec.limits.lib.tengo +49 -49
- package/dist/tengo/lib/exec.monetization.lib.tengo +1 -1
- package/dist/tengo/lib/exec.monetization_internal.lib.tengo +38 -38
- package/dist/tengo/lib/exec.package.lib.tengo +53 -53
- package/dist/tengo/lib/exec.python.internal.lib.tengo +1 -1
- package/dist/tengo/lib/exec.python.lib.tengo +37 -37
- package/dist/tengo/lib/exec.runcmd.lib.tengo +138 -138
- package/dist/tengo/lib/exec.runenv.lib.tengo +18 -18
- package/dist/tengo/lib/exec.stream.lib.tengo +25 -25
- package/dist/tengo/lib/feats.lib.tengo +3 -3
- package/dist/tengo/lib/file.internal.lib.tengo +31 -31
- package/dist/tengo/lib/file.lib.tengo +29 -29
- package/dist/tengo/lib/ll.get-future-field-default.lib.tengo +137 -0
- package/dist/tengo/lib/ll.lib.tengo +129 -129
- package/dist/tengo/lib/maps.lib.tengo +38 -38
- package/dist/tengo/lib/objects.lib.tengo +6 -6
- package/dist/tengo/lib/oop.lib.tengo +11 -11
- package/dist/tengo/lib/path.lib.tengo +60 -60
- package/dist/tengo/lib/pframes.builder.lib.tengo +3 -3
- package/dist/tengo/lib/pframes.constants.lib.tengo +20 -20
- package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +5 -5
- package/dist/tengo/lib/pframes.lib.tengo +206 -198
- package/dist/tengo/lib/pframes.ll.lib.tengo +59 -59
- package/dist/tengo/lib/pframes.pcolumn.lib.tengo +18 -18
- package/dist/tengo/lib/pframes.remove-nulls.lib.tengo +36 -0
- package/dist/tengo/lib/pframes.spec.lib.tengo +83 -83
- package/dist/tengo/lib/pframes.util.lib.tengo +176 -176
- package/dist/tengo/lib/pframes.xsv-import-file.lib.tengo +160 -0
- package/dist/tengo/lib/pframes.xsv.lib.tengo +84 -167
- package/dist/tengo/lib/render.lib.tengo +100 -45
- package/dist/tengo/lib/sets.lib.tengo +44 -44
- package/dist/tengo/lib/slices.lib.tengo +126 -126
- package/dist/tengo/lib/smart.lib.tengo +654 -507
- package/dist/tengo/lib/test.lib.tengo +120 -120
- package/dist/tengo/lib/tpl.lib.tengo +206 -170
- package/dist/tengo/lib/tpl.state-await.lib.tengo +17 -17
- package/dist/tengo/lib/tpl.util.lib.tengo +5 -5
- package/dist/tengo/lib/units.lib.tengo +2 -2
- package/dist/tengo/lib/validation.lib.tengo +130 -130
- package/dist/tengo/lib/waiter.lib.tengo +13 -13
- package/dist/tengo/lib/workdir.lib.tengo +126 -126
- package/dist/tengo/lib/workdir.proc.lib.tengo +47 -47
- package/dist/tengo/lib/workdir.save.lib.tengo +53 -53
- package/dist/tengo/lib/workflow.bobject.lib.tengo +11 -11
- package/dist/tengo/lib/workflow.bquery.lib.tengo +40 -40
- package/dist/tengo/lib/workflow.constants.lib.tengo +1 -1
- package/dist/tengo/lib/workflow.context.lib.tengo +16 -16
- package/dist/tengo/lib/workflow.lib.tengo +76 -76
- package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
- package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
- package/dist/tengo/tpl/ll.get-field.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.process-pcolumn-data.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.remove-nulls.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-import-if-not-null.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
- package/dist/tengo/tpl/waiter.waiter.plj.gz +0 -0
- package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
- package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
- package/package.json +2 -2
- package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
4
|
|
|
5
5
|
tx := import("tx")
|
|
6
6
|
ll := import("@platforma-sdk/workflow-tengo:ll")
|
|
@@ -11,120 +11,128 @@ maps := import("@platforma-sdk/workflow-tengo:maps")
|
|
|
11
11
|
json := import("json")
|
|
12
12
|
times := import("times")
|
|
13
13
|
constants := import("@platforma-sdk/workflow-tengo:constants")
|
|
14
|
+
ffDefault := import("@platforma-sdk/workflow-tengo:ll.get-future-field-default")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
14
19
|
|
|
15
|
-
//////////////// definitions ////////////////
|
|
16
20
|
|
|
17
|
-
/**
|
|
18
|
-
* A read-only wrapper object around raw platforma resource
|
|
19
|
-
*/
|
|
20
21
|
resource := undefined
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
25
26
|
field := undefined
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
30
31
|
resourceBuilder := undefined
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
37
38
|
structBuilder := undefined
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
42
43
|
mapBuilder := undefined
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
47
48
|
ephemeralMapBuilder := undefined
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
54
55
|
ephemeralBuilder := undefined
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
createNullResource := undefined
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
62
70
|
createValueResource := undefined
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
69
77
|
createJsonResource := undefined
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
77
85
|
createMapResource := undefined
|
|
78
86
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
85
93
|
createBinaryMapResource := undefined
|
|
86
94
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
93
101
|
createBlobMapResource := undefined
|
|
94
102
|
|
|
95
|
-
////////////////// helpers ///////////////////////////
|
|
96
103
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
100
108
|
isResource := func(f) {
|
|
101
109
|
return ll.isStrict(f) && maps.containsKey(f, "_type") && f["_type"] == "resource"
|
|
102
110
|
}
|
|
103
111
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
107
115
|
isField := func(f) {
|
|
108
116
|
return ll.isStrict(f) && maps.containsKey(f, "_type") && f["_type"] == "field"
|
|
109
117
|
}
|
|
110
118
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
114
122
|
isReference := func(f) {
|
|
115
123
|
return isField(f) || isResource(f)
|
|
116
124
|
}
|
|
117
125
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
128
136
|
_getFutureField := func(from, name, fieldType, isEph) {
|
|
129
137
|
ll.assert(isReference(from), "'from' must be either a resource or a field, got: %#v", from)
|
|
130
138
|
|
|
@@ -134,9 +142,80 @@ _getFutureField := func(from, name, fieldType, isEph) {
|
|
|
134
142
|
|
|
135
143
|
return field(futureField.ResultFID)
|
|
136
144
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
_buildFutureField := func(resourceOrField, nameOrPath, ...eph) {
|
|
160
|
+
globalIsEph := undefined
|
|
161
|
+
if len(eph) > 0 && is_bool(eph[0]) {
|
|
162
|
+
globalIsEph = eph[0]
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
optional := false
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
processSingleElement := func(resource, element) {
|
|
170
|
+
|
|
171
|
+
fieldType := "input"
|
|
172
|
+
fieldName := undefined
|
|
173
|
+
isEph := globalIsEph
|
|
174
|
+
|
|
175
|
+
if is_map(element) {
|
|
176
|
+
if !is_undefined(globalIsEph) {
|
|
177
|
+
ll.panic("global eph is not supported for structural path elements")
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if !is_undefined(element.type) {
|
|
181
|
+
fieldType = element.type
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
fieldName = element.name
|
|
185
|
+
optional = optional || element.optional
|
|
186
|
+
isEph = element.eph
|
|
187
|
+
} else {
|
|
188
|
+
fieldName = element
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if optional {
|
|
192
|
+
return resource.getFutureFieldOptional(fieldName, fieldType, isEph)
|
|
193
|
+
} else {
|
|
194
|
+
return resource.getFutureField(fieldName, fieldType, isEph)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if is_array(nameOrPath) {
|
|
199
|
+
current := resourceOrField
|
|
200
|
+
for i, pathElement in nameOrPath {
|
|
201
|
+
current = processSingleElement(current, pathElement)
|
|
202
|
+
}
|
|
203
|
+
return current
|
|
204
|
+
} else {
|
|
205
|
+
return processSingleElement(resourceOrField, nameOrPath)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
_getFutureInputField := func(resourceOrField, nameOrPath, ...eph) {
|
|
213
|
+
return _buildFutureField(resourceOrField, nameOrPath, eph...)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
140
219
|
isMapResource := func(r) {
|
|
141
220
|
return isResource(r) && (
|
|
142
221
|
r.info().Type.Name == constants.RTYPE_MAP.Name ||
|
|
@@ -144,38 +223,45 @@ isMapResource := func(r) {
|
|
|
144
223
|
|
|
145
224
|
}
|
|
146
225
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
150
229
|
isEphMapResource := func(r) {
|
|
151
230
|
return isResource(r) && r.info().Type.Name == constants.RTYPE_MAP_EPH.Name
|
|
152
231
|
}
|
|
153
232
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
|
|
157
236
|
isLockedEphMapResource := func(r) {
|
|
158
237
|
return isEphMapResource(r) && r.info().InputsLocked
|
|
159
238
|
}
|
|
160
239
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
164
243
|
isAnyMapResource := func(r) {
|
|
165
244
|
return isMapResource(r) || isEphMapResource(r)
|
|
166
245
|
}
|
|
167
246
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
171
250
|
isJsonResource := func(r) {
|
|
172
251
|
return isResource(r) && r.info().Type.Name == constants.RTYPE_JSON.Name
|
|
173
252
|
}
|
|
174
253
|
|
|
175
|
-
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
isNullResource := func(r) {
|
|
258
|
+
return isResource(r) && r.info().Type.Name == constants.RTYPE_NULL.Name
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
|
|
176
262
|
_hasReferenceValues := func(object) {
|
|
177
263
|
if isReference(object) {
|
|
178
|
-
|
|
264
|
+
|
|
179
265
|
return true
|
|
180
266
|
} else if ll.isMap(object) {
|
|
181
267
|
for _, v in object {
|
|
@@ -193,17 +279,17 @@ _hasReferenceValues := func(object) {
|
|
|
193
279
|
return false
|
|
194
280
|
}
|
|
195
281
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
200
286
|
_toRefOrJson := func(object) {
|
|
201
287
|
if isReference(object) {
|
|
202
|
-
|
|
288
|
+
|
|
203
289
|
return object
|
|
204
290
|
} else if ll.isMap(object) {
|
|
205
291
|
|
|
206
|
-
|
|
292
|
+
|
|
207
293
|
if !_hasReferenceValues(object) {
|
|
208
294
|
return createJsonResource(object)
|
|
209
295
|
}
|
|
@@ -216,7 +302,7 @@ _toRefOrJson := func(object) {
|
|
|
216
302
|
return mb.build()
|
|
217
303
|
} else if is_array(object) {
|
|
218
304
|
|
|
219
|
-
|
|
305
|
+
|
|
220
306
|
ll.assert(!_hasReferenceValues(object), "array can't contain references")
|
|
221
307
|
|
|
222
308
|
return createJsonResource(object)
|
|
@@ -229,11 +315,11 @@ resourceTypesEqual := func(rType1, rType2) {
|
|
|
229
315
|
return rType1.Name == rType2.Name && rType1.Version == rType2.Version
|
|
230
316
|
}
|
|
231
317
|
|
|
232
|
-
////////////////// implementation ///////////////////////////
|
|
233
318
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
237
323
|
resource = func(r) {
|
|
238
324
|
self := undefined
|
|
239
325
|
strictSelf := undefined
|
|
@@ -255,47 +341,47 @@ resource = func(r) {
|
|
|
255
341
|
self = {
|
|
256
342
|
_type: "resource",
|
|
257
343
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
|
|
261
347
|
id: id,
|
|
262
348
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
|
|
282
368
|
info: func() {
|
|
283
369
|
return tx.getResource(self.id)
|
|
284
370
|
},
|
|
285
371
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
|
|
292
378
|
checkResourceType: func(expectedType) {
|
|
293
379
|
return resourceTypesEqual(self.info().Type, expectedType)
|
|
294
380
|
},
|
|
295
381
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
|
|
299
385
|
isReady: func() {
|
|
300
386
|
return self.info().ResourceReady
|
|
301
387
|
},
|
|
@@ -304,20 +390,20 @@ resource = func(r) {
|
|
|
304
390
|
resourceInfo := self.info()
|
|
305
391
|
|
|
306
392
|
if !maps.containsKey(resourceInfo, "Features") {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
310
396
|
return true
|
|
311
397
|
}
|
|
312
398
|
|
|
313
399
|
return resourceInfo.Features.ephemeral
|
|
314
400
|
},
|
|
315
401
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
|
|
321
407
|
getData: func() {
|
|
322
408
|
if self.hasError() {
|
|
323
409
|
ll.panic("resource has errors: ", self.info())
|
|
@@ -325,31 +411,31 @@ resource = func(r) {
|
|
|
325
411
|
return self.info().Data;
|
|
326
412
|
},
|
|
327
413
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
331
417
|
getDataAsJson: func() {
|
|
332
418
|
return json.decode(self.getData());
|
|
333
419
|
},
|
|
334
420
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
|
|
338
424
|
hasError: func() {
|
|
339
425
|
return self._hasField("OneTimeWritables", "resourceError")
|
|
340
426
|
},
|
|
341
427
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
|
|
346
432
|
hasInputErrors: func() {
|
|
347
433
|
return self.info().HasErrors
|
|
348
434
|
},
|
|
349
435
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
|
|
353
439
|
getError: func() {
|
|
354
440
|
if !self.info().HasErrors {
|
|
355
441
|
ll.panic("no error set in resource")
|
|
@@ -361,29 +447,29 @@ resource = func(r) {
|
|
|
361
447
|
return ll.fromStrict(self.info()[fieldMapName])[fieldName] != undefined
|
|
362
448
|
},
|
|
363
449
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
|
|
369
455
|
hasInputField: func(name) {
|
|
370
456
|
return self._hasField("Inputs", name)
|
|
371
457
|
},
|
|
372
458
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
|
|
378
464
|
hasOutputField: func(name) {
|
|
379
465
|
return self._hasField("Outputs", name)
|
|
380
466
|
},
|
|
381
467
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
|
|
387
473
|
hasField: func(name) {
|
|
388
474
|
return self._hasField("Inputs", name) ||
|
|
389
475
|
self._hasField("Outputs", name) ||
|
|
@@ -391,11 +477,11 @@ resource = func(r) {
|
|
|
391
477
|
self._hasField("OneTimeWritables", name)
|
|
392
478
|
},
|
|
393
479
|
|
|
394
|
-
|
|
480
|
+
|
|
395
481
|
_inputs: undefined,
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
|
|
399
485
|
inputs: func() {
|
|
400
486
|
if self._inputs == undefined {
|
|
401
487
|
info := self.info()
|
|
@@ -408,11 +494,11 @@ resource = func(r) {
|
|
|
408
494
|
return self._inputs
|
|
409
495
|
},
|
|
410
496
|
|
|
411
|
-
|
|
497
|
+
|
|
412
498
|
_outputs: undefined,
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
416
502
|
outputs: func() {
|
|
417
503
|
if(self._outputs == undefined) {
|
|
418
504
|
info := self.info()
|
|
@@ -425,11 +511,11 @@ resource = func(r) {
|
|
|
425
511
|
return self._outputs
|
|
426
512
|
},
|
|
427
513
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
|
|
433
519
|
getField: func(name) {
|
|
434
520
|
if(!self.hasField(name)) {
|
|
435
521
|
ll.panic("field %v is not found", name)
|
|
@@ -438,59 +524,70 @@ resource = func(r) {
|
|
|
438
524
|
return field(ll.fieldId(self.id, name))
|
|
439
525
|
},
|
|
440
526
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
|
|
451
537
|
getFutureField: func(name, fieldType, ...eph) {
|
|
452
538
|
isEph := strictSelf.isEphemeral()
|
|
453
|
-
if len(eph) > 0 {
|
|
539
|
+
if len(eph) > 0 && is_bool(eph[0]) {
|
|
454
540
|
isEph = eph[0]
|
|
455
541
|
}
|
|
456
542
|
return _getFutureField(strictSelf, name, fieldType, isEph)
|
|
457
543
|
},
|
|
458
544
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
getFutureFieldOptional: func(name, fieldType, ...eph) {
|
|
469
557
|
isEph := strictSelf.isEphemeral()
|
|
470
|
-
if len(eph) > 0 {
|
|
558
|
+
if len(eph) > 0 && is_bool(eph[0]) {
|
|
471
559
|
isEph = eph[0]
|
|
472
560
|
}
|
|
473
561
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
for name in nameOrPath {
|
|
477
|
-
current = current.getFutureField(name, "input", isEph)
|
|
478
|
-
}
|
|
479
|
-
return current
|
|
480
|
-
} else {
|
|
481
|
-
return self.getFutureField(nameOrPath, "input", isEph)
|
|
482
|
-
}
|
|
562
|
+
fieldId := ffDefault.getFutureFieldWithDefault(self.id, name, fieldType, isEph)
|
|
563
|
+
return field(fieldId)
|
|
483
564
|
},
|
|
484
565
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
getFutureInputField: func(nameOrPath, ...eph) {
|
|
579
|
+
return _getFutureInputField(strictSelf, nameOrPath, eph...)
|
|
580
|
+
},
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
|
|
494
591
|
getFutureOutputField: func(name, ...eph) {
|
|
495
592
|
isEph := strictSelf.isEphemeral()
|
|
496
593
|
if len(eph) > 0 {
|
|
@@ -498,52 +595,66 @@ resource = func(r) {
|
|
|
498
595
|
}
|
|
499
596
|
|
|
500
597
|
if !feats.pureFutureFields && !isEph {
|
|
501
|
-
|
|
502
|
-
|
|
598
|
+
|
|
599
|
+
|
|
503
600
|
return self.getFutureField(name, "output", true).expectNonEphemeral()
|
|
504
601
|
}
|
|
505
602
|
|
|
506
603
|
return self.getFutureField(name, "output", isEph)
|
|
507
604
|
},
|
|
508
605
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
buildFutureField: func(nameOrPath) {
|
|
617
|
+
return _buildFutureField(self, nameOrPath)
|
|
618
|
+
},
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
|
|
514
625
|
get: func(name) {
|
|
515
626
|
return self.getField(name).getValue()
|
|
516
627
|
},
|
|
517
628
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
|
|
525
636
|
kvGet: func(key) {
|
|
526
637
|
return tx.resourceKeyValueGet(self.id, key)
|
|
527
638
|
},
|
|
528
639
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
|
|
536
647
|
kvSet: func(key, value) {
|
|
537
648
|
tx.resourceKeyValueSet(self.id, key, value)
|
|
538
649
|
},
|
|
539
650
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
547
658
|
kvGetAsString: func(key) {
|
|
548
659
|
value := tx.resourceKeyValueGet(self.id, key)
|
|
549
660
|
if is_undefined(value) {
|
|
@@ -553,13 +664,13 @@ resource = func(r) {
|
|
|
553
664
|
}
|
|
554
665
|
},
|
|
555
666
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
|
|
563
674
|
kvGetAsJson: func(key) {
|
|
564
675
|
bytes := self.kvGet(key)
|
|
565
676
|
if is_undefined(bytes){
|
|
@@ -569,12 +680,12 @@ resource = func(r) {
|
|
|
569
680
|
}
|
|
570
681
|
},
|
|
571
682
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
|
|
578
689
|
kvSetJson: func(key, value) {
|
|
579
690
|
self.kvSet(key, json.encode(value))
|
|
580
691
|
}
|
|
@@ -598,77 +709,77 @@ field = func(f) {
|
|
|
598
709
|
self = {
|
|
599
710
|
_type: "field",
|
|
600
711
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
|
|
608
719
|
id: id,
|
|
609
720
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
|
|
613
724
|
name: func() {
|
|
614
725
|
return self.id.Name
|
|
615
726
|
},
|
|
616
727
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
|
|
620
731
|
resource: func() {
|
|
621
732
|
return resource(self.id.ResourceID)
|
|
622
733
|
},
|
|
623
734
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
|
|
634
745
|
info: func() {
|
|
635
746
|
return tx.getField(self.id)
|
|
636
747
|
},
|
|
637
748
|
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
|
|
641
752
|
isSet: func() {
|
|
642
753
|
return self.info().IsSet
|
|
643
754
|
},
|
|
644
755
|
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
|
|
648
759
|
isValueSet: func() {
|
|
649
760
|
return self.info().Value != 0
|
|
650
761
|
},
|
|
651
762
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
|
|
655
766
|
isErrorSet: func() {
|
|
656
767
|
return self.info().Error != 0
|
|
657
768
|
},
|
|
658
769
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
|
|
665
776
|
isEphemeral: func() {
|
|
666
777
|
fieldInfo := self.info()
|
|
667
778
|
|
|
668
779
|
if !maps.containsKey(fieldInfo, "Features") {
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
|
|
672
783
|
return true
|
|
673
784
|
}
|
|
674
785
|
|
|
@@ -687,12 +798,12 @@ field = func(f) {
|
|
|
687
798
|
return rr
|
|
688
799
|
},
|
|
689
800
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
|
|
696
807
|
setCache: func(time) {
|
|
697
808
|
ll.assert(is_int(time) && time >= times.millisecond,
|
|
698
809
|
"smart.field.setCache: cache time must be an integer >= millisecond. Did you forget to import a standard tengo library 'times'?")
|
|
@@ -701,62 +812,62 @@ field = func(f) {
|
|
|
701
812
|
return self
|
|
702
813
|
},
|
|
703
814
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
|
|
709
820
|
setCacheMillis: func(millis) {
|
|
710
821
|
ll.assert(is_int(millis) && millis > 0,
|
|
711
822
|
"smart.field.setCacheMillis: cache time must be a number of milliseconds (> 0)")
|
|
712
823
|
return self.setCache(millis * times.millisecond)
|
|
713
824
|
},
|
|
714
825
|
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
|
|
720
831
|
setCacheSeconds: func(seconds) {
|
|
721
832
|
ll.assert(is_int(seconds) && seconds > 0,
|
|
722
833
|
"smart.field.setCacheSeconds: cache time must be a number of seconds (> 0)")
|
|
723
834
|
return self.setCache(seconds * times.second)
|
|
724
835
|
},
|
|
725
836
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
|
|
841
|
+
|
|
731
842
|
setCacheMinutes: func(minutes) {
|
|
732
843
|
ll.assert(is_int(minutes) && minutes > 0,
|
|
733
844
|
"smart.field.setCacheMinutes: cache time must be a number of minutes (> 0)")
|
|
734
845
|
return self.setCache(minutes * times.minute)
|
|
735
846
|
},
|
|
736
847
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
|
|
742
853
|
setCacheHours: func(hours) {
|
|
743
854
|
ll.assert(is_int(hours) && hours > 0, "smart.field.setCacheHours: cache time must be a number of hours (> 0)")
|
|
744
855
|
return self.setCache(hours * times.hour)
|
|
745
856
|
},
|
|
746
857
|
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
|
|
752
863
|
setCacheDays: func(days) {
|
|
753
864
|
ll.assert(is_int(days) && days > 0, "smart.field.setCacheDays: cache time must be a number of days (> 0)")
|
|
754
865
|
return self.setCache(days * 24 * times.hour)
|
|
755
866
|
},
|
|
756
867
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
|
|
760
871
|
getValue: func() {
|
|
761
872
|
if self.isErrorSet() {
|
|
762
873
|
err := self.getError().getDataAsJson()
|
|
@@ -771,36 +882,36 @@ field = func(f) {
|
|
|
771
882
|
return resource(self.info().Value)
|
|
772
883
|
},
|
|
773
884
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
|
|
777
888
|
getError: func() {
|
|
778
889
|
return resource(self.info().Error)
|
|
779
890
|
},
|
|
780
891
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
|
|
786
897
|
setJson: func(value) {
|
|
787
898
|
self.set(createJsonResource(value))
|
|
788
899
|
},
|
|
789
900
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
795
906
|
setMap: func(keyToValue) {
|
|
796
907
|
self.set(createMapResource(keyToValue))
|
|
797
908
|
},
|
|
798
909
|
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
910
|
+
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
804
915
|
set: func(reference) {
|
|
805
916
|
ll.assert(!self.isSet(), "field ", self.name(), " is already set")
|
|
806
917
|
|
|
@@ -813,12 +924,12 @@ field = func(f) {
|
|
|
813
924
|
}
|
|
814
925
|
},
|
|
815
926
|
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
|
|
931
|
+
|
|
932
|
+
|
|
822
933
|
setRefOrJson: func(refOrJson) {
|
|
823
934
|
if is_undefined(refOrJson) {
|
|
824
935
|
ll.panic("attempt to assign undefined value to field %v", self.name())
|
|
@@ -826,66 +937,77 @@ field = func(f) {
|
|
|
826
937
|
self.set(_toRefOrJson(refOrJson))
|
|
827
938
|
},
|
|
828
939
|
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
940
|
+
|
|
941
|
+
|
|
942
|
+
|
|
832
943
|
getValueAsJson: func() {
|
|
833
944
|
return self.getValue().getDataAsJson()
|
|
834
945
|
},
|
|
835
946
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
|
|
952
|
+
|
|
953
|
+
|
|
954
|
+
|
|
955
|
+
|
|
956
|
+
|
|
846
957
|
getFutureField: func(name, fieldType, ...eph) {
|
|
847
958
|
isEph := strictSelf.isEphemeral()
|
|
848
|
-
if len(eph) > 0 {
|
|
959
|
+
if len(eph) > 0 && is_bool(eph[0]) {
|
|
849
960
|
isEph = eph[0]
|
|
850
961
|
}
|
|
851
962
|
return _getFutureField(strictSelf, name, fieldType, isEph)
|
|
852
963
|
},
|
|
853
964
|
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
|
|
976
|
+
getFutureFieldOptional: func(name, fieldType, ...eph) {
|
|
864
977
|
isEph := strictSelf.isEphemeral()
|
|
865
|
-
if len(eph) > 0 {
|
|
978
|
+
if len(eph) > 0 && is_bool(eph[0]) {
|
|
866
979
|
isEph = eph[0]
|
|
867
980
|
}
|
|
868
981
|
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
982
|
+
fieldId := ffDefault.getFutureFieldWithDefault(self.id, name, fieldType, isEph)
|
|
983
|
+
return field(fieldId)
|
|
984
|
+
},
|
|
985
|
+
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
getFutureInputField: func(nameOrPath, ...eph) {
|
|
999
|
+
return _getFutureInputField(strictSelf, nameOrPath, eph...)
|
|
878
1000
|
},
|
|
879
1001
|
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
|
|
1009
|
+
|
|
1010
|
+
|
|
889
1011
|
getFutureOutputField: func(name, ...eph) {
|
|
890
1012
|
isEph := strictSelf.isEphemeral()
|
|
891
1013
|
if len(eph) > 0 {
|
|
@@ -893,12 +1015,26 @@ field = func(f) {
|
|
|
893
1015
|
}
|
|
894
1016
|
|
|
895
1017
|
if !feats.pureFutureFields && !isEph {
|
|
896
|
-
|
|
897
|
-
|
|
1018
|
+
|
|
1019
|
+
|
|
898
1020
|
return self.getFutureField(name, "output", true).expectNonEphemeral()
|
|
899
1021
|
}
|
|
900
1022
|
|
|
901
1023
|
return self.getFutureField(name, "output", isEph)
|
|
1024
|
+
},
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
|
|
1032
|
+
|
|
1033
|
+
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
buildFutureField: func(nameOrPath) {
|
|
1037
|
+
return _buildFutureField(strictSelf, nameOrPath)
|
|
902
1038
|
}
|
|
903
1039
|
}
|
|
904
1040
|
|
|
@@ -908,29 +1044,29 @@ field = func(f) {
|
|
|
908
1044
|
}
|
|
909
1045
|
|
|
910
1046
|
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
1047
|
+
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
|
|
916
1052
|
resourceBuilder = func(r) {
|
|
917
1053
|
super := resource(r)
|
|
918
1054
|
|
|
919
1055
|
self := undefined
|
|
920
1056
|
|
|
921
|
-
|
|
1057
|
+
|
|
922
1058
|
built := false
|
|
923
1059
|
assertNotBuilt := func() {
|
|
924
1060
|
ll.assert(!built, "builder methods must not be used after a build() was called")
|
|
925
1061
|
}
|
|
926
1062
|
|
|
927
1063
|
self = ll.toStrict(oop.inherit(super, {
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
|
|
934
1070
|
createField: func(name, fieldType) {
|
|
935
1071
|
assertNotBuilt()
|
|
936
1072
|
fid := ll.fieldId(super.id, name)
|
|
@@ -938,92 +1074,92 @@ resourceBuilder = func(r) {
|
|
|
938
1074
|
return field(fid)
|
|
939
1075
|
},
|
|
940
1076
|
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
|
|
947
1083
|
createServiceField: func(name) {
|
|
948
1084
|
assertNotBuilt()
|
|
949
1085
|
return self.createField(name, constants.FTYPE_SERVICE)
|
|
950
1086
|
},
|
|
951
1087
|
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
|
|
957
1093
|
createInputField: func(name) {
|
|
958
1094
|
assertNotBuilt()
|
|
959
1095
|
return self.createField(name, constants.FTYPE_INPUT)
|
|
960
1096
|
},
|
|
961
1097
|
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
|
|
967
1103
|
createOutputField: func(name) {
|
|
968
1104
|
assertNotBuilt()
|
|
969
1105
|
return self.createField(name, constants.FTYPE_OUTPUT)
|
|
970
1106
|
},
|
|
971
1107
|
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
1108
|
+
|
|
1109
|
+
|
|
1110
|
+
|
|
975
1111
|
lockOutputs: func() {
|
|
976
1112
|
assertNotBuilt()
|
|
977
1113
|
tx.lockOutputs(super.id)
|
|
978
1114
|
},
|
|
979
1115
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
1116
|
+
|
|
1117
|
+
|
|
1118
|
+
|
|
983
1119
|
lockInputs: func() {
|
|
984
1120
|
assertNotBuilt()
|
|
985
1121
|
tx.lockInputs(super.id)
|
|
986
1122
|
},
|
|
987
1123
|
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
|
|
991
1127
|
lock: func() {
|
|
992
1128
|
assertNotBuilt()
|
|
993
1129
|
self.lockInputs()
|
|
994
1130
|
self.lockOutputs()
|
|
995
1131
|
},
|
|
996
1132
|
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1000
1136
|
lockAndBuild: func() {
|
|
1001
1137
|
self.lock()
|
|
1002
1138
|
built = true
|
|
1003
1139
|
return super
|
|
1004
1140
|
},
|
|
1005
1141
|
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
|
|
1009
1145
|
lockOutputsAndBuild: func() {
|
|
1010
1146
|
self.lockOutputs()
|
|
1011
1147
|
built = true
|
|
1012
1148
|
return super
|
|
1013
1149
|
},
|
|
1014
1150
|
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
|
|
1018
1154
|
lockInputsAndBuild: func() {
|
|
1019
1155
|
self.lockInputs()
|
|
1020
1156
|
built = true
|
|
1021
1157
|
return super
|
|
1022
1158
|
},
|
|
1023
1159
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1027
1163
|
buildUnlocked: func() {
|
|
1028
1164
|
built = true
|
|
1029
1165
|
return super
|
|
@@ -1033,12 +1169,12 @@ resourceBuilder = func(r) {
|
|
|
1033
1169
|
return self
|
|
1034
1170
|
}
|
|
1035
1171
|
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
|
|
1042
1178
|
structBuilder = func(resourceType, ...data) {
|
|
1043
1179
|
id := undefined
|
|
1044
1180
|
if len(data) > 0 {
|
|
@@ -1050,71 +1186,71 @@ structBuilder = func(resourceType, ...data) {
|
|
|
1050
1186
|
return resourceBuilder(id)
|
|
1051
1187
|
}
|
|
1052
1188
|
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1056
1192
|
_mapBuilder := func(isEph) {
|
|
1057
1193
|
builder := isEph ? ephemeralBuilder(constants.RTYPE_MAP_EPH) : structBuilder(constants.RTYPE_MAP)
|
|
1058
|
-
|
|
1194
|
+
|
|
1059
1195
|
builder.lockOutputs()
|
|
1060
1196
|
|
|
1061
1197
|
self := undefined
|
|
1062
1198
|
|
|
1063
1199
|
self = ll.toStrict(oop.inherit(builder, {
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1071
1207
|
addRef: func(key, value) {
|
|
1072
1208
|
builder.createInputField(key).set(value)
|
|
1073
1209
|
return self
|
|
1074
1210
|
},
|
|
1075
1211
|
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1083
1219
|
addJson: func(key, value) {
|
|
1084
1220
|
builder.createInputField(key).set(createJsonResource(value))
|
|
1085
1221
|
return self
|
|
1086
1222
|
},
|
|
1087
1223
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1095
1231
|
add: func(key, value) {
|
|
1096
1232
|
builder.createInputField(key).setRefOrJson(value)
|
|
1097
1233
|
return self
|
|
1098
1234
|
},
|
|
1099
1235
|
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
|
|
1108
1244
|
addService: func(key, value) {
|
|
1109
1245
|
builder.createServiceField(key).setRefOrJson(value)
|
|
1110
1246
|
return self
|
|
1111
1247
|
},
|
|
1112
1248
|
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
|
|
1118
1254
|
build: func() {
|
|
1119
1255
|
return builder.lockAndBuild()
|
|
1120
1256
|
}
|
|
@@ -1142,6 +1278,15 @@ ephemeralBuilder = func(resourceType, ...data) {
|
|
|
1142
1278
|
return resourceBuilder(id)
|
|
1143
1279
|
}
|
|
1144
1280
|
|
|
1281
|
+
createNullResource = func(...data) {
|
|
1282
|
+
ll.assert(len(data) <= 1, "can't create null resource with more than one argument")
|
|
1283
|
+
if len(data) > 0 && !is_undefined(data[0]) {
|
|
1284
|
+
return resource(tx.createValue(constants.RTYPE_NULL.Name, constants.RTYPE_NULL.Version, data[0]))
|
|
1285
|
+
} else {
|
|
1286
|
+
return resource(tx.createValue(constants.RTYPE_NULL.Name, constants.RTYPE_NULL.Version, ""))
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1145
1290
|
createValueResource = func(resourceType, data) {
|
|
1146
1291
|
ll.assert(data != undefined, "can't create resource with undefined data")
|
|
1147
1292
|
return resource(tx.createValue(resourceType.Name, resourceType.Version, data))
|
|
@@ -1150,10 +1295,10 @@ createValueResource = func(resourceType, data) {
|
|
|
1150
1295
|
createJsonResource = func(value) {
|
|
1151
1296
|
ll.assert(value != undefined, "can't create Json value from undefined")
|
|
1152
1297
|
|
|
1153
|
-
|
|
1298
|
+
|
|
1154
1299
|
|
|
1155
1300
|
ll.assert(!ll.isStrict(value), "can't encode strict map: ", value)
|
|
1156
|
-
|
|
1301
|
+
|
|
1157
1302
|
|
|
1158
1303
|
encoded := json.encode(value)
|
|
1159
1304
|
|
|
@@ -1191,6 +1336,7 @@ export ll.toStrict({
|
|
|
1191
1336
|
isAnyMapResource: isAnyMapResource,
|
|
1192
1337
|
isLockedEphMapResource: isLockedEphMapResource,
|
|
1193
1338
|
isJsonResource: isJsonResource,
|
|
1339
|
+
isNullResource: isNullResource,
|
|
1194
1340
|
resource: resource,
|
|
1195
1341
|
field: field,
|
|
1196
1342
|
resourceBuilder: resourceBuilder,
|
|
@@ -1203,5 +1349,6 @@ export ll.toStrict({
|
|
|
1203
1349
|
createMapResourceWithType: createMapResourceWithType,
|
|
1204
1350
|
createMapResource: createMapResource,
|
|
1205
1351
|
createBinaryMapResource: createBinaryMapResource,
|
|
1206
|
-
createBlobMapResource: createBlobMapResource
|
|
1352
|
+
createBlobMapResource: createBlobMapResource,
|
|
1353
|
+
createNullResource: createNullResource
|
|
1207
1354
|
})
|