@uipath/flow-tool 1.201.0-preview.115 → 1.201.0-preview.121
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/{authoring-vbbqwp0v.js → authoring-rezk32bm.js} +64 -20
- package/dist/{conversion-MQ7TJMHW-5zbdb6y2.js → conversion-W6HMHBWW-jnk9z7rw.js} +42 -34
- package/dist/{de-JT3SUGT4-msgpbdge.js → de-B2KIY5TC-81f703v3.js} +14 -5
- package/dist/{de-3RMZHIP6-1na18a74.js → de-K6MLR24N-00fjz82b.js} +474 -51
- package/dist/{de-3RMZHIP6-QW5DEMLQ-fw64syvn.js → de-K6MLR24N-5N5XGLH6-gbwpvdz4.js} +476 -53
- package/dist/{de-LVBY3VVG-tc58p3x6.js → de-WMKOGI7B-r1821wpe.js} +16 -7
- package/dist/de-XLT4QPIP-0rtw349w.js +32 -0
- package/dist/{en-JGJNQYMG-BSN3EE6C-mhg57v8h.js → en-ILA4HPE5-ALHGESZE-zrv4qss8.js} +267 -7
- package/dist/{en-JGJNQYMG-xq29xvhk.js → en-ILA4HPE5-fhwvq92r.js} +264 -4
- package/dist/{en-H54NJOH6-30ht8n64.js → en-P6PNWNTO-g1f6cjh5.js} +10 -4
- package/dist/{en-4UFXRW7N-mqabr9tf.js → en-X4DLPKLJ-dt1wtdm7.js} +17 -5
- package/dist/{es-GJOELELT-w1d3agm2.js → es-BBX4AUJX-h99fcr53.js} +14 -5
- package/dist/{es-CI4AE5B5-55sgqk64.js → es-BVPGJUWA-9gk2g9yb.js} +16 -7
- package/dist/{es-EYHYM5C4-RMLHZ2LF-s0fc3pd6.js → es-HTQSD352-YTAEDCE5-nhsbg581.js} +470 -47
- package/dist/{es-EYHYM5C4-3bajghda.js → es-HTQSD352-m9rr3f0g.js} +468 -45
- package/dist/{es-MX-AMZIGU27-5pembt6k.js → es-MX-3SP2SSV6-f20qspbr.js} +14 -5
- package/dist/{es-MX-QSQP2KWV-qvgkwvz2.js → es-MX-FOX525CG-87g500gr.js} +474 -51
- package/dist/{es-MX-QSQP2KWV-XR5DWKNF-kp7pk2s4.js → es-MX-FOX525CG-HLM27OEL-whr0t9v3.js} +476 -53
- package/dist/es-MX-OKNDG2NH-c1k1s1tg.js +32 -0
- package/dist/{es-MX-OLZNAYY5-30cmv1dx.js → es-MX-U6YL5KQX-ynwxdjr8.js} +16 -7
- package/dist/es-NQICVYSQ-aa9z3nhs.js +32 -0
- package/dist/{fr-FXFJQRD3-F5HV2VS7-pwdze89j.js → fr-54THJ4QH-IGABNGU6-fpzw2mba.js} +475 -52
- package/dist/{fr-FXFJQRD3-rfztd3e5.js → fr-54THJ4QH-d6ezjbhw.js} +473 -50
- package/dist/{fr-CCN6ZO5E-x2akzsjt.js → fr-EKTTDR7Z-bmpwp31r.js} +16 -7
- package/dist/{fr-LYFYWWCC-nn4reak0.js → fr-FSTBVVGK-t3y57xrb.js} +14 -5
- package/dist/fr-PFHIL7YZ-cxnshwa8.js +32 -0
- package/dist/index-6hp3p3eq.js +16489 -0
- package/dist/{index-w23k88b5.js → index-p50kx6jv.js} +202 -64
- package/dist/{index-hzp6y5m7.js → index-q59ephfh.js} +57 -3
- package/dist/index.js +19 -16
- package/dist/init.js +14 -11
- package/dist/{ja-IRXXIG6Q-b3att2bw.js → ja-FW33BJBW-htfk4d8t.js} +14 -5
- package/dist/{ja-G7NJYQ42-ve4gadd7.js → ja-MHUPLSWO-3qwy4jc0.js} +470 -47
- package/dist/{ja-G7NJYQ42-X76DVL7A-9p8b5115.js → ja-MHUPLSWO-CS3KE4Y3-mbtkzwd7.js} +472 -49
- package/dist/ja-P4OSE367-8ywxep9a.js +32 -0
- package/dist/{ja-O2NEV5D6-nt9rhd8c.js → ja-Y2YBTXNN-96cvy5av.js} +16 -7
- package/dist/{ko-M32WKZ3I-5td5jsw7.js → ko-PDO5AXNW-d653t4pc.js} +14 -5
- package/dist/ko-PYOS2KJP-5sbj5bp8.js +32 -0
- package/dist/{ko-7XWV2SEQ-chk3y7aj.js → ko-S33XAV26-cxf4dn2t.js} +16 -7
- package/dist/{ko-QDHECDTM-6WJAKMQI-0fpd4dqj.js → ko-XPJTXIKK-DNSW4KYQ-956vp61f.js} +469 -46
- package/dist/{ko-QDHECDTM-zmbqs9pr.js → ko-XPJTXIKK-w1hs4px7.js} +467 -44
- package/dist/{node-6xp9wf15.js → node-f062h75p.js} +11 -5
- package/dist/{node-strategy-fwj45942.js → node-strategy-8gzp67xs.js} +4 -4
- package/dist/{packager-tool-kvgt1s4z.js → packager-tool-03knb0er.js} +287 -22
- package/dist/{packager-tool-9ae2gt84.js → packager-tool-1g6958de.js} +19 -8
- package/dist/{packager-tool-vz3b1ea9.js → packager-tool-1gt6js73.js} +7 -914
- package/dist/{packager-tool-973f0r2g.js → packager-tool-1yy9x4vk.js} +17 -5
- package/dist/{packager-tool-jqtspg41.js → packager-tool-3wf3tkrc.js} +11 -5
- package/dist/packager-tool-6a7wdv5z.js +36187 -0
- package/dist/{packager-tool-mtrz8981.js → packager-tool-9x76z587.js} +140 -239
- package/dist/packager-tool-b0s5d4ek.js +10671 -0
- package/dist/{packager-tool-htc0z863.js → packager-tool-cqrsre00.js} +282 -27
- package/dist/{packager-tool-q9zrqwxw.js → packager-tool-ef2aypt3.js} +3257 -2669
- package/dist/{packager-tool-h3gpqv5a.js → packager-tool-jeh5j2xy.js} +6939 -3736
- package/dist/packager-tool-jpcm3xas.js +12 -0
- package/dist/{packager-tool-3gmj73c5.js → packager-tool-neavt1k3.js} +1 -1
- package/dist/packager-tool-nkrmjr3a.js +915 -0
- package/dist/{packager-tool-p1ts5b0h.js → packager-tool-ny53xmsd.js} +129 -49
- package/dist/{packager-tool-fr5b9qs6.js → packager-tool-pvgqbm48.js} +3 -3
- package/dist/{packager-tool-9qhez6bh.js → packager-tool-qfp49pq4.js} +964 -526
- package/dist/packager-tool-v2p6g3fd.js +41 -0
- package/dist/{packager-tool-2vme4a8e.js → packager-tool-xa2xwzrq.js} +9864 -16886
- package/dist/packager-tool.js +9 -8
- package/dist/{pt-VXJT4WUJ-nwkc9k2p.js → pt-4JEPEAST-40npwxyw.js} +471 -48
- package/dist/{pt-VXJT4WUJ-M3IR7CL5-1f2ph8gm.js → pt-4JEPEAST-JO5WN33S-ccdbdab2.js} +473 -50
- package/dist/{pt-BR-Z4J3LEEO-cf33d2zv.js → pt-BR-JO45SCNI-4kbfnzc4.js} +16 -7
- package/dist/{pt-BR-57EHXZKB-8g83gr5g.js → pt-BR-LQH3RSBB-kyb4jmcw.js} +14 -5
- package/dist/{pt-BR-SADBLGXA-WG4Q265J-w9tshygt.js → pt-BR-TV7NR3ID-PDSSHRHU-nddwzj29.js} +472 -49
- package/dist/{pt-BR-SADBLGXA-yd89fdy2.js → pt-BR-TV7NR3ID-vgd26pj1.js} +470 -47
- package/dist/pt-BR-Z3TUDJHM-n7ngej6s.js +32 -0
- package/dist/{pt-VNM2XWHA-62z625rh.js → pt-JLZYSSXX-7jth254x.js} +14 -5
- package/dist/pt-KSBWHAVQ-hd52bpsz.js +32 -0
- package/dist/{pt-CRSN3TCU-txxbbcxm.js → pt-W3NA4LIZ-f02gapvs.js} +16 -7
- package/dist/{ro-RISZ75LL-zwztp9j5.js → ro-E2EBPQGT-vn573vcr.js} +14 -5
- package/dist/{ro-7JHKFGCH-H3RYKSCL-4w49rx4m.js → ro-RKJ74FV3-QS3I6XKJ-kb31d85k.js} +475 -52
- package/dist/{ro-7JHKFGCH-hbtkeqdr.js → ro-RKJ74FV3-qn0ey39v.js} +473 -50
- package/dist/ro-VZUZTAMR-tccygznf.js +32 -0
- package/dist/{ro-WMQEVD7D-6mtq0e6b.js → ro-WLKX6HF5-fcbe2zz8.js} +16 -7
- package/dist/ru-GSCT4ARZ-3TVTUGWP-bbg6360z.js +15 -0
- package/dist/{serialization-JNQMGOXW-mj06e5pv.js → serialization-GTFWODSH-ajd6b7n2.js} +10 -8
- package/dist/services/flow-validate-service.d.ts +108 -0
- package/dist/services/node-service.d.ts +46 -0
- package/dist/services/node-validators/ceql-query-validator.d.ts +36 -10
- package/dist/services/node-validators/expression-prefix-validator.d.ts +3 -2
- package/dist/services/node-validators/index.d.ts +2 -1
- package/dist/services/project-artifacts.d.ts +14 -1
- package/dist/tool.js +17 -14
- package/dist/{tr-UCMB7W3T-xmxp2naq.js → tr-3U2W2XCA-zg3zcmq3.js} +15 -6
- package/dist/tr-W4AVRSQ4-bt3qqqdy.js +32 -0
- package/dist/{tr-Q6IHBFK7-BEUWO5CI-29rgfwjy.js → tr-X7R6GQNB-VMEZAWRJ-vdbjqw23.js} +484 -61
- package/dist/{tr-Q6IHBFK7-zs9rsm1b.js → tr-X7R6GQNB-shwv16dz.js} +482 -59
- package/dist/{tr-AUPQF34V-y3dhtj0w.js → tr-ZUUSMHER-pfn5dq1r.js} +14 -5
- package/dist/validation.js +14 -11
- package/dist/zh-CN-6YRAN57T-j7jp34ws.js +32 -0
- package/dist/{zh-CN-3BPA3WIX-JDICNKGH-m87940q5.js → zh-CN-FEZ24J4A-LSEMG63K-db8kf6rm.js} +472 -49
- package/dist/{zh-CN-3BPA3WIX-c5ts2m5v.js → zh-CN-FEZ24J4A-q5b5x20w.js} +470 -47
- package/dist/{zh-CN-2QOHEFC5-ryjb2byk.js → zh-CN-IPZYQR3P-1h76csc4.js} +16 -7
- package/dist/{zh-CN-3INOX2E5-txhr8e18.js → zh-CN-YFKQ7HBX-w98q5zqf.js} +14 -5
- package/dist/{zh-TW-UI34YLZQ-j79rg6b7.js → zh-TW-CP5PCVEJ-wvbxf7c7.js} +14 -5
- package/dist/{zh-TW-QCJEQC5S-b1v637hd.js → zh-TW-GKSCT6NW-4n1yfre0.js} +464 -41
- package/dist/{zh-TW-QCJEQC5S-DQ3454QP-y8vvrebz.js → zh-TW-GKSCT6NW-JLMWTDAF-g2smq1gm.js} +466 -43
- package/dist/zh-TW-SO2245GN-m5kh88bg.js +32 -0
- package/dist/{zh-TW-Q5QSSTS6-6y7yjbbn.js → zh-TW-YPVSQVGT-wbybwpwt.js} +16 -7
- package/package.json +2 -2
- package/dist/de-CS2KUCZ6-j5a38g9p.js +0 -20
- package/dist/es-MX-3MRZG6V4-9z56akxp.js +0 -20
- package/dist/es-QBAGOKHO-b2azze22.js +0 -20
- package/dist/fr-HVOCQCNI-1zn75qzy.js +0 -20
- package/dist/ja-VYAZOLWC-nbagzgre.js +0 -20
- package/dist/ko-EZTVBPMZ-9qq2mrrz.js +0 -20
- package/dist/packager-tool-ahm4ymrp.js +0 -12
- package/dist/packager-tool-hcdc89cf.js +0 -14010
- package/dist/pt-3TKAWGMJ-58y42w7x.js +0 -20
- package/dist/pt-BR-ASMQE3WA-9wb74cqx.js +0 -20
- package/dist/ro-A65KBZGL-qnwqqezz.js +0 -20
- package/dist/ru-GSCT4ARZ-YSDBAAM2-ha88ztsj.js +0 -15
- package/dist/tr-Z7YHMEX6-daq3vjbh.js +0 -20
- package/dist/zh-CN-W7FK4GLU-vn3n8fcq.js +0 -20
- package/dist/zh-TW-PHOEUN3F-t56cjsgw.js +0 -20
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ManifestClient,
|
|
3
3
|
buildErrorHandle,
|
|
4
|
-
findNearestParentUipxFile,
|
|
5
4
|
getConnectorInfo,
|
|
6
|
-
getLoginStatusAsync,
|
|
7
5
|
getNode,
|
|
8
6
|
isConnectorNode,
|
|
9
7
|
isKnownSdkNodeType,
|
|
10
8
|
loadRegistry,
|
|
11
9
|
readFlowWorkflow,
|
|
12
|
-
readSolutionManifest,
|
|
13
10
|
validateIntSvcNode,
|
|
14
11
|
writeFlowWorkflow
|
|
15
|
-
} from "./packager-tool-
|
|
12
|
+
} from "./packager-tool-xa2xwzrq.js";
|
|
13
|
+
import {
|
|
14
|
+
findNearestParentUipxFile,
|
|
15
|
+
getLoginStatusAsync,
|
|
16
|
+
readSolutionManifest
|
|
17
|
+
} from "./packager-tool-b0s5d4ek.js";
|
|
16
18
|
import {
|
|
17
19
|
OutputFormatter,
|
|
18
20
|
RESULTS,
|
|
19
21
|
catchError,
|
|
20
22
|
logger
|
|
21
|
-
} from "./packager-tool-
|
|
23
|
+
} from "./packager-tool-ny53xmsd.js";
|
|
22
24
|
import {
|
|
23
25
|
getFileSystem
|
|
24
26
|
} from "./packager-tool-1cb0d5e0.js";
|
|
@@ -36,7 +38,7 @@ import {
|
|
|
36
38
|
resolveWorkflowRefs,
|
|
37
39
|
runtimeMigrations,
|
|
38
40
|
runtimeVersion
|
|
39
|
-
} from "./packager-tool-
|
|
41
|
+
} from "./packager-tool-6a7wdv5z.js";
|
|
40
42
|
import {
|
|
41
43
|
EntryPointType,
|
|
42
44
|
ProjectType,
|
|
@@ -52,11 +54,12 @@ import {
|
|
|
52
54
|
instance,
|
|
53
55
|
isBlockingSeverity,
|
|
54
56
|
isExpressionValue,
|
|
57
|
+
isStartEventNode,
|
|
55
58
|
mergeBindingResources,
|
|
56
59
|
parseWorkflowJson,
|
|
57
60
|
registerFlowSchemaI18n,
|
|
58
61
|
runRules
|
|
59
|
-
} from "./packager-tool-
|
|
62
|
+
} from "./packager-tool-ef2aypt3.js";
|
|
60
63
|
|
|
61
64
|
// src/services/connector-node-types.ts
|
|
62
65
|
function isConnectorTriggerType(nodeType) {
|
|
@@ -114,7 +117,7 @@ function validateCeqlFilterShape(nodeId, detail) {
|
|
|
114
117
|
issues.push({
|
|
115
118
|
path: `nodes[${nodeId}].inputs.detail.queryParameters["$where"]`,
|
|
116
119
|
severity: "error",
|
|
117
|
-
message: 'Connector node uses OData-style `"$where"` (with leading `$`) ' + "in queryParameters. CEQL uses bare `where` — rename the key " + 'from `"$where"` to `"where"`. The leading `$` is the OData ' + "system-query-option prefix and is not recognized by " + "uipath.connector.* nodes. See uipath-maestro-flow skill — " + "
|
|
120
|
+
message: 'Connector node uses OData-style `"$where"` (with leading `$`) ' + "in queryParameters. CEQL uses bare `where` — rename the key " + 'from `"$where"` to `"where"`. The leading `$` is the OData ' + "system-query-option prefix and is not recognized by " + "uipath.connector.* nodes. See uipath-maestro-flow skill — " + 'plugins/connector/impl.md, "Hand-authored CEQL strings" ' + "(MST-9265)."
|
|
118
121
|
});
|
|
119
122
|
}
|
|
120
123
|
const queryWhere = queryParameters?.where;
|
|
@@ -126,14 +129,14 @@ function validateCeqlFilterShape(nodeId, detail) {
|
|
|
126
129
|
issues.push({
|
|
127
130
|
path: `nodes[${nodeId}].inputs.detail.savedFilterTrees.where`,
|
|
128
131
|
severity: "error",
|
|
129
|
-
message: "Connector node has `queryParameters.where` set but no " + "matching `savedFilterTrees.where` AST — neither at " + "`inputs.detail.savedFilterTrees.where` nor as " + "`essentialConfiguration.savedFilterTrees.where` inside " + "`inputs.detail.configuration`. CEQL filters must be authored " + "as both the raw filter expression (`queryParameters.where`) " + "AND a parallel canonical AST (`filters[].id` / `.operator` / " + "`.value.value`). The Studio Web canvas needs the AST to " + "render the filter UI; the runtime needs the expression. " + "Re-run `uip maestro flow node configure --detail.filter` to " + "author both. See uipath-maestro-flow skill —
|
|
132
|
+
message: "Connector node has `queryParameters.where` set but no " + "matching `savedFilterTrees.where` AST — neither at " + "`inputs.detail.savedFilterTrees.where` nor as " + "`essentialConfiguration.savedFilterTrees.where` inside " + "`inputs.detail.configuration`. CEQL filters must be authored " + "as both the raw filter expression (`queryParameters.where`) " + "AND a parallel canonical AST (`filters[].id` / `.operator` / " + "`.value.value`). The Studio Web canvas needs the AST to " + "render the filter UI; the runtime needs the expression. " + "Re-run `uip maestro flow node configure --detail.filter` to " + "author both. See uipath-maestro-flow skill — " + 'plugins/connector/impl.md, "Hand-authored CEQL strings" ' + "(MST-9265)."
|
|
130
133
|
});
|
|
131
134
|
}
|
|
132
135
|
if (savedWhereAuthored && !queryWhereAuthored) {
|
|
133
136
|
issues.push({
|
|
134
137
|
path: `nodes[${nodeId}].inputs.detail.queryParameters.where`,
|
|
135
138
|
severity: "error",
|
|
136
|
-
message: "Connector node has `savedFilterTrees.where` AST but no " + "matching `queryParameters.where` expression. CEQL filters " + "must be authored on both keys in parallel — the runtime " + "evaluates `queryParameters.where`, not the AST. See " +
|
|
139
|
+
message: "Connector node has `savedFilterTrees.where` AST but no " + "matching `queryParameters.where` expression. CEQL filters " + "must be authored on both keys in parallel — the runtime " + "evaluates `queryParameters.where`, not the AST. See " + 'uipath-maestro-flow skill — plugins/connector/impl.md, "Hand-authored ' + 'CEQL strings" (MST-9265).'
|
|
137
140
|
});
|
|
138
141
|
}
|
|
139
142
|
return issues;
|
|
@@ -201,438 +204,80 @@ function shellSingleQuote(value) {
|
|
|
201
204
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
202
205
|
}
|
|
203
206
|
|
|
204
|
-
//
|
|
205
|
-
var
|
|
206
|
-
var
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
"
|
|
211
|
-
"
|
|
212
|
-
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
var
|
|
223
|
-
var
|
|
224
|
-
var
|
|
225
|
-
|
|
226
|
-
var
|
|
227
|
-
var
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
207
|
+
// ../../node_modules/acorn/dist/acorn.mjs
|
|
208
|
+
var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
|
|
209
|
+
var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489];
|
|
210
|
+
var nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ--ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・";
|
|
211
|
+
var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-Ა-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ--ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
|
|
212
|
+
var reservedWords = {
|
|
213
|
+
3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
|
|
214
|
+
5: "class enum extends super const export import",
|
|
215
|
+
6: "enum",
|
|
216
|
+
strict: "implements interface let package private protected public static yield",
|
|
217
|
+
strictBind: "eval arguments"
|
|
218
|
+
};
|
|
219
|
+
var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
|
|
220
|
+
var keywords$1 = {
|
|
221
|
+
5: ecma5AndLessKeywords,
|
|
222
|
+
"5module": ecma5AndLessKeywords + " export import",
|
|
223
|
+
6: ecma5AndLessKeywords + " const class extends export import super"
|
|
224
|
+
};
|
|
225
|
+
var keywordRelationalOperator = /^in(stanceof)?$/;
|
|
226
|
+
var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
|
|
227
|
+
var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
|
|
228
|
+
function isInAstralSet(code, set) {
|
|
229
|
+
var pos = 65536;
|
|
230
|
+
for (var i = 0;i < set.length; i += 2) {
|
|
231
|
+
pos += set[i];
|
|
232
|
+
if (pos > code) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
pos += set[i + 1];
|
|
236
|
+
if (pos >= code) {
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
235
239
|
}
|
|
236
|
-
|
|
237
|
-
if (!template)
|
|
238
|
-
return;
|
|
239
|
-
return {
|
|
240
|
-
body: template[1],
|
|
241
|
-
wrap: (body) => `=js:\`${body}\``
|
|
242
|
-
};
|
|
240
|
+
return false;
|
|
243
241
|
}
|
|
244
|
-
function
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return [];
|
|
248
|
-
const fieldNames = [];
|
|
249
|
-
const fixedBody = ceql.body.replace(CEQL_QUOTED_FIELD_RE, (match, fieldName) => {
|
|
250
|
-
fieldNames.push(fieldName);
|
|
251
|
-
return match.replace(`'${fieldName}'`, () => fieldName);
|
|
252
|
-
});
|
|
253
|
-
if (fieldNames.length === 0)
|
|
254
|
-
return [];
|
|
255
|
-
let fixedValue = ceql.wrap(fixedBody);
|
|
256
|
-
if (!fixedValue.trim().startsWith("=js:") && fixedValue.includes("${")) {
|
|
257
|
-
fixedValue = `=js:\`${fixedValue}\``;
|
|
242
|
+
function isIdentifierStart(code, astral) {
|
|
243
|
+
if (code < 65) {
|
|
244
|
+
return code === 36;
|
|
258
245
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
function ceqlQuotedFieldMessage(issue) {
|
|
262
|
-
return `Quoted token '${issue.fieldName}' where CEQL expects a bare field name — ` + "Integration Service rejects this with [102003]. " + `Write "${issue.fixedValue}" instead. ` + "See uipath-maestro-flow skill — ceql-filters reference.";
|
|
263
|
-
}
|
|
264
|
-
function scanContainerForCeqlQuotedFields(obj, path, severity, issues) {
|
|
265
|
-
if (typeof obj === "string") {
|
|
266
|
-
for (const issue of findCeqlQuotedFieldNames(obj)) {
|
|
267
|
-
issues.push({
|
|
268
|
-
path,
|
|
269
|
-
severity,
|
|
270
|
-
message: ceqlQuotedFieldMessage(issue)
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
return;
|
|
246
|
+
if (code < 91) {
|
|
247
|
+
return true;
|
|
274
248
|
}
|
|
275
|
-
if (
|
|
276
|
-
|
|
277
|
-
scanContainerForCeqlQuotedFields(obj[i], `${path}[${i}]`, severity, issues);
|
|
278
|
-
}
|
|
279
|
-
return;
|
|
249
|
+
if (code < 97) {
|
|
250
|
+
return code === 95;
|
|
280
251
|
}
|
|
281
|
-
if (
|
|
282
|
-
|
|
283
|
-
scanContainerForCeqlQuotedFields(value, `${path}.${key}`, severity, issues);
|
|
284
|
-
}
|
|
252
|
+
if (code < 123) {
|
|
253
|
+
return true;
|
|
285
254
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
id: "ceql-query",
|
|
289
|
-
appliesTo: (node) => {
|
|
290
|
-
const t = node.type;
|
|
291
|
-
if (!t)
|
|
292
|
-
return false;
|
|
293
|
-
if (isEventDrivenConnectorType(t))
|
|
294
|
-
return false;
|
|
295
|
-
return t.startsWith("uipath.connector.");
|
|
296
|
-
},
|
|
297
|
-
validate: (node, context) => {
|
|
298
|
-
const rawDetail = node.inputs?.detail;
|
|
299
|
-
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
300
|
-
return [];
|
|
301
|
-
}
|
|
302
|
-
const queryParameters = rawDetail.queryParameters;
|
|
303
|
-
if (!queryParameters || typeof queryParameters !== "object" || Array.isArray(queryParameters)) {
|
|
304
|
-
return [];
|
|
305
|
-
}
|
|
306
|
-
const severity = context.strictBindings ? "error" : "warning";
|
|
307
|
-
const issues = [];
|
|
308
|
-
for (const [key, value] of Object.entries(queryParameters)) {
|
|
309
|
-
if (!CEQL_FILTER_PARAMETERS.has(key))
|
|
310
|
-
continue;
|
|
311
|
-
scanContainerForCeqlQuotedFields(value, `nodes[${node.id}].inputs.detail.queryParameters.${key}`, severity, issues);
|
|
312
|
-
}
|
|
313
|
-
return issues;
|
|
255
|
+
if (code <= 65535) {
|
|
256
|
+
return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
|
|
314
257
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
function findCrossNodeBindingReferences(value, nodeIds) {
|
|
320
|
-
if (nodeIds.size === 0)
|
|
321
|
-
return [];
|
|
322
|
-
const trimmed = value.trimStart();
|
|
323
|
-
if (!trimmed.startsWith("=js:"))
|
|
324
|
-
return [];
|
|
325
|
-
const body = trimmed.slice(4);
|
|
326
|
-
const referenced = new Set;
|
|
327
|
-
const fixedBody = body.replace(IDENTIFIER_ROOT_RE, (match, identifier) => {
|
|
328
|
-
if (!nodeIds.has(identifier))
|
|
329
|
-
return match;
|
|
330
|
-
referenced.add(identifier);
|
|
331
|
-
return `$vars.${match}`;
|
|
332
|
-
});
|
|
333
|
-
if (referenced.size === 0)
|
|
334
|
-
return [];
|
|
335
|
-
const fixedValue = `=js:${fixedBody}`;
|
|
336
|
-
return [...referenced].map((nodeId) => ({ nodeId, fixedValue }));
|
|
337
|
-
}
|
|
338
|
-
function crossNodeBindingMessage(originalValue, ref) {
|
|
339
|
-
return `Expression "${originalValue}" references node "${ref.nodeId}" without the "$vars." prefix — ` + `cross-node outputs resolve to undefined at runtime (the bare identifier reads as an ` + `undeclared local, not the runtime variable). Use "${ref.fixedValue}" instead. ` + "See uipath-maestro-flow skill — node-output-wiring.md (FPD-538).";
|
|
258
|
+
if (astral === false) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
return isInAstralSet(code, astralIdentifierStartCodes);
|
|
340
262
|
}
|
|
341
|
-
function
|
|
342
|
-
if (
|
|
343
|
-
|
|
344
|
-
issues.push({
|
|
345
|
-
path,
|
|
346
|
-
severity,
|
|
347
|
-
message: crossNodeBindingMessage(obj, ref)
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
return;
|
|
263
|
+
function isIdentifierChar(code, astral) {
|
|
264
|
+
if (code < 48) {
|
|
265
|
+
return code === 36;
|
|
351
266
|
}
|
|
352
|
-
if (
|
|
353
|
-
|
|
354
|
-
scanContainerForCrossNodeBindings(obj[i], `${path}[${i}]`, nodeIds, severity, issues);
|
|
355
|
-
}
|
|
356
|
-
return;
|
|
267
|
+
if (code < 58) {
|
|
268
|
+
return true;
|
|
357
269
|
}
|
|
358
|
-
if (
|
|
359
|
-
|
|
360
|
-
scanContainerForCrossNodeBindings(value, `${path}.${key}`, nodeIds, severity, issues);
|
|
361
|
-
}
|
|
270
|
+
if (code < 65) {
|
|
271
|
+
return false;
|
|
362
272
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
"bodyParameters",
|
|
366
|
-
"queryParameters",
|
|
367
|
-
"pathParameters"
|
|
368
|
-
];
|
|
369
|
-
function scanDetailForCrossNodeBindings(detail, nodeIds, severity = "warning") {
|
|
370
|
-
if (!detail || nodeIds.size === 0)
|
|
371
|
-
return [];
|
|
372
|
-
const issues = [];
|
|
373
|
-
for (const containerKey of PARAMETER_CONTAINER_KEYS) {
|
|
374
|
-
const container = detail[containerKey];
|
|
375
|
-
if (!container || typeof container !== "object" || Array.isArray(container)) {
|
|
376
|
-
continue;
|
|
377
|
-
}
|
|
378
|
-
scanContainerForCrossNodeBindings(container, `detail.${containerKey}`, nodeIds, severity, issues);
|
|
273
|
+
if (code < 91) {
|
|
274
|
+
return true;
|
|
379
275
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
var crossNodeBindingValidator = {
|
|
383
|
-
id: "cross-node-binding",
|
|
384
|
-
appliesTo: (node) => {
|
|
385
|
-
const t = node.type;
|
|
386
|
-
if (!t)
|
|
387
|
-
return false;
|
|
388
|
-
if (isEventDrivenConnectorType(t))
|
|
389
|
-
return false;
|
|
390
|
-
return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2";
|
|
391
|
-
},
|
|
392
|
-
validate: (node, context) => {
|
|
393
|
-
const nodeIds = context.nodeIds ?? new Set;
|
|
394
|
-
if (nodeIds.size === 0)
|
|
395
|
-
return [];
|
|
396
|
-
const rawDetail = node.inputs?.detail;
|
|
397
|
-
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
398
|
-
return [];
|
|
399
|
-
}
|
|
400
|
-
const severity = context.strictBindings ? "error" : "warning";
|
|
401
|
-
const issues = scanDetailForCrossNodeBindings(rawDetail, nodeIds, severity);
|
|
402
|
-
return issues.map((issue) => ({
|
|
403
|
-
...issue,
|
|
404
|
-
path: `nodes[${node.id}].inputs.${issue.path}`
|
|
405
|
-
}));
|
|
276
|
+
if (code < 97) {
|
|
277
|
+
return code === 95;
|
|
406
278
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
// src/services/node-validators/expression-prefix-validator.ts
|
|
410
|
-
var expressionPrefixValidator = {
|
|
411
|
-
id: "expression-prefix",
|
|
412
|
-
appliesTo: (node) => {
|
|
413
|
-
const t = node.type;
|
|
414
|
-
if (!t)
|
|
415
|
-
return false;
|
|
416
|
-
if (isEventDrivenConnectorType(t))
|
|
417
|
-
return false;
|
|
418
|
-
return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2" || t === "core.action.script";
|
|
419
|
-
},
|
|
420
|
-
validate: (node) => {
|
|
421
|
-
const issues = [];
|
|
422
|
-
if (node.type === "core.action.script") {
|
|
423
|
-
scanScriptSource(node.id, node.inputs, issues);
|
|
424
|
-
return issues;
|
|
425
|
-
}
|
|
426
|
-
const rawDetail = node.inputs?.detail;
|
|
427
|
-
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
428
|
-
return [];
|
|
429
|
-
}
|
|
430
|
-
const detail = rawDetail;
|
|
431
|
-
for (const containerKey of [
|
|
432
|
-
"bodyParameters",
|
|
433
|
-
"queryParameters",
|
|
434
|
-
"pathParameters"
|
|
435
|
-
]) {
|
|
436
|
-
const container = detail[containerKey];
|
|
437
|
-
if (!container || typeof container !== "object" || Array.isArray(container)) {
|
|
438
|
-
continue;
|
|
439
|
-
}
|
|
440
|
-
scanForUnprefixedExpressions(container, `nodes[${node.id}].inputs.detail.${containerKey}`, issues);
|
|
441
|
-
}
|
|
442
|
-
return issues;
|
|
443
|
-
}
|
|
444
|
-
};
|
|
445
|
-
function scanScriptSource(nodeId, inputs, issues) {
|
|
446
|
-
if (!inputs)
|
|
447
|
-
return;
|
|
448
|
-
const source = inputs.source;
|
|
449
|
-
if (typeof source !== "string")
|
|
450
|
-
return;
|
|
451
|
-
const trimmed = source.trimStart();
|
|
452
|
-
if (!trimmed.startsWith("=js:"))
|
|
453
|
-
return;
|
|
454
|
-
issues.push({
|
|
455
|
-
path: `nodes[${nodeId}].inputs.source`,
|
|
456
|
-
severity: "error",
|
|
457
|
-
message: 'Script node `inputs.source` begins with `"=js:"` — that is the ' + "property-level expression-mode marker for connector / HTTP / " + "End-output / subflow-input fields, not JavaScript syntax. The " + "Script node's `source` field is the function body; runtime treats " + 'this value as literal source code, so e.g. `"=js:vars.X.Y"` ' + "compiles into a string-reversed gibberish output. Replace with a " + 'JavaScript expression that returns the value, e.g. `"return ' + '$vars.X.Y"` or a multi-statement function body. See ' + "uipath-maestro-flow skill — script-node reference (MST-9265)."
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
var BARE_DOLLAR_REF_RE = /^\$(vars|metadata|self)\b/;
|
|
461
|
-
var INVENTED_NODES_REF_RE = /^nodes\.[A-Za-z_$][\w$]*\.output\b/;
|
|
462
|
-
function scanForUnprefixedExpressions(obj, path, issues) {
|
|
463
|
-
if (typeof obj === "string") {
|
|
464
|
-
const trimmed = obj.trimStart();
|
|
465
|
-
if (trimmed.startsWith("="))
|
|
466
|
-
return;
|
|
467
|
-
if (BARE_DOLLAR_REF_RE.test(trimmed)) {
|
|
468
|
-
issues.push({
|
|
469
|
-
path,
|
|
470
|
-
severity: "error",
|
|
471
|
-
message: `Value "${obj}" references a runtime variable but is missing the "=js:" prefix. Use "=js:${obj}" so the runtime evaluates it; without the prefix, the value ships as a literal string and the activity input is bound to "${obj.replace(/^\$vars\b/, "vars").replace(/^\$metadata\b/, "metadata").replace(/^\$self\b/, "self")}". See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
|
|
472
|
-
});
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
if (INVENTED_NODES_REF_RE.test(trimmed)) {
|
|
476
|
-
const fixed = trimmed.replace(/^nodes\./, "=js:$vars.");
|
|
477
|
-
issues.push({
|
|
478
|
-
path,
|
|
479
|
-
severity: "error",
|
|
480
|
-
message: `Value "${obj}" looks like an invented "nodes.<id>.output" reference. There is no such syntax — variable references use "$vars". Write "${fixed}" instead. See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
|
|
481
|
-
});
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
if (Array.isArray(obj)) {
|
|
487
|
-
for (let i = 0;i < obj.length; i++) {
|
|
488
|
-
scanForUnprefixedExpressions(obj[i], `${path}[${i}]`, issues);
|
|
489
|
-
}
|
|
490
|
-
return;
|
|
491
|
-
}
|
|
492
|
-
if (obj && typeof obj === "object") {
|
|
493
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
494
|
-
scanForUnprefixedExpressions(value, `${path}.${key}`, issues);
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
// src/services/node-validators/ixp-node-validator.ts
|
|
500
|
-
var FORBIDDEN_INPUT_FIELDS = [
|
|
501
|
-
"digitizationMode",
|
|
502
|
-
"documentTaxonomy",
|
|
503
|
-
"attachmentId",
|
|
504
|
-
"fileName",
|
|
505
|
-
"mimeType"
|
|
506
|
-
];
|
|
507
|
-
var FILE_REF_PATTERN = /^=js:\$vars\.[A-Za-z_$]/;
|
|
508
|
-
var ixpNodeValidator = {
|
|
509
|
-
id: "ixp-node",
|
|
510
|
-
appliesTo: (node) => typeof node.type === "string" && node.type.startsWith("uipath.ixp."),
|
|
511
|
-
validate: (node, _context) => {
|
|
512
|
-
const issues = [];
|
|
513
|
-
const inputs = node.inputs ?? {};
|
|
514
|
-
const outputs = node.outputs ?? {};
|
|
515
|
-
const base = `nodes[${node.id}]`;
|
|
516
|
-
const model = inputs.model;
|
|
517
|
-
const isNonEmptyString2 = (v) => typeof v === "string" && v.length > 0;
|
|
518
|
-
if (typeof model !== "object" || model === null || Array.isArray(model) || !isNonEmptyString2(model.modelName) || !isNonEmptyString2(model.folderKey)) {
|
|
519
|
-
issues.push({
|
|
520
|
-
path: `${base}.inputs.model`,
|
|
521
|
-
severity: "error",
|
|
522
|
-
message: "inputs.model must be an object with non-empty string " + "`modelName` and `folderKey`. Studio Web's property " + "panel destructures these and crashes when either is " + "missing or not a string."
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
const fileRef = inputs.fileRef;
|
|
526
|
-
if (typeof fileRef !== "string" || !FILE_REF_PATTERN.test(fileRef)) {
|
|
527
|
-
issues.push({
|
|
528
|
-
path: `${base}.inputs.fileRef`,
|
|
529
|
-
severity: "error",
|
|
530
|
-
message: "inputs.fileRef must be a `=js:$vars.…` expression. " + "The canonical form for an upstream node output is " + "`=js:$vars.<upstream>.output.<field>`. Without the " + "`=js:` prefix the BPMN serializer treats the value " + "as a literal string at runtime."
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
for (const port of ["output", "error"]) {
|
|
534
|
-
if (!(port in outputs)) {
|
|
535
|
-
issues.push({
|
|
536
|
-
path: `${base}.outputs.${port}`,
|
|
537
|
-
severity: "error",
|
|
538
|
-
message: `outputs.${port} must be present on the instance. ` + `Without it, downstream $vars.${node.id}.${port} ` + "references will not resolve at runtime."
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
const topLevelModel = node.model;
|
|
543
|
-
if (topLevelModel != null) {
|
|
544
|
-
issues.push({
|
|
545
|
-
path: `${base}.model`,
|
|
546
|
-
severity: "error",
|
|
547
|
-
message: "Top-level `model` block is forbidden on IxP node " + "instances. The manifest's slim model " + "({ type, serviceType }) lives only in `definitions[]`."
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
const legacy = FORBIDDEN_INPUT_FIELDS.filter((k) => (k in inputs));
|
|
551
|
-
if (legacy.length > 0) {
|
|
552
|
-
issues.push({
|
|
553
|
-
path: `${base}.inputs`,
|
|
554
|
-
severity: "error",
|
|
555
|
-
message: "Forbidden legacy fields in inputs: " + `${legacy.join(", ")}. These keys were removed from ` + "the current standalone IxP schema and are not " + "returned by `registry get`."
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
return issues;
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
|
|
562
|
-
// ../../node_modules/acorn/dist/acorn.mjs
|
|
563
|
-
var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
|
|
564
|
-
var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489];
|
|
565
|
-
var nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ--ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・";
|
|
566
|
-
var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-Ა-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ--ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
|
|
567
|
-
var reservedWords = {
|
|
568
|
-
3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
|
|
569
|
-
5: "class enum extends super const export import",
|
|
570
|
-
6: "enum",
|
|
571
|
-
strict: "implements interface let package private protected public static yield",
|
|
572
|
-
strictBind: "eval arguments"
|
|
573
|
-
};
|
|
574
|
-
var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
|
|
575
|
-
var keywords$1 = {
|
|
576
|
-
5: ecma5AndLessKeywords,
|
|
577
|
-
"5module": ecma5AndLessKeywords + " export import",
|
|
578
|
-
6: ecma5AndLessKeywords + " const class extends export import super"
|
|
579
|
-
};
|
|
580
|
-
var keywordRelationalOperator = /^in(stanceof)?$/;
|
|
581
|
-
var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
|
|
582
|
-
var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
|
|
583
|
-
function isInAstralSet(code, set) {
|
|
584
|
-
var pos = 65536;
|
|
585
|
-
for (var i = 0;i < set.length; i += 2) {
|
|
586
|
-
pos += set[i];
|
|
587
|
-
if (pos > code) {
|
|
588
|
-
return false;
|
|
589
|
-
}
|
|
590
|
-
pos += set[i + 1];
|
|
591
|
-
if (pos >= code) {
|
|
592
|
-
return true;
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
return false;
|
|
596
|
-
}
|
|
597
|
-
function isIdentifierStart(code, astral) {
|
|
598
|
-
if (code < 65) {
|
|
599
|
-
return code === 36;
|
|
600
|
-
}
|
|
601
|
-
if (code < 91) {
|
|
602
|
-
return true;
|
|
603
|
-
}
|
|
604
|
-
if (code < 97) {
|
|
605
|
-
return code === 95;
|
|
606
|
-
}
|
|
607
|
-
if (code < 123) {
|
|
608
|
-
return true;
|
|
609
|
-
}
|
|
610
|
-
if (code <= 65535) {
|
|
611
|
-
return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
|
|
612
|
-
}
|
|
613
|
-
if (astral === false) {
|
|
614
|
-
return false;
|
|
615
|
-
}
|
|
616
|
-
return isInAstralSet(code, astralIdentifierStartCodes);
|
|
617
|
-
}
|
|
618
|
-
function isIdentifierChar(code, astral) {
|
|
619
|
-
if (code < 48) {
|
|
620
|
-
return code === 36;
|
|
621
|
-
}
|
|
622
|
-
if (code < 58) {
|
|
623
|
-
return true;
|
|
624
|
-
}
|
|
625
|
-
if (code < 65) {
|
|
626
|
-
return false;
|
|
627
|
-
}
|
|
628
|
-
if (code < 91) {
|
|
629
|
-
return true;
|
|
630
|
-
}
|
|
631
|
-
if (code < 97) {
|
|
632
|
-
return code === 95;
|
|
633
|
-
}
|
|
634
|
-
if (code < 123) {
|
|
635
|
-
return true;
|
|
279
|
+
if (code < 123) {
|
|
280
|
+
return true;
|
|
636
281
|
}
|
|
637
282
|
if (code <= 65535) {
|
|
638
283
|
return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code));
|
|
@@ -5838,77 +5483,588 @@ pp.readEscapedChar = function(inTemplate) {
|
|
|
5838
5483
|
}
|
|
5839
5484
|
return String.fromCharCode(ch);
|
|
5840
5485
|
}
|
|
5841
|
-
};
|
|
5842
|
-
pp.readHexChar = function(len) {
|
|
5843
|
-
var codePos = this.pos;
|
|
5844
|
-
var n = this.readInt(16, len);
|
|
5845
|
-
if (n === null) {
|
|
5846
|
-
this.invalidStringToken(codePos, "Bad character escape sequence");
|
|
5486
|
+
};
|
|
5487
|
+
pp.readHexChar = function(len) {
|
|
5488
|
+
var codePos = this.pos;
|
|
5489
|
+
var n = this.readInt(16, len);
|
|
5490
|
+
if (n === null) {
|
|
5491
|
+
this.invalidStringToken(codePos, "Bad character escape sequence");
|
|
5492
|
+
}
|
|
5493
|
+
return n;
|
|
5494
|
+
};
|
|
5495
|
+
pp.readWord1 = function() {
|
|
5496
|
+
this.containsEsc = false;
|
|
5497
|
+
var word = "", first = true, chunkStart = this.pos;
|
|
5498
|
+
var astral = this.options.ecmaVersion >= 6;
|
|
5499
|
+
while (this.pos < this.input.length) {
|
|
5500
|
+
var ch = this.fullCharCodeAtPos();
|
|
5501
|
+
if (isIdentifierChar(ch, astral)) {
|
|
5502
|
+
this.pos += ch <= 65535 ? 1 : 2;
|
|
5503
|
+
} else if (ch === 92) {
|
|
5504
|
+
this.containsEsc = true;
|
|
5505
|
+
word += this.input.slice(chunkStart, this.pos);
|
|
5506
|
+
var escStart = this.pos;
|
|
5507
|
+
if (this.input.charCodeAt(++this.pos) !== 117) {
|
|
5508
|
+
this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX");
|
|
5509
|
+
}
|
|
5510
|
+
++this.pos;
|
|
5511
|
+
var esc = this.readCodePoint();
|
|
5512
|
+
if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) {
|
|
5513
|
+
this.invalidStringToken(escStart, "Invalid Unicode escape");
|
|
5514
|
+
}
|
|
5515
|
+
word += codePointToString(esc);
|
|
5516
|
+
chunkStart = this.pos;
|
|
5517
|
+
} else {
|
|
5518
|
+
break;
|
|
5519
|
+
}
|
|
5520
|
+
first = false;
|
|
5521
|
+
}
|
|
5522
|
+
return word + this.input.slice(chunkStart, this.pos);
|
|
5523
|
+
};
|
|
5524
|
+
pp.readWord = function() {
|
|
5525
|
+
var word = this.readWord1();
|
|
5526
|
+
var type = types$1.name;
|
|
5527
|
+
if (this.keywords.test(word)) {
|
|
5528
|
+
type = keywords[word];
|
|
5529
|
+
}
|
|
5530
|
+
return this.finishToken(type, word);
|
|
5531
|
+
};
|
|
5532
|
+
var version = "8.17.0";
|
|
5533
|
+
Parser.acorn = {
|
|
5534
|
+
Parser,
|
|
5535
|
+
version,
|
|
5536
|
+
defaultOptions,
|
|
5537
|
+
Position,
|
|
5538
|
+
SourceLocation,
|
|
5539
|
+
getLineInfo,
|
|
5540
|
+
Node,
|
|
5541
|
+
TokenType,
|
|
5542
|
+
tokTypes: types$1,
|
|
5543
|
+
keywordTypes: keywords,
|
|
5544
|
+
TokContext,
|
|
5545
|
+
tokContexts: types,
|
|
5546
|
+
isIdentifierChar,
|
|
5547
|
+
isIdentifierStart,
|
|
5548
|
+
Token,
|
|
5549
|
+
isNewLine,
|
|
5550
|
+
lineBreak,
|
|
5551
|
+
lineBreakG,
|
|
5552
|
+
nonASCIIwhitespace
|
|
5553
|
+
};
|
|
5554
|
+
function parse3(input, options) {
|
|
5555
|
+
return Parser.parse(input, options);
|
|
5556
|
+
}
|
|
5557
|
+
|
|
5558
|
+
// src/services/node-validators/ceql-query-validator.ts
|
|
5559
|
+
var CEQL_SYMBOL_OPERATORS = ["=", "!=", "<", "<=", ">", ">="];
|
|
5560
|
+
var CEQL_WORD_OPERATORS = [
|
|
5561
|
+
"In",
|
|
5562
|
+
"Not In",
|
|
5563
|
+
"Like",
|
|
5564
|
+
"Not Like",
|
|
5565
|
+
"Contains",
|
|
5566
|
+
"Not Contains",
|
|
5567
|
+
"Starts With",
|
|
5568
|
+
"Not Starts With",
|
|
5569
|
+
"Ends With",
|
|
5570
|
+
"Not Ends With",
|
|
5571
|
+
"Is Null",
|
|
5572
|
+
"Is Not Null"
|
|
5573
|
+
];
|
|
5574
|
+
var CEQL_OPERATOR_ALIASES = {
|
|
5575
|
+
eq: "=",
|
|
5576
|
+
ne: "!=",
|
|
5577
|
+
gt: ">",
|
|
5578
|
+
ge: ">=",
|
|
5579
|
+
lt: "<",
|
|
5580
|
+
le: "<="
|
|
5581
|
+
};
|
|
5582
|
+
var byLengthDescending = (a, b) => b.length - a.length;
|
|
5583
|
+
var escapeRegexToken = (token) => token.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
|
|
5584
|
+
var toWordOperatorPattern = (token) => token.split(/\s+/).map(escapeRegexToken).join(String.raw`\s+`);
|
|
5585
|
+
var CEQL_SYMBOL_OPERATOR_ALTERNATION = [...CEQL_SYMBOL_OPERATORS].sort(byLengthDescending).map(escapeRegexToken).join("|");
|
|
5586
|
+
var CEQL_WORD_OPERATOR_ALTERNATION = [...CEQL_WORD_OPERATORS].sort(byLengthDescending).map(toWordOperatorPattern).join("|");
|
|
5587
|
+
var CEQL_OPERATOR = String.raw`(?:${CEQL_SYMBOL_OPERATOR_ALTERNATION}|(?:${CEQL_WORD_OPERATOR_ALTERNATION})\b)`;
|
|
5588
|
+
var CEQL_OPERATOR_ALIAS_ALTERNATION = Object.keys(CEQL_OPERATOR_ALIASES).map(escapeRegexToken).join("|");
|
|
5589
|
+
var CEQL_FIELD_OPERATOR = String.raw`(?:${CEQL_OPERATOR}|(?:${CEQL_OPERATOR_ALIAS_ALTERNATION})\b)`;
|
|
5590
|
+
var CEQL_FILTER_PARAMETERS = new Set(["where", "queryExpression"]);
|
|
5591
|
+
var CEQL_REFERENCE = 'See uipath-maestro-flow skill — plugins/connector/impl.md, "Hand-authored CEQL strings".';
|
|
5592
|
+
var HOLE = "\x00";
|
|
5593
|
+
var JS_PREFIX = "=js:";
|
|
5594
|
+
function collectFragments(root, fragments) {
|
|
5595
|
+
const pending = [root];
|
|
5596
|
+
while (pending.length > 0) {
|
|
5597
|
+
const item = pending.pop();
|
|
5598
|
+
if (!("type" in item)) {
|
|
5599
|
+
fragments.push(item);
|
|
5600
|
+
continue;
|
|
5601
|
+
}
|
|
5602
|
+
switch (item.type) {
|
|
5603
|
+
case "Literal":
|
|
5604
|
+
fragments.push(typeof item.value === "string" ? { kind: "text", text: item.value } : { kind: "hole" });
|
|
5605
|
+
continue;
|
|
5606
|
+
case "BinaryExpression":
|
|
5607
|
+
if (item.operator !== "+") {
|
|
5608
|
+
fragments.push({ kind: "hole" });
|
|
5609
|
+
continue;
|
|
5610
|
+
}
|
|
5611
|
+
pending.push(item.right, item.left);
|
|
5612
|
+
continue;
|
|
5613
|
+
case "TemplateLiteral":
|
|
5614
|
+
for (let i2 = item.quasis.length - 1;i2 >= 0; i2--) {
|
|
5615
|
+
if (i2 < item.expressions.length)
|
|
5616
|
+
pending.push({ kind: "hole" });
|
|
5617
|
+
pending.push({
|
|
5618
|
+
kind: "text",
|
|
5619
|
+
text: item.quasis[i2].value.cooked ?? ""
|
|
5620
|
+
});
|
|
5621
|
+
}
|
|
5622
|
+
continue;
|
|
5623
|
+
default:
|
|
5624
|
+
fragments.push({ kind: "hole" });
|
|
5625
|
+
}
|
|
5626
|
+
}
|
|
5627
|
+
}
|
|
5628
|
+
function isStringConcatShape(node) {
|
|
5629
|
+
if (node.type === "TemplateLiteral")
|
|
5630
|
+
return true;
|
|
5631
|
+
if (node.type === "Literal")
|
|
5632
|
+
return typeof node.value === "string";
|
|
5633
|
+
return node.type === "BinaryExpression" && node.operator === "+";
|
|
5634
|
+
}
|
|
5635
|
+
function lexCeqlFilterValue(value) {
|
|
5636
|
+
const trimmed = value.trim();
|
|
5637
|
+
if (!trimmed.startsWith(JS_PREFIX)) {
|
|
5638
|
+
if (trimmed.startsWith("="))
|
|
5639
|
+
return;
|
|
5640
|
+
return [{ kind: "text", text: value }];
|
|
5641
|
+
}
|
|
5642
|
+
let program;
|
|
5643
|
+
try {
|
|
5644
|
+
program = parse3(`(${trimmed.slice(JS_PREFIX.length)}
|
|
5645
|
+
)`, {
|
|
5646
|
+
ecmaVersion: 2020,
|
|
5647
|
+
sourceType: "script"
|
|
5648
|
+
});
|
|
5649
|
+
} catch {
|
|
5650
|
+
return;
|
|
5651
|
+
}
|
|
5652
|
+
const statement = program.body[0];
|
|
5653
|
+
if (statement?.type !== "ExpressionStatement")
|
|
5654
|
+
return;
|
|
5655
|
+
if (!isStringConcatShape(statement.expression))
|
|
5656
|
+
return;
|
|
5657
|
+
const fragments = [];
|
|
5658
|
+
collectFragments(statement.expression, fragments);
|
|
5659
|
+
return fragments;
|
|
5660
|
+
}
|
|
5661
|
+
function buildSkeleton(fragments) {
|
|
5662
|
+
let text = "";
|
|
5663
|
+
const holeAt = [];
|
|
5664
|
+
for (const fragment of fragments) {
|
|
5665
|
+
if (fragment.kind === "hole") {
|
|
5666
|
+
text += HOLE;
|
|
5667
|
+
holeAt.push(true);
|
|
5668
|
+
continue;
|
|
5669
|
+
}
|
|
5670
|
+
text += fragment.text;
|
|
5671
|
+
for (let i2 = 0;i2 < fragment.text.length; i2++)
|
|
5672
|
+
holeAt.push(false);
|
|
5673
|
+
}
|
|
5674
|
+
return { text, holeAt };
|
|
5675
|
+
}
|
|
5676
|
+
function singleQuoteOpenBefore(skeleton) {
|
|
5677
|
+
const openBefore = new Array(skeleton.length);
|
|
5678
|
+
let open = false;
|
|
5679
|
+
for (let i2 = 0;i2 < skeleton.length; i2++) {
|
|
5680
|
+
openBefore[i2] = open;
|
|
5681
|
+
if (skeleton[i2] === "'")
|
|
5682
|
+
open = !open;
|
|
5683
|
+
}
|
|
5684
|
+
return openBefore;
|
|
5685
|
+
}
|
|
5686
|
+
function renderSkeletonSlice(skeleton, start, length) {
|
|
5687
|
+
let rendered = "";
|
|
5688
|
+
for (let i2 = start;i2 < start + length; i2++) {
|
|
5689
|
+
rendered += skeleton.holeAt[i2] ? "<expression>" : skeleton.text[i2];
|
|
5690
|
+
}
|
|
5691
|
+
return rendered;
|
|
5692
|
+
}
|
|
5693
|
+
var CEQL_QUOTED_FIELD_RE = new RegExp(String.raw`(?:^|\bAND\b|\bOR\b|\()\s*'([^']*)'\s*(?=${CEQL_FIELD_OPERATOR})`, "gi");
|
|
5694
|
+
var CEQL_DOUBLE_QUOTED_VALUE_RE = new RegExp(String.raw`(${CEQL_OPERATOR})\s*"`, "gi");
|
|
5695
|
+
var CEQL_OPERATOR_ALIAS_RE = new RegExp(String.raw`[A-Za-z0-9_.)\]']\s+(${CEQL_OPERATOR_ALIAS_ALTERNATION})(?!\s*(?:${CEQL_OPERATOR}))(?=\s)`, "gi");
|
|
5696
|
+
function findQuotedFields(skeleton, openBefore) {
|
|
5697
|
+
const matches = [];
|
|
5698
|
+
for (const match of skeleton.matchAll(CEQL_QUOTED_FIELD_RE)) {
|
|
5699
|
+
const openIndex = match.index + match[0].indexOf("'");
|
|
5700
|
+
if (openBefore[openIndex])
|
|
5701
|
+
continue;
|
|
5702
|
+
matches.push({ name: match[1], openIndex });
|
|
5703
|
+
}
|
|
5704
|
+
return matches;
|
|
5705
|
+
}
|
|
5706
|
+
function unquoteFields(value, fields) {
|
|
5707
|
+
const quoteIndexes = fields.flatMap((field) => [
|
|
5708
|
+
field.openIndex,
|
|
5709
|
+
field.openIndex + field.name.length + 1
|
|
5710
|
+
]).sort((a, b) => b - a);
|
|
5711
|
+
let fixed = value;
|
|
5712
|
+
for (const index of quoteIndexes) {
|
|
5713
|
+
fixed = fixed.slice(0, index) + fixed.slice(index + 1);
|
|
5714
|
+
}
|
|
5715
|
+
if (!fixed.trim().startsWith(JS_PREFIX) && fixed.includes("${")) {
|
|
5716
|
+
const escaped = fixed.replace(/\\/g, "\\\\").replace(/`/g, "\\`");
|
|
5717
|
+
return `=js:\`${escaped}\``;
|
|
5718
|
+
}
|
|
5719
|
+
return fixed;
|
|
5720
|
+
}
|
|
5721
|
+
function quotedFieldMessage(token, fixedValue) {
|
|
5722
|
+
const fix = fixedValue ? `Write "${fixedValue}" instead.` : "Remove the quotes around the field name.";
|
|
5723
|
+
return `Quoted token '${token}' where CEQL expects a bare field name — ` + "Integration Service rejects this with [102003] Expected a field name " + `expression but got 'StringValue'. ${fix} ${CEQL_REFERENCE}`;
|
|
5724
|
+
}
|
|
5725
|
+
function doubleQuotedValueMessage(operator) {
|
|
5726
|
+
return `Double-quoted value after '${operator}' — CEQL quotes a value with ` + "single quotes. Integration Service rejects this with [102003] " + `"Unsupported value expression 'Column' on field ...". Write the ` + `value in single quotes. ${CEQL_REFERENCE}`;
|
|
5727
|
+
}
|
|
5728
|
+
function operatorAliasMessage(alias) {
|
|
5729
|
+
const symbol = CEQL_OPERATOR_ALIASES[alias.toLowerCase()];
|
|
5730
|
+
return `Operator '${alias}' is not CEQL — write '${symbol}'. Integration ` + "Service rejects this with [102003] Integration Services bad request. " + CEQL_REFERENCE;
|
|
5731
|
+
}
|
|
5732
|
+
function findCeqlFilterIssues(value) {
|
|
5733
|
+
const fragments = lexCeqlFilterValue(value);
|
|
5734
|
+
if (!fragments)
|
|
5735
|
+
return [];
|
|
5736
|
+
const skeleton = buildSkeleton(fragments);
|
|
5737
|
+
const openBefore = singleQuoteOpenBefore(skeleton.text);
|
|
5738
|
+
const issues = [];
|
|
5739
|
+
const quotedFields = findQuotedFields(skeleton.text, openBefore);
|
|
5740
|
+
if (quotedFields.length > 0) {
|
|
5741
|
+
const fixedValue = value.trim().startsWith(JS_PREFIX) ? undefined : unquoteFields(value, quotedFields);
|
|
5742
|
+
for (const field of quotedFields) {
|
|
5743
|
+
const token = renderSkeletonSlice(skeleton, field.openIndex + 1, field.name.length);
|
|
5744
|
+
issues.push({
|
|
5745
|
+
rule: "quoted-field",
|
|
5746
|
+
token,
|
|
5747
|
+
fixedValue,
|
|
5748
|
+
message: quotedFieldMessage(token, fixedValue)
|
|
5749
|
+
});
|
|
5750
|
+
}
|
|
5751
|
+
}
|
|
5752
|
+
for (const match of skeleton.text.matchAll(CEQL_DOUBLE_QUOTED_VALUE_RE)) {
|
|
5753
|
+
const quoteIndex = match.index + match[0].length - 1;
|
|
5754
|
+
if (openBefore[quoteIndex])
|
|
5755
|
+
continue;
|
|
5756
|
+
const operator = match[1].replace(/\s+/g, " ");
|
|
5757
|
+
issues.push({
|
|
5758
|
+
rule: "double-quoted-value",
|
|
5759
|
+
token: operator,
|
|
5760
|
+
message: doubleQuotedValueMessage(operator)
|
|
5761
|
+
});
|
|
5762
|
+
}
|
|
5763
|
+
for (const match of skeleton.text.matchAll(CEQL_OPERATOR_ALIAS_RE)) {
|
|
5764
|
+
const aliasIndex = match.index + match[0].length - match[1].length;
|
|
5765
|
+
if (openBefore[aliasIndex])
|
|
5766
|
+
continue;
|
|
5767
|
+
issues.push({
|
|
5768
|
+
rule: "operator-alias",
|
|
5769
|
+
token: match[1],
|
|
5770
|
+
message: operatorAliasMessage(match[1])
|
|
5771
|
+
});
|
|
5772
|
+
}
|
|
5773
|
+
return issues;
|
|
5774
|
+
}
|
|
5775
|
+
function scanContainerForCeqlFilterIssues(obj, path, severity, issues) {
|
|
5776
|
+
if (typeof obj === "string") {
|
|
5777
|
+
for (const issue of findCeqlFilterIssues(obj)) {
|
|
5778
|
+
issues.push({ path, severity, message: issue.message });
|
|
5779
|
+
}
|
|
5780
|
+
return;
|
|
5781
|
+
}
|
|
5782
|
+
if (Array.isArray(obj)) {
|
|
5783
|
+
for (let i2 = 0;i2 < obj.length; i2++) {
|
|
5784
|
+
scanContainerForCeqlFilterIssues(obj[i2], `${path}[${i2}]`, severity, issues);
|
|
5785
|
+
}
|
|
5786
|
+
return;
|
|
5787
|
+
}
|
|
5788
|
+
if (obj && typeof obj === "object") {
|
|
5789
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
5790
|
+
scanContainerForCeqlFilterIssues(value, `${path}.${key}`, severity, issues);
|
|
5791
|
+
}
|
|
5792
|
+
}
|
|
5793
|
+
}
|
|
5794
|
+
var ceqlQueryValidator = {
|
|
5795
|
+
id: "ceql-query",
|
|
5796
|
+
appliesTo: (node) => {
|
|
5797
|
+
const t = node.type;
|
|
5798
|
+
if (!t)
|
|
5799
|
+
return false;
|
|
5800
|
+
if (isEventDrivenConnectorType(t))
|
|
5801
|
+
return false;
|
|
5802
|
+
return t.startsWith("uipath.connector.");
|
|
5803
|
+
},
|
|
5804
|
+
validate: (node, context) => {
|
|
5805
|
+
const rawDetail = node.inputs?.detail;
|
|
5806
|
+
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
5807
|
+
return [];
|
|
5808
|
+
}
|
|
5809
|
+
const queryParameters = rawDetail.queryParameters;
|
|
5810
|
+
if (!queryParameters || typeof queryParameters !== "object" || Array.isArray(queryParameters)) {
|
|
5811
|
+
return [];
|
|
5812
|
+
}
|
|
5813
|
+
const severity = context.strictBindings ? "error" : "warning";
|
|
5814
|
+
const issues = [];
|
|
5815
|
+
for (const [key, value] of Object.entries(queryParameters)) {
|
|
5816
|
+
if (!CEQL_FILTER_PARAMETERS.has(key))
|
|
5817
|
+
continue;
|
|
5818
|
+
scanContainerForCeqlFilterIssues(value, `nodes[${node.id}].inputs.detail.queryParameters.${key}`, severity, issues);
|
|
5819
|
+
}
|
|
5820
|
+
return issues;
|
|
5821
|
+
}
|
|
5822
|
+
};
|
|
5823
|
+
|
|
5824
|
+
// src/services/node-validators/cross-node-binding-validator.ts
|
|
5825
|
+
var IDENTIFIER_ROOT_RE = /(?<![.\w$])([A-Za-z_$][\w$]*)\.(?!\.)/g;
|
|
5826
|
+
function findCrossNodeBindingReferences(value, nodeIds) {
|
|
5827
|
+
if (nodeIds.size === 0)
|
|
5828
|
+
return [];
|
|
5829
|
+
const trimmed = value.trimStart();
|
|
5830
|
+
if (!trimmed.startsWith("=js:"))
|
|
5831
|
+
return [];
|
|
5832
|
+
const body = trimmed.slice(4);
|
|
5833
|
+
const referenced = new Set;
|
|
5834
|
+
const fixedBody = body.replace(IDENTIFIER_ROOT_RE, (match, identifier) => {
|
|
5835
|
+
if (!nodeIds.has(identifier))
|
|
5836
|
+
return match;
|
|
5837
|
+
referenced.add(identifier);
|
|
5838
|
+
return `$vars.${match}`;
|
|
5839
|
+
});
|
|
5840
|
+
if (referenced.size === 0)
|
|
5841
|
+
return [];
|
|
5842
|
+
const fixedValue = `=js:${fixedBody}`;
|
|
5843
|
+
return [...referenced].map((nodeId) => ({ nodeId, fixedValue }));
|
|
5844
|
+
}
|
|
5845
|
+
function crossNodeBindingMessage(originalValue, ref2) {
|
|
5846
|
+
return `Expression "${originalValue}" references node "${ref2.nodeId}" without the "$vars." prefix — ` + `cross-node outputs resolve to undefined at runtime (the bare identifier reads as an ` + `undeclared local, not the runtime variable). Use "${ref2.fixedValue}" instead. ` + "See uipath-maestro-flow skill — node-output-wiring.md (FPD-538).";
|
|
5847
|
+
}
|
|
5848
|
+
function scanContainerForCrossNodeBindings(obj, path, nodeIds, severity, issues) {
|
|
5849
|
+
if (typeof obj === "string") {
|
|
5850
|
+
for (const ref2 of findCrossNodeBindingReferences(obj, nodeIds)) {
|
|
5851
|
+
issues.push({
|
|
5852
|
+
path,
|
|
5853
|
+
severity,
|
|
5854
|
+
message: crossNodeBindingMessage(obj, ref2)
|
|
5855
|
+
});
|
|
5856
|
+
}
|
|
5857
|
+
return;
|
|
5858
|
+
}
|
|
5859
|
+
if (Array.isArray(obj)) {
|
|
5860
|
+
for (let i2 = 0;i2 < obj.length; i2++) {
|
|
5861
|
+
scanContainerForCrossNodeBindings(obj[i2], `${path}[${i2}]`, nodeIds, severity, issues);
|
|
5862
|
+
}
|
|
5863
|
+
return;
|
|
5864
|
+
}
|
|
5865
|
+
if (obj && typeof obj === "object") {
|
|
5866
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
5867
|
+
scanContainerForCrossNodeBindings(value, `${path}.${key}`, nodeIds, severity, issues);
|
|
5868
|
+
}
|
|
5869
|
+
}
|
|
5870
|
+
}
|
|
5871
|
+
var PARAMETER_CONTAINER_KEYS = [
|
|
5872
|
+
"bodyParameters",
|
|
5873
|
+
"queryParameters",
|
|
5874
|
+
"pathParameters"
|
|
5875
|
+
];
|
|
5876
|
+
function scanDetailForCrossNodeBindings(detail, nodeIds, severity = "warning") {
|
|
5877
|
+
if (!detail || nodeIds.size === 0)
|
|
5878
|
+
return [];
|
|
5879
|
+
const issues = [];
|
|
5880
|
+
for (const containerKey of PARAMETER_CONTAINER_KEYS) {
|
|
5881
|
+
const container = detail[containerKey];
|
|
5882
|
+
if (!container || typeof container !== "object" || Array.isArray(container)) {
|
|
5883
|
+
continue;
|
|
5884
|
+
}
|
|
5885
|
+
scanContainerForCrossNodeBindings(container, `detail.${containerKey}`, nodeIds, severity, issues);
|
|
5886
|
+
}
|
|
5887
|
+
return issues;
|
|
5888
|
+
}
|
|
5889
|
+
var crossNodeBindingValidator = {
|
|
5890
|
+
id: "cross-node-binding",
|
|
5891
|
+
appliesTo: (node) => {
|
|
5892
|
+
const t = node.type;
|
|
5893
|
+
if (!t)
|
|
5894
|
+
return false;
|
|
5895
|
+
if (isEventDrivenConnectorType(t))
|
|
5896
|
+
return false;
|
|
5897
|
+
return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2";
|
|
5898
|
+
},
|
|
5899
|
+
validate: (node, context) => {
|
|
5900
|
+
const nodeIds = context.nodeIds ?? new Set;
|
|
5901
|
+
if (nodeIds.size === 0)
|
|
5902
|
+
return [];
|
|
5903
|
+
const rawDetail = node.inputs?.detail;
|
|
5904
|
+
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
5905
|
+
return [];
|
|
5906
|
+
}
|
|
5907
|
+
const severity = context.strictBindings ? "error" : "warning";
|
|
5908
|
+
const issues = scanDetailForCrossNodeBindings(rawDetail, nodeIds, severity);
|
|
5909
|
+
return issues.map((issue) => ({
|
|
5910
|
+
...issue,
|
|
5911
|
+
path: `nodes[${node.id}].inputs.${issue.path}`
|
|
5912
|
+
}));
|
|
5913
|
+
}
|
|
5914
|
+
};
|
|
5915
|
+
|
|
5916
|
+
// src/services/node-validators/expression-prefix-validator.ts
|
|
5917
|
+
var expressionPrefixValidator = {
|
|
5918
|
+
id: "expression-prefix",
|
|
5919
|
+
appliesTo: (node) => {
|
|
5920
|
+
const t = node.type;
|
|
5921
|
+
if (!t)
|
|
5922
|
+
return false;
|
|
5923
|
+
if (isEventDrivenConnectorType(t))
|
|
5924
|
+
return false;
|
|
5925
|
+
return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2" || t === "core.action.script";
|
|
5926
|
+
},
|
|
5927
|
+
validate: (node) => {
|
|
5928
|
+
const issues = [];
|
|
5929
|
+
if (node.type === "core.action.script") {
|
|
5930
|
+
scanScriptSource(node.id, node.inputs, issues);
|
|
5931
|
+
return issues;
|
|
5932
|
+
}
|
|
5933
|
+
const rawDetail = node.inputs?.detail;
|
|
5934
|
+
if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
|
|
5935
|
+
return [];
|
|
5936
|
+
}
|
|
5937
|
+
const detail = rawDetail;
|
|
5938
|
+
for (const containerKey of [
|
|
5939
|
+
"bodyParameters",
|
|
5940
|
+
"queryParameters",
|
|
5941
|
+
"pathParameters"
|
|
5942
|
+
]) {
|
|
5943
|
+
const container = detail[containerKey];
|
|
5944
|
+
if (!container || typeof container !== "object" || Array.isArray(container)) {
|
|
5945
|
+
continue;
|
|
5946
|
+
}
|
|
5947
|
+
scanForUnprefixedExpressions(container, `nodes[${node.id}].inputs.detail.${containerKey}`, issues);
|
|
5948
|
+
}
|
|
5949
|
+
return issues;
|
|
5950
|
+
}
|
|
5951
|
+
};
|
|
5952
|
+
function scanScriptSource(nodeId, inputs, issues) {
|
|
5953
|
+
if (!inputs)
|
|
5954
|
+
return;
|
|
5955
|
+
const source = inputs.source;
|
|
5956
|
+
if (typeof source !== "string")
|
|
5957
|
+
return;
|
|
5958
|
+
const trimmed = source.trimStart();
|
|
5959
|
+
if (!trimmed.startsWith("=js:"))
|
|
5960
|
+
return;
|
|
5961
|
+
issues.push({
|
|
5962
|
+
path: `nodes[${nodeId}].inputs.source`,
|
|
5963
|
+
severity: "error",
|
|
5964
|
+
message: 'Script node `inputs.source` begins with `"=js:"` — that is the ' + "property-level expression-mode marker for connector / HTTP / " + "End-output / subflow-input fields, not JavaScript syntax. The " + "Script node's `source` field is the function body; runtime treats " + 'this value as literal source code, so e.g. `"=js:vars.X.Y"` ' + "compiles into a string-reversed gibberish output. Replace with a " + 'JavaScript expression that returns the value, e.g. `"return ' + '$vars.X.Y"` or a multi-statement function body. See ' + "uipath-maestro-flow skill — script-node reference (MST-9265)."
|
|
5965
|
+
});
|
|
5966
|
+
}
|
|
5967
|
+
var BARE_DOLLAR_REF_RE = /^\$(vars|metadata|self)\b/;
|
|
5968
|
+
var INVENTED_NODES_REF_RE = /^nodes\.[A-Za-z_$][\w$]*\.output\b/;
|
|
5969
|
+
function scanForUnprefixedExpressions(obj, path, issues) {
|
|
5970
|
+
if (typeof obj === "string") {
|
|
5971
|
+
const trimmed = obj.trimStart();
|
|
5972
|
+
if (trimmed.startsWith("="))
|
|
5973
|
+
return;
|
|
5974
|
+
if (BARE_DOLLAR_REF_RE.test(trimmed)) {
|
|
5975
|
+
issues.push({
|
|
5976
|
+
path,
|
|
5977
|
+
severity: "error",
|
|
5978
|
+
message: `Value "${obj}" references a runtime variable but is missing the "=js:" prefix. Use "=js:${obj}" so the runtime evaluates it; without the prefix, the value ships as a literal string and the activity input is bound to "${obj.replace(/^\$vars\b/, "vars").replace(/^\$metadata\b/, "metadata").replace(/^\$self\b/, "self")}". See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
|
|
5979
|
+
});
|
|
5980
|
+
return;
|
|
5981
|
+
}
|
|
5982
|
+
if (INVENTED_NODES_REF_RE.test(trimmed)) {
|
|
5983
|
+
const fixed = trimmed.replace(/^nodes\./, "=js:$vars.");
|
|
5984
|
+
issues.push({
|
|
5985
|
+
path,
|
|
5986
|
+
severity: "error",
|
|
5987
|
+
message: `Value "${obj}" looks like an invented "nodes.<id>.output" reference. There is no such syntax — variable references use "$vars". Write "${fixed}" instead. See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
|
|
5988
|
+
});
|
|
5989
|
+
return;
|
|
5990
|
+
}
|
|
5991
|
+
return;
|
|
5992
|
+
}
|
|
5993
|
+
if (Array.isArray(obj)) {
|
|
5994
|
+
for (let i2 = 0;i2 < obj.length; i2++) {
|
|
5995
|
+
scanForUnprefixedExpressions(obj[i2], `${path}[${i2}]`, issues);
|
|
5996
|
+
}
|
|
5997
|
+
return;
|
|
5847
5998
|
}
|
|
5848
|
-
|
|
5849
|
-
|
|
5850
|
-
|
|
5851
|
-
this.containsEsc = false;
|
|
5852
|
-
var word = "", first = true, chunkStart = this.pos;
|
|
5853
|
-
var astral = this.options.ecmaVersion >= 6;
|
|
5854
|
-
while (this.pos < this.input.length) {
|
|
5855
|
-
var ch = this.fullCharCodeAtPos();
|
|
5856
|
-
if (isIdentifierChar(ch, astral)) {
|
|
5857
|
-
this.pos += ch <= 65535 ? 1 : 2;
|
|
5858
|
-
} else if (ch === 92) {
|
|
5859
|
-
this.containsEsc = true;
|
|
5860
|
-
word += this.input.slice(chunkStart, this.pos);
|
|
5861
|
-
var escStart = this.pos;
|
|
5862
|
-
if (this.input.charCodeAt(++this.pos) !== 117) {
|
|
5863
|
-
this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX");
|
|
5864
|
-
}
|
|
5865
|
-
++this.pos;
|
|
5866
|
-
var esc = this.readCodePoint();
|
|
5867
|
-
if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) {
|
|
5868
|
-
this.invalidStringToken(escStart, "Invalid Unicode escape");
|
|
5869
|
-
}
|
|
5870
|
-
word += codePointToString(esc);
|
|
5871
|
-
chunkStart = this.pos;
|
|
5872
|
-
} else {
|
|
5873
|
-
break;
|
|
5999
|
+
if (obj && typeof obj === "object") {
|
|
6000
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
6001
|
+
scanForUnprefixedExpressions(value, `${path}.${key}`, issues);
|
|
5874
6002
|
}
|
|
5875
|
-
first = false;
|
|
5876
6003
|
}
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5880
|
-
|
|
5881
|
-
|
|
5882
|
-
|
|
5883
|
-
|
|
6004
|
+
}
|
|
6005
|
+
|
|
6006
|
+
// src/services/node-validators/ixp-node-validator.ts
|
|
6007
|
+
var FORBIDDEN_INPUT_FIELDS = [
|
|
6008
|
+
"digitizationMode",
|
|
6009
|
+
"documentTaxonomy",
|
|
6010
|
+
"attachmentId",
|
|
6011
|
+
"fileName",
|
|
6012
|
+
"mimeType"
|
|
6013
|
+
];
|
|
6014
|
+
var FILE_REF_PATTERN = /^=js:\$vars\.[A-Za-z_$]/;
|
|
6015
|
+
var ixpNodeValidator = {
|
|
6016
|
+
id: "ixp-node",
|
|
6017
|
+
appliesTo: (node) => typeof node.type === "string" && node.type.startsWith("uipath.ixp."),
|
|
6018
|
+
validate: (node, _context) => {
|
|
6019
|
+
const issues = [];
|
|
6020
|
+
const inputs = node.inputs ?? {};
|
|
6021
|
+
const outputs = node.outputs ?? {};
|
|
6022
|
+
const base = `nodes[${node.id}]`;
|
|
6023
|
+
const model = inputs.model;
|
|
6024
|
+
const isNonEmptyString2 = (v) => typeof v === "string" && v.length > 0;
|
|
6025
|
+
if (typeof model !== "object" || model === null || Array.isArray(model) || !isNonEmptyString2(model.modelName) || !isNonEmptyString2(model.folderKey)) {
|
|
6026
|
+
issues.push({
|
|
6027
|
+
path: `${base}.inputs.model`,
|
|
6028
|
+
severity: "error",
|
|
6029
|
+
message: "inputs.model must be an object with non-empty string " + "`modelName` and `folderKey`. Studio Web's property " + "panel destructures these and crashes when either is " + "missing or not a string."
|
|
6030
|
+
});
|
|
6031
|
+
}
|
|
6032
|
+
const fileRef = inputs.fileRef;
|
|
6033
|
+
if (typeof fileRef !== "string" || !FILE_REF_PATTERN.test(fileRef)) {
|
|
6034
|
+
issues.push({
|
|
6035
|
+
path: `${base}.inputs.fileRef`,
|
|
6036
|
+
severity: "error",
|
|
6037
|
+
message: "inputs.fileRef must be a `=js:$vars.…` expression. " + "The canonical form for an upstream node output is " + "`=js:$vars.<upstream>.output.<field>`. Without the " + "`=js:` prefix the BPMN serializer treats the value " + "as a literal string at runtime."
|
|
6038
|
+
});
|
|
6039
|
+
}
|
|
6040
|
+
for (const port of ["output", "error"]) {
|
|
6041
|
+
if (!(port in outputs)) {
|
|
6042
|
+
issues.push({
|
|
6043
|
+
path: `${base}.outputs.${port}`,
|
|
6044
|
+
severity: "error",
|
|
6045
|
+
message: `outputs.${port} must be present on the instance. ` + `Without it, downstream $vars.${node.id}.${port} ` + "references will not resolve at runtime."
|
|
6046
|
+
});
|
|
6047
|
+
}
|
|
6048
|
+
}
|
|
6049
|
+
const topLevelModel = node.model;
|
|
6050
|
+
if (topLevelModel != null) {
|
|
6051
|
+
issues.push({
|
|
6052
|
+
path: `${base}.model`,
|
|
6053
|
+
severity: "error",
|
|
6054
|
+
message: "Top-level `model` block is forbidden on IxP node " + "instances. The manifest's slim model " + "({ type, serviceType }) lives only in `definitions[]`."
|
|
6055
|
+
});
|
|
6056
|
+
}
|
|
6057
|
+
const legacy = FORBIDDEN_INPUT_FIELDS.filter((k) => (k in inputs));
|
|
6058
|
+
if (legacy.length > 0) {
|
|
6059
|
+
issues.push({
|
|
6060
|
+
path: `${base}.inputs`,
|
|
6061
|
+
severity: "error",
|
|
6062
|
+
message: "Forbidden legacy fields in inputs: " + `${legacy.join(", ")}. These keys were removed from ` + "the current standalone IxP schema and are not " + "returned by `registry get`."
|
|
6063
|
+
});
|
|
6064
|
+
}
|
|
6065
|
+
return issues;
|
|
5884
6066
|
}
|
|
5885
|
-
return this.finishToken(type, word);
|
|
5886
|
-
};
|
|
5887
|
-
var version = "8.17.0";
|
|
5888
|
-
Parser.acorn = {
|
|
5889
|
-
Parser,
|
|
5890
|
-
version,
|
|
5891
|
-
defaultOptions,
|
|
5892
|
-
Position,
|
|
5893
|
-
SourceLocation,
|
|
5894
|
-
getLineInfo,
|
|
5895
|
-
Node,
|
|
5896
|
-
TokenType,
|
|
5897
|
-
tokTypes: types$1,
|
|
5898
|
-
keywordTypes: keywords,
|
|
5899
|
-
TokContext,
|
|
5900
|
-
tokContexts: types,
|
|
5901
|
-
isIdentifierChar,
|
|
5902
|
-
isIdentifierStart,
|
|
5903
|
-
Token,
|
|
5904
|
-
isNewLine,
|
|
5905
|
-
lineBreak,
|
|
5906
|
-
lineBreakG,
|
|
5907
|
-
nonASCIIwhitespace
|
|
5908
6067
|
};
|
|
5909
|
-
function parse3(input, options) {
|
|
5910
|
-
return Parser.parse(input, options);
|
|
5911
|
-
}
|
|
5912
6068
|
|
|
5913
6069
|
// src/services/node-validators/js-expression-syntax-validator.ts
|
|
5914
6070
|
var jsExpressionSyntaxValidator = {
|
|
@@ -6823,6 +6979,26 @@ function extractProcessGuid(nodeType) {
|
|
|
6823
6979
|
}
|
|
6824
6980
|
return match[1];
|
|
6825
6981
|
}
|
|
6982
|
+
function resolveProcessTarget(node, definitions) {
|
|
6983
|
+
if (!isProcessNode({ nodeType: node.type }))
|
|
6984
|
+
return;
|
|
6985
|
+
let subType = "Process";
|
|
6986
|
+
if (definitions) {
|
|
6987
|
+
const sameType = definitions.filter((d) => d.nodeType === node.type);
|
|
6988
|
+
const def = sameType.find((d) => node.typeVersion !== undefined && d.version === node.typeVersion) ?? sameType[0];
|
|
6989
|
+
const model = def?.model;
|
|
6990
|
+
const defBindings = model?.bindings;
|
|
6991
|
+
if (defBindings?.resourceSubType)
|
|
6992
|
+
subType = defBindings.resourceSubType;
|
|
6993
|
+
if (defBindings?.resourceKey) {
|
|
6994
|
+
return { key: defBindings.resourceKey, subType };
|
|
6995
|
+
}
|
|
6996
|
+
}
|
|
6997
|
+
return { key: extractProcessGuid(node.type), subType };
|
|
6998
|
+
}
|
|
6999
|
+
function resolveProcessTargetKey(node, definitions) {
|
|
7000
|
+
return resolveProcessTarget(node, definitions)?.key;
|
|
7001
|
+
}
|
|
6826
7002
|
function createProcessBindings(manifest) {
|
|
6827
7003
|
const processGuid = extractProcessGuid(manifest.nodeType);
|
|
6828
7004
|
const model = manifest.model;
|
|
@@ -6941,20 +7117,9 @@ function collectNodeBindingRefs(node) {
|
|
|
6941
7117
|
}
|
|
6942
7118
|
function collectNodeBindingResourceKeys(node, bindings, definitions) {
|
|
6943
7119
|
const keys = new Set;
|
|
6944
|
-
|
|
6945
|
-
|
|
6946
|
-
|
|
6947
|
-
const def = definitions.find((d) => d.nodeType === node.type);
|
|
6948
|
-
const model = def?.model;
|
|
6949
|
-
const defBindings = model?.bindings;
|
|
6950
|
-
if (defBindings?.resourceKey) {
|
|
6951
|
-
keys.add(defBindings.resourceKey);
|
|
6952
|
-
foundFromDef = true;
|
|
6953
|
-
}
|
|
6954
|
-
}
|
|
6955
|
-
if (!foundFromDef) {
|
|
6956
|
-
keys.add(extractProcessGuid(node.type));
|
|
6957
|
-
}
|
|
7120
|
+
const processKey = resolveProcessTargetKey(node, definitions);
|
|
7121
|
+
if (processKey) {
|
|
7122
|
+
keys.add(processKey);
|
|
6958
7123
|
}
|
|
6959
7124
|
const inputs = node.inputs;
|
|
6960
7125
|
if (typeof inputs?.detail?.connectionResourceId === "string") {
|
|
@@ -7202,6 +7367,37 @@ function extractPromptVariables(content) {
|
|
|
7202
7367
|
}
|
|
7203
7368
|
return [...vars];
|
|
7204
7369
|
}
|
|
7370
|
+
var VARS_NODE_OUTPUT_RE = /^=?\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/;
|
|
7371
|
+
function getProducerOutputFields(node) {
|
|
7372
|
+
if (AGENT_NODE_TYPES.includes(node.type)) {
|
|
7373
|
+
const vars = node.inputs?.agentOutputVariables;
|
|
7374
|
+
if (!Array.isArray(vars) || vars.length === 0)
|
|
7375
|
+
return;
|
|
7376
|
+
const fields = new Set;
|
|
7377
|
+
for (const v of vars) {
|
|
7378
|
+
const id = v?.id;
|
|
7379
|
+
if (typeof id === "string")
|
|
7380
|
+
fields.add(id);
|
|
7381
|
+
}
|
|
7382
|
+
return fields.size > 0 ? fields : undefined;
|
|
7383
|
+
}
|
|
7384
|
+
const output = node.outputs?.output;
|
|
7385
|
+
const props = output?.properties;
|
|
7386
|
+
if (props && typeof props === "object") {
|
|
7387
|
+
return new Set(Object.keys(props));
|
|
7388
|
+
}
|
|
7389
|
+
return;
|
|
7390
|
+
}
|
|
7391
|
+
function decodeSchemaKeyNodeRef(key) {
|
|
7392
|
+
const segments = key.split("__");
|
|
7393
|
+
if (segments.length < 3)
|
|
7394
|
+
return;
|
|
7395
|
+
if (segments[0] === "metadata" || segments[1] !== "output")
|
|
7396
|
+
return;
|
|
7397
|
+
if (segments[0].length === 0)
|
|
7398
|
+
return;
|
|
7399
|
+
return { nodeId: segments[0], field: segments[2] || undefined };
|
|
7400
|
+
}
|
|
7205
7401
|
function collectAgentInputVarIds(raw) {
|
|
7206
7402
|
const ids = new Set;
|
|
7207
7403
|
if (!Array.isArray(raw))
|
|
@@ -7246,6 +7442,25 @@ function formatHydrationHint(diag, flowDir) {
|
|
|
7246
7442
|
}
|
|
7247
7443
|
return `inline-agent hydration ran but the validator still flagged \`${diag.sourceLocation}\`-resolved prompts as empty. This is unexpected — file an issue with the .flow and agent.json contents.`;
|
|
7248
7444
|
}
|
|
7445
|
+
function collectNodeExpressionStrings(nodes) {
|
|
7446
|
+
const expressions = [];
|
|
7447
|
+
const collect = (val) => {
|
|
7448
|
+
if (typeof val === "string") {
|
|
7449
|
+
expressions.push(val);
|
|
7450
|
+
} else if (Array.isArray(val)) {
|
|
7451
|
+
for (const v of val)
|
|
7452
|
+
collect(v);
|
|
7453
|
+
} else if (val && typeof val === "object") {
|
|
7454
|
+
for (const v of Object.values(val))
|
|
7455
|
+
collect(v);
|
|
7456
|
+
}
|
|
7457
|
+
};
|
|
7458
|
+
for (const n of nodes) {
|
|
7459
|
+
collect(n.inputs);
|
|
7460
|
+
collect(n.outputs);
|
|
7461
|
+
}
|
|
7462
|
+
return expressions;
|
|
7463
|
+
}
|
|
7249
7464
|
function extractSupportsErrorHandling(content) {
|
|
7250
7465
|
const map = new Map;
|
|
7251
7466
|
let raw;
|
|
@@ -7333,6 +7548,7 @@ function buildValidationContext(flow) {
|
|
|
7333
7548
|
display: def.display,
|
|
7334
7549
|
handleConfiguration: def.handleConfiguration,
|
|
7335
7550
|
inputDefinition: def.inputDefinition,
|
|
7551
|
+
outputDefinition: def.outputDefinition,
|
|
7336
7552
|
tags: def.tags
|
|
7337
7553
|
});
|
|
7338
7554
|
}
|
|
@@ -7522,11 +7738,14 @@ Validating: ${absolutePath}
|
|
|
7522
7738
|
issues.push(...this.validateGraph(workflow, "", rawDefErrorHandling, currentManifests));
|
|
7523
7739
|
issues.push(...this.validateGlobalVariableUniqueness(workflow, ""));
|
|
7524
7740
|
issues.push(...this.validateGlobalTriggerBindings(workflow, ""));
|
|
7741
|
+
issues.push(...this.validateUnboundInputGlobals(workflow, ""));
|
|
7525
7742
|
issues.push(...this.validateResourceBindings(workflow));
|
|
7526
7743
|
issues.push(...this.validateConnectionIdReuse(workflow));
|
|
7744
|
+
issues.push(...this.validateDuplicateProcessTargets(workflow));
|
|
7527
7745
|
issues.push(...await this.validateConnectorBindingShapes(workflow));
|
|
7528
7746
|
issues.push(...this.validateAgentInputBindings(workflow, hydrationDiagnoses, ""));
|
|
7529
7747
|
issues.push(...this.validateAgentPromptInputRefs(workflow, hydrationDiagnoses, ""));
|
|
7748
|
+
issues.push(...this.validateAgentInputScopeRefs(workflow, hydrationDiagnoses, ""));
|
|
7530
7749
|
issues.push(...await this.validateSolutionRegistrationAndLayout(absolutePath));
|
|
7531
7750
|
const subflows = workflow.subflows ?? {};
|
|
7532
7751
|
for (const [subflowId, entry] of Object.entries(subflows)) {
|
|
@@ -7544,8 +7763,10 @@ Validating: ${absolutePath}
|
|
|
7544
7763
|
issues.push(...this.validateGraph(subGraph, prefix, rawDefErrorHandling, currentManifests));
|
|
7545
7764
|
issues.push(...this.validateGlobalVariableUniqueness(subGraph, prefix));
|
|
7546
7765
|
issues.push(...this.validateGlobalTriggerBindings(subGraph, prefix));
|
|
7766
|
+
issues.push(...this.validateUnboundInputGlobals(subGraph, prefix));
|
|
7547
7767
|
issues.push(...this.validateAgentInputBindings(subGraph, hydrationDiagnoses, prefix));
|
|
7548
7768
|
issues.push(...this.validateAgentPromptInputRefs(subGraph, hydrationDiagnoses, prefix));
|
|
7769
|
+
issues.push(...this.validateAgentInputScopeRefs(subGraph, hydrationDiagnoses, prefix));
|
|
7549
7770
|
}
|
|
7550
7771
|
this.enrichInlineAgentPromptIssues(issues, hydrationDiagnoses, flowDir);
|
|
7551
7772
|
return {
|
|
@@ -7776,6 +7997,131 @@ Validating: ${absolutePath}
|
|
|
7776
7997
|
}
|
|
7777
7998
|
return issues;
|
|
7778
7999
|
}
|
|
8000
|
+
validateAgentInputScopeRefs(graph, diagnoses, pathPrefix) {
|
|
8001
|
+
const agentNodes = graph.nodes.filter((n) => AGENT_NODE_TYPES.includes(n.type));
|
|
8002
|
+
if (agentNodes.length === 0)
|
|
8003
|
+
return [];
|
|
8004
|
+
const nodesById = new Map(graph.nodes.map((n) => [n.id, n]));
|
|
8005
|
+
const nodeIds = new Set(nodesById.keys());
|
|
8006
|
+
const globalIds = new Set((graph.variables?.globals ?? []).map((g) => g.id));
|
|
8007
|
+
const incoming = new Map;
|
|
8008
|
+
for (const edge of graph.edges) {
|
|
8009
|
+
const sources = incoming.get(edge.targetNodeId);
|
|
8010
|
+
if (sources)
|
|
8011
|
+
sources.push(edge.sourceNodeId);
|
|
8012
|
+
else
|
|
8013
|
+
incoming.set(edge.targetNodeId, [edge.sourceNodeId]);
|
|
8014
|
+
}
|
|
8015
|
+
const issues = [];
|
|
8016
|
+
for (const node of agentNodes) {
|
|
8017
|
+
const { byNode: refs, byField } = this.collectAgentVarRefs(node, diagnoses.get(node.id), globalIds);
|
|
8018
|
+
if (refs.size === 0)
|
|
8019
|
+
continue;
|
|
8020
|
+
const wired = incoming.has(node.id);
|
|
8021
|
+
const upstream = wired ? this.collectUpstreamNodeIds(incoming, node.id) : new Set;
|
|
8022
|
+
const missing = [];
|
|
8023
|
+
const notUpstream = [];
|
|
8024
|
+
for (const [refId, origin] of refs) {
|
|
8025
|
+
if (!nodeIds.has(refId))
|
|
8026
|
+
missing.push(origin);
|
|
8027
|
+
else if (wired && !upstream.has(refId))
|
|
8028
|
+
notUpstream.push(origin);
|
|
8029
|
+
}
|
|
8030
|
+
const label = node.display?.label ?? node.id;
|
|
8031
|
+
const path = `${pathPrefix}nodes[${node.id}].inputs.agentInputVariables`;
|
|
8032
|
+
const scope = pathPrefix ? "subflow" : "flow";
|
|
8033
|
+
if (missing.length > 0) {
|
|
8034
|
+
issues.push({
|
|
8035
|
+
path,
|
|
8036
|
+
message: `Agent "${label}" reads ${missing.join(", ")}, but no such node exists in this ${scope}. Studio Web rejects the flow on open with "that variable is not available in this scope", and at runtime the input resolves to nothing. Point the reference at an existing node id (then re-run \`uip agent refresh --inline-in-flow\` so agent.json and the node agree), or drop the input.`,
|
|
8037
|
+
severity: "error"
|
|
8038
|
+
});
|
|
8039
|
+
}
|
|
8040
|
+
if (notUpstream.length > 0) {
|
|
8041
|
+
issues.push({
|
|
8042
|
+
path,
|
|
8043
|
+
message: `Agent "${label}" reads ${notUpstream.join(", ")}, but no edge path leads from that node to "${node.id}", so it has not run when the agent does and its output is not written yet. Studio Web reports the same variable as not available in this scope. Wire the node upstream of the agent, or bind an input the agent can see.`,
|
|
8044
|
+
severity: "warning"
|
|
8045
|
+
});
|
|
8046
|
+
}
|
|
8047
|
+
const invalidFields = [];
|
|
8048
|
+
for (const ref2 of byField) {
|
|
8049
|
+
if (!nodeIds.has(ref2.nodeId))
|
|
8050
|
+
continue;
|
|
8051
|
+
const producer = nodesById.get(ref2.nodeId);
|
|
8052
|
+
if (!producer)
|
|
8053
|
+
continue;
|
|
8054
|
+
const outputFields = getProducerOutputFields(producer);
|
|
8055
|
+
if (!outputFields)
|
|
8056
|
+
continue;
|
|
8057
|
+
if (outputFields.has(ref2.field))
|
|
8058
|
+
continue;
|
|
8059
|
+
const available = [...outputFields].join(", ");
|
|
8060
|
+
invalidFields.push(`${ref2.origin} — node "${ref2.nodeId}" has no output named "${ref2.field}"` + (available ? ` (available: ${available})` : ""));
|
|
8061
|
+
}
|
|
8062
|
+
if (invalidFields.length > 0) {
|
|
8063
|
+
issues.push({
|
|
8064
|
+
path,
|
|
8065
|
+
message: `Agent "${label}" reads ${invalidFields.join("; ")}. Fix the binding to use an output the producer node declares, or add the missing output to the producer.`,
|
|
8066
|
+
severity: "error"
|
|
8067
|
+
});
|
|
8068
|
+
}
|
|
8069
|
+
}
|
|
8070
|
+
return issues;
|
|
8071
|
+
}
|
|
8072
|
+
collectAgentVarRefs(node, diag, globalIds) {
|
|
8073
|
+
const byNode = new Map;
|
|
8074
|
+
const fieldSeen = new Set;
|
|
8075
|
+
const byField = [];
|
|
8076
|
+
const add = (nodeId, field, origin) => {
|
|
8077
|
+
if (globalIds.has(nodeId))
|
|
8078
|
+
return;
|
|
8079
|
+
if (!byNode.has(nodeId))
|
|
8080
|
+
byNode.set(nodeId, origin);
|
|
8081
|
+
if (field) {
|
|
8082
|
+
const fk = `${nodeId}\x00${field}`;
|
|
8083
|
+
if (!fieldSeen.has(fk)) {
|
|
8084
|
+
fieldSeen.add(fk);
|
|
8085
|
+
byField.push({ nodeId, field, origin });
|
|
8086
|
+
}
|
|
8087
|
+
}
|
|
8088
|
+
};
|
|
8089
|
+
for (const key of diag?.declaredInputKeys ?? []) {
|
|
8090
|
+
const ref2 = decodeSchemaKeyNodeRef(key);
|
|
8091
|
+
if (ref2) {
|
|
8092
|
+
add(ref2.nodeId, ref2.field, `\`$vars.${key.split("__").join(".")}\` (agent.json input "${key}")`);
|
|
8093
|
+
}
|
|
8094
|
+
}
|
|
8095
|
+
const bound = node.inputs?.agentInputVariables;
|
|
8096
|
+
if (Array.isArray(bound)) {
|
|
8097
|
+
for (const entry of bound) {
|
|
8098
|
+
if (!entry || typeof entry !== "object")
|
|
8099
|
+
continue;
|
|
8100
|
+
const binding = entry.binding;
|
|
8101
|
+
if (typeof binding !== "string")
|
|
8102
|
+
continue;
|
|
8103
|
+
const match = VARS_NODE_OUTPUT_RE.exec(binding);
|
|
8104
|
+
if (!match)
|
|
8105
|
+
continue;
|
|
8106
|
+
add(match[1], match[2], `\`${binding.replace(/^=/, "")}\` (agentInputVariables binding)`);
|
|
8107
|
+
}
|
|
8108
|
+
}
|
|
8109
|
+
return { byNode, byField };
|
|
8110
|
+
}
|
|
8111
|
+
collectUpstreamNodeIds(incoming, targetId) {
|
|
8112
|
+
const upstream = new Set;
|
|
8113
|
+
const queue = [targetId];
|
|
8114
|
+
while (queue.length > 0) {
|
|
8115
|
+
const current2 = queue.pop();
|
|
8116
|
+
for (const source of incoming.get(current2) ?? []) {
|
|
8117
|
+
if (upstream.has(source))
|
|
8118
|
+
continue;
|
|
8119
|
+
upstream.add(source);
|
|
8120
|
+
queue.push(source);
|
|
8121
|
+
}
|
|
8122
|
+
}
|
|
8123
|
+
return upstream;
|
|
8124
|
+
}
|
|
7779
8125
|
canonicalInputKey(rawVar) {
|
|
7780
8126
|
if (!rawVar.startsWith("input."))
|
|
7781
8127
|
return;
|
|
@@ -7938,22 +8284,7 @@ Validating: ${absolutePath}
|
|
|
7938
8284
|
const triggerNodeIds = new Set(nodes.filter((n) => typeof n.type === "string" && n.type.startsWith("core.trigger.")).map((n) => n.id));
|
|
7939
8285
|
if (triggerNodeIds.size === 0)
|
|
7940
8286
|
return issues;
|
|
7941
|
-
const expressions =
|
|
7942
|
-
const collect = (val) => {
|
|
7943
|
-
if (typeof val === "string") {
|
|
7944
|
-
expressions.push(val);
|
|
7945
|
-
} else if (Array.isArray(val)) {
|
|
7946
|
-
for (const v of val)
|
|
7947
|
-
collect(v);
|
|
7948
|
-
} else if (val && typeof val === "object") {
|
|
7949
|
-
for (const v of Object.values(val))
|
|
7950
|
-
collect(v);
|
|
7951
|
-
}
|
|
7952
|
-
};
|
|
7953
|
-
for (const n of nodes) {
|
|
7954
|
-
collect(n.inputs);
|
|
7955
|
-
collect(n.outputs);
|
|
7956
|
-
}
|
|
8287
|
+
const expressions = collectNodeExpressionStrings(nodes);
|
|
7957
8288
|
const refRe = /\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/g;
|
|
7958
8289
|
const reported = new Set;
|
|
7959
8290
|
for (const expr of expressions) {
|
|
@@ -7981,6 +8312,65 @@ Validating: ${absolutePath}
|
|
|
7981
8312
|
}
|
|
7982
8313
|
return issues;
|
|
7983
8314
|
}
|
|
8315
|
+
validateUnboundInputGlobals(flow, pathPrefix) {
|
|
8316
|
+
const issues = [];
|
|
8317
|
+
const nodes = flow.nodes ?? [];
|
|
8318
|
+
const inGlobals = (flow.variables?.globals ?? []).filter((g) => g.id && g.direction === "in");
|
|
8319
|
+
if (inGlobals.length === 0)
|
|
8320
|
+
return issues;
|
|
8321
|
+
const triggerNodes = nodes.filter((n) => isStartEventNode({
|
|
8322
|
+
id: n.id,
|
|
8323
|
+
type: n.type,
|
|
8324
|
+
typeVersion: n.typeVersion ?? "1.0"
|
|
8325
|
+
}));
|
|
8326
|
+
if (triggerNodes.length === 0)
|
|
8327
|
+
return issues;
|
|
8328
|
+
const definitions = flow.definitions ?? [];
|
|
8329
|
+
const manifestInputIds = (node) => {
|
|
8330
|
+
const def = definitions.find((d) => d.nodeType === node.type && d.version === node.typeVersion) ?? definitions.find((d) => d.nodeType === node.type);
|
|
8331
|
+
const props = def?.outputDefinition?.output?.schema?.properties;
|
|
8332
|
+
return props && typeof props === "object" ? Object.keys(props) : [];
|
|
8333
|
+
};
|
|
8334
|
+
const manifestInputs = new Set;
|
|
8335
|
+
const globalsDrivenTriggers = [];
|
|
8336
|
+
for (const t of triggerNodes) {
|
|
8337
|
+
const ids = manifestInputIds(t);
|
|
8338
|
+
if (ids.length > 0) {
|
|
8339
|
+
for (const id of ids)
|
|
8340
|
+
manifestInputs.add(id);
|
|
8341
|
+
} else {
|
|
8342
|
+
globalsDrivenTriggers.push(t.id);
|
|
8343
|
+
}
|
|
8344
|
+
}
|
|
8345
|
+
if (globalsDrivenTriggers.length === 0)
|
|
8346
|
+
return issues;
|
|
8347
|
+
const triggerIds = new Set(triggerNodes.map((n) => n.id));
|
|
8348
|
+
const readViaTrigger = new Set;
|
|
8349
|
+
const refRe = /\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/g;
|
|
8350
|
+
for (const expr of collectNodeExpressionStrings(nodes)) {
|
|
8351
|
+
for (const match of expr.matchAll(refRe)) {
|
|
8352
|
+
if (triggerIds.has(match[1]))
|
|
8353
|
+
readViaTrigger.add(match[2]);
|
|
8354
|
+
}
|
|
8355
|
+
}
|
|
8356
|
+
const soleTrigger = globalsDrivenTriggers.length === 1 ? globalsDrivenTriggers[0] : undefined;
|
|
8357
|
+
for (const g of inGlobals) {
|
|
8358
|
+
if (g.triggerNodeId && triggerIds.has(g.triggerNodeId))
|
|
8359
|
+
continue;
|
|
8360
|
+
if (readViaTrigger.has(g.id))
|
|
8361
|
+
continue;
|
|
8362
|
+
if (manifestInputs.has(g.id))
|
|
8363
|
+
continue;
|
|
8364
|
+
const detail = g.triggerNodeId ? `its "triggerNodeId" is "${g.triggerNodeId}", which is not a trigger node in this flow` : `it has no "triggerNodeId"`;
|
|
8365
|
+
const fix = soleTrigger ? `Set "triggerNodeId": "${soleTrigger}" on the "${g.id}" global.` : `Set "triggerNodeId" on the "${g.id}" global to the trigger that supplies it (${globalsDrivenTriggers.join(", ")}).`;
|
|
8366
|
+
issues.push({
|
|
8367
|
+
path: `${pathPrefix}variables.globals[${g.id}].triggerNodeId`,
|
|
8368
|
+
message: `Input variable "${g.id}" is omitted from the packed entry point's \`input.properties\` because ${detail}. A deployed process or trigger then has no way to pass "${g.id}" — while \`flow validate\`, \`flow format\`, and \`flow debug --inputs\` all stay green. ${fix}`,
|
|
8369
|
+
severity: "warning"
|
|
8370
|
+
});
|
|
8371
|
+
}
|
|
8372
|
+
return issues;
|
|
8373
|
+
}
|
|
7984
8374
|
validateResourceBindings(workflow) {
|
|
7985
8375
|
const issues = [];
|
|
7986
8376
|
const bindings = workflow.bindings ?? [];
|
|
@@ -7991,12 +8381,14 @@ Validating: ${absolutePath}
|
|
|
7991
8381
|
...workflow.nodes.map((n) => ({
|
|
7992
8382
|
id: n.id,
|
|
7993
8383
|
type: n.type,
|
|
8384
|
+
typeVersion: n.typeVersion,
|
|
7994
8385
|
inputs: n.inputs,
|
|
7995
8386
|
scope: ""
|
|
7996
8387
|
})),
|
|
7997
8388
|
...Object.entries(subflows).flatMap(([subflowId, sub]) => (sub.nodes ?? []).map((n) => ({
|
|
7998
8389
|
id: n.id,
|
|
7999
8390
|
type: n.type,
|
|
8391
|
+
typeVersion: n.typeVersion,
|
|
8000
8392
|
inputs: n.inputs,
|
|
8001
8393
|
scope: `subflows[${subflowId}].`
|
|
8002
8394
|
})))
|
|
@@ -8054,6 +8446,52 @@ Validating: ${absolutePath}
|
|
|
8054
8446
|
}
|
|
8055
8447
|
return issues;
|
|
8056
8448
|
}
|
|
8449
|
+
validateDuplicateProcessTargets(workflow) {
|
|
8450
|
+
const issues = [];
|
|
8451
|
+
const subflows = workflow.subflows ?? {};
|
|
8452
|
+
const definitions = workflow.definitions;
|
|
8453
|
+
const buckets = new Map;
|
|
8454
|
+
const recordNode = (node, scope) => {
|
|
8455
|
+
const target = resolveProcessTarget(node, definitions);
|
|
8456
|
+
if (!target)
|
|
8457
|
+
return;
|
|
8458
|
+
const bucketKey = `${target.subType}\x00${target.key}`;
|
|
8459
|
+
let list2 = buckets.get(bucketKey);
|
|
8460
|
+
if (!list2) {
|
|
8461
|
+
list2 = [];
|
|
8462
|
+
buckets.set(bucketKey, list2);
|
|
8463
|
+
}
|
|
8464
|
+
list2.push({
|
|
8465
|
+
nodeId: node.id,
|
|
8466
|
+
label: node.display?.label ?? "",
|
|
8467
|
+
scope,
|
|
8468
|
+
targetKey: target.key
|
|
8469
|
+
});
|
|
8470
|
+
};
|
|
8471
|
+
for (const node of workflow.nodes) {
|
|
8472
|
+
recordNode(node, "");
|
|
8473
|
+
}
|
|
8474
|
+
for (const [subflowId, sub] of Object.entries(subflows)) {
|
|
8475
|
+
for (const node of sub.nodes ?? []) {
|
|
8476
|
+
recordNode(node, `subflows[${subflowId}].`);
|
|
8477
|
+
}
|
|
8478
|
+
}
|
|
8479
|
+
for (const occurrences of buckets.values()) {
|
|
8480
|
+
if (occurrences.length < 2)
|
|
8481
|
+
continue;
|
|
8482
|
+
const distinctLabels = new Set(occurrences.map((o) => o.label));
|
|
8483
|
+
if (distinctLabels.size < 2)
|
|
8484
|
+
continue;
|
|
8485
|
+
const nodeList = occurrences.map((o) => `${o.scope}nodes[${o.nodeId}] ("${o.label}")`).join(", ");
|
|
8486
|
+
const first = occurrences[0];
|
|
8487
|
+
issues.push({
|
|
8488
|
+
path: `${first.scope}nodes[${first.nodeId}]`,
|
|
8489
|
+
severity: "warning",
|
|
8490
|
+
message: `Process target "${first.targetKey}" is invoked by ${occurrences.length} differently-named nodes (${nodeList}). Two differently-named nodes resolving to the same process/function usually means a node was duplicated without re-pointing its target — verify each node calls the intended process. If this reuse is intentional, ignore this warning.`
|
|
8491
|
+
});
|
|
8492
|
+
}
|
|
8493
|
+
return issues;
|
|
8494
|
+
}
|
|
8057
8495
|
async validateConnectorBindingShapes(workflow) {
|
|
8058
8496
|
const catalog = await this.loadConnectorCatalogCached();
|
|
8059
8497
|
return validateConnectorBindings(workflow, catalog, {
|
|
@@ -8362,4 +8800,4 @@ Validating: ${absolutePath}
|
|
|
8362
8800
|
|
|
8363
8801
|
export { ensureDirectory, FlowEvalFileStore, readInlineAgentSource, isInlineAgentNodeType, fileNodesToPackagingNodes, packageInlineAgents, stageInlineAgentPackageFiles, buildInlineAgentDescriptors, writePackagingArtifacts, writePackagingArtifactsDetailed, regenerateBindingsFile, NodeTypeNotFoundError, NodeTypeNotEnabledError, SourceRequiredError, listNodesInFlow, ensureProcessBindings, collectNodeBindingResourceKeys, addNodeToFlow, deleteNodeFromFlow, ERROR_SOURCE_PORT, enableErrorHandlingForErrorEdges, expandHandleIds, portMatchesTemplate, captureMigrationIssues, formatMigrationFailureMessage, isConnectorTriggerType, isConnectorWaitForEventType, isEventDrivenConnectorType, scanDetailForCrossNodeBindings, connectorNodeValidator, FlowValidateService };
|
|
8364
8802
|
|
|
8365
|
-
//# debugId=
|
|
8803
|
+
//# debugId=4018E76FF70902A364756E2164756E21
|