@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getSolutionAuthContext
|
|
3
|
-
} from "./packager-tool-
|
|
3
|
+
} from "./packager-tool-rk25wp3c.js";
|
|
4
4
|
import {
|
|
5
5
|
JsonSerializerFactory,
|
|
6
6
|
JsonSerializerNames,
|
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
UsersApi,
|
|
15
15
|
createApiClient
|
|
16
|
-
} from "./packager-tool-
|
|
16
|
+
} from "./packager-tool-wwbk750c.js";
|
|
17
17
|
import {
|
|
18
18
|
getLoginStatusAsync
|
|
19
|
-
} from "./packager-tool-
|
|
19
|
+
} from "./packager-tool-yn33pw57.js";
|
|
20
20
|
import"./packager-tool-0gctz400.js";
|
|
21
21
|
import"./packager-tool-qa9gftnj.js";
|
|
22
22
|
import"./packager-tool-yc4kw997.js";
|
|
@@ -24,21 +24,24 @@ import {
|
|
|
24
24
|
findSolutionFileUpward,
|
|
25
25
|
normalizeProjectType,
|
|
26
26
|
toPortableRelativePath
|
|
27
|
-
} from "./packager-tool-
|
|
27
|
+
} from "./packager-tool-1q0ee9ht.js";
|
|
28
28
|
import {
|
|
29
29
|
extractErrorMessage,
|
|
30
30
|
logger
|
|
31
|
-
} from "./packager-tool-
|
|
32
|
-
import"./packager-tool-
|
|
31
|
+
} from "./packager-tool-zgm0r4yp.js";
|
|
32
|
+
import"./packager-tool-6sm17vbx.js";
|
|
33
|
+
import"./packager-tool-rp7pny4t.js";
|
|
33
34
|
import"./packager-tool-nkrmjr3a.js";
|
|
34
35
|
import {
|
|
35
36
|
getFileSystem
|
|
36
|
-
} from "./packager-tool-
|
|
37
|
+
} from "./packager-tool-hdxtgckw.js";
|
|
37
38
|
import"./packager-tool-yvcrdbgp.js";
|
|
38
39
|
import {
|
|
39
|
-
catchError,
|
|
40
40
|
isGuid
|
|
41
|
-
} from "./packager-tool-
|
|
41
|
+
} from "./packager-tool-sm8ertv4.js";
|
|
42
|
+
import {
|
|
43
|
+
catchError
|
|
44
|
+
} from "./packager-tool-wv85dhy2.js";
|
|
42
45
|
import {
|
|
43
46
|
__commonJS,
|
|
44
47
|
__require,
|
|
@@ -2477,6 +2480,19 @@ class NullSecretsProvider {
|
|
|
2477
2480
|
}
|
|
2478
2481
|
}
|
|
2479
2482
|
|
|
2483
|
+
// ../../node_modules/@uipath/resource-builder-sdk/dist/providers/feature-flag-provider.js
|
|
2484
|
+
class NullFeatureFlagProvider {
|
|
2485
|
+
getBool(_featureFlagName, defaultValue) {
|
|
2486
|
+
return defaultValue ?? false;
|
|
2487
|
+
}
|
|
2488
|
+
getInt(_featureFlagName, defaultValue) {
|
|
2489
|
+
return defaultValue ?? 0;
|
|
2490
|
+
}
|
|
2491
|
+
getString(_featureFlagName, defaultValue) {
|
|
2492
|
+
return defaultValue ?? "";
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2480
2496
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/exceptions/timeout-exception.js
|
|
2481
2497
|
class TimeoutException extends Error {
|
|
2482
2498
|
constructor(message, timeoutMs) {
|
|
@@ -2631,10 +2647,12 @@ function withFileOperationTimeout2(provider, timeoutMs) {
|
|
|
2631
2647
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/solution/solution-context-options.js
|
|
2632
2648
|
var DEFAULT_SOLUTION_CONTEXT_OPTIONS = {
|
|
2633
2649
|
lockTimeoutMs: 30000,
|
|
2634
|
-
fileOperationTimeoutMs: 30000
|
|
2650
|
+
fileOperationTimeoutMs: 30000,
|
|
2651
|
+
maxDegreeOfParallelism: 1
|
|
2635
2652
|
};
|
|
2636
2653
|
var SOLUTION_CONTEXT_TIMEOUT_STORAGE_KEY = "SOL_RB_SOLUTION_CONTEXT_TIMEOUT_MS";
|
|
2637
2654
|
var FILE_OPERATION_TIMEOUT_STORAGE_KEY = "SOL_RB_FILE_OPERATION_TIMEOUT_MS";
|
|
2655
|
+
var MAX_DEGREE_OF_PARALLELISM_STORAGE_KEY = "SOL_RB_MAX_DEGREE_OF_PARALLELISM";
|
|
2638
2656
|
function resolveTimeoutMs(storageKey, configured, fallback) {
|
|
2639
2657
|
const override = readTimeoutOverrideMs(storageKey);
|
|
2640
2658
|
if (override !== undefined)
|
|
@@ -2647,10 +2665,33 @@ function resolveLockTimeoutMs(options) {
|
|
|
2647
2665
|
function resolveFileOperationTimeoutMs(options) {
|
|
2648
2666
|
return resolveTimeoutMs(FILE_OPERATION_TIMEOUT_STORAGE_KEY, options?.fileOperationTimeoutMs, DEFAULT_SOLUTION_CONTEXT_OPTIONS.fileOperationTimeoutMs);
|
|
2649
2667
|
}
|
|
2668
|
+
function isValidDegreeOfParallelism(value) {
|
|
2669
|
+
return typeof value == "number" && Number.isInteger(value) && value > 0;
|
|
2670
|
+
}
|
|
2671
|
+
function resolveMaxDegreeOfParallelism(options) {
|
|
2672
|
+
const override = readDegreeOfParallelismOverride(MAX_DEGREE_OF_PARALLELISM_STORAGE_KEY);
|
|
2673
|
+
if (override !== undefined)
|
|
2674
|
+
return override;
|
|
2675
|
+
return isValidDegreeOfParallelism(options?.maxDegreeOfParallelism) ? options.maxDegreeOfParallelism : DEFAULT_SOLUTION_CONTEXT_OPTIONS.maxDegreeOfParallelism;
|
|
2676
|
+
}
|
|
2677
|
+
function readDegreeOfParallelismOverride(storageKey) {
|
|
2678
|
+
try {
|
|
2679
|
+
if ("u" < typeof localStorage)
|
|
2680
|
+
return;
|
|
2681
|
+
const raw = localStorage.getItem(storageKey);
|
|
2682
|
+
if (raw === null || raw.trim() === "")
|
|
2683
|
+
return;
|
|
2684
|
+
const parsed = Number(raw);
|
|
2685
|
+
return isValidDegreeOfParallelism(parsed) ? parsed : undefined;
|
|
2686
|
+
} catch {
|
|
2687
|
+
return;
|
|
2688
|
+
}
|
|
2689
|
+
}
|
|
2650
2690
|
function mergeSolutionContextOptions(options) {
|
|
2651
2691
|
return {
|
|
2652
2692
|
lockTimeoutMs: isValidTimeoutMs(options?.lockTimeoutMs) ? options.lockTimeoutMs : DEFAULT_SOLUTION_CONTEXT_OPTIONS.lockTimeoutMs,
|
|
2653
|
-
fileOperationTimeoutMs: isValidTimeoutMs(options?.fileOperationTimeoutMs) ? options.fileOperationTimeoutMs : DEFAULT_SOLUTION_CONTEXT_OPTIONS.fileOperationTimeoutMs
|
|
2693
|
+
fileOperationTimeoutMs: isValidTimeoutMs(options?.fileOperationTimeoutMs) ? options.fileOperationTimeoutMs : DEFAULT_SOLUTION_CONTEXT_OPTIONS.fileOperationTimeoutMs,
|
|
2694
|
+
maxDegreeOfParallelism: isValidDegreeOfParallelism(options?.maxDegreeOfParallelism) ? options.maxDegreeOfParallelism : DEFAULT_SOLUTION_CONTEXT_OPTIONS.maxDegreeOfParallelism
|
|
2654
2695
|
};
|
|
2655
2696
|
}
|
|
2656
2697
|
|
|
@@ -3441,6 +3482,16 @@ function getRootFolder(solution) {
|
|
|
3441
3482
|
}
|
|
3442
3483
|
|
|
3443
3484
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/solution/multi-file-solution-definition-provider.js
|
|
3485
|
+
function nowMs() {
|
|
3486
|
+
return globalThis.performance?.now?.() ?? Date.now();
|
|
3487
|
+
}
|
|
3488
|
+
function round1(ms) {
|
|
3489
|
+
return Math.round(10 * ms) / 10;
|
|
3490
|
+
}
|
|
3491
|
+
function cancellationError(signal) {
|
|
3492
|
+
return signal?.reason instanceof OperationCancelledException ? signal.reason : new OperationCancelledException;
|
|
3493
|
+
}
|
|
3494
|
+
|
|
3444
3495
|
class MultiFileSolutionDefinitionProvider {
|
|
3445
3496
|
get caseInsensitiveSerializer() {
|
|
3446
3497
|
if (!this._caseInsensitiveSerializer)
|
|
@@ -3458,137 +3509,344 @@ class MultiFileSolutionDefinitionProvider {
|
|
|
3458
3509
|
}
|
|
3459
3510
|
async readAsync(context, cancellationToken) {
|
|
3460
3511
|
this.logger.info("Reading multi-file solution definition for solution %s", context.path);
|
|
3461
|
-
const
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
let
|
|
3466
|
-
let
|
|
3467
|
-
|
|
3468
|
-
let
|
|
3469
|
-
|
|
3512
|
+
const loadStarted = nowMs();
|
|
3513
|
+
let fileCount = 0;
|
|
3514
|
+
let listMs = 0;
|
|
3515
|
+
let readStarted = loadStarted;
|
|
3516
|
+
let readWallMs = 0;
|
|
3517
|
+
let readCompleted = false;
|
|
3518
|
+
let ioMs = 0;
|
|
3519
|
+
let maxFileIoMs = 0;
|
|
3520
|
+
let parseMs = 0;
|
|
3521
|
+
let hashMs = 0;
|
|
3522
|
+
let chars = 0;
|
|
3523
|
+
let loadedCount = 0;
|
|
3470
3524
|
const parseErrors = [];
|
|
3471
3525
|
const missingFiles = [];
|
|
3472
3526
|
const invalidFiles = [];
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3527
|
+
let metricsLogged = false;
|
|
3528
|
+
const logReadMetrics = (outcome) => {
|
|
3529
|
+
metricsLogged = true;
|
|
3530
|
+
const totalMs = nowMs() - loadStarted;
|
|
3531
|
+
const mergeMs = readCompleted ? nowMs() - readStarted - readWallMs : 0;
|
|
3532
|
+
const metrics = {
|
|
3533
|
+
outcome,
|
|
3534
|
+
path: context.path,
|
|
3535
|
+
fileCount,
|
|
3536
|
+
totalMs: round1(totalMs),
|
|
3537
|
+
listMs: round1(listMs),
|
|
3538
|
+
readWallMs: round1(readWallMs),
|
|
3539
|
+
ioMs: round1(ioMs),
|
|
3540
|
+
maxFileIoMs: round1(maxFileIoMs),
|
|
3541
|
+
parseMs: round1(parseMs),
|
|
3542
|
+
hashMs: round1(hashMs),
|
|
3543
|
+
mergeMs: round1(mergeMs),
|
|
3544
|
+
chars,
|
|
3545
|
+
degreeOfParallelism: resolveMaxDegreeOfParallelism(this.options),
|
|
3546
|
+
isReadOnly: context.isReadOnly,
|
|
3547
|
+
loaded: loadedCount,
|
|
3548
|
+
missing: missingFiles.length,
|
|
3549
|
+
invalid: invalidFiles.length,
|
|
3550
|
+
parseErrors: parseErrors.length
|
|
3551
|
+
};
|
|
3552
|
+
const message = `Solution read ${outcome} for solution ${context.path}: ${metrics.fileCount} files in ${metrics.totalMs} ms (list ${metrics.listMs} ms, read ${metrics.readWallMs} ms wall, io ${metrics.ioMs} ms summed, max file io ${metrics.maxFileIoMs} ms, parse ${metrics.parseMs} ms, hash ${metrics.hashMs} ms, merge ${metrics.mergeMs} ms); ${metrics.chars} chars; parallelism ${metrics.degreeOfParallelism}; readOnly ${metrics.isReadOnly}; loaded ${metrics.loaded}, missing ${metrics.missing}, invalid ${metrics.invalid}, parseErrors ${metrics.parseErrors}`;
|
|
3553
|
+
if (outcome === "Success")
|
|
3554
|
+
this.logger.info(message, metrics);
|
|
3555
|
+
else
|
|
3556
|
+
this.logger.warn(message, metrics);
|
|
3557
|
+
};
|
|
3558
|
+
const readCore = async () => {
|
|
3559
|
+
const solutionKey = this.getSolutionKey(context);
|
|
3560
|
+
const fileStorageProvider = await this.getFileStorageProviderAsync(context, cancellationToken);
|
|
3561
|
+
const resources = [];
|
|
3562
|
+
const solutionFiles = [];
|
|
3563
|
+
let hashes;
|
|
3564
|
+
let paths;
|
|
3565
|
+
const pathsByKind = this.getPathsByKind(context);
|
|
3566
|
+
let tree;
|
|
3567
|
+
pathsByKind.clear();
|
|
3568
|
+
context.items[SolutionContextKeys.PARSE_ERRORS_ITEM_KEY] = parseErrors;
|
|
3569
|
+
if (!context.isReadOnly) {
|
|
3570
|
+
hashes = this.getHashes(context);
|
|
3571
|
+
paths = this.getPaths(context);
|
|
3572
|
+
tree = this.getTree(context);
|
|
3573
|
+
hashes.clear();
|
|
3574
|
+
paths.clear();
|
|
3575
|
+
tree.length = 0;
|
|
3576
|
+
}
|
|
3577
|
+
const listStarted = nowMs();
|
|
3578
|
+
const resourceFiles = await fileStorageProvider.getFilesAsync(SolutionConstants.RESOURCE_FILES_FOLDER_NAME, "*.json", cancellationToken);
|
|
3579
|
+
listMs = nowMs() - listStarted;
|
|
3580
|
+
fileCount = resourceFiles.length;
|
|
3581
|
+
readStarted = nowMs();
|
|
3582
|
+
const readResults = await this.readResourceFilesAsync(context, fileStorageProvider, resourceFiles, cancellationToken);
|
|
3583
|
+
readWallMs = nowMs() - readStarted;
|
|
3584
|
+
readCompleted = true;
|
|
3585
|
+
let fatal;
|
|
3586
|
+
let hasFatal = false;
|
|
3587
|
+
for (const result of readResults)
|
|
3588
|
+
if (result !== undefined) {
|
|
3589
|
+
if (result.timings) {
|
|
3590
|
+
ioMs += result.timings.ioMs;
|
|
3591
|
+
maxFileIoMs = Math.max(maxFileIoMs, result.timings.ioMs);
|
|
3592
|
+
parseMs += result.timings.parseMs;
|
|
3593
|
+
hashMs += result.timings.hashMs;
|
|
3594
|
+
chars += result.timings.chars;
|
|
3595
|
+
}
|
|
3596
|
+
if (result.fatal !== undefined) {
|
|
3597
|
+
if (!hasFatal) {
|
|
3598
|
+
fatal = result.fatal;
|
|
3599
|
+
hasFatal = true;
|
|
3510
3600
|
}
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3601
|
+
continue;
|
|
3602
|
+
}
|
|
3603
|
+
if (!hasFatal)
|
|
3604
|
+
switch (result.outcome) {
|
|
3605
|
+
case "loaded": {
|
|
3606
|
+
loadedCount++;
|
|
3607
|
+
const rd = result.resource;
|
|
3608
|
+
for (const file of result.files)
|
|
3609
|
+
if (!solutionFiles.some((sf) => sf.name === file.name && sf.kind === file.kind))
|
|
3610
|
+
solutionFiles.push(file);
|
|
3611
|
+
resources.push(rd);
|
|
3612
|
+
const resourceKey = rd.key;
|
|
3613
|
+
const normalizedFullPath = result.normalizedPath;
|
|
3614
|
+
if (!pathsByKind.has(rd.kind))
|
|
3615
|
+
pathsByKind.set(rd.kind, []);
|
|
3616
|
+
const kindPaths = pathsByKind.get(rd.kind);
|
|
3617
|
+
if (kindPaths)
|
|
3618
|
+
kindPaths.push({
|
|
3619
|
+
name: rd.name,
|
|
3620
|
+
key: rd.key,
|
|
3621
|
+
path: normalizedFullPath
|
|
3622
|
+
});
|
|
3623
|
+
if (!context.isReadOnly && hashes && paths) {
|
|
3624
|
+
paths.set(resourceKey, normalizedFullPath);
|
|
3625
|
+
hashes.set(resourceKey, result.hash);
|
|
3626
|
+
}
|
|
3627
|
+
break;
|
|
3515
3628
|
}
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3629
|
+
case "missing":
|
|
3630
|
+
missingFiles.push(result.file);
|
|
3631
|
+
break;
|
|
3632
|
+
case "invalid":
|
|
3633
|
+
invalidFiles.push(result.file);
|
|
3634
|
+
break;
|
|
3635
|
+
case "parseError":
|
|
3636
|
+
parseErrors.push(result.file);
|
|
3637
|
+
break;
|
|
3638
|
+
}
|
|
3639
|
+
}
|
|
3640
|
+
if (hasFatal) {
|
|
3641
|
+
logReadMetrics("Fatal");
|
|
3642
|
+
throw fatal;
|
|
3643
|
+
}
|
|
3644
|
+
if (missingFiles.length > 0) {
|
|
3645
|
+
logReadMetrics("MissingFiles");
|
|
3646
|
+
throw new BadRequestException(ErrorCodes.Resources.MissingFileDependencies, `Solution has missing files: ${missingFiles.join(", ")}`);
|
|
3647
|
+
}
|
|
3648
|
+
if (invalidFiles.length > 0) {
|
|
3649
|
+
logReadMetrics("InvalidFiles");
|
|
3650
|
+
throw new BadRequestException(ErrorCodes.Resources.InvalidResourceFile, `Solution has resource files with invalid content: ${invalidFiles.join(", ")}`);
|
|
3651
|
+
}
|
|
3652
|
+
if (parseErrors.length > 0) {
|
|
3653
|
+
logReadMetrics("ParseErrors");
|
|
3654
|
+
throw new Error(`Failed to read resource files for solution ${context.path}: ${parseErrors.join(", ")}`);
|
|
3655
|
+
}
|
|
3656
|
+
const folderMap = new Map;
|
|
3657
|
+
const rootFolder = this.buildRootFolder(solutionKey, SolutionConstants.ROOT_FOLDER_NAME);
|
|
3658
|
+
folderMap.set(rootFolder.fullyQualifiedName.toLowerCase(), rootFolder);
|
|
3659
|
+
for (const res of resources)
|
|
3660
|
+
for (const fdep of res.folders ?? []) {
|
|
3661
|
+
const fqnLower = fdep.fullyQualifiedName.toLowerCase();
|
|
3662
|
+
if (!folderMap.has(fqnLower)) {
|
|
3663
|
+
const folderKey = this.generateGuidFromString(fdep.fullyQualifiedName);
|
|
3664
|
+
const pathSegments = fdep.fullyQualifiedName.split("/").filter((s) => s.length > 0).map((p) => {
|
|
3665
|
+
if (p.toLowerCase() !== SolutionConstants.ROOT_FOLDER_NAME.toLowerCase())
|
|
3666
|
+
return this.generateGuidFromString(SolutionConstants.ROOT_FOLDER_NAME);
|
|
3667
|
+
return rootFolder.key;
|
|
3668
|
+
});
|
|
3669
|
+
const folderPath = pathSegments.join(".");
|
|
3670
|
+
folderMap.set(fqnLower, {
|
|
3671
|
+
key: folderKey,
|
|
3672
|
+
fullyQualifiedName: fdep.fullyQualifiedName,
|
|
3673
|
+
path: folderPath
|
|
3528
3674
|
});
|
|
3529
|
-
if (!context.isReadOnly && hashes && paths) {
|
|
3530
|
-
paths.set(resourceKey, normalizedFullPath);
|
|
3531
|
-
hashes.set(resourceKey, await this.computeHash(content));
|
|
3532
3675
|
}
|
|
3533
|
-
} else {
|
|
3534
|
-
this.logger.error("Failed to read resource file %s for solution %s: invalid content", undefined, resourceFile, context.path);
|
|
3535
|
-
invalidFiles.push(resourceFile);
|
|
3536
|
-
}
|
|
3537
|
-
} catch (ex) {
|
|
3538
|
-
if (ex instanceof OperationCancelledException || cancellationToken?.aborted) {
|
|
3539
|
-
this.logger.warn("Operation cancelled while reading file %s for solution %s", resourceFile, context.path);
|
|
3540
|
-
throw ex instanceof OperationCancelledException ? ex : new OperationCancelledException;
|
|
3541
|
-
}
|
|
3542
|
-
if (ex instanceof TimeoutException)
|
|
3543
|
-
throw new TimeoutException(`Reading resource file ${resourceFile} for solution ${context.path} timed out: ${ex.message}`, ex.timeoutMs);
|
|
3544
|
-
if (isFileNotFoundError(ex)) {
|
|
3545
|
-
this.logger.warn("Resource file listed but missing in storage for solution %s: %s", resourceFile, context.path);
|
|
3546
|
-
missingFiles.push(resourceFile);
|
|
3547
|
-
} else {
|
|
3548
|
-
this.logger.error("Failed to read resource file %s for solution %s", ex, resourceFile, context.path);
|
|
3549
|
-
parseErrors.push(resourceFile);
|
|
3550
3676
|
}
|
|
3677
|
+
const solution = {
|
|
3678
|
+
key: solutionKey,
|
|
3679
|
+
docVersion: SolutionConstants.CURRENT_DOC_VERSION,
|
|
3680
|
+
folders: Array.from(folderMap.values()),
|
|
3681
|
+
resources,
|
|
3682
|
+
files: solutionFiles
|
|
3683
|
+
};
|
|
3684
|
+
await this.replaceDuplicateKeysAsync(solution, cancellationToken);
|
|
3685
|
+
if (!context.isReadOnly && tree) {
|
|
3686
|
+
const orderedResourceKeys = getTopologicalIdsOrdering(buildDependencyGraph(solution.resources));
|
|
3687
|
+
tree.push(...orderedResourceKeys);
|
|
3551
3688
|
}
|
|
3552
|
-
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3689
|
+
logReadMetrics("Success");
|
|
3690
|
+
return solution;
|
|
3691
|
+
};
|
|
3692
|
+
try {
|
|
3693
|
+
return await readCore();
|
|
3694
|
+
} catch (ex) {
|
|
3695
|
+
if (!metricsLogged)
|
|
3696
|
+
logReadMetrics("Fatal");
|
|
3697
|
+
throw ex;
|
|
3698
|
+
}
|
|
3699
|
+
}
|
|
3700
|
+
async readResourceFilesAsync(context, fileStorageProvider, resourceFiles, cancellationToken) {
|
|
3701
|
+
const results = Array.from({
|
|
3702
|
+
length: resourceFiles.length
|
|
3703
|
+
}, () => {
|
|
3704
|
+
return;
|
|
3705
|
+
});
|
|
3706
|
+
if (resourceFiles.length === 0)
|
|
3707
|
+
return results;
|
|
3708
|
+
const computeHash = !context.isReadOnly;
|
|
3709
|
+
const degreeOfParallelism = Math.min(resolveMaxDegreeOfParallelism(this.options), resourceFiles.length);
|
|
3710
|
+
let nextIndex = 0;
|
|
3711
|
+
let stopRequested = false;
|
|
3712
|
+
const runWorkerAsync = async () => {
|
|
3713
|
+
while (!stopRequested && nextIndex < resourceFiles.length) {
|
|
3714
|
+
const index = nextIndex++;
|
|
3715
|
+
const resourceFile = resourceFiles[index];
|
|
3716
|
+
const result = await this.readResourceFileAsync(context, fileStorageProvider, resourceFile, computeHash, cancellationToken);
|
|
3717
|
+
results[index] = result;
|
|
3718
|
+
if (result.fatal !== undefined)
|
|
3719
|
+
stopRequested = true;
|
|
3578
3720
|
}
|
|
3579
|
-
const solution = {
|
|
3580
|
-
key: solutionKey,
|
|
3581
|
-
docVersion: SolutionConstants.CURRENT_DOC_VERSION,
|
|
3582
|
-
folders: Array.from(folderMap.values()),
|
|
3583
|
-
resources,
|
|
3584
|
-
files: solutionFiles
|
|
3585
3721
|
};
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3722
|
+
const workers = [];
|
|
3723
|
+
for (let i = 0;i < degreeOfParallelism; i++)
|
|
3724
|
+
workers.push(runWorkerAsync());
|
|
3725
|
+
await Promise.all(workers);
|
|
3726
|
+
if (cancellationToken?.aborted && !results.some((result) => result?.fatal !== undefined))
|
|
3727
|
+
throw cancellationError(cancellationToken);
|
|
3728
|
+
return results;
|
|
3729
|
+
}
|
|
3730
|
+
async readResourceFileAsync(context, fileStorageProvider, resourceFile, computeHash, cancellationToken) {
|
|
3731
|
+
const started = nowMs();
|
|
3732
|
+
let ioMs;
|
|
3733
|
+
let content;
|
|
3734
|
+
const failureTimings = () => {
|
|
3735
|
+
const elapsed = nowMs() - started;
|
|
3736
|
+
return ioMs === undefined ? {
|
|
3737
|
+
ioMs: elapsed,
|
|
3738
|
+
parseMs: 0,
|
|
3739
|
+
hashMs: 0,
|
|
3740
|
+
chars: 0
|
|
3741
|
+
} : {
|
|
3742
|
+
ioMs,
|
|
3743
|
+
parseMs: elapsed - ioMs,
|
|
3744
|
+
hashMs: 0,
|
|
3745
|
+
chars: content?.length ?? 0
|
|
3746
|
+
};
|
|
3747
|
+
};
|
|
3748
|
+
try {
|
|
3749
|
+
if (cancellationToken?.aborted)
|
|
3750
|
+
throw cancellationError(cancellationToken);
|
|
3751
|
+
const stream = await fileStorageProvider.openFileAsync(resourceFile, cancellationToken);
|
|
3752
|
+
content = await this.streamToString(stream);
|
|
3753
|
+
ioMs = nowMs() - started;
|
|
3754
|
+
const parseStarted = nowMs();
|
|
3755
|
+
const wrapper = this.caseInsensitiveSerializer.deserialize(content);
|
|
3756
|
+
if (!wrapper?.resource) {
|
|
3757
|
+
this.logger.error("Failed to read resource file %s for solution %s: invalid content", undefined, resourceFile, context.path);
|
|
3758
|
+
return {
|
|
3759
|
+
file: resourceFile,
|
|
3760
|
+
outcome: "invalid",
|
|
3761
|
+
timings: failureTimings()
|
|
3762
|
+
};
|
|
3763
|
+
}
|
|
3764
|
+
const files = [];
|
|
3765
|
+
const rd = this.fromSerializable(wrapper.resource, files);
|
|
3766
|
+
this.applyFolders(rd, resourceFile);
|
|
3767
|
+
const parseMs = nowMs() - parseStarted;
|
|
3768
|
+
let hash;
|
|
3769
|
+
let hashMs = 0;
|
|
3770
|
+
if (computeHash) {
|
|
3771
|
+
const hashStarted = nowMs();
|
|
3772
|
+
hash = await this.computeHash(content);
|
|
3773
|
+
hashMs = nowMs() - hashStarted;
|
|
3774
|
+
}
|
|
3775
|
+
return {
|
|
3776
|
+
file: resourceFile,
|
|
3777
|
+
outcome: "loaded",
|
|
3778
|
+
resource: rd,
|
|
3779
|
+
files,
|
|
3780
|
+
normalizedPath: this.getNormalizedPath(resourceFile),
|
|
3781
|
+
hash,
|
|
3782
|
+
timings: {
|
|
3783
|
+
ioMs,
|
|
3784
|
+
parseMs,
|
|
3785
|
+
hashMs,
|
|
3786
|
+
chars: content.length
|
|
3787
|
+
}
|
|
3788
|
+
};
|
|
3789
|
+
} catch (ex) {
|
|
3790
|
+
if (ex instanceof OperationCancelledException || cancellationToken?.aborted) {
|
|
3791
|
+
this.logger.warn("Operation cancelled while reading file %s for solution %s", resourceFile, context.path);
|
|
3792
|
+
return {
|
|
3793
|
+
file: resourceFile,
|
|
3794
|
+
outcome: "fatal",
|
|
3795
|
+
fatal: ex instanceof OperationCancelledException ? ex : cancellationError(cancellationToken),
|
|
3796
|
+
timings: failureTimings()
|
|
3797
|
+
};
|
|
3798
|
+
}
|
|
3799
|
+
if (ex instanceof TimeoutException)
|
|
3800
|
+
return {
|
|
3801
|
+
file: resourceFile,
|
|
3802
|
+
outcome: "fatal",
|
|
3803
|
+
fatal: new TimeoutException(`Reading resource file ${resourceFile} for solution ${context.path} timed out: ${ex.message}`, ex.timeoutMs),
|
|
3804
|
+
timings: failureTimings()
|
|
3805
|
+
};
|
|
3806
|
+
if (isFileNotFoundError(ex)) {
|
|
3807
|
+
this.logger.warn("Resource file listed but missing in storage for solution %s: %s", resourceFile, context.path);
|
|
3808
|
+
return {
|
|
3809
|
+
file: resourceFile,
|
|
3810
|
+
outcome: "missing",
|
|
3811
|
+
timings: failureTimings()
|
|
3812
|
+
};
|
|
3813
|
+
}
|
|
3814
|
+
this.logger.error("Failed to read resource file %s for solution %s", ex, resourceFile, context.path);
|
|
3815
|
+
return {
|
|
3816
|
+
file: resourceFile,
|
|
3817
|
+
outcome: "parseError",
|
|
3818
|
+
timings: failureTimings()
|
|
3819
|
+
};
|
|
3590
3820
|
}
|
|
3591
|
-
|
|
3821
|
+
}
|
|
3822
|
+
applyFolders(resource, resourceFile) {
|
|
3823
|
+
const relPath = resourceFile.replace(/\\/g, "/");
|
|
3824
|
+
const segments = relPath.split("/").filter((s) => s.length > 0);
|
|
3825
|
+
const firstSegment = segments[0];
|
|
3826
|
+
if (segments.length >= 3 && firstSegment && firstSegment.toLowerCase() === SolutionConstants.RESOURCE_FILES_FOLDER_NAME.toLowerCase()) {
|
|
3827
|
+
const hasType = !!resource.type;
|
|
3828
|
+
const folderSegmentCount = hasType ? segments.length - 3 : segments.length - 2;
|
|
3829
|
+
if (folderSegmentCount < 1)
|
|
3830
|
+
resource.folders = [
|
|
3831
|
+
{
|
|
3832
|
+
fullyQualifiedName: SolutionConstants.ROOT_FOLDER_NAME
|
|
3833
|
+
}
|
|
3834
|
+
];
|
|
3835
|
+
else {
|
|
3836
|
+
const segmentsToUse = segments.slice(1, folderSegmentCount);
|
|
3837
|
+
const folderFqn = segmentsToUse.join("/");
|
|
3838
|
+
resource.folders = [
|
|
3839
|
+
{
|
|
3840
|
+
fullyQualifiedName: folderFqn
|
|
3841
|
+
}
|
|
3842
|
+
];
|
|
3843
|
+
}
|
|
3844
|
+
} else
|
|
3845
|
+
resource.folders = [
|
|
3846
|
+
{
|
|
3847
|
+
fullyQualifiedName: SolutionConstants.ROOT_FOLDER_NAME
|
|
3848
|
+
}
|
|
3849
|
+
];
|
|
3592
3850
|
}
|
|
3593
3851
|
async writeAsync(context, solution, cancellationToken) {
|
|
3594
3852
|
if (context.isReadOnly)
|
|
@@ -3893,7 +4151,7 @@ class MultiFileSolutionDefinitionFactory {
|
|
|
3893
4151
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/embedded-files-default.js
|
|
3894
4152
|
async function createDefaultEmbeddedFileReaderAsync() {
|
|
3895
4153
|
const [{ EmbeddedFileReader }, { JsonSerializerFactory: JsonSerializerFactory2 }] = await Promise.all([
|
|
3896
|
-
import("./embedded-file-reader-
|
|
4154
|
+
import("./embedded-file-reader-r66242ey.js"),
|
|
3897
4155
|
import("./index-kmp9fmhb.js")
|
|
3898
4156
|
]);
|
|
3899
4157
|
return new EmbeddedFileReader(new JsonSerializerFactory2);
|
|
@@ -3911,6 +4169,7 @@ var ServiceTokens = {
|
|
|
3911
4169
|
SecretsProvider: "ISecretsProvider",
|
|
3912
4170
|
FileStorageProviderFactory: "IFileStorageProviderFactory",
|
|
3913
4171
|
IpRangeBypassSecretProvider: "IIpRangeBypassSecretProvider",
|
|
4172
|
+
FeatureFlagProvider: "IFeatureFlagProvider",
|
|
3914
4173
|
SolutionDefinitionProvider: "ISolutionDefinitionProvider",
|
|
3915
4174
|
SolutionDefinitionFactory: "ISolutionDefinitionFactory",
|
|
3916
4175
|
ArtifactResourceSpecEnhancer: "IArtifactResourceSpecEnhancer",
|
|
@@ -4261,6 +4520,9 @@ function getBindingType(resourceKind, resourceType) {
|
|
|
4261
4520
|
}
|
|
4262
4521
|
|
|
4263
4522
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/bindings/bindings-metadata-serializer.js
|
|
4523
|
+
var SUPPORTED_SCHEMA_MAJOR_VERSION = 2;
|
|
4524
|
+
var INT32_MAX_VALUE = 2147483647;
|
|
4525
|
+
|
|
4264
4526
|
class BindingsMetadataSerializer {
|
|
4265
4527
|
tryDeserialize(input) {
|
|
4266
4528
|
if (!input)
|
|
@@ -4271,30 +4533,52 @@ class BindingsMetadataSerializer {
|
|
|
4271
4533
|
let cleanInput = input.charCodeAt(0) === 65279 ? input.slice(1) : input;
|
|
4272
4534
|
if (cleanInput.charCodeAt(cleanInput.length - 1) === 26)
|
|
4273
4535
|
cleanInput = cleanInput.slice(0, -1);
|
|
4274
|
-
const
|
|
4536
|
+
const root = JSON.parse(cleanInput);
|
|
4537
|
+
if (root === null || typeof root != "object" || Array.isArray(root)) {
|
|
4538
|
+
this.logger.warn("Invalid bindings: content is not a JSON object");
|
|
4539
|
+
return {
|
|
4540
|
+
success: false
|
|
4541
|
+
};
|
|
4542
|
+
}
|
|
4543
|
+
const jsonObject = root;
|
|
4275
4544
|
const versionValue = jsonObject[BindingsKnownKeys.Version];
|
|
4276
|
-
if (
|
|
4545
|
+
if (typeof versionValue != "string") {
|
|
4546
|
+
this.logger.warn(`Invalid bindings: '${BindingsKnownKeys.Version}' is missing or not a string`);
|
|
4547
|
+
return {
|
|
4548
|
+
success: false
|
|
4549
|
+
};
|
|
4550
|
+
}
|
|
4551
|
+
const majorVersion = BindingsMetadataSerializer.tryParseMajorVersion(versionValue);
|
|
4552
|
+
if (majorVersion === undefined) {
|
|
4553
|
+
this.logger.warn(`Invalid bindings: '${BindingsKnownKeys.Version}' is not a valid version`);
|
|
4554
|
+
return {
|
|
4555
|
+
success: false
|
|
4556
|
+
};
|
|
4557
|
+
}
|
|
4558
|
+
if (majorVersion !== SUPPORTED_SCHEMA_MAJOR_VERSION) {
|
|
4559
|
+
this.logger.warn(`Invalid bindings: unsupported schema major version ${majorVersion}`);
|
|
4560
|
+
return {
|
|
4561
|
+
success: false
|
|
4562
|
+
};
|
|
4563
|
+
}
|
|
4564
|
+
const resources = jsonObject[BindingsKnownKeys.Resources];
|
|
4565
|
+
if (!Array.isArray(resources)) {
|
|
4566
|
+
this.logger.warn(`Invalid bindings: '${BindingsKnownKeys.Resources}' is missing or not an array`);
|
|
4277
4567
|
return {
|
|
4278
4568
|
success: false
|
|
4279
4569
|
};
|
|
4280
|
-
|
|
4281
|
-
const majorVersion = versionParts[0];
|
|
4282
|
-
if (majorVersion !== 2)
|
|
4283
|
-
throw new Error("Unsupported bindings schema");
|
|
4570
|
+
}
|
|
4284
4571
|
const metadata = {
|
|
4285
4572
|
version: versionValue,
|
|
4286
4573
|
resources: []
|
|
4287
4574
|
};
|
|
4288
|
-
const resources
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
this.logger.warn("Skipping null bindings resource element");
|
|
4293
|
-
continue;
|
|
4294
|
-
}
|
|
4295
|
-
const resource = this.getBindingsResourceV2(resourceElement);
|
|
4296
|
-
metadata.resources.push(resource);
|
|
4575
|
+
for (const resourceElement of resources) {
|
|
4576
|
+
if (resourceElement == null) {
|
|
4577
|
+
this.logger.warn("Skipping null bindings resource element");
|
|
4578
|
+
continue;
|
|
4297
4579
|
}
|
|
4580
|
+
metadata.resources.push(this.getBindingsResourceV2(resourceElement));
|
|
4581
|
+
}
|
|
4298
4582
|
this.linkDependencies(metadata.resources);
|
|
4299
4583
|
return {
|
|
4300
4584
|
success: true,
|
|
@@ -4307,6 +4591,22 @@ class BindingsMetadataSerializer {
|
|
|
4307
4591
|
};
|
|
4308
4592
|
}
|
|
4309
4593
|
}
|
|
4594
|
+
static tryParseMajorVersion(value) {
|
|
4595
|
+
const parts = value.split(".");
|
|
4596
|
+
if (parts.length < 2 || parts.length > 4)
|
|
4597
|
+
return;
|
|
4598
|
+
let major;
|
|
4599
|
+
for (const [index, part] of parts.entries()) {
|
|
4600
|
+
if (!/^\s*[+-]?\d+\s*$/.test(part))
|
|
4601
|
+
return;
|
|
4602
|
+
const component = Number(part);
|
|
4603
|
+
if (component < 0 || component > INT32_MAX_VALUE)
|
|
4604
|
+
return;
|
|
4605
|
+
if (index === 0)
|
|
4606
|
+
major = component === 0 ? 0 : component;
|
|
4607
|
+
}
|
|
4608
|
+
return major;
|
|
4609
|
+
}
|
|
4310
4610
|
linkDependencies(resources) {
|
|
4311
4611
|
for (const resource of resources) {
|
|
4312
4612
|
const propertyMeta = resource.metadata;
|
|
@@ -4493,8 +4793,7 @@ class BindingOverwritesHandler {
|
|
|
4493
4793
|
[BindingsKnownKeys.FolderKeyPropertyName]: resourceOverwrite.folderKey ?? ""
|
|
4494
4794
|
};
|
|
4495
4795
|
else {
|
|
4496
|
-
const
|
|
4497
|
-
const folderPath = bindingResource.isArtefactResource && !isBusinessRule ? "" : resourceOverwrite.folderFullyQualifiedName ?? "";
|
|
4796
|
+
const folderPath = bindingResource.isArtefactResource && !bindingResource.isCodedApp ? "" : resourceOverwrite.folderFullyQualifiedName ?? "";
|
|
4498
4797
|
overwrite = {
|
|
4499
4798
|
[BindingsKnownKeys.FolderPathPropertyName]: folderPath,
|
|
4500
4799
|
[BindingsKnownKeys.NamePropertyName]: resourceOverwrite.resourceName
|
|
@@ -4527,6 +4826,11 @@ function removeTimeTriggerBindings(bindings) {
|
|
|
4527
4826
|
}
|
|
4528
4827
|
|
|
4529
4828
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/bindings/binding-overwrites-mapping-handler.js
|
|
4829
|
+
function isCodedAppType(type) {
|
|
4830
|
+
const normalized = type?.toLowerCase();
|
|
4831
|
+
return normalized === "coded" || normalized === "codedaction";
|
|
4832
|
+
}
|
|
4833
|
+
|
|
4530
4834
|
class BindingOverwritesMappingRequestHandler {
|
|
4531
4835
|
async handleAsync(request, cancellationToken) {
|
|
4532
4836
|
const solutionBindings = request.bindings.resources.filter((x) => isSolutionResource(x.metadata));
|
|
@@ -4552,7 +4856,8 @@ class BindingOverwritesMappingRequestHandler {
|
|
|
4552
4856
|
result.push({
|
|
4553
4857
|
binding: bindingsResource,
|
|
4554
4858
|
resourceKey: resource.key,
|
|
4555
|
-
isArtefactResource: resource.projectKey != null
|
|
4859
|
+
isArtefactResource: resource.projectKey != null,
|
|
4860
|
+
isCodedApp: bindingsResource.resourceType === models_BindingsResourceType.App && isCodedAppType(resource.type)
|
|
4556
4861
|
});
|
|
4557
4862
|
} else {
|
|
4558
4863
|
this.logger.error(`Solution does not contain binding resource of type ${models_BindingsResourceType[bindingsResource.resourceType]}.`);
|
|
@@ -5557,6 +5862,9 @@ class SolutionPublishLocationRequest {
|
|
|
5557
5862
|
}
|
|
5558
5863
|
|
|
5559
5864
|
class SolutionPublishLocationRequestV2 {
|
|
5865
|
+
constructor(permissionType) {
|
|
5866
|
+
this.permissionType = permissionType;
|
|
5867
|
+
}
|
|
5560
5868
|
}
|
|
5561
5869
|
|
|
5562
5870
|
class SettingsRequest {
|
|
@@ -5721,12 +6029,13 @@ function _ts_param3(paramIndex, decorator) {
|
|
|
5721
6029
|
}
|
|
5722
6030
|
|
|
5723
6031
|
class SolutionPublishLocationRequestV2Handler {
|
|
5724
|
-
async handleAsync(
|
|
6032
|
+
async handleAsync(request, cancellationToken) {
|
|
5725
6033
|
try {
|
|
5726
6034
|
const orchestratorClient = await this.orchestratorClientFactory.getClientAsync(cancellationToken);
|
|
5727
6035
|
if (!orchestratorClient)
|
|
5728
6036
|
throw new InvalidOperationException("Failed to create Orchestrator client");
|
|
5729
|
-
|
|
6037
|
+
const { permissionType } = request;
|
|
6038
|
+
return permissionType == null ? await orchestratorClient.getPublishLocationsAsync(cancellationToken) : await orchestratorClient.getAccessiblePublishLocationsAsync(permissionType, cancellationToken);
|
|
5730
6039
|
} catch (error) {
|
|
5731
6040
|
this.logger.error("An unexpected error occurred while retrieving publish locations from Automation Solutions service.", error);
|
|
5732
6041
|
throw error;
|
|
@@ -7756,7 +8065,7 @@ class GetResourceKeyForProjectRequestHandler {
|
|
|
7756
8065
|
projectKey: request.projectKey,
|
|
7757
8066
|
solution: request.context.path
|
|
7758
8067
|
});
|
|
7759
|
-
const cacheKey = `prk:${request.projectKey}`;
|
|
8068
|
+
const cacheKey = `prk:${request.context.path}:${request.projectKey}`;
|
|
7760
8069
|
const cached = await this.cacheProvider.getAsync(cacheKey, cancellationToken);
|
|
7761
8070
|
if (cached && typeof cached == "object" && "resourceKey" in cached) {
|
|
7762
8071
|
this.logger.info("Cache hit for project {projectKey} resource key.", {
|
|
@@ -8584,7 +8893,11 @@ class UpdateResourceConfigurationCommandHandler {
|
|
|
8584
8893
|
for (const prop of command.properties) {
|
|
8585
8894
|
const propKey = prop.property.toLowerCase();
|
|
8586
8895
|
const metadata = propertiesMetadata.get(propKey);
|
|
8587
|
-
if (
|
|
8896
|
+
if (metadata && metadata.readOnly !== true) {
|
|
8897
|
+
if (isAnyReferenceProperty(metadata)) {
|
|
8898
|
+
updated = this.setSolutionReference(solution, resource, currentConfiguration, propertiesMetadata, metadata, prop.configuredValue) || updated;
|
|
8899
|
+
continue;
|
|
8900
|
+
}
|
|
8588
8901
|
if (isSecretProperty(metadata)) {
|
|
8589
8902
|
const secretValue = prop.configuredValue?.toString() || "";
|
|
8590
8903
|
const existingKey = currentConfiguration[metadata.property]?.toString();
|
|
@@ -8628,6 +8941,38 @@ class UpdateResourceConfigurationCommandHandler {
|
|
|
8628
8941
|
await command.context.saveChangesAsync(cancellationToken);
|
|
8629
8942
|
return resourceConfiguration;
|
|
8630
8943
|
}
|
|
8944
|
+
setSolutionReference(solution, resource, currentConfiguration, propertiesMetadata, metadata, configuredValue) {
|
|
8945
|
+
const referenceKind = metadata["referenceKind"];
|
|
8946
|
+
if (!isSingleReferenceProperty(metadata) || isFileReferenceProperty(metadata) || typeof referenceKind != "string" || !referenceKind)
|
|
8947
|
+
return false;
|
|
8948
|
+
const requested = asReference(configuredValue);
|
|
8949
|
+
const target = requested?.key ? solution.resources.find((r) => invariantEquals(r.key, requested.key) && invariantEquals(r.kind, referenceKind)) : undefined;
|
|
8950
|
+
if (!requested || !target || invariantEquals(target.key, resource.key))
|
|
8951
|
+
return false;
|
|
8952
|
+
const dependencies = resource.dependencies ??= [];
|
|
8953
|
+
const previous = asReference(currentConfiguration[metadata.property]);
|
|
8954
|
+
const previousKey = previous?.key;
|
|
8955
|
+
const isReferencedElsewhere = (key) => [
|
|
8956
|
+
...propertiesMetadata.values()
|
|
8957
|
+
].some((p) => isAnyReferenceProperty(p) && !isFileReferenceProperty(p) && typeof p["referenceKind"] == "string" && invariantEquals(p["referenceKind"], target.kind) && !invariantEquals(p.property, metadata.property) && asReferences(currentConfiguration[p.property]).some((r) => r.key !== undefined && invariantEquals(r.key, key)));
|
|
8958
|
+
if (previousKey && !invariantEquals(previousKey, target.key) && !isReferencedElsewhere(previousKey)) {
|
|
8959
|
+
const previousName = solution.resources.find((r) => invariantEquals(r.key, previousKey) && invariantEquals(r.kind, target.kind))?.name ?? previous?.name ?? "";
|
|
8960
|
+
resource.dependencies = dependencies.filter((d) => !(invariantEquals(d.kind, target.kind) && invariantEquals(d.name, previousName)));
|
|
8961
|
+
}
|
|
8962
|
+
if (!resource.dependencies.some((d) => invariantEquals(d.kind, target.kind) && invariantEquals(d.name, target.name)))
|
|
8963
|
+
resource.dependencies.push({
|
|
8964
|
+
kind: target.kind,
|
|
8965
|
+
name: target.name
|
|
8966
|
+
});
|
|
8967
|
+
currentConfiguration[metadata.property] = {
|
|
8968
|
+
name: target.name,
|
|
8969
|
+
key: target.key,
|
|
8970
|
+
folderKey: requested.folderKey ?? null,
|
|
8971
|
+
lookupStrategy: null,
|
|
8972
|
+
info: null
|
|
8973
|
+
};
|
|
8974
|
+
return true;
|
|
8975
|
+
}
|
|
8631
8976
|
async updateReferencesName(solutionDefinition, resource, oldName, cancellationToken) {
|
|
8632
8977
|
const resourcesToBeChanged = solutionDefinition.resources.filter((r) => r.key !== resource.key && (r.dependencies ?? []).some((d) => invariantEquals(d.kind, resource.kind) && invariantEquals(d.name, oldName)));
|
|
8633
8978
|
if (resourcesToBeChanged.length === 0)
|
|
@@ -8914,6 +9259,28 @@ class UpsertResourceSecretCommandHandler {
|
|
|
8914
9259
|
this.secretsProvider = secretsProvider;
|
|
8915
9260
|
}
|
|
8916
9261
|
}
|
|
9262
|
+
function asReference(value) {
|
|
9263
|
+
if (!value || typeof value != "object" || Array.isArray(value))
|
|
9264
|
+
return;
|
|
9265
|
+
const record = value;
|
|
9266
|
+
const pick = (name) => {
|
|
9267
|
+
const entry = Object.entries(record).find(([k]) => k.toLowerCase() === name.toLowerCase());
|
|
9268
|
+
return typeof entry?.[1] == "string" ? entry[1] : undefined;
|
|
9269
|
+
};
|
|
9270
|
+
return {
|
|
9271
|
+
key: pick("key"),
|
|
9272
|
+
name: pick("name"),
|
|
9273
|
+
folderKey: pick("folderKey")
|
|
9274
|
+
};
|
|
9275
|
+
}
|
|
9276
|
+
function asReferences(value) {
|
|
9277
|
+
if (Array.isArray(value))
|
|
9278
|
+
return value.map(asReference).filter((r) => r !== undefined);
|
|
9279
|
+
const single = asReference(value);
|
|
9280
|
+
return single ? [
|
|
9281
|
+
single
|
|
9282
|
+
] : [];
|
|
9283
|
+
}
|
|
8917
9284
|
|
|
8918
9285
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/handlers/solution-handlers.js
|
|
8919
9286
|
var DUPLICATE_NAMES_SUPPORTED_KINDS = new Set([
|
|
@@ -9885,6 +10252,9 @@ class ResourceCatalogApi extends HttpClient {
|
|
|
9885
10252
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/clients/resource-catalog/resource-catalog-client.factory.js
|
|
9886
10253
|
var RESOURCE_CATALOG_SCOPE = "RCS.FolderAuthorization";
|
|
9887
10254
|
var RESOURCE_CATALOG_SERVICE_NAME = "resourcecatalog";
|
|
10255
|
+
function trimTrailingSlashes(url) {
|
|
10256
|
+
return url.replace(/\/+$/, "");
|
|
10257
|
+
}
|
|
9888
10258
|
|
|
9889
10259
|
class ResourceCatalogClientFactory {
|
|
9890
10260
|
async getClientAsync(cancellationToken) {
|
|
@@ -9898,9 +10268,8 @@ class ResourceCatalogClientFactory {
|
|
|
9898
10268
|
], true, cancellationToken);
|
|
9899
10269
|
const ipRangeBypassSecret = await this.ipRangeBypassSecretProvider?.getIpRangeBypassSecretAsync(cancellationToken);
|
|
9900
10270
|
const gatewayIntegrationEnabled = this.resourceBuilderAccessProvider.isGatewayIntegrationEnabled();
|
|
9901
|
-
const normalizedBaseUrl = baseUrl.endsWith("/") ? baseUrl : baseUrl + "/";
|
|
9902
10271
|
const client = new ResourceCatalogApi({
|
|
9903
|
-
baseUrl:
|
|
10272
|
+
baseUrl: trimTrailingSlashes(baseUrl),
|
|
9904
10273
|
securityWorker: (securityData) => {
|
|
9905
10274
|
if (!securityData)
|
|
9906
10275
|
return {};
|
|
@@ -9943,7 +10312,7 @@ class ResourceCatalogClientFactory {
|
|
|
9943
10312
|
if (!accountKey)
|
|
9944
10313
|
throw new Error("Unable to obtain account key");
|
|
9945
10314
|
const client = new ResourceCatalogApi({
|
|
9946
|
-
baseUrl,
|
|
10315
|
+
baseUrl: trimTrailingSlashes(baseUrl),
|
|
9947
10316
|
securityWorker: (securityData) => {
|
|
9948
10317
|
if (!securityData)
|
|
9949
10318
|
return {};
|
|
@@ -12162,7 +12531,16 @@ class AutomationSolutionsClientProxy2 {
|
|
|
12162
12531
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/clients/orchestrator/orchestrator-client.js
|
|
12163
12532
|
class OrchestratorClient {
|
|
12164
12533
|
async getPublishLocationsAsync(cancellationToken) {
|
|
12165
|
-
|
|
12534
|
+
return this.getPublishLocationsFromAsync(this.publishLocationsUrl(), cancellationToken);
|
|
12535
|
+
}
|
|
12536
|
+
async getAccessiblePublishLocationsAsync(permissionType, cancellationToken) {
|
|
12537
|
+
const url = `${this.publishLocationsUrl()}?permissionType=${encodeURIComponent(permissionType)}`;
|
|
12538
|
+
return this.getPublishLocationsFromAsync(url, cancellationToken);
|
|
12539
|
+
}
|
|
12540
|
+
publishLocationsUrl() {
|
|
12541
|
+
return `${this.options.baseUrl}api/v2/AutomationSolutions/publish_locations`;
|
|
12542
|
+
}
|
|
12543
|
+
async getPublishLocationsFromAsync(url, cancellationToken) {
|
|
12166
12544
|
const headers = OrchestratorClientFactory.buildHeaders(this.options.securityData);
|
|
12167
12545
|
const response = await fetch(url, {
|
|
12168
12546
|
method: "GET",
|
|
@@ -12852,7 +13230,7 @@ class ReconcileProjectsCommandHandler {
|
|
|
12852
13230
|
} : {
|
|
12853
13231
|
resourceKey: undefined
|
|
12854
13232
|
};
|
|
12855
|
-
await this.cacheProvider.setAsync(`prk:${projectKey}`, result, cancellationToken);
|
|
13233
|
+
await this.cacheProvider.setAsync(`prk:${context.path}:${projectKey}`, result, cancellationToken);
|
|
12856
13234
|
}
|
|
12857
13235
|
groupByProjectKey(artefactResources) {
|
|
12858
13236
|
const map = new Map;
|
|
@@ -13726,6 +14104,11 @@ class ResourceBuilder {
|
|
|
13726
14104
|
const request = new SolutionPublishLocationRequestV2;
|
|
13727
14105
|
return this._mediator.sendAsync(request, cancellationToken);
|
|
13728
14106
|
}
|
|
14107
|
+
async getAccessiblePublishLocationsAsync(permissionType, cancellationToken) {
|
|
14108
|
+
this.throwIfCancelled(cancellationToken);
|
|
14109
|
+
const request = new SolutionPublishLocationRequestV2(permissionType);
|
|
14110
|
+
return this._mediator.sendAsync(request, cancellationToken);
|
|
14111
|
+
}
|
|
13729
14112
|
async getSettingsAsync(cancellationToken) {
|
|
13730
14113
|
this.throwIfCancelled(cancellationToken);
|
|
13731
14114
|
const request = new SettingsRequest;
|
|
@@ -14285,9 +14668,9 @@ class UnconfiguredEmbeddedFileReader {
|
|
|
14285
14668
|
}
|
|
14286
14669
|
|
|
14287
14670
|
// ../../node_modules/@uipath/resource-builder-sdk/dist/container.js
|
|
14288
|
-
function createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, embeddedFileReader, solutionContextOptions) {
|
|
14671
|
+
function createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, embeddedFileReader, solutionContextOptions, featureFlagProvider) {
|
|
14289
14672
|
const childContainer = import_tsyringe6.container.createChildContainer();
|
|
14290
|
-
registerProviders(childContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions);
|
|
14673
|
+
registerProviders(childContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions, featureFlagProvider);
|
|
14291
14674
|
registerServices(childContainer, embeddedFileReader);
|
|
14292
14675
|
registerHandlers(childContainer);
|
|
14293
14676
|
childContainer.register(ServiceTokens.Mediator, {
|
|
@@ -14311,11 +14694,15 @@ function registerProvider(diContainer, token, provider) {
|
|
|
14311
14694
|
break;
|
|
14312
14695
|
}
|
|
14313
14696
|
}
|
|
14314
|
-
function registerProviders(diContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions) {
|
|
14697
|
+
function registerProviders(diContainer, accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, httpReaderOptions, loggerFactory, solutionContextOptions, featureFlagProvider) {
|
|
14315
14698
|
registerProvider(diContainer, ServiceTokens.AccessProvider, accessProvider);
|
|
14316
14699
|
registerProvider(diContainer, ServiceTokens.CacheProvider, cacheProvider);
|
|
14317
14700
|
registerProvider(diContainer, ServiceTokens.SecretsProvider, secretsProvider);
|
|
14318
14701
|
registerProvider(diContainer, ServiceTokens.IpRangeBypassSecretProvider, ipRangeBypassSecretProvider);
|
|
14702
|
+
registerProvider(diContainer, ServiceTokens.FeatureFlagProvider, featureFlagProvider ?? {
|
|
14703
|
+
instance: new NullFeatureFlagProvider,
|
|
14704
|
+
lifetime: service_tokens_ServiceLifetime.Singleton
|
|
14705
|
+
});
|
|
14319
14706
|
registerProvider(diContainer, ServiceTokens.FileStorageProviderFactory, fileStorageProviderFactory);
|
|
14320
14707
|
registerProvider(diContainer, ServiceTokens.SolutionDefinitionProvider, solutionDefinitionProvider);
|
|
14321
14708
|
registerProvider(diContainer, ServiceTokens.SolutionDefinitionFactory, solutionDefinitionFactory);
|
|
@@ -15042,6 +15429,11 @@ class ResourceBuilderConfiguration {
|
|
|
15042
15429
|
this._ipRangeBypassSecretProviderLifetime = lifetime;
|
|
15043
15430
|
return this;
|
|
15044
15431
|
}
|
|
15432
|
+
addFeatureFlagProvider(provider, lifetime = service_tokens_ServiceLifetime.Scoped) {
|
|
15433
|
+
this._featureFlagProviderProvider = provider;
|
|
15434
|
+
this._featureFlagProviderLifetime = lifetime;
|
|
15435
|
+
return this;
|
|
15436
|
+
}
|
|
15045
15437
|
addSolutionDefinitionProvider(provider, lifetime = service_tokens_ServiceLifetime.Scoped) {
|
|
15046
15438
|
this._solutionDefinitionProviderProvider = provider;
|
|
15047
15439
|
this._solutionDefinitionProviderLifetime = lifetime;
|
|
@@ -15095,6 +15487,11 @@ class ResourceBuilderConfiguration {
|
|
|
15095
15487
|
instance: ipRangeBypassSecretProviderInstance,
|
|
15096
15488
|
lifetime: this._ipRangeBypassSecretProviderLifetime
|
|
15097
15489
|
};
|
|
15490
|
+
const featureFlagProviderInstance = this._featureFlagProviderProvider ? await resolveProvider(this._featureFlagProviderProvider) : new NullFeatureFlagProvider;
|
|
15491
|
+
const featureFlagProvider = {
|
|
15492
|
+
instance: featureFlagProviderInstance,
|
|
15493
|
+
lifetime: this._featureFlagProviderLifetime
|
|
15494
|
+
};
|
|
15098
15495
|
const secretsProviderInstance = this._secretsProviderProvider ? await resolveProvider(this._secretsProviderProvider) : new NullSecretsProvider;
|
|
15099
15496
|
const secretsProvider = {
|
|
15100
15497
|
instance: secretsProviderInstance,
|
|
@@ -15138,7 +15535,7 @@ class ResourceBuilderConfiguration {
|
|
|
15138
15535
|
lifetime: this._artifactResourceSpecEnhancerLifetime
|
|
15139
15536
|
};
|
|
15140
15537
|
const embeddedFileReader = await createDefaultEmbeddedFileReaderAsync();
|
|
15141
|
-
const container3 = createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, this._httpReaderOptions, loggerFactory, embeddedFileReader, this._solutionContextOptions);
|
|
15538
|
+
const container3 = createContainer(accessProvider, cacheProvider, secretsProvider, fileStorageProviderFactory, ipRangeBypassSecretProvider, solutionDefinitionProvider, solutionDefinitionFactory, artifactResourceSpecEnhancer, this._httpReaderOptions, loggerFactory, embeddedFileReader, this._solutionContextOptions, featureFlagProvider);
|
|
15142
15539
|
return new ResourceBuilderServices(container3);
|
|
15143
15540
|
}
|
|
15144
15541
|
async buildServices() {
|
|
@@ -15150,6 +15547,7 @@ class ResourceBuilderConfiguration {
|
|
|
15150
15547
|
this._secretsProviderLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
15151
15548
|
this._fileStorageProviderFactoryLifetime = service_tokens_ServiceLifetime.Singleton;
|
|
15152
15549
|
this._ipRangeBypassSecretProviderLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
15550
|
+
this._featureFlagProviderLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
15153
15551
|
this._solutionDefinitionProviderLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
15154
15552
|
this._solutionDefinitionFactoryLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
15155
15553
|
this._artifactResourceSpecEnhancerLifetime = service_tokens_ServiceLifetime.Scoped;
|
|
@@ -15261,8 +15659,59 @@ var ARTEFACT_KIND_APP = "app";
|
|
|
15261
15659
|
var ARTEFACT_KIND_APP_VERSION = "appversion";
|
|
15262
15660
|
var ARTEFACT_KIND_PACKAGE = "package";
|
|
15263
15661
|
var SPEC_KEY_PACKAGE = "package";
|
|
15662
|
+
var RESOURCE_FILES_FOLDER_NAME = "resources";
|
|
15663
|
+
var RESOURCE_FILE_PATTERN = "*.json";
|
|
15664
|
+
var FIX_SHARED_KEY = "Delete all but one file for each key, then retry.";
|
|
15665
|
+
var FIX_KEYLESS = 'Give each file without a key its own unique "key", then retry.';
|
|
15666
|
+
|
|
15667
|
+
class DuplicateKeysError extends Error {
|
|
15668
|
+
keys;
|
|
15669
|
+
constructor(keys) {
|
|
15670
|
+
super(`Duplicate resource keys: ${keys.map(describeKey).join(", ")}`);
|
|
15671
|
+
this.keys = keys;
|
|
15672
|
+
}
|
|
15673
|
+
}
|
|
15264
15674
|
|
|
15265
15675
|
class ArtefactPairBindingProvider extends MultiFileSolutionDefinitionProvider {
|
|
15676
|
+
async readAsync(context, cancellationToken) {
|
|
15677
|
+
const [readError, solution] = await catchError(super.readAsync(context, cancellationToken));
|
|
15678
|
+
if (!readError)
|
|
15679
|
+
return solution;
|
|
15680
|
+
if (!(readError instanceof DuplicateKeysError))
|
|
15681
|
+
throw readError;
|
|
15682
|
+
const [describeError, message] = await catchError(this.describeDuplicateKeys(context, readError.keys, cancellationToken));
|
|
15683
|
+
throw describeError ? readError : new Error(message);
|
|
15684
|
+
}
|
|
15685
|
+
async replaceDuplicateKeysAsync(solution) {
|
|
15686
|
+
const keys = findDuplicateKeys(solution);
|
|
15687
|
+
if (keys.length > 0)
|
|
15688
|
+
throw new DuplicateKeysError(keys);
|
|
15689
|
+
}
|
|
15690
|
+
async describeDuplicateKeys(context, keys, cancellationToken) {
|
|
15691
|
+
const storage = await this.getFileStorageProviderAsync(context, cancellationToken);
|
|
15692
|
+
const files = await storage.getFilesAsync(RESOURCE_FILES_FOLDER_NAME, RESOURCE_FILE_PATTERN, cancellationToken);
|
|
15693
|
+
const pathsByKey = new Map(keys.map((key) => [key, []]));
|
|
15694
|
+
for (const file of [...files].sort()) {
|
|
15695
|
+
const [readError, key] = await catchError(this.readResourceKey(storage, file, cancellationToken));
|
|
15696
|
+
if (readError)
|
|
15697
|
+
continue;
|
|
15698
|
+
pathsByKey.get(key)?.push(toPortableRelativePath(file));
|
|
15699
|
+
}
|
|
15700
|
+
const lines = [...pathsByKey].map(([key, paths]) => `Resource key ${describeKey(key)} is used by: ${paths.join(", ")}`);
|
|
15701
|
+
const fixes = [
|
|
15702
|
+
keys.some((key) => !isKeyless(key)) && FIX_SHARED_KEY,
|
|
15703
|
+
keys.some(isKeyless) && FIX_KEYLESS
|
|
15704
|
+
].filter(Boolean);
|
|
15705
|
+
return [...lines, ...fixes].join(`
|
|
15706
|
+
`);
|
|
15707
|
+
}
|
|
15708
|
+
async readResourceKey(storage, file, cancellationToken) {
|
|
15709
|
+
const content = await storage.readFileToEndAsync(file, cancellationToken);
|
|
15710
|
+
const wrapper = this.caseInsensitiveSerializer.deserialize(content);
|
|
15711
|
+
if (!wrapper?.resource)
|
|
15712
|
+
throw new Error(`No resource in ${file}`);
|
|
15713
|
+
return wrapper.resource.key;
|
|
15714
|
+
}
|
|
15266
15715
|
async writeAsync(context, solution, cancellationToken) {
|
|
15267
15716
|
patchAppPackageLinkage(solution);
|
|
15268
15717
|
return super.writeAsync(context, solution, cancellationToken);
|
|
@@ -15274,6 +15723,22 @@ class ArtefactPairBindingSolutionDefinitionFactory extends MultiFileSolutionDefi
|
|
|
15274
15723
|
return new ArtefactPairBindingProvider(this.fileStorageProviderFactory, this.jsonSerializerFactory, this.loggerFactory);
|
|
15275
15724
|
}
|
|
15276
15725
|
}
|
|
15726
|
+
function findDuplicateKeys(solution) {
|
|
15727
|
+
const counts = new Map;
|
|
15728
|
+
for (const resource of solution.resources ?? []) {
|
|
15729
|
+
const key = resource.key;
|
|
15730
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
15731
|
+
}
|
|
15732
|
+
return [...counts].filter(([, count]) => count > 1).map(([key]) => key);
|
|
15733
|
+
}
|
|
15734
|
+
function isKeyless(key) {
|
|
15735
|
+
return typeof key !== "string" || !key;
|
|
15736
|
+
}
|
|
15737
|
+
function describeKey(key) {
|
|
15738
|
+
if (typeof key === "string" && key)
|
|
15739
|
+
return key;
|
|
15740
|
+
return key === undefined ? "(missing)" : JSON.stringify(key);
|
|
15741
|
+
}
|
|
15277
15742
|
function patchAppPackageLinkage(solution) {
|
|
15278
15743
|
const resources = solution.resources ?? [];
|
|
15279
15744
|
const projectKeys = new Set;
|
|
@@ -15745,6 +16210,108 @@ async function createProjectInSolutionBuilder(solutionDir, projectId, projectNam
|
|
|
15745
16210
|
await catchError(solutionBuilder.disposeAsync());
|
|
15746
16211
|
return createError;
|
|
15747
16212
|
}
|
|
16213
|
+
// ../solution-sdk/src/resources/services/catalog-lookup-failure.ts
|
|
16214
|
+
var NO_CLIENT_MESSAGE = "Unable to create Resource Catalog client";
|
|
16215
|
+
function classifyCatalogFailure(error) {
|
|
16216
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
16217
|
+
if (message.includes(NO_CLIENT_MESSAGE)) {
|
|
16218
|
+
return { message, kind: "no_session" };
|
|
16219
|
+
}
|
|
16220
|
+
const match = /\bHTTP (\d{3})\b/.exec(message);
|
|
16221
|
+
const status = match ? Number(match[1]) : undefined;
|
|
16222
|
+
if (status === 401 || status === 403) {
|
|
16223
|
+
return { message, kind: "refused", status };
|
|
16224
|
+
}
|
|
16225
|
+
return { message, kind: "failed", ...status ? { status } : {} };
|
|
16226
|
+
}
|
|
16227
|
+
function stopsCatalogLookups(failure) {
|
|
16228
|
+
return failure.kind !== "failed";
|
|
16229
|
+
}
|
|
16230
|
+
function describeBindings(bindings) {
|
|
16231
|
+
return bindings.map((b) => `${b.kind} "${b.name}"`).join(", ");
|
|
16232
|
+
}
|
|
16233
|
+
function describeCause(failure) {
|
|
16234
|
+
switch (failure.kind) {
|
|
16235
|
+
case "no_session":
|
|
16236
|
+
return "There is no login, so the Resource Catalog could not be searched";
|
|
16237
|
+
case "refused":
|
|
16238
|
+
return `The Resource Catalog refused this login (${failure.message})`;
|
|
16239
|
+
default:
|
|
16240
|
+
return `A Resource Catalog call failed (${failure.message})`;
|
|
16241
|
+
}
|
|
16242
|
+
}
|
|
16243
|
+
function classify(failure) {
|
|
16244
|
+
const refreshAndCommit = "or run 'uip solution resources refresh' under a login the Resource Catalog accepts and commit the solution's resources. The resources already in the solution are used as they are.";
|
|
16245
|
+
if (failure.kind === "no_session") {
|
|
16246
|
+
return {
|
|
16247
|
+
errorCode: "authentication_required",
|
|
16248
|
+
retry: "RetryWillNotFix",
|
|
16249
|
+
instructions: `Run 'uip login', then re-run; ${refreshAndCommit}`
|
|
16250
|
+
};
|
|
16251
|
+
}
|
|
16252
|
+
if (failure.kind === "refused") {
|
|
16253
|
+
return {
|
|
16254
|
+
errorCode: "permission_denied",
|
|
16255
|
+
retry: "RetryWillNotFix",
|
|
16256
|
+
instructions: `Use a login the Resource Catalog accepts (a user login: 'uip login'), ${refreshAndCommit}`
|
|
16257
|
+
};
|
|
16258
|
+
}
|
|
16259
|
+
const status = failure.status;
|
|
16260
|
+
if (status === 429) {
|
|
16261
|
+
return {
|
|
16262
|
+
errorCode: "rate_limited",
|
|
16263
|
+
retry: "RetryLater",
|
|
16264
|
+
instructions: `Wait, then re-run; ${refreshAndCommit}`
|
|
16265
|
+
};
|
|
16266
|
+
}
|
|
16267
|
+
if (status !== undefined && status >= 500) {
|
|
16268
|
+
return {
|
|
16269
|
+
errorCode: "server_error",
|
|
16270
|
+
retry: "RetryLater",
|
|
16271
|
+
instructions: `Retry once the Resource Catalog is back; ${refreshAndCommit}`
|
|
16272
|
+
};
|
|
16273
|
+
}
|
|
16274
|
+
if (status !== undefined && status >= 400) {
|
|
16275
|
+
return {
|
|
16276
|
+
errorCode: "unknown_error",
|
|
16277
|
+
retry: "RetryWillNotFix",
|
|
16278
|
+
instructions: `The Resource Catalog rejected the lookup for these bindings, so a retry gets the same answer. Check them in the project's bindings, ${refreshAndCommit}`
|
|
16279
|
+
};
|
|
16280
|
+
}
|
|
16281
|
+
return {
|
|
16282
|
+
errorCode: "unknown_error",
|
|
16283
|
+
retry: "RetryLater",
|
|
16284
|
+
instructions: `Retry; if it keeps failing, ${refreshAndCommit}`
|
|
16285
|
+
};
|
|
16286
|
+
}
|
|
16287
|
+
function catalogLookupWarning(failure, kept, unresolved) {
|
|
16288
|
+
const parts = [
|
|
16289
|
+
`${describeCause(failure)}, so ${kept + unresolved.length} binding(s) were not checked against the cloud.`
|
|
16290
|
+
];
|
|
16291
|
+
if (kept > 0) {
|
|
16292
|
+
parts.push(`${kept} already in the solution were kept as they are.`);
|
|
16293
|
+
}
|
|
16294
|
+
if (unresolved.length > 0) {
|
|
16295
|
+
parts.push(`Not added to the solution: ${describeBindings(unresolved)}.`);
|
|
16296
|
+
}
|
|
16297
|
+
return parts.join(" ");
|
|
16298
|
+
}
|
|
16299
|
+
|
|
16300
|
+
class CatalogLookupError extends Error {
|
|
16301
|
+
errorCode;
|
|
16302
|
+
retry;
|
|
16303
|
+
instructions;
|
|
16304
|
+
unresolved;
|
|
16305
|
+
constructor(failure, unresolved) {
|
|
16306
|
+
super(`${describeCause(failure)}, so these bindings could not be resolved and are not in the solution: ${describeBindings(unresolved)}.`);
|
|
16307
|
+
this.name = "CatalogLookupError";
|
|
16308
|
+
const { errorCode, retry, instructions } = classify(failure);
|
|
16309
|
+
this.errorCode = errorCode;
|
|
16310
|
+
this.retry = retry;
|
|
16311
|
+
this.instructions = instructions;
|
|
16312
|
+
this.unresolved = unresolved;
|
|
16313
|
+
}
|
|
16314
|
+
}
|
|
15748
16315
|
// ../solution-sdk/src/resources/services/local-resource-matcher.ts
|
|
15749
16316
|
function normalizeFolderPath(path) {
|
|
15750
16317
|
if (!path)
|
|
@@ -15850,6 +16417,20 @@ async function findCatalogEntityAsync(catalog, query, match) {
|
|
|
15850
16417
|
} while (pageCursor);
|
|
15851
16418
|
return;
|
|
15852
16419
|
}
|
|
16420
|
+
async function findCatalogEntitiesAsync(catalog, query, match) {
|
|
16421
|
+
const found = [];
|
|
16422
|
+
let pageCursor;
|
|
16423
|
+
do {
|
|
16424
|
+
const page = await catalog.searchFolderEntities({
|
|
16425
|
+
...query,
|
|
16426
|
+
pageSize: 100,
|
|
16427
|
+
pageCursor
|
|
16428
|
+
});
|
|
16429
|
+
found.push(...(page.items ?? []).filter(match));
|
|
16430
|
+
pageCursor = page.nextPage ?? undefined;
|
|
16431
|
+
} while (pageCursor);
|
|
16432
|
+
return found;
|
|
16433
|
+
}
|
|
15853
16434
|
function toResourceReference(entity) {
|
|
15854
16435
|
return toCatalogReference({
|
|
15855
16436
|
kind: entity.entityType ?? "",
|
|
@@ -15903,7 +16484,7 @@ function parseJsonString(raw) {
|
|
|
15903
16484
|
return error ? undefined : parsed;
|
|
15904
16485
|
}
|
|
15905
16486
|
// ../solution-sdk/src/resources/services/resource-casing.ts
|
|
15906
|
-
var
|
|
16487
|
+
var RESOURCE_FILES_FOLDER_NAME2 = "resources";
|
|
15907
16488
|
function lowerFirstChar(value) {
|
|
15908
16489
|
return value ? value.charAt(0).toLowerCase() + value.slice(1) : value;
|
|
15909
16490
|
}
|
|
@@ -15932,7 +16513,7 @@ async function saveCasingNormalized(builder) {
|
|
|
15932
16513
|
}
|
|
15933
16514
|
async function normalizeResourceFileCasing(solutionDir) {
|
|
15934
16515
|
const fs = getFileSystem();
|
|
15935
|
-
const root = fs.path.join(solutionDir,
|
|
16516
|
+
const root = fs.path.join(solutionDir, RESOURCE_FILES_FOLDER_NAME2);
|
|
15936
16517
|
if (!await fs.exists(root))
|
|
15937
16518
|
return [];
|
|
15938
16519
|
const byTarget = new Map;
|
|
@@ -15980,13 +16561,17 @@ function targetSegments(segments, kind, type) {
|
|
|
15980
16561
|
const kindIndex = type ? target.length - 3 : target.length - 2;
|
|
15981
16562
|
if (kindIndex < 0)
|
|
15982
16563
|
return target;
|
|
15983
|
-
if (target[kindIndex]
|
|
16564
|
+
if (sameIgnoringCase(target[kindIndex], kind)) {
|
|
15984
16565
|
target[kindIndex] = lowerFirstChar(kind);
|
|
15985
|
-
|
|
16566
|
+
}
|
|
16567
|
+
if (type && sameIgnoringCase(target[kindIndex + 1], type)) {
|
|
15986
16568
|
target[kindIndex + 1] = lowerFirstChar(type);
|
|
15987
16569
|
}
|
|
15988
16570
|
return target;
|
|
15989
16571
|
}
|
|
16572
|
+
function sameIgnoringCase(a, b) {
|
|
16573
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
16574
|
+
}
|
|
15990
16575
|
async function collectResourceFiles(root, segments) {
|
|
15991
16576
|
const fs = getFileSystem();
|
|
15992
16577
|
const [readError, names] = await catchError(fs.readdir(fs.path.join(root, ...segments)));
|
|
@@ -16059,6 +16644,118 @@ function parseResourceHeader(content) {
|
|
|
16059
16644
|
return null;
|
|
16060
16645
|
}
|
|
16061
16646
|
}
|
|
16647
|
+
// ../solution-sdk/src/resources/services/resource-configurations.ts
|
|
16648
|
+
var ROOT_RESOURCE_TYPES = new Set(["resource", "solutionresource"]);
|
|
16649
|
+
var KEY_NOT_FOUND = /^(?:Solution)?Resource with key '([^']+)' was not found$/i;
|
|
16650
|
+
function isResourceKeyNotFound(error, resourceKey) {
|
|
16651
|
+
if (!(error instanceof Error))
|
|
16652
|
+
return false;
|
|
16653
|
+
const typed = error;
|
|
16654
|
+
const sameKey = (key) => key !== undefined && key.toLowerCase() === resourceKey.toLowerCase();
|
|
16655
|
+
if (typeof typed.resourceType === "string" && typeof typed.resourceKey === "string") {
|
|
16656
|
+
return ROOT_RESOURCE_TYPES.has(typed.resourceType.toLowerCase()) && sameKey(typed.resourceKey);
|
|
16657
|
+
}
|
|
16658
|
+
return sameKey(KEY_NOT_FOUND.exec(error.message.trim())?.[1]);
|
|
16659
|
+
}
|
|
16660
|
+
async function refreshArtefactSpecsAsync(builder, configurations) {
|
|
16661
|
+
const resources = new Map;
|
|
16662
|
+
const [loadError, solution] = await catchError(builder.context.loadAsync());
|
|
16663
|
+
if (loadError || !solution)
|
|
16664
|
+
return resources;
|
|
16665
|
+
for (const configuration of configurations) {
|
|
16666
|
+
const resource = solution.resources.find((r) => r.key === configuration?.key);
|
|
16667
|
+
if (!resource)
|
|
16668
|
+
continue;
|
|
16669
|
+
resources.set(resource.key, resource);
|
|
16670
|
+
if (!resource.projectKey)
|
|
16671
|
+
continue;
|
|
16672
|
+
configuration.spec = await applyEntryPointEnhancementAsync(builder.context, resource, configuration.spec ?? {});
|
|
16673
|
+
}
|
|
16674
|
+
return resources;
|
|
16675
|
+
}
|
|
16676
|
+
async function exportResourceConfigurationsAsync(services, resourceKey, hint = {}) {
|
|
16677
|
+
const { catalog, importer } = getRemoteResourceClients(services);
|
|
16678
|
+
const byKey = (item) => item.entityKey === resourceKey;
|
|
16679
|
+
const entity = (hint.name ? await findCatalogEntityAsync(catalog, { name: hint.name }, byKey) : undefined) ?? await findCatalogEntityAsync(catalog, {}, byKey);
|
|
16680
|
+
if (!entity) {
|
|
16681
|
+
throw new Error(`Resource '${resourceKey}' was not found in the solution or in the resource catalog`);
|
|
16682
|
+
}
|
|
16683
|
+
const payload = await importer.exportResourceAsync(toResourceReference(entity));
|
|
16684
|
+
const definitions = payload.resourceDefinitions ?? [];
|
|
16685
|
+
if (definitions.length === 0) {
|
|
16686
|
+
throw new Error(`FPS export for '${resourceKey}' returned no resource definitions`);
|
|
16687
|
+
}
|
|
16688
|
+
return {
|
|
16689
|
+
resources: definitions.map((d) => ({
|
|
16690
|
+
key: d.key ?? "",
|
|
16691
|
+
spec: d.spec ?? {},
|
|
16692
|
+
locks: d.locks ?? [],
|
|
16693
|
+
apiVersion: d.apiVersion,
|
|
16694
|
+
isOverridable: d.isOverridable,
|
|
16695
|
+
name: d.name ?? "",
|
|
16696
|
+
kind: d.kind ?? "",
|
|
16697
|
+
dependencies: (d.dependencies ?? []).map((dep) => ({
|
|
16698
|
+
kind: dep.kind ?? "",
|
|
16699
|
+
name: dep.name ?? ""
|
|
16700
|
+
}))
|
|
16701
|
+
}))
|
|
16702
|
+
};
|
|
16703
|
+
}
|
|
16704
|
+
async function readLocalAsync(builder, resourceKey, read) {
|
|
16705
|
+
if (!builder)
|
|
16706
|
+
return;
|
|
16707
|
+
const [error, value] = await catchError(read(builder));
|
|
16708
|
+
if (!error)
|
|
16709
|
+
return { builder, value };
|
|
16710
|
+
if (isResourceKeyNotFound(error, resourceKey))
|
|
16711
|
+
return;
|
|
16712
|
+
throw error;
|
|
16713
|
+
}
|
|
16714
|
+
async function readResourceConfigurationsAsync(services, builder, resourceKey, hint = {}) {
|
|
16715
|
+
const local = await readLocalAsync(builder, resourceKey, (b) => b.getAllConfigurationsAsync(resourceKey));
|
|
16716
|
+
if (!local) {
|
|
16717
|
+
return exportResourceConfigurationsAsync(services, resourceKey, hint);
|
|
16718
|
+
}
|
|
16719
|
+
await refreshArtefactSpecsAsync(local.builder, local.value?.resources ?? []);
|
|
16720
|
+
return local.value;
|
|
16721
|
+
}
|
|
16722
|
+
async function readResourceConfigurationAsync(services, builder, resourceKey) {
|
|
16723
|
+
const local = await readLocalAsync(builder, resourceKey, (b) => b.getConfigurationAsync(resourceKey));
|
|
16724
|
+
if (local) {
|
|
16725
|
+
const configuration = local.value;
|
|
16726
|
+
const resources2 = await refreshArtefactSpecsAsync(local.builder, [
|
|
16727
|
+
configuration
|
|
16728
|
+
]);
|
|
16729
|
+
return { configuration, resource: resources2.get(configuration.key) };
|
|
16730
|
+
}
|
|
16731
|
+
const { resources } = await exportResourceConfigurationsAsync(services, resourceKey);
|
|
16732
|
+
const primary = resources.find((r) => r.key === resourceKey) ?? resources[0];
|
|
16733
|
+
const { key, spec, locks, apiVersion, isOverridable } = primary;
|
|
16734
|
+
return { configuration: { key, spec, locks, apiVersion, isOverridable } };
|
|
16735
|
+
}
|
|
16736
|
+
// ../solution-sdk/src/resources/services/resource-lookup.ts
|
|
16737
|
+
async function findResourcesByNameAsync(services, builder, { kind, name, subTypes, folderKey }) {
|
|
16738
|
+
const same = (a, b) => (a ?? "").toLowerCase() === b.toLowerCase();
|
|
16739
|
+
const ofSubType = (type) => subTypes === undefined || subTypes.some((t) => same(type, t));
|
|
16740
|
+
if (builder) {
|
|
16741
|
+
const solution = await builder.context.loadAsync();
|
|
16742
|
+
const local = solution.resources.filter((r) => same(r.kind, kind) && same(r.name, name) && ofSubType(r.type)).map((r) => ({
|
|
16743
|
+
key: r.key,
|
|
16744
|
+
local: true,
|
|
16745
|
+
folderPath: r.folders?.[0]?.fullyQualifiedName
|
|
16746
|
+
}));
|
|
16747
|
+
if (local.length > 0)
|
|
16748
|
+
return local;
|
|
16749
|
+
}
|
|
16750
|
+
const { catalog } = getRemoteResourceClients(services);
|
|
16751
|
+
const rows = await findCatalogEntitiesAsync(catalog, { name, entityTypes: [kind] }, (row) => same(row.entityType, kind) && same(row.entityName, name) && ofSubType(row.entitySubType) && (folderKey === undefined || same(row.folderKey, folderKey)));
|
|
16752
|
+
return rows.map((row) => ({
|
|
16753
|
+
key: row.entityKey ?? "",
|
|
16754
|
+
local: false,
|
|
16755
|
+
folderPath: row.fullyQualifiedName ?? undefined,
|
|
16756
|
+
folderKey: row.folderKey ?? undefined
|
|
16757
|
+
}));
|
|
16758
|
+
}
|
|
16062
16759
|
// ../solution-sdk/src/resources/services/resource-name.ts
|
|
16063
16760
|
var MAX_RESOURCE_NAME_LENGTH = 256;
|
|
16064
16761
|
var UNSAFE_NAME_CHARS = /[\\/:*?"<>|]/;
|
|
@@ -16106,6 +16803,9 @@ var TYPE_IS_IDENTITY_REPLACE_OPTIONS = new Set([
|
|
|
16106
16803
|
"SameNameAndType"
|
|
16107
16804
|
]);
|
|
16108
16805
|
var BINDINGS_JSON_FALLBACK_TYPES = new Set(["agent", "function"]);
|
|
16806
|
+
|
|
16807
|
+
class OverwriteRefreshError extends Error {
|
|
16808
|
+
}
|
|
16109
16809
|
function placeholderForType(type) {
|
|
16110
16810
|
switch ((type ?? "string").toLowerCase()) {
|
|
16111
16811
|
case "boolean":
|
|
@@ -16206,13 +16906,15 @@ function resolveBindingResourceIdentity(binding) {
|
|
|
16206
16906
|
};
|
|
16207
16907
|
}
|
|
16208
16908
|
}
|
|
16209
|
-
async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTypes) {
|
|
16909
|
+
async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTypes, projectBindings) {
|
|
16210
16910
|
const result = {
|
|
16211
16911
|
created: 0,
|
|
16212
16912
|
imported: 0,
|
|
16213
16913
|
skipped: 0,
|
|
16214
16914
|
pruned: 0,
|
|
16215
|
-
|
|
16915
|
+
projectResourcesCreated: 0,
|
|
16916
|
+
warnings: [],
|
|
16917
|
+
unresolved: []
|
|
16216
16918
|
};
|
|
16217
16919
|
const uipxProjects = await readUipxProjects(solutionDir);
|
|
16218
16920
|
const paths = projectPaths ?? uipxProjects.map((p) => p.path);
|
|
@@ -16226,7 +16928,7 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16226
16928
|
return result;
|
|
16227
16929
|
}
|
|
16228
16930
|
const serializer = services.container.resolve(Tokens.IBindingsMetadataSerializer);
|
|
16229
|
-
const { bindings: allBindings, parseErrors } = await collectBindings(solutionDir, paths,
|
|
16931
|
+
const { bindings: allBindings, parseErrors } = await collectBindings(bindingsJsonFallbackDirs, serializer, bindingSources(solutionDir, paths, uipxProjects, projectBindings));
|
|
16230
16932
|
if (parseErrors.length > 0) {
|
|
16231
16933
|
const detail = parseErrors.map((e) => `${e.path}: ${e.reason}`).join("; ");
|
|
16232
16934
|
throw new Error(`Invalid bindings file — ${detail}`);
|
|
@@ -16240,7 +16942,8 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16240
16942
|
logger.warn(`Failed to get solution builder: ${builderError.message}`);
|
|
16241
16943
|
return result;
|
|
16242
16944
|
}
|
|
16243
|
-
await reconcileSolutionProjects(builder, solutionDir, projectSubTypes);
|
|
16945
|
+
const reconcileOutcome = await reconcileSolutionProjects(builder, solutionDir, projectSubTypes);
|
|
16946
|
+
result.projectResourcesCreated = reconcileOutcome.resourcesAdded;
|
|
16244
16947
|
const memberProjectKeys = new Set(uipxProjects.map((project) => project.id.toLowerCase()));
|
|
16245
16948
|
await pruneMemberClones(builder, memberProjectKeys, result);
|
|
16246
16949
|
if (allBindings.length === 0) {
|
|
@@ -16255,6 +16958,28 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16255
16958
|
const resolveKindMetadata = await buildKindResolver(metadataReader);
|
|
16256
16959
|
const solution = await builder.context.loadAsync();
|
|
16257
16960
|
const knownResourceKeys = new Set((solution.resources ?? []).map((r) => r.key?.toLowerCase()).filter((k) => !!k));
|
|
16961
|
+
let keptUnchecked = 0;
|
|
16962
|
+
const resolvedKeys = new Set;
|
|
16963
|
+
const overwrittenKeys = new Set;
|
|
16964
|
+
const bindingKey = (kind, name) => `${kind}:${name ?? ""}`.toLowerCase();
|
|
16965
|
+
const recordUnchecked = async (error, kind, name, directCloudKey) => {
|
|
16966
|
+
if (error) {
|
|
16967
|
+
const failure = classifyCatalogFailure(error);
|
|
16968
|
+
if (!result.catalogLookupFailure || stopsCatalogLookups(failure) && !stopsCatalogLookups(result.catalogLookupFailure)) {
|
|
16969
|
+
result.catalogLookupFailure = failure;
|
|
16970
|
+
}
|
|
16971
|
+
}
|
|
16972
|
+
const covered = await isUncheckedBindingCovered(builder, knownResourceKeys, kind, name, directCloudKey);
|
|
16973
|
+
if (covered) {
|
|
16974
|
+
keptUnchecked++;
|
|
16975
|
+
result.skipped++;
|
|
16976
|
+
return;
|
|
16977
|
+
}
|
|
16978
|
+
result.unresolved.push({
|
|
16979
|
+
kind,
|
|
16980
|
+
name: directCloudKey ?? name
|
|
16981
|
+
});
|
|
16982
|
+
};
|
|
16258
16983
|
const virtualCandidates = [];
|
|
16259
16984
|
for (const binding of allBindings) {
|
|
16260
16985
|
const identity = resolveBindingResourceIdentity(binding);
|
|
@@ -16284,7 +17009,12 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16284
17009
|
logger.info(`Skipping ${kind} "${name}" — the solution provisions this project itself; its member declaration covers the binding`);
|
|
16285
17010
|
continue;
|
|
16286
17011
|
}
|
|
16287
|
-
const
|
|
17012
|
+
const lookupsStopped = !!result.catalogLookupFailure && stopsCatalogLookups(result.catalogLookupFailure);
|
|
17013
|
+
const [lookupError, rcsMatch] = lookupsStopped ? [undefined, undefined] : await catchError(directCloudKey ? findResourceByKeyInRcs(builder, kind, directCloudKey, folderPath, true) : findResourceInRcs(builder, kind, name, folderPath, true));
|
|
17014
|
+
if (lookupsStopped || lookupError) {
|
|
17015
|
+
await recordUnchecked(lookupError, kind, name, directCloudKey);
|
|
17016
|
+
continue;
|
|
17017
|
+
}
|
|
16288
17018
|
const resolvedType = identity.type ?? rcsMatch?.type ?? metadata?.type;
|
|
16289
17019
|
if (!rcsMatch) {
|
|
16290
17020
|
if (isConnection) {
|
|
@@ -16303,30 +17033,48 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16303
17033
|
}
|
|
16304
17034
|
if (!isConnection && rcsMatch.key && knownResourceKeys.has(rcsMatch.key.toLowerCase())) {
|
|
16305
17035
|
result.skipped++;
|
|
17036
|
+
resolvedKeys.add(bindingKey(kind, name));
|
|
16306
17037
|
continue;
|
|
16307
17038
|
}
|
|
16308
17039
|
const callType = isConnection ? binding.metadata?.connector : resolvedType;
|
|
16309
|
-
const
|
|
17040
|
+
const wasKnown = !!rcsMatch.key && knownResourceKeys.has(rcsMatch.key.toLowerCase());
|
|
17041
|
+
const reference = {
|
|
16310
17042
|
kind,
|
|
16311
17043
|
type: callType,
|
|
16312
17044
|
key: rcsMatch.key,
|
|
16313
17045
|
name: rcsMatch.name,
|
|
16314
17046
|
folder: rcsMatch.folder
|
|
16315
|
-
}
|
|
17047
|
+
};
|
|
17048
|
+
const [importError] = await catchError(wasKnown ? refreshKnownResource(services, builder, reference, overwrittenKeys) : builder.addOrUpdateResourceToSolutionAsync(reference, true));
|
|
16316
17049
|
if (!importError) {
|
|
17050
|
+
resolvedKeys.add(bindingKey(kind, directCloudKey ?? name));
|
|
17051
|
+
if (wasKnown) {
|
|
17052
|
+
result.skipped++;
|
|
17053
|
+
logger.info(`Refreshed ${kind} "${rcsMatch.name}" (key: ${rcsMatch.key}), already in solution`);
|
|
17054
|
+
continue;
|
|
17055
|
+
}
|
|
16317
17056
|
if (rcsMatch.key) {
|
|
16318
17057
|
knownResourceKeys.add(rcsMatch.key.toLowerCase());
|
|
17058
|
+
overwrittenKeys.add(rcsMatch.key.toLowerCase());
|
|
16319
17059
|
}
|
|
16320
17060
|
result.imported++;
|
|
16321
17061
|
logger.info(`Imported ${kind} "${rcsMatch.name}" (key: ${rcsMatch.key}) into solution`);
|
|
16322
17062
|
continue;
|
|
16323
17063
|
}
|
|
17064
|
+
if (stopsCatalogLookups(classifyCatalogFailure(importError))) {
|
|
17065
|
+
await recordUnchecked(importError, kind, name, directCloudKey);
|
|
17066
|
+
continue;
|
|
17067
|
+
}
|
|
16324
17068
|
if (isConnection) {
|
|
16325
|
-
|
|
16326
|
-
|
|
17069
|
+
const failedStep = importError instanceof OverwriteRefreshError ? "refresh the debug overwrite for" : "import";
|
|
17070
|
+
const warning = `Failed to ${failedStep} connection ${directCloudKey}: ${importError.message}`;
|
|
17071
|
+
result.warnings.push(warning);
|
|
17072
|
+
logger.warn(warning);
|
|
16327
17073
|
continue;
|
|
16328
17074
|
}
|
|
16329
|
-
|
|
17075
|
+
const importWarning = `Failed to import ${kind} "${name}" from Orchestrator: ${importError.message}. Created it locally instead; link it before deploy if it must point at the cloud resource.`;
|
|
17076
|
+
result.warnings.push(importWarning);
|
|
17077
|
+
logger.warn(importWarning);
|
|
16330
17078
|
virtualCandidates.push({
|
|
16331
17079
|
binding,
|
|
16332
17080
|
kind,
|
|
@@ -16345,11 +17093,29 @@ async function syncResourcesFromBindings(solutionDir, projectPaths, projectSubTy
|
|
|
16345
17093
|
return true;
|
|
16346
17094
|
});
|
|
16347
17095
|
for (const candidate of dedupedVirtuals) {
|
|
16348
|
-
const [syncError] = await catchError(createVirtualForBinding(builder, candidate.binding, candidate.kind, candidate.type, candidate.metadata, candidate.name, candidate.folderPath, result));
|
|
17096
|
+
const [syncError, created] = await catchError(createVirtualForBinding(builder, candidate.binding, candidate.kind, candidate.type, candidate.metadata, candidate.name, candidate.folderPath, result));
|
|
16349
17097
|
if (syncError) {
|
|
16350
17098
|
logger.warn(`Failed to create virtual ${candidate.kind}/${candidate.name}: ${syncError.message}`);
|
|
17099
|
+
} else if (created) {
|
|
17100
|
+
resolvedKeys.add(bindingKey(candidate.kind, candidate.name));
|
|
16351
17101
|
}
|
|
16352
17102
|
}
|
|
17103
|
+
if (result.catalogLookupFailure) {
|
|
17104
|
+
const seen = new Set;
|
|
17105
|
+
result.unresolved = result.unresolved.filter((b) => {
|
|
17106
|
+
const key = bindingKey(b.kind, b.name);
|
|
17107
|
+
if (resolvedKeys.has(key)) {
|
|
17108
|
+
keptUnchecked++;
|
|
17109
|
+
result.skipped++;
|
|
17110
|
+
return false;
|
|
17111
|
+
}
|
|
17112
|
+
if (seen.has(key))
|
|
17113
|
+
return false;
|
|
17114
|
+
seen.add(key);
|
|
17115
|
+
return true;
|
|
17116
|
+
});
|
|
17117
|
+
result.warnings.push(catalogLookupWarning(result.catalogLookupFailure, keptUnchecked, result.unresolved));
|
|
17118
|
+
}
|
|
16353
17119
|
const saveError = await saveAndDisposeBuilder(builder, solutionDir);
|
|
16354
17120
|
if (saveError) {
|
|
16355
17121
|
throw new Error(`Failed to save solution changes: ${saveError.message}`);
|
|
@@ -16377,6 +17143,43 @@ async function pruneMemberClones(builder, memberProjectKeys, result) {
|
|
|
16377
17143
|
logger.info(`Removed duplicate ${clone.kind} "${clone.name}" (key: ${clone.key}) — the solution provisions this project itself`);
|
|
16378
17144
|
}
|
|
16379
17145
|
}
|
|
17146
|
+
async function isUncheckedBindingCovered(builder, knownResourceKeys, kind, name, directCloudKey) {
|
|
17147
|
+
if (directCloudKey) {
|
|
17148
|
+
return knownResourceKeys.has(directCloudKey.toLowerCase());
|
|
17149
|
+
}
|
|
17150
|
+
const solution = await builder.context.loadAsync();
|
|
17151
|
+
return !!findMatchingLocalResource(solution.resources ?? [], kind, name, undefined);
|
|
17152
|
+
}
|
|
17153
|
+
async function refreshKnownResource(services, builder, reference, overwrittenKeys) {
|
|
17154
|
+
const solution = await builder.context.loadAsync();
|
|
17155
|
+
const referenceKey = reference.key.toLowerCase();
|
|
17156
|
+
const existing = (solution.resources ?? []).find((resource) => resource.key?.toLowerCase() === referenceKey);
|
|
17157
|
+
const mediator = services.container.resolve(Tokens.IMediator);
|
|
17158
|
+
const response = await mediator.sendCommandAsync(new AddOrUpdateResourceToSolutionCommand(builder.context, reference, true, existing?.key));
|
|
17159
|
+
const sdkWroteOverwrite = response.saved && existing?.key === reference.key;
|
|
17160
|
+
if (!existing || sdkWroteOverwrite || overwrittenKeys.has(referenceKey)) {
|
|
17161
|
+
overwrittenKeys.add(referenceKey);
|
|
17162
|
+
return response;
|
|
17163
|
+
}
|
|
17164
|
+
const [overwriteError] = await catchError(refreshOverwrite(services, builder, reference, existing.key));
|
|
17165
|
+
if (overwriteError)
|
|
17166
|
+
throw new OverwriteRefreshError(overwriteError.message);
|
|
17167
|
+
overwrittenKeys.add(referenceKey);
|
|
17168
|
+
return response;
|
|
17169
|
+
}
|
|
17170
|
+
async function refreshOverwrite(services, builder, reference, solutionResourceKey) {
|
|
17171
|
+
const importer = services.container.resolve(Tokens.IImportResourceHelper);
|
|
17172
|
+
const payload = await importer.exportResourceAsync(reference);
|
|
17173
|
+
const referenceKey = reference.key.toLowerCase();
|
|
17174
|
+
const overwrite = [...payload.overwrites].find(([key]) => key.toLowerCase() === referenceKey)?.[1];
|
|
17175
|
+
if (!overwrite) {
|
|
17176
|
+
throw new Error(`Overwrite not found for resource key '${reference.key}' in exported payload`);
|
|
17177
|
+
}
|
|
17178
|
+
const overwrites = services.container.resolve(Tokens.IResourceOverwritesService);
|
|
17179
|
+
await overwrites.manageSolutionOverwritesAsync(builder.context, [
|
|
17180
|
+
{ solutionResourceKey, overwrite }
|
|
17181
|
+
]);
|
|
17182
|
+
}
|
|
16380
17183
|
async function saveAndDisposeBuilder(builder, solutionDir) {
|
|
16381
17184
|
const context = builder.context;
|
|
16382
17185
|
if (!context?.forceSaveChangesAsync) {
|
|
@@ -16446,11 +17249,11 @@ async function createVirtualForBinding(builder, _binding, kind, type, metadata,
|
|
|
16446
17249
|
if (alreadyVirtualized) {
|
|
16447
17250
|
result.skipped++;
|
|
16448
17251
|
logger.info(`Skipping virtual ${kind} "${name}" — existing resource "${alreadyVirtualized.name}" in solution_folder already covers this binding (requested folder "${folderPath}")`);
|
|
16449
|
-
return;
|
|
17252
|
+
return true;
|
|
16450
17253
|
}
|
|
16451
17254
|
const minted = await mintVirtualResource(builder, kind, type, name, metadata);
|
|
16452
17255
|
if (!minted)
|
|
16453
|
-
return;
|
|
17256
|
+
return false;
|
|
16454
17257
|
result.created++;
|
|
16455
17258
|
logger.info(`Created ${kind} "${name}" in solution`);
|
|
16456
17259
|
if (!virtualizable) {
|
|
@@ -16458,6 +17261,7 @@ async function createVirtualForBinding(builder, _binding, kind, type, metadata,
|
|
|
16458
17261
|
result.warnings.push(warning);
|
|
16459
17262
|
logger.warn(warning);
|
|
16460
17263
|
}
|
|
17264
|
+
return true;
|
|
16461
17265
|
}
|
|
16462
17266
|
async function findResourceByKeyInRcs(builder, kind, expectedKey, folderPath, propagateErrors = false) {
|
|
16463
17267
|
const expectedLower = expectedKey.toLowerCase();
|
|
@@ -16535,8 +17339,8 @@ async function searchRcsResourcesStrict(builder, kind, name) {
|
|
|
16535
17339
|
} while (pageCursor);
|
|
16536
17340
|
return allMatches;
|
|
16537
17341
|
}
|
|
16538
|
-
async function findResourceInRcs(builder, kind, name, folderPath) {
|
|
16539
|
-
const allMatches = await searchRcsResources(builder, kind, name);
|
|
17342
|
+
async function findResourceInRcs(builder, kind, name, folderPath, propagateErrors = false) {
|
|
17343
|
+
const allMatches = propagateErrors ? await searchRcsResourcesStrict(builder, kind, name) : await searchRcsResources(builder, kind, name);
|
|
16540
17344
|
if (allMatches.length === 0) {
|
|
16541
17345
|
return;
|
|
16542
17346
|
}
|
|
@@ -16634,9 +17438,15 @@ async function readUiprojName(uiprojPath) {
|
|
|
16634
17438
|
return;
|
|
16635
17439
|
}
|
|
16636
17440
|
}
|
|
17441
|
+
async function snapshotResourceIdentities(builder) {
|
|
17442
|
+
const [loadError, solution] = await catchError(builder.context.loadAsync());
|
|
17443
|
+
if (loadError || !solution)
|
|
17444
|
+
return;
|
|
17445
|
+
return new Set((solution.resources ?? []).map((resource) => resource.key ? resource.key.toLowerCase() : `${resource.kind}:${resource.name}`.toLowerCase()));
|
|
17446
|
+
}
|
|
16637
17447
|
async function reconcileSolutionProjects(builder, solutionDir, projectSubTypes) {
|
|
16638
17448
|
const fs = getFileSystem();
|
|
16639
|
-
const outcome = { projectsCount: 0 };
|
|
17449
|
+
const outcome = { projectsCount: 0, resourcesAdded: 0 };
|
|
16640
17450
|
const uipxProjects = await readUipxProjects(solutionDir);
|
|
16641
17451
|
const projectDetails = uipxProjects.flatMap((project) => {
|
|
16642
17452
|
const reconcileType = mapUipxTypeToReconcileType(project.type);
|
|
@@ -16654,6 +17464,7 @@ async function reconcileSolutionProjects(builder, solutionDir, projectSubTypes)
|
|
|
16654
17464
|
if (projectDetails.length === 0)
|
|
16655
17465
|
return outcome;
|
|
16656
17466
|
const solutionName = fs.path.basename(solutionDir);
|
|
17467
|
+
const before = await snapshotResourceIdentities(builder);
|
|
16657
17468
|
const [reconcileError] = await catchError(builder.reconcileProjectsAsync({
|
|
16658
17469
|
solutionName,
|
|
16659
17470
|
projects: projectDetails
|
|
@@ -16663,6 +17474,10 @@ async function reconcileSolutionProjects(builder, solutionDir, projectSubTypes)
|
|
|
16663
17474
|
return outcome;
|
|
16664
17475
|
}
|
|
16665
17476
|
outcome.projectsCount = projectDetails.length;
|
|
17477
|
+
const after = before && await snapshotResourceIdentities(builder);
|
|
17478
|
+
if (before && after) {
|
|
17479
|
+
outcome.resourcesAdded = [...after].filter((identity) => !before.has(identity)).length;
|
|
17480
|
+
}
|
|
16666
17481
|
logger.info(`Reconciled ${projectDetails.length} .uipx project(s) in solution ${solutionName}`);
|
|
16667
17482
|
return outcome;
|
|
16668
17483
|
}
|
|
@@ -16704,12 +17519,48 @@ function findBindingsSchemaError(content) {
|
|
|
16704
17519
|
}
|
|
16705
17520
|
return null;
|
|
16706
17521
|
}
|
|
16707
|
-
|
|
17522
|
+
function bindingSources(solutionDir, projectPaths, projects, projectBindings) {
|
|
17523
|
+
const sources = [{ directory: solutionDir }];
|
|
17524
|
+
const fileDirectories = new Set([solutionDir]);
|
|
17525
|
+
const contributedIds = new Set;
|
|
17526
|
+
for (const directory of new Set(projectPaths)) {
|
|
17527
|
+
const owners = projects.filter((project) => project.path === directory);
|
|
17528
|
+
for (const project of owners) {
|
|
17529
|
+
const bindings = projectBindings?.get(project.id);
|
|
17530
|
+
if (bindings === undefined || contributedIds.has(project.id))
|
|
17531
|
+
continue;
|
|
17532
|
+
contributedIds.add(project.id);
|
|
17533
|
+
sources.push({
|
|
17534
|
+
directory,
|
|
17535
|
+
contribution: { projectId: project.id, bindings }
|
|
17536
|
+
});
|
|
17537
|
+
}
|
|
17538
|
+
const needsFile = owners.length === 0 || owners.some((project) => !projectBindings?.has(project.id));
|
|
17539
|
+
if (needsFile && !fileDirectories.has(directory)) {
|
|
17540
|
+
fileDirectories.add(directory);
|
|
17541
|
+
sources.push({ directory });
|
|
17542
|
+
}
|
|
17543
|
+
}
|
|
17544
|
+
return sources;
|
|
17545
|
+
}
|
|
17546
|
+
async function collectBindings(bindingsJsonFallbackDirs, serializer, sources) {
|
|
16708
17547
|
const fs = getFileSystem();
|
|
16709
17548
|
const allBindings = [];
|
|
16710
17549
|
const parseErrors = [];
|
|
16711
|
-
const
|
|
16712
|
-
|
|
17550
|
+
for (const { directory: dir, contribution } of sources) {
|
|
17551
|
+
if (contribution) {
|
|
17552
|
+
if (contribution.bindings.length === 0)
|
|
17553
|
+
continue;
|
|
17554
|
+
const parsed2 = deserializeBindings(JSON.stringify({
|
|
17555
|
+
version: "2.0",
|
|
17556
|
+
resources: contribution.bindings
|
|
17557
|
+
}), `${dir} (bindings contributed by the project's tool; project ${contribution.projectId})`, serializer);
|
|
17558
|
+
if ("error" in parsed2)
|
|
17559
|
+
parseErrors.push(parsed2.error);
|
|
17560
|
+
else
|
|
17561
|
+
allBindings.push(...parsed2.resources);
|
|
17562
|
+
continue;
|
|
17563
|
+
}
|
|
16713
17564
|
const v2Path = fs.path.join(dir, "bindings_v2.json");
|
|
16714
17565
|
let bindingsPath = v2Path;
|
|
16715
17566
|
let exists = await fs.exists(v2Path);
|
|
@@ -16728,37 +17579,44 @@ async function collectBindings(solutionDir, projectPaths, bindingsJsonFallbackDi
|
|
|
16728
17579
|
});
|
|
16729
17580
|
continue;
|
|
16730
17581
|
}
|
|
16731
|
-
const
|
|
16732
|
-
|
|
16733
|
-
|
|
16734
|
-
|
|
16735
|
-
|
|
16736
|
-
|
|
16737
|
-
|
|
16738
|
-
|
|
16739
|
-
|
|
16740
|
-
|
|
17582
|
+
const parsed = deserializeBindings(new TextDecoder().decode(content), bindingsPath, serializer);
|
|
17583
|
+
if ("error" in parsed)
|
|
17584
|
+
parseErrors.push(parsed.error);
|
|
17585
|
+
else
|
|
17586
|
+
allBindings.push(...parsed.resources);
|
|
17587
|
+
}
|
|
17588
|
+
return { bindings: allBindings, parseErrors };
|
|
17589
|
+
}
|
|
17590
|
+
function deserializeBindings(decoded, source, serializer) {
|
|
17591
|
+
let success;
|
|
17592
|
+
let metadata;
|
|
17593
|
+
try {
|
|
17594
|
+
const result = serializer.tryDeserialize(decoded);
|
|
17595
|
+
success = result.success;
|
|
17596
|
+
metadata = result.metadata;
|
|
17597
|
+
} catch (err) {
|
|
17598
|
+
return {
|
|
17599
|
+
error: {
|
|
17600
|
+
path: source,
|
|
16741
17601
|
reason: findBindingsSchemaError(decoded) ?? `does not match the expected v2 bindings schema — check each resource's 'kind' and required fields${err instanceof Error ? ` (${err.message})` : ""}`
|
|
16742
|
-
}
|
|
16743
|
-
|
|
16744
|
-
|
|
16745
|
-
|
|
16746
|
-
|
|
16747
|
-
|
|
17602
|
+
}
|
|
17603
|
+
};
|
|
17604
|
+
}
|
|
17605
|
+
if (!success) {
|
|
17606
|
+
return {
|
|
17607
|
+
error: {
|
|
17608
|
+
path: source,
|
|
16748
17609
|
reason: findBindingsSchemaError(decoded) ?? "does not match the expected v2 bindings schema (the serializer rejected it)"
|
|
16749
|
-
}
|
|
16750
|
-
|
|
16751
|
-
}
|
|
16752
|
-
if (!metadata?.resources?.length) {
|
|
16753
|
-
continue;
|
|
16754
|
-
}
|
|
16755
|
-
allBindings.push(...metadata.resources);
|
|
17610
|
+
}
|
|
17611
|
+
};
|
|
16756
17612
|
}
|
|
16757
|
-
return {
|
|
17613
|
+
return { resources: metadata?.resources ?? [] };
|
|
16758
17614
|
}
|
|
16759
|
-
async function syncAndLog(solutionDir, projectSubTypes) {
|
|
16760
|
-
const [syncError, syncResult] = await catchError(syncResourcesFromBindings(solutionDir, undefined, projectSubTypes));
|
|
17615
|
+
async function syncAndLog(solutionDir, projectSubTypes, options) {
|
|
17616
|
+
const [syncError, syncResult] = await catchError(syncResourcesFromBindings(solutionDir, undefined, projectSubTypes, options?.projectBindings));
|
|
16761
17617
|
if (syncError) {
|
|
17618
|
+
if (options?.failOnUnresolved)
|
|
17619
|
+
throw syncError;
|
|
16762
17620
|
logger.warn(`Resource sync failed: ${syncError.message}. Continuing.`);
|
|
16763
17621
|
return;
|
|
16764
17622
|
}
|
|
@@ -16768,6 +17626,9 @@ async function syncAndLog(solutionDir, projectSubTypes) {
|
|
|
16768
17626
|
for (const warning of syncResult.warnings) {
|
|
16769
17627
|
logger.warn(warning);
|
|
16770
17628
|
}
|
|
17629
|
+
if (options?.failOnUnresolved && syncResult.catalogLookupFailure && syncResult.unresolved.length > 0) {
|
|
17630
|
+
throw new CatalogLookupError(syncResult.catalogLookupFailure, syncResult.unresolved);
|
|
17631
|
+
}
|
|
16771
17632
|
}
|
|
16772
17633
|
|
|
16773
17634
|
// ../solution-sdk/src/resources/services/resource-refresh-service.ts
|
|
@@ -16804,7 +17665,11 @@ async function resourceRefreshAsync(solutionPath = ".", options = {}) {
|
|
|
16804
17665
|
const resolverWarnings = subTypesError ? [
|
|
16805
17666
|
`Could not resolve project subTypes: ${subTypesError.message}. Project artefacts for types that need a variant were left as they are; fix the tool install and re-run 'uip solution resources refresh'.`
|
|
16806
17667
|
] : [];
|
|
16807
|
-
const [
|
|
17668
|
+
const [bindingsError, projectBindings] = await catchError(options.resolveProjectBindingsAsync?.() ?? Promise.resolve(new Map));
|
|
17669
|
+
if (bindingsError) {
|
|
17670
|
+
resolverWarnings.push(`Could not read the bindings projects contribute: ${bindingsError.message}. Those projects were synced from any bindings_v2.json on disk instead; fix the tool install and re-run 'uip solution resources refresh'.`);
|
|
17671
|
+
}
|
|
17672
|
+
const [syncError, result] = await catchError(syncResourcesFromBindings(resolvedPath, undefined, projectSubTypes ?? new Map, projectBindings ?? new Map));
|
|
16808
17673
|
if (syncError) {
|
|
16809
17674
|
return {
|
|
16810
17675
|
ok: false,
|
|
@@ -16818,6 +17683,7 @@ async function resourceRefreshAsync(solutionPath = ".", options = {}) {
|
|
|
16818
17683
|
imported: result.imported,
|
|
16819
17684
|
skipped: result.skipped,
|
|
16820
17685
|
pruned: result.pruned,
|
|
17686
|
+
projectResourcesCreated: result.projectResourcesCreated,
|
|
16821
17687
|
warnings: [...resolverWarnings, ...result.warnings]
|
|
16822
17688
|
};
|
|
16823
17689
|
}
|
|
@@ -16999,6 +17865,7 @@ function sortKeysDeep(value) {
|
|
|
16999
17865
|
return sorted;
|
|
17000
17866
|
}
|
|
17001
17867
|
export {
|
|
17868
|
+
CatalogLookupError,
|
|
17002
17869
|
EntryPointSpecEnhancer,
|
|
17003
17870
|
MAX_RESOURCE_NAME_LENGTH,
|
|
17004
17871
|
ProjectManifestError,
|
|
@@ -17011,7 +17878,9 @@ export {
|
|
|
17011
17878
|
createProjectInSolutionBuilder,
|
|
17012
17879
|
createResourceBuilderServices,
|
|
17013
17880
|
createResourceKindMetadataResolver,
|
|
17881
|
+
exportResourceConfigurationsAsync,
|
|
17014
17882
|
exportResourceDefinitionAsync,
|
|
17883
|
+
findCatalogEntitiesAsync,
|
|
17015
17884
|
findCatalogEntityAsync,
|
|
17016
17885
|
findMatchingLocalResource,
|
|
17017
17886
|
findMatchingMemberResource,
|
|
@@ -17019,21 +17888,26 @@ export {
|
|
|
17019
17888
|
findProjectFile,
|
|
17020
17889
|
findResourceByKeyInRcs,
|
|
17021
17890
|
findResourceInRcs,
|
|
17891
|
+
findResourcesByNameAsync,
|
|
17022
17892
|
formatResourceSubtypes,
|
|
17023
17893
|
getRemoteResourceClients,
|
|
17024
17894
|
hasAnyTemplateRow,
|
|
17025
17895
|
hasBareTemplateRow,
|
|
17026
17896
|
isMissingProjectTypeError,
|
|
17027
17897
|
isProjectManifestError,
|
|
17898
|
+
isResourceKeyNotFound,
|
|
17028
17899
|
normalizeFolderPath,
|
|
17029
17900
|
normalizeResourceCasing,
|
|
17030
17901
|
normalizeResourceFileCasing,
|
|
17031
17902
|
readProjectFile,
|
|
17903
|
+
readResourceConfigurationAsync,
|
|
17904
|
+
readResourceConfigurationsAsync,
|
|
17032
17905
|
readSolutionFile,
|
|
17033
17906
|
readSolutionManifest,
|
|
17034
17907
|
readSpecEntryPoints,
|
|
17035
17908
|
readSpecProperty,
|
|
17036
17909
|
readUipxProjects,
|
|
17910
|
+
refreshArtefactSpecsAsync,
|
|
17037
17911
|
resolveProjectDirFromManifest,
|
|
17038
17912
|
resolveResourceKindMetadata,
|
|
17039
17913
|
resolveSolutionFilePath,
|
|
@@ -17053,4 +17927,4 @@ export {
|
|
|
17053
17927
|
writeSolutionFile
|
|
17054
17928
|
};
|
|
17055
17929
|
|
|
17056
|
-
//# debugId=
|
|
17930
|
+
//# debugId=6F9276B12E557AA364756E2164756E21
|