@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.
Files changed (306) hide show
  1. package/dist/app/assets/{Chip-DulNumvr.js → Chip-DFxjDMYx.js} +1 -1
  2. package/dist/app/assets/{Container-Dn_IEeIp.js → Container-DvcpwYS4.js} +1 -1
  3. package/dist/app/assets/{DialogTitle-CBoB5s1x.js → DialogTitle-D-8JHIhX.js} +1 -1
  4. package/dist/app/assets/{Edit-CnTAusNy.js → Edit-CY66B5e8.js} +1 -1
  5. package/dist/app/assets/FormControlContext-BW02KQZu.js +1 -0
  6. package/dist/app/assets/HomePage-Bov6-5AZ.js +3 -0
  7. package/dist/app/assets/{MainPage-6getdplb.js → MainPage-BYUYRBax.js} +1 -1
  8. package/dist/app/assets/{MenuItem-DE8NK-Xy.js → MenuItem-CpI-7eAr.js} +1 -1
  9. package/dist/app/assets/{Modal-PUsNPbDx.js → Modal-C-Euultz.js} +1 -1
  10. package/dist/app/assets/{ModelPage-Cuqbuu_v.js → ModelPage-BMg6IR4I.js} +2 -2
  11. package/dist/app/assets/{MoreVert-BqUb6vJH.js → MoreVert-BVtzLkHm.js} +1 -1
  12. package/dist/app/assets/{PackagePage-Cc5cjUZ9.js → PackagePage-Ca-5S4bY.js} +1 -1
  13. package/dist/app/assets/{ProjectPage-CJbF04bc.js → ProjectPage-Csve1erO.js} +1 -1
  14. package/dist/app/assets/{RouteError-CTlaesPV.js → RouteError-DVrYYQx8.js} +1 -1
  15. package/dist/app/assets/{WorkbookPage-CGJZfEXN.js → WorkbookPage-Bos3GG6c.js} +1 -1
  16. package/dist/app/assets/{index-BVlZ6i8j.js → index-B4eYfbqj.js} +1 -1
  17. package/dist/app/assets/{index-DycfvfsO.js → index-CUx2TJnu.js} +1 -1
  18. package/dist/app/assets/{index-DdF3z9Gd.js → index-CXVjjE47.js} +13 -13
  19. package/dist/app/assets/{index.es20-DlWN4z3R.js → index.es20-D_GGseeK.js} +1 -1
  20. package/dist/app/assets/{index.es23-BDdtxnbW.js → index.es23-BsVG9VR1.js} +2 -2
  21. package/dist/app/assets/{index.es310-AKXDC8rl.js → index.es311-B4I7CPCs.js} +1 -1
  22. package/dist/app/assets/{index.es311-CE0-K0fx.js → index.es312-D6Wb5Qbz.js} +1 -1
  23. package/dist/app/assets/{index.es314-CsD4AFJi.js → index.es315-De-j80TX.js} +1 -1
  24. package/dist/app/assets/{index.es319-BAaFF8nF.js → index.es320-BOD1ZJZT.js} +1 -1
  25. package/dist/app/assets/{index.es327-CLjg00CO.js → index.es328-CVyYL2Cb.js} +1 -1
  26. package/dist/app/assets/{index.es328-Dk49f56D.js → index.es329-C73tSnxx.js} +1 -1
  27. package/dist/app/assets/{index.es331-CNjOIk10.js → index.es332-pdJPCQ16.js} +1 -1
  28. package/dist/app/assets/{index.es335-BeNrivcI.js → index.es336-BW2O-pnR.js} +1 -1
  29. package/dist/app/assets/{index.es338-BhR7SkS5.js → index.es339-BaWHmQaH.js} +1 -1
  30. package/dist/app/assets/{index.es341-C_6PzCoq.js → index.es342-D2Lnssjt.js} +1 -1
  31. package/dist/app/assets/{index.es342-D1uAr8c1.js → index.es343-YbS6hTnA.js} +1 -1
  32. package/dist/app/assets/{index.es356-7PPXN4m3.js → index.es357-CoBUMGfg.js} +1 -1
  33. package/dist/app/assets/{index.es357-CJh2QG0N.js → index.es358-DbSm3pvF.js} +1 -1
  34. package/dist/app/assets/{index.es358-C_zZutkw.js → index.es359-DMGMoOZB.js} +1 -1
  35. package/dist/app/assets/{index.es360-DeQ44nE8.js → index.es361-BHceIWHs.js} +1 -1
  36. package/dist/app/assets/{index.es365-oFKdnBEe.js → index.es366-PXx-OsXN.js} +1 -1
  37. package/dist/app/assets/{index.es367-BUiiHWL7.js → index.es368-Cr9RaTtA.js} +1 -1
  38. package/dist/app/assets/{index.es368-Bb8Mmpp1.js → index.es369-C0mtzGRN.js} +1 -1
  39. package/dist/app/assets/{index.es373-C5Q5iXfG.js → index.es374-Drv5n-HJ.js} +1 -1
  40. package/dist/app/assets/{index.es374-s3ewK3v_.js → index.es375-U_De2V6q.js} +1 -1
  41. package/dist/app/assets/{index.es376-Dot0I9EF.js → index.es377-B3MRYiit.js} +1 -1
  42. package/dist/app/assets/{index.es377-B6TLwhtH.js → index.es378-DoTPPeUr.js} +1 -1
  43. package/dist/app/assets/{index.es378-mEifvHi6.js → index.es379-BPm5p9Tu.js} +1 -1
  44. package/dist/app/assets/{index.es381-DdV8KTBv.js → index.es382-DKIqkYbM.js} +1 -1
  45. package/dist/app/assets/{index.es383-B762Qvzb.js → index.es384-DXiKOUzH.js} +1 -1
  46. package/dist/app/assets/{index.es384-DBjLFE2E.js → index.es385-CLF2pcju.js} +1 -1
  47. package/dist/app/assets/{index.es385-DkDs29_v.js → index.es386-Bh-sEjq4.js} +1 -1
  48. package/dist/app/assets/{index.es391-BOBiTPht.js → index.es392-CRHao7mg.js} +1 -1
  49. package/dist/app/assets/{index.es392-BGdYwXRd.js → index.es393-Cm6sEy7_.js} +1 -1
  50. package/dist/app/assets/{index.es393-BnuSumNM.js → index.es394-B8ZpxCSt.js} +1 -1
  51. package/dist/app/assets/{index.es394-DMJpONen.js → index.es395-DkWbmmH5.js} +1 -1
  52. package/dist/app/assets/{index.es396-Dexy1Fdn.js → index.es397-CKDseQYx.js} +1 -1
  53. package/dist/app/assets/{index.es400-V_MXD6ds.js → index.es401-CtFcnffO.js} +1 -1
  54. package/dist/app/assets/{index.es401-CAcCA7it.js → index.es402-CxdH5hVg.js} +1 -1
  55. package/dist/app/assets/{index.es409-DgSxLsfq.js → index.es410-DUOnTx6Y.js} +1 -1
  56. package/dist/app/assets/{index.es412-wcTkTrNP.js → index.es413-o0g0o7a9.js} +1 -1
  57. package/dist/app/assets/{index.es415-hnSTt9Hn.js → index.es416-Dy45-wq4.js} +1 -1
  58. package/dist/app/assets/{index.es418-DwuHSZfi.js → index.es419-DltXKq7x.js} +1 -1
  59. package/dist/app/assets/{index.es422-DWsCMo9a.js → index.es423-CYo8sXPV.js} +1 -1
  60. package/dist/app/assets/{index.es424-CX2jVTDC.js → index.es425-8kqvQzEa.js} +1 -1
  61. package/dist/app/assets/{index.es432-DpOOpPot.js → index.es433-D_41FSTK.js} +1 -1
  62. package/dist/app/assets/{index.es433--E-hGrgp.js → index.es434-DeV3Y_jn.js} +1 -1
  63. package/dist/app/assets/{index.es440-NJaU5ncf.js → index.es441-Cj1Yw83T.js} +1 -1
  64. package/dist/app/assets/{index.es441-CR0Ohpvp.js → index.es442-BAhAeZbN.js} +1 -1
  65. package/dist/app/assets/{index.es451-sHTEx-Dl.js → index.es452-CPGmraR2.js} +1 -1
  66. package/dist/app/assets/{index.es455-9ZC7rz1G.js → index.es456-BdFu7nX3.js} +1 -1
  67. package/dist/app/assets/{index.es461-DAQjszqb.js → index.es462-D6GNpC-z.js} +1 -1
  68. package/dist/app/assets/{index.es466-sT_GOjPl.js → index.es467-ClH_GnCa.js} +1 -1
  69. package/dist/app/assets/{index.es467-D1qnNYJr.js → index.es468-Di3zYFeC.js} +1 -1
  70. package/dist/app/assets/{index.es469-DW1np4pg.js → index.es470-DgLPjbVB.js} +1 -1
  71. package/dist/app/assets/{index.es473-wVAdvQ6_.js → index.es474-B824aOrb.js} +1 -1
  72. package/dist/app/assets/{index.es475-CZM7KBU8.js → index.es476-BlPAYHhB.js} +1 -1
  73. package/dist/app/assets/{index.es477-OAyIdwW_.js → index.es478-BBy72e0U.js} +1 -1
  74. package/dist/app/assets/{index.es480-DSR8isSz.js → index.es481-Df-VYnz4.js} +1 -1
  75. package/dist/app/assets/{index.es481-CBydsWwB.js → index.es482-DNcoqtdL.js} +1 -1
  76. package/dist/app/assets/{index.es485-CJc4fpNV.js → index.es486-D8LYNoLQ.js} +1 -1
  77. package/dist/app/assets/{index.es487-C1wULFp4.js → index.es488-BUMxLwvA.js} +1 -1
  78. package/dist/app/assets/{index.es494-BLp6ucpV.js → index.es495-D-qd6FpS.js} +1 -1
  79. package/dist/app/assets/{index.es496-Tis1R15L.js → index.es497-LaARGtc9.js} +1 -1
  80. package/dist/app/assets/{index.es498-DnIxUf2o.js → index.es499-DUJgu_Bk.js} +1 -1
  81. package/dist/app/assets/{index.es502-DhEHE70J.js → index.es503-BJ9VRCwz.js} +1 -1
  82. package/dist/app/assets/{index.es512-B---8rhN.js → index.es513-DcdvkC6C.js} +1 -1
  83. package/dist/app/assets/{index.es513-BU_koFtA.js → index.es514-BR9aJ-oz.js} +1 -1
  84. package/dist/app/assets/{index.es520-ZlB1VPRK.js → index.es521-B5F1bSbk.js} +1 -1
  85. package/dist/app/assets/{index.es521-VBglaSPm.js → index.es522-DMB2cdTG.js} +1 -1
  86. package/dist/app/assets/index.es7-B-1xtkbo.js +1 -0
  87. package/dist/app/assets/{index.modern--uQhcQlR.js → index.modern-CUFHTrKB.js} +1 -1
  88. package/dist/app/assets/{index.umd-DraF67oa.js → index.umd-BkIL5b5A.js} +1 -1
  89. package/dist/app/assets/{listItemTextClasses-BY1YL8dW.js → listItemTextClasses-lEedVyO7.js} +1 -1
  90. package/dist/app/index.html +1 -1
  91. package/dist/server.js +6047 -1474
  92. package/package.json +1 -1
  93. package/src/server.ts +11 -0
  94. package/src/service/project.ts +11 -17
  95. package/src/service/project_store.ts +156 -47
  96. package/dist/app/assets/FormControlContext-BWbaVxQH.js +0 -1
  97. package/dist/app/assets/HomePage-vbEJVepI.js +0 -3
  98. package/dist/app/assets/index.es7-OgxBdVPl.js +0 -1
  99. /package/dist/app/assets/{index.es299-CG6Dc4jp.js → index.es300-CG6Dc4jp.js} +0 -0
  100. /package/dist/app/assets/{index.es307-DsBKuouk.js → index.es308-DsBKuouk.js} +0 -0
  101. /package/dist/app/assets/{index.es308-D_z4Izcz.js → index.es309-D_z4Izcz.js} +0 -0
  102. /package/dist/app/assets/{index.es309-727ZlQH0.js → index.es310-727ZlQH0.js} +0 -0
  103. /package/dist/app/assets/{index.es312-Dn00JSTd.js → index.es313-Dn00JSTd.js} +0 -0
  104. /package/dist/app/assets/{index.es313-COJ4H7py.js → index.es314-COJ4H7py.js} +0 -0
  105. /package/dist/app/assets/{index.es315-Bu5BbsvL.js → index.es316-Bu5BbsvL.js} +0 -0
  106. /package/dist/app/assets/{index.es316-7O62HKoU.js → index.es317-7O62HKoU.js} +0 -0
  107. /package/dist/app/assets/{index.es317-BPT9niGB.js → index.es318-BPT9niGB.js} +0 -0
  108. /package/dist/app/assets/{index.es318-Dhn9LcZ4.js → index.es319-Dhn9LcZ4.js} +0 -0
  109. /package/dist/app/assets/{index.es320-eg146-Ew.js → index.es321-eg146-Ew.js} +0 -0
  110. /package/dist/app/assets/{index.es321-Du268qiB.js → index.es322-Du268qiB.js} +0 -0
  111. /package/dist/app/assets/{index.es322-fje9CFhw.js → index.es323-fje9CFhw.js} +0 -0
  112. /package/dist/app/assets/{index.es323-BwXTMy5W.js → index.es324-BwXTMy5W.js} +0 -0
  113. /package/dist/app/assets/{index.es324-3xVqZejG.js → index.es325-3xVqZejG.js} +0 -0
  114. /package/dist/app/assets/{index.es325-xW4inM5L.js → index.es326-xW4inM5L.js} +0 -0
  115. /package/dist/app/assets/{index.es326-DHo0CJ0O.js → index.es327-DHo0CJ0O.js} +0 -0
  116. /package/dist/app/assets/{index.es329-C3t2pwGQ.js → index.es330-C3t2pwGQ.js} +0 -0
  117. /package/dist/app/assets/{index.es330-DNquZEk8.js → index.es331-DNquZEk8.js} +0 -0
  118. /package/dist/app/assets/{index.es332-BHOwM8T6.js → index.es333-BHOwM8T6.js} +0 -0
  119. /package/dist/app/assets/{index.es333-DxSadP1t.js → index.es334-DxSadP1t.js} +0 -0
  120. /package/dist/app/assets/{index.es334-DbXoA79R.js → index.es335-DbXoA79R.js} +0 -0
  121. /package/dist/app/assets/{index.es336-Bp6g37R7.js → index.es337-Bp6g37R7.js} +0 -0
  122. /package/dist/app/assets/{index.es337-sacFqUAJ.js → index.es338-sacFqUAJ.js} +0 -0
  123. /package/dist/app/assets/{index.es339-C7gG9l05.js → index.es340-C7gG9l05.js} +0 -0
  124. /package/dist/app/assets/{index.es340-Dsg_Bt_b.js → index.es341-Dsg_Bt_b.js} +0 -0
  125. /package/dist/app/assets/{index.es343-D9R-vmeu.js → index.es344-D9R-vmeu.js} +0 -0
  126. /package/dist/app/assets/{index.es344-BPhBrDlE.js → index.es345-BPhBrDlE.js} +0 -0
  127. /package/dist/app/assets/{index.es345-C-TU5hQ_.js → index.es346-C-TU5hQ_.js} +0 -0
  128. /package/dist/app/assets/{index.es346-DtFQj3wx.js → index.es347-DtFQj3wx.js} +0 -0
  129. /package/dist/app/assets/{index.es347-m2LEI-9-.js → index.es348-m2LEI-9-.js} +0 -0
  130. /package/dist/app/assets/{index.es348-BoXegm-a.js → index.es349-BoXegm-a.js} +0 -0
  131. /package/dist/app/assets/{index.es349-B9wLZaAG.js → index.es350-B9wLZaAG.js} +0 -0
  132. /package/dist/app/assets/{index.es350-ClGRhx96.js → index.es351-ClGRhx96.js} +0 -0
  133. /package/dist/app/assets/{index.es351-DEIpsLCJ.js → index.es352-DEIpsLCJ.js} +0 -0
  134. /package/dist/app/assets/{index.es352-BgYniUM_.js → index.es353-BgYniUM_.js} +0 -0
  135. /package/dist/app/assets/{index.es353-COcR7UxN.js → index.es354-COcR7UxN.js} +0 -0
  136. /package/dist/app/assets/{index.es354-BjQB5zDj.js → index.es355-BjQB5zDj.js} +0 -0
  137. /package/dist/app/assets/{index.es355-C-nORZOA.js → index.es356-C-nORZOA.js} +0 -0
  138. /package/dist/app/assets/{index.es359-BX77sIaO.js → index.es360-BX77sIaO.js} +0 -0
  139. /package/dist/app/assets/{index.es361-B-DoSBHF.js → index.es362-B-DoSBHF.js} +0 -0
  140. /package/dist/app/assets/{index.es362-bCA53EVm.js → index.es363-bCA53EVm.js} +0 -0
  141. /package/dist/app/assets/{index.es363-w-ucz2PV.js → index.es364-w-ucz2PV.js} +0 -0
  142. /package/dist/app/assets/{index.es364-Dayu4EKP.js → index.es365-Dayu4EKP.js} +0 -0
  143. /package/dist/app/assets/{index.es366-DKXYxT9g.js → index.es367-DKXYxT9g.js} +0 -0
  144. /package/dist/app/assets/{index.es369-DfxzS6Rs.js → index.es370-DfxzS6Rs.js} +0 -0
  145. /package/dist/app/assets/{index.es370-SKMF96pI.js → index.es371-SKMF96pI.js} +0 -0
  146. /package/dist/app/assets/{index.es371-ajMbGru0.js → index.es372-ajMbGru0.js} +0 -0
  147. /package/dist/app/assets/{index.es372--30QC5Em.js → index.es373--30QC5Em.js} +0 -0
  148. /package/dist/app/assets/{index.es375-B430Bg39.js → index.es376-B430Bg39.js} +0 -0
  149. /package/dist/app/assets/{index.es379-CM8KxXT1.js → index.es380-CM8KxXT1.js} +0 -0
  150. /package/dist/app/assets/{index.es380-B1SYOhNW.js → index.es381-B1SYOhNW.js} +0 -0
  151. /package/dist/app/assets/{index.es382-DkBy-JyN.js → index.es383-DkBy-JyN.js} +0 -0
  152. /package/dist/app/assets/{index.es386-BILxekzW.js → index.es387-BILxekzW.js} +0 -0
  153. /package/dist/app/assets/{index.es387-C5wWYbrZ.js → index.es388-C5wWYbrZ.js} +0 -0
  154. /package/dist/app/assets/{index.es388-HzYwdGDm.js → index.es389-HzYwdGDm.js} +0 -0
  155. /package/dist/app/assets/{index.es389-T-Tgc4AT.js → index.es390-T-Tgc4AT.js} +0 -0
  156. /package/dist/app/assets/{index.es390-ifBTmRxC.js → index.es391-ifBTmRxC.js} +0 -0
  157. /package/dist/app/assets/{index.es395-BMj5Y0dO.js → index.es396-BMj5Y0dO.js} +0 -0
  158. /package/dist/app/assets/{index.es397-BjABl1g7.js → index.es398-BjABl1g7.js} +0 -0
  159. /package/dist/app/assets/{index.es398-xI-RfyKK.js → index.es399-xI-RfyKK.js} +0 -0
  160. /package/dist/app/assets/{index.es399-ySlJ1b_l.js → index.es400-ySlJ1b_l.js} +0 -0
  161. /package/dist/app/assets/{index.es402-BQoSv7ci.js → index.es403-BQoSv7ci.js} +0 -0
  162. /package/dist/app/assets/{index.es403-w8dY5SsB.js → index.es404-w8dY5SsB.js} +0 -0
  163. /package/dist/app/assets/{index.es404-TU54ms6u.js → index.es405-TU54ms6u.js} +0 -0
  164. /package/dist/app/assets/{index.es405-DREVFZK8.js → index.es406-DREVFZK8.js} +0 -0
  165. /package/dist/app/assets/{index.es406-BfivnA6A.js → index.es407-BfivnA6A.js} +0 -0
  166. /package/dist/app/assets/{index.es407-P4WzXJd0.js → index.es408-P4WzXJd0.js} +0 -0
  167. /package/dist/app/assets/{index.es408-BAng5TT0.js → index.es409-BAng5TT0.js} +0 -0
  168. /package/dist/app/assets/{index.es410-B5lbUyaz.js → index.es411-B5lbUyaz.js} +0 -0
  169. /package/dist/app/assets/{index.es411-mebxcVVE.js → index.es412-mebxcVVE.js} +0 -0
  170. /package/dist/app/assets/{index.es413-XBlWyCtg.js → index.es414-XBlWyCtg.js} +0 -0
  171. /package/dist/app/assets/{index.es414-BfCpw3nA.js → index.es415-BfCpw3nA.js} +0 -0
  172. /package/dist/app/assets/{index.es416-Cc5clBb7.js → index.es417-Cc5clBb7.js} +0 -0
  173. /package/dist/app/assets/{index.es417-IuBKFhSY.js → index.es418-IuBKFhSY.js} +0 -0
  174. /package/dist/app/assets/{index.es419-Du5NY7AG.js → index.es420-Du5NY7AG.js} +0 -0
  175. /package/dist/app/assets/{index.es420-Bvotw-X0.js → index.es421-Bvotw-X0.js} +0 -0
  176. /package/dist/app/assets/{index.es421-UIAJJxZW.js → index.es422-UIAJJxZW.js} +0 -0
  177. /package/dist/app/assets/{index.es423-D9-PGadD.js → index.es424-D9-PGadD.js} +0 -0
  178. /package/dist/app/assets/{index.es425-sdHcTMYB.js → index.es426-sdHcTMYB.js} +0 -0
  179. /package/dist/app/assets/{index.es426-Ci6OQyBP.js → index.es427-Ci6OQyBP.js} +0 -0
  180. /package/dist/app/assets/{index.es427-BC5c_5Pe.js → index.es428-BC5c_5Pe.js} +0 -0
  181. /package/dist/app/assets/{index.es428-Tz6hzZYG.js → index.es429-Tz6hzZYG.js} +0 -0
  182. /package/dist/app/assets/{index.es429-DB_GagMm.js → index.es430-DB_GagMm.js} +0 -0
  183. /package/dist/app/assets/{index.es430-DLbgOhZU.js → index.es431-DLbgOhZU.js} +0 -0
  184. /package/dist/app/assets/{index.es431-B0XVJmRM.js → index.es432-B0XVJmRM.js} +0 -0
  185. /package/dist/app/assets/{index.es434-shcSOmrb.js → index.es435-shcSOmrb.js} +0 -0
  186. /package/dist/app/assets/{index.es435-D4Tzg5kh.js → index.es436-D4Tzg5kh.js} +0 -0
  187. /package/dist/app/assets/{index.es436-Deuh7S70.js → index.es437-Deuh7S70.js} +0 -0
  188. /package/dist/app/assets/{index.es437-BUEGK8hf.js → index.es438-BUEGK8hf.js} +0 -0
  189. /package/dist/app/assets/{index.es438-BNioltXt.js → index.es439-BNioltXt.js} +0 -0
  190. /package/dist/app/assets/{index.es439-JqZropPD.js → index.es440-JqZropPD.js} +0 -0
  191. /package/dist/app/assets/{index.es442-LKU2TuZ1.js → index.es443-LKU2TuZ1.js} +0 -0
  192. /package/dist/app/assets/{index.es443-BFLt1xDp.js → index.es444-BFLt1xDp.js} +0 -0
  193. /package/dist/app/assets/{index.es444-DKykz6zU.js → index.es445-DKykz6zU.js} +0 -0
  194. /package/dist/app/assets/{index.es445-B3ZDOciz.js → index.es446-B3ZDOciz.js} +0 -0
  195. /package/dist/app/assets/{index.es446-CSHBycmS.js → index.es447-CSHBycmS.js} +0 -0
  196. /package/dist/app/assets/{index.es447-BIEUsx6d.js → index.es448-BIEUsx6d.js} +0 -0
  197. /package/dist/app/assets/{index.es448-B48N-Iqd.js → index.es449-B48N-Iqd.js} +0 -0
  198. /package/dist/app/assets/{index.es449-BY-TUvya.js → index.es450-BY-TUvya.js} +0 -0
  199. /package/dist/app/assets/{index.es450-zocC4JxJ.js → index.es451-zocC4JxJ.js} +0 -0
  200. /package/dist/app/assets/{index.es452-Cza_XSSt.js → index.es453-Cza_XSSt.js} +0 -0
  201. /package/dist/app/assets/{index.es453-Bg-kzb6g.js → index.es454-Bg-kzb6g.js} +0 -0
  202. /package/dist/app/assets/{index.es454-DhUJRlN_.js → index.es455-DhUJRlN_.js} +0 -0
  203. /package/dist/app/assets/{index.es456-C8lEn-DE.js → index.es457-C8lEn-DE.js} +0 -0
  204. /package/dist/app/assets/{index.es457-DhMKtDLN.js → index.es458-DhMKtDLN.js} +0 -0
  205. /package/dist/app/assets/{index.es458-CwjWoCRV.js → index.es459-CwjWoCRV.js} +0 -0
  206. /package/dist/app/assets/{index.es459-CzouJOBO.js → index.es460-CzouJOBO.js} +0 -0
  207. /package/dist/app/assets/{index.es460-B1bQXN8T.js → index.es461-B1bQXN8T.js} +0 -0
  208. /package/dist/app/assets/{index.es462-5LuOXUq_.js → index.es463-5LuOXUq_.js} +0 -0
  209. /package/dist/app/assets/{index.es463-DWJ3fJO_.js → index.es464-DWJ3fJO_.js} +0 -0
  210. /package/dist/app/assets/{index.es464-DJlmqQ1C.js → index.es465-DJlmqQ1C.js} +0 -0
  211. /package/dist/app/assets/{index.es465-QhoSD0DR.js → index.es466-QhoSD0DR.js} +0 -0
  212. /package/dist/app/assets/{index.es468-Be6lgOlo.js → index.es469-Be6lgOlo.js} +0 -0
  213. /package/dist/app/assets/{index.es470-BJ4Li9vH.js → index.es471-BJ4Li9vH.js} +0 -0
  214. /package/dist/app/assets/{index.es471-DQVVAn-B.js → index.es472-DQVVAn-B.js} +0 -0
  215. /package/dist/app/assets/{index.es472-BJGe-b2p.js → index.es473-BJGe-b2p.js} +0 -0
  216. /package/dist/app/assets/{index.es474-BLhTXw86.js → index.es475-BLhTXw86.js} +0 -0
  217. /package/dist/app/assets/{index.es476-atvbtKCR.js → index.es477-atvbtKCR.js} +0 -0
  218. /package/dist/app/assets/{index.es478-DkLiglaE.js → index.es479-DkLiglaE.js} +0 -0
  219. /package/dist/app/assets/{index.es479-C1w2a3ep.js → index.es480-C1w2a3ep.js} +0 -0
  220. /package/dist/app/assets/{index.es482-Cf8iN4DR.js → index.es483-Cf8iN4DR.js} +0 -0
  221. /package/dist/app/assets/{index.es483-COK4E0Yg.js → index.es484-COK4E0Yg.js} +0 -0
  222. /package/dist/app/assets/{index.es484-BknIz3MU.js → index.es485-BknIz3MU.js} +0 -0
  223. /package/dist/app/assets/{index.es486-BeQkCIfX.js → index.es487-BeQkCIfX.js} +0 -0
  224. /package/dist/app/assets/{index.es488-BSxZ-RaX.js → index.es489-BSxZ-RaX.js} +0 -0
  225. /package/dist/app/assets/{index.es489-C7L56vO4.js → index.es490-C7L56vO4.js} +0 -0
  226. /package/dist/app/assets/{index.es490-CUnW07Te.js → index.es491-CUnW07Te.js} +0 -0
  227. /package/dist/app/assets/{index.es491-C1XDQQGZ.js → index.es492-C1XDQQGZ.js} +0 -0
  228. /package/dist/app/assets/{index.es492-CQjiPCtT.js → index.es493-CQjiPCtT.js} +0 -0
  229. /package/dist/app/assets/{index.es493-DQ1-QYvQ.js → index.es494-DQ1-QYvQ.js} +0 -0
  230. /package/dist/app/assets/{index.es495-BbSNqyBO.js → index.es496-BbSNqyBO.js} +0 -0
  231. /package/dist/app/assets/{index.es497-CB2ApiWb.js → index.es498-CB2ApiWb.js} +0 -0
  232. /package/dist/app/assets/{index.es499-B_m7g4N7.js → index.es500-B_m7g4N7.js} +0 -0
  233. /package/dist/app/assets/{index.es500-B6W0miNI.js → index.es501-B6W0miNI.js} +0 -0
  234. /package/dist/app/assets/{index.es501-BMR_PYu6.js → index.es502-BMR_PYu6.js} +0 -0
  235. /package/dist/app/assets/{index.es503-Dj6nwHGl.js → index.es504-Dj6nwHGl.js} +0 -0
  236. /package/dist/app/assets/{index.es504-BpWG_bgh.js → index.es505-BpWG_bgh.js} +0 -0
  237. /package/dist/app/assets/{index.es505-BVUVsWT6.js → index.es506-BVUVsWT6.js} +0 -0
  238. /package/dist/app/assets/{index.es506-CAQ2eGtk.js → index.es507-CAQ2eGtk.js} +0 -0
  239. /package/dist/app/assets/{index.es507-BFOHcciG.js → index.es508-BFOHcciG.js} +0 -0
  240. /package/dist/app/assets/{index.es508-CdO5JTpU.js → index.es509-CdO5JTpU.js} +0 -0
  241. /package/dist/app/assets/{index.es509-CJaU5se_.js → index.es510-CJaU5se_.js} +0 -0
  242. /package/dist/app/assets/{index.es510-DYoNaHQp.js → index.es511-DYoNaHQp.js} +0 -0
  243. /package/dist/app/assets/{index.es511-m4uW47V2.js → index.es512-m4uW47V2.js} +0 -0
  244. /package/dist/app/assets/{index.es514-nyqBNV6O.js → index.es515-nyqBNV6O.js} +0 -0
  245. /package/dist/app/assets/{index.es515-C6j12Q_x.js → index.es516-C6j12Q_x.js} +0 -0
  246. /package/dist/app/assets/{index.es516-7A4Fjokl.js → index.es517-7A4Fjokl.js} +0 -0
  247. /package/dist/app/assets/{index.es517-CB0Krxn9.js → index.es518-CB0Krxn9.js} +0 -0
  248. /package/dist/app/assets/{index.es518-DCE3LsBG.js → index.es519-DCE3LsBG.js} +0 -0
  249. /package/dist/app/assets/{index.es519-C3FkfJm5.js → index.es520-C3FkfJm5.js} +0 -0
  250. /package/dist/app/assets/{index.es522-CVw76BM1.js → index.es523-CVw76BM1.js} +0 -0
  251. /package/dist/app/assets/{index.es523-HnGAYVZD.js → index.es524-HnGAYVZD.js} +0 -0
  252. /package/dist/app/assets/{index.es524-BVz_zdnA.js → index.es525-BVz_zdnA.js} +0 -0
  253. /package/dist/app/assets/{index.es525-C3khCPGq.js → index.es526-C3khCPGq.js} +0 -0
  254. /package/dist/app/assets/{index.es526-D-2ljcwZ.js → index.es527-D-2ljcwZ.js} +0 -0
  255. /package/dist/app/assets/{index.es527-Cv9koXgw.js → index.es528-Cv9koXgw.js} +0 -0
  256. /package/dist/app/assets/{index.es528-CD_QflpE.js → index.es529-CD_QflpE.js} +0 -0
  257. /package/dist/app/assets/{index.es529-DRW-0cLl.js → index.es530-DRW-0cLl.js} +0 -0
  258. /package/dist/app/assets/{index.es530-C-_shW-Y.js → index.es531-C-_shW-Y.js} +0 -0
  259. /package/dist/app/assets/{index.es531-LGGdnPYs.js → index.es532-LGGdnPYs.js} +0 -0
  260. /package/dist/app/assets/{index.es532-C3mMm8J8.js → index.es533-C3mMm8J8.js} +0 -0
  261. /package/dist/app/assets/{index.es533-BzJJZx-M.js → index.es534-BzJJZx-M.js} +0 -0
  262. /package/dist/app/assets/{index.es534-BXkSAIEj.js → index.es535-BXkSAIEj.js} +0 -0
  263. /package/dist/app/assets/{index.es535-BgDCqdQA.js → index.es536-BgDCqdQA.js} +0 -0
  264. /package/dist/app/assets/{index.es536-C8M2exoo.js → index.es537-C8M2exoo.js} +0 -0
  265. /package/dist/app/assets/{index.es537-DHJKELXO.js → index.es538-DHJKELXO.js} +0 -0
  266. /package/dist/app/assets/{index.es538-Cuk6v7N8.js → index.es539-Cuk6v7N8.js} +0 -0
  267. /package/dist/app/assets/{index.es539-DH5Ifo-i.js → index.es540-DH5Ifo-i.js} +0 -0
  268. /package/dist/app/assets/{index.es540-E3gJ1_iC.js → index.es541-E3gJ1_iC.js} +0 -0
  269. /package/dist/app/assets/{index.es541-DAi9KRSo.js → index.es542-DAi9KRSo.js} +0 -0
  270. /package/dist/app/assets/{index.es542-D7oLnXFd.js → index.es543-D7oLnXFd.js} +0 -0
  271. /package/dist/app/assets/{index.es543-BfjtVDDH.js → index.es544-BfjtVDDH.js} +0 -0
  272. /package/dist/app/assets/{index.es544-DnULxvSX.js → index.es545-DnULxvSX.js} +0 -0
  273. /package/dist/app/assets/{index.es545-CkXjmgJE.js → index.es546-CkXjmgJE.js} +0 -0
  274. /package/dist/app/assets/{index.es546-CfQXZHmo.js → index.es547-CfQXZHmo.js} +0 -0
  275. /package/dist/app/assets/{index.es547-DWedfzmr.js → index.es548-DWedfzmr.js} +0 -0
  276. /package/dist/app/assets/{index.es548-DUszq2jm.js → index.es549-DUszq2jm.js} +0 -0
  277. /package/dist/app/assets/{index.es549-B7mTdjB0.js → index.es550-B7mTdjB0.js} +0 -0
  278. /package/dist/app/assets/{index.es550-D5KoaKCx.js → index.es551-D5KoaKCx.js} +0 -0
  279. /package/dist/app/assets/{index.es551-BfHTSMKl.js → index.es552-BfHTSMKl.js} +0 -0
  280. /package/dist/app/assets/{index.es552-B0m2ddpp.js → index.es553-B0m2ddpp.js} +0 -0
  281. /package/dist/app/assets/{index.es553-CyktbL80.js → index.es554-CyktbL80.js} +0 -0
  282. /package/dist/app/assets/{index.es554-Csfq5Kiy.js → index.es555-Csfq5Kiy.js} +0 -0
  283. /package/dist/app/assets/{index.es555-CafNBF8u.js → index.es556-CafNBF8u.js} +0 -0
  284. /package/dist/app/assets/{index.es556-CTRr51gU.js → index.es557-CTRr51gU.js} +0 -0
  285. /package/dist/app/assets/{index.es557-D4h5O-jR.js → index.es558-D4h5O-jR.js} +0 -0
  286. /package/dist/app/assets/{index.es558-C39BiMTA.js → index.es559-C39BiMTA.js} +0 -0
  287. /package/dist/app/assets/{index.es559-Ddv68eIx.js → index.es560-Ddv68eIx.js} +0 -0
  288. /package/dist/app/assets/{index.es560-GBQ2dnAY.js → index.es561-GBQ2dnAY.js} +0 -0
  289. /package/dist/app/assets/{index.es561-PoHY5YXO.js → index.es562-PoHY5YXO.js} +0 -0
  290. /package/dist/app/assets/{index.es562-3e1v2bzS.js → index.es563-3e1v2bzS.js} +0 -0
  291. /package/dist/app/assets/{index.es563-CS3Unz2-.js → index.es564-CS3Unz2-.js} +0 -0
  292. /package/dist/app/assets/{index.es564-bN70gL4F.js → index.es565-bN70gL4F.js} +0 -0
  293. /package/dist/app/assets/{index.es565-CmCqftbK.js → index.es566-CmCqftbK.js} +0 -0
  294. /package/dist/app/assets/{index.es566-Ds-gbosJ.js → index.es567-Ds-gbosJ.js} +0 -0
  295. /package/dist/app/assets/{index.es567-CjDtw9vr.js → index.es568-CjDtw9vr.js} +0 -0
  296. /package/dist/app/assets/{index.es568-BthQWCQV.js → index.es569-BthQWCQV.js} +0 -0
  297. /package/dist/app/assets/{index.es569-DqwNpetd.js → index.es570-DqwNpetd.js} +0 -0
  298. /package/dist/app/assets/{index.es570-Bw305WKR.js → index.es571-Bw305WKR.js} +0 -0
  299. /package/dist/app/assets/{index.es571-DXbdFlpD.js → index.es572-DXbdFlpD.js} +0 -0
  300. /package/dist/app/assets/{index.es572-L9t79GZl.js → index.es573-L9t79GZl.js} +0 -0
  301. /package/dist/app/assets/{index.es573-CbfX1IO0.js → index.es574-CbfX1IO0.js} +0 -0
  302. /package/dist/app/assets/{index.es574-DBQeEorK.js → index.es575-DBQeEorK.js} +0 -0
  303. /package/dist/app/assets/{index.es575-BEBZ7ncR.js → index.es576-BEBZ7ncR.js} +0 -0
  304. /package/dist/app/assets/{index.es576-Bkuqu6BP.js → index.es577-Bkuqu6BP.js} +0 -0
  305. /package/dist/app/assets/{index.es577-D0r3Knsf.js → index.es578-D0r3Knsf.js} +0 -0
  306. /package/dist/app/assets/{index.es578-CVO1_9PV.js → index.es579-CVO1_9PV.js} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@malloy-publisher/server",
