@uipath/maestro-tool 1.204.0 → 1.205.0-preview.258
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{DmnFactory-VWZOSZHH-ggnfcqpa.js → DmnFactory-L7MABUC6-qkvfv1cw.js} +143 -98
- package/dist/{KieDmnMarshaller-6TTUU5B4-6apscj68.js → KieDmnMarshaller-LGE63WDG-cybersk4.js} +3 -3
- package/dist/THIRD-PARTY-NOTICES.md +47 -23
- package/dist/{authoring-ed7fgg74.js → authoring-5xyc2bbq.js} +8 -6
- package/dist/{authoring-1qn6m2g3.js → authoring-ehed6df3.js} +8 -6
- package/dist/{authoring-ex7mq672.js → authoring-rw21p50g.js} +8 -6
- package/dist/{binding-service-dj04a6e6.js → binding-service-b2v8y2sb.js} +44 -35
- package/dist/{bpmn-action-type-validator-cja8vct2.js → bpmn-action-type-validator-xg4ncg63.js} +2 -2
- package/dist/{bpmn-binding-resolver-3v5223kx.js → bpmn-binding-resolver-wz7xk54x.js} +9 -7
- package/dist/{bpmn-branch-a25m8bc2.js → bpmn-branch-ywmc5egw.js} +48 -47
- package/dist/{bpmn-format-service-64fsaq4j.js → bpmn-format-service-aq8ekvy2.js} +7 -5
- package/dist/{bpmn-refresh-service-ytf3ngzm.js → bpmn-refresh-service-gy1ekx3m.js} +10 -8
- package/dist/{bpmn-update-metadata-service-jpz5mfk4.js → bpmn-update-metadata-service-rnf421er.js} +7 -5
- package/dist/bpmn-validate-service-7e3q83nh.js +16 -0
- package/dist/{business-rule-export-j6xxtp5s.js → business-rule-export-xa719ws5.js} +2 -2
- package/dist/canvas-notes-xc2ejzqj.js +23 -0
- package/dist/{case-api-bxcxbgm9.js → case-api-v64traxv.js} +9 -7
- package/dist/case-bindings-service-hwz2h03e.js +434 -0
- package/dist/case-debug-solution-projects-xae2d4vj.js +34 -0
- package/dist/{case-debug-studio-web-service-kt5efenk.js → case-debug-studio-web-service-5h6djff3.js} +22 -14
- package/dist/{case-described-io-service-kn3rvy53.js → case-described-io-service-tap9pk70.js} +41 -11
- package/dist/case-event-trigger-bindings-z4q1kzgv.js +20 -0
- package/dist/{case-format-service-k8rcv0wp.js → case-format-service-q42ba5pn.js} +6 -4
- package/dist/{case-pack-service-92trp8xj.js → case-pack-service-0j9r3cd2.js} +9 -7
- package/dist/case-schema-version-zs5qsr1b.js +20 -0
- package/dist/{case-shape-reader-ftc4ve13.js → case-shape-reader-14qzcj4v.js} +1 -1
- package/dist/{case-splice-service-7n51cpx3.js → case-splice-service-bk6rvr75.js} +60 -11
- package/dist/{case-validate-service-c8jcvw85.js → case-validate-service-80p52d8r.js} +134 -46
- package/dist/{connector-enrichment-service-ba0vq2sk.js → connector-enrichment-service-9p98gfmc.js} +32 -28
- package/dist/{connector-lookup-service-mzfsqb21.js → connector-lookup-service-v39ab3qh.js} +10 -8
- package/dist/{connector-service-8yk65k3n.js → connector-service-yz5c6xag.js} +229 -52
- package/dist/connector-task-shape-dcb3v2r5.js +14 -0
- package/dist/{connector-task-spec-bn3qaa1w.js → connector-task-spec-pvzzenwg.js} +206 -49
- package/dist/de-UZI7FJDO-awjpqfz0.js +200 -0
- package/dist/{de-MUJPA4EB-dpg7t2rw.js → de-UZI7FJDO-mwvc4cxe.js} +29 -2
- package/dist/{de-FGHEJRCI-rv513mfh.js → de-WLW6KWOJ-2qnsqdtw.js} +238 -31
- package/dist/debug-conversation-trigger-f4a07w23.js +33 -0
- package/dist/{debug-http-client-73errmgs.js → debug-http-client-8t7t701c.js} +7 -5
- package/dist/{debug-service-8kjtrm88.js → debug-service-c7y7f216.js} +8 -6
- package/dist/{edge-service-7092t84f.js → edge-service-vnn1p29d.js} +18 -13
- package/dist/{embedded-file-reader-v8c2yj2a.js → embedded-file-reader-r66242ey.js} +2 -2
- package/dist/en-EJCBA3LK-0wb3b1xy.js +146 -0
- package/dist/{en-FBPVNKFN-dqt573xn.js → en-EJCBA3LK-dtpdghgj.js} +12 -4
- package/dist/{en-BWGKA5OE-1qkvb9rn.js → en-M7GQYBV2-5nfmpnfz.js} +88 -6
- package/dist/{enrichment-service-yjv2eb8h.js → enrichment-service-njfr2m2s.js} +52 -15
- package/dist/{es-7SE7HX2X-8yh1aj2y.js → es-4UBUTCQA-m1ytpyx2.js} +29 -2
- package/dist/es-4UBUTCQA-t7hsackg.js +200 -0
- package/dist/{es-KR3ZSNMP-84zphx0x.js → es-5THCNRFN-tqwyrdgy.js} +235 -28
- package/dist/{es-MX-2MYFZU7X-3rek4r73.js → es-MX-5RELIXKI-9jhqtddc.js} +29 -2
- package/dist/es-MX-5RELIXKI-jtjbcxbb.js +200 -0
- package/dist/{es-MX-XXZJGC4R-2mr8jtgm.js → es-MX-TWZBRAXK-gqd9swzw.js} +237 -30
- package/dist/filter-engine-7ep90g7f.js +11 -0
- package/dist/{flow-api-y70m8n82.js → flow-api-qj89cv18.js} +17 -10
- package/dist/{flow-debug-service-f59xnvdf.js → flow-debug-service-a7vd9eht.js} +109 -71
- package/dist/{flow-eval-node-target-v1gra12k.js → flow-eval-node-target-fv15zc9f.js} +19 -18
- package/dist/flow-eval-run-api-3xt5n21a.js +16 -0
- package/dist/{flow-eval-run-service-hmfbng78.js → flow-eval-run-service-keqkwjg1.js} +92 -99
- package/dist/{flow-eval-service-7tpvhn9b.js → flow-eval-service-5j1rwx32.js} +169 -416
- package/dist/{flow-init-sdk-source-3gxfr40c.js → flow-init-sdk-source-spm577pw.js} +8 -6
- package/dist/{flow-init-service-jawbgb3b.js → flow-init-service-pz2b02z9.js} +25 -20
- package/dist/{flow-io-2qapk1ge.js → flow-io-0yftj03d.js} +17 -12
- package/dist/{flow-migrate-service-3vyydvyp.js → flow-migrate-service-f0cavrsr.js} +18 -13
- package/dist/{flow-pack-service-ypbwn9p1.js → flow-pack-service-seegwatd.js} +59 -45
- package/dist/{flow-validate-service-6ra3j72r.js → flow-validate-service-hgswxecb.js} +198 -93
- package/dist/{fr-Y6NPVODW-8vr1ja4b.js → fr-CERONSRC-edpxhbmb.js} +237 -30
- package/dist/{fr-MDFKNZ4C-h4a122k9.js → fr-VBM5WRC2-63z7w4mh.js} +29 -2
- package/dist/fr-VBM5WRC2-707ha692.js +200 -0
- package/dist/{governance-fetcher-09dgr70s.js → governance-fetcher-w11mhrn6.js} +8 -6
- package/dist/{headless-7rs6g9wg.js → headless-z9enfh9f.js} +4 -4
- package/dist/hitPolicyResult-CGCR73CW-tvmbx1r7.js +66 -0
- package/dist/{hitl-service-pc3xwzxh.js → hitl-service-zsnxqkhb.js} +17 -12
- package/dist/{index-48tf2e7y.js → index-1a83vhkx.js} +59 -35
- package/dist/{index-jmy02p6v.js → index-3366ft04.js} +44 -6
- package/dist/{index-wmffgzmr.js → index-5dxh9z60.js} +21751 -11098
- package/dist/{index-vj0f8thg.js → index-91v7sjfs.js} +7 -5
- package/dist/{index-cpgb4hp8.js → index-d60j7q07.js} +8 -6
- package/dist/{index-vhm7bexy.js → index-da0zh33m.js} +8 -6
- package/dist/{index-1htnjt3c.js → index-ewv0axs9.js} +1087 -213
- package/dist/index-f3pbfe53.js +67 -0
- package/dist/{index-ng2f77my.js → index-fyc0k5dd.js} +985 -617
- package/dist/{index-n7n2d0tb.js → index-gjg7tpcx.js} +66 -2230
- package/dist/index-gmkec7es.js +29 -0
- package/dist/{index-3bv3wtc0.js → index-n37fqnh7.js} +6 -5
- package/dist/{index-hhsf00x8.js → index-ngs0a2he.js} +1 -1
- package/dist/index-s6q9xjhw.js +25 -0
- package/dist/{index-j2r3jb6c.js → index-xq6ajhgq.js} +2 -2
- package/dist/index.js +2 -2
- package/dist/init-entry-points-g4za9kc0.js +102 -0
- package/dist/inline-entity-resolver-nzfs8hb6.js +46 -0
- package/dist/input-reader-3250qtv2.js +15 -0
- package/dist/input-reader-3398edew.js +15 -0
- package/dist/{ja-UTQEAP34-8e0q6swp.js → ja-43QL7CGO-c3q8gre9.js} +29 -2
- package/dist/ja-43QL7CGO-h6qfxfay.js +200 -0
- package/dist/{ja-Q5PXKJ2V-p4msxzjd.js → ja-U2MCNHGT-gz0ap1jk.js} +235 -28
- package/dist/{known-types-3dm8xfd0.js → known-types-g1bvvvcw.js} +5 -5
- package/dist/ko-TLL6Z6CD-ag6gjynr.js +200 -0
- package/dist/{ko-AXCHW2OK-askct7f6.js → ko-TLL6Z6CD-wrt3n8a9.js} +29 -2
- package/dist/{ko-AYBDSRZG-41mdmsg1.js → ko-XAUYQWDR-zp81gjp4.js} +237 -30
- package/dist/localSolutionDiscovery-3fs774b8.js +17 -0
- package/dist/{maestro-automate-entry-4qg1z689.js → maestro-automate-entry-wycktqqt.js} +2 -2
- package/dist/{maestro-debug-service-c81w1wrx.js → maestro-debug-service-5edvsets.js} +17 -15
- package/dist/{maestro-pack-service-9qbtap5h.js → maestro-pack-service-hpvmq8f9.js} +9 -7
- package/dist/migration-diagnosis-5tftr979.js +99 -0
- package/dist/{node-epyxn4nd.js → node-5g80as4s.js} +29 -15
- package/dist/node-service-gsq162p5.js +101 -0
- package/dist/{node-strategy-5pz40tee.js → node-strategy-v442hwgd.js} +1 -1
- package/dist/node-sync-service-qxhh9e5m.js +65 -0
- package/dist/out-target-666eg2kf.js +115 -0
- package/dist/{packager-tool-yphr25e9.js → packager-tool-0jn0my4b.js} +4 -2
- package/dist/packager-tool-0z498fh0.js +331 -0
- package/dist/{packager-tool-j6q8v3kc.js → packager-tool-1q0ee9ht.js} +5 -4
- package/dist/packager-tool-20592jhn.js +74 -0
- package/dist/{packager-tool-zvpkw29f.js → packager-tool-212khq09.js} +538 -16
- package/dist/{packager-tool-7msx23gd.js → packager-tool-2qywkm61.js} +13 -2
- package/dist/{packager-tool-b4t0wt7a.js → packager-tool-3kx2vrwn.js} +12 -13
- package/dist/{packager-tool-a0f48rfb.js → packager-tool-42xfgd4y.js} +6 -24
- package/dist/{packager-tool-myvay41d.js → packager-tool-57bbfe26.js} +3 -3
- package/dist/{packager-tool-vte7g48a.js → packager-tool-5hnx28q0.js} +5 -3
- package/dist/{packager-tool-xd3rq6k0.js → packager-tool-629qqbfp.js} +2 -2
- package/dist/packager-tool-6g510cab.js +1178 -0
- package/dist/packager-tool-6sm17vbx.js +336 -0
- package/dist/{packager-tool-yy101ck2.js → packager-tool-6tthp3g5.js} +52 -32
- package/dist/{packager-tool-d88rqwk8.js → packager-tool-6z1hsm2h.js} +13 -5
- package/dist/packager-tool-7hw344bt.js +107 -0
- package/dist/{packager-tool-6xrzgn0z.js → packager-tool-7vh4gasn.js} +1 -1
- package/dist/packager-tool-7ym4rqd1.js +153 -0
- package/dist/packager-tool-8p3ymd4v.js +14 -0
- package/dist/{packager-tool-kme3q8xv.js → packager-tool-8tv6dvs5.js} +18 -8
- package/dist/{packager-tool-c94w8xmz.js → packager-tool-9c2hte0h.js} +16110 -13031
- package/dist/{packager-tool-npr79108.js → packager-tool-ajhgr4bs.js} +51 -8
- package/dist/{packager-tool-8pydv61j.js → packager-tool-ajth6af3.js} +588 -16
- package/dist/{packager-tool-nct4k0y8.js → packager-tool-arbc078z.js} +280 -416
- package/dist/{packager-tool-k0bc2f6w.js → packager-tool-b84rs07t.js} +137 -45
- package/dist/{packager-tool-4tf3tq1b.js → packager-tool-bd7t6p8y.js} +6 -4
- package/dist/{packager-tool-q02t6n13.js → packager-tool-bhhym40d.js} +26 -3
- package/dist/packager-tool-bttxjdhx.js +94 -0
- package/dist/packager-tool-c4n4m87w.js +52 -0
- package/dist/{packager-tool-8xyea2av.js → packager-tool-cc2q603y.js} +2 -3
- package/dist/{packager-tool-8yjmkys9.js → packager-tool-cza49qc1.js} +1681 -459
- package/dist/{packager-tool-5jb06280.js → packager-tool-d1kd88zq.js} +1 -1
- package/dist/{packager-tool-w3d2891y.js → packager-tool-dpp8z5q3.js} +8 -5
- package/dist/{packager-tool-wbtykfb2.js → packager-tool-dzd3y9p0.js} +2 -2
- package/dist/{packager-tool-rs4cgyy5.js → packager-tool-f6bh7bsm.js} +9 -10
- package/dist/{packager-tool-83hg21mr.js → packager-tool-f7zn3gsf.js} +6 -6
- package/dist/{packager-tool-mtpztxtc.js → packager-tool-fwfh4zz7.js} +2 -1
- package/dist/packager-tool-g2b0zqch.js +217 -0
- package/dist/{packager-tool-xdxr3ync.js → packager-tool-hdxtgckw.js} +11 -1
- package/dist/{packager-tool-gtzw8sw4.js → packager-tool-jexxh6qf.js} +51 -6
- package/dist/{packager-tool-zq25fdcg.js → packager-tool-jt51hwvr.js} +5 -5
- package/dist/packager-tool-k7n4sf7v.js +16 -0
- package/dist/{packager-tool-fgaphqq0.js → packager-tool-kd0whk4p.js} +1 -1
- package/dist/{packager-tool-3t417qyw.js → packager-tool-ktnfjmbs.js} +6 -6
- package/dist/packager-tool-kvp4ttef.js +307 -0
- package/dist/packager-tool-m1901c0c.js +1256 -0
- package/dist/packager-tool-mgcz986r.js +143 -0
- package/dist/{packager-tool-8xhjr5ya.js → packager-tool-mrskd7mn.js} +1 -1
- package/dist/{packager-tool-5s7249f4.js → packager-tool-ms1smy5t.js} +1 -1
- package/dist/{packager-tool-kveaemqp.js → packager-tool-msecps3h.js} +74 -47
- package/dist/packager-tool-n90231c7.js +2 -0
- package/dist/{packager-tool-ajjpgh1s.js → packager-tool-nkbz7fsb.js} +161 -83
- package/dist/packager-tool-nsh0qg9g.js +40 -0
- package/dist/{packager-tool-7q6z6npd.js → packager-tool-pcvhcn2k.js} +93 -11
- package/dist/packager-tool-qrs1525h.js +69 -0
- package/dist/packager-tool-qs3gymeb.js +92 -0
- package/dist/{packager-tool-wf95q0fn.js → packager-tool-r6a4pjjh.js} +32 -13
- package/dist/{packager-tool-2wbgdx7c.js → packager-tool-rcx6mwf1.js} +5 -5
- package/dist/{packager-tool-zbrda9sn.js → packager-tool-rk25wp3c.js} +1 -1
- package/dist/{packager-tool-nase5ajk.js → packager-tool-rp7pny4t.js} +19 -5
- package/dist/packager-tool-s695j0qj.js +2 -0
- package/dist/packager-tool-s7c0dg22.js +1117 -0
- package/dist/{case-bindings-service-hpz8w81a.js → packager-tool-s7frnjqb.js} +20 -233
- package/dist/{packager-tool-2k0hp4st.js → packager-tool-sb08yxk6.js} +2 -2
- package/dist/{packager-tool-b39nrh8y.js → packager-tool-sga4h8yj.js} +5 -6
- package/dist/packager-tool-sm8ertv4.js +9 -0
- package/dist/{packager-tool-ts5t1nmn.js → packager-tool-sxqtxw0e.js} +15 -10
- package/dist/packager-tool-t4zrz5gd.js +18 -0
- package/dist/{packager-tool-pp11j8zp.js → packager-tool-t79p62kr.js} +3 -2
- package/dist/{packager-tool-ps84n76y.js → packager-tool-tgh9btcq.js} +2 -2
- package/dist/{packager-tool-x2py933t.js → packager-tool-tzc6xsp3.js} +1802 -378
- package/dist/packager-tool-v5ft7109.js +35 -0
- package/dist/{packager-tool-rkv04anh.js → packager-tool-vv9cf7n5.js} +12 -56
- package/dist/{packager-tool-z1qbc0qf.js → packager-tool-wv85dhy2.js} +2 -8
- package/dist/{packager-tool-znhjsec2.js → packager-tool-wwbk750c.js} +10804 -25507
- package/dist/packager-tool-xj0agqpk.js +11 -0
- package/dist/{packager-tool-t2xr2f9r.js → packager-tool-xqghssg3.js} +1 -1
- package/dist/{packager-tool-ma2ra4pe.js → packager-tool-xr5pkebd.js} +6 -6
- package/dist/packager-tool-y4tyghzf.js +26 -0
- package/dist/{packager-tool-9bt3hs56.js → packager-tool-y57r93yz.js} +721 -90
- package/dist/packager-tool-ygdbhb2b.js +62 -0
- package/dist/{packager-tool-v99ygh9f.js → packager-tool-yn33pw57.js} +124 -58
- package/dist/packager-tool-yp84p93n.js +41 -0
- package/dist/{packager-tool-yv10w46z.js → packager-tool-zgm0r4yp.js} +57 -205
- package/dist/packager-tool.js +26 -17
- package/dist/{project-artifacts-ygsyzgbk.js → project-artifacts-tedh0mf8.js} +1 -1
- package/dist/{project-validator-ndx5f8vg.js → project-validator-njsprtzv.js} +5 -4
- package/dist/{pt-BR-TKHNHMET-sn91xyq0.js → pt-BR-GNQNAAZ2-xadharv4.js} +237 -30
- package/dist/{pt-BR-Y6K6XHXK-mp3hwhw1.js → pt-BR-USP2T7GD-pedn77m1.js} +29 -2
- package/dist/pt-BR-USP2T7GD-rppy42ym.js +200 -0
- package/dist/{pt-3DIO5QWG-59b3f4bc.js → pt-RMIAKZB4-67enhx3m.js} +29 -2
- package/dist/pt-RMIAKZB4-t80exmp7.js +200 -0
- package/dist/{pt-ROXU257Y-2f6bxev4.js → pt-TO2DARY2-ftcce1bv.js} +237 -30
- package/dist/{resolved-check-r83pjq9y.js → resolved-check-8a1cr6j2.js} +1 -1
- package/dist/{resourcesSyncService-9b5nzx36.js → resourcesSyncService-rcbw245w.js} +43 -180
- package/dist/ro-GHOBYW2S-4zevc9dy.js +200 -0
- package/dist/{ro-BWR3ONRR-vzx3hy8a.js → ro-GHOBYW2S-mhnqsgaa.js} +29 -2
- package/dist/{ro-AVAWPKOO-b89pw79r.js → ro-WUYJV6OW-a8d9qy1n.js} +235 -28
- package/dist/ru-WBLQ5B2U-dpqvtfwr.js +10 -0
- package/dist/{sdd-convert-service-am4cs6zq.js → sdd-convert-service-btj95r5z.js} +690 -447
- package/dist/{sdd-lookup-12hfwqjq.js → sdd-lookup-x3fh6svg.js} +6 -4
- package/dist/{sdd-resolve-service-e56wtgxt.js → sdd-resolve-service-pzsm3mkz.js} +37 -10
- package/dist/sdd-resolve-siblings-wzhvhar8.js +57 -0
- package/dist/{shared-utils-611ah3tq.js → shared-utils-w643sejd.js} +6 -4
- package/dist/{solution-auth-kddmbm0p.js → solution-auth-30yycqtv.js} +3 -3
- package/dist/solution-discovery-pavd4zeb.js +47 -0
- package/dist/{strict-case-rules-pn3ypd97.js → strict-case-rules-vnyr3b3k.js} +3 -2
- package/dist/{strict-entry-points-a2cya540.js → strict-entry-points-xrddz82q.js} +33 -1
- package/dist/{strict-sdd-audit-nc7dk2hy.js → strict-sdd-audit-8deegzad.js} +11 -7
- package/dist/task-type-declaration-re9ba03j.js +46 -0
- package/dist/{tidy-service-thmayk2h.js → tidy-service-mepxtxqm.js} +144 -39
- package/dist/{tool-z7q74wa4.js → tool-13vrxcqw.js} +313 -123
- package/dist/{tool-rmcqxt09.js → tool-x8dmgc2y.js} +476 -339
- package/dist/tool.js +2 -2
- package/dist/{tr-5IIHSFW5-hw4cewew.js → tr-GDTLECMM-k5fhmq13.js} +29 -2
- package/dist/tr-GDTLECMM-kngksm3r.js +200 -0
- package/dist/{tr-JMIP7ZSL-c39b6pe4.js → tr-M3F5A6AU-bb0tg39m.js} +235 -28
- package/dist/{trigger-enrichment-service-fw97esz9.js → trigger-enrichment-service-pc8ecypw.js} +34 -30
- package/dist/trigger-entry-point-id-819hnfnn.js +15 -0
- package/dist/{variable-service-3gywh851.js → variable-service-8v0b9d66.js} +17 -12
- package/dist/{wait-for-flow-job-wdcjjk6p.js → wait-for-flow-job-5rjxh65w.js} +14 -11
- package/dist/{zh-CN-IFFXSEJS-9wm9gmrv.js → zh-CN-C5G4PC7C-ds9gkptg.js} +235 -28
- package/dist/zh-CN-I5D7WHBD-ge92tbx9.js +200 -0
- package/dist/{zh-CN-R2KU4U5L-tc1hat59.js → zh-CN-I5D7WHBD-sr5h0a98.js} +29 -2
- package/dist/{zh-TW-GNKMELBF-j674515r.js → zh-TW-2AVLM723-288pkc1z.js} +29 -2
- package/dist/zh-TW-2AVLM723-xsmap3gk.js +200 -0
- package/dist/{zh-TW-IYBNYAMG-8727c7v2.js → zh-TW-62HZIG6O-787kdwex.js} +234 -27
- package/package.json +2 -2
- package/dist/bpmn-validate-service-tanm0n47.js +0 -14
- package/dist/debug-conversation-trigger-zbxp49z7.js +0 -46
- package/dist/flow-eval-run-api-zg951w2f.js +0 -15
- package/dist/hitPolicyResult-4WDHTX4A-zpjwpxn1.js +0 -69
- package/dist/index-03h6hq69.js +0 -200
- package/dist/input-reader-sce4dejb.js +0 -13
- package/dist/input-reader-tf6xyfvt.js +0 -13
- package/dist/migration-diagnosis-fzj426fa.js +0 -71
- package/dist/node-service-3j6w3z2k.js +0 -89
- package/dist/node-sync-service-q7dsv2p0.js +0 -43
- package/dist/out-target-498z06v5.js +0 -72
- package/dist/packager-tool-0g6ktcsq.js +0 -32
- package/dist/packager-tool-3mvr6njb.js +0 -305
- package/dist/packager-tool-521x949f.js +0 -32
- package/dist/packager-tool-64zypey6.js +0 -521
- package/dist/packager-tool-7t0xj5pz.js +0 -64
- package/dist/packager-tool-j836z6mq.js +0 -208
- package/dist/packager-tool-p7eactax.js +0 -267
- package/dist/packager-tool-xjtv580j.js +0 -13
- package/dist/packager-tool-zm7thgdg.js +0 -456
- /package/dist/{localization-p76prk3f.js → localization-d151bzb1.js} +0 -0
|
@@ -2,9 +2,16 @@ import {
|
|
|
2
2
|
ledgerMissFor
|
|
3
3
|
} from "./packager-tool-zk7ntkba.js";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
dedupedId,
|
|
6
|
+
exactKey,
|
|
7
|
+
indexKey,
|
|
8
|
+
lookupOutput,
|
|
9
|
+
modelKey,
|
|
10
|
+
stageSpellings
|
|
11
|
+
} from "./packager-tool-20592jhn.js";
|
|
12
|
+
import {
|
|
13
|
+
outputSourceFor
|
|
14
|
+
} from "./packager-tool-bhhym40d.js";
|
|
8
15
|
import {
|
|
9
16
|
comparableFolder
|
|
10
17
|
} from "./packager-tool-szn7gaaz.js";
|
|
@@ -12,21 +19,29 @@ import {
|
|
|
12
19
|
cellAt,
|
|
13
20
|
columnField,
|
|
14
21
|
columnIndex,
|
|
22
|
+
fenceOf,
|
|
15
23
|
field,
|
|
16
24
|
firstTable,
|
|
17
25
|
isBlank,
|
|
18
26
|
isDigit,
|
|
19
27
|
isLetter,
|
|
20
28
|
isLowerLetter,
|
|
29
|
+
isSeparatorCell,
|
|
21
30
|
namedValue,
|
|
22
31
|
norm,
|
|
32
|
+
pipeTables,
|
|
33
|
+
splitRowCells,
|
|
23
34
|
stripTicks,
|
|
24
35
|
trimQuotes,
|
|
25
36
|
withoutAnnotation
|
|
26
|
-
} from "./packager-tool-
|
|
37
|
+
} from "./packager-tool-jexxh6qf.js";
|
|
38
|
+
import {
|
|
39
|
+
isAnyTriggerNode,
|
|
40
|
+
isStageNode
|
|
41
|
+
} from "./packager-tool-qmxmg1yv.js";
|
|
27
42
|
import {
|
|
28
43
|
catchError
|
|
29
|
-
} from "./packager-tool-
|
|
44
|
+
} from "./packager-tool-wv85dhy2.js";
|
|
30
45
|
|
|
31
46
|
// ../case-tool/src/services/sdd-normalizer.ts
|
|
32
47
|
var readSddHeading = (line) => {
|
|
@@ -40,19 +55,6 @@ var readSddHeading = (line) => {
|
|
|
40
55
|
return;
|
|
41
56
|
return { level, title: rest.trim() };
|
|
42
57
|
};
|
|
43
|
-
var fenceOf = (line) => {
|
|
44
|
-
let at = 0;
|
|
45
|
-
while (at < 3 && line[at] === " ")
|
|
46
|
-
at += 1;
|
|
47
|
-
const ch = line[at];
|
|
48
|
-
if (ch !== "`" && ch !== "~")
|
|
49
|
-
return;
|
|
50
|
-
let run = 0;
|
|
51
|
-
while (line[at + run] === ch)
|
|
52
|
-
run += 1;
|
|
53
|
-
const bare = line.slice(at + run).trim() === "";
|
|
54
|
-
return run >= 3 ? { ch, run, bare } : undefined;
|
|
55
|
-
};
|
|
56
58
|
var readSddSections = (source) => {
|
|
57
59
|
const headings = [];
|
|
58
60
|
let offset = 0;
|
|
@@ -119,7 +121,11 @@ var afterBoldLabel = (block, ...labels) => {
|
|
|
119
121
|
}
|
|
120
122
|
}
|
|
121
123
|
hits.sort((left, right) => left.at - right.at);
|
|
122
|
-
|
|
124
|
+
const nextLabelLine = (from) => {
|
|
125
|
+
const rest = block.slice(from).search(/\n[ \t]*\*\*[^\s*]/);
|
|
126
|
+
return rest === -1 ? block.length : from + rest + 1;
|
|
127
|
+
};
|
|
128
|
+
return hits.map(({ from }, index) => block.slice(from, Math.min(hits[index + 1]?.at ?? block.length, nextLabelLine(from))));
|
|
123
129
|
};
|
|
124
130
|
var unwrapCodeSpan = (value) => {
|
|
125
131
|
const text = value.trim();
|
|
@@ -229,6 +235,7 @@ var SLA_RESPONSE_MAP_HEADINGS = ["SLA Response Map"];
|
|
|
229
235
|
var CASE_METADATA_HEADINGS = ["Case Metadata"];
|
|
230
236
|
var CASE_SLA_PROPERTY = "Case-Level SLA";
|
|
231
237
|
var CASE_VARIABLE_HEADINGS = ["Case Variables"];
|
|
238
|
+
var CANVAS_NOTE_HEADINGS = ["Canvas Notes", "Sticky Notes"];
|
|
232
239
|
var STAGE_ENTRY_HEADINGS = ["Stage Entry Conditions"];
|
|
233
240
|
var STAGE_EXIT_HEADINGS = [
|
|
234
241
|
"Stage Exit Conditions",
|
|
@@ -457,6 +464,63 @@ var coverageFinding = (path, label, kind, rows, conditions) => {
|
|
|
457
464
|
];
|
|
458
465
|
};
|
|
459
466
|
|
|
467
|
+
// ../case-tool/src/services/strict-sdd-audit/task-io-tables.ts
|
|
468
|
+
var INPUT_VALUE_COLUMNS = [
|
|
469
|
+
"Binding / Value",
|
|
470
|
+
"Binding",
|
|
471
|
+
"Value"
|
|
472
|
+
];
|
|
473
|
+
var INPUT_NAME_COLUMNS = ["Name", "Input", "Field"];
|
|
474
|
+
var OUTPUT_NAME_COLUMNS = ["Field", "Name", "Output"];
|
|
475
|
+
var inputNameColumn = (header) => columnIndex(header, ...INPUT_NAME_COLUMNS) ?? columnIndex(header, "Variable");
|
|
476
|
+
var outputNameColumn = (header) => columnIndex(header, ...OUTPUT_NAME_COLUMNS) ?? columnIndex(header, "Variable");
|
|
477
|
+
var isIdentifier = (text) => {
|
|
478
|
+
const head = text.charAt(0);
|
|
479
|
+
if (!isLetter(head) && head !== "_")
|
|
480
|
+
return false;
|
|
481
|
+
for (const ch of text.slice(1)) {
|
|
482
|
+
if (!isWordChar(ch))
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
return true;
|
|
486
|
+
};
|
|
487
|
+
var customRowsOf = (header, rows) => {
|
|
488
|
+
const bindingAt = columnIndex(header, ...INPUT_VALUE_COLUMNS);
|
|
489
|
+
if (bindingAt === undefined)
|
|
490
|
+
return [];
|
|
491
|
+
const found = [];
|
|
492
|
+
for (const row of rows) {
|
|
493
|
+
const binding = unwrapCodeSpan(cellAt(row, bindingAt));
|
|
494
|
+
const at = binding.indexOf("=");
|
|
495
|
+
if (at <= 0)
|
|
496
|
+
continue;
|
|
497
|
+
const variable = binding.slice(0, at).trim();
|
|
498
|
+
const expression = binding.slice(at + 1).trim();
|
|
499
|
+
if (!isIdentifier(variable))
|
|
500
|
+
continue;
|
|
501
|
+
const emptyLiteral = /^(""|'')$/.test(expression);
|
|
502
|
+
if (!emptyLiteral && (!expression || isBlank(expression)))
|
|
503
|
+
continue;
|
|
504
|
+
found.push({ variable, expression });
|
|
505
|
+
}
|
|
506
|
+
return found;
|
|
507
|
+
};
|
|
508
|
+
var unreadIoTables = (block) => {
|
|
509
|
+
const unread = [];
|
|
510
|
+
const check = (labels, readable, wants) => {
|
|
511
|
+
for (const label of labels)
|
|
512
|
+
for (const part of afterBoldLabel(block, label)) {
|
|
513
|
+
const { header, rows } = firstTable(part);
|
|
514
|
+
if (rows.length === 0 || readable(header, rows))
|
|
515
|
+
continue;
|
|
516
|
+
unread.push(`the **${label}** table (header: ${header.join(" | ")}) has ${rows.length} row(s) and no ${wants} column, so none of them reached the task`);
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
check(INPUT_LABELS, (header) => inputNameColumn(header) !== undefined && columnIndex(header, ...INPUT_VALUE_COLUMNS) !== undefined, `name (${[...INPUT_NAME_COLUMNS, "Variable"].join("/")}) or value (${INPUT_VALUE_COLUMNS.join("/")})`);
|
|
520
|
+
check(OUTPUT_LABELS, (header, rows) => outputNameColumn(header) !== undefined || customRowsOf(header, rows).length > 0, `name (${[...OUTPUT_NAME_COLUMNS, "Variable"].join("/")}) column or \`<variable> = <expression>\` row in a value`);
|
|
521
|
+
return unread;
|
|
522
|
+
};
|
|
523
|
+
|
|
460
524
|
// ../case-tool/src/services/strict-sdd-audit/producers.ts
|
|
461
525
|
var PRODUCER_ARROW = "<-";
|
|
462
526
|
var XREF_OPEN = "$xref(";
|
|
@@ -605,7 +669,7 @@ var xrefProducers = (document) => {
|
|
|
605
669
|
const close = callCloseIndex(text, at);
|
|
606
670
|
if (close === -1)
|
|
607
671
|
break;
|
|
608
|
-
const args = xrefArguments(text.slice(at, close + 1));
|
|
672
|
+
const args = xrefArguments(text.slice(at, close + 1).replace(/\\(["'\\])/g, "$1"));
|
|
609
673
|
if (args.length === 3) {
|
|
610
674
|
const key = `${norm(args[0])}|${norm(args[1])}|${args[1].trim()}|${norm(args[2])}`;
|
|
611
675
|
if (!seen.has(key)) {
|
|
@@ -621,8 +685,8 @@ var detailProducerInputs = (block) => {
|
|
|
621
685
|
const inputs = [];
|
|
622
686
|
for (const sub of afterAnyLabel(block, INPUT_LABELS)) {
|
|
623
687
|
const { header, rows } = firstTable(sub);
|
|
624
|
-
const nameAt =
|
|
625
|
-
const valueAt = columnIndex(header,
|
|
688
|
+
const nameAt = inputNameColumn(header);
|
|
689
|
+
const valueAt = columnIndex(header, ...INPUT_VALUE_COLUMNS);
|
|
626
690
|
if (nameAt === undefined || valueAt === undefined)
|
|
627
691
|
continue;
|
|
628
692
|
for (const row of rows) {
|
|
@@ -1213,6 +1277,58 @@ var resolveXrefExpression = (expression, index) => {
|
|
|
1213
1277
|
}
|
|
1214
1278
|
return { expected, tokens };
|
|
1215
1279
|
};
|
|
1280
|
+
var expressionMatcher = (declared, index) => {
|
|
1281
|
+
const resolved = declared.includes(XREF_OPEN) ? resolveXrefPositions(declared, index) : undefined;
|
|
1282
|
+
if (resolved === undefined) {
|
|
1283
|
+
const wanted = comparableExpression(declared);
|
|
1284
|
+
return (actual) => comparableExpression(actual) === wanted;
|
|
1285
|
+
}
|
|
1286
|
+
const expected = comparableExpression(resolved.expected);
|
|
1287
|
+
const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1288
|
+
const placeholder = new RegExp(`${escapeRegExp(VARIABLE_PLACEHOLDER)}(\\d+)`, "g");
|
|
1289
|
+
let pattern = "";
|
|
1290
|
+
let cursor = 0;
|
|
1291
|
+
for (const found of expected.matchAll(placeholder)) {
|
|
1292
|
+
pattern += escapeRegExp(expected.slice(cursor, found.index));
|
|
1293
|
+
const tokens = [...resolved.groups[Number(found[1])]].sort((left, right) => right.length - left.length).map(escapeRegExp);
|
|
1294
|
+
pattern += `${escapeRegExp(VARS_PREFIX)}(?:${tokens.join("|")})(?![\\w$])`;
|
|
1295
|
+
cursor = (found.index ?? 0) + found[0].length;
|
|
1296
|
+
}
|
|
1297
|
+
pattern += escapeRegExp(expected.slice(cursor));
|
|
1298
|
+
const shape = new RegExp(`^${pattern}$`);
|
|
1299
|
+
return (actual) => shape.test(comparableExpression(actual));
|
|
1300
|
+
};
|
|
1301
|
+
var resolveXrefPositions = (expression, index) => {
|
|
1302
|
+
const marker = `${VARS_PREFIX}${XREF_OPEN}`;
|
|
1303
|
+
const groups = [];
|
|
1304
|
+
let expected = "";
|
|
1305
|
+
let cursor = 0;
|
|
1306
|
+
while (cursor < expression.length) {
|
|
1307
|
+
const at = expression.indexOf(marker, cursor);
|
|
1308
|
+
if (at === -1) {
|
|
1309
|
+
expected += expression.slice(cursor);
|
|
1310
|
+
break;
|
|
1311
|
+
}
|
|
1312
|
+
expected += expression.slice(cursor, at);
|
|
1313
|
+
const close = callCloseIndex(expression, at);
|
|
1314
|
+
if (close === -1)
|
|
1315
|
+
return;
|
|
1316
|
+
const args = xrefArguments(expression.slice(at + VARS_PREFIX.length, close + 1));
|
|
1317
|
+
if (args.length !== 3)
|
|
1318
|
+
return;
|
|
1319
|
+
const key = `${norm(args[0])}|${norm(args[1])}|${norm(args[2])}`;
|
|
1320
|
+
const candidates = index.get(key);
|
|
1321
|
+
if (candidates === undefined || candidates.length !== 1) {
|
|
1322
|
+
return;
|
|
1323
|
+
}
|
|
1324
|
+
let position = groups.indexOf(candidates[0]);
|
|
1325
|
+
if (position === -1)
|
|
1326
|
+
position = groups.push(candidates[0]) - 1;
|
|
1327
|
+
expected += `${VARIABLE_PLACEHOLDER}${position}`;
|
|
1328
|
+
cursor = close + 1;
|
|
1329
|
+
}
|
|
1330
|
+
return { expected, groups };
|
|
1331
|
+
};
|
|
1216
1332
|
var ruleCarryingExpression = (condition) => {
|
|
1217
1333
|
for (const lane of asArray(asRecord(condition)?.rules)) {
|
|
1218
1334
|
for (const entry of asArray(lane)) {
|
|
@@ -1434,11 +1550,303 @@ var escalationFindings = (declared, rules, path, label, mapped) => {
|
|
|
1434
1550
|
};
|
|
1435
1551
|
|
|
1436
1552
|
// ../case-tool/src/services/strict-sdd-audit/sdd-model.ts
|
|
1553
|
+
var CANVAS_NOTE_COLORS = [
|
|
1554
|
+
"blue",
|
|
1555
|
+
"green",
|
|
1556
|
+
"yellow",
|
|
1557
|
+
"pink",
|
|
1558
|
+
"white"
|
|
1559
|
+
];
|
|
1437
1560
|
var noNameColumnNote = (title, wanted, header) => `section "${title}": the table has rows but no ${wanted.join("/")} ` + `column (header: ${header.join(" | ") || "<none>"}) — every row is ` + "skipped, so the section contributes nothing to audit";
|
|
1438
1561
|
var capitalize = (text) => text.charAt(0).toUpperCase() + text.slice(1);
|
|
1439
1562
|
var noCategoryColumnNote = (title, header) => `section "${title}": the table has rows but no Category column ` + `(header: ${header.join(" | ") || "<none>"}) — no row can be checked ` + "for `variables` group placement, so a formal argument missing half its " + "pair passes";
|
|
1440
1563
|
var unrecognizedHeadingNote = (title, level) => `heading "${title}" (level ${level}) reads like an audited section but ` + "matches no accepted spelling — rename it to one of the canonical " + "headings, or the checks it feeds are skipped";
|
|
1441
1564
|
|
|
1565
|
+
// ../case-tool/src/services/sdd-convert/xrefs.ts
|
|
1566
|
+
var QUOTED = String.raw`(?:'((?:\\.|[^'\\])*)'|"((?:\\.|[^"\\])*)"|` + "`((?:\\\\.|[^`\\\\])*)`" + String.raw`|\u201c([^\u201d]*)\u201d)`;
|
|
1567
|
+
var XREF_CALL = new RegExp(String.raw`vars\.\$xref\(\s*${QUOTED}\s*,\s*${QUOTED}\s*,\s*${QUOTED}\s*\)`, "g");
|
|
1568
|
+
var argumentOf = (groups) => groups.find((value) => value !== undefined) ?? "";
|
|
1569
|
+
var unresolvedXrefDetail = (whole, found) => {
|
|
1570
|
+
if (found === undefined) {
|
|
1571
|
+
return `\`${whole}\` names an output this SDD does not declare, so the marker is left in place rather than pointed at a guess`;
|
|
1572
|
+
}
|
|
1573
|
+
const spellings = new Set(found.names);
|
|
1574
|
+
const listed = [...spellings].map((name) => `\`${name}\``).join(", ");
|
|
1575
|
+
if (spellings.size < found.names.length) {
|
|
1576
|
+
return `\`${whole}\` names a task that ${found.names.length} tasks in that stage answer to (${listed}), so the marker is left in place rather than pointed at one of them. Task names are unique across the case, so rename all but one`;
|
|
1577
|
+
}
|
|
1578
|
+
return `\`${whole}\` names its task in a spelling that ${found.names.length} tasks answer to (${listed}), so the marker is left in place rather than pointed at one of them — write the task's name as its heading spells it`;
|
|
1579
|
+
};
|
|
1580
|
+
var DOTTED_READ = /^\.[A-Za-z_$]/;
|
|
1581
|
+
var deferredOutputs = new WeakMap;
|
|
1582
|
+
var markDeferredOutputs = (index, ids) => {
|
|
1583
|
+
deferredOutputs.set(index, ids);
|
|
1584
|
+
};
|
|
1585
|
+
var expandXrefs = (text, context) => text.replace(XREF_CALL, (whole, ...rest) => {
|
|
1586
|
+
const offset = rest[rest.length - 2];
|
|
1587
|
+
const captured = rest.slice(0, -2);
|
|
1588
|
+
const stage = argumentOf(captured.slice(0, 4));
|
|
1589
|
+
const task = argumentOf(captured.slice(4, 8));
|
|
1590
|
+
const output = argumentOf(captured.slice(8, 12));
|
|
1591
|
+
const found = lookupOutput(context.outputs, `${indexKey(stage)}|${indexKey(task)}|${indexKey(output)}`, task);
|
|
1592
|
+
if (found !== undefined && "id" in found) {
|
|
1593
|
+
if (deferredOutputs.get(context.outputs)?.has(found.id)) {
|
|
1594
|
+
context.unresolved.push({
|
|
1595
|
+
kind: "placeholder",
|
|
1596
|
+
where: context.where,
|
|
1597
|
+
detail: `\`${whole}\` reads an output of a task the resolved file defers, so \`vars.${found.id}\` resolves to nothing until that task is filled`
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
const after = text.slice(offset + whole.length);
|
|
1601
|
+
return DOTTED_READ.test(after) ? `vars.${found.id}?` : `vars.${found.id}`;
|
|
1602
|
+
}
|
|
1603
|
+
context.unresolved.push({
|
|
1604
|
+
kind: "producer-reference",
|
|
1605
|
+
where: context.where,
|
|
1606
|
+
detail: unresolvedXrefDetail(whole, found)
|
|
1607
|
+
});
|
|
1608
|
+
return whole;
|
|
1609
|
+
});
|
|
1610
|
+
var expandOutputMarkers = (output, context) => {
|
|
1611
|
+
const expand = (value2) => typeof value2 === "string" && value2.includes("$xref") ? expandXrefs(value2, context) : value2;
|
|
1612
|
+
const value = expand(output.value);
|
|
1613
|
+
const source = expand(output.source);
|
|
1614
|
+
return value === output.value && source === output.source ? output : { ...output, value, source };
|
|
1615
|
+
};
|
|
1616
|
+
|
|
1617
|
+
// ../case-tool/src/services/sdd-convert/io.ts
|
|
1618
|
+
var taskMatcher = (model, taskName) => {
|
|
1619
|
+
const mine = exactKey(taskName);
|
|
1620
|
+
const folded = indexKey(taskName);
|
|
1621
|
+
const filed = modelKey(taskName);
|
|
1622
|
+
let unique = true;
|
|
1623
|
+
let filedUnique = true;
|
|
1624
|
+
for (const stage of model.stages) {
|
|
1625
|
+
for (const other of stage.tasks) {
|
|
1626
|
+
const name = exactKey(String(other.name ?? ""));
|
|
1627
|
+
if (name === mine)
|
|
1628
|
+
continue;
|
|
1629
|
+
if (indexKey(name) === folded)
|
|
1630
|
+
unique = false;
|
|
1631
|
+
if (modelKey(name) === filed)
|
|
1632
|
+
filedUnique = false;
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
return {
|
|
1636
|
+
names: (spelled) => exactKey(spelled) === mine || unique && indexKey(spelled) === folded,
|
|
1637
|
+
unique,
|
|
1638
|
+
filedUnique
|
|
1639
|
+
};
|
|
1640
|
+
};
|
|
1641
|
+
var declaredOutputs = (model, stageName, position, task) => {
|
|
1642
|
+
const taskName = String(task.name ?? "");
|
|
1643
|
+
const { names: own, slug, ordinal } = stageSpellings(stageName, position);
|
|
1644
|
+
const names = [...own, ...slug === undefined ? [] : [slug], ordinal].map(indexKey);
|
|
1645
|
+
const matcher = taskMatcher(model, taskName);
|
|
1646
|
+
const mine = (producer) => names.includes(indexKey(producer.stage)) && matcher.names(producer.task);
|
|
1647
|
+
const rows = (task.outputRows ?? []).map((row) => ({ row, aliases: [] }));
|
|
1648
|
+
const sameOutput = (a, b) => indexKey(a) === indexKey(b) || (!a.includes(".") || !b.includes(".")) && indexKey(emittedName(a)) === indexKey(emittedName(b));
|
|
1649
|
+
const dotted = (one) => [one.row, ...one.aliases].find((spelling) => spelling.includes("."));
|
|
1650
|
+
const takes = (one, name) => {
|
|
1651
|
+
if (!sameOutput(one.row, name))
|
|
1652
|
+
return false;
|
|
1653
|
+
if (!name.includes("."))
|
|
1654
|
+
return true;
|
|
1655
|
+
const held = dotted(one);
|
|
1656
|
+
return held === undefined || indexKey(held) === indexKey(name);
|
|
1657
|
+
};
|
|
1658
|
+
const add = (name) => {
|
|
1659
|
+
if (name === "")
|
|
1660
|
+
return;
|
|
1661
|
+
const found = rows.find((one) => takes(one, name));
|
|
1662
|
+
if (found === undefined)
|
|
1663
|
+
rows.push({ row: name, aliases: [] });
|
|
1664
|
+
else if (found.row !== name && !found.aliases.includes(name)) {
|
|
1665
|
+
found.aliases.push(name);
|
|
1666
|
+
}
|
|
1667
|
+
};
|
|
1668
|
+
if (matcher.filedUnique) {
|
|
1669
|
+
for (const name of model.resourceOutputs[modelKey(taskName)] ?? []) {
|
|
1670
|
+
add(name);
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
for (const producer of model.xrefOutputs) {
|
|
1674
|
+
if (mine(producer))
|
|
1675
|
+
add(producer.output);
|
|
1676
|
+
}
|
|
1677
|
+
for (const stage of model.stages) {
|
|
1678
|
+
for (const other of stage.tasks) {
|
|
1679
|
+
for (const row of other.producerInputs ?? []) {
|
|
1680
|
+
const producer = row.producer;
|
|
1681
|
+
if (producer !== undefined && mine(producer)) {
|
|
1682
|
+
add(producer.output);
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
return rows;
|
|
1688
|
+
};
|
|
1689
|
+
var emittedName = (row) => row.split(".").at(-1) ?? row;
|
|
1690
|
+
var OUTPUT_TYPES = new Map([
|
|
1691
|
+
["string", "string"],
|
|
1692
|
+
["object", "jsonSchema"],
|
|
1693
|
+
["json", "jsonSchema"],
|
|
1694
|
+
["jsonschema", "jsonSchema"]
|
|
1695
|
+
]);
|
|
1696
|
+
var readsOutput = (reference, row) => indexKey(reference) === indexKey(row) || !reference.includes(".") && indexKey(reference) === indexKey(emittedName(row));
|
|
1697
|
+
var outputTypeFor = (model, stageNames, taskName, output) => {
|
|
1698
|
+
const matcher = taskMatcher(model, taskName);
|
|
1699
|
+
for (const stage of model.stages) {
|
|
1700
|
+
for (const task of stage.tasks) {
|
|
1701
|
+
for (const row of task.producerInputs ?? []) {
|
|
1702
|
+
const producer = row.producer;
|
|
1703
|
+
if (producer === undefined || row.direct !== true || typeof row.type !== "string" || !stageNames.includes(indexKey(producer.stage)) || !matcher.names(producer.task) || !readsOutput(producer.output, output)) {
|
|
1704
|
+
continue;
|
|
1705
|
+
}
|
|
1706
|
+
const mapped = OUTPUT_TYPES.get(row.type.trim().toLowerCase().replaceAll(" ", ""));
|
|
1707
|
+
if (mapped !== undefined)
|
|
1708
|
+
return mapped;
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
}
|
|
1712
|
+
return;
|
|
1713
|
+
};
|
|
1714
|
+
var outputFor = (row, elementId, taken, type, taskType) => {
|
|
1715
|
+
const leaf = row.split(".").at(-1) ?? row;
|
|
1716
|
+
const base = leaf === "" ? leaf : `${leaf[0].toLowerCase()}${leaf.slice(1)}`;
|
|
1717
|
+
const id = dedupedId(base, taken);
|
|
1718
|
+
return {
|
|
1719
|
+
name: leaf,
|
|
1720
|
+
...type !== undefined && { type },
|
|
1721
|
+
id,
|
|
1722
|
+
var: id,
|
|
1723
|
+
value: id,
|
|
1724
|
+
source: outputSourceFor(taskType, row),
|
|
1725
|
+
target: `=${id}`,
|
|
1726
|
+
elementId
|
|
1727
|
+
};
|
|
1728
|
+
};
|
|
1729
|
+
var variableOutputType = (model, variable) => {
|
|
1730
|
+
const declared = model.variableTypes[modelKey(variable)];
|
|
1731
|
+
if (typeof declared !== "string" || declared.trim() === "") {
|
|
1732
|
+
return;
|
|
1733
|
+
}
|
|
1734
|
+
const key = declared.trim().toLowerCase().replaceAll(" ", "");
|
|
1735
|
+
return OUTPUT_TYPES.get(key) ?? "string";
|
|
1736
|
+
};
|
|
1737
|
+
var extractOutputFor = (row, elementId, taken, type, taskType) => {
|
|
1738
|
+
const leaf = row.field.split(".").at(-1) ?? row.field;
|
|
1739
|
+
const base = leaf === "" ? leaf : `${leaf[0].toLowerCase()}${leaf.slice(1)}`;
|
|
1740
|
+
const id = dedupedId(base, taken);
|
|
1741
|
+
return {
|
|
1742
|
+
name: leaf,
|
|
1743
|
+
...type !== undefined && { type },
|
|
1744
|
+
id,
|
|
1745
|
+
var: row.variable,
|
|
1746
|
+
value: row.variable,
|
|
1747
|
+
source: outputSourceFor(taskType, row.field),
|
|
1748
|
+
target: `=${id}`,
|
|
1749
|
+
originalVar: id,
|
|
1750
|
+
elementId
|
|
1751
|
+
};
|
|
1752
|
+
};
|
|
1753
|
+
var customOutputFor = (row, type) => ({
|
|
1754
|
+
name: row.variable,
|
|
1755
|
+
...type !== undefined && { type },
|
|
1756
|
+
custom: true,
|
|
1757
|
+
var: row.variable,
|
|
1758
|
+
value: canonicalExpression(unquoteLiteral(row.expression)),
|
|
1759
|
+
source: canonicalExpression(unquoteLiteral(row.expression)),
|
|
1760
|
+
target: "",
|
|
1761
|
+
body: "",
|
|
1762
|
+
elementId: "root"
|
|
1763
|
+
});
|
|
1764
|
+
var canonicalExpression = (value) => value.startsWith("=metadata.") ? `=js:${value.slice(1)}` : value;
|
|
1765
|
+
var unquoteLiteral = (cell) => {
|
|
1766
|
+
const text = cell.trim();
|
|
1767
|
+
const quote = text[0];
|
|
1768
|
+
if (quote !== '"' && quote !== "'")
|
|
1769
|
+
return cell;
|
|
1770
|
+
if (text.length < 2 || text[text.length - 1] !== quote)
|
|
1771
|
+
return cell;
|
|
1772
|
+
const inner = text.slice(1, -1);
|
|
1773
|
+
for (let at = 0;at < inner.length; at += 1) {
|
|
1774
|
+
if (inner[at] === "\\") {
|
|
1775
|
+
at += 1;
|
|
1776
|
+
continue;
|
|
1777
|
+
}
|
|
1778
|
+
if (inner[at] === quote)
|
|
1779
|
+
return cell;
|
|
1780
|
+
}
|
|
1781
|
+
return inner.replaceAll(`\\${quote}`, quote);
|
|
1782
|
+
};
|
|
1783
|
+
var RANK_LITERAL = 1;
|
|
1784
|
+
var RANK_PRODUCER = 2;
|
|
1785
|
+
var RANK_EXPRESSION = 3;
|
|
1786
|
+
var unboundProducerDetail = (target, found) => {
|
|
1787
|
+
if (found === undefined) {
|
|
1788
|
+
return `the Inputs row reads an output (${target}) that no task in this SDD declares`;
|
|
1789
|
+
}
|
|
1790
|
+
const spellings = new Set(found.names);
|
|
1791
|
+
const listed = [...spellings].map((task) => `"${task}"`).join(", ");
|
|
1792
|
+
if (spellings.size < found.names.length) {
|
|
1793
|
+
return `the Inputs row reads an output (${target}) of a task that ${found.names.length} tasks in that stage answer to (${listed}), so it is left unbound rather than pointed at one of them. Task names are unique across the case, so rename all but one`;
|
|
1794
|
+
}
|
|
1795
|
+
return `the Inputs row reads an output (${target}) whose task spelling ${found.names.length} tasks answer to (${listed}), so it is left unbound rather than pointed at one of them`;
|
|
1796
|
+
};
|
|
1797
|
+
var inputsFor = (task, elementId, where, unresolved, outputs) => {
|
|
1798
|
+
const ranked = new Map;
|
|
1799
|
+
const offer = (name, rank, input) => {
|
|
1800
|
+
const existing = ranked.get(name);
|
|
1801
|
+
if (existing === undefined || rank > existing.rank) {
|
|
1802
|
+
ranked.set(name, { rank, input });
|
|
1803
|
+
}
|
|
1804
|
+
};
|
|
1805
|
+
for (const row of task.literalInputs ?? []) {
|
|
1806
|
+
offer(String(row.name ?? ""), RANK_LITERAL, {
|
|
1807
|
+
name: String(row.name ?? ""),
|
|
1808
|
+
value: unquoteLiteral(String(row.value ?? "")),
|
|
1809
|
+
elementId
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
for (const row of task.expressionInputs ?? []) {
|
|
1813
|
+
offer(String(row.name ?? ""), RANK_EXPRESSION, {
|
|
1814
|
+
name: String(row.name ?? ""),
|
|
1815
|
+
value: canonicalExpression(expandXrefs(String(row.expression ?? row.value ?? ""), {
|
|
1816
|
+
outputs,
|
|
1817
|
+
where,
|
|
1818
|
+
unresolved
|
|
1819
|
+
})),
|
|
1820
|
+
elementId
|
|
1821
|
+
});
|
|
1822
|
+
}
|
|
1823
|
+
for (const row of task.producerInputs ?? []) {
|
|
1824
|
+
const name = String(row.name ?? "");
|
|
1825
|
+
const producer = row.producer;
|
|
1826
|
+
const found = producer === undefined ? undefined : lookupOutput(outputs, `${indexKey(producer.stage)}|${indexKey(producer.task)}|${indexKey(producer.output)}`, producer.task);
|
|
1827
|
+
if (found === undefined || !("id" in found)) {
|
|
1828
|
+
const target = producer === undefined ? "unnamed producer" : `"${producer.stage}"."${producer.task}".${producer.output}`;
|
|
1829
|
+
unresolved.push({
|
|
1830
|
+
kind: "producer-reference",
|
|
1831
|
+
where: `${where}.inputs[${name}]`,
|
|
1832
|
+
detail: unboundProducerDetail(target, found)
|
|
1833
|
+
});
|
|
1834
|
+
continue;
|
|
1835
|
+
}
|
|
1836
|
+
const id = found.id;
|
|
1837
|
+
offer(name, RANK_PRODUCER, {
|
|
1838
|
+
name,
|
|
1839
|
+
value: row.direct === false ? expandXrefs(String(row.value ?? `=js:vars.${id}`), {
|
|
1840
|
+
outputs,
|
|
1841
|
+
where,
|
|
1842
|
+
unresolved
|
|
1843
|
+
}) : `=vars.${id}`,
|
|
1844
|
+
elementId
|
|
1845
|
+
});
|
|
1846
|
+
}
|
|
1847
|
+
return [...ranked.values()].map((entry) => entry.input);
|
|
1848
|
+
};
|
|
1849
|
+
|
|
1442
1850
|
// ../case-tool/src/services/strict-sdd-audit/sla-durations.ts
|
|
1443
1851
|
var SLA_UNIT_CODES = new Map([
|
|
1444
1852
|
["min", "min"],
|
|
@@ -1482,14 +1890,90 @@ var parseDurationCell = (text) => {
|
|
|
1482
1890
|
const units = acceptedUnitCodes(match[2]);
|
|
1483
1891
|
return units.length === 0 ? undefined : { count, units };
|
|
1484
1892
|
};
|
|
1485
|
-
var
|
|
1893
|
+
var slaProducerIndex = (plan, stages, references) => {
|
|
1894
|
+
const index = producerIndex(plan);
|
|
1895
|
+
for (const stage of plan.stages) {
|
|
1896
|
+
for (const task of stage.tasks) {
|
|
1897
|
+
for (const entry of asArray(task.data.outputs)) {
|
|
1898
|
+
const output = asRecord(entry);
|
|
1899
|
+
const source = output?.source;
|
|
1900
|
+
const name = output?.name;
|
|
1901
|
+
if (typeof source !== "string" || !source.startsWith("=") || !source.includes(".") || typeof name !== "string") {
|
|
1902
|
+
continue;
|
|
1903
|
+
}
|
|
1904
|
+
const prefix = `${norm(stage.name)}|${norm(task.name)}|`;
|
|
1905
|
+
const own = index.get(`${prefix}${norm(name)}`)?.find((tokens) => tokens.has(String(output?.id ?? "")));
|
|
1906
|
+
const row = `${prefix}${norm(source.slice(1))}`;
|
|
1907
|
+
if (own !== undefined && !index.has(row)) {
|
|
1908
|
+
index.set(row, [own]);
|
|
1909
|
+
}
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
const entries = [...index.entries()];
|
|
1914
|
+
const spelled = stages.flatMap((stage, at) => {
|
|
1915
|
+
const { names, slug, ordinal } = stageSpellings(stage.name, at + 1);
|
|
1916
|
+
const filed = names.map(norm).find((name) => entries.some(([key]) => key.startsWith(`${name}|`)));
|
|
1917
|
+
return filed === undefined ? [] : [{ filed, names, slug, ordinal }];
|
|
1918
|
+
});
|
|
1919
|
+
const tiers = [
|
|
1920
|
+
(one) => one.names,
|
|
1921
|
+
(one) => one.slug === undefined ? [] : [one.slug],
|
|
1922
|
+
(one) => [one.ordinal]
|
|
1923
|
+
];
|
|
1924
|
+
for (const tier of tiers) {
|
|
1925
|
+
for (const one of spelled) {
|
|
1926
|
+
for (const alias of tier(one)) {
|
|
1927
|
+
const prefix = norm(alias);
|
|
1928
|
+
if (prefix === one.filed)
|
|
1929
|
+
continue;
|
|
1930
|
+
for (const [key, value] of entries) {
|
|
1931
|
+
if (!key.startsWith(`${one.filed}|`))
|
|
1932
|
+
continue;
|
|
1933
|
+
const aliased = `${prefix}|${key.slice(one.filed.length + 1)}`;
|
|
1934
|
+
if (!index.has(aliased))
|
|
1935
|
+
index.set(aliased, value);
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
for (const { stage, task, output } of references) {
|
|
1941
|
+
if (!output.includes("."))
|
|
1942
|
+
continue;
|
|
1943
|
+
const prefix = `${norm(stage)}|${norm(task)}|`;
|
|
1944
|
+
const leaf = index.get(`${prefix}${norm(output.slice(output.lastIndexOf(".") + 1))}`);
|
|
1945
|
+
const row = `${prefix}${norm(output)}`;
|
|
1946
|
+
if (leaf?.length === 1 && !index.has(row))
|
|
1947
|
+
index.set(row, leaf);
|
|
1948
|
+
}
|
|
1949
|
+
return index;
|
|
1950
|
+
};
|
|
1951
|
+
var slaReferences = (sdd) => [
|
|
1952
|
+
...sdd.xrefOutputs,
|
|
1953
|
+
...sdd.stages.flatMap((stage) => stage.tasks.flatMap((task) => task.producerInputs.map((input) => input.producer)))
|
|
1954
|
+
];
|
|
1955
|
+
var withoutConditional = (rules, declared, plan, stages, references) => {
|
|
1956
|
+
const conditional = declared.filter((row) => !UNCONDITIONAL.test(row.expression.trim()));
|
|
1957
|
+
if (conditional.length === 0)
|
|
1958
|
+
return [...rules];
|
|
1959
|
+
const index = slaProducerIndex(plan, stages, references);
|
|
1960
|
+
const overrides = conditional.map((row) => expressionMatcher(canonicalExpression(row.expression.trim()), index));
|
|
1961
|
+
return rules.filter((entry) => {
|
|
1962
|
+
const rule = asRecord(entry);
|
|
1963
|
+
const expression = rule?.expression;
|
|
1964
|
+
return !(typeof expression === "string" && overrides.some((matches) => matches(expression)));
|
|
1965
|
+
});
|
|
1966
|
+
};
|
|
1967
|
+
var UNCONDITIONAL = /^=js:\s*true\s*$/;
|
|
1968
|
+
var conditionalSlaFindings = (declared, carried, path, label, plan, stages, references) => {
|
|
1486
1969
|
if (declared.length === 0)
|
|
1487
1970
|
return [];
|
|
1488
1971
|
const findings = [];
|
|
1489
1972
|
const rules = carried.map((entry) => asRecord(entry)).filter((entry) => entry !== undefined);
|
|
1973
|
+
const index = slaProducerIndex(plan, stages, references);
|
|
1490
1974
|
for (const row of declared) {
|
|
1491
|
-
const
|
|
1492
|
-
const match = rules.find((rule) => typeof rule.expression === "string" &&
|
|
1975
|
+
const matches = expressionMatcher(canonicalExpression(row.expression.trim()), index);
|
|
1976
|
+
const match = rules.find((rule) => typeof rule.expression === "string" && matches(rule.expression));
|
|
1493
1977
|
const title = row.displayName === undefined ? `\`${row.expression}\`` : `"${row.displayName}"`;
|
|
1494
1978
|
if (match === undefined) {
|
|
1495
1979
|
findings.push(error("STRICT_SDD_SLA_CONDITIONAL_MISSING", path, `${label}: the SDD declares a conditional SLA rule ${title} and no rule on this target carries that expression. The override is what applies the stricter duration when the condition holds, so without it every case takes the default and nothing reports a gap. Add the rule ahead of the trailing \`=js:true\` default.`));
|
|
@@ -1515,7 +1999,7 @@ var slaDurationFindings = (sdd, plan) => {
|
|
|
1515
1999
|
if (declared === undefined)
|
|
1516
2000
|
return [];
|
|
1517
2001
|
const findings = [];
|
|
1518
|
-
plan.caseSlaRules.forEach((entry, index) => {
|
|
2002
|
+
withoutConditional(plan.caseSlaRules, sdd.caseConditionalSlas, plan, sdd.stages, slaReferences(sdd)).forEach((entry, index) => {
|
|
1519
2003
|
const rule = asRecord(entry);
|
|
1520
2004
|
if (rule === undefined)
|
|
1521
2005
|
return;
|
|
@@ -1705,7 +2189,7 @@ var extractFindings = (task, found, path, label) => {
|
|
|
1705
2189
|
const outputs = asArray(found.data.outputs).map(asRecord).filter((o) => o !== undefined);
|
|
1706
2190
|
const findings = [];
|
|
1707
2191
|
for (const declared of task.extractRows) {
|
|
1708
|
-
const wanted =
|
|
2192
|
+
const wanted = outputSourceFor(found.type, declared.field);
|
|
1709
2193
|
const present = outputs.some((o) => o.source === wanted && o.var === declared.variable);
|
|
1710
2194
|
if (present)
|
|
1711
2195
|
continue;
|
|
@@ -1786,15 +2270,16 @@ var compareCaseLevel = (sdd, plan) => {
|
|
|
1786
2270
|
const issues = [
|
|
1787
2271
|
...coverageFinding("metadata.caseExitRules", "case", "exit", sdd.caseExitRows, plan.caseExitConditions),
|
|
1788
2272
|
...gatedSlaFindings(plan.caseSlaRules, "metadata.slaRules", "case"),
|
|
1789
|
-
...conditionalSlaFindings(sdd.caseConditionalSlas, plan.caseSlaRules, "metadata.slaRules", "case")
|
|
2273
|
+
...conditionalSlaFindings(sdd.caseConditionalSlas, plan.caseSlaRules, "metadata.slaRules", "case", plan, sdd.stages, slaReferences(sdd))
|
|
1790
2274
|
];
|
|
1791
2275
|
if (sdd.caseSla && !plan.caseSla) {
|
|
1792
2276
|
issues.push(error("STRICT_SDD_SLA_MISSING", "metadata.slaRules", "case: the SDD declares Case-Level SLA Escalation Rules, the caseplan metadata.slaRules is empty."));
|
|
1793
2277
|
}
|
|
1794
2278
|
issues.push(...escalationFindings(sdd.caseSlaEscalations, plan.caseSlaRules, "metadata.slaRules", "case", sdd.caseSlaResponses), ...xrefOutputFindings(sdd, plan), ...conditionExpressionFindings(sdd.caseExitConditions, plan.caseExitConditions, plan, "metadata.caseExitRules", "case"), ...conditionNameFindings(sdd.caseExitConditions, plan.caseExitConditions, "metadata.caseExitRules", "case", namesDeclaredOnce(sdd)));
|
|
1795
2279
|
issues.push(...slaDurationFindings(sdd, plan));
|
|
1796
|
-
|
|
1797
|
-
|
|
2280
|
+
const caseDefaults = withoutConditional(plan.caseSlaRules, sdd.caseConditionalSlas, plan, sdd.stages, slaReferences(sdd));
|
|
2281
|
+
if (sdd.caseSla && caseDefaults.length > 1) {
|
|
2282
|
+
issues.push(error("STRICT_SDD_SLA_EXTRA", "metadata.slaRules", `case: the SDD declares one case-level SLA and ${caseDefaults.length} SLA rules are present. Its escalations are the rows of that one table, so splitting them across rules leaves each rule with part of the SLA and the runtime applies whichever rule it reaches — the other escalations are lost. Carry one rule with every escalation the table declares.`));
|
|
1798
2283
|
}
|
|
1799
2284
|
if (sdd.triggers && plan.triggers < sdd.triggers) {
|
|
1800
2285
|
issues.push(error("STRICT_SDD_TRIGGER_MISSING", "nodes", plan.triggers === 0 ? `case: the SDD declares ${sdd.triggers} trigger(s), the caseplan has no trigger node.` : `case: the SDD declares ${sdd.triggers} trigger(s), the caseplan has ${plan.triggers}.`));
|
|
@@ -1961,6 +2446,60 @@ var slaDurationOf = (block) => {
|
|
|
1961
2446
|
return;
|
|
1962
2447
|
};
|
|
1963
2448
|
|
|
2449
|
+
// ../case-tool/src/services/strict-sdd-audit/http-request-detail.ts
|
|
2450
|
+
var readHttpRequest = (block) => {
|
|
2451
|
+
const read = (label) => {
|
|
2452
|
+
const raw = field(block, label);
|
|
2453
|
+
if (raw === undefined)
|
|
2454
|
+
return;
|
|
2455
|
+
const text = stripTicks(raw).trim();
|
|
2456
|
+
if (text === "")
|
|
2457
|
+
return;
|
|
2458
|
+
if (/^[{["=]/.test(text))
|
|
2459
|
+
return text;
|
|
2460
|
+
return isBlank(text) ? undefined : text;
|
|
2461
|
+
};
|
|
2462
|
+
const request = {
|
|
2463
|
+
method: read("Method"),
|
|
2464
|
+
url: read("URL"),
|
|
2465
|
+
headers: read("Headers"),
|
|
2466
|
+
query: read("Query"),
|
|
2467
|
+
body: read("Body")
|
|
2468
|
+
};
|
|
2469
|
+
const stated = Object.entries(request).filter(([, value]) => value !== undefined);
|
|
2470
|
+
return stated.length === 0 ? undefined : Object.fromEntries(stated);
|
|
2471
|
+
};
|
|
2472
|
+
var httpFields = (block) => {
|
|
2473
|
+
const http = readHttpRequest(block);
|
|
2474
|
+
return http === undefined ? {} : { http };
|
|
2475
|
+
};
|
|
2476
|
+
|
|
2477
|
+
// ../case-tool/src/services/strict-sdd-audit/resource-reference.ts
|
|
2478
|
+
var REFERENCE_LABELS = new Set([
|
|
2479
|
+
"Action App Reference",
|
|
2480
|
+
"Agent Reference",
|
|
2481
|
+
"Process Reference",
|
|
2482
|
+
"API Workflow Reference",
|
|
2483
|
+
"Function Reference",
|
|
2484
|
+
"Case Reference"
|
|
2485
|
+
].map(norm));
|
|
2486
|
+
var resourceReference = (block) => {
|
|
2487
|
+
const cell = pipeTables(block).map((table) => firstTable(table)).flatMap(({ header, rows }) => [header, ...rows]).find((row) => REFERENCE_LABELS.has(norm(row[0] ?? "")))?.[1]?.trim();
|
|
2488
|
+
if (cell === undefined || isBlank(cell))
|
|
2489
|
+
return {};
|
|
2490
|
+
const part = (key) => {
|
|
2491
|
+
const found = new RegExp(`\\b${key}\\s+"([^"]*)"`, "i").exec(cell);
|
|
2492
|
+
const value = found?.[1].trim();
|
|
2493
|
+
return value === undefined || value === "" ? undefined : value;
|
|
2494
|
+
};
|
|
2495
|
+
const name = part("Name");
|
|
2496
|
+
const folder = part("Folder");
|
|
2497
|
+
return {
|
|
2498
|
+
...name !== undefined && { name },
|
|
2499
|
+
...folder !== undefined && { folder }
|
|
2500
|
+
};
|
|
2501
|
+
};
|
|
2502
|
+
|
|
1964
2503
|
// ../case-tool/src/services/sdd-condition-cell.ts
|
|
1965
2504
|
var STAGE_SELECTOR_RULES = new Set([
|
|
1966
2505
|
"selected-stage-completed",
|
|
@@ -2061,22 +2600,12 @@ var entryConditionBlocks = (section) => {
|
|
|
2061
2600
|
return blocks;
|
|
2062
2601
|
};
|
|
2063
2602
|
var detailEntryRows = (section) => entryConditionBlocks(section).reduce((most, text) => Math.max(most, firstTable(text).rows.length), 0);
|
|
2064
|
-
var isIdentifier = (text) => {
|
|
2065
|
-
const head = text.charAt(0);
|
|
2066
|
-
if (!isLetter(head) && head !== "_")
|
|
2067
|
-
return false;
|
|
2068
|
-
for (const ch of text.slice(1)) {
|
|
2069
|
-
if (!isWordChar(ch))
|
|
2070
|
-
return false;
|
|
2071
|
-
}
|
|
2072
|
-
return true;
|
|
2073
|
-
};
|
|
2074
2603
|
var detailInputRows = (block) => {
|
|
2075
2604
|
const rowsOut = [];
|
|
2076
2605
|
for (const sub of afterAnyLabel(block, INPUT_LABELS)) {
|
|
2077
2606
|
const { header, rows } = firstTable(sub);
|
|
2078
|
-
const nameAt =
|
|
2079
|
-
const valueAt = columnIndex(header,
|
|
2607
|
+
const nameAt = inputNameColumn(header);
|
|
2608
|
+
const valueAt = columnIndex(header, ...INPUT_VALUE_COLUMNS);
|
|
2080
2609
|
if (nameAt === undefined || valueAt === undefined)
|
|
2081
2610
|
continue;
|
|
2082
2611
|
for (const row of rows) {
|
|
@@ -2100,8 +2629,8 @@ var detailExpressionInputs = (block) => {
|
|
|
2100
2629
|
const inputs = [];
|
|
2101
2630
|
for (const sub of afterAnyLabel(block, INPUT_LABELS)) {
|
|
2102
2631
|
const { header, rows } = firstTable(sub);
|
|
2103
|
-
const nameAt =
|
|
2104
|
-
const valueAt = columnIndex(header,
|
|
2632
|
+
const nameAt = inputNameColumn(header);
|
|
2633
|
+
const valueAt = columnIndex(header, ...INPUT_VALUE_COLUMNS);
|
|
2105
2634
|
if (nameAt === undefined || valueAt === undefined)
|
|
2106
2635
|
continue;
|
|
2107
2636
|
for (const row of rows) {
|
|
@@ -2237,7 +2766,7 @@ var detailOutputRows = (block) => {
|
|
|
2237
2766
|
const names = [];
|
|
2238
2767
|
for (const sub of afterAnyLabel(block, OUTPUT_LABELS)) {
|
|
2239
2768
|
const { header, rows } = firstTable(sub);
|
|
2240
|
-
const nameAt =
|
|
2769
|
+
const nameAt = outputNameColumn(header);
|
|
2241
2770
|
if (nameAt === undefined)
|
|
2242
2771
|
continue;
|
|
2243
2772
|
for (const row of rows) {
|
|
@@ -2293,7 +2822,7 @@ var detailExtractRows = (block) => {
|
|
|
2293
2822
|
const rows = [];
|
|
2294
2823
|
for (const sub of afterAnyLabel(block, OUTPUT_LABELS)) {
|
|
2295
2824
|
const { header, rows: tableRows } = firstTable(sub);
|
|
2296
|
-
const fieldAt =
|
|
2825
|
+
const fieldAt = outputNameColumn(header);
|
|
2297
2826
|
const bindingAt = columnIndex(header, "Binding / Value", "Binding", "Value");
|
|
2298
2827
|
if (fieldAt === undefined || bindingAt === undefined)
|
|
2299
2828
|
continue;
|
|
@@ -2310,30 +2839,10 @@ var detailExtractRows = (block) => {
|
|
|
2310
2839
|
}
|
|
2311
2840
|
return rows;
|
|
2312
2841
|
};
|
|
2313
|
-
var detailCustomRows = (block) => {
|
|
2314
|
-
const rows =
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
const bindingAt = columnIndex(header, "Binding / Value", "Binding", "Value");
|
|
2318
|
-
if (bindingAt === undefined)
|
|
2319
|
-
continue;
|
|
2320
|
-
for (const row of tableRows) {
|
|
2321
|
-
const binding = unwrapCodeSpan(cellAt(row, bindingAt));
|
|
2322
|
-
const at = binding.indexOf("=");
|
|
2323
|
-
if (at <= 0)
|
|
2324
|
-
continue;
|
|
2325
|
-
const variable = binding.slice(0, at).trim();
|
|
2326
|
-
const expression = binding.slice(at + 1).trim();
|
|
2327
|
-
if (!isIdentifier(variable))
|
|
2328
|
-
continue;
|
|
2329
|
-
const emptyLiteral = /^(""|'')$/.test(expression);
|
|
2330
|
-
if (!emptyLiteral && (!expression || isBlank(expression)))
|
|
2331
|
-
continue;
|
|
2332
|
-
rows.push({ variable, expression });
|
|
2333
|
-
}
|
|
2334
|
-
}
|
|
2335
|
-
return rows;
|
|
2336
|
-
};
|
|
2842
|
+
var detailCustomRows = (block) => afterAnyLabel(block, OUTPUT_LABELS).flatMap((sub) => {
|
|
2843
|
+
const { header, rows } = firstTable(sub);
|
|
2844
|
+
return customRowsOf(header, rows);
|
|
2845
|
+
});
|
|
2337
2846
|
var timerFields = (block) => {
|
|
2338
2847
|
const declared = stripTicks(field(block, "Timer") ?? "");
|
|
2339
2848
|
if (!declared || isBlank(declared))
|
|
@@ -2384,7 +2893,7 @@ var resourceNameOf = (block) => {
|
|
|
2384
2893
|
if (name !== "" && !isBlank(name))
|
|
2385
2894
|
return name;
|
|
2386
2895
|
}
|
|
2387
|
-
return;
|
|
2896
|
+
return resourceReference(block).name;
|
|
2388
2897
|
};
|
|
2389
2898
|
var HTTP_METHODS = new Set([
|
|
2390
2899
|
"GET",
|
|
@@ -2484,7 +2993,7 @@ var readTaskDetail = (section) => {
|
|
|
2484
2993
|
type: stripTicks(field(block, "Type") ?? ""),
|
|
2485
2994
|
resolvedResource: field(block, "Resolved Resource"),
|
|
2486
2995
|
identityResolved: identity.length > 0 && !identity.some(hasUnresolvedMarker),
|
|
2487
|
-
folder: field(block, "Deployment Folder") ?? field(block, "Folder Path"),
|
|
2996
|
+
folder: field(block, "Deployment Folder") ?? field(block, "Folder Path") ?? resourceReference(block).folder,
|
|
2488
2997
|
...(() => {
|
|
2489
2998
|
const skip = namedValue(unwrapCodeSpan(field(block, "Skip Condition") ?? columnField(block, "Skip Condition") ?? ""));
|
|
2490
2999
|
return skip === "" ? {} : { skipCondition: skip };
|
|
@@ -2511,7 +3020,9 @@ var readTaskDetail = (section) => {
|
|
|
2511
3020
|
boundInputs: detailBoundInputs(block),
|
|
2512
3021
|
extractRows: detailExtractRows(block),
|
|
2513
3022
|
customRows: detailCustomRows(block),
|
|
2514
|
-
|
|
3023
|
+
unreadTables: unreadIoTables(block),
|
|
3024
|
+
...timerFields(block),
|
|
3025
|
+
...httpFields(block)
|
|
2515
3026
|
};
|
|
2516
3027
|
};
|
|
2517
3028
|
var TIMER_CONFIGURATION_TYPES = new Map([
|
|
@@ -2779,7 +3290,7 @@ var conditionShapeFindings = (declared, planConditions, path, label) => {
|
|
|
2779
3290
|
};
|
|
2780
3291
|
|
|
2781
3292
|
// ../case-tool/src/services/strict-sdd-audit/compare-task.ts
|
|
2782
|
-
var compareTask = (plan, task, found, stagePath, label, selectors, ledger,
|
|
3293
|
+
var compareTask = (plan, task, found, stagePath, label, selectors, ledger, stageSpellings2 = [], once = new Set) => {
|
|
2783
3294
|
const issues = [];
|
|
2784
3295
|
const taskPath = `${stagePath}.data.tasks[${found.name ?? task.name}]`;
|
|
2785
3296
|
if (task.type && found.type && norm(task.type) !== norm(found.type)) {
|
|
@@ -2798,7 +3309,7 @@ var compareTask = (plan, task, found, stagePath, label, selectors, ledger, stage
|
|
|
2798
3309
|
issues.push(error("STRICT_SDD_ENTRY_RULE_EMPTY", `${taskPath}.entryConditions`, `${label}: entryConditions carry no rules.`));
|
|
2799
3310
|
}
|
|
2800
3311
|
const isPlaceholder = Object.keys(found.data).length === 0;
|
|
2801
|
-
const miss = isPlaceholder ? ledgerMissFor(ledger,
|
|
3312
|
+
const miss = isPlaceholder ? ledgerMissFor(ledger, stageSpellings2, task.name) : undefined;
|
|
2802
3313
|
if (isPlaceholder && task.identityResolved && miss !== undefined) {
|
|
2803
3314
|
issues.push(warning("STRICT_SDD_PLACEHOLDER_UNRESOLVABLE", `${taskPath}.data`, `${label}: placeholder task, and the run's registry ledger records no match for "${miss.query}"${miss.cacheFile ? ` in ${miss.cacheFile}` : ""} — so the placeholder is correct and the SDD names a resource this tenant does not have. Resolve it on a tenant that does, or leave the placeholder.`));
|
|
2804
3315
|
} else if (isPlaceholder && task.identityResolved) {
|
|
@@ -2818,10 +3329,10 @@ var compareTask = (plan, task, found, stagePath, label, selectors, ledger, stage
|
|
|
2818
3329
|
};
|
|
2819
3330
|
|
|
2820
3331
|
// ../case-tool/src/services/strict-sdd-audit/compare.ts
|
|
2821
|
-
var compareStage = (plan, stage, planStage, selectors, ledger, stagePosition, once = new Set) => {
|
|
3332
|
+
var compareStage = (plan, stage, planStage, selectors, ledger, stagePosition, once = new Set, sddStages = [stage], references = []) => {
|
|
2822
3333
|
const stagePath = `nodes[${planStage.name ?? stage.name}]`;
|
|
2823
3334
|
const ordinal = stagePosition === undefined ? undefined : `Stage ${stagePosition + 1}`;
|
|
2824
|
-
const
|
|
3335
|
+
const stageSpellings2 = [
|
|
2825
3336
|
stage.name,
|
|
2826
3337
|
ordinal,
|
|
2827
3338
|
ordinal === undefined ? undefined : `${ordinal}: ${stage.name}`,
|
|
@@ -2832,13 +3343,14 @@ var compareStage = (plan, stage, planStage, selectors, ledger, stagePosition, on
|
|
|
2832
3343
|
...coverageFinding(`${stagePath}.data.entryConditions`, stageLabel, "entry", stage.entryRows, planStage.entry),
|
|
2833
3344
|
...coverageFinding(`${stagePath}.data.exitConditions`, stageLabel, "exit", stage.exitRows, planStage.exit),
|
|
2834
3345
|
...gatedSlaFindings(planStage.sla, `${stagePath}.data.slaRules`, stageLabel),
|
|
2835
|
-
...conditionalSlaFindings(stage.conditionalSlas, planStage.sla, `${stagePath}.data.slaRules`, stageLabel)
|
|
3346
|
+
...conditionalSlaFindings(stage.conditionalSlas, planStage.sla, `${stagePath}.data.slaRules`, stageLabel, plan, sddStages, references)
|
|
2836
3347
|
];
|
|
2837
3348
|
if (stage.hasSla && planStage.sla.length === 0) {
|
|
2838
3349
|
issues.push(error("STRICT_SDD_SLA_MISSING", `${stagePath}.data.slaRules`, `${stageLabel}: the SDD declares a Stage SLA, the caseplan has no slaRules.`));
|
|
2839
3350
|
}
|
|
2840
|
-
|
|
2841
|
-
|
|
3351
|
+
const stageDefaults = withoutConditional(planStage.sla, stage.conditionalSlas, plan, sddStages, references);
|
|
3352
|
+
if (stage.hasSla && stageDefaults.length > 1) {
|
|
3353
|
+
issues.push(error("STRICT_SDD_SLA_EXTRA", `${stagePath}.data.slaRules`, `${stageLabel}: the SDD declares one Stage SLA and ${stageDefaults.length} SLA rules are present. Its escalations belong to that one SLA, so splitting them across rules leaves each with part of it and the runtime applies whichever rule it reaches — the other escalations are lost. Carry one rule with every escalation the table declares.`));
|
|
2842
3354
|
}
|
|
2843
3355
|
issues.push(...conditionRuleFindings(stage.entryConditions, planStage.entry, `${stagePath}.data.entryConditions`, stageLabel, selectors), ...conditionRuleFindings(stage.exitConditions, planStage.exit, `${stagePath}.data.exitConditions`, stageLabel, selectors), ...conditionShapeFindings(stage.entryConditions, planStage.entry, `${stagePath}.data.entryConditions`, stageLabel), ...conditionShapeFindings(stage.exitConditions, planStage.exit, `${stagePath}.data.exitConditions`, stageLabel), ...conditionNameFindings(stage.entryConditions, planStage.entry, `${stagePath}.data.entryConditions`, stageLabel, once), ...conditionNameFindings(stage.exitConditions, planStage.exit, `${stagePath}.data.exitConditions`, stageLabel, once), ...conditionExpressionFindings(stage.entryConditions, planStage.entry, plan, `${stagePath}.data.entryConditions`, stageLabel), ...conditionExpressionFindings(stage.exitConditions, planStage.exit, plan, `${stagePath}.data.exitConditions`, stageLabel), ...escalationFindings(stage.slaEscalations, planStage.sla, `${stagePath}.data.slaRules`, stageLabel, stage.slaResponses));
|
|
2844
3356
|
const bound = resolveTasks(stage.tasks, planStage.tasks);
|
|
@@ -2858,7 +3370,7 @@ var compareStage = (plan, stage, planStage, selectors, ledger, stagePosition, on
|
|
|
2858
3370
|
issues.push(error("STRICT_SDD_TASK_MISSING", `${stagePath}.data.tasks[${task.name}]`, `${label} is declared in the SDD and absent from the caseplan.`));
|
|
2859
3371
|
return;
|
|
2860
3372
|
}
|
|
2861
|
-
issues.push(...compareTask(plan, task, planStage.tasks[taskIndex], stagePath, label, selectors, ledger,
|
|
3373
|
+
issues.push(...compareTask(plan, task, planStage.tasks[taskIndex], stagePath, label, selectors, ledger, stageSpellings2, once));
|
|
2862
3374
|
});
|
|
2863
3375
|
planStage.tasks.forEach((extra, index) => {
|
|
2864
3376
|
if (bound.includes(index))
|
|
@@ -2951,7 +3463,7 @@ var compare = (sdd, plan, ledger) => {
|
|
|
2951
3463
|
};
|
|
2952
3464
|
const once = namesDeclaredOnce(sdd);
|
|
2953
3465
|
for (const { stage, at, sddIndex } of pairs) {
|
|
2954
|
-
issues.push(...compareStage(plan, stage, plan.stages[at], selectors, ledger, sddIndex, once));
|
|
3466
|
+
issues.push(...compareStage(plan, stage, plan.stages[at], selectors, ledger, sddIndex, once, sdd.stages, slaReferences(sdd)));
|
|
2955
3467
|
}
|
|
2956
3468
|
plan.stages.forEach((extra, index) => {
|
|
2957
3469
|
if (stageBound.has(index))
|
|
@@ -2962,6 +3474,88 @@ var compare = (sdd, plan, ledger) => {
|
|
|
2962
3474
|
return issues;
|
|
2963
3475
|
};
|
|
2964
3476
|
|
|
3477
|
+
// ../case-tool/src/services/strict-sdd-audit/name-collisions.ts
|
|
3478
|
+
var nameCollisions = (declared) => {
|
|
3479
|
+
const firstOf = new Map;
|
|
3480
|
+
const found = [];
|
|
3481
|
+
for (const one of declared) {
|
|
3482
|
+
const { key } = one;
|
|
3483
|
+
const first = firstOf.get(key);
|
|
3484
|
+
if (first === undefined)
|
|
3485
|
+
firstOf.set(key, one);
|
|
3486
|
+
else
|
|
3487
|
+
found.push({ key, first, second: one });
|
|
3488
|
+
}
|
|
3489
|
+
return found;
|
|
3490
|
+
};
|
|
3491
|
+
var describe = ({ key, first, second }) => first.name === second.name ? `"${first.name}" is declared twice, on lines ${first.line} and ${second.line}` : `"${first.name}" on line ${first.line} and "${second.name}" on line ${second.line} both read as "${key}"`;
|
|
3492
|
+
|
|
3493
|
+
class SddNameCollisionError extends Error {
|
|
3494
|
+
collisions;
|
|
3495
|
+
constructor(collisions) {
|
|
3496
|
+
super(`the Case Variables table declares variables the parser cannot tell apart: ${collisions.map(describe).join("; ")}. Each pair would merge into one variable with one Category, Type and Default. Rename one of each pair so the names differ by more than case, punctuation or a trailing (annotation).`);
|
|
3497
|
+
this.collisions = collisions;
|
|
3498
|
+
this.name = "SddNameCollisionError";
|
|
3499
|
+
}
|
|
3500
|
+
}
|
|
3501
|
+
|
|
3502
|
+
// ../case-tool/src/services/strict-sdd-audit/canvas-notes-read.ts
|
|
3503
|
+
var cellsOf = (line) => splitRowCells(line.trim().replace(/^\|/, "").replace(/\|$/, ""));
|
|
3504
|
+
var noteTable = (table) => {
|
|
3505
|
+
const [head = "", ...rest] = table.split(`
|
|
3506
|
+
`).filter((line) => line.trim() !== "");
|
|
3507
|
+
const separator = rest.length > 0 && cellsOf(rest[0]).every((cell) => cell === "" || isSeparatorCell(cell)) && cellsOf(rest[0]).some(isSeparatorCell);
|
|
3508
|
+
return {
|
|
3509
|
+
header: cellsOf(head),
|
|
3510
|
+
rows: (separator ? rest.slice(1) : rest).map(cellsOf)
|
|
3511
|
+
};
|
|
3512
|
+
};
|
|
3513
|
+
var readCanvasNotes = (sdd, title, body) => {
|
|
3514
|
+
const { header, rows } = noteTable(body);
|
|
3515
|
+
const wanted = ["Content", "Note", "Text"];
|
|
3516
|
+
const contentAt = columnIndex(header, ...wanted);
|
|
3517
|
+
const colorAt = columnIndex(header, "Color", "Colour");
|
|
3518
|
+
if (contentAt === undefined) {
|
|
3519
|
+
if (rows.length > 0) {
|
|
3520
|
+
sdd.parseNotes.push(noNameColumnNote(title, wanted, header));
|
|
3521
|
+
}
|
|
3522
|
+
return;
|
|
3523
|
+
}
|
|
3524
|
+
const offered = new Set(CANVAS_NOTE_COLORS);
|
|
3525
|
+
for (const [at, row] of rows.entries()) {
|
|
3526
|
+
const content = cellAt(row, contentAt).trim();
|
|
3527
|
+
if (content === "") {
|
|
3528
|
+
sdd.parseNotes.push("canvas note row has no Content, so no note was written for it");
|
|
3529
|
+
continue;
|
|
3530
|
+
}
|
|
3531
|
+
const stated = stripTicks(cellAt(row, colorAt)).trim();
|
|
3532
|
+
const color = isBlank(stated) ? "" : stated.toLowerCase();
|
|
3533
|
+
if (color !== "" && !offered.has(color)) {
|
|
3534
|
+
sdd.parseNotes.push(`canvas note colour "${stated}" is not one the Case Designer offers (${CANVAS_NOTE_COLORS.join(", ")}); the note keeps the default colour`);
|
|
3535
|
+
}
|
|
3536
|
+
sdd.canvasNotes.push({
|
|
3537
|
+
row: at + 1,
|
|
3538
|
+
...offered.has(color) && { color },
|
|
3539
|
+
content
|
|
3540
|
+
});
|
|
3541
|
+
}
|
|
3542
|
+
};
|
|
3543
|
+
var readCanvasNotesSection = (sdd, section, seen) => {
|
|
3544
|
+
const { title, body } = section;
|
|
3545
|
+
const own = section.children.length > 0 ? body.slice(0, section.children[0].start - section.contentStart) : body;
|
|
3546
|
+
const tables = pipeTables(own).filter((table) => noteTable(table).rows.some((row) => row.some((cell) => cell.trim() !== "")));
|
|
3547
|
+
if (tables.length === 0)
|
|
3548
|
+
return seen;
|
|
3549
|
+
const later = seen ? tables.length : tables.length - 1;
|
|
3550
|
+
if (later > 0) {
|
|
3551
|
+
sdd.parseNotes.push(`section "${title}": ${later === 1 ? "a second Canvas Notes table is" : `${later} more Canvas Notes tables are`} not read, because each note is named by its row and two tables would name two notes alike; put every note in one table`);
|
|
3552
|
+
}
|
|
3553
|
+
if (seen)
|
|
3554
|
+
return true;
|
|
3555
|
+
readCanvasNotes(sdd, title, tables[0]);
|
|
3556
|
+
return true;
|
|
3557
|
+
};
|
|
3558
|
+
|
|
2965
3559
|
// ../case-tool/src/services/strict-sdd-audit/sdd-stage.ts
|
|
2966
3560
|
var readTaskRows = (title, block, notes) => {
|
|
2967
3561
|
const { header, rows } = firstTable(block);
|
|
@@ -3038,7 +3632,7 @@ var conditionalSlaRows = (block) => {
|
|
|
3038
3632
|
const found = [];
|
|
3039
3633
|
const nameAt = columnIndex(header, "Display Name", "Title");
|
|
3040
3634
|
for (const row of rows) {
|
|
3041
|
-
const expression = (row[expressionAt] ?? "").trim();
|
|
3635
|
+
const expression = unwrapCodeSpan(row[expressionAt] ?? "").trim();
|
|
3042
3636
|
if (expression === "" || expression.startsWith("<"))
|
|
3043
3637
|
continue;
|
|
3044
3638
|
const count = (row[slaAt] ?? "").trim();
|
|
@@ -3148,6 +3742,7 @@ var parseStage = (name, section, notes) => {
|
|
|
3148
3742
|
task.boundInputs = detail.boundInputs;
|
|
3149
3743
|
task.extractRows = detail.extractRows;
|
|
3150
3744
|
task.customRows = detail.customRows;
|
|
3745
|
+
task.unreadTables = detail.unreadTables;
|
|
3151
3746
|
task.resolvedResource = detail.resolvedResource;
|
|
3152
3747
|
task.identityResolved = detail.identityResolved;
|
|
3153
3748
|
task.folder = detail.folder;
|
|
@@ -3173,6 +3768,8 @@ var parseStage = (name, section, notes) => {
|
|
|
3173
3768
|
task.timerValue = detail.timerValue;
|
|
3174
3769
|
if (!task.type && detail.type)
|
|
3175
3770
|
task.type = detail.type;
|
|
3771
|
+
if (detail.http !== undefined && String(task.type ?? "").trim().toLowerCase() === "http-request")
|
|
3772
|
+
task.http = detail.http;
|
|
3176
3773
|
}
|
|
3177
3774
|
const empty = {
|
|
3178
3775
|
conditions: !(stage.entryRows && stage.exitRows),
|
|
@@ -3191,7 +3788,7 @@ var parseStage = (name, section, notes) => {
|
|
|
3191
3788
|
};
|
|
3192
3789
|
|
|
3193
3790
|
// ../case-tool/src/services/strict-sdd-audit/sdd-parse.ts
|
|
3194
|
-
var applyCaseSection = (sdd, title, body) => {
|
|
3791
|
+
var applyCaseSection = (sdd, title, body, headingLine, declaredNames) => {
|
|
3195
3792
|
if (headingIs(title, CASE_EXIT_HEADINGS)) {
|
|
3196
3793
|
const merged = addConditionTable(sdd.caseExitRows, sdd.caseExitConditions, body);
|
|
3197
3794
|
sdd.caseExitRows = merged.rows;
|
|
@@ -3287,7 +3884,7 @@ var applyCaseSection = (sdd, title, body) => {
|
|
|
3287
3884
|
}
|
|
3288
3885
|
} else if (headingIs(title, CASE_VARIABLE_HEADINGS)) {
|
|
3289
3886
|
sdd.sawVariableSection = true;
|
|
3290
|
-
const { header, rows } = firstTable(body);
|
|
3887
|
+
const { header, rows, rowLines } = firstTable(body);
|
|
3291
3888
|
const wanted = ["Name", "Variable", "Variable Name"];
|
|
3292
3889
|
const nameAt = columnIndex(header, ...wanted);
|
|
3293
3890
|
const categoryAt = columnIndex(header, "Category");
|
|
@@ -3300,10 +3897,15 @@ var applyCaseSection = (sdd, title, body) => {
|
|
|
3300
3897
|
} else if (rows.length > 0 && categoryAt === undefined) {
|
|
3301
3898
|
sdd.parseNotes.push(noCategoryColumnNote(title, header));
|
|
3302
3899
|
}
|
|
3303
|
-
for (const row of rows) {
|
|
3900
|
+
for (const [index, row] of rows.entries()) {
|
|
3304
3901
|
const name = cellAt(row, nameAt);
|
|
3305
3902
|
if (name && !isBlank(name)) {
|
|
3306
3903
|
sdd.variables.push(stripTicks(name.trim()));
|
|
3904
|
+
declaredNames.push({
|
|
3905
|
+
name: stripTicks(name.trim()),
|
|
3906
|
+
key: norm(name),
|
|
3907
|
+
line: headingLine + rowLines[index]
|
|
3908
|
+
});
|
|
3307
3909
|
const declaredType = stripTicks(cellAt(row, typeAt).trim()).trim();
|
|
3308
3910
|
if (declaredType !== "" && !isBlank(declaredType)) {
|
|
3309
3911
|
sdd.variableTypes.set(norm(name), declaredType);
|
|
@@ -3404,6 +4006,16 @@ var applySlaResponses = (sdd) => {
|
|
|
3404
4006
|
stage.slaResponses = merge(stage.slaResponses, atRisk, breach);
|
|
3405
4007
|
}
|
|
3406
4008
|
};
|
|
4009
|
+
var lineAt = (text, offset) => {
|
|
4010
|
+
let line = 1;
|
|
4011
|
+
for (let at = text.indexOf(`
|
|
4012
|
+
`);at !== -1 && at < offset; ) {
|
|
4013
|
+
line += 1;
|
|
4014
|
+
at = text.indexOf(`
|
|
4015
|
+
`, at + 1);
|
|
4016
|
+
}
|
|
4017
|
+
return line;
|
|
4018
|
+
};
|
|
3407
4019
|
var parseSdd = (text) => {
|
|
3408
4020
|
const document = normalizeSdd(text);
|
|
3409
4021
|
const sdd = {
|
|
@@ -3426,14 +4038,22 @@ var parseSdd = (text) => {
|
|
|
3426
4038
|
caseConditionalSlas: [],
|
|
3427
4039
|
xrefOutputs: xrefProducers(document),
|
|
3428
4040
|
resourceOutputs: resourceOutputsByTask(document),
|
|
4041
|
+
canvasNotes: [],
|
|
3429
4042
|
parseNotes: []
|
|
3430
4043
|
};
|
|
3431
4044
|
const lookalikes = [];
|
|
4045
|
+
const declaredNames = [];
|
|
4046
|
+
let sawCanvasNotes = false;
|
|
3432
4047
|
for (const section of document.allSections) {
|
|
3433
4048
|
const { level, title, body } = section;
|
|
4049
|
+
if ((level === 2 || level === 3) && headingIs(title, CANVAS_NOTE_HEADINGS)) {
|
|
4050
|
+
sawCanvasNotes = readCanvasNotesSection(sdd, section, sawCanvasNotes);
|
|
4051
|
+
continue;
|
|
4052
|
+
}
|
|
3434
4053
|
if (level !== 3)
|
|
3435
4054
|
continue;
|
|
3436
|
-
|
|
4055
|
+
const headingLine = lineAt(text, section.start);
|
|
4056
|
+
if (applyCaseSection(sdd, title, body, headingLine, declaredNames))
|
|
3437
4057
|
continue;
|
|
3438
4058
|
const stageName = readStageHeading(title);
|
|
3439
4059
|
if (stageName !== undefined) {
|
|
@@ -3456,6 +4076,9 @@ var parseSdd = (text) => {
|
|
|
3456
4076
|
if (empty[topic])
|
|
3457
4077
|
sdd.parseNotes.push(unrecognizedHeadingNote(title, 3));
|
|
3458
4078
|
}
|
|
4079
|
+
const collisions = nameCollisions(declaredNames);
|
|
4080
|
+
if (collisions.length > 0)
|
|
4081
|
+
throw new SddNameCollisionError(collisions);
|
|
3459
4082
|
return sdd;
|
|
3460
4083
|
};
|
|
3461
4084
|
|
|
@@ -3522,6 +4145,7 @@ var parseSddToJson = (text) => {
|
|
|
3522
4145
|
...sdd.caseDescription !== undefined && {
|
|
3523
4146
|
caseDescription: sdd.caseDescription
|
|
3524
4147
|
},
|
|
4148
|
+
...sdd.canvasNotes.length > 0 && { canvasNotes: sdd.canvasNotes },
|
|
3525
4149
|
intake: {
|
|
3526
4150
|
caseExitRows: sdd.caseExitRows,
|
|
3527
4151
|
sawVariableSection: sdd.sawVariableSection,
|
|
@@ -3530,7 +4154,14 @@ var parseSddToJson = (text) => {
|
|
|
3530
4154
|
};
|
|
3531
4155
|
};
|
|
3532
4156
|
var auditCaseplanAgainstSdd = (parsed, sddText, sddName, ledger) => {
|
|
3533
|
-
const sdd = parseSdd(sddText);
|
|
4157
|
+
const [parseError, sdd] = catchError(() => parseSdd(sddText));
|
|
4158
|
+
if (parseError instanceof SddNameCollisionError) {
|
|
4159
|
+
return [
|
|
4160
|
+
error("STRICT_SDD_NAME_COLLISION", sddName, `"${sddName}": ${parseError.message}`)
|
|
4161
|
+
];
|
|
4162
|
+
}
|
|
4163
|
+
if (parseError)
|
|
4164
|
+
throw parseError;
|
|
3534
4165
|
const issues = sdd.parseNotes.map((note) => warning("STRICT_SDD_PARSE_NOTE", sddName, note));
|
|
3535
4166
|
if (sdd.stages.length === 0) {
|
|
3536
4167
|
issues.push(error("STRICT_SDD_PARSE_EMPTY", sddName, `No stages parsed from "${sddName}", so every completeness check would pass without checking anything. Stage headings must read \`### Stage <n>: <name>\`.`));
|
|
@@ -3540,6 +4171,6 @@ var auditCaseplanAgainstSdd = (parsed, sddText, sddName, ledger) => {
|
|
|
3540
4171
|
issues.push(...slaReferenceFindings(sddText, sddName));
|
|
3541
4172
|
return issues;
|
|
3542
4173
|
};
|
|
3543
|
-
export { CASE_SLA_PROPERTY, VARIABLE_PLACEMENT, DEFAULT_GROUP, STAGE_SELECTOR_RULES, TASK_SELECTOR_RULES, parseIfCell, bodySchemaIn, parseSddToJson, auditCaseplanAgainstSdd };
|
|
4174
|
+
export { CASE_SLA_PROPERTY, VARIABLE_PLACEMENT, DEFAULT_GROUP, markDeferredOutputs, expandXrefs, expandOutputMarkers, declaredOutputs, outputTypeFor, outputFor, variableOutputType, extractOutputFor, customOutputFor, canonicalExpression, unquoteLiteral, inputsFor, STAGE_SELECTOR_RULES, TASK_SELECTOR_RULES, parseIfCell, bodySchemaIn, parseSddToJson, auditCaseplanAgainstSdd };
|
|
3544
4175
|
|
|
3545
|
-
//# debugId=
|
|
4176
|
+
//# debugId=2CDB1F719150BEAA64756E2164756E21
|