@uipath/flow-tool 1.201.0 → 1.202.0-preview.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{authoring-7r6g06c7.js → authoring-wpa6d0vf.js} +74 -48
- package/dist/binding-service-dh91hw9e.js +141 -0
- package/dist/{browser-strategy-rkcvc6tn.js → browser-strategy-6atc7v8s.js} +3 -3
- package/dist/connector-service-d9ph9kx1.js +948 -0
- package/dist/{conversion-H2VEEYLB-ng48mbf7.js → conversion-QANACVCM-zs0hhfjv.js} +39 -33
- package/dist/{de-5KVP66U6-f7knj511.js → de-5KVP66U6-1bnf4zt5.js} +52 -52
- package/dist/de-6U7ECGHH-xwsw33fk.js +35 -0
- package/dist/{de-5HU6GFWV-4EZK6G7N-yrh21f52.js → de-7XQXX2DK-IDWR6CAR-n4z245kt.js} +857 -845
- package/dist/{de-5HU6GFWV-zheyw6d2.js → de-7XQXX2DK-tqdy5n2b.js} +857 -845
- package/dist/{de-HKTOVV4H-d5yw5j21.js → de-HKTOVV4H-pe9w0xn8.js} +46 -46
- package/dist/{de-XLT4QPIP-0rtw349w.js → de-XLT4QPIP-kj81dxjc.js} +9 -9
- package/dist/debug-conversation-trigger-452frzyz.js +41 -0
- package/dist/debug-http-client-wd6xb8v4.js +31 -0
- package/dist/debug-service-fvyexnb1.js +58 -0
- package/dist/edge-service-e77bndbe.js +162 -0
- package/dist/{elk.bundled-pydbzeez.js → elk.bundled-vpsbxz0p.js} +3 -3
- package/dist/{en-MABQK6C4-REWE2WG2-8dp4cqdg.js → en-5ZGC5VQ3-EWX7ILY7-rmtj70fk.js} +898 -898
- package/dist/{en-MABQK6C4-nkzq2j8t.js → en-5ZGC5VQ3-h581y30k.js} +897 -897
- package/dist/en-EPWMLP2N-2wvge238.js +28 -0
- package/dist/{en-UNT7BE26-rhh65jry.js → en-LQHKFSEY-vvbe8ve9.js} +13 -11
- package/dist/{en-P4AS26D7-szrzfxz1.js → en-P4AS26D7-zptp77bm.js} +45 -45
- package/dist/{en-4KXU7N7B-66fntxa2.js → en-X3S6IZ5J-nhkg6pwn.js} +54 -60
- package/dist/{es-MX-H2EAXLYI-qwnqt48x.js → es-MX-H2EAXLYI-j42kfkxy.js} +46 -46
- package/dist/es-MX-NHTIP5YM-ar6zfx95.js +35 -0
- package/dist/{es-MX-OKNDG2NH-c1k1s1tg.js → es-MX-OKNDG2NH-tcac6j4g.js} +9 -9
- package/dist/{es-MX-POESXYP2-UW6VP5QI-cd3a79g9.js → es-MX-U2VN3SZW-KYAJ2ONK-kdram1g1.js} +857 -845
- package/dist/{es-MX-POESXYP2-9538722k.js → es-MX-U2VN3SZW-anynsmd8.js} +857 -845
- package/dist/{es-MX-XAVLOQW3-9b3cp9n8.js → es-MX-XAVLOQW3-q00km2y7.js} +52 -52
- package/dist/{es-NQICVYSQ-aa9z3nhs.js → es-NQICVYSQ-3dtqgget.js} +9 -9
- package/dist/{es-O4PAV2CR-jwfaawwk.js → es-O4PAV2CR-0g23ve3v.js} +46 -46
- package/dist/es-PQ3RA33Q-y4kxhjfr.js +35 -0
- package/dist/{es-VFPNVMP5-thm0z9sr.js → es-VFPNVMP5-bx2c337j.js} +52 -52
- package/dist/{es-LUTYN7U7-IY5QWOUF-k2aefzc0.js → es-ZGCPPOME-24PJEGPV-rn86z9kn.js} +857 -845
- package/dist/{es-LUTYN7U7-ye5zn4sn.js → es-ZGCPPOME-8gazspjj.js} +857 -845
- package/dist/flow-api-wv8p8xbd.js +36 -0
- package/dist/flow-debug-service-tfbefas6.js +741 -0
- package/dist/flow-eval-node-target-c6wea7rz.js +44 -0
- package/dist/flow-eval-run-service-01kdky72.js +961 -0
- package/dist/flow-eval-service-ft8e16jz.js +1338 -0
- package/dist/flow-init-service-mva4crty.js +35 -0
- package/dist/flow-io-r318sjrw.js +36 -0
- package/dist/flow-migrate-service-rwcdx60q.js +119 -0
- package/dist/flow-pack-service-p4hxyj9e.js +280 -0
- package/dist/flow-validate-service-j25pxpwz.js +57 -0
- package/dist/{fr-5YRGHXF5-q6b63yg0.js → fr-5YRGHXF5-kz1ywpv6.js} +46 -46
- package/dist/{fr-E5MDO4EG-exvrs7ge.js → fr-E5MDO4EG-c3mkty2t.js} +52 -52
- package/dist/{fr-PFHIL7YZ-cxnshwa8.js → fr-PFHIL7YZ-2n589p47.js} +9 -9
- package/dist/fr-R4L3OAWI-30khpsmn.js +35 -0
- package/dist/{fr-LJIK56LW-STG6QR3T-cextvv8q.js → fr-T3G5GZCT-TU4IKBEG-k6xz1s1f.js} +857 -845
- package/dist/{fr-LJIK56LW-xf3xf2kh.js → fr-T3G5GZCT-y3f7xb1q.js} +857 -845
- package/dist/governance-fetcher-j9cx4f1d.js +391 -0
- package/dist/headless-h1myzz32.js +177196 -0
- package/dist/hitl-service-kvt5wms4.js +256 -0
- package/dist/index-1kgxzh8x.js +143 -0
- package/dist/index-4zrwgb3c.js +111 -0
- package/dist/index-ev4mdg5y.js +4801 -0
- package/dist/{index-er6vy3jk.js → index-eybzsdcc.js} +295 -317
- package/dist/{index-hsadteg4.js → index-h8cph72k.js} +4 -4
- package/dist/{index-p50kx6jv.js → index-k5tbd184.js} +276 -276
- package/dist/index-n33np76r.js +630 -0
- package/dist/{index-9f8q2ege.js → index-p3vk57z7.js} +27 -27
- package/dist/{index-dhcd9b82.js → index-w0z4s69j.js} +166 -81
- package/dist/index.js +29 -32
- package/dist/{index.umd.min-drpc57vn.js → index.umd.min-fqefd9kn.js} +3 -3
- package/dist/init.js +24 -25
- package/dist/input-reader-6pwhtp8v.js +11 -0
- package/dist/{ja-FGEGLBJ3-w9byjhze.js → ja-BI5K3JDZ-77zat4z2.js} +857 -845
- package/dist/{ja-FGEGLBJ3-MG3BSWXD-vq19zt2p.js → ja-BI5K3JDZ-GTIHISTZ-s6n3r2ab.js} +857 -845
- package/dist/{ja-DPO5PPLO-s2a7j3nj.js → ja-DPO5PPLO-mysfmznx.js} +52 -52
- package/dist/{ja-P4OSE367-8ywxep9a.js → ja-P4OSE367-srr3qypg.js} +9 -9
- package/dist/{ja-SDAPAVCR-943p5gx7.js → ja-SDAPAVCR-kg39dfap.js} +46 -46
- package/dist/ja-ZHKCBE5W-x73w6x3e.js +35 -0
- package/dist/{js-yaml-cggj6w7q.js → js-yaml-87cdx6bm.js} +27 -19
- package/dist/known-types-a20evmmg.js +20 -0
- package/dist/ko-6W7OGLLB-mnmqc584.js +35 -0
- package/dist/{ko-ITOPNIYI-qz39kamf.js → ko-ITOPNIYI-hmxd2asd.js} +52 -52
- package/dist/{ko-TUAK3G3A-s25w0ckg.js → ko-JOBF5V7N-4bv0mjje.js} +857 -845
- package/dist/{ko-TUAK3G3A-TBEBKOTM-ns78t2rv.js → ko-JOBF5V7N-O7T4HKIE-ape840y0.js} +857 -845
- package/dist/{ko-NAGOZLC3-wb3y9yhh.js → ko-NAGOZLC3-gaxxsnd2.js} +46 -46
- package/dist/{ko-PYOS2KJP-5sbj5bp8.js → ko-PYOS2KJP-e7dshyxy.js} +9 -9
- package/dist/localization-h8a53z6p.js +47 -0
- package/dist/{node-gd4469ea.js → node-cnrcrrb0.js} +7973 -7166
- package/dist/node-service-8g5x5d2y.js +70 -0
- package/dist/{node-strategy-8gzp67xs.js → node-strategy-gc4sg6a2.js} +132 -16
- package/dist/node-sync-service-e2reh33c.js +42 -0
- package/dist/{packager-tool-9qecd4wb.js → packager-tool-0gctz400.js} +5 -2
- package/dist/{packager-tool-1cb0d5e0.js → packager-tool-0v3s8r01.js} +2 -2
- package/dist/{packager-tool-wckvcay0.js → packager-tool-1yh8g550.js} +9 -7
- package/dist/packager-tool-27avrkyk.js +15 -0
- package/dist/packager-tool-2wefykg9.js +106 -0
- package/dist/packager-tool-4fhgws0x.js +757 -0
- package/dist/{packager-tool-7yjpwj92.js → packager-tool-4hx14snw.js} +49 -48
- package/dist/{packager-tool-3wygxefb.js → packager-tool-58q3tvh7.js} +10 -10
- package/dist/{packager-tool-cvwr40ax.js → packager-tool-5qaxht3k.js} +1425 -550
- package/dist/packager-tool-5z1eg3ea.js +33289 -0
- package/dist/{packager-tool-17cn3xb7.js → packager-tool-6m078z5s.js} +13388 -19366
- package/dist/packager-tool-7b6tpg7y.js +77 -0
- package/dist/packager-tool-7exrv6w7.js +23 -0
- package/dist/packager-tool-8dszjcg5.js +4892 -0
- package/dist/packager-tool-8j92afwp.js +58 -0
- package/dist/packager-tool-94w17vf8.js +85 -0
- package/dist/{packager-tool-vdd02vns.js → packager-tool-9bec251q.js} +543 -1493
- package/dist/packager-tool-a1hbfmws.js +399 -0
- package/dist/{packager-tool-tq9q9m77.js → packager-tool-a42jnpy5.js} +3 -9
- package/dist/packager-tool-abbtfk2v.js +54 -0
- package/dist/packager-tool-cdwpc9fh.js +4945 -0
- package/dist/packager-tool-e0p2zsyc.js +97 -0
- package/dist/packager-tool-eebq62fq.js +540 -0
- package/dist/{packager-tool-m6x5sczh.js → packager-tool-em5r6g6j.js} +14 -21
- package/dist/packager-tool-eypvc2kv.js +23 -0
- package/dist/packager-tool-f0kd5kq4.js +2327 -0
- package/dist/packager-tool-fjaa8d3v.js +289 -0
- package/dist/packager-tool-g0eha8ge.js +121 -0
- package/dist/packager-tool-g9y14b10.js +54 -0
- package/dist/packager-tool-gbgfwx8f.js +2 -0
- package/dist/packager-tool-jc34wvrw.js +64 -0
- package/dist/packager-tool-k99nf3pq.js +25 -0
- package/dist/{packager-tool-hr0xg6q8.js → packager-tool-kn91khp6.js} +17 -13
- package/dist/{packager-tool-jysvpt8p.js → packager-tool-m3wkcxf5.js} +2 -2
- package/dist/{packager-tool-78a3szsp.js → packager-tool-m5qfverj.js} +1720 -2014
- package/dist/packager-tool-mwvbq6ef.js +79 -0
- package/dist/packager-tool-nq4rcqqg.js +87 -0
- package/dist/packager-tool-nxx8naxv.js +4234 -0
- package/dist/{packager-tool-3y0k15sv.js → packager-tool-p9stswjj.js} +2858 -19342
- package/dist/packager-tool-r0xpcqwg.js +188 -0
- package/dist/packager-tool-raq2wbwp.js +18 -0
- package/dist/{packager-tool-y3dezh8k.js → packager-tool-rs6jm14d.js} +6 -4
- package/dist/packager-tool-s9ff3kk4.js +6 -0
- package/dist/{packager-tool-pbsghbmj.js → packager-tool-sykgshez.js} +2 -2
- package/dist/packager-tool-tf3d2y8z.js +31 -0
- package/dist/packager-tool-tn5e7wnb.js +384 -0
- package/dist/packager-tool-v2rkcehq.js +457 -0
- package/dist/packager-tool-v86fdwvs.js +262 -0
- package/dist/packager-tool-v9psxdy5.js +8185 -0
- package/dist/packager-tool-v9rrz038.js +602 -0
- package/dist/packager-tool-vpqyvh4c.js +304 -0
- package/dist/packager-tool-wcha0e5r.js +443 -0
- package/dist/{packager-tool-1gt6js73.js → packager-tool-xhzfwa5p.js} +6 -4
- package/dist/{packager-tool-5arsyj36.js → packager-tool-yc4kw997.js} +4 -2
- package/dist/{packager-tool-pkq70dec.js → packager-tool-ywqc9rtf.js} +31 -3
- package/dist/{packager-tool-0567pxpm.js → packager-tool-z9bfhmm5.js} +10 -10
- package/dist/{packager-tool-gmrwvnyh.js → packager-tool-zfrp8ecz.js} +8 -58
- package/dist/{packager-tool-3vdpx9ng.js → packager-tool-zke08y39.js} +1121 -1846
- package/dist/packager-tool.js +17 -17
- package/dist/{pt-7TR74ZMB-1g8my56g.js → pt-7TR74ZMB-bmphh4x2.js} +46 -46
- package/dist/{pt-BR-7XGDXRDJ-TR5D7JYL-533wvy7p.js → pt-BR-7DYX2YPT-LZYH4YFD-bx43vx3z.js} +857 -845
- package/dist/{pt-BR-7XGDXRDJ-espnkgrj.js → pt-BR-7DYX2YPT-fqxqzqtf.js} +857 -845
- package/dist/{pt-BR-BXURWX4W-dqr4dnf9.js → pt-BR-BXURWX4W-bwfcwhk1.js} +52 -52
- package/dist/{pt-BR-DXXSYJDO-bn84ewp7.js → pt-BR-DXXSYJDO-a2tp13v7.js} +46 -46
- package/dist/pt-BR-UQCYHKMJ-q78n7q70.js +35 -0
- package/dist/{pt-BR-Z3TUDJHM-n7ngej6s.js → pt-BR-Z3TUDJHM-8v73x9s7.js} +9 -9
- package/dist/pt-D6A6MVB2-yvxca8vz.js +35 -0
- package/dist/{pt-TMVOOITK-myha14p9.js → pt-HTXGGX6Y-97t21dty.js} +857 -845
- package/dist/{pt-TMVOOITK-H2ADYHSD-ezpggv33.js → pt-HTXGGX6Y-ZHQSDFKI-vehfxadc.js} +857 -845
- package/dist/{pt-KSBWHAVQ-hd52bpsz.js → pt-KSBWHAVQ-mhvhgr2p.js} +9 -9
- package/dist/{pt-YI4VE4YQ-v7gjeg82.js → pt-YI4VE4YQ-wdkn2dcf.js} +52 -52
- package/dist/ro-4TMBHS5M-jz0anpt6.js +35 -0
- package/dist/{ro-BJFER5OI-334n28rj.js → ro-BJFER5OI-83tq8vxh.js} +46 -46
- package/dist/{ro-2VALF3S5-NXBJUEZN-nqw1zs33.js → ro-KTNQ3MNU-XIE6YPQN-gen8p82z.js} +857 -845
- package/dist/{ro-2VALF3S5-cdz5afkr.js → ro-KTNQ3MNU-y08n1x5g.js} +857 -845
- package/dist/{ro-RKXZUG7Z-cm3xn3fj.js → ro-RKXZUG7Z-nndrrsq7.js} +52 -52
- package/dist/{ro-VZUZTAMR-tccygznf.js → ro-VZUZTAMR-f4q0g3em.js} +9 -9
- package/dist/{ru-GSCT4ARZ-qj8dm4dp.js → ru-GSCT4ARZ-1sa9wbr8.js} +1 -1
- package/dist/{ru-GSCT4ARZ-FTVCGQTL-5nh4jf2e.js → ru-GSCT4ARZ-FTVCGQTL-gee86v14.js} +1 -1
- package/dist/{ru-T73OPRTC-mp5gn7gs.js → ru-T73OPRTC-4knxw497.js} +1 -1
- package/dist/{ru-WBLQ5B2U-awt245ky.js → ru-WBLQ5B2U-8r3c7v6d.js} +1 -1
- package/dist/ru-WBLQ5B2U-kdey8qa4.js +10 -0
- package/dist/{ru-WBLQ5B2U-57ezmxzz.js → ru-WBLQ5B2U-wemdzdqd.js} +1 -1
- package/dist/{serialization-GAW7UFOK-9hkdmmd2.js → serialization-J5QK3HPY-bgewpt6f.js} +158 -152
- package/dist/services/expression-validator.d.ts +28 -0
- package/dist/services/flow-eval-schema/types.d.ts +17 -0
- package/dist/services/flow-validate-service.d.ts +26 -0
- package/dist/services/node-validators/js-expression-syntax-validator.d.ts +6 -3
- package/dist/services/tidy-service.d.ts +26 -0
- package/dist/services/vars-reference-rule.d.ts +156 -0
- package/dist/shared-utils-8xdq6f04.js +20 -0
- package/dist/tidy-service-ashgyfwj.js +34 -0
- package/dist/tool.js +30 -33
- package/dist/{tr-AA6O2WSR-ga1xnymp.js → tr-AA6O2WSR-86ba4bdf.js} +52 -52
- package/dist/tr-GSQQ6SOT-hv1gyeaa.js +35 -0
- package/dist/{tr-RQTZ2DMS-bpgd4kma.js → tr-RQTZ2DMS-w3cwv8s4.js} +46 -46
- package/dist/{tr-W4AVRSQ4-bt3qqqdy.js → tr-W4AVRSQ4-hjr81xzk.js} +9 -9
- package/dist/{tr-RIFCEXFH-BZS7S7QK-q465b62g.js → tr-XHSSPNK7-GW5KVXR3-2w3f1ss6.js} +857 -845
- package/dist/{tr-RIFCEXFH-hgkb4g8y.js → tr-XHSSPNK7-cmqyc4wd.js} +857 -845
- package/dist/utils/handle-expansion.d.ts +16 -0
- package/dist/validation.js +47 -27
- package/dist/variable-service-er7ph4br.js +152 -0
- package/dist/wait-for-flow-job-45p1a444.js +134 -0
- package/dist/{zh-CN-IP3FMXWM-H3JI2XUM-ta4yac7h.js → zh-CN-2EHQT23P-T5XRQCVS-ac17dpc1.js} +857 -845
- package/dist/{zh-CN-IP3FMXWM-1cfarhcp.js → zh-CN-2EHQT23P-mr63c4xz.js} +857 -845
- package/dist/{zh-CN-6YRAN57T-j7jp34ws.js → zh-CN-6YRAN57T-rd7x2tqs.js} +9 -9
- package/dist/zh-CN-EDFRBU32-vvj7tmaq.js +35 -0
- package/dist/{zh-CN-R2KLHXQV-wttmznep.js → zh-CN-R2KLHXQV-agqr45ds.js} +52 -52
- package/dist/{zh-CN-ZC6LT4IN-vty9mvv8.js → zh-CN-ZC6LT4IN-kbzvvzz5.js} +46 -46
- package/dist/zh-TW-HAICM6DE-rh7k3cq7.js +35 -0
- package/dist/{zh-TW-AGIDXIPF-R4XZRDJZ-cgxxz5k4.js → zh-TW-MGZCE5BT-P6FLIUAR-zmq07vhs.js} +857 -845
- package/dist/{zh-TW-AGIDXIPF-n6r6w7vy.js → zh-TW-MGZCE5BT-c4ekmrz9.js} +857 -845
- package/dist/{zh-TW-R7Y5KVMU-q81f4z2p.js → zh-TW-R7Y5KVMU-m61y07e3.js} +46 -46
- package/dist/{zh-TW-RJGCQANM-gqn0aca0.js → zh-TW-RJGCQANM-w0x3qc1p.js} +52 -52
- package/dist/{zh-TW-SO2245GN-m5kh88bg.js → zh-TW-SO2245GN-n2bn1gg4.js} +9 -9
- package/package.json +2 -2
- package/dist/de-5KVP66U6-t37qr521.js +0 -161
- package/dist/de-WMKOGI7B-6dc1zdnp.js +0 -143
- package/dist/en-4KXU7N7B-24v330b5.js +0 -118
- package/dist/en-X4DLPKLJ-1h9gj5c1.js +0 -110
- package/dist/es-BVPGJUWA-0k59eqfv.js +0 -143
- package/dist/es-MX-U6YL5KQX-k4qvpgd4.js +0 -143
- package/dist/es-MX-XAVLOQW3-47a405kf.js +0 -161
- package/dist/es-VFPNVMP5-6sftsdxe.js +0 -161
- package/dist/fr-E5MDO4EG-f3x1jeqw.js +0 -161
- package/dist/fr-EKTTDR7Z-m2t68j0m.js +0 -143
- package/dist/ja-DPO5PPLO-fmbg7zt2.js +0 -161
- package/dist/ja-Y2YBTXNN-5sszk2zv.js +0 -143
- package/dist/ko-ITOPNIYI-aqy82jk8.js +0 -161
- package/dist/ko-S33XAV26-rfsv9myd.js +0 -143
- package/dist/packager-tool-0sz8se22.js +0 -10671
- package/dist/packager-tool-8mqydhz8.js +0 -9850
- package/dist/packager-tool-p9j43p8h.js +0 -115
- package/dist/packager-tool-v74yk918.js +0 -107
- package/dist/packager-tool-xj0agqpk.js +0 -11
- package/dist/pt-BR-BXURWX4W-xzyndmrx.js +0 -161
- package/dist/pt-BR-JO45SCNI-mt93s33c.js +0 -143
- package/dist/pt-W3NA4LIZ-fwd1q4j0.js +0 -143
- package/dist/pt-YI4VE4YQ-521681zf.js +0 -161
- package/dist/ro-RKXZUG7Z-pdztdafr.js +0 -161
- package/dist/ro-WLKX6HF5-b9tj8q67.js +0 -143
- package/dist/ru-WBLQ5B2U-8xd4gpv2.js +0 -10
- package/dist/ru-WBLQ5B2U-mswqs9wc.js +0 -10
- package/dist/tr-3U2W2XCA-43ptfc0m.js +0 -143
- package/dist/tr-AA6O2WSR-bj9n80k8.js +0 -161
- package/dist/zh-CN-IPZYQR3P-egjmvyjf.js +0 -143
- package/dist/zh-CN-R2KLHXQV-x6gnk2n0.js +0 -161
- package/dist/zh-TW-RJGCQANM-tt8j5wv2.js +0 -161
- package/dist/zh-TW-YPVSQVGT-b378ztph.js +0 -143
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
en_default
|
|
3
|
+
} from "./packager-tool-a42jnpy5.js";
|
|
4
|
+
import {
|
|
5
|
+
__glob
|
|
6
|
+
} from "./packager-tool-c23zrhj8.js";
|
|
7
|
+
import {
|
|
8
|
+
__require
|
|
9
|
+
} from "./packager-tool-1yh8g550.js";
|
|
10
|
+
|
|
11
|
+
// ../../node_modules/@uipath/flow-schema/dist/chunk-IUN2JAAB.js
|
|
12
|
+
var SUPPORTED_LOCALES = ["en", "es", "pt", "de", "fr", "ja", "ko", "ru", "tr", "ro", "zh-CN", "zh-TW", "pt-BR", "es-MX"];
|
|
13
|
+
var DEFAULT_LOCALE = "en";
|
|
14
|
+
function normalizeCasing(locale) {
|
|
15
|
+
const [language, country] = locale.split("-");
|
|
16
|
+
return country ? `${language}-${country.toUpperCase()}` : language;
|
|
17
|
+
}
|
|
18
|
+
function normalizeLocale(locale) {
|
|
19
|
+
const cased = normalizeCasing(locale);
|
|
20
|
+
const supported = SUPPORTED_LOCALES;
|
|
21
|
+
if (supported.includes(cased))
|
|
22
|
+
return cased;
|
|
23
|
+
const base = cased.split("-")[0];
|
|
24
|
+
if (supported.includes(base))
|
|
25
|
+
return base;
|
|
26
|
+
return DEFAULT_LOCALE;
|
|
27
|
+
}
|
|
28
|
+
function resolveSupportedLocale(locale) {
|
|
29
|
+
const cased = normalizeCasing(locale);
|
|
30
|
+
const supported = SUPPORTED_LOCALES;
|
|
31
|
+
if (supported.includes(cased))
|
|
32
|
+
return cased;
|
|
33
|
+
const base = cased.split("-")[0];
|
|
34
|
+
if (supported.includes(base))
|
|
35
|
+
return base;
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
var REGISTERED = /* @__PURE__ */ new WeakMap;
|
|
39
|
+
function createI18nRegistrar(options) {
|
|
40
|
+
const { namespace, englishBundle, loadCatalog } = options;
|
|
41
|
+
return (instance) => {
|
|
42
|
+
let registered = REGISTERED.get(instance);
|
|
43
|
+
if (registered?.has(namespace))
|
|
44
|
+
return;
|
|
45
|
+
if (!registered) {
|
|
46
|
+
registered = /* @__PURE__ */ new Set;
|
|
47
|
+
REGISTERED.set(instance, registered);
|
|
48
|
+
}
|
|
49
|
+
registered.add(namespace);
|
|
50
|
+
instance.addResourceBundle("en", namespace, englishBundle, true, true);
|
|
51
|
+
const loaded = { en: true };
|
|
52
|
+
const loadForLocale = async (lng) => {
|
|
53
|
+
const target = resolveSupportedLocale(lng);
|
|
54
|
+
if (!target || loaded[target])
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
const mod = await loadCatalog(target);
|
|
58
|
+
instance.addResourceBundle(target, namespace, mod.default, true, true);
|
|
59
|
+
loaded[target] = true;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.warn(`[i18n] Failed to load '${target}' catalog for namespace '${namespace}':`, err);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
instance.on("languageChanged", (lng) => {
|
|
65
|
+
loadForLocale(lng);
|
|
66
|
+
});
|
|
67
|
+
if (instance.language) {
|
|
68
|
+
loadForLocale(instance.language);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
var globImport_locales_json = __glob({
|
|
73
|
+
"../../locales/de.json": () => import("./de-5KVP66U6-1bnf4zt5.js"),
|
|
74
|
+
"../../locales/en.json": () => import("./en-X3S6IZ5J-nhkg6pwn.js"),
|
|
75
|
+
"../../locales/es-MX.json": () => import("./es-MX-XAVLOQW3-q00km2y7.js"),
|
|
76
|
+
"../../locales/es.json": () => import("./es-VFPNVMP5-bx2c337j.js"),
|
|
77
|
+
"../../locales/fr.json": () => import("./fr-E5MDO4EG-c3mkty2t.js"),
|
|
78
|
+
"../../locales/ja.json": () => import("./ja-DPO5PPLO-mysfmznx.js"),
|
|
79
|
+
"../../locales/ko.json": () => import("./ko-ITOPNIYI-hmxd2asd.js"),
|
|
80
|
+
"../../locales/pt-BR.json": () => import("./pt-BR-BXURWX4W-bwfcwhk1.js"),
|
|
81
|
+
"../../locales/pt.json": () => import("./pt-YI4VE4YQ-wdkn2dcf.js"),
|
|
82
|
+
"../../locales/ro.json": () => import("./ro-RKXZUG7Z-nndrrsq7.js"),
|
|
83
|
+
"../../locales/ru.json": () => import("./ru-WBLQ5B2U-8r3c7v6d.js"),
|
|
84
|
+
"../../locales/tr.json": () => import("./tr-AA6O2WSR-86ba4bdf.js"),
|
|
85
|
+
"../../locales/zh-CN.json": () => import("./zh-CN-R2KLHXQV-agqr45ds.js"),
|
|
86
|
+
"../../locales/zh-TW.json": () => import("./zh-TW-RJGCQANM-w0x3qc1p.js")
|
|
87
|
+
});
|
|
88
|
+
var VALIDATION_NAMESPACE = "validation";
|
|
89
|
+
var registerFlowSchemaI18n = createI18nRegistrar({
|
|
90
|
+
namespace: VALIDATION_NAMESPACE,
|
|
91
|
+
englishBundle: en_default,
|
|
92
|
+
loadCatalog: (lng) => globImport_locales_json(`../../locales/${lng}.json`)
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export { SUPPORTED_LOCALES, DEFAULT_LOCALE, normalizeLocale, resolveSupportedLocale, createI18nRegistrar, VALIDATION_NAMESPACE, registerFlowSchemaI18n };
|
|
96
|
+
|
|
97
|
+
//# debugId=9CA4D26B4AC47A9264756E2164756E21
|
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import {
|
|
2
|
+
catchError,
|
|
3
|
+
logger,
|
|
4
|
+
unsupportedSolutionProjectType
|
|
5
|
+
} from "./packager-tool-5qaxht3k.js";
|
|
6
|
+
|
|
7
|
+
// ../solution-sdk/src/solution-file.ts
|
|
8
|
+
var STUDIO_WEB_PROJECT_TYPE_OVERRIDES = {
|
|
9
|
+
ProcessOrchestration: "processOrchestration"
|
|
10
|
+
};
|
|
11
|
+
function normalizeProjectType(projectType) {
|
|
12
|
+
return STUDIO_WEB_PROJECT_TYPE_OVERRIDES[projectType] ?? projectType;
|
|
13
|
+
}
|
|
14
|
+
function toPortableRelativePath(relativePath) {
|
|
15
|
+
return relativePath.replace(/\\/g, "/");
|
|
16
|
+
}
|
|
17
|
+
async function readUipxFile(fs, solutionDir) {
|
|
18
|
+
const dirEntries = await fs.readdir(solutionDir);
|
|
19
|
+
const uipxFileName = dirEntries.find((f) => f.endsWith(".uipx"));
|
|
20
|
+
if (!uipxFileName) {
|
|
21
|
+
throw new Error(`No .uipx file found in ${solutionDir}. Run 'uip solution init' first.`);
|
|
22
|
+
}
|
|
23
|
+
const uipxContent = await fs.readFile(fs.path.join(solutionDir, uipxFileName), "utf-8");
|
|
24
|
+
if (!uipxContent) {
|
|
25
|
+
throw new Error(`Could not read .uipx file: ${uipxFileName} is empty or missing.`);
|
|
26
|
+
}
|
|
27
|
+
const [parseError, parsed] = catchError(() => JSON.parse(uipxContent));
|
|
28
|
+
if (parseError) {
|
|
29
|
+
throw new Error(`Invalid .uipx file: could not parse JSON in ${uipxFileName}.`);
|
|
30
|
+
}
|
|
31
|
+
const uipx = validateUipxFile(parsed, uipxFileName);
|
|
32
|
+
return { uipx, uipxFileName };
|
|
33
|
+
}
|
|
34
|
+
function validateUipxFile(parsed, uipxFileName) {
|
|
35
|
+
if (!isRecord(parsed)) {
|
|
36
|
+
throw new Error(`Invalid .uipx file: ${uipxFileName} must contain a JSON object.`);
|
|
37
|
+
}
|
|
38
|
+
if (typeof parsed.SolutionId !== "string" || !parsed.SolutionId.trim()) {
|
|
39
|
+
throw new Error("Invalid .uipx file: missing SolutionId.");
|
|
40
|
+
}
|
|
41
|
+
if (!Array.isArray(parsed.Projects) || parsed.Projects.length === 0) {
|
|
42
|
+
throw new Error("Invalid .uipx file: missing Projects.");
|
|
43
|
+
}
|
|
44
|
+
for (const [index, project] of parsed.Projects.entries()) {
|
|
45
|
+
if (!isRecord(project)) {
|
|
46
|
+
throw new Error(`Invalid .uipx file: Projects[${index}] must be an object.`);
|
|
47
|
+
}
|
|
48
|
+
if (typeof project.ProjectRelativePath !== "string" || !project.ProjectRelativePath.trim()) {
|
|
49
|
+
const pathHint = typeof project.Path === "string" ? " Found Path, but .uipx uses ProjectRelativePath." : "";
|
|
50
|
+
throw new Error(`Invalid .uipx file: Projects[${index}] is missing ProjectRelativePath.${pathHint} Use 'uip solution projects add' to add projects, or set ProjectRelativePath to the project file path, for example "Foo/project.uiproj".`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return parsed;
|
|
54
|
+
}
|
|
55
|
+
function isRecord(value) {
|
|
56
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
57
|
+
}
|
|
58
|
+
async function createSolutionManifest(fs, solutionDir, solutionName, options = {}) {
|
|
59
|
+
const resolvedDir = fs.path.resolve(solutionDir);
|
|
60
|
+
if (!(options.allowExistingDir && await fs.exists(resolvedDir))) {
|
|
61
|
+
await fs.mkdir(resolvedDir);
|
|
62
|
+
}
|
|
63
|
+
const solutionId = crypto.randomUUID();
|
|
64
|
+
const manifest = {
|
|
65
|
+
DocVersion: "1.0.0",
|
|
66
|
+
StudioMinVersion: "2025.10.0",
|
|
67
|
+
SolutionId: solutionId,
|
|
68
|
+
Projects: []
|
|
69
|
+
};
|
|
70
|
+
const solutionFile = fs.path.join(resolvedDir, `${solutionName}.uipx`);
|
|
71
|
+
await fs.writeFile(solutionFile, `${JSON.stringify(manifest, null, 2)}
|
|
72
|
+
`);
|
|
73
|
+
return {
|
|
74
|
+
solutionDir: resolvedDir,
|
|
75
|
+
solutionFile,
|
|
76
|
+
solutionId
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
var AUTO_SOLUTION_SUFFIX = "Solution";
|
|
80
|
+
async function autoScaffoldSolution(fs, baseDir, projectName) {
|
|
81
|
+
const solutionName = `${projectName}${AUTO_SOLUTION_SUFFIX}`;
|
|
82
|
+
const solutionDir = fs.path.resolve(baseDir, solutionName);
|
|
83
|
+
const expectedSolutionFile = fs.path.join(solutionDir, `${solutionName}.uipx`);
|
|
84
|
+
if (await fs.exists(expectedSolutionFile)) {
|
|
85
|
+
return {
|
|
86
|
+
Name: solutionName,
|
|
87
|
+
Path: solutionDir,
|
|
88
|
+
SolutionFile: expectedSolutionFile
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const { solutionFile } = await createSolutionManifest(fs, solutionDir, solutionName, { allowExistingDir: true });
|
|
92
|
+
return {
|
|
93
|
+
Name: solutionName,
|
|
94
|
+
Path: solutionDir,
|
|
95
|
+
SolutionFile: solutionFile
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async function prepareProjectLocation(fs, candidateProjectDir, projectName, options = {}) {
|
|
99
|
+
const resolved = fs.path.resolve(candidateProjectDir);
|
|
100
|
+
if (options.skipRegistration) {
|
|
101
|
+
return { projectDir: resolved };
|
|
102
|
+
}
|
|
103
|
+
const discovery = await findNearestParentUipxFile(fs, resolved);
|
|
104
|
+
if (discovery.status !== "notFound") {
|
|
105
|
+
return { projectDir: resolved };
|
|
106
|
+
}
|
|
107
|
+
const baseDir = fs.path.dirname(resolved);
|
|
108
|
+
const autoCreatedSolution = await autoScaffoldSolution(fs, baseDir, projectName);
|
|
109
|
+
const projectDir = fs.path.join(autoCreatedSolution.Path, projectName);
|
|
110
|
+
await warnIfCandidateDirShadowed(fs, resolved, projectDir);
|
|
111
|
+
return { projectDir, autoCreatedSolution };
|
|
112
|
+
}
|
|
113
|
+
async function warnIfCandidateDirShadowed(fs, candidateDir, projectDir) {
|
|
114
|
+
const [, exists] = await catchError(fs.exists(candidateDir));
|
|
115
|
+
if (!exists) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const [, entries] = await catchError(fs.readdir(candidateDir));
|
|
119
|
+
if (!entries || entries.length === 0) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
logger.warn(`An existing directory "${candidateDir}" was left untouched. ` + `The project was created inside the auto-created solution at "${projectDir}". ` + "Run init from inside an existing solution, or pass --skip-solution-registration, if you meant to use the existing directory.");
|
|
123
|
+
}
|
|
124
|
+
function resolveSolutionDir(fs, inputPath) {
|
|
125
|
+
const resolved = fs.path.resolve(inputPath);
|
|
126
|
+
if (resolved.endsWith(".uipx")) {
|
|
127
|
+
return fs.path.dirname(resolved);
|
|
128
|
+
}
|
|
129
|
+
return resolved;
|
|
130
|
+
}
|
|
131
|
+
async function updateUipxSolutionId(fs, uipxPath, newSolutionId) {
|
|
132
|
+
const [readError, content] = await catchError(fs.readFile(uipxPath, "utf-8"));
|
|
133
|
+
if (readError || !content) {
|
|
134
|
+
logger.error(`Could not read .uipx file for update: ${readError?.message ?? "empty file"}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const [parseError, parsed] = catchError(() => JSON.parse(content));
|
|
138
|
+
if (parseError) {
|
|
139
|
+
logger.error(`Could not parse .uipx file for update: ${parseError.message}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
parsed.SolutionId = newSolutionId;
|
|
143
|
+
const [writeError] = await catchError(fs.writeFile(uipxPath, JSON.stringify(parsed, null, 4)));
|
|
144
|
+
if (writeError) {
|
|
145
|
+
logger.error(`Could not update .uipx with new SolutionId: ${writeError.message}`);
|
|
146
|
+
} else {
|
|
147
|
+
logger.info(`Updated .uipx with Studio Web SolutionId: ${newSolutionId}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function findSolutionFile(fs, projectPath) {
|
|
151
|
+
const parentDir = fs.path.resolve(projectPath, "..");
|
|
152
|
+
const [dirError, entries] = await catchError(fs.readdir(parentDir));
|
|
153
|
+
if (dirError) {
|
|
154
|
+
logger.error(`Could not read parent directory for .uipx file: ${dirError.message}`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const uipxFile = entries.find((entry) => entry.endsWith(".uipx"));
|
|
158
|
+
if (!uipxFile) {
|
|
159
|
+
logger.info("No .uipx solution file found in parent directory.");
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const uipxPath = fs.path.join(parentDir, uipxFile);
|
|
163
|
+
const [readError, content] = await catchError(fs.readFile(uipxPath, "utf-8"));
|
|
164
|
+
if (readError || content === null) {
|
|
165
|
+
logger.error(`Could not read .uipx file: ${readError?.message ?? "file returned null"}`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const [parseError, parsed] = catchError(() => JSON.parse(content));
|
|
169
|
+
if (parseError) {
|
|
170
|
+
logger.error(`Could not parse .uipx file: ${parseError.message}`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const solutionId = parsed.SolutionId;
|
|
174
|
+
const projectId = parsed.Projects?.[0]?.Id;
|
|
175
|
+
if (!solutionId) {
|
|
176
|
+
logger.info("No SolutionId found in .uipx file.");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
logger.info(`Found solution file: ${uipxFile} (SolutionId: ${solutionId})`);
|
|
180
|
+
return {
|
|
181
|
+
solutionId,
|
|
182
|
+
projectId: projectId ?? crypto.randomUUID()
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
async function updateSolutionFile(fs, projectPath, newSolutionId) {
|
|
186
|
+
const parentDir = fs.path.resolve(projectPath, "..");
|
|
187
|
+
const [dirError, entries] = await catchError(fs.readdir(parentDir));
|
|
188
|
+
if (dirError)
|
|
189
|
+
return;
|
|
190
|
+
const uipxFile = entries.find((entry) => entry.endsWith(".uipx"));
|
|
191
|
+
if (!uipxFile)
|
|
192
|
+
return;
|
|
193
|
+
const uipxPath = fs.path.join(parentDir, uipxFile);
|
|
194
|
+
await updateUipxSolutionId(fs, uipxPath, newSolutionId);
|
|
195
|
+
}
|
|
196
|
+
async function tryRegisterProjectInParentSolution(fs, projectDir, options) {
|
|
197
|
+
if (options?.skipRegistration) {
|
|
198
|
+
return {
|
|
199
|
+
Status: "OptedOut",
|
|
200
|
+
Message: "Solution auto-registration skipped (--skip-solution-registration).",
|
|
201
|
+
Instructions: buildOptedOutInstructions(fs.path.resolve(projectDir))
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const [registrationError, registration] = await catchError(registerProjectInParentSolution(fs, projectDir));
|
|
205
|
+
if (registrationError) {
|
|
206
|
+
return {
|
|
207
|
+
Status: "Failed",
|
|
208
|
+
Message: "Project registration failed.",
|
|
209
|
+
Instructions: buildRegistrationFailureInstructions(projectDir, registrationError.message)
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return registration;
|
|
213
|
+
}
|
|
214
|
+
async function registerProjectInParentSolution(fs, projectDir) {
|
|
215
|
+
const resolvedProjectDir = fs.path.resolve(projectDir);
|
|
216
|
+
const discovery = await findNearestParentUipxFile(fs, resolvedProjectDir);
|
|
217
|
+
if (discovery.status === "notFound") {
|
|
218
|
+
return {
|
|
219
|
+
Status: "NotInSolution",
|
|
220
|
+
Message: "Project created in standalone mode; no parent .uipx solution found.",
|
|
221
|
+
Instructions: buildStandaloneInstructions(resolvedProjectDir)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (discovery.status === "skipped") {
|
|
225
|
+
return discovery.registration;
|
|
226
|
+
}
|
|
227
|
+
const solutionFile = discovery.solutionFile;
|
|
228
|
+
const solutionDir = fs.path.dirname(solutionFile);
|
|
229
|
+
const relativeProjectDir = fs.path.relative(solutionDir, resolvedProjectDir);
|
|
230
|
+
if (relativeProjectDir === "" || relativeProjectDir.startsWith("..") || fs.path.isAbsolute(relativeProjectDir)) {
|
|
231
|
+
return {
|
|
232
|
+
Status: "Skipped",
|
|
233
|
+
Message: "Project registration skipped.",
|
|
234
|
+
Solution: solutionFile,
|
|
235
|
+
Instructions: `Project must reside within the solution folder.
|
|
236
|
+
Solution: ${solutionDir}
|
|
237
|
+
Project: ${resolvedProjectDir}`
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const [projectFileError, projectFile] = await findProjectFile(fs, resolvedProjectDir);
|
|
241
|
+
if (projectFileError) {
|
|
242
|
+
return {
|
|
243
|
+
Status: "Failed",
|
|
244
|
+
Message: "Project registration failed.",
|
|
245
|
+
Solution: solutionFile,
|
|
246
|
+
Instructions: buildRegistrationFailureInstructions(resolvedProjectDir, projectFileError.message)
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const [projectManifestError, projectManifest] = await readProjectManifest(fs, projectFile.filePath, projectFile.useProjectJson);
|
|
250
|
+
if (projectManifestError) {
|
|
251
|
+
return {
|
|
252
|
+
Status: "Failed",
|
|
253
|
+
Message: "Project registration failed.",
|
|
254
|
+
Solution: solutionFile,
|
|
255
|
+
Instructions: buildRegistrationFailureInstructions(resolvedProjectDir, projectManifestError.message)
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const unsupportedReason = unsupportedSolutionProjectType(projectManifest.projectType);
|
|
259
|
+
if (unsupportedReason) {
|
|
260
|
+
return {
|
|
261
|
+
Status: "Skipped",
|
|
262
|
+
Message: "Project registration skipped.",
|
|
263
|
+
Solution: solutionFile,
|
|
264
|
+
Instructions: unsupportedReason
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const projectRelativePath = toPortableRelativePath(fs.path.join(relativeProjectDir, projectFile.fileName));
|
|
268
|
+
const [solutionError, solution] = await readSolutionManifest(fs, solutionFile);
|
|
269
|
+
if (solutionError) {
|
|
270
|
+
return {
|
|
271
|
+
Status: "Failed",
|
|
272
|
+
Message: "Project registration failed.",
|
|
273
|
+
Solution: solutionFile,
|
|
274
|
+
Project: projectRelativePath,
|
|
275
|
+
Instructions: buildRegistrationFailureInstructions(resolvedProjectDir, solutionError.message)
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const existingProject = solution.projects.find((project) => toPortableRelativePath(project.ProjectRelativePath) === projectRelativePath);
|
|
279
|
+
if (existingProject) {
|
|
280
|
+
return {
|
|
281
|
+
Status: "AlreadyRegistered",
|
|
282
|
+
Message: "Project already registered in solution.",
|
|
283
|
+
Solution: solutionFile,
|
|
284
|
+
Project: projectRelativePath,
|
|
285
|
+
ProjectId: typeof existingProject.Id === "string" ? existingProject.Id : undefined,
|
|
286
|
+
Instructions: buildRegistrationSuccessInstructions(solutionDir)
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const projectId = crypto.randomUUID();
|
|
290
|
+
solution.projects.push({
|
|
291
|
+
Type: normalizeProjectType(projectManifest.projectType),
|
|
292
|
+
ProjectRelativePath: projectRelativePath,
|
|
293
|
+
Id: projectId
|
|
294
|
+
});
|
|
295
|
+
solution.content.Projects = solution.projects;
|
|
296
|
+
const [writeError] = await catchError(fs.writeFile(solutionFile, `${JSON.stringify(solution.content, null, 2)}
|
|
297
|
+
`));
|
|
298
|
+
if (writeError) {
|
|
299
|
+
return {
|
|
300
|
+
Status: "Failed",
|
|
301
|
+
Message: "Project registration failed.",
|
|
302
|
+
Solution: solutionFile,
|
|
303
|
+
Project: projectRelativePath,
|
|
304
|
+
Instructions: buildRegistrationFailureInstructions(resolvedProjectDir, writeError.message)
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
Status: "Registered",
|
|
309
|
+
Message: "Project registered in parent solution.",
|
|
310
|
+
Solution: solutionFile,
|
|
311
|
+
Project: projectRelativePath,
|
|
312
|
+
ProjectId: projectId,
|
|
313
|
+
Instructions: buildRegistrationSuccessInstructions(solutionDir)
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
async function findNearestParentUipxFile(fs, projectDir) {
|
|
317
|
+
let currentDir = fs.path.dirname(fs.path.resolve(projectDir));
|
|
318
|
+
while (true) {
|
|
319
|
+
const [readDirError, entries] = await catchError(fs.readdir(currentDir));
|
|
320
|
+
if (readDirError) {
|
|
321
|
+
return {
|
|
322
|
+
status: "skipped",
|
|
323
|
+
registration: {
|
|
324
|
+
Status: "Failed",
|
|
325
|
+
Message: "Project registration failed.",
|
|
326
|
+
Instructions: buildRegistrationFailureInstructions(projectDir, `Could not inspect parent directory for a solution: ${currentDir}
|
|
327
|
+
${readDirError.message}`)
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
const solutionFiles = entries.filter((entry) => entry.endsWith(".uipx"));
|
|
332
|
+
if (solutionFiles.length > 1) {
|
|
333
|
+
return {
|
|
334
|
+
status: "skipped",
|
|
335
|
+
registration: {
|
|
336
|
+
Status: "Skipped",
|
|
337
|
+
Message: "Project registration skipped.",
|
|
338
|
+
Instructions: `Found multiple .uipx files in ${currentDir}: ${solutionFiles.join(", ")}. Run 'uip solution projects add "${projectDir}" <solution.uipx>' to choose one.`
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
if (solutionFiles.length === 1) {
|
|
343
|
+
return {
|
|
344
|
+
status: "found",
|
|
345
|
+
solutionFile: fs.path.join(currentDir, solutionFiles[0])
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
const parentDir = fs.path.dirname(currentDir);
|
|
349
|
+
if (parentDir === currentDir) {
|
|
350
|
+
return { status: "notFound" };
|
|
351
|
+
}
|
|
352
|
+
currentDir = parentDir;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async function findProjectFile(fs, projectDir) {
|
|
356
|
+
const uiprojPath = fs.path.join(projectDir, "project.uiproj");
|
|
357
|
+
if (await fs.exists(uiprojPath)) {
|
|
358
|
+
return [
|
|
359
|
+
null,
|
|
360
|
+
{
|
|
361
|
+
filePath: uiprojPath,
|
|
362
|
+
fileName: "project.uiproj",
|
|
363
|
+
useProjectJson: false
|
|
364
|
+
}
|
|
365
|
+
];
|
|
366
|
+
}
|
|
367
|
+
const jsonProjectPath = fs.path.join(projectDir, "project.json");
|
|
368
|
+
if (await fs.exists(jsonProjectPath)) {
|
|
369
|
+
return [
|
|
370
|
+
null,
|
|
371
|
+
{
|
|
372
|
+
filePath: jsonProjectPath,
|
|
373
|
+
fileName: "project.json",
|
|
374
|
+
useProjectJson: true
|
|
375
|
+
}
|
|
376
|
+
];
|
|
377
|
+
}
|
|
378
|
+
return [
|
|
379
|
+
new Error(`No project file found in ${projectDir}. Expected project.uiproj or project.json.`),
|
|
380
|
+
null
|
|
381
|
+
];
|
|
382
|
+
}
|
|
383
|
+
async function readProjectManifest(fs, filePath, useProjectJson) {
|
|
384
|
+
const [readError, rawContent] = await catchError(fs.readFile(filePath, "utf-8"));
|
|
385
|
+
if (readError || !rawContent) {
|
|
386
|
+
return [readError ?? new Error(`Unable to read ${filePath}.`), null];
|
|
387
|
+
}
|
|
388
|
+
const [parseError, parsed] = catchError(() => JSON.parse(rawContent));
|
|
389
|
+
if (parseError) {
|
|
390
|
+
return [
|
|
391
|
+
new Error(`Invalid JSON in project file: ${parseError.message}`),
|
|
392
|
+
null
|
|
393
|
+
];
|
|
394
|
+
}
|
|
395
|
+
if (!isRecord(parsed)) {
|
|
396
|
+
return [new Error(`Invalid project file: ${filePath}`), null];
|
|
397
|
+
}
|
|
398
|
+
const designOptions = parsed.designOptions;
|
|
399
|
+
const outputType = useProjectJson && isRecord(designOptions) ? readString(designOptions.outputType) : undefined;
|
|
400
|
+
const projectType = outputType ?? readString(parsed.ProjectType);
|
|
401
|
+
if (!projectType) {
|
|
402
|
+
return [new Error(`ProjectType not found in ${filePath}`), null];
|
|
403
|
+
}
|
|
404
|
+
return [
|
|
405
|
+
null,
|
|
406
|
+
{
|
|
407
|
+
projectType
|
|
408
|
+
}
|
|
409
|
+
];
|
|
410
|
+
}
|
|
411
|
+
async function readSolutionManifest(fs, solutionFile) {
|
|
412
|
+
const [readError, rawContent] = await catchError(fs.readFile(solutionFile, "utf-8"));
|
|
413
|
+
if (readError || !rawContent) {
|
|
414
|
+
return [
|
|
415
|
+
readError ?? new Error(`Unable to read solution file: ${solutionFile}`),
|
|
416
|
+
null
|
|
417
|
+
];
|
|
418
|
+
}
|
|
419
|
+
const [parseError, parsed] = catchError(() => JSON.parse(rawContent));
|
|
420
|
+
if (parseError) {
|
|
421
|
+
return [
|
|
422
|
+
new Error(`Invalid JSON in solution file: ${parseError.message}`),
|
|
423
|
+
null
|
|
424
|
+
];
|
|
425
|
+
}
|
|
426
|
+
if (!isRecord(parsed)) {
|
|
427
|
+
return [
|
|
428
|
+
new Error(`Invalid solution file: ${solutionFile} must contain a JSON object.`),
|
|
429
|
+
null
|
|
430
|
+
];
|
|
431
|
+
}
|
|
432
|
+
if (!Array.isArray(parsed.Projects)) {
|
|
433
|
+
return [
|
|
434
|
+
new Error(`Invalid solution file: ${solutionFile} must contain a Projects array.`),
|
|
435
|
+
null
|
|
436
|
+
];
|
|
437
|
+
}
|
|
438
|
+
const projects = [];
|
|
439
|
+
for (const [index, project] of parsed.Projects.entries()) {
|
|
440
|
+
if (!isRecord(project)) {
|
|
441
|
+
return [
|
|
442
|
+
new Error(`Invalid solution file: Projects[${index}] must be an object.`),
|
|
443
|
+
null
|
|
444
|
+
];
|
|
445
|
+
}
|
|
446
|
+
const projectRelativePath = readString(project.ProjectRelativePath);
|
|
447
|
+
if (!projectRelativePath) {
|
|
448
|
+
return [
|
|
449
|
+
new Error(`Invalid solution file: Projects[${index}] is missing ProjectRelativePath. Use 'uip solution projects add' to repair the manifest.`),
|
|
450
|
+
null
|
|
451
|
+
];
|
|
452
|
+
}
|
|
453
|
+
projects.push({
|
|
454
|
+
...project,
|
|
455
|
+
Type: readString(project.Type) ?? "",
|
|
456
|
+
ProjectRelativePath: projectRelativePath,
|
|
457
|
+
Id: readString(project.Id) ?? ""
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
return [null, { content: parsed, projects }];
|
|
461
|
+
}
|
|
462
|
+
function readString(value) {
|
|
463
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
464
|
+
}
|
|
465
|
+
function buildRegistrationSuccessInstructions(solutionDir) {
|
|
466
|
+
return [
|
|
467
|
+
"The project is listed in the parent solution manifest.",
|
|
468
|
+
"Packing or uploading the solution will sync solution resources automatically.",
|
|
469
|
+
`To sync resources before packaging, run 'uip solution resources refresh --solution-folder "${solutionDir}"'.`
|
|
470
|
+
].join(`
|
|
471
|
+
`);
|
|
472
|
+
}
|
|
473
|
+
function buildRegistrationFailureInstructions(projectDir, details) {
|
|
474
|
+
return [
|
|
475
|
+
"Automatic solution registration could not complete.",
|
|
476
|
+
`Run 'uip solution projects add "${projectDir}" <solution.uipx>' after checking the project and solution files.`,
|
|
477
|
+
`Details: ${details}`
|
|
478
|
+
].join(`
|
|
479
|
+
`);
|
|
480
|
+
}
|
|
481
|
+
function buildStandaloneInstructions(projectDir) {
|
|
482
|
+
return [
|
|
483
|
+
"No parent solution was found by walking ancestor directories.",
|
|
484
|
+
"Studio Web upload, `flow debug`, and packaging require an enclosing solution.",
|
|
485
|
+
`To link this project to a solution, run 'uip solution init "<SolutionName>"' then 'uip solution projects add "${projectDir}" <SolutionName>.uipx'.`
|
|
486
|
+
].join(`
|
|
487
|
+
`);
|
|
488
|
+
}
|
|
489
|
+
function buildOptedOutInstructions(projectDir) {
|
|
490
|
+
return [
|
|
491
|
+
"Automatic solution registration was skipped because --skip-solution-registration was passed.",
|
|
492
|
+
`To register this project later, run 'uip solution projects add "${projectDir}" <SolutionName>.uipx' from within the solution.`
|
|
493
|
+
].join(`
|
|
494
|
+
`);
|
|
495
|
+
}
|
|
496
|
+
async function isProjectRegisteredInSolution(fs, projectDir, solutionFile) {
|
|
497
|
+
const [readErr, manifest] = await readSolutionManifest(fs, solutionFile);
|
|
498
|
+
if (readErr) {
|
|
499
|
+
throw readErr;
|
|
500
|
+
}
|
|
501
|
+
if (!manifest) {
|
|
502
|
+
throw new Error(`Unable to read solution manifest: ${solutionFile}`);
|
|
503
|
+
}
|
|
504
|
+
const solutionDir = fs.path.dirname(solutionFile);
|
|
505
|
+
const projectDirReal = await canonicalizePath(fs, projectDir);
|
|
506
|
+
for (const project of manifest.projects) {
|
|
507
|
+
const candidateDir = fs.path.resolve(solutionDir, fs.path.dirname(toPortableRelativePath(project.ProjectRelativePath)));
|
|
508
|
+
const candidateReal = await canonicalizePath(fs, candidateDir);
|
|
509
|
+
if (candidateReal === projectDirReal) {
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
async function canonicalizePath(fs, p) {
|
|
516
|
+
const [err, real] = await catchError(fs.realpath(p));
|
|
517
|
+
return err || !real ? p : real;
|
|
518
|
+
}
|
|
519
|
+
async function findSolutionFileUpward(fs, startDir) {
|
|
520
|
+
let dir = startDir;
|
|
521
|
+
while (true) {
|
|
522
|
+
const entries = await fs.readdir(dir);
|
|
523
|
+
const files = entries.filter((f) => f.endsWith(".uipx"));
|
|
524
|
+
if (files.length === 1) {
|
|
525
|
+
return fs.path.join(dir, files[0]);
|
|
526
|
+
}
|
|
527
|
+
if (files.length > 1) {
|
|
528
|
+
throw new Error(`Multiple .uipx files found in ${dir}. Please specify which solution file to use.`);
|
|
529
|
+
}
|
|
530
|
+
const parent = fs.path.dirname(dir);
|
|
531
|
+
if (parent === dir) {
|
|
532
|
+
throw new Error(`No .uipx solution file found (searched from ${startDir} to filesystem root)`);
|
|
533
|
+
}
|
|
534
|
+
dir = parent;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export { normalizeProjectType, toPortableRelativePath, readUipxFile, createSolutionManifest, autoScaffoldSolution, prepareProjectLocation, resolveSolutionDir, updateUipxSolutionId, findSolutionFile, updateSolutionFile, tryRegisterProjectInParentSolution, findNearestParentUipxFile, readSolutionManifest, isProjectRegisteredInSolution, findSolutionFileUpward };
|
|
539
|
+
|
|
540
|
+
//# debugId=C68E91587DBDE36C64756E2164756E21
|