3
3
  "description": "Malloy Publisher Server",
4
- "version": "0.0.109",
4
+ "version": "0.0.111",
5
5
  "main": "dist/server.js",
6
6
  "bin": {
7
7
  "malloy-publisher": "dist/server.js"
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) => {
@@ -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, PACKAGE_MANIFEST_NAME, README_NAME } from "../constants";
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
- packageDirectories.map(async (directory) => {
187
+ Array.from(this.packageStatuses.keys()).map(async (packageName) => {
198
188
  try {
199
- return (
200
- this.packageStatuses.get(directory.name)?.status ===
189
+ const packageMetadata = (
190
+ this.packageStatuses.get(packageName)?.status ===
201
191
  PackageStatus.LOADING
202
192
  ? undefined
203
- : await this.getPackage(directory.name, false)
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: ${directory.name} due to : ${error}`,
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
- const location = _package.location;
363
- const packageName = _package.name;
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(location)) {
366
- locationGroups.set(location, []);
416
+ if (!locationGroups.has(locationKey)) {
417
+ locationGroups.set(locationKey, []);
367
418
  }
368
- locationGroups.get(location)!.push({ name: packageName, location });
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 [location, packagesForLocation] of locationGroups) {
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
- location,
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
- // Download the entire location once
436
+ // Use the existing download method for all locations
383
437
  await this.downloadOrMountLocation(
384
- location,
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
- // Check if the package directory exists in the downloaded content
396
- const packagePathInDownload = path.join(
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 (packageExists) {
406
- // Copy the specific package directory
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
- packagePathInDownload,
412
- absolutePackagePath,
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 package directory doesn't exist, copy the entire download as the package
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(`Failed to download or mount location "${location}"`, {
434
- error,
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: ${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 (location.startsWith("gs://")) {
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 (location.startsWith("s3://")) {
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 (path.isAbsolute(location) || location.startsWith("./")) {
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 githubRepoRegex =
697
- /github\.com\/(?<owner>[^/]+)\/(?<repoName>[^/]+)(?<packagePath>\/[^/]+)*/;
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 } = match.groups!;
703
- const cleanPackagePath = packagePath.replace("/tree/main", "");
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};