@malloy-publisher/server 0.0.109 → 0.0.111
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/app/assets/{Chip-DulNumvr.js → Chip-DFxjDMYx.js} +1 -1
- package/dist/app/assets/{Container-Dn_IEeIp.js → Container-DvcpwYS4.js} +1 -1
- package/dist/app/assets/{DialogTitle-CBoB5s1x.js → DialogTitle-D-8JHIhX.js} +1 -1
- package/dist/app/assets/{Edit-CnTAusNy.js → Edit-CY66B5e8.js} +1 -1
- package/dist/app/assets/FormControlContext-BW02KQZu.js +1 -0
- package/dist/app/assets/HomePage-Bov6-5AZ.js +3 -0
- package/dist/app/assets/{MainPage-6getdplb.js → MainPage-BYUYRBax.js} +1 -1
- package/dist/app/assets/{MenuItem-DE8NK-Xy.js → MenuItem-CpI-7eAr.js} +1 -1
- package/dist/app/assets/{Modal-PUsNPbDx.js → Modal-C-Euultz.js} +1 -1
- package/dist/app/assets/{ModelPage-Cuqbuu_v.js → ModelPage-BMg6IR4I.js} +2 -2
- package/dist/app/assets/{MoreVert-BqUb6vJH.js → MoreVert-BVtzLkHm.js} +1 -1
- package/dist/app/assets/{PackagePage-Cc5cjUZ9.js → PackagePage-Ca-5S4bY.js} +1 -1
- package/dist/app/assets/{ProjectPage-CJbF04bc.js → ProjectPage-Csve1erO.js} +1 -1
- package/dist/app/assets/{RouteError-CTlaesPV.js → RouteError-DVrYYQx8.js} +1 -1
- package/dist/app/assets/{WorkbookPage-CGJZfEXN.js → WorkbookPage-Bos3GG6c.js} +1 -1
- package/dist/app/assets/{index-BVlZ6i8j.js → index-B4eYfbqj.js} +1 -1
- package/dist/app/assets/{index-DycfvfsO.js → index-CUx2TJnu.js} +1 -1
- package/dist/app/assets/{index-DdF3z9Gd.js → index-CXVjjE47.js} +13 -13
- package/dist/app/assets/{index.es20-DlWN4z3R.js → index.es20-D_GGseeK.js} +1 -1
- package/dist/app/assets/{index.es23-BDdtxnbW.js → index.es23-BsVG9VR1.js} +2 -2
- package/dist/app/assets/{index.es310-AKXDC8rl.js → index.es311-B4I7CPCs.js} +1 -1
- package/dist/app/assets/{index.es311-CE0-K0fx.js → index.es312-D6Wb5Qbz.js} +1 -1
- package/dist/app/assets/{index.es314-CsD4AFJi.js → index.es315-De-j80TX.js} +1 -1
- package/dist/app/assets/{index.es319-BAaFF8nF.js → index.es320-BOD1ZJZT.js} +1 -1
- package/dist/app/assets/{index.es327-CLjg00CO.js → index.es328-CVyYL2Cb.js} +1 -1
- package/dist/app/assets/{index.es328-Dk49f56D.js → index.es329-C73tSnxx.js} +1 -1
- package/dist/app/assets/{index.es331-CNjOIk10.js → index.es332-pdJPCQ16.js} +1 -1
- package/dist/app/assets/{index.es335-BeNrivcI.js → index.es336-BW2O-pnR.js} +1 -1
- package/dist/app/assets/{index.es338-BhR7SkS5.js → index.es339-BaWHmQaH.js} +1 -1
- package/dist/app/assets/{index.es341-C_6PzCoq.js → index.es342-D2Lnssjt.js} +1 -1
- package/dist/app/assets/{index.es342-D1uAr8c1.js → index.es343-YbS6hTnA.js} +1 -1
- package/dist/app/assets/{index.es356-7PPXN4m3.js → index.es357-CoBUMGfg.js} +1 -1
- package/dist/app/assets/{index.es357-CJh2QG0N.js → index.es358-DbSm3pvF.js} +1 -1
- package/dist/app/assets/{index.es358-C_zZutkw.js → index.es359-DMGMoOZB.js} +1 -1
- package/dist/app/assets/{index.es360-DeQ44nE8.js → index.es361-BHceIWHs.js} +1 -1
- package/dist/app/assets/{index.es365-oFKdnBEe.js → index.es366-PXx-OsXN.js} +1 -1
- package/dist/app/assets/{index.es367-BUiiHWL7.js → index.es368-Cr9RaTtA.js} +1 -1
- package/dist/app/assets/{index.es368-Bb8Mmpp1.js → index.es369-C0mtzGRN.js} +1 -1
- package/dist/app/assets/{index.es373-C5Q5iXfG.js → index.es374-Drv5n-HJ.js} +1 -1
- package/dist/app/assets/{index.es374-s3ewK3v_.js → index.es375-U_De2V6q.js} +1 -1
- package/dist/app/assets/{index.es376-Dot0I9EF.js → index.es377-B3MRYiit.js} +1 -1
- package/dist/app/assets/{index.es377-B6TLwhtH.js → index.es378-DoTPPeUr.js} +1 -1
- package/dist/app/assets/{index.es378-mEifvHi6.js → index.es379-BPm5p9Tu.js} +1 -1
- package/dist/app/assets/{index.es381-DdV8KTBv.js → index.es382-DKIqkYbM.js} +1 -1
- package/dist/app/assets/{index.es383-B762Qvzb.js → index.es384-DXiKOUzH.js} +1 -1
- package/dist/app/assets/{index.es384-DBjLFE2E.js → index.es385-CLF2pcju.js} +1 -1
- package/dist/app/assets/{index.es385-DkDs29_v.js → index.es386-Bh-sEjq4.js} +1 -1
- package/dist/app/assets/{index.es391-BOBiTPht.js → index.es392-CRHao7mg.js} +1 -1
- package/dist/app/assets/{index.es392-BGdYwXRd.js → index.es393-Cm6sEy7_.js} +1 -1
- package/dist/app/assets/{index.es393-BnuSumNM.js → index.es394-B8ZpxCSt.js} +1 -1
- package/dist/app/assets/{index.es394-DMJpONen.js → index.es395-DkWbmmH5.js} +1 -1
- package/dist/app/assets/{index.es396-Dexy1Fdn.js → index.es397-CKDseQYx.js} +1 -1
- package/dist/app/assets/{index.es400-V_MXD6ds.js → index.es401-CtFcnffO.js} +1 -1
- package/dist/app/assets/{index.es401-CAcCA7it.js → index.es402-CxdH5hVg.js} +1 -1
- package/dist/app/assets/{index.es409-DgSxLsfq.js → index.es410-DUOnTx6Y.js} +1 -1
- package/dist/app/assets/{index.es412-wcTkTrNP.js → index.es413-o0g0o7a9.js} +1 -1
- package/dist/app/assets/{index.es415-hnSTt9Hn.js → index.es416-Dy45-wq4.js} +1 -1
- package/dist/app/assets/{index.es418-DwuHSZfi.js → index.es419-DltXKq7x.js} +1 -1
- package/dist/app/assets/{index.es422-DWsCMo9a.js → index.es423-CYo8sXPV.js} +1 -1
- package/dist/app/assets/{index.es424-CX2jVTDC.js → index.es425-8kqvQzEa.js} +1 -1
- package/dist/app/assets/{index.es432-DpOOpPot.js → index.es433-D_41FSTK.js} +1 -1
- package/dist/app/assets/{index.es433--E-hGrgp.js → index.es434-DeV3Y_jn.js} +1 -1
- package/dist/app/assets/{index.es440-NJaU5ncf.js → index.es441-Cj1Yw83T.js} +1 -1
- package/dist/app/assets/{index.es441-CR0Ohpvp.js → index.es442-BAhAeZbN.js} +1 -1
- package/dist/app/assets/{index.es451-sHTEx-Dl.js → index.es452-CPGmraR2.js} +1 -1
- package/dist/app/assets/{index.es455-9ZC7rz1G.js → index.es456-BdFu7nX3.js} +1 -1
- package/dist/app/assets/{index.es461-DAQjszqb.js → index.es462-D6GNpC-z.js} +1 -1
- package/dist/app/assets/{index.es466-sT_GOjPl.js → index.es467-ClH_GnCa.js} +1 -1
- package/dist/app/assets/{index.es467-D1qnNYJr.js → index.es468-Di3zYFeC.js} +1 -1
- package/dist/app/assets/{index.es469-DW1np4pg.js → index.es470-DgLPjbVB.js} +1 -1
- package/dist/app/assets/{index.es473-wVAdvQ6_.js → index.es474-B824aOrb.js} +1 -1
- package/dist/app/assets/{index.es475-CZM7KBU8.js → index.es476-BlPAYHhB.js} +1 -1
- package/dist/app/assets/{index.es477-OAyIdwW_.js → index.es478-BBy72e0U.js} +1 -1
- package/dist/app/assets/{index.es480-DSR8isSz.js → index.es481-Df-VYnz4.js} +1 -1
- package/dist/app/assets/{index.es481-CBydsWwB.js → index.es482-DNcoqtdL.js} +1 -1
- package/dist/app/assets/{index.es485-CJc4fpNV.js → index.es486-D8LYNoLQ.js} +1 -1
- package/dist/app/assets/{index.es487-C1wULFp4.js → index.es488-BUMxLwvA.js} +1 -1
- package/dist/app/assets/{index.es494-BLp6ucpV.js → index.es495-D-qd6FpS.js} +1 -1
- package/dist/app/assets/{index.es496-Tis1R15L.js → index.es497-LaARGtc9.js} +1 -1
- package/dist/app/assets/{index.es498-DnIxUf2o.js → index.es499-DUJgu_Bk.js} +1 -1
- package/dist/app/assets/{index.es502-DhEHE70J.js → index.es503-BJ9VRCwz.js} +1 -1
- package/dist/app/assets/{index.es512-B---8rhN.js → index.es513-DcdvkC6C.js} +1 -1
- package/dist/app/assets/{index.es513-BU_koFtA.js → index.es514-BR9aJ-oz.js} +1 -1
- package/dist/app/assets/{index.es520-ZlB1VPRK.js → index.es521-B5F1bSbk.js} +1 -1
- package/dist/app/assets/{index.es521-VBglaSPm.js → index.es522-DMB2cdTG.js} +1 -1
- package/dist/app/assets/index.es7-B-1xtkbo.js +1 -0
- package/dist/app/assets/{index.modern--uQhcQlR.js → index.modern-CUFHTrKB.js} +1 -1
- package/dist/app/assets/{index.umd-DraF67oa.js → index.umd-BkIL5b5A.js} +1 -1
- package/dist/app/assets/{listItemTextClasses-BY1YL8dW.js → listItemTextClasses-lEedVyO7.js} +1 -1
- package/dist/app/index.html +1 -1
- package/dist/server.js +6047 -1474
- package/package.json +1 -1
- package/src/server.ts +11 -0
- package/src/service/project.ts +11 -17
- package/src/service/project_store.ts +156 -47
- package/dist/app/assets/FormControlContext-BWbaVxQH.js +0 -1
- package/dist/app/assets/HomePage-vbEJVepI.js +0 -3
- package/dist/app/assets/index.es7-OgxBdVPl.js +0 -1
- /package/dist/app/assets/{index.es299-CG6Dc4jp.js → index.es300-CG6Dc4jp.js} +0 -0
- /package/dist/app/assets/{index.es307-DsBKuouk.js → index.es308-DsBKuouk.js} +0 -0
- /package/dist/app/assets/{index.es308-D_z4Izcz.js → index.es309-D_z4Izcz.js} +0 -0
- /package/dist/app/assets/{index.es309-727ZlQH0.js → index.es310-727ZlQH0.js} +0 -0
- /package/dist/app/assets/{index.es312-Dn00JSTd.js → index.es313-Dn00JSTd.js} +0 -0
- /package/dist/app/assets/{index.es313-COJ4H7py.js → index.es314-COJ4H7py.js} +0 -0
- /package/dist/app/assets/{index.es315-Bu5BbsvL.js → index.es316-Bu5BbsvL.js} +0 -0
- /package/dist/app/assets/{index.es316-7O62HKoU.js → index.es317-7O62HKoU.js} +0 -0
- /package/dist/app/assets/{index.es317-BPT9niGB.js → index.es318-BPT9niGB.js} +0 -0
- /package/dist/app/assets/{index.es318-Dhn9LcZ4.js → index.es319-Dhn9LcZ4.js} +0 -0
- /package/dist/app/assets/{index.es320-eg146-Ew.js → index.es321-eg146-Ew.js} +0 -0
- /package/dist/app/assets/{index.es321-Du268qiB.js → index.es322-Du268qiB.js} +0 -0
- /package/dist/app/assets/{index.es322-fje9CFhw.js → index.es323-fje9CFhw.js} +0 -0
- /package/dist/app/assets/{index.es323-BwXTMy5W.js → index.es324-BwXTMy5W.js} +0 -0
- /package/dist/app/assets/{index.es324-3xVqZejG.js → index.es325-3xVqZejG.js} +0 -0
- /package/dist/app/assets/{index.es325-xW4inM5L.js → index.es326-xW4inM5L.js} +0 -0
- /package/dist/app/assets/{index.es326-DHo0CJ0O.js → index.es327-DHo0CJ0O.js} +0 -0
- /package/dist/app/assets/{index.es329-C3t2pwGQ.js → index.es330-C3t2pwGQ.js} +0 -0
- /package/dist/app/assets/{index.es330-DNquZEk8.js → index.es331-DNquZEk8.js} +0 -0
- /package/dist/app/assets/{index.es332-BHOwM8T6.js → index.es333-BHOwM8T6.js} +0 -0
- /package/dist/app/assets/{index.es333-DxSadP1t.js → index.es334-DxSadP1t.js} +0 -0
- /package/dist/app/assets/{index.es334-DbXoA79R.js → index.es335-DbXoA79R.js} +0 -0
- /package/dist/app/assets/{index.es336-Bp6g37R7.js → index.es337-Bp6g37R7.js} +0 -0
- /package/dist/app/assets/{index.es337-sacFqUAJ.js → index.es338-sacFqUAJ.js} +0 -0
- /package/dist/app/assets/{index.es339-C7gG9l05.js → index.es340-C7gG9l05.js} +0 -0
- /package/dist/app/assets/{index.es340-Dsg_Bt_b.js → index.es341-Dsg_Bt_b.js} +0 -0
- /package/dist/app/assets/{index.es343-D9R-vmeu.js → index.es344-D9R-vmeu.js} +0 -0
- /package/dist/app/assets/{index.es344-BPhBrDlE.js → index.es345-BPhBrDlE.js} +0 -0
- /package/dist/app/assets/{index.es345-C-TU5hQ_.js → index.es346-C-TU5hQ_.js} +0 -0
- /package/dist/app/assets/{index.es346-DtFQj3wx.js → index.es347-DtFQj3wx.js} +0 -0
- /package/dist/app/assets/{index.es347-m2LEI-9-.js → index.es348-m2LEI-9-.js} +0 -0
- /package/dist/app/assets/{index.es348-BoXegm-a.js → index.es349-BoXegm-a.js} +0 -0
- /package/dist/app/assets/{index.es349-B9wLZaAG.js → index.es350-B9wLZaAG.js} +0 -0
- /package/dist/app/assets/{index.es350-ClGRhx96.js → index.es351-ClGRhx96.js} +0 -0
- /package/dist/app/assets/{index.es351-DEIpsLCJ.js → index.es352-DEIpsLCJ.js} +0 -0
- /package/dist/app/assets/{index.es352-BgYniUM_.js → index.es353-BgYniUM_.js} +0 -0
- /package/dist/app/assets/{index.es353-COcR7UxN.js → index.es354-COcR7UxN.js} +0 -0
- /package/dist/app/assets/{index.es354-BjQB5zDj.js → index.es355-BjQB5zDj.js} +0 -0
- /package/dist/app/assets/{index.es355-C-nORZOA.js → index.es356-C-nORZOA.js} +0 -0
- /package/dist/app/assets/{index.es359-BX77sIaO.js → index.es360-BX77sIaO.js} +0 -0
- /package/dist/app/assets/{index.es361-B-DoSBHF.js → index.es362-B-DoSBHF.js} +0 -0
- /package/dist/app/assets/{index.es362-bCA53EVm.js → index.es363-bCA53EVm.js} +0 -0
- /package/dist/app/assets/{index.es363-w-ucz2PV.js → index.es364-w-ucz2PV.js} +0 -0
- /package/dist/app/assets/{index.es364-Dayu4EKP.js → index.es365-Dayu4EKP.js} +0 -0
- /package/dist/app/assets/{index.es366-DKXYxT9g.js → index.es367-DKXYxT9g.js} +0 -0
- /package/dist/app/assets/{index.es369-DfxzS6Rs.js → index.es370-DfxzS6Rs.js} +0 -0
- /package/dist/app/assets/{index.es370-SKMF96pI.js → index.es371-SKMF96pI.js} +0 -0
- /package/dist/app/assets/{index.es371-ajMbGru0.js → index.es372-ajMbGru0.js} +0 -0
- /package/dist/app/assets/{index.es372--30QC5Em.js → index.es373--30QC5Em.js} +0 -0
- /package/dist/app/assets/{index.es375-B430Bg39.js → index.es376-B430Bg39.js} +0 -0
- /package/dist/app/assets/{index.es379-CM8KxXT1.js → index.es380-CM8KxXT1.js} +0 -0
- /package/dist/app/assets/{index.es380-B1SYOhNW.js → index.es381-B1SYOhNW.js} +0 -0
- /package/dist/app/assets/{index.es382-DkBy-JyN.js → index.es383-DkBy-JyN.js} +0 -0
- /package/dist/app/assets/{index.es386-BILxekzW.js → index.es387-BILxekzW.js} +0 -0
- /package/dist/app/assets/{index.es387-C5wWYbrZ.js → index.es388-C5wWYbrZ.js} +0 -0
- /package/dist/app/assets/{index.es388-HzYwdGDm.js → index.es389-HzYwdGDm.js} +0 -0
- /package/dist/app/assets/{index.es389-T-Tgc4AT.js → index.es390-T-Tgc4AT.js} +0 -0
- /package/dist/app/assets/{index.es390-ifBTmRxC.js → index.es391-ifBTmRxC.js} +0 -0
- /package/dist/app/assets/{index.es395-BMj5Y0dO.js → index.es396-BMj5Y0dO.js} +0 -0
- /package/dist/app/assets/{index.es397-BjABl1g7.js → index.es398-BjABl1g7.js} +0 -0
- /package/dist/app/assets/{index.es398-xI-RfyKK.js → index.es399-xI-RfyKK.js} +0 -0
- /package/dist/app/assets/{index.es399-ySlJ1b_l.js → index.es400-ySlJ1b_l.js} +0 -0
- /package/dist/app/assets/{index.es402-BQoSv7ci.js → index.es403-BQoSv7ci.js} +0 -0
- /package/dist/app/assets/{index.es403-w8dY5SsB.js → index.es404-w8dY5SsB.js} +0 -0
- /package/dist/app/assets/{index.es404-TU54ms6u.js → index.es405-TU54ms6u.js} +0 -0
- /package/dist/app/assets/{index.es405-DREVFZK8.js → index.es406-DREVFZK8.js} +0 -0
- /package/dist/app/assets/{index.es406-BfivnA6A.js → index.es407-BfivnA6A.js} +0 -0
- /package/dist/app/assets/{index.es407-P4WzXJd0.js → index.es408-P4WzXJd0.js} +0 -0
- /package/dist/app/assets/{index.es408-BAng5TT0.js → index.es409-BAng5TT0.js} +0 -0
- /package/dist/app/assets/{index.es410-B5lbUyaz.js → index.es411-B5lbUyaz.js} +0 -0
- /package/dist/app/assets/{index.es411-mebxcVVE.js → index.es412-mebxcVVE.js} +0 -0
- /package/dist/app/assets/{index.es413-XBlWyCtg.js → index.es414-XBlWyCtg.js} +0 -0
- /package/dist/app/assets/{index.es414-BfCpw3nA.js → index.es415-BfCpw3nA.js} +0 -0
- /package/dist/app/assets/{index.es416-Cc5clBb7.js → index.es417-Cc5clBb7.js} +0 -0
- /package/dist/app/assets/{index.es417-IuBKFhSY.js → index.es418-IuBKFhSY.js} +0 -0
- /package/dist/app/assets/{index.es419-Du5NY7AG.js → index.es420-Du5NY7AG.js} +0 -0
- /package/dist/app/assets/{index.es420-Bvotw-X0.js → index.es421-Bvotw-X0.js} +0 -0
- /package/dist/app/assets/{index.es421-UIAJJxZW.js → index.es422-UIAJJxZW.js} +0 -0
- /package/dist/app/assets/{index.es423-D9-PGadD.js → index.es424-D9-PGadD.js} +0 -0
- /package/dist/app/assets/{index.es425-sdHcTMYB.js → index.es426-sdHcTMYB.js} +0 -0
- /package/dist/app/assets/{index.es426-Ci6OQyBP.js → index.es427-Ci6OQyBP.js} +0 -0
- /package/dist/app/assets/{index.es427-BC5c_5Pe.js → index.es428-BC5c_5Pe.js} +0 -0
- /package/dist/app/assets/{index.es428-Tz6hzZYG.js → index.es429-Tz6hzZYG.js} +0 -0
- /package/dist/app/assets/{index.es429-DB_GagMm.js → index.es430-DB_GagMm.js} +0 -0
- /package/dist/app/assets/{index.es430-DLbgOhZU.js → index.es431-DLbgOhZU.js} +0 -0
- /package/dist/app/assets/{index.es431-B0XVJmRM.js → index.es432-B0XVJmRM.js} +0 -0
- /package/dist/app/assets/{index.es434-shcSOmrb.js → index.es435-shcSOmrb.js} +0 -0
- /package/dist/app/assets/{index.es435-D4Tzg5kh.js → index.es436-D4Tzg5kh.js} +0 -0
- /package/dist/app/assets/{index.es436-Deuh7S70.js → index.es437-Deuh7S70.js} +0 -0
- /package/dist/app/assets/{index.es437-BUEGK8hf.js → index.es438-BUEGK8hf.js} +0 -0
- /package/dist/app/assets/{index.es438-BNioltXt.js → index.es439-BNioltXt.js} +0 -0
- /package/dist/app/assets/{index.es439-JqZropPD.js → index.es440-JqZropPD.js} +0 -0
- /package/dist/app/assets/{index.es442-LKU2TuZ1.js → index.es443-LKU2TuZ1.js} +0 -0
- /package/dist/app/assets/{index.es443-BFLt1xDp.js → index.es444-BFLt1xDp.js} +0 -0
- /package/dist/app/assets/{index.es444-DKykz6zU.js → index.es445-DKykz6zU.js} +0 -0
- /package/dist/app/assets/{index.es445-B3ZDOciz.js → index.es446-B3ZDOciz.js} +0 -0
- /package/dist/app/assets/{index.es446-CSHBycmS.js → index.es447-CSHBycmS.js} +0 -0
- /package/dist/app/assets/{index.es447-BIEUsx6d.js → index.es448-BIEUsx6d.js} +0 -0
- /package/dist/app/assets/{index.es448-B48N-Iqd.js → index.es449-B48N-Iqd.js} +0 -0
- /package/dist/app/assets/{index.es449-BY-TUvya.js → index.es450-BY-TUvya.js} +0 -0
- /package/dist/app/assets/{index.es450-zocC4JxJ.js → index.es451-zocC4JxJ.js} +0 -0
- /package/dist/app/assets/{index.es452-Cza_XSSt.js → index.es453-Cza_XSSt.js} +0 -0
- /package/dist/app/assets/{index.es453-Bg-kzb6g.js → index.es454-Bg-kzb6g.js} +0 -0
- /package/dist/app/assets/{index.es454-DhUJRlN_.js → index.es455-DhUJRlN_.js} +0 -0
- /package/dist/app/assets/{index.es456-C8lEn-DE.js → index.es457-C8lEn-DE.js} +0 -0
- /package/dist/app/assets/{index.es457-DhMKtDLN.js → index.es458-DhMKtDLN.js} +0 -0
- /package/dist/app/assets/{index.es458-CwjWoCRV.js → index.es459-CwjWoCRV.js} +0 -0
- /package/dist/app/assets/{index.es459-CzouJOBO.js → index.es460-CzouJOBO.js} +0 -0
- /package/dist/app/assets/{index.es460-B1bQXN8T.js → index.es461-B1bQXN8T.js} +0 -0
- /package/dist/app/assets/{index.es462-5LuOXUq_.js → index.es463-5LuOXUq_.js} +0 -0
- /package/dist/app/assets/{index.es463-DWJ3fJO_.js → index.es464-DWJ3fJO_.js} +0 -0
- /package/dist/app/assets/{index.es464-DJlmqQ1C.js → index.es465-DJlmqQ1C.js} +0 -0
- /package/dist/app/assets/{index.es465-QhoSD0DR.js → index.es466-QhoSD0DR.js} +0 -0
- /package/dist/app/assets/{index.es468-Be6lgOlo.js → index.es469-Be6lgOlo.js} +0 -0
- /package/dist/app/assets/{index.es470-BJ4Li9vH.js → index.es471-BJ4Li9vH.js} +0 -0
- /package/dist/app/assets/{index.es471-DQVVAn-B.js → index.es472-DQVVAn-B.js} +0 -0
- /package/dist/app/assets/{index.es472-BJGe-b2p.js → index.es473-BJGe-b2p.js} +0 -0
- /package/dist/app/assets/{index.es474-BLhTXw86.js → index.es475-BLhTXw86.js} +0 -0
- /package/dist/app/assets/{index.es476-atvbtKCR.js → index.es477-atvbtKCR.js} +0 -0
- /package/dist/app/assets/{index.es478-DkLiglaE.js → index.es479-DkLiglaE.js} +0 -0
- /package/dist/app/assets/{index.es479-C1w2a3ep.js → index.es480-C1w2a3ep.js} +0 -0
- /package/dist/app/assets/{index.es482-Cf8iN4DR.js → index.es483-Cf8iN4DR.js} +0 -0
- /package/dist/app/assets/{index.es483-COK4E0Yg.js → index.es484-COK4E0Yg.js} +0 -0
- /package/dist/app/assets/{index.es484-BknIz3MU.js → index.es485-BknIz3MU.js} +0 -0
- /package/dist/app/assets/{index.es486-BeQkCIfX.js → index.es487-BeQkCIfX.js} +0 -0
- /package/dist/app/assets/{index.es488-BSxZ-RaX.js → index.es489-BSxZ-RaX.js} +0 -0
- /package/dist/app/assets/{index.es489-C7L56vO4.js → index.es490-C7L56vO4.js} +0 -0
- /package/dist/app/assets/{index.es490-CUnW07Te.js → index.es491-CUnW07Te.js} +0 -0
- /package/dist/app/assets/{index.es491-C1XDQQGZ.js → index.es492-C1XDQQGZ.js} +0 -0
- /package/dist/app/assets/{index.es492-CQjiPCtT.js → index.es493-CQjiPCtT.js} +0 -0
- /package/dist/app/assets/{index.es493-DQ1-QYvQ.js → index.es494-DQ1-QYvQ.js} +0 -0
- /package/dist/app/assets/{index.es495-BbSNqyBO.js → index.es496-BbSNqyBO.js} +0 -0
- /package/dist/app/assets/{index.es497-CB2ApiWb.js → index.es498-CB2ApiWb.js} +0 -0
- /package/dist/app/assets/{index.es499-B_m7g4N7.js → index.es500-B_m7g4N7.js} +0 -0
- /package/dist/app/assets/{index.es500-B6W0miNI.js → index.es501-B6W0miNI.js} +0 -0
- /package/dist/app/assets/{index.es501-BMR_PYu6.js → index.es502-BMR_PYu6.js} +0 -0
- /package/dist/app/assets/{index.es503-Dj6nwHGl.js → index.es504-Dj6nwHGl.js} +0 -0
- /package/dist/app/assets/{index.es504-BpWG_bgh.js → index.es505-BpWG_bgh.js} +0 -0
- /package/dist/app/assets/{index.es505-BVUVsWT6.js → index.es506-BVUVsWT6.js} +0 -0
- /package/dist/app/assets/{index.es506-CAQ2eGtk.js → index.es507-CAQ2eGtk.js} +0 -0
- /package/dist/app/assets/{index.es507-BFOHcciG.js → index.es508-BFOHcciG.js} +0 -0
- /package/dist/app/assets/{index.es508-CdO5JTpU.js → index.es509-CdO5JTpU.js} +0 -0
- /package/dist/app/assets/{index.es509-CJaU5se_.js → index.es510-CJaU5se_.js} +0 -0
- /package/dist/app/assets/{index.es510-DYoNaHQp.js → index.es511-DYoNaHQp.js} +0 -0
- /package/dist/app/assets/{index.es511-m4uW47V2.js → index.es512-m4uW47V2.js} +0 -0
- /package/dist/app/assets/{index.es514-nyqBNV6O.js → index.es515-nyqBNV6O.js} +0 -0
- /package/dist/app/assets/{index.es515-C6j12Q_x.js → index.es516-C6j12Q_x.js} +0 -0
- /package/dist/app/assets/{index.es516-7A4Fjokl.js → index.es517-7A4Fjokl.js} +0 -0
- /package/dist/app/assets/{index.es517-CB0Krxn9.js → index.es518-CB0Krxn9.js} +0 -0
- /package/dist/app/assets/{index.es518-DCE3LsBG.js → index.es519-DCE3LsBG.js} +0 -0
- /package/dist/app/assets/{index.es519-C3FkfJm5.js → index.es520-C3FkfJm5.js} +0 -0
- /package/dist/app/assets/{index.es522-CVw76BM1.js → index.es523-CVw76BM1.js} +0 -0
- /package/dist/app/assets/{index.es523-HnGAYVZD.js → index.es524-HnGAYVZD.js} +0 -0
- /package/dist/app/assets/{index.es524-BVz_zdnA.js → index.es525-BVz_zdnA.js} +0 -0
- /package/dist/app/assets/{index.es525-C3khCPGq.js → index.es526-C3khCPGq.js} +0 -0
- /package/dist/app/assets/{index.es526-D-2ljcwZ.js → index.es527-D-2ljcwZ.js} +0 -0
- /package/dist/app/assets/{index.es527-Cv9koXgw.js → index.es528-Cv9koXgw.js} +0 -0
- /package/dist/app/assets/{index.es528-CD_QflpE.js → index.es529-CD_QflpE.js} +0 -0
- /package/dist/app/assets/{index.es529-DRW-0cLl.js → index.es530-DRW-0cLl.js} +0 -0
- /package/dist/app/assets/{index.es530-C-_shW-Y.js → index.es531-C-_shW-Y.js} +0 -0
- /package/dist/app/assets/{index.es531-LGGdnPYs.js → index.es532-LGGdnPYs.js} +0 -0
- /package/dist/app/assets/{index.es532-C3mMm8J8.js → index.es533-C3mMm8J8.js} +0 -0
- /package/dist/app/assets/{index.es533-BzJJZx-M.js → index.es534-BzJJZx-M.js} +0 -0
- /package/dist/app/assets/{index.es534-BXkSAIEj.js → index.es535-BXkSAIEj.js} +0 -0
- /package/dist/app/assets/{index.es535-BgDCqdQA.js → index.es536-BgDCqdQA.js} +0 -0
- /package/dist/app/assets/{index.es536-C8M2exoo.js → index.es537-C8M2exoo.js} +0 -0
- /package/dist/app/assets/{index.es537-DHJKELXO.js → index.es538-DHJKELXO.js} +0 -0
- /package/dist/app/assets/{index.es538-Cuk6v7N8.js → index.es539-Cuk6v7N8.js} +0 -0
- /package/dist/app/assets/{index.es539-DH5Ifo-i.js → index.es540-DH5Ifo-i.js} +0 -0
- /package/dist/app/assets/{index.es540-E3gJ1_iC.js → index.es541-E3gJ1_iC.js} +0 -0
- /package/dist/app/assets/{index.es541-DAi9KRSo.js → index.es542-DAi9KRSo.js} +0 -0
- /package/dist/app/assets/{index.es542-D7oLnXFd.js → index.es543-D7oLnXFd.js} +0 -0
- /package/dist/app/assets/{index.es543-BfjtVDDH.js → index.es544-BfjtVDDH.js} +0 -0
- /package/dist/app/assets/{index.es544-DnULxvSX.js → index.es545-DnULxvSX.js} +0 -0
- /package/dist/app/assets/{index.es545-CkXjmgJE.js → index.es546-CkXjmgJE.js} +0 -0
- /package/dist/app/assets/{index.es546-CfQXZHmo.js → index.es547-CfQXZHmo.js} +0 -0
- /package/dist/app/assets/{index.es547-DWedfzmr.js → index.es548-DWedfzmr.js} +0 -0
- /package/dist/app/assets/{index.es548-DUszq2jm.js → index.es549-DUszq2jm.js} +0 -0
- /package/dist/app/assets/{index.es549-B7mTdjB0.js → index.es550-B7mTdjB0.js} +0 -0
- /package/dist/app/assets/{index.es550-D5KoaKCx.js → index.es551-D5KoaKCx.js} +0 -0
- /package/dist/app/assets/{index.es551-BfHTSMKl.js → index.es552-BfHTSMKl.js} +0 -0
- /package/dist/app/assets/{index.es552-B0m2ddpp.js → index.es553-B0m2ddpp.js} +0 -0
- /package/dist/app/assets/{index.es553-CyktbL80.js → index.es554-CyktbL80.js} +0 -0
- /package/dist/app/assets/{index.es554-Csfq5Kiy.js → index.es555-Csfq5Kiy.js} +0 -0
- /package/dist/app/assets/{index.es555-CafNBF8u.js → index.es556-CafNBF8u.js} +0 -0
- /package/dist/app/assets/{index.es556-CTRr51gU.js → index.es557-CTRr51gU.js} +0 -0
- /package/dist/app/assets/{index.es557-D4h5O-jR.js → index.es558-D4h5O-jR.js} +0 -0
- /package/dist/app/assets/{index.es558-C39BiMTA.js → index.es559-C39BiMTA.js} +0 -0
- /package/dist/app/assets/{index.es559-Ddv68eIx.js → index.es560-Ddv68eIx.js} +0 -0
- /package/dist/app/assets/{index.es560-GBQ2dnAY.js → index.es561-GBQ2dnAY.js} +0 -0
- /package/dist/app/assets/{index.es561-PoHY5YXO.js → index.es562-PoHY5YXO.js} +0 -0
- /package/dist/app/assets/{index.es562-3e1v2bzS.js → index.es563-3e1v2bzS.js} +0 -0
- /package/dist/app/assets/{index.es563-CS3Unz2-.js → index.es564-CS3Unz2-.js} +0 -0
- /package/dist/app/assets/{index.es564-bN70gL4F.js → index.es565-bN70gL4F.js} +0 -0
- /package/dist/app/assets/{index.es565-CmCqftbK.js → index.es566-CmCqftbK.js} +0 -0
- /package/dist/app/assets/{index.es566-Ds-gbosJ.js → index.es567-Ds-gbosJ.js} +0 -0
- /package/dist/app/assets/{index.es567-CjDtw9vr.js → index.es568-CjDtw9vr.js} +0 -0
- /package/dist/app/assets/{index.es568-BthQWCQV.js → index.es569-BthQWCQV.js} +0 -0
- /package/dist/app/assets/{index.es569-DqwNpetd.js → index.es570-DqwNpetd.js} +0 -0
- /package/dist/app/assets/{index.es570-Bw305WKR.js → index.es571-Bw305WKR.js} +0 -0
- /package/dist/app/assets/{index.es571-DXbdFlpD.js → index.es572-DXbdFlpD.js} +0 -0
- /package/dist/app/assets/{index.es572-L9t79GZl.js → index.es573-L9t79GZl.js} +0 -0
- /package/dist/app/assets/{index.es573-CbfX1IO0.js → index.es574-CbfX1IO0.js} +0 -0
- /package/dist/app/assets/{index.es574-DBQeEorK.js → index.es575-DBQeEorK.js} +0 -0
- /package/dist/app/assets/{index.es575-BEBZ7ncR.js → index.es576-BEBZ7ncR.js} +0 -0
- /package/dist/app/assets/{index.es576-Bkuqu6BP.js → index.es577-Bkuqu6BP.js} +0 -0
- /package/dist/app/assets/{index.es577-D0r3Knsf.js → index.es578-D0r3Knsf.js} +0 -0
- /package/dist/app/assets/{index.es578-CVO1_9PV.js → index.es579-CVO1_9PV.js} +0 -0
package/package.json
CHANGED
package/src/server.ts
CHANGED
|
@@ -3,6 +3,7 @@ import * as bodyParser from "body-parser";
|
|
|
3
3
|
import cors from "cors";
|
|
4
4
|
import express from "express";
|
|
5
5
|
import * as http from "http";
|
|
6
|
+
import { createProxyMiddleware } from "http-proxy-middleware";
|
|
6
7
|
import { AddressInfo } from "net";
|
|
7
8
|
import * as path from "path";
|
|
8
9
|
import { ConnectionController } from "./controller/connection.controller";
|
|
@@ -184,6 +185,16 @@ if (!isDevelopment) {
|
|
|
184
185
|
// In development mode, proxy requests to React dev server
|
|
185
186
|
// Handle API routes first
|
|
186
187
|
app.use(`${API_PREFIX}`, loggerMiddleware);
|
|
188
|
+
|
|
189
|
+
// Proxy everything else to Vite
|
|
190
|
+
app.use(
|
|
191
|
+
createProxyMiddleware({
|
|
192
|
+
target: "http://localhost:5173",
|
|
193
|
+
changeOrigin: true,
|
|
194
|
+
ws: true,
|
|
195
|
+
pathFilter: (path) => !path.startsWith("/api/"),
|
|
196
|
+
}),
|
|
197
|
+
);
|
|
187
198
|
}
|
|
188
199
|
|
|
189
200
|
const setVersionIdError = (res: express.Response) => {
|
package/src/service/project.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Mutex } from "async-mutex";
|
|
|
3
3
|
import * as fs from "fs";
|
|
4
4
|
import * as path from "path";
|
|
5
5
|
import { components } from "../api";
|
|
6
|
-
import { API_PREFIX,
|
|
6
|
+
import { API_PREFIX, README_NAME } from "../constants";
|
|
7
7
|
import {
|
|
8
8
|
ConnectionNotFoundError,
|
|
9
9
|
PackageNotFoundError,
|
|
@@ -14,7 +14,7 @@ import { createConnections, InternalConnection } from "./connection";
|
|
|
14
14
|
import { ApiConnection } from "./model";
|
|
15
15
|
import { Package } from "./package";
|
|
16
16
|
|
|
17
|
-
enum PackageStatus {
|
|
17
|
+
export enum PackageStatus {
|
|
18
18
|
LOADING = "loading",
|
|
19
19
|
SERVING = "serving",
|
|
20
20
|
UNLOADING = "unloading",
|
|
@@ -183,28 +183,22 @@ export class Project {
|
|
|
183
183
|
public async listPackages(): Promise<ApiPackage[]> {
|
|
184
184
|
logger.info("Listing packages", { projectPath: this.projectPath });
|
|
185
185
|
try {
|
|
186
|
-
const files = await fs.promises.readdir(this.projectPath, {
|
|
187
|
-
withFileTypes: true,
|
|
188
|
-
});
|
|
189
|
-
const packageDirectories = files.filter(
|
|
190
|
-
(file) =>
|
|
191
|
-
file.isDirectory() &&
|
|
192
|
-
fs.existsSync(
|
|
193
|
-
path.join(this.projectPath, file.name, PACKAGE_MANIFEST_NAME),
|
|
194
|
-
),
|
|
195
|
-
);
|
|
196
186
|
const packageMetadata = await Promise.all(
|
|
197
|
-
|
|
187
|
+
Array.from(this.packageStatuses.keys()).map(async (packageName) => {
|
|
198
188
|
try {
|
|
199
|
-
|
|
200
|
-
this.packageStatuses.get(
|
|
189
|
+
const packageMetadata = (
|
|
190
|
+
this.packageStatuses.get(packageName)?.status ===
|
|
201
191
|
PackageStatus.LOADING
|
|
202
192
|
? undefined
|
|
203
|
-
: await this.getPackage(
|
|
193
|
+
: await this.getPackage(packageName, false)
|
|
204
194
|
)?.getPackageMetadata();
|
|
195
|
+
if (packageMetadata) {
|
|
196
|
+
packageMetadata.name = packageName;
|
|
197
|
+
}
|
|
198
|
+
return packageMetadata;
|
|
205
199
|
} catch (error) {
|
|
206
200
|
logger.error(
|
|
207
|
-
`Failed to load package: ${
|
|
201
|
+
`Failed to load package: ${packageName} due to : ${error}`,
|
|
208
202
|
);
|
|
209
203
|
// Directory did not contain a valid package.json file -- therefore, it's not a package.
|
|
210
204
|
// Or it timed out
|
|
@@ -9,8 +9,8 @@ import { components } from "../api";
|
|
|
9
9
|
import {
|
|
10
10
|
getProcessedPublisherConfig,
|
|
11
11
|
isPublisherConfigFrozen,
|
|
12
|
-
ProcessedPublisherConfig,
|
|
13
12
|
ProcessedProject,
|
|
13
|
+
ProcessedPublisherConfig,
|
|
14
14
|
} from "../config";
|
|
15
15
|
import { API_PREFIX, PUBLISHER_CONFIG_NAME, publisherPath } from "../constants";
|
|
16
16
|
import {
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
ProjectNotFoundError,
|
|
20
20
|
} from "../errors";
|
|
21
21
|
import { logger } from "../logger";
|
|
22
|
-
import { Project } from "./project";
|
|
22
|
+
import { PackageStatus, Project } from "./project";
|
|
23
23
|
type ApiProject = components["schemas"]["Project"];
|
|
24
24
|
|
|
25
25
|
export class ProjectStore {
|
|
@@ -49,6 +49,7 @@ export class ProjectStore {
|
|
|
49
49
|
const projectManifest = await ProjectStore.reloadProjectManifest(
|
|
50
50
|
this.serverRootPath,
|
|
51
51
|
);
|
|
52
|
+
await this.cleanupAndCreatePublisherPath();
|
|
52
53
|
logger.info(`Initializing project store.`);
|
|
53
54
|
await Promise.all(
|
|
54
55
|
projectManifest.projects.map(async (project) => {
|
|
@@ -75,6 +76,22 @@ export class ProjectStore {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
private async cleanupAndCreatePublisherPath() {
|
|
80
|
+
logger.info(`Cleaning up publisher path ${publisherPath}`);
|
|
81
|
+
try {
|
|
82
|
+
await fs.promises.rm(publisherPath, { recursive: true, force: true });
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if ((error as NodeJS.ErrnoException).code === "EACCES") {
|
|
85
|
+
logger.warn(
|
|
86
|
+
`Permission denied, skipping cleanup of publisher path ${publisherPath}`,
|
|
87
|
+
);
|
|
88
|
+
} else {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
await fs.promises.mkdir(publisherPath, { recursive: true });
|
|
93
|
+
}
|
|
94
|
+
|
|
78
95
|
public async listProjects(skipInitializationCheck: boolean = false) {
|
|
79
96
|
if (!skipInitializationCheck) {
|
|
80
97
|
await this.finishedInitialization;
|
|
@@ -218,6 +235,9 @@ export class ProjectStore {
|
|
|
218
235
|
this.serverRootPath,
|
|
219
236
|
);
|
|
220
237
|
this.projects.set(projectName, newProject);
|
|
238
|
+
projectConfig?.packages.forEach((_package) => {
|
|
239
|
+
newProject.setPackageStatus(_package.name, PackageStatus.SERVING);
|
|
240
|
+
});
|
|
221
241
|
return newProject;
|
|
222
242
|
}
|
|
223
243
|
|
|
@@ -329,6 +349,30 @@ export class ProjectStore {
|
|
|
329
349
|
return absoluteProjectPath;
|
|
330
350
|
}
|
|
331
351
|
|
|
352
|
+
private isLocalPath(location: string) {
|
|
353
|
+
return (
|
|
354
|
+
location.startsWith("./") ||
|
|
355
|
+
location.startsWith("~/") ||
|
|
356
|
+
location.startsWith("/") ||
|
|
357
|
+
path.isAbsolute(location)
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
private isGitHubURL(location: string) {
|
|
362
|
+
return (
|
|
363
|
+
location.startsWith("https://github.com/") ||
|
|
364
|
+
location.startsWith("git@github.com:")
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
private isGCSURL(location: string) {
|
|
369
|
+
return location.startsWith("gs://");
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
private isS3URL(location: string) {
|
|
373
|
+
return location.startsWith("s3://");
|
|
374
|
+
}
|
|
375
|
+
|
|
332
376
|
private async loadProjectIntoDisk(
|
|
333
377
|
projectName: string,
|
|
334
378
|
projectPath: string,
|
|
@@ -359,65 +403,96 @@ export class ProjectStore {
|
|
|
359
403
|
);
|
|
360
404
|
}
|
|
361
405
|
|
|
362
|
-
|
|
363
|
-
|
|
406
|
+
// For GitHub URLs, group by base repository URL to optimize downloads
|
|
407
|
+
let locationKey = _package.location;
|
|
408
|
+
if (this.isGitHubURL(_package.location)) {
|
|
409
|
+
const githubInfo = this.parseGitHubUrl(_package.location);
|
|
410
|
+
if (githubInfo) {
|
|
411
|
+
// Always use HTTPS format for grouping to ensure consistency
|
|
412
|
+
locationKey = `https://github.com/${githubInfo.owner}/${githubInfo.repoName}`;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
364
415
|
|
|
365
|
-
if (!locationGroups.has(
|
|
366
|
-
locationGroups.set(
|
|
416
|
+
if (!locationGroups.has(locationKey)) {
|
|
417
|
+
locationGroups.set(locationKey, []);
|
|
367
418
|
}
|
|
368
|
-
locationGroups.get(
|
|
419
|
+
locationGroups.get(locationKey)!.push({
|
|
420
|
+
name: _package.name,
|
|
421
|
+
location: _package.location,
|
|
422
|
+
});
|
|
369
423
|
}
|
|
370
424
|
|
|
371
425
|
// Processing by each unique location
|
|
372
|
-
for (const [
|
|
426
|
+
for (const [groupedLocation, packagesForLocation] of locationGroups) {
|
|
373
427
|
// Create a temporary directory for the shared download
|
|
374
428
|
const tempDownloadPath = `${absoluteTargetPath}/.temp_${Buffer.from(
|
|
375
|
-
|
|
429
|
+
groupedLocation,
|
|
376
430
|
)
|
|
377
431
|
.toString("base64")
|
|
378
432
|
.replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
379
433
|
await fs.promises.mkdir(tempDownloadPath, { recursive: true });
|
|
380
|
-
|
|
434
|
+
logger.info(`Created temporary directory: ${tempDownloadPath}`);
|
|
381
435
|
try {
|
|
382
|
-
//
|
|
436
|
+
// Use the existing download method for all locations
|
|
383
437
|
await this.downloadOrMountLocation(
|
|
384
|
-
|
|
438
|
+
groupedLocation,
|
|
385
439
|
tempDownloadPath,
|
|
386
440
|
projectName,
|
|
387
441
|
"shared",
|
|
388
442
|
);
|
|
389
|
-
|
|
390
443
|
// Extract each package from the downloaded content
|
|
391
444
|
for (const _package of packagesForLocation) {
|
|
392
445
|
const packageDir = _package.name;
|
|
393
446
|
const absolutePackagePath = `${absoluteTargetPath}/${packageDir}`;
|
|
447
|
+
// For GitHub URLs, extract the subdirectory path from the original location
|
|
448
|
+
let sourcePath: string;
|
|
449
|
+
if (this.isGitHubURL(_package.location)) {
|
|
450
|
+
const githubInfo = this.parseGitHubUrl(_package.location);
|
|
451
|
+
if (githubInfo && githubInfo.packagePath) {
|
|
452
|
+
// Extract subdirectory from the original GitHub URL
|
|
453
|
+
// Handle both /tree/main/subdir and /tree/branch/subdir cases
|
|
454
|
+
const subPathMatch =
|
|
455
|
+
_package.location.match(/\/tree\/[^/]+\/(.+)$/);
|
|
456
|
+
if (subPathMatch) {
|
|
457
|
+
sourcePath = path.join(
|
|
458
|
+
tempDownloadPath,
|
|
459
|
+
subPathMatch[1],
|
|
460
|
+
);
|
|
461
|
+
} else {
|
|
462
|
+
// If no subdirectory after /tree/branch, the repo itself is the package
|
|
463
|
+
sourcePath = tempDownloadPath;
|
|
464
|
+
}
|
|
465
|
+
} else {
|
|
466
|
+
// No packagePath means the repo itself is the package
|
|
467
|
+
sourcePath = tempDownloadPath;
|
|
468
|
+
}
|
|
469
|
+
} else {
|
|
470
|
+
// For non-GitHub locations, use package name
|
|
471
|
+
if (this.isLocalPath(_package.location)) {
|
|
472
|
+
sourcePath = _package.location;
|
|
473
|
+
} else {
|
|
474
|
+
sourcePath = path.join(tempDownloadPath, groupedLocation);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
394
477
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
tempDownloadPath,
|
|
398
|
-
packageDir,
|
|
399
|
-
);
|
|
400
|
-
const packageExists = await fs.promises
|
|
401
|
-
.access(packagePathInDownload)
|
|
478
|
+
const sourceExists = await fs.promises
|
|
479
|
+
.access(sourcePath)
|
|
402
480
|
.then(() => true)
|
|
403
481
|
.catch(() => false);
|
|
404
482
|
|
|
405
|
-
if (
|
|
406
|
-
// Copy the specific
|
|
483
|
+
if (sourceExists) {
|
|
484
|
+
// Copy the specific directory
|
|
407
485
|
await fs.promises.mkdir(absolutePackagePath, {
|
|
408
486
|
recursive: true,
|
|
409
487
|
});
|
|
410
|
-
await fs.promises.cp(
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
{ recursive: true },
|
|
414
|
-
);
|
|
488
|
+
await fs.promises.cp(sourcePath, absolutePackagePath, {
|
|
489
|
+
recursive: true,
|
|
490
|
+
});
|
|
415
491
|
logger.info(
|
|
416
|
-
`Extracted package "${packageDir}" from shared download`,
|
|
492
|
+
`Extracted package "${packageDir}" from ${groupedLocation.startsWith("https://github.com/") && _package.location.includes("/tree/") ? "GitHub subdirectory" : "shared download"}`,
|
|
417
493
|
);
|
|
418
494
|
} else {
|
|
419
|
-
// If
|
|
420
|
-
// This handles cases where the location itself is the package
|
|
495
|
+
// If source doesn't exist, copy the entire download as the package
|
|
421
496
|
await fs.promises.mkdir(absolutePackagePath, {
|
|
422
497
|
recursive: true,
|
|
423
498
|
});
|
|
@@ -430,11 +505,14 @@ export class ProjectStore {
|
|
|
430
505
|
}
|
|
431
506
|
}
|
|
432
507
|
} catch (error) {
|
|
433
|
-
logger.error(
|
|
434
|
-
|
|
435
|
-
|
|
508
|
+
logger.error(
|
|
509
|
+
`Failed to download or mount location "${groupedLocation}"`,
|
|
510
|
+
{
|
|
511
|
+
error,
|
|
512
|
+
},
|
|
513
|
+
);
|
|
436
514
|
throw new PackageNotFoundError(
|
|
437
|
-
`Failed to download or mount location: ${
|
|
515
|
+
`Failed to download or mount location: ${groupedLocation}`,
|
|
438
516
|
);
|
|
439
517
|
}
|
|
440
518
|
try {
|
|
@@ -464,7 +542,7 @@ export class ProjectStore {
|
|
|
464
542
|
) {
|
|
465
543
|
const isCompressedFile = location.endsWith(".zip");
|
|
466
544
|
// Handle GCS paths
|
|
467
|
-
if (
|
|
545
|
+
if (this.isGCSURL(location)) {
|
|
468
546
|
try {
|
|
469
547
|
logger.info(
|
|
470
548
|
`Downloading GCS directory from "${location}" to "${targetPath}"`,
|
|
@@ -487,10 +565,7 @@ export class ProjectStore {
|
|
|
487
565
|
}
|
|
488
566
|
|
|
489
567
|
// Handle GitHub URLs
|
|
490
|
-
if (
|
|
491
|
-
location.startsWith("https://github.com/") ||
|
|
492
|
-
location.startsWith("git@")
|
|
493
|
-
) {
|
|
568
|
+
if (this.isGitHubURL(location)) {
|
|
494
569
|
try {
|
|
495
570
|
logger.info(
|
|
496
571
|
`Cloning GitHub repository from "${location}" to "${targetPath}"`,
|
|
@@ -508,7 +583,7 @@ export class ProjectStore {
|
|
|
508
583
|
}
|
|
509
584
|
|
|
510
585
|
// Handle S3 paths
|
|
511
|
-
if (
|
|
586
|
+
if (this.isS3URL(location)) {
|
|
512
587
|
try {
|
|
513
588
|
logger.info(
|
|
514
589
|
`Downloading S3 directory from "${location}" to "${targetPath}"`,
|
|
@@ -526,7 +601,7 @@ export class ProjectStore {
|
|
|
526
601
|
}
|
|
527
602
|
|
|
528
603
|
// Handle absolute and relative paths
|
|
529
|
-
if (
|
|
604
|
+
if (this.isLocalPath(location)) {
|
|
530
605
|
const packagePath: string = path.isAbsolute(location)
|
|
531
606
|
? location
|
|
532
607
|
: path.join(this.serverRootPath, location);
|
|
@@ -690,17 +765,40 @@ export class ProjectStore {
|
|
|
690
765
|
);
|
|
691
766
|
}
|
|
692
767
|
|
|
768
|
+
private parseGitHubUrl(
|
|
769
|
+
githubUrl: string,
|
|
770
|
+
): { owner: string; repoName: string; packagePath?: string } | null {
|
|
771
|
+
// Handle HTTPS format: https://github.com/owner/repo/tree/branch/subdir
|
|
772
|
+
const httpsRegex =
|
|
773
|
+
/github\.com\/(?<owner>[^/]+)\/(?<repoName>[^/]+)(?<packagePath>\/[^/]+)*/;
|
|
774
|
+
const httpsMatch = githubUrl.match(httpsRegex);
|
|
775
|
+
if (httpsMatch) {
|
|
776
|
+
const { owner, repoName, packagePath } = httpsMatch.groups!;
|
|
777
|
+
return { owner, repoName, packagePath };
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Handle SSH format: git@github.com:owner/repo.git or git@github.com:owner/repo
|
|
781
|
+
const sshRegex =
|
|
782
|
+
/git@github\.com:(?<owner>[^/]+)\/(?<repoName>[^/\s]+?)(?:\.git)?(?<packagePath>\/[^/]+)*$/;
|
|
783
|
+
const sshMatch = githubUrl.match(sshRegex);
|
|
784
|
+
if (sshMatch) {
|
|
785
|
+
const { owner, repoName, packagePath } = sshMatch.groups!;
|
|
786
|
+
return { owner, repoName, packagePath };
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
return null;
|
|
790
|
+
}
|
|
791
|
+
|
|
693
792
|
async downloadGitHubDirectory(githubUrl: string, absoluteDirPath: string) {
|
|
694
793
|
// First we'll clone the repo without the additional path
|
|
695
794
|
// E.g. we're removing `/tree/main/imdb` from https://github.com/credibledata/malloy-samples/tree/main/imdb
|
|
696
|
-
const
|
|
697
|
-
|
|
698
|
-
const match = githubUrl.match(githubRepoRegex);
|
|
699
|
-
if (!match) {
|
|
795
|
+
const githubInfo = this.parseGitHubUrl(githubUrl);
|
|
796
|
+
if (!githubInfo) {
|
|
700
797
|
throw new Error(`Invalid GitHub URL: ${githubUrl}`);
|
|
701
798
|
}
|
|
702
|
-
const { owner, repoName, packagePath } =
|
|
703
|
-
const cleanPackagePath = packagePath
|
|
799
|
+
const { owner, repoName, packagePath } = githubInfo;
|
|
800
|
+
const cleanPackagePath = packagePath?.replace("/tree/main", "") || "";
|
|
801
|
+
|
|
704
802
|
// We'll make sure whatever was in absoluteDirPath is removed,
|
|
705
803
|
// so we have a nice a clean directory where we can clone the repo
|
|
706
804
|
await fs.promises.rm(absoluteDirPath, {
|
|
@@ -709,6 +807,7 @@ export class ProjectStore {
|
|
|
709
807
|
});
|
|
710
808
|
await fs.promises.mkdir(absoluteDirPath, { recursive: true });
|
|
711
809
|
const repoUrl = `https://github.com/${owner}/${repoName}`;
|
|
810
|
+
|
|
712
811
|
// We'll clone the repo into absoluteDirPath
|
|
713
812
|
await new Promise<void>((resolve, reject) => {
|
|
714
813
|
simpleGit().clone(repoUrl, absoluteDirPath, {}, (err) => {
|
|
@@ -722,6 +821,16 @@ export class ProjectStore {
|
|
|
722
821
|
resolve();
|
|
723
822
|
});
|
|
724
823
|
});
|
|
824
|
+
|
|
825
|
+
// If there's no specific package path, we're done (for grouped downloads)
|
|
826
|
+
if (!cleanPackagePath) {
|
|
827
|
+
logger.info(
|
|
828
|
+
`Successfully cloned entire repository to: ${absoluteDirPath}`,
|
|
829
|
+
);
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// For single package downloads, extract the specific subdirectory
|
|
725
834
|
// After cloning, we'll replace all contents of absoluteDirPath with the contents of absoluteDirPath/cleanPackagePath
|
|
726
835
|
// E.g. we're moving /var/publisher/asd123/imdb/publisher.json into /var/publisher/asd123/publisher.json
|
|
727
836
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as o}from"./index-DdF3z9Gd.js";const r=o.createContext(void 0);export{r as F};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{c as L,j as e,r as j,D as f,u as k,S as z,R as D,P as b,a as E,v as A,N as I,M as F,E as w,C as M,z as B,Y as G,b as Q,G as V,W as K,d as O,B as y,e as p,f as W,T as i,g as v,h as C,m as J,i as U,k as X,t as q,l as $,y as Z,I as ee,n as re,o as te}from"./index-DdF3z9Gd.js";import{f as ne}from"./index.es20-DlWN4z3R.js";import{M as R,a as se}from"./MenuItem-DE8NK-Xy.js";import{L as N,A as ae}from"./MoreVert-BqUb6vJH.js";import{b as oe,L as T,S as _,P as ie,G as g}from"./Edit-CnTAusNy.js";import{C as le}from"./Container-Dn_IEeIp.js";import{C as P}from"./Chip-DulNumvr.js";import{D as ce}from"./listItemTextClasses-BY1YL8dW.js";import"./Modal-PUsNPbDx.js";const de=L(e.jsx("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m4 11h-3v3c0 .55-.45 1-1 1s-1-.45-1-1v-3H8c-.55 0-1-.45-1-1s.45-1 1-1h3V8c0-.55.45-1 1-1s1 .45 1 1v3h3c.55 0 1 .45 1 1s-.45 1-1 1"})),Y=r=>{if(!r)return"Explore semantic models, run queries, and build dashboards";const n=r.replace(/^#+\s+/gm,"").replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/`([^`]+)`/g,"$1").trim(),t=n.split(/\n\s*\n/)[0]||n;if(t.length<=120)return t;const s=t.substring(0,120).split(" ");return s.pop(),s.join(" ")+"..."},H=(r,n)=>{const t=(r.readme||void 0)?.split(`
|
|
2
|
-
`)??[];return t.length===0&&(t.push(`# ${r.name}`),t.push("")),(r.readme?.length??0)>0&&n?t.splice(2,1,n):n&&t.push(n),t.join(`
|
|
3
|
-
`)};function me(){const[r,n]=j.useState(!1),{apiClients:t}=f(),[s,c]=j.useState(""),d=()=>{n(!0)},l=()=>{n(!1)},a=k(),m=z({async mutationFn(o){return t.projects.createProject({name:o.name,readme:H({name:o.name,readme:""},o.description)})},onSuccess(){l(),a.invalidateQueries({queryKey:["projects"]}),c("Project created successfully")},onError(o){c(o instanceof Error?o.message:"An unknown error occurred")}}),x=async o=>{o.preventDefault();const h=new FormData(o.currentTarget),u=h.get("name")?.toString(),S=h.get("description")?.toString();if(!u)throw new Error("Name is required");m.mutate({name:u,description:S})};return e.jsxs(D.Fragment,{children:[e.jsx(b,{variant:"contained",onClick:d,startIcon:e.jsx(de,{}),sx:{mt:2,color:"white"},children:"Create New Project"}),e.jsxs(E,{open:r,onClose:l,children:[e.jsx(A,{children:"Create New Project"}),e.jsxs(I,{children:[e.jsx(F,{children:"Add a new project to start exploring semantic models and analyzing data."}),e.jsxs("form",{onSubmit:x,id:"project-form",children:[e.jsx(w,{autoFocus:!0,required:!0,margin:"dense",id:"name",name:"name",label:"Project Name",type:"text",fullWidth:!0,variant:"standard"}),e.jsx(w,{margin:"dense",id:"description",name:"description",label:"Project Description",defaultValue:"Explore semantic models, run queries, and build dashboards",type:"text",fullWidth:!0,variant:"standard"})]})]}),e.jsxs(M,{children:[e.jsx(b,{disabled:m.isPending,onClick:l,children:"Cancel"}),e.jsx(b,{type:"submit",form:"project-form",loading:m.isPending,children:"Create Project"})]})]}),e.jsx(B,{open:s!=="",autoHideDuration:6e3,onClose:()=>c(""),message:s})]})}function ue({project:r,onCloseDialog:n}){const[t,s]=j.useState(!1),{apiClients:c}=f(),d=k(),[l,a]=j.useState(""),m=()=>{s(!0)},x=()=>{s(!1),n()},o=z({mutationFn:()=>c.projects.deleteProject(r.name),onSuccess(){x(),d.invalidateQueries({queryKey:["projects"]}),a("Project deleted successfully")},onError(h){a(h instanceof Error?h.message:"An unknown error occurred")}});return e.jsxs(D.Fragment,{children:[e.jsxs(R,{onClick:m,children:[e.jsx(N,{children:e.jsx(oe,{fontSize:"small"})}),e.jsx(T,{children:"Delete"})]}),e.jsxs(E,{onClose:x,"aria-labelledby":"customized-dialog-title",open:t,children:[e.jsx(A,{sx:{m:0,p:2},id:"customized-dialog-title",children:"Delete Project"}),e.jsx(G,{"aria-label":"close",onClick:x,sx:h=>({position:"absolute",right:8,top:8,color:h.palette.grey[500]}),children:e.jsx(Q,{})}),e.jsx(I,{dividers:!0,children:e.jsxs(V,{gutterBottom:!0,children:['Are you sure you want to delete "',r.name,'"? This action cannot be undone.']})}),e.jsx(M,{children:e.jsx(b,{loading:o.isPending,variant:"contained",autoFocus:!0,onClick:()=>o.mutate(),color:"error",children:"Delete"})}),e.jsx(_,{open:l!=="",autoHideDuration:6e3,onClose:()=>a(""),message:l})]})]})}function xe({project:r,onCloseDialog:n}){const[t,s]=j.useState(!1),{apiClients:c}=f(),d=k(),[l,a]=j.useState(""),m=()=>{s(!0)},x=()=>{s(!1),n()},o=z({async mutationFn(u){return c.projects.updateProject(r.name,{name:r.name,readme:H({name:r.name,readme:r.readme},u.description)})},onSuccess(){x(),d.invalidateQueries({queryKey:["projects"]}),a("Project updated successfully")},onError(u){a(u instanceof Error?u.message:"An unknown error occurred")}}),h=u=>{u.preventDefault();const S=new FormData(u.currentTarget).get("description")?.toString();o.mutate({description:S})};return e.jsxs(D.Fragment,{children:[e.jsxs(R,{onClick:m,children:[e.jsx(N,{children:e.jsx(ie,{fontSize:"small"})}),e.jsx(T,{children:"Edit"})]}),e.jsxs(E,{open:t,onClose:x,children:[e.jsx(A,{children:"Edit Project"}),e.jsxs(I,{children:[e.jsx(F,{children:"Add a new project to start exploring semantic models and analyzing data."}),e.jsxs("form",{onSubmit:h,id:"project-form",children:[e.jsx(w,{autoFocus:!0,required:!0,margin:"dense",id:"name",name:"name",label:"Project Name",disabled:!0,type:"text",fullWidth:!0,variant:"standard",defaultValue:r.name}),e.jsx(w,{margin:"dense",id:"description",name:"description",label:"Project Description",type:"text",fullWidth:!0,variant:"standard",defaultValue:Y(r.readme)})]})]}),e.jsxs(M,{children:[e.jsx(b,{disabled:o.isPending,onClick:x,children:"Cancel"}),e.jsx(b,{type:"submit",form:"project-form",loading:o.isPending,children:"Save Changes"})]})]}),e.jsx(_,{open:l!=="",autoHideDuration:6e3,onClose:()=>a(""),message:l})]})}function he({onClickProject:r}){const{apiClients:n,mutable:t}=f(),{data:s,isSuccess:c,isError:d,error:l}=K({queryKey:["projects"],queryFn:()=>n.projects.listProjects()});return d?e.jsx(O,{error:l,context:"Projects List"}):c?e.jsxs(le,{maxWidth:"lg",sx:{py:4},children:[e.jsxs(y,{sx:{textAlign:"center",mb:6},children:[e.jsxs(p,{direction:"row",justifyContent:"center",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(W,{sx:{fontSize:32,color:"primary.main"}}),e.jsx(i,{variant:"h3",component:"h1",fontWeight:700,children:"Publisher"})]}),e.jsx(i,{variant:"h5",color:"text.secondary",sx:{mb:3,maxWidth:600,mx:"auto"},children:"The open-source semantic model server for the Malloy data language"}),e.jsx(i,{variant:"body1",color:"text.secondary",sx:{maxWidth:800,mx:"auto"},children:"Define semantic models once — and use them everywhere. Publisher serves Malloy models through clean APIs, enabling consistent, interpretable, and AI-ready data access for tools, applications, and agents."})]}),e.jsxs(g,{container:!0,spacing:3,sx:{mb:6},children:[e.jsx(g,{size:{xs:12,md:4},children:e.jsx(v,{variant:"outlined",onClick:()=>{window.open("https://github.com/malloydata/publisher/blob/main/README.md#ad-hoc-data-analysis","_blank")},sx:{height:"100%",cursor:"pointer",transition:"all 0.2s ease","&:hover":{transform:"translateY(-2px)",boxShadow:2}},children:e.jsxs(C,{sx:{p:3},children:[e.jsxs(p,{direction:"row",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(J,{sx:{color:"info.main",fontSize:28}}),e.jsx(i,{variant:"h6",fontWeight:600,children:"Ad Hoc Analysis"})]}),e.jsx(i,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Use Explorer, a visual query builder that allows analysts to browse semantic sources, build queries, and run nested logic — all without writing code."}),e.jsx(P,{label:"No-code",size:"small",color:"primary",variant:"outlined"})]})})}),e.jsx(g,{size:{xs:12,md:4},children:e.jsx(v,{variant:"outlined",onClick:()=>{window.open("https://github.com/malloydata/publisher/blob/main/README.md#notebook-based-dashboards","_blank")},sx:{height:"100%",cursor:"pointer",transition:"all 0.2s ease","&:hover":{transform:"translateY(-2px)",boxShadow:2}},children:e.jsxs(C,{sx:{p:3},children:[e.jsxs(p,{direction:"row",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(U,{sx:{color:"warning.main",fontSize:28}}),e.jsx(i,{variant:"h6",fontWeight:600,children:"Notebook Dashboards"})]}),e.jsx(i,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Create shareable, code-first dashboards using Malloy notebooks. Include text, charts, and reusable views — all versioned alongside your models."}),e.jsx(P,{label:"Versioned",size:"small",color:"warning",variant:"outlined"})]})})}),e.jsx(g,{size:{xs:12,md:4},children:e.jsx(v,{variant:"outlined",onClick:()=>{window.open("https://github.com/malloydata/publisher/blob/main/README.md#mcp-based-ai-data-agents","_blank")},sx:{height:"100%",cursor:"pointer",transition:"all 0.2s ease","&:hover":{transform:"translateY(-2px)",boxShadow:2}},children:e.jsxs(C,{sx:{p:3},children:[e.jsxs(p,{direction:"row",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(X,{sx:{color:"success.main",fontSize:28}}),e.jsx(i,{variant:"h6",fontWeight:600,children:"AI Data Agents"})]}),e.jsx(i,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Expose your semantic models via the Model Context Protocol (MCP), enabling AI agents to discover sources and ask well-formed questions."}),e.jsx(P,{label:"AI-Ready",size:"small",color:"success",variant:"outlined"})]})})})]}),e.jsx(ce,{sx:{my:4}}),s.data.length>0?e.jsxs(e.Fragment,{children:[e.jsxs(y,{sx:{textAlign:"center",mb:4},children:[e.jsxs(p,{direction:"row",justifyContent:"center",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(q,{sx:{color:"primary.main",fontSize:24}}),e.jsx(i,{variant:"h4",fontWeight:600,children:"Select a Project"})]}),e.jsx(i,{variant:"body1",color:"text.secondary",children:"Choose a project to explore its semantic models and start analyzing your data"}),t&&e.jsx(me,{})]}),e.jsx(g,{container:!0,spacing:3,justifyContent:"center",children:s.data.map(a=>e.jsx(g,{size:{xs:12,sm:6,md:4},children:e.jsx(je,{project:a,onClickProject:r})},a.name))})]}):e.jsxs(y,{sx:{textAlign:"center",mb:4},children:[e.jsxs(p,{direction:"row",justifyContent:"center",alignItems:"center",spacing:1,sx:{mb:2},children:[e.jsx(q,{sx:{color:"primary.main",fontSize:24}}),e.jsx(i,{variant:"h4",fontWeight:600,children:"Get Started"})]}),e.jsx(i,{variant:"body1",color:"text.secondary",sx:{mb:3},children:"No projects found. Create your first Malloy project to start exploring semantic models and building data experiences."}),e.jsx($,{variant:"contained",size:"large",color:"primary",startIcon:e.jsx(W,{}),href:"https://github.com/malloydata/publisher/blob/main/README.md#server-configuration",target:"_blank",rel:"noopener noreferrer",children:"Learn How to Create Models"})]}),e.jsx(y,{sx:{textAlign:"center",mt:6,pt:4,borderTop:1,borderColor:"divider"},children:e.jsxs(i,{variant:"body2",color:"text.secondary",children:["Publisher is built on fully open infrastructure and designed for the AI era. Join the"," ",e.jsx("a",{href:"https://join.slack.com/t/malloy-community/shared_invite/zt-1kgfwgi5g-CrsdaRqs81QY67QW0~t_uw",target:"_blank",rel:"noopener noreferrer",style:{color:"primary.main",textDecoration:"underline"},children:"Malloy Slack community"})," ","to ask questions, share ideas, and contribute to the future of data modeling."]})})]}):e.jsx(Z,{text:"Loading projects..."})}function je({project:r,onClickProject:n}){const{mutable:t}=f(),[s,c]=j.useState(null),d=!!s,l=m=>{c(m.currentTarget)},a=()=>{c(null)};return e.jsx("div",{children:e.jsxs(v,{variant:"outlined",sx:{height:"100%",transition:"all 0.2s ease","&:hover":{transform:"translateY(-2px)",boxShadow:2,borderColor:"primary.main"}},children:[t&&e.jsxs(e.Fragment,{children:[e.jsx(ee,{"aria-controls":d?"project-menu":void 0,"aria-haspopup":"true","aria-expanded":d?"true":void 0,onClick:l,sx:{position:"absolute",top:8,right:8},children:e.jsx(ae,{fontSize:"small"})}),e.jsxs(se,{id:"project-menu","aria-haspopup":"true","aria-expanded":d?"true":void 0,open:d,anchorEl:s,onClose:a,disableRestoreFocus:!0,anchorOrigin:{vertical:"top",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"right"},children:[e.jsx(xe,{project:r,onCloseDialog:a}),e.jsx(ue,{project:r,onCloseDialog:a})]})]}),e.jsxs(C,{sx:{p:3,textAlign:"center"},children:[e.jsx(re,{sx:{fontSize:48,color:"primary.main",mb:2}}),e.jsx(i,{variant:"h6",fontWeight:600,gutterBottom:!0,children:r.name}),e.jsx(i,{variant:"body2",color:"text.secondary",sx:{mb:2},children:Y(r.readme)}),e.jsx($,{variant:"contained",color:"secondary",endIcon:e.jsx(te,{}),fullWidth:!0,onClick:m=>n(`/${r.name}/`,m),children:"Open Project"})]})]})})}function Pe(){const r=ne();return e.jsx(he,{onClickProject:r})}export{Pe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,I as a,b as m,a4 as _,a2 as D,R as d,am as B,r as v,_ as I,$,B as g,e as f,a1 as z,a0 as W,T as H,ak as F,an as M,ao as U,D as N,Z as L,W as q,ap as K,aq as O,y as P,d as Q}from"./index-DdF3z9Gd.js";import{p as V}from"./index.modern--uQhcQlR.js";import{D as j,a as C,b}from"./DialogTitle-CBoB5s1x.js";function G({open:t,onClose:s,resourceUri:o,data:n,title:p="Data Sources",hasValidImport:i=!0,existingQuery:h,initialSelectedSourceIndex:l,onChange:x,onSourceChange:r}){return e.jsxs(j,{open:t,onClose:s,maxWidth:!1,fullWidth:!0,sx:{"& .MuiDialog-paper":{width:"95vw",height:"95vh",maxWidth:"none"}},children:[e.jsxs(C,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[p,e.jsx(a,{onClick:s,sx:{color:"#666666"},children:e.jsx(m,{})})]}),e.jsx(b,{children:i?e.jsx(_,{resourceUri:o,data:n,existingQuery:h,initialSelectedSourceIndex:l,onChange:x,onSourceChange:r}):e.jsx("div",{children:"No valid import statement found in cell"})})]})}function Z({open:t,onClose:s,result:o,title:n="Results"}){return e.jsxs(j,{open:t,onClose:s,maxWidth:!1,fullWidth:!0,sx:{"& .MuiDialog-paper":{width:"95vw",height:"95vh",maxWidth:"none"}},children:[e.jsxs(C,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[n,e.jsx(a,{onClick:s,sx:{color:"#666666"},children:e.jsx(m,{})})]}),e.jsx(b,{sx:{height:"calc(95vh - 120px)",overflow:"auto",padding:"0 16px"},children:e.jsx(D,{result:o,minHeight:800,maxHeight:800,hideToggle:!0})})]})}const A=/import\s*(?:\{[^}]*\}\s*from\s*)?['"`]([^'"`]+)['"`]/;function J({cell:t,hideCodeCellIcon:s,hideEmbeddingIcon:o,resourceUri:n}){const[p,i]=d.useState(!1),[h,l]=d.useState(!1),[x,r]=d.useState(!1),[c,y]=d.useState(),[T,E]=d.useState(),[R,w]=d.useState(!1),k=!!(t.text&&t.text.match(A)),S=B({query:t.text,resourceUri:n});return v.useEffect(()=>{t.type==="code"&&I(t.text,"malloy").then(u=>{y(u)})},[t]),v.useEffect(()=>{I(S,"typescript").then(u=>{E(u)})},[S]),t.type==="markdown"&&e.jsx($,{children:e.jsx(g,{sx:{"& h1, & h2, & h3, & h4, & h5, & h6":{fontWeight:"600",color:"#1a1a1a",marginBottom:"8px",marginTop:"16px"},"& h1":{fontSize:"28px"},"& h2":{fontSize:"24px"},"& h3":{fontSize:"20px"},"& p":{color:"#333333",lineHeight:"1.7",marginBottom:"8px",fontSize:"16px"},"& ul, & ol":{color:"#333333",lineHeight:"1.7",marginBottom:"8px",fontSize:"16px"},"& li":{marginBottom:"4px"}},children:e.jsx(V,{children:t.text})})})||t.type==="code"&&e.jsxs($,{children:[(!s||!o&&t.result||t.newSources&&t.newSources.length>0)&&e.jsx(f,{sx:{flexDirection:"column",gap:"8px",marginBottom:"16px"},children:t.newSources&&t.newSources.length>0&&k&&e.jsx(z,{sx:{position:"relative",padding:"0"},children:e.jsxs(g,{sx:{display:"flex",alignItems:"center",justifyContent:"space-between",paddingLeft:"24px",paddingRight:"8px"},children:[c&&e.jsx("span",{dangerouslySetInnerHTML:{__html:t.text.length>50&&c?`${c.substring(0,50)}...`:c},style:{fontFamily:"monospace",fontSize:"14px",flex:1,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",marginRight:"8px"}}),e.jsx(a,{sx:{backgroundColor:"rgba(255, 255, 255, 0.9)","&:hover":{backgroundColor:"rgba(255, 255, 255, 1)"},width:"32px",height:"32px",flexShrink:0},onClick:()=>w(!0),children:e.jsx(W,{sx:{fontSize:"18px",color:"#666666"}})})]})})}),e.jsx(G,{open:R,onClose:()=>w(!1),title:"Data Sources",hasValidImport:k,resourceUri:n}),e.jsxs(j,{open:p,onClose:()=>i(!1),maxWidth:"lg",fullWidth:!0,children:[e.jsxs(C,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:["Malloy Code",e.jsx(a,{onClick:()=>i(!1),sx:{color:"#666666"},children:e.jsx(m,{})})]}),e.jsx(b,{children:e.jsx(g,{sx:{border:"1px solid #e0e0e0",borderRadius:"8px",padding:"16px",fontFamily:"monospace",fontSize:"14px",lineHeight:"1.5",overflow:"auto",maxHeight:"70vh",backgroundColor:"#ffffff"},children:e.jsx("pre",{className:"code-display",style:{margin:0},dangerouslySetInnerHTML:{__html:c}})})})]}),e.jsxs(j,{open:h,onClose:()=>l(!1),maxWidth:"lg",fullWidth:!0,children:[e.jsxs(C,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:["Embeddable Code",e.jsx(a,{onClick:()=>l(!1),sx:{color:"#666666"},children:e.jsx(m,{})})]}),e.jsx(b,{children:e.jsxs(f,{sx:{flexDirection:"row",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsx(H,{component:"div",sx:{fontSize:"12px",fontFamily:"monospace","& .line":{textWrap:"wrap"},flex:1},dangerouslySetInnerHTML:{__html:T}}),e.jsx(F,{title:"Copy Embeddable Code",children:e.jsx(a,{sx:{width:"24px",height:"24px",marginLeft:"8px",color:"#666666"},onClick:()=>{navigator.clipboard.writeText(S)},children:e.jsx(M,{})})})]})})]}),e.jsx(Z,{open:x,onClose:()=>r(!1),result:t.result||"",title:"Results"}),t.result&&e.jsxs(z,{sx:{position:"relative"},children:[e.jsx(g,{sx:{paddingTop:"24px"},children:e.jsx(D,{result:t.result,minHeight:300,maxHeight:1e3})}),e.jsx(g,{sx:{position:"absolute",bottom:0,left:0,right:0,height:"40px",background:"linear-gradient(transparent, rgba(255, 255, 255, 0.9))",pointerEvents:"none",zIndex:1}}),e.jsxs(f,{sx:{position:"absolute",top:"8px",right:"8px",flexDirection:"row",gap:"8px",alignItems:"center",zIndex:2},children:[!s&&e.jsx(a,{sx:{backgroundColor:"rgba(255, 255, 255, 0.9)","&:hover":{backgroundColor:"rgba(255, 255, 255, 1)"},width:"32px",height:"32px"},onClick:u=>{u.stopPropagation(),i(!0)},children:e.jsx(U,{sx:{fontSize:"18px",color:"#666666"}})}),e.jsx(a,{sx:{backgroundColor:"rgba(255, 255, 255, 0.9)","&:hover":{backgroundColor:"rgba(255, 255, 255, 1)"},width:"32px",height:"32px"},onClick:()=>r(!0),children:e.jsx(W,{sx:{fontSize:"18px",color:"#666666"}})})]})]})]})}function te({resourceUri:t}){const{apiClients:s}=N(),{projectName:o,packageName:n,versionId:p,modelPath:i}=L(t),{data:h,isSuccess:l,isError:x,error:r}=q({queryKey:[t],queryFn:async()=>(await s.notebooks.getNotebook(o,n,i,p)).data});return e.jsx(K,{children:e.jsx(O,{children:e.jsxs(f,{spacing:3,component:"section",children:[!l&&!x&&e.jsx(P,{text:"Fetching Notebook..."}),l&&h.notebookCells?.map((c,y)=>e.jsx(J,{cell:c,resourceUri:t},y)),x&&r.status===404&&e.jsxs(H,{variant:"body2",sx:{color:"#666666"},children:[e.jsx("code",{children:`${o} > ${n} > ${i}`})," ","not found."]}),x&&r.status!==404&&e.jsx(Q,{error:r,context:`${o} > ${n} > ${i}`})]})})})}export{G as C,te as I,Z as p};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|