@malloy-publisher/server 0.0.110 → 0.0.112

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 (316) hide show
  1. package/dist/app/assets/Chip-QKOHsU1g.js +1 -0
  2. package/dist/app/assets/{Container-Dg_Kf31J.js → Container-L_WqT4jT.js} +1 -1
  3. package/dist/app/assets/{DialogTitle-CHBg1LY0.js → DialogTitle-Bn08FgCr.js} +1 -1
  4. package/dist/app/assets/{Edit-C6YfplwT.js → Edit-BJgSEJcw.js} +1 -1
  5. package/dist/app/assets/FormControlContext-Dw41r2fL.js +1 -0
  6. package/dist/app/assets/HomePage-7j10faAk.js +3 -0
  7. package/dist/app/assets/MainPage-CAwngISZ.js +1 -0
  8. package/dist/app/assets/MenuItem-lIU1AdLr.js +1 -0
  9. package/dist/app/assets/{Modal-BKeOa8cn.js → Modal-D1yZSrQW.js} +1 -1
  10. package/dist/app/assets/{ModelPage-PyBDJf_o.js → ModelPage-BZzRs40Z.js} +2 -2
  11. package/dist/app/assets/MoreVert-BnS0-_a-.js +1 -0
  12. package/dist/app/assets/PackagePage-CpVMURqi.js +2 -0
  13. package/dist/app/assets/{ProjectPage-D5jntFzr.js → ProjectPage-Wkk3rsE4.js} +1 -1
  14. package/dist/app/assets/{RouteError-DMmcYLCb.js → RouteError-DSynFzxI.js} +1 -1
  15. package/dist/app/assets/{WorkbookPage-DyeCwzrs.js → WorkbookPage-CAKkhCC4.js} +2 -2
  16. package/dist/app/assets/{index-BWeiQV2D.js → index-BTifa3VC.js} +1 -1
  17. package/dist/app/assets/index-Csigubii.js +420 -0
  18. package/dist/app/assets/{index-BrYw7sx9.js → index-GXiK4wJn.js} +1 -1
  19. package/dist/app/assets/{index.es20-7LPyahVV.js → index.es20-Xp2DiRye.js} +1 -1
  20. package/dist/app/assets/{index.es23-D1ICAtTa.js → index.es23-DEF5rVoS.js} +2 -2
  21. package/dist/app/assets/{index.es307-Hyqfwej7.js → index.es310-AKXDC8rl.js} +1 -1
  22. package/dist/app/assets/{index.es308-DazkJUgb.js → index.es311-CE0-K0fx.js} +1 -1
  23. package/dist/app/assets/{index.es311-Bdd10041.js → index.es314-CsD4AFJi.js} +1 -1
  24. package/dist/app/assets/{index.es316-CoGLDRT0.js → index.es319-BAaFF8nF.js} +1 -1
  25. package/dist/app/assets/{index.es324-BsszfF5h.js → index.es327-CLjg00CO.js} +1 -1
  26. package/dist/app/assets/{index.es325-DRDvBdmi.js → index.es328-Dk49f56D.js} +1 -1
  27. package/dist/app/assets/{index.es328-CFMQ5MRM.js → index.es331-CNjOIk10.js} +1 -1
  28. package/dist/app/assets/{index.es332-fOGuE522.js → index.es335-BeNrivcI.js} +1 -1
  29. package/dist/app/assets/{index.es335-DaItj58o.js → index.es338-BhR7SkS5.js} +1 -1
  30. package/dist/app/assets/{index.es338-UjLQeCTc.js → index.es341-C_6PzCoq.js} +1 -1
  31. package/dist/app/assets/{index.es339-DRQ2Op-C.js → index.es342-D1uAr8c1.js} +1 -1
  32. package/dist/app/assets/{index.es353-DJ9OBLYp.js → index.es356-7PPXN4m3.js} +1 -1
  33. package/dist/app/assets/{index.es354-C2ph-Vgb.js → index.es357-CJh2QG0N.js} +1 -1
  34. package/dist/app/assets/{index.es355-CdFcIAjR.js → index.es358-C_zZutkw.js} +1 -1
  35. package/dist/app/assets/{index.es357-DnD6YfsZ.js → index.es360-DeQ44nE8.js} +1 -1
  36. package/dist/app/assets/{index.es362-DQGGaNK3.js → index.es365-oFKdnBEe.js} +1 -1
  37. package/dist/app/assets/{index.es364-SjsfRDU5.js → index.es367-BUiiHWL7.js} +1 -1
  38. package/dist/app/assets/{index.es365-BFB9M3aQ.js → index.es368-Bb8Mmpp1.js} +1 -1
  39. package/dist/app/assets/{index.es370-Cykbl5AV.js → index.es373-C5Q5iXfG.js} +1 -1
  40. package/dist/app/assets/{index.es371-C1_-FGZD.js → index.es374-s3ewK3v_.js} +1 -1
  41. package/dist/app/assets/{index.es373-TI9wv2aA.js → index.es376-Dot0I9EF.js} +1 -1
  42. package/dist/app/assets/{index.es374-D2MetvHl.js → index.es377-B6TLwhtH.js} +1 -1
  43. package/dist/app/assets/{index.es375-Cl8RLiLz.js → index.es378-mEifvHi6.js} +1 -1
  44. package/dist/app/assets/{index.es378-DEt7_vw7.js → index.es381-DdV8KTBv.js} +1 -1
  45. package/dist/app/assets/{index.es380-B_rO6vHZ.js → index.es383-B762Qvzb.js} +1 -1
  46. package/dist/app/assets/{index.es381-BALGI3Ev.js → index.es384-DBjLFE2E.js} +1 -1
  47. package/dist/app/assets/{index.es382-WH9q9eN4.js → index.es385-DkDs29_v.js} +1 -1
  48. package/dist/app/assets/{index.es388-CvzBQwR4.js → index.es391-BOBiTPht.js} +1 -1
  49. package/dist/app/assets/{index.es389-Sf3IwiTw.js → index.es392-BGdYwXRd.js} +1 -1
  50. package/dist/app/assets/{index.es390-CvRV_DLA.js → index.es393-BnuSumNM.js} +1 -1
  51. package/dist/app/assets/{index.es391-BMUNnyko.js → index.es394-DMJpONen.js} +1 -1
  52. package/dist/app/assets/{index.es393-gzScel_V.js → index.es396-Dexy1Fdn.js} +1 -1
  53. package/dist/app/assets/{index.es397-ChSe2MGM.js → index.es400-V_MXD6ds.js} +1 -1
  54. package/dist/app/assets/{index.es398-BM1JIu87.js → index.es401-CAcCA7it.js} +1 -1
  55. package/dist/app/assets/{index.es406-jeYEdLwu.js → index.es409-DgSxLsfq.js} +1 -1
  56. package/dist/app/assets/{index.es409-JBGcHOPL.js → index.es412-wcTkTrNP.js} +1 -1
  57. package/dist/app/assets/{index.es412-BneQpd2K.js → index.es415-hnSTt9Hn.js} +1 -1
  58. package/dist/app/assets/{index.es415-D2YJmODz.js → index.es418-DwuHSZfi.js} +1 -1
  59. package/dist/app/assets/{index.es419-Be9XEXai.js → index.es422-DWsCMo9a.js} +1 -1
  60. package/dist/app/assets/{index.es421-DNif9a-1.js → index.es424-CX2jVTDC.js} +1 -1
  61. package/dist/app/assets/{index.es429-QvpEdVuu.js → index.es432-DpOOpPot.js} +1 -1
  62. package/dist/app/assets/{index.es430-BSC0RjJg.js → index.es433--E-hGrgp.js} +1 -1
  63. package/dist/app/assets/{index.es437-CU58aSis.js → index.es440-NJaU5ncf.js} +1 -1
  64. package/dist/app/assets/{index.es438-DLcyg_Nq.js → index.es441-CR0Ohpvp.js} +1 -1
  65. package/dist/app/assets/{index.es448-FCeFQPCW.js → index.es451-sHTEx-Dl.js} +1 -1
  66. package/dist/app/assets/{index.es452-BRZPWepa.js → index.es455-9ZC7rz1G.js} +1 -1
  67. package/dist/app/assets/{index.es458-Bpkji9ao.js → index.es461-DAQjszqb.js} +1 -1
  68. package/dist/app/assets/{index.es463-BaecNR2n.js → index.es466-sT_GOjPl.js} +1 -1
  69. package/dist/app/assets/{index.es464-CTWl2km5.js → index.es467-D1qnNYJr.js} +1 -1
  70. package/dist/app/assets/{index.es466-CfLTsC9T.js → index.es469-DW1np4pg.js} +1 -1
  71. package/dist/app/assets/{index.es470-8ULDOKZc.js → index.es473-wVAdvQ6_.js} +1 -1
  72. package/dist/app/assets/{index.es472-DcGdjhrt.js → index.es475-CZM7KBU8.js} +1 -1
  73. package/dist/app/assets/{index.es474-DEhGnLk1.js → index.es477-OAyIdwW_.js} +1 -1
  74. package/dist/app/assets/{index.es477-CL6caFH2.js → index.es480-DSR8isSz.js} +1 -1
  75. package/dist/app/assets/{index.es478-Bxqeavdu.js → index.es481-CBydsWwB.js} +1 -1
  76. package/dist/app/assets/{index.es482-CkcBD1qi.js → index.es485-CJc4fpNV.js} +1 -1
  77. package/dist/app/assets/{index.es484-mnzfO9M-.js → index.es487-C1wULFp4.js} +1 -1
  78. package/dist/app/assets/{index.es491-D7XbqGCN.js → index.es494-BLp6ucpV.js} +1 -1
  79. package/dist/app/assets/{index.es493-CnKU-AzQ.js → index.es496-Tis1R15L.js} +1 -1
  80. package/dist/app/assets/{index.es495-o1LZm3EH.js → index.es498-DnIxUf2o.js} +1 -1
  81. package/dist/app/assets/{index.es499-txiTaLX0.js → index.es502-DhEHE70J.js} +1 -1
  82. package/dist/app/assets/{index.es509-DAhk5QW9.js → index.es512-B---8rhN.js} +1 -1
  83. package/dist/app/assets/{index.es510-BTIWftZ_.js → index.es513-BU_koFtA.js} +1 -1
  84. package/dist/app/assets/{index.es517-_uBYPj5P.js → index.es520-ZlB1VPRK.js} +1 -1
  85. package/dist/app/assets/{index.es518-Duh4FRo0.js → index.es521-VBglaSPm.js} +1 -1
  86. package/dist/app/assets/index.es7-4Yy4RzF4.js +1 -0
  87. package/dist/app/assets/index.modern-DMvoTRLq.js +17 -0
  88. package/dist/app/assets/{index.umd-DFsry6Xq.js → index.umd-B5zPGg7f.js} +1 -1
  89. package/dist/app/assets/listItemTextClasses-gPHO1JUj.js +1 -0
  90. package/dist/app/index.html +1 -1
  91. package/dist/instrumentation.js +2280 -1003
  92. package/dist/server.js +11373 -4120
  93. package/package.json +1 -1
  94. package/src/server.ts +11 -0
  95. package/src/service/connection.ts +10 -9
  96. package/src/service/project.ts +11 -17
  97. package/src/service/project_store.ts +156 -47
  98. package/dist/app/assets/Chip-CzV-d1RE.js +0 -1
  99. package/dist/app/assets/FormControlContext-VBpiETuD.js +0 -1
  100. package/dist/app/assets/HomePage-B7xMQBXw.js +0 -3
  101. package/dist/app/assets/MainPage-Cvxb9XmX.js +0 -1
  102. package/dist/app/assets/MenuItem-Ct1Eq8uZ.js +0 -1
  103. package/dist/app/assets/MoreVert-BXQIW75e.js +0 -1
  104. package/dist/app/assets/PackagePage-CdhWdIyz.js +0 -2
  105. package/dist/app/assets/index-D2hrtqN7.js +0 -420
  106. package/dist/app/assets/index.es7-CBMchwTf.js +0 -1
  107. package/dist/app/assets/index.modern-C9fiiwjh.js +0 -17
  108. package/dist/app/assets/listItemTextClasses-st6hnk8F.js +0 -1
  109. /package/dist/app/assets/{index.es296-CG6Dc4jp.js → index.es299-CG6Dc4jp.js} +0 -0
  110. /package/dist/app/assets/{index.es304-DsBKuouk.js → index.es307-DsBKuouk.js} +0 -0
  111. /package/dist/app/assets/{index.es305-D_z4Izcz.js → index.es308-D_z4Izcz.js} +0 -0
  112. /package/dist/app/assets/{index.es306-727ZlQH0.js → index.es309-727ZlQH0.js} +0 -0
  113. /package/dist/app/assets/{index.es309-Dn00JSTd.js → index.es312-Dn00JSTd.js} +0 -0
  114. /package/dist/app/assets/{index.es310-COJ4H7py.js → index.es313-COJ4H7py.js} +0 -0
  115. /package/dist/app/assets/{index.es312-Bu5BbsvL.js → index.es315-Bu5BbsvL.js} +0 -0
  116. /package/dist/app/assets/{index.es313-7O62HKoU.js → index.es316-7O62HKoU.js} +0 -0
  117. /package/dist/app/assets/{index.es314-BPT9niGB.js → index.es317-BPT9niGB.js} +0 -0
  118. /package/dist/app/assets/{index.es315-Dhn9LcZ4.js → index.es318-Dhn9LcZ4.js} +0 -0
  119. /package/dist/app/assets/{index.es317-eg146-Ew.js → index.es320-eg146-Ew.js} +0 -0
  120. /package/dist/app/assets/{index.es318-Du268qiB.js → index.es321-Du268qiB.js} +0 -0
  121. /package/dist/app/assets/{index.es319-fje9CFhw.js → index.es322-fje9CFhw.js} +0 -0
  122. /package/dist/app/assets/{index.es320-BwXTMy5W.js → index.es323-BwXTMy5W.js} +0 -0
  123. /package/dist/app/assets/{index.es321-3xVqZejG.js → index.es324-3xVqZejG.js} +0 -0
  124. /package/dist/app/assets/{index.es322-xW4inM5L.js → index.es325-xW4inM5L.js} +0 -0
  125. /package/dist/app/assets/{index.es323-DHo0CJ0O.js → index.es326-DHo0CJ0O.js} +0 -0
  126. /package/dist/app/assets/{index.es326-C3t2pwGQ.js → index.es329-C3t2pwGQ.js} +0 -0
  127. /package/dist/app/assets/{index.es327-DNquZEk8.js → index.es330-DNquZEk8.js} +0 -0
  128. /package/dist/app/assets/{index.es329-BHOwM8T6.js → index.es332-BHOwM8T6.js} +0 -0
  129. /package/dist/app/assets/{index.es330-DxSadP1t.js → index.es333-DxSadP1t.js} +0 -0
  130. /package/dist/app/assets/{index.es331-DbXoA79R.js → index.es334-DbXoA79R.js} +0 -0
  131. /package/dist/app/assets/{index.es333-Bp6g37R7.js → index.es336-Bp6g37R7.js} +0 -0
  132. /package/dist/app/assets/{index.es334-sacFqUAJ.js → index.es337-sacFqUAJ.js} +0 -0
  133. /package/dist/app/assets/{index.es336-C7gG9l05.js → index.es339-C7gG9l05.js} +0 -0
  134. /package/dist/app/assets/{index.es337-Dsg_Bt_b.js → index.es340-Dsg_Bt_b.js} +0 -0
  135. /package/dist/app/assets/{index.es340-D9R-vmeu.js → index.es343-D9R-vmeu.js} +0 -0
  136. /package/dist/app/assets/{index.es341-BPhBrDlE.js → index.es344-BPhBrDlE.js} +0 -0
  137. /package/dist/app/assets/{index.es342-C-TU5hQ_.js → index.es345-C-TU5hQ_.js} +0 -0
  138. /package/dist/app/assets/{index.es343-DtFQj3wx.js → index.es346-DtFQj3wx.js} +0 -0
  139. /package/dist/app/assets/{index.es344-m2LEI-9-.js → index.es347-m2LEI-9-.js} +0 -0
  140. /package/dist/app/assets/{index.es345-BoXegm-a.js → index.es348-BoXegm-a.js} +0 -0
  141. /package/dist/app/assets/{index.es346-B9wLZaAG.js → index.es349-B9wLZaAG.js} +0 -0
  142. /package/dist/app/assets/{index.es347-ClGRhx96.js → index.es350-ClGRhx96.js} +0 -0
  143. /package/dist/app/assets/{index.es348-DEIpsLCJ.js → index.es351-DEIpsLCJ.js} +0 -0
  144. /package/dist/app/assets/{index.es349-BgYniUM_.js → index.es352-BgYniUM_.js} +0 -0
  145. /package/dist/app/assets/{index.es350-COcR7UxN.js → index.es353-COcR7UxN.js} +0 -0
  146. /package/dist/app/assets/{index.es351-BjQB5zDj.js → index.es354-BjQB5zDj.js} +0 -0
  147. /package/dist/app/assets/{index.es352-C-nORZOA.js → index.es355-C-nORZOA.js} +0 -0
  148. /package/dist/app/assets/{index.es356-BX77sIaO.js → index.es359-BX77sIaO.js} +0 -0
  149. /package/dist/app/assets/{index.es358-B-DoSBHF.js → index.es361-B-DoSBHF.js} +0 -0
  150. /package/dist/app/assets/{index.es359-bCA53EVm.js → index.es362-bCA53EVm.js} +0 -0
  151. /package/dist/app/assets/{index.es360-w-ucz2PV.js → index.es363-w-ucz2PV.js} +0 -0
  152. /package/dist/app/assets/{index.es361-Dayu4EKP.js → index.es364-Dayu4EKP.js} +0 -0
  153. /package/dist/app/assets/{index.es363-DKXYxT9g.js → index.es366-DKXYxT9g.js} +0 -0
  154. /package/dist/app/assets/{index.es366-DfxzS6Rs.js → index.es369-DfxzS6Rs.js} +0 -0
  155. /package/dist/app/assets/{index.es367-SKMF96pI.js → index.es370-SKMF96pI.js} +0 -0
  156. /package/dist/app/assets/{index.es368-ajMbGru0.js → index.es371-ajMbGru0.js} +0 -0
  157. /package/dist/app/assets/{index.es369--30QC5Em.js → index.es372--30QC5Em.js} +0 -0
  158. /package/dist/app/assets/{index.es372-B430Bg39.js → index.es375-B430Bg39.js} +0 -0
  159. /package/dist/app/assets/{index.es376-CM8KxXT1.js → index.es379-CM8KxXT1.js} +0 -0
  160. /package/dist/app/assets/{index.es377-B1SYOhNW.js → index.es380-B1SYOhNW.js} +0 -0
  161. /package/dist/app/assets/{index.es379-DkBy-JyN.js → index.es382-DkBy-JyN.js} +0 -0
  162. /package/dist/app/assets/{index.es383-BILxekzW.js → index.es386-BILxekzW.js} +0 -0
  163. /package/dist/app/assets/{index.es384-C5wWYbrZ.js → index.es387-C5wWYbrZ.js} +0 -0
  164. /package/dist/app/assets/{index.es385-HzYwdGDm.js → index.es388-HzYwdGDm.js} +0 -0
  165. /package/dist/app/assets/{index.es386-T-Tgc4AT.js → index.es389-T-Tgc4AT.js} +0 -0
  166. /package/dist/app/assets/{index.es387-ifBTmRxC.js → index.es390-ifBTmRxC.js} +0 -0
  167. /package/dist/app/assets/{index.es392-BMj5Y0dO.js → index.es395-BMj5Y0dO.js} +0 -0
  168. /package/dist/app/assets/{index.es394-BjABl1g7.js → index.es397-BjABl1g7.js} +0 -0
  169. /package/dist/app/assets/{index.es395-xI-RfyKK.js → index.es398-xI-RfyKK.js} +0 -0
  170. /package/dist/app/assets/{index.es396-ySlJ1b_l.js → index.es399-ySlJ1b_l.js} +0 -0
  171. /package/dist/app/assets/{index.es399-BQoSv7ci.js → index.es402-BQoSv7ci.js} +0 -0
  172. /package/dist/app/assets/{index.es400-w8dY5SsB.js → index.es403-w8dY5SsB.js} +0 -0
  173. /package/dist/app/assets/{index.es401-TU54ms6u.js → index.es404-TU54ms6u.js} +0 -0
  174. /package/dist/app/assets/{index.es402-DREVFZK8.js → index.es405-DREVFZK8.js} +0 -0
  175. /package/dist/app/assets/{index.es403-BfivnA6A.js → index.es406-BfivnA6A.js} +0 -0
  176. /package/dist/app/assets/{index.es404-P4WzXJd0.js → index.es407-P4WzXJd0.js} +0 -0
  177. /package/dist/app/assets/{index.es405-BAng5TT0.js → index.es408-BAng5TT0.js} +0 -0
  178. /package/dist/app/assets/{index.es407-B5lbUyaz.js → index.es410-B5lbUyaz.js} +0 -0
  179. /package/dist/app/assets/{index.es408-mebxcVVE.js → index.es411-mebxcVVE.js} +0 -0
  180. /package/dist/app/assets/{index.es410-XBlWyCtg.js → index.es413-XBlWyCtg.js} +0 -0
  181. /package/dist/app/assets/{index.es411-BfCpw3nA.js → index.es414-BfCpw3nA.js} +0 -0
  182. /package/dist/app/assets/{index.es413-Cc5clBb7.js → index.es416-Cc5clBb7.js} +0 -0
  183. /package/dist/app/assets/{index.es414-IuBKFhSY.js → index.es417-IuBKFhSY.js} +0 -0
  184. /package/dist/app/assets/{index.es416-Du5NY7AG.js → index.es419-Du5NY7AG.js} +0 -0
  185. /package/dist/app/assets/{index.es417-Bvotw-X0.js → index.es420-Bvotw-X0.js} +0 -0
  186. /package/dist/app/assets/{index.es418-UIAJJxZW.js → index.es421-UIAJJxZW.js} +0 -0
  187. /package/dist/app/assets/{index.es420-D9-PGadD.js → index.es423-D9-PGadD.js} +0 -0
  188. /package/dist/app/assets/{index.es422-sdHcTMYB.js → index.es425-sdHcTMYB.js} +0 -0
  189. /package/dist/app/assets/{index.es423-Ci6OQyBP.js → index.es426-Ci6OQyBP.js} +0 -0
  190. /package/dist/app/assets/{index.es424-BC5c_5Pe.js → index.es427-BC5c_5Pe.js} +0 -0
  191. /package/dist/app/assets/{index.es425-Tz6hzZYG.js → index.es428-Tz6hzZYG.js} +0 -0
  192. /package/dist/app/assets/{index.es426-DB_GagMm.js → index.es429-DB_GagMm.js} +0 -0
  193. /package/dist/app/assets/{index.es427-DLbgOhZU.js → index.es430-DLbgOhZU.js} +0 -0
  194. /package/dist/app/assets/{index.es428-B0XVJmRM.js → index.es431-B0XVJmRM.js} +0 -0
  195. /package/dist/app/assets/{index.es431-shcSOmrb.js → index.es434-shcSOmrb.js} +0 -0
  196. /package/dist/app/assets/{index.es432-D4Tzg5kh.js → index.es435-D4Tzg5kh.js} +0 -0
  197. /package/dist/app/assets/{index.es433-Deuh7S70.js → index.es436-Deuh7S70.js} +0 -0
  198. /package/dist/app/assets/{index.es434-BUEGK8hf.js → index.es437-BUEGK8hf.js} +0 -0
  199. /package/dist/app/assets/{index.es435-BNioltXt.js → index.es438-BNioltXt.js} +0 -0
  200. /package/dist/app/assets/{index.es436-JqZropPD.js → index.es439-JqZropPD.js} +0 -0
  201. /package/dist/app/assets/{index.es439-LKU2TuZ1.js → index.es442-LKU2TuZ1.js} +0 -0
  202. /package/dist/app/assets/{index.es440-BFLt1xDp.js → index.es443-BFLt1xDp.js} +0 -0
  203. /package/dist/app/assets/{index.es441-DKykz6zU.js → index.es444-DKykz6zU.js} +0 -0
  204. /package/dist/app/assets/{index.es442-B3ZDOciz.js → index.es445-B3ZDOciz.js} +0 -0
  205. /package/dist/app/assets/{index.es443-CSHBycmS.js → index.es446-CSHBycmS.js} +0 -0
  206. /package/dist/app/assets/{index.es444-BIEUsx6d.js → index.es447-BIEUsx6d.js} +0 -0
  207. /package/dist/app/assets/{index.es445-B48N-Iqd.js → index.es448-B48N-Iqd.js} +0 -0
  208. /package/dist/app/assets/{index.es446-BY-TUvya.js → index.es449-BY-TUvya.js} +0 -0
  209. /package/dist/app/assets/{index.es447-zocC4JxJ.js → index.es450-zocC4JxJ.js} +0 -0
  210. /package/dist/app/assets/{index.es449-Cza_XSSt.js → index.es452-Cza_XSSt.js} +0 -0
  211. /package/dist/app/assets/{index.es450-Bg-kzb6g.js → index.es453-Bg-kzb6g.js} +0 -0
  212. /package/dist/app/assets/{index.es451-DhUJRlN_.js → index.es454-DhUJRlN_.js} +0 -0
  213. /package/dist/app/assets/{index.es453-C8lEn-DE.js → index.es456-C8lEn-DE.js} +0 -0
  214. /package/dist/app/assets/{index.es454-DhMKtDLN.js → index.es457-DhMKtDLN.js} +0 -0
  215. /package/dist/app/assets/{index.es455-CwjWoCRV.js → index.es458-CwjWoCRV.js} +0 -0
  216. /package/dist/app/assets/{index.es456-CzouJOBO.js → index.es459-CzouJOBO.js} +0 -0
  217. /package/dist/app/assets/{index.es457-B1bQXN8T.js → index.es460-B1bQXN8T.js} +0 -0
  218. /package/dist/app/assets/{index.es459-5LuOXUq_.js → index.es462-5LuOXUq_.js} +0 -0
  219. /package/dist/app/assets/{index.es460-DWJ3fJO_.js → index.es463-DWJ3fJO_.js} +0 -0
  220. /package/dist/app/assets/{index.es461-DJlmqQ1C.js → index.es464-DJlmqQ1C.js} +0 -0
  221. /package/dist/app/assets/{index.es462-QhoSD0DR.js → index.es465-QhoSD0DR.js} +0 -0
  222. /package/dist/app/assets/{index.es465-Be6lgOlo.js → index.es468-Be6lgOlo.js} +0 -0
  223. /package/dist/app/assets/{index.es467-BJ4Li9vH.js → index.es470-BJ4Li9vH.js} +0 -0
  224. /package/dist/app/assets/{index.es468-DQVVAn-B.js → index.es471-DQVVAn-B.js} +0 -0
  225. /package/dist/app/assets/{index.es469-BJGe-b2p.js → index.es472-BJGe-b2p.js} +0 -0
  226. /package/dist/app/assets/{index.es471-BLhTXw86.js → index.es474-BLhTXw86.js} +0 -0
  227. /package/dist/app/assets/{index.es473-atvbtKCR.js → index.es476-atvbtKCR.js} +0 -0
  228. /package/dist/app/assets/{index.es475-DkLiglaE.js → index.es478-DkLiglaE.js} +0 -0
  229. /package/dist/app/assets/{index.es476-C1w2a3ep.js → index.es479-C1w2a3ep.js} +0 -0
  230. /package/dist/app/assets/{index.es479-Cf8iN4DR.js → index.es482-Cf8iN4DR.js} +0 -0
  231. /package/dist/app/assets/{index.es480-COK4E0Yg.js → index.es483-COK4E0Yg.js} +0 -0
  232. /package/dist/app/assets/{index.es481-BknIz3MU.js → index.es484-BknIz3MU.js} +0 -0
  233. /package/dist/app/assets/{index.es483-BeQkCIfX.js → index.es486-BeQkCIfX.js} +0 -0
  234. /package/dist/app/assets/{index.es485-BSxZ-RaX.js → index.es488-BSxZ-RaX.js} +0 -0
  235. /package/dist/app/assets/{index.es486-C7L56vO4.js → index.es489-C7L56vO4.js} +0 -0
  236. /package/dist/app/assets/{index.es487-CUnW07Te.js → index.es490-CUnW07Te.js} +0 -0
  237. /package/dist/app/assets/{index.es488-C1XDQQGZ.js → index.es491-C1XDQQGZ.js} +0 -0
  238. /package/dist/app/assets/{index.es489-CQjiPCtT.js → index.es492-CQjiPCtT.js} +0 -0
  239. /package/dist/app/assets/{index.es490-DQ1-QYvQ.js → index.es493-DQ1-QYvQ.js} +0 -0
  240. /package/dist/app/assets/{index.es492-BbSNqyBO.js → index.es495-BbSNqyBO.js} +0 -0
  241. /package/dist/app/assets/{index.es494-CB2ApiWb.js → index.es497-CB2ApiWb.js} +0 -0
  242. /package/dist/app/assets/{index.es496-B_m7g4N7.js → index.es499-B_m7g4N7.js} +0 -0
  243. /package/dist/app/assets/{index.es497-B6W0miNI.js → index.es500-B6W0miNI.js} +0 -0
  244. /package/dist/app/assets/{index.es498-BMR_PYu6.js → index.es501-BMR_PYu6.js} +0 -0
  245. /package/dist/app/assets/{index.es500-Dj6nwHGl.js → index.es503-Dj6nwHGl.js} +0 -0
  246. /package/dist/app/assets/{index.es501-BpWG_bgh.js → index.es504-BpWG_bgh.js} +0 -0
  247. /package/dist/app/assets/{index.es502-BVUVsWT6.js → index.es505-BVUVsWT6.js} +0 -0
  248. /package/dist/app/assets/{index.es503-CAQ2eGtk.js → index.es506-CAQ2eGtk.js} +0 -0
  249. /package/dist/app/assets/{index.es504-BFOHcciG.js → index.es507-BFOHcciG.js} +0 -0
  250. /package/dist/app/assets/{index.es505-CdO5JTpU.js → index.es508-CdO5JTpU.js} +0 -0
  251. /package/dist/app/assets/{index.es506-CJaU5se_.js → index.es509-CJaU5se_.js} +0 -0
  252. /package/dist/app/assets/{index.es507-DYoNaHQp.js → index.es510-DYoNaHQp.js} +0 -0
  253. /package/dist/app/assets/{index.es508-m4uW47V2.js → index.es511-m4uW47V2.js} +0 -0
  254. /package/dist/app/assets/{index.es511-nyqBNV6O.js → index.es514-nyqBNV6O.js} +0 -0
  255. /package/dist/app/assets/{index.es512-C6j12Q_x.js → index.es515-C6j12Q_x.js} +0 -0
  256. /package/dist/app/assets/{index.es513-7A4Fjokl.js → index.es516-7A4Fjokl.js} +0 -0
  257. /package/dist/app/assets/{index.es514-CB0Krxn9.js → index.es517-CB0Krxn9.js} +0 -0
  258. /package/dist/app/assets/{index.es515-DCE3LsBG.js → index.es518-DCE3LsBG.js} +0 -0
  259. /package/dist/app/assets/{index.es516-C3FkfJm5.js → index.es519-C3FkfJm5.js} +0 -0
  260. /package/dist/app/assets/{index.es519-CVw76BM1.js → index.es522-CVw76BM1.js} +0 -0
  261. /package/dist/app/assets/{index.es520-HnGAYVZD.js → index.es523-HnGAYVZD.js} +0 -0
  262. /package/dist/app/assets/{index.es521-BVz_zdnA.js → index.es524-BVz_zdnA.js} +0 -0
  263. /package/dist/app/assets/{index.es522-C3khCPGq.js → index.es525-C3khCPGq.js} +0 -0
  264. /package/dist/app/assets/{index.es523-D-2ljcwZ.js → index.es526-D-2ljcwZ.js} +0 -0
  265. /package/dist/app/assets/{index.es524-Cv9koXgw.js → index.es527-Cv9koXgw.js} +0 -0
  266. /package/dist/app/assets/{index.es525-CD_QflpE.js → index.es528-CD_QflpE.js} +0 -0
  267. /package/dist/app/assets/{index.es526-DRW-0cLl.js → index.es529-DRW-0cLl.js} +0 -0
  268. /package/dist/app/assets/{index.es527-C-_shW-Y.js → index.es530-C-_shW-Y.js} +0 -0
  269. /package/dist/app/assets/{index.es528-LGGdnPYs.js → index.es531-LGGdnPYs.js} +0 -0
  270. /package/dist/app/assets/{index.es529-C3mMm8J8.js → index.es532-C3mMm8J8.js} +0 -0
  271. /package/dist/app/assets/{index.es530-BzJJZx-M.js → index.es533-BzJJZx-M.js} +0 -0
  272. /package/dist/app/assets/{index.es531-BXkSAIEj.js → index.es534-BXkSAIEj.js} +0 -0
  273. /package/dist/app/assets/{index.es532-BgDCqdQA.js → index.es535-BgDCqdQA.js} +0 -0
  274. /package/dist/app/assets/{index.es533-C8M2exoo.js → index.es536-C8M2exoo.js} +0 -0
  275. /package/dist/app/assets/{index.es534-DHJKELXO.js → index.es537-DHJKELXO.js} +0 -0
  276. /package/dist/app/assets/{index.es535-Cuk6v7N8.js → index.es538-Cuk6v7N8.js} +0 -0
  277. /package/dist/app/assets/{index.es536-DH5Ifo-i.js → index.es539-DH5Ifo-i.js} +0 -0
  278. /package/dist/app/assets/{index.es537-E3gJ1_iC.js → index.es540-E3gJ1_iC.js} +0 -0
  279. /package/dist/app/assets/{index.es538-DAi9KRSo.js → index.es541-DAi9KRSo.js} +0 -0
  280. /package/dist/app/assets/{index.es539-D7oLnXFd.js → index.es542-D7oLnXFd.js} +0 -0
  281. /package/dist/app/assets/{index.es540-BfjtVDDH.js → index.es543-BfjtVDDH.js} +0 -0
  282. /package/dist/app/assets/{index.es541-DnULxvSX.js → index.es544-DnULxvSX.js} +0 -0
  283. /package/dist/app/assets/{index.es542-CkXjmgJE.js → index.es545-CkXjmgJE.js} +0 -0
  284. /package/dist/app/assets/{index.es543-CfQXZHmo.js → index.es546-CfQXZHmo.js} +0 -0
  285. /package/dist/app/assets/{index.es544-DWedfzmr.js → index.es547-DWedfzmr.js} +0 -0
  286. /package/dist/app/assets/{index.es545-DUszq2jm.js → index.es548-DUszq2jm.js} +0 -0
  287. /package/dist/app/assets/{index.es546-B7mTdjB0.js → index.es549-B7mTdjB0.js} +0 -0
  288. /package/dist/app/assets/{index.es547-D5KoaKCx.js → index.es550-D5KoaKCx.js} +0 -0
  289. /package/dist/app/assets/{index.es548-BfHTSMKl.js → index.es551-BfHTSMKl.js} +0 -0
  290. /package/dist/app/assets/{index.es549-B0m2ddpp.js → index.es552-B0m2ddpp.js} +0 -0
  291. /package/dist/app/assets/{index.es550-CyktbL80.js → index.es553-CyktbL80.js} +0 -0
  292. /package/dist/app/assets/{index.es551-Csfq5Kiy.js → index.es554-Csfq5Kiy.js} +0 -0
  293. /package/dist/app/assets/{index.es552-CafNBF8u.js → index.es555-CafNBF8u.js} +0 -0
  294. /package/dist/app/assets/{index.es553-CTRr51gU.js → index.es556-CTRr51gU.js} +0 -0
  295. /package/dist/app/assets/{index.es554-D4h5O-jR.js → index.es557-D4h5O-jR.js} +0 -0
  296. /package/dist/app/assets/{index.es555-C39BiMTA.js → index.es558-C39BiMTA.js} +0 -0
  297. /package/dist/app/assets/{index.es556-Ddv68eIx.js → index.es559-Ddv68eIx.js} +0 -0
  298. /package/dist/app/assets/{index.es557-GBQ2dnAY.js → index.es560-GBQ2dnAY.js} +0 -0
  299. /package/dist/app/assets/{index.es558-PoHY5YXO.js → index.es561-PoHY5YXO.js} +0 -0
  300. /package/dist/app/assets/{index.es559-3e1v2bzS.js → index.es562-3e1v2bzS.js} +0 -0
  301. /package/dist/app/assets/{index.es560-CS3Unz2-.js → index.es563-CS3Unz2-.js} +0 -0
  302. /package/dist/app/assets/{index.es561-bN70gL4F.js → index.es564-bN70gL4F.js} +0 -0
  303. /package/dist/app/assets/{index.es562-CmCqftbK.js → index.es565-CmCqftbK.js} +0 -0
  304. /package/dist/app/assets/{index.es563-Ds-gbosJ.js → index.es566-Ds-gbosJ.js} +0 -0
  305. /package/dist/app/assets/{index.es564-CjDtw9vr.js → index.es567-CjDtw9vr.js} +0 -0
  306. /package/dist/app/assets/{index.es565-BthQWCQV.js → index.es568-BthQWCQV.js} +0 -0
  307. /package/dist/app/assets/{index.es566-DqwNpetd.js → index.es569-DqwNpetd.js} +0 -0
  308. /package/dist/app/assets/{index.es567-Bw305WKR.js → index.es570-Bw305WKR.js} +0 -0
  309. /package/dist/app/assets/{index.es568-DXbdFlpD.js → index.es571-DXbdFlpD.js} +0 -0
  310. /package/dist/app/assets/{index.es569-L9t79GZl.js → index.es572-L9t79GZl.js} +0 -0
  311. /package/dist/app/assets/{index.es570-CbfX1IO0.js → index.es573-CbfX1IO0.js} +0 -0
  312. /package/dist/app/assets/{index.es571-DBQeEorK.js → index.es574-DBQeEorK.js} +0 -0
  313. /package/dist/app/assets/{index.es572-BEBZ7ncR.js → index.es575-BEBZ7ncR.js} +0 -0
  314. /package/dist/app/assets/{index.es573-Bkuqu6BP.js → index.es576-Bkuqu6BP.js} +0 -0
  315. /package/dist/app/assets/{index.es574-D0r3Knsf.js → index.es577-D0r3Knsf.js} +0 -0
  316. /package/dist/app/assets/{index.es575-CVO1_9PV.js → index.es578-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.110",
4
+ "version": "0.0.112",
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) => {
@@ -4,19 +4,19 @@ import { PostgresConnection } from "@malloydata/db-postgres";
4
4
  import { SnowflakeConnection } from "@malloydata/db-snowflake";
5
5
  import { TrinoConnection } from "@malloydata/db-trino";
6
6
  import { Connection } from "@malloydata/malloy";
7
- import { BadRequestError } from "../errors";
8
- import { logAxiosError, logger } from "../logger";
9
7
  import { BaseConnection } from "@malloydata/malloy/connection";
8
+ import { AxiosError } from "axios";
10
9
  import fs from "fs/promises";
11
10
  import path from "path";
12
11
  import { v4 as uuidv4 } from "uuid";
13
12
  import { components } from "../api";
14
- import { TEMP_DIR_PATH } from "../constants";
15
13
  import {
16
14
  convertConnectionsToApiConnections,
17
15
  getConnectionsFromPublisherConfig,
18
16
  } from "../config";
19
- import { AxiosError } from "axios";
17
+ import { TEMP_DIR_PATH } from "../constants";
18
+ import { BadRequestError } from "../errors";
19
+ import { logAxiosError, logger } from "../logger";
20
20
 
21
21
  type ApiConnection = components["schemas"]["Connection"];
22
22
  type ApiConnectionAttributes = components["schemas"]["ConnectionAttributes"];
@@ -284,13 +284,14 @@ export async function testConnectionConfig(
284
284
 
285
285
  const postgresConfig = connectionConfig.postgresConnection;
286
286
  if (
287
- !postgresConfig.host ||
288
- !postgresConfig.port ||
289
- !postgresConfig.userName ||
290
- !postgresConfig.databaseName
287
+ !postgresConfig.connectionString &&
288
+ (!postgresConfig.host ||
289
+ !postgresConfig.port ||
290
+ !postgresConfig.userName ||
291
+ !postgresConfig.databaseName)
291
292
  ) {
292
293
  throw new Error(
293
- "PostgreSQL connection requires: host, port, userName, and databaseName",
294
+ "PostgreSQL connection requires: either all of host, port, userName, and databaseName, or connectionString",
294
295
  );
295
296
  }
296
297
 
@@ -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{c as oa,j as x,q as ea,p as la,r as d,s as ta,aa as ra,L as j,x as y,a7 as E,w as M,A as t,F as ia,J as na,ab as p,K as k}from"./index-D2hrtqN7.js";const ca=oa(x.jsx("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}));function sa(a){return la("MuiChip",a)}const e=ea("MuiChip",["root","sizeSmall","sizeMedium","colorDefault","colorError","colorInfo","colorPrimary","colorSecondary","colorSuccess","colorWarning","disabled","clickable","clickableColorPrimary","clickableColorSecondary","deletable","deletableColorPrimary","deletableColorSecondary","outlined","filled","outlinedPrimary","outlinedSecondary","filledPrimary","filledSecondary","avatar","avatarSmall","avatarMedium","avatarColorPrimary","avatarColorSecondary","icon","iconSmall","iconMedium","iconColorPrimary","iconColorSecondary","label","labelSmall","labelMedium","deleteIcon","deleteIconSmall","deleteIconMedium","deleteIconColorPrimary","deleteIconColorSecondary","deleteIconOutlinedColorPrimary","deleteIconOutlinedColorSecondary","deleteIconFilledColorPrimary","deleteIconFilledColorSecondary","focusVisible"]),pa=a=>{const{classes:l,disabled:o,size:r,color:n,iconColor:C,onDelete:u,clickable:c,variant:s}=a,$={root:["root",s,o&&"disabled",`size${t(r)}`,`color${t(n)}`,c&&"clickable",c&&`clickableColor${t(n)}`,u&&"deletable",u&&`deletableColor${t(n)}`,`${s}${t(n)}`],label:["label",`label${t(r)}`],avatar:["avatar",`avatar${t(r)}`,`avatarColor${t(n)}`],icon:["icon",`icon${t(r)}`,`iconColor${t(C)}`],deleteIcon:["deleteIcon",`deleteIcon${t(r)}`,`deleteIconColor${t(n)}`,`deleteIcon${t(s)}Color${t(n)}`]};return ia($,sa,l)},da=M("div",{name:"MuiChip",slot:"Root",overridesResolver:(a,l)=>{const{ownerState:o}=a,{color:r,iconColor:n,clickable:C,onDelete:u,size:c,variant:s}=o;return[{[`& .${e.avatar}`]:l.avatar},{[`& .${e.avatar}`]:l[`avatar${t(c)}`]},{[`& .${e.avatar}`]:l[`avatarColor${t(r)}`]},{[`& .${e.icon}`]:l.icon},{[`& .${e.icon}`]:l[`icon${t(c)}`]},{[`& .${e.icon}`]:l[`iconColor${t(n)}`]},{[`& .${e.deleteIcon}`]:l.deleteIcon},{[`& .${e.deleteIcon}`]:l[`deleteIcon${t(c)}`]},{[`& .${e.deleteIcon}`]:l[`deleteIconColor${t(r)}`]},{[`& .${e.deleteIcon}`]:l[`deleteIcon${t(s)}Color${t(r)}`]},l.root,l[`size${t(c)}`],l[`color${t(r)}`],C&&l.clickable,C&&r!=="default"&&l[`clickableColor${t(r)})`],u&&l.deletable,u&&r!=="default"&&l[`deletableColor${t(r)}`],l[s],l[`${s}${t(r)}`]]}})(na(({theme:a})=>{const l=a.palette.mode==="light"?a.palette.grey[700]:a.palette.grey[300];return{maxWidth:"100%",fontFamily:a.typography.fontFamily,fontSize:a.typography.pxToRem(13),display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,lineHeight:1.5,color:(a.vars||a).palette.text.primary,backgroundColor:(a.vars||a).palette.action.selected,borderRadius:32/2,whiteSpace:"nowrap",transition:a.transitions.create(["background-color","box-shadow"]),cursor:"unset",outline:0,textDecoration:"none",border:0,padding:0,verticalAlign:"middle",boxSizing:"border-box",[`&.${e.disabled}`]:{opacity:(a.vars||a).palette.action.disabledOpacity,pointerEvents:"none"},[`& .${e.avatar}`]:{marginLeft:5,marginRight:-6,width:24,height:24,color:a.vars?a.vars.palette.Chip.defaultAvatarColor:l,fontSize:a.typography.pxToRem(12)},[`& .${e.avatarColorPrimary}`]:{color:(a.vars||a).palette.primary.contrastText,backgroundColor:(a.vars||a).palette.primary.dark},[`& .${e.avatarColorSecondary}`]:{color:(a.vars||a).palette.secondary.contrastText,backgroundColor:(a.vars||a).palette.secondary.dark},[`& .${e.avatarSmall}`]:{marginLeft:4,marginRight:-4,width:18,height:18,fontSize:a.typography.pxToRem(10)},[`& .${e.icon}`]:{marginLeft:5,marginRight:-6},[`& .${e.deleteIcon}`]:{WebkitTapHighlightColor:"transparent",color:a.vars?`rgba(${a.vars.palette.text.primaryChannel} / 0.26)`:p(a.palette.text.primary,.26),fontSize:22,cursor:"pointer",margin:"0 5px 0 -6px","&:hover":{color:a.vars?`rgba(${a.vars.palette.text.primaryChannel} / 0.4)`:p(a.palette.text.primary,.4)}},variants:[{props:{size:"small"},style:{height:24,[`& .${e.icon}`]:{fontSize:18,marginLeft:4,marginRight:-4},[`& .${e.deleteIcon}`]:{fontSize:16,marginRight:4,marginLeft:-4}}},...Object.entries(a.palette).filter(k(["contrastText"])).map(([o])=>({props:{color:o},style:{backgroundColor:(a.vars||a).palette[o].main,color:(a.vars||a).palette[o].contrastText,[`& .${e.deleteIcon}`]:{color:a.vars?`rgba(${a.vars.palette[o].contrastTextChannel} / 0.7)`:p(a.palette[o].contrastText,.7),"&:hover, &:active":{color:(a.vars||a).palette[o].contrastText}}}})),{props:o=>o.iconColor===o.color,style:{[`& .${e.icon}`]:{color:a.vars?a.vars.palette.Chip.defaultIconColor:l}}},{props:o=>o.iconColor===o.color&&o.color!=="default",style:{[`& .${e.icon}`]:{color:"inherit"}}},{props:{onDelete:!0},style:{[`&.${e.focusVisible}`]:{backgroundColor:a.vars?`rgba(${a.vars.palette.action.selectedChannel} / calc(${a.vars.palette.action.selectedOpacity} + ${a.vars.palette.action.focusOpacity}))`:p(a.palette.action.selected,a.palette.action.selectedOpacity+a.palette.action.focusOpacity)}}},...Object.entries(a.palette).filter(k(["dark"])).map(([o])=>({props:{color:o,onDelete:!0},style:{[`&.${e.focusVisible}`]:{background:(a.vars||a).palette[o].dark}}})),{props:{clickable:!0},style:{userSelect:"none",WebkitTapHighlightColor:"transparent",cursor:"pointer","&:hover":{backgroundColor:a.vars?`rgba(${a.vars.palette.action.selectedChannel} / calc(${a.vars.palette.action.selectedOpacity} + ${a.vars.palette.action.hoverOpacity}))`:p(a.palette.action.selected,a.palette.action.selectedOpacity+a.palette.action.hoverOpacity)},[`&.${e.focusVisible}`]:{backgroundColor:a.vars?`rgba(${a.vars.palette.action.selectedChannel} / calc(${a.vars.palette.action.selectedOpacity} + ${a.vars.palette.action.focusOpacity}))`:p(a.palette.action.selected,a.palette.action.selectedOpacity+a.palette.action.focusOpacity)},"&:active":{boxShadow:(a.vars||a).shadows[1]}}},...Object.entries(a.palette).filter(k(["dark"])).map(([o])=>({props:{color:o,clickable:!0},style:{[`&:hover, &.${e.focusVisible}`]:{backgroundColor:(a.vars||a).palette[o].dark}}})),{props:{variant:"outlined"},style:{backgroundColor:"transparent",border:a.vars?`1px solid ${a.vars.palette.Chip.defaultBorder}`:`1px solid ${a.palette.mode==="light"?a.palette.grey[400]:a.palette.grey[700]}`,[`&.${e.clickable}:hover`]:{backgroundColor:(a.vars||a).palette.action.hover},[`&.${e.focusVisible}`]:{backgroundColor:(a.vars||a).palette.action.focus},[`& .${e.avatar}`]:{marginLeft:4},[`& .${e.avatarSmall}`]:{marginLeft:2},[`& .${e.icon}`]:{marginLeft:4},[`& .${e.iconSmall}`]:{marginLeft:2},[`& .${e.deleteIcon}`]:{marginRight:5},[`& .${e.deleteIconSmall}`]:{marginRight:3}}},...Object.entries(a.palette).filter(k()).map(([o])=>({props:{variant:"outlined",color:o},style:{color:(a.vars||a).palette[o].main,border:`1px solid ${a.vars?`rgba(${a.vars.palette[o].mainChannel} / 0.7)`:p(a.palette[o].main,.7)}`,[`&.${e.clickable}:hover`]:{backgroundColor:a.vars?`rgba(${a.vars.palette[o].mainChannel} / ${a.vars.palette.action.hoverOpacity})`:p(a.palette[o].main,a.palette.action.hoverOpacity)},[`&.${e.focusVisible}`]:{backgroundColor:a.vars?`rgba(${a.vars.palette[o].mainChannel} / ${a.vars.palette.action.focusOpacity})`:p(a.palette[o].main,a.palette.action.focusOpacity)},[`& .${e.deleteIcon}`]:{color:a.vars?`rgba(${a.vars.palette[o].mainChannel} / 0.7)`:p(a.palette[o].main,.7),"&:hover, &:active":{color:(a.vars||a).palette[o].main}}}}))]}})),ua=M("span",{name:"MuiChip",slot:"Label",overridesResolver:(a,l)=>{const{ownerState:o}=a,{size:r}=o;return[l.label,l[`label${t(r)}`]]}})({overflow:"hidden",textOverflow:"ellipsis",paddingLeft:12,paddingRight:12,whiteSpace:"nowrap",variants:[{props:{variant:"outlined"},style:{paddingLeft:11,paddingRight:11}},{props:{size:"small"},style:{paddingLeft:8,paddingRight:8}},{props:{size:"small",variant:"outlined"},style:{paddingLeft:7,paddingRight:7}}]});function F(a){return a.key==="Backspace"||a.key==="Delete"}const ba=d.forwardRef(function(l,o){const r=ta({props:l,name:"MuiChip"}),{avatar:n,className:C,clickable:u,color:c="default",component:s,deleteIcon:$,disabled:S=!1,icon:f,label:N,onClick:O,onDelete:v,onKeyDown:w,onKeyUp:z,size:K="medium",variant:U="filled",tabIndex:W,skipFocusWhenDisabled:B=!1,slots:A={},slotProps:H={},...q}=r,J=d.useRef(null),G=ra(J,o),D=i=>{i.stopPropagation(),v&&v(i)},Q=i=>{i.currentTarget===i.target&&F(i)&&i.preventDefault(),w&&w(i)},X=i=>{i.currentTarget===i.target&&v&&F(i)&&v(i),z&&z(i)},I=u!==!1&&O?!0:u,P=I||v?j:s||"div",R={...r,component:P,disabled:S,size:K,color:c,iconColor:d.isValidElement(f)&&f.props.color||c,onDelete:!!v,clickable:I,variant:U},g=pa(R),Y=P===j?{component:s||"div",focusVisibleClassName:g.focusVisible,...v&&{disableRipple:!0}}:{};let L=null;v&&(L=$&&d.isValidElement($)?d.cloneElement($,{className:y($.props.className,g.deleteIcon),onClick:D}):x.jsx(ca,{className:g.deleteIcon,onClick:D}));let m=null;n&&d.isValidElement(n)&&(m=d.cloneElement(n,{className:y(g.avatar,n.props.className)}));let T=null;f&&d.isValidElement(f)&&(T=d.cloneElement(f,{className:y(g.icon,f.props.className)}));const V={slots:A,slotProps:H},[Z,_]=E("root",{elementType:da,externalForwardedProps:{...V,...q},ownerState:R,shouldForwardComponentProp:!0,ref:G,className:y(g.root,C),additionalProps:{disabled:I&&S?!0:void 0,tabIndex:B&&S?-1:W,...Y},getSlotProps:i=>({...i,onClick:b=>{i.onClick?.(b),O?.(b)},onKeyDown:b=>{i.onKeyDown?.(b),Q?.(b)},onKeyUp:b=>{i.onKeyUp?.(b),X?.(b)}})}),[h,aa]=E("label",{elementType:ua,externalForwardedProps:V,ownerState:R,className:g.label});return x.jsxs(Z,{as:P,..._,children:[m||T,x.jsx(h,{...aa,children:N}),L]})});export{ba as C};
@@ -1 +0,0 @@
1
- import{r as o}from"./index-D2hrtqN7.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-D2hrtqN7.js";import{f as ne}from"./index.es20-7LPyahVV.js";import{M as R,a as se}from"./MenuItem-Ct1Eq8uZ.js";import{L as N,A as ae}from"./MoreVert-BXQIW75e.js";import{b as oe,L as T,S as _,P as ie,G as g}from"./Edit-C6YfplwT.js";import{C as le}from"./Container-Dg_Kf31J.js";import{C as P}from"./Chip-CzV-d1RE.js";import{D as ce}from"./listItemTextClasses-st6hnk8F.js";import"./Modal-BKeOa8cn.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{p as A,q as S,r as u,s as I,j as a,w as g,x as M,A as y,F as R,H as V,J as w,K as q,c as E,L as H,O as T,Q as J,T as O,U as K,B as f,V as Q,e as D,l as k,X}from"./index-D2hrtqN7.js";import{f as Y}from"./index.es20-7LPyahVV.js";import{C as j}from"./Chip-CzV-d1RE.js";import{C as Z}from"./Container-Dg_Kf31J.js";function _(r){return A("MuiAppBar",r)}S("MuiAppBar",["root","positionFixed","positionAbsolute","positionSticky","positionStatic","positionRelative","colorDefault","colorPrimary","colorSecondary","colorInherit","colorTransparent","colorError","colorInfo","colorSuccess","colorWarning"]);const rr=r=>{const{color:o,position:e,classes:s}=r,t={root:["root",`color${y(o)}`,`position${y(e)}`]};return R(t,_,s)},U=(r,o)=>r?`${r?.replace(")","")}, ${o})`:o,or=g(V,{name:"MuiAppBar",slot:"Root",overridesResolver:(r,o)=>{const{ownerState:e}=r;return[o.root,o[`position${y(e.position)}`],o[`color${y(e.color)}`]]}})(w(({theme:r})=>({display:"flex",flexDirection:"column",width:"100%",boxSizing:"border-box",flexShrink:0,variants:[{props:{position:"fixed"},style:{position:"fixed",zIndex:(r.vars||r).zIndex.appBar,top:0,left:"auto",right:0,"@media print":{position:"absolute"}}},{props:{position:"absolute"},style:{position:"absolute",zIndex:(r.vars||r).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"sticky"},style:{position:"sticky",zIndex:(r.vars||r).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"static"},style:{position:"static"}},{props:{position:"relative"},style:{position:"relative"}},{props:{color:"inherit"},style:{"--AppBar-color":"inherit"}},{props:{color:"default"},style:{"--AppBar-background":r.vars?r.vars.palette.AppBar.defaultBg:r.palette.grey[100],"--AppBar-color":r.vars?r.vars.palette.text.primary:r.palette.getContrastText(r.palette.grey[100]),...r.applyStyles("dark",{"--AppBar-background":r.vars?r.vars.palette.AppBar.defaultBg:r.palette.grey[900],"--AppBar-color":r.vars?r.vars.palette.text.primary:r.palette.getContrastText(r.palette.grey[900])})}},...Object.entries(r.palette).filter(q(["contrastText"])).map(([o])=>({props:{color:o},style:{"--AppBar-background":(r.vars??r).palette[o].main,"--AppBar-color":(r.vars??r).palette[o].contrastText}})),{props:o=>o.enableColorOnDark===!0&&!["inherit","transparent"].includes(o.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)"}},{props:o=>o.enableColorOnDark===!1&&!["inherit","transparent"].includes(o.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...r.applyStyles("dark",{backgroundColor:r.vars?U(r.vars.palette.AppBar.darkBg,"var(--AppBar-background)"):null,color:r.vars?U(r.vars.palette.AppBar.darkColor,"var(--AppBar-color)"):null})}},{props:{color:"transparent"},style:{"--AppBar-background":"transparent","--AppBar-color":"inherit",backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...r.applyStyles("dark",{backgroundImage:"none"})}}]}))),ar=u.forwardRef(function(o,e){const s=I({props:o,name:"MuiAppBar"}),{className:t,color:n="primary",enableColorOnDark:i=!1,position:c="fixed",...x}=s,p={...s,color:n,position:c,enableColorOnDark:i},d=rr(p);return a.jsx(or,{square:!0,component:"header",ownerState:p,elevation:4,className:M(d.root,t,c==="fixed"&&"mui-fixed"),ref:e,...x})}),er=E(a.jsx("path",{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"})),sr=g(H,{name:"MuiBreadcrumbCollapsed"})(w(({theme:r})=>({display:"flex",marginLeft:`calc(${r.spacing(1)} * 0.5)`,marginRight:`calc(${r.spacing(1)} * 0.5)`,...r.palette.mode==="light"?{backgroundColor:r.palette.grey[100],color:r.palette.grey[700]}:{backgroundColor:r.palette.grey[700],color:r.palette.grey[100]},borderRadius:2,"&:hover, &:focus":{...r.palette.mode==="light"?{backgroundColor:r.palette.grey[200]}:{backgroundColor:r.palette.grey[600]}},"&:active":{boxShadow:r.shadows[0],...r.palette.mode==="light"?{backgroundColor:T(r.palette.grey[200],.12)}:{backgroundColor:T(r.palette.grey[600],.12)}}}))),tr=g(er)({width:24,height:16});function lr(r){const{slots:o={},slotProps:e={},...s}=r,t=r;return a.jsx("li",{children:a.jsx(sr,{focusRipple:!0,...s,ownerState:t,children:a.jsx(tr,{as:o.CollapsedIcon,ownerState:t,...e.collapsedIcon})})})}function nr(r){return A("MuiBreadcrumbs",r)}const ir=S("MuiBreadcrumbs",["root","ol","li","separator"]),pr=r=>{const{classes:o}=r;return R({root:["root"],li:["li"],ol:["ol"],separator:["separator"]},nr,o)},cr=g(O,{name:"MuiBreadcrumbs",slot:"Root",overridesResolver:(r,o)=>[{[`& .${ir.li}`]:o.li},o.root]})({}),dr=g("ol",{name:"MuiBreadcrumbs",slot:"Ol"})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"}),ur=g("li",{name:"MuiBreadcrumbs",slot:"Separator"})({display:"flex",userSelect:"none",marginLeft:8,marginRight:8});function gr(r,o,e,s){return r.reduce((t,n,i)=>(i<r.length-1?t=t.concat(n,a.jsx(ur,{"aria-hidden":!0,className:o,ownerState:s,children:e},`separator-${i}`)):t.push(n),t),[])}const xr=u.forwardRef(function(o,e){const s=I({props:o,name:"MuiBreadcrumbs"}),{children:t,className:n,component:i="nav",slots:c={},slotProps:x={},expandText:p="Show path",itemsAfterCollapse:d=1,itemsBeforeCollapse:B=1,maxItems:v=8,separator:z="/",...W}=s,[N,L]=u.useState(!1),b={...s,component:i,expanded:N,expandText:p,itemsAfterCollapse:d,itemsBeforeCollapse:B,maxItems:v,separator:z},m=pr(b),F=J({elementType:c.CollapsedIcon,externalSlotProps:x.collapsedIcon,ownerState:b}),$=u.useRef(null),G=l=>{const C=()=>{L(!0);const P=$.current.querySelector("a[href],button,[tabindex]");P&&P.focus()};return B+d>=l.length?l:[...l.slice(0,B),a.jsx(lr,{"aria-label":p,slots:{CollapsedIcon:c.CollapsedIcon},slotProps:{collapsedIcon:F},onClick:C},"ellipsis"),...l.slice(l.length-d,l.length)]},h=u.Children.toArray(t).filter(l=>u.isValidElement(l)).map((l,C)=>a.jsx("li",{className:m.li,children:l},`child-${C}`));return a.jsx(cr,{ref:e,component:i,color:"textSecondary",className:M(m.root,n),ownerState:b,...W,children:a.jsx(dr,{className:m.ol,ref:$,ownerState:b,children:gr(N||v&&h.length<=v?h:G(h),m.separator,z,b)})})});function br(r){return A("MuiToolbar",r)}S("MuiToolbar",["root","gutters","regular","dense"]);const fr=r=>{const{classes:o,disableGutters:e,variant:s}=r;return R({root:["root",!e&&"gutters",s]},br,o)},mr=g("div",{name:"MuiToolbar",slot:"Root",overridesResolver:(r,o)=>{const{ownerState:e}=r;return[o.root,!e.disableGutters&&o.gutters,o[e.variant]]}})(w(({theme:r})=>({position:"relative",display:"flex",alignItems:"center",variants:[{props:({ownerState:o})=>!o.disableGutters,style:{paddingLeft:r.spacing(2),paddingRight:r.spacing(2),[r.breakpoints.up("sm")]:{paddingLeft:r.spacing(3),paddingRight:r.spacing(3)}}},{props:{variant:"dense"},style:{minHeight:48}},{props:{variant:"regular"},style:r.mixins.toolbar}]}))),yr=u.forwardRef(function(o,e){const s=I({props:o,name:"MuiToolbar"}),{className:t,component:n="div",disableGutters:i=!1,variant:c="regular",...x}=s,p={...s,component:n,disableGutters:i,variant:c},d=fr(p);return a.jsx(mr,{as:n,className:M(d.root,t),ref:e,ownerState:p,...x})}),Br=E(a.jsx("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}));function vr(){const r=K(),o=r["*"],e=Y();return a.jsx(f,{sx:{display:"flex",alignItems:"center"},children:a.jsxs(xr,{"aria-label":"breadcrumb",separator:a.jsx(Br,{sx:{fontSize:14,color:"text.secondary"}}),sx:{"& .MuiBreadcrumbs-separator":{margin:"0 6px"}},children:[r.projectName&&a.jsx(j,{onClick:s=>e(`/${r.projectName}/`,s),label:r.projectName,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"primary.100"}}}),r.packageName&&a.jsx(j,{onClick:s=>e(`/${r.projectName}/${r.packageName}/`,s),label:r.packageName,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"secondary.100"}}}),o&&a.jsx(j,{onClick:s=>e(`/${r.projectName}/${r.packageName}/${o}`,s),label:o,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"grey.200"}}})]})})}function hr({logoHeader:r,endCap:o}){const e=Q();return a.jsx(ar,{position:"sticky",elevation:0,sx:{backgroundColor:"background.paper",borderBottom:"1px solid",borderColor:"divider"},children:a.jsxs(yr,{sx:{justifyContent:"space-between"},children:[a.jsxs(D,{direction:"row",spacing:2,alignItems:"center",children:[r||a.jsxs(f,{sx:{display:"flex",alignItems:"center",gap:1},children:[a.jsx(f,{component:"img",src:"/logo.svg",alt:"Malloy",sx:{width:28,height:28}}),a.jsx(O,{variant:"h5",sx:{color:"text.primary",fontWeight:700,letterSpacing:"-0.025em",cursor:"pointer"},onClick:()=>{e("/")},children:"Malloy Publisher"})]}),a.jsx(vr,{})]}),a.jsxs(D,{direction:"row",spacing:2,alignItems:"center",children:[!r&&a.jsxs(a.Fragment,{children:[a.jsx(k,{href:"https://docs.malloydata.dev/documentation/",children:"Malloy Docs"}),a.jsx(k,{href:"https://github.com/malloydata/publisher/blob/main/README.md",children:"Publisher Docs"}),a.jsx(k,{href:"/api-doc.html",children:"Publisher API"})]}),o]})]})})}function Sr({headerProps:r}){return a.jsxs(f,{sx:{display:"flex",flexDirection:"column",minHeight:"100vh"},children:[a.jsx(hr,{...r}),a.jsx(Z,{maxWidth:"xl",component:"main",sx:{flex:1,display:"flex",flexDirection:"column",py:2,gap:2},children:a.jsx(f,{sx:{flex:1},children:a.jsx(X,{})})})]})}export{Sr as default};
@@ -1 +0,0 @@
1
- import{x as K,q as J,p as Q,r as l,a9 as xe,aa as Ce,j as N,az as te,w as j,H as Fe,s as se,a7 as B,aE as De,F as ne,aX as Se,Q as Ne,a8 as Me,L as ze,J as Ae,ab as _}from"./index-D2hrtqN7.js";import{b as He,a as Ke,L as fe,l as me,d as ge}from"./listItemTextClasses-st6hnk8F.js";import{g as je,o as oe,M as Ue}from"./Modal-BKeOa8cn.js";function We(e,t=166){let o;function i(...h){const p=()=>{e.apply(this,h)};clearTimeout(o),o=setTimeout(p,t)}return i.clear=()=>{clearTimeout(o)},i}function Be(e,t){const o=e.charCodeAt(2);return e[0]==="o"&&e[1]==="n"&&o>=65&&o<=90&&typeof t=="function"}function Ve(e,t){if(!e)return t;function o(a,s){const n={};return Object.keys(s).forEach(y=>{Be(y,s[y])&&typeof a[y]=="function"&&(n[y]=(...C)=>{a[y](...C),s[y](...C)})}),n}if(typeof e=="function"||typeof t=="function")return a=>{const s=typeof t=="function"?t(a):t,n=typeof e=="function"?e({...a,...s}):e,y=K(a?.className,s?.className,n?.className),C=o(n,s);return{...s,...n,...C,...!!y&&{className:y},...s?.style&&n?.style&&{style:{...s.style,...n.style}},...s?.sx&&n?.sx&&{sx:[...Array.isArray(s.sx)?s.sx:[s.sx],...Array.isArray(n.sx)?n.sx:[n.sx]]}}};const i=t,h=o(e,i),p=K(i?.className,e?.className);return{...t,...e,...h,...!!p&&{className:p},...i?.style&&e?.style&&{style:{...i.style,...e.style}},...i?.sx&&e?.sx&&{sx:[...Array.isArray(i.sx)?i.sx:[i.sx],...Array.isArray(e.sx)?e.sx:[e.sx]]}}}function pt(e){return Q("MuiListItemIcon",e)}const ye=J("MuiListItemIcon",["root","alignItemsFlexStart"]);function ee(e,t,o){return e===t?e.firstChild:t&&t.nextElementSibling?t.nextElementSibling:o?null:e.firstChild}function he(e,t,o){return e===t?o?e.firstChild:e.lastChild:t&&t.previousElementSibling?t.previousElementSibling:o?null:e.lastChild}function we(e,t){if(t===void 0)return!0;let o=e.innerText;return o===void 0&&(o=e.textContent),o=o.trim().toLowerCase(),o.length===0?!1:t.repeating?o[0]===t.keys[0]:o.startsWith(t.keys.join(""))}function U(e,t,o,i,h,p){let a=!1,s=h(e,t,t?o:!1);for(;s;){if(s===e.firstChild){if(a)return!1;a=!0}const n=i?!1:s.disabled||s.getAttribute("aria-disabled")==="true";if(!s.hasAttribute("tabindex")||!we(s,p)||n)s=h(e,s,o);else return s.focus(),!0}return!1}const Ge=l.forwardRef(function(t,o){const{actions:i,autoFocus:h=!1,autoFocusItem:p=!1,children:a,className:s,disabledItemsFocusable:n=!1,disableListWrap:y=!1,onKeyDown:C,variant:k="selectedMenu",...D}=t,d=l.useRef(null),v=l.useRef({keys:[],repeating:!0,previousKeyMatched:!0,lastTime:null});xe(()=>{h&&d.current.focus()},[h]),l.useImperativeHandle(i,()=>({adjustStyleForScrollbar:(r,{direction:u})=>{const f=!d.current.style.width;if(r.clientHeight<d.current.clientHeight&&f){const I=`${je(oe(r))}px`;d.current.style[u==="rtl"?"paddingLeft":"paddingRight"]=I,d.current.style.width=`calc(100% + ${I})`}return d.current}}),[]);const L=r=>{const u=d.current,f=r.key;if(r.ctrlKey||r.metaKey||r.altKey){C&&C(r);return}const $=te(u).activeElement;if(f==="ArrowDown")r.preventDefault(),U(u,$,y,n,ee);else if(f==="ArrowUp")r.preventDefault(),U(u,$,y,n,he);else if(f==="Home")r.preventDefault(),U(u,null,y,n,ee);else if(f==="End")r.preventDefault(),U(u,null,y,n,he);else if(f.length===1){const m=v.current,O=f.toLowerCase(),z=performance.now();m.keys.length>0&&(z-m.lastTime>500?(m.keys=[],m.repeating=!0,m.previousKeyMatched=!0):m.repeating&&O!==m.keys[0]&&(m.repeating=!1)),m.lastTime=z,m.keys.push(O);const F=$&&!m.repeating&&we($,m);m.previousKeyMatched&&(F||U(u,$,!1,n,ee,m))?r.preventDefault():m.previousKeyMatched=!1}C&&C(r)},w=Ce(d,o);let c=-1;l.Children.forEach(a,(r,u)=>{if(!l.isValidElement(r)){c===u&&(c+=1,c>=a.length&&(c=-1));return}r.props.disabled||(k==="selectedMenu"&&r.props.selected||c===-1)&&(c=u),c===u&&(r.props.disabled||r.props.muiSkipListHighlight||r.type.muiSkipListHighlight)&&(c+=1,c>=a.length&&(c=-1))});const P=l.Children.map(a,(r,u)=>{if(u===c){const f={};return p&&(f.autoFocus=!0),r.props.tabIndex===void 0&&k==="selectedMenu"&&(f.tabIndex=0),l.cloneElement(r,f)}return r});return N.jsx(He,{role:"menu",ref:w,className:s,onKeyDown:L,tabIndex:h?0:-1,...D,children:P})});function Xe(e){return Q("MuiPopover",e)}J("MuiPopover",["root","paper"]);function be(e,t){let o=0;return typeof t=="number"?o=t:t==="center"?o=e.height/2:t==="bottom"&&(o=e.height),o}function ve(e,t){let o=0;return typeof t=="number"?o=t:t==="center"?o=e.width/2:t==="right"&&(o=e.width),o}function Pe(e){return[e.horizontal,e.vertical].map(t=>typeof t=="number"?`${t}px`:t).join(" ")}function q(e){return typeof e=="function"?e():e}const _e=e=>{const{classes:t}=e;return ne({root:["root"],paper:["paper"]},Xe,t)},qe=j(Ue,{name:"MuiPopover",slot:"Root"})({}),Ie=j(Fe,{name:"MuiPopover",slot:"Paper"})({position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}),Je=l.forwardRef(function(t,o){const i=se({props:t,name:"MuiPopover"}),{action:h,anchorEl:p,anchorOrigin:a={vertical:"top",horizontal:"left"},anchorPosition:s,anchorReference:n="anchorEl",children:y,className:C,container:k,elevation:D=8,marginThreshold:d=16,open:v,PaperProps:L={},slots:w={},slotProps:c={},transformOrigin:P={vertical:"top",horizontal:"left"},TransitionComponent:r,transitionDuration:u="auto",TransitionProps:f={},disableScrollLock:I=!1,...$}=i,m=l.useRef(),O={...i,anchorOrigin:a,anchorReference:n,elevation:D,marginThreshold:d,transformOrigin:P,TransitionComponent:r,transitionDuration:u,TransitionProps:f},z=_e(O),F=l.useCallback(()=>{if(n==="anchorPosition")return s;const g=q(p),M=(g&&g.nodeType===1?g:te(m.current).body).getBoundingClientRect();return{top:M.top+be(M,a.vertical),left:M.left+ve(M,a.horizontal)}},[p,a.horizontal,a.vertical,s,n]),S=l.useCallback(g=>({vertical:be(g,P.vertical),horizontal:ve(g,P.horizontal)}),[P.horizontal,P.vertical]),V=l.useCallback(g=>{const x={width:g.offsetWidth,height:g.offsetHeight},M=S(x);if(n==="none")return{top:null,left:null,transformOrigin:Pe(M)};const ae=F();let A=ae.top-M.vertical,H=ae.left-M.horizontal;const le=A+x.height,ce=H+x.width,ue=oe(q(p)),pe=ue.innerHeight-d,de=ue.innerWidth-d;if(d!==null&&A<d){const T=A-d;A-=T,M.vertical+=T}else if(d!==null&&le>pe){const T=le-pe;A-=T,M.vertical+=T}if(d!==null&&H<d){const T=H-d;H-=T,M.horizontal+=T}else if(ce>de){const T=ce-de;H-=T,M.horizontal+=T}return{top:`${Math.round(A)}px`,left:`${Math.round(H)}px`,transformOrigin:Pe(M)}},[p,n,F,S,d]),[Y,G]=l.useState(v),E=l.useCallback(()=>{const g=m.current;if(!g)return;const x=V(g);x.top!==null&&g.style.setProperty("top",x.top),x.left!==null&&(g.style.left=x.left),g.style.transformOrigin=x.transformOrigin,G(!0)},[V]);l.useEffect(()=>(I&&window.addEventListener("scroll",E),()=>window.removeEventListener("scroll",E)),[p,I,E]);const Z=()=>{E()},X=()=>{G(!1)};l.useEffect(()=>{v&&E()}),l.useImperativeHandle(h,()=>v?{updatePosition:()=>{E()}}:null,[v,E]),l.useEffect(()=>{if(!v)return;const g=We(()=>{E()}),x=oe(q(p));return x.addEventListener("resize",g),()=>{g.clear(),x.removeEventListener("resize",g)}},[p,v,E]);let b=u;const R={slots:{transition:r,...w},slotProps:{transition:f,paper:L,...c}},[re,Ee]=B("transition",{elementType:De,externalForwardedProps:R,ownerState:O,getSlotProps:g=>({...g,onEntering:(x,M)=>{g.onEntering?.(x,M),Z()},onExited:x=>{g.onExited?.(x),X()}}),additionalProps:{appear:!0,in:v}});u==="auto"&&!re.muiSupportAuto&&(b=void 0);const Re=k||(p?te(q(p)).body:void 0),[ie,{slots:Te,slotProps:ke,...Oe}]=B("root",{ref:o,elementType:qe,externalForwardedProps:{...R,...$},shouldForwardComponentProp:!0,additionalProps:{slots:{backdrop:w.backdrop},slotProps:{backdrop:Ve(typeof c.backdrop=="function"?c.backdrop(O):c.backdrop,{invisible:!0})},container:Re,open:v},ownerState:O,className:K(z.root,C)}),[Le,$e]=B("paper",{ref:m,className:z.paper,elementType:Ie,externalForwardedProps:R,shouldForwardComponentProp:!0,additionalProps:{elevation:D,style:Y?void 0:{opacity:0}},ownerState:O});return N.jsx(ie,{...Oe,...!Ke(ie)&&{slots:Te,slotProps:ke,disableScrollLock:I},children:N.jsx(re,{...Ee,timeout:b,children:N.jsx(Le,{...$e,children:y})})})});function Qe(e){return Q("MuiMenu",e)}J("MuiMenu",["root","paper","list"]);const Ye={vertical:"top",horizontal:"right"},Ze={vertical:"top",horizontal:"left"},et=e=>{const{classes:t}=e;return ne({root:["root"],paper:["paper"],list:["list"]},Qe,t)},tt=j(Je,{shouldForwardProp:e=>Me(e)||e==="classes",name:"MuiMenu",slot:"Root"})({}),ot=j(Ie,{name:"MuiMenu",slot:"Paper"})({maxHeight:"calc(100% - 96px)",WebkitOverflowScrolling:"touch"}),st=j(Ge,{name:"MuiMenu",slot:"List"})({outline:0}),dt=l.forwardRef(function(t,o){const i=se({props:t,name:"MuiMenu"}),{autoFocus:h=!0,children:p,className:a,disableAutoFocusItem:s=!1,MenuListProps:n={},onClose:y,open:C,PaperProps:k={},PopoverClasses:D,transitionDuration:d="auto",TransitionProps:{onEntering:v,...L}={},variant:w="selectedMenu",slots:c={},slotProps:P={},...r}=i,u=Se(),f={...i,autoFocus:h,disableAutoFocusItem:s,MenuListProps:n,onEntering:v,PaperProps:k,transitionDuration:d,TransitionProps:L,variant:w},I=et(f),$=h&&!s&&C,m=l.useRef(null),O=(b,R)=>{m.current&&m.current.adjustStyleForScrollbar(b,{direction:u?"rtl":"ltr"}),v&&v(b,R)},z=b=>{b.key==="Tab"&&(b.preventDefault(),y&&y(b,"tabKeyDown"))};let F=-1;l.Children.map(p,(b,R)=>{l.isValidElement(b)&&(b.props.disabled||(w==="selectedMenu"&&b.props.selected||F===-1)&&(F=R))});const S={slots:c,slotProps:{list:n,transition:L,paper:k,...P}},V=Ne({elementType:c.root,externalSlotProps:P.root,ownerState:f,className:[I.root,a]}),[Y,G]=B("paper",{className:I.paper,elementType:ot,externalForwardedProps:S,shouldForwardComponentProp:!0,ownerState:f}),[E,Z]=B("list",{className:K(I.list,n.className),elementType:st,shouldForwardComponentProp:!0,externalForwardedProps:S,getSlotProps:b=>({...b,onKeyDown:R=>{z(R),b.onKeyDown?.(R)}}),ownerState:f}),X=typeof S.slotProps.transition=="function"?S.slotProps.transition(f):S.slotProps.transition;return N.jsx(tt,{onClose:y,anchorOrigin:{vertical:"bottom",horizontal:u?"right":"left"},transformOrigin:u?Ye:Ze,slots:{root:c.root,paper:Y,backdrop:c.backdrop,...c.transition&&{transition:c.transition}},slotProps:{root:V,paper:G,backdrop:typeof P.backdrop=="function"?P.backdrop(f):P.backdrop,transition:{...X,onEntering:(...b)=>{O(...b),X?.onEntering?.(...b)}}},open:C,ref:o,transitionDuration:d,ownerState:f,...r,classes:D,children:N.jsx(E,{actions:m,autoFocus:h&&(F===-1||s),autoFocusItem:$,variant:w,...Z,children:p})})});function nt(e){return Q("MuiMenuItem",e)}const W=J("MuiMenuItem",["root","focusVisible","dense","disabled","divider","gutters","selected"]),rt=(e,t)=>{const{ownerState:o}=e;return[t.root,o.dense&&t.dense,o.divider&&t.divider,!o.disableGutters&&t.gutters]},it=e=>{const{disabled:t,dense:o,divider:i,disableGutters:h,selected:p,classes:a}=e,n=ne({root:["root",o&&"dense",t&&"disabled",!h&&"gutters",i&&"divider",p&&"selected"]},nt,a);return{...a,...n}},at=j(ze,{shouldForwardProp:e=>Me(e)||e==="classes",name:"MuiMenuItem",slot:"Root",overridesResolver:rt})(Ae(({theme:e})=>({...e.typography.body1,display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",minHeight:48,paddingTop:6,paddingBottom:6,boxSizing:"border-box",whiteSpace:"nowrap","&:hover":{textDecoration:"none",backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${W.selected}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / ${e.vars.palette.action.selectedOpacity})`:_(e.palette.primary.main,e.palette.action.selectedOpacity),[`&.${W.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:_(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)}},[`&.${W.selected}:hover`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:_(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / ${e.vars.palette.action.selectedOpacity})`:_(e.palette.primary.main,e.palette.action.selectedOpacity)}},[`&.${W.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`&.${W.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity},[`& + .${ge.root}`]:{marginTop:e.spacing(1),marginBottom:e.spacing(1)},[`& + .${ge.inset}`]:{marginLeft:52},[`& .${me.root}`]:{marginTop:0,marginBottom:0},[`& .${me.inset}`]:{paddingLeft:36},[`& .${ye.root}`]:{minWidth:36},variants:[{props:({ownerState:t})=>!t.disableGutters,style:{paddingLeft:16,paddingRight:16}},{props:({ownerState:t})=>t.divider,style:{borderBottom:`1px solid ${(e.vars||e).palette.divider}`,backgroundClip:"padding-box"}},{props:({ownerState:t})=>!t.dense,style:{[e.breakpoints.up("sm")]:{minHeight:"auto"}}},{props:({ownerState:t})=>t.dense,style:{minHeight:32,paddingTop:4,paddingBottom:4,...e.typography.body2,[`& .${ye.root} svg`]:{fontSize:"1.25rem"}}}]}))),ft=l.forwardRef(function(t,o){const i=se({props:t,name:"MuiMenuItem"}),{autoFocus:h=!1,component:p="li",dense:a=!1,divider:s=!1,disableGutters:n=!1,focusVisibleClassName:y,role:C="menuitem",tabIndex:k,className:D,...d}=i,v=l.useContext(fe),L=l.useMemo(()=>({dense:a||v.dense||!1,disableGutters:n}),[v.dense,a,n]),w=l.useRef(null);xe(()=>{h&&w.current&&w.current.focus()},[h]);const c={...i,dense:L.dense,divider:s,disableGutters:n},P=it(i),r=Ce(w,o);let u;return i.disabled||(u=k!==void 0?k:-1),N.jsx(fe.Provider,{value:L,children:N.jsx(at,{ref:r,role:C,tabIndex:u,component:p,focusVisibleClassName:K(P.focusVisible,y),className:K(P.root,D),...d,ownerState:c,classes:P})})});export{ft as M,dt as a,pt as g};
@@ -1 +0,0 @@
1
- import{r as n,s as I,j as r,w as p,x,F as f,J as g,c as u}from"./index-D2hrtqN7.js";import{g as L}from"./MenuItem-Ct1Eq8uZ.js";import{L as d}from"./listItemTextClasses-st6hnk8F.js";const v=t=>{const{alignItems:s,classes:o}=t;return f({root:["root",s==="flex-start"&&"alignItemsFlexStart"]},L,o)},S=p("div",{name:"MuiListItemIcon",slot:"Root",overridesResolver:(t,s)=>{const{ownerState:o}=t;return[s.root,o.alignItems==="flex-start"&&s.alignItemsFlexStart]}})(g(({theme:t})=>({minWidth:56,color:(t.vars||t).palette.action.active,flexShrink:0,display:"inline-flex",variants:[{props:{alignItems:"flex-start"},style:{marginTop:8}}]}))),j=n.forwardRef(function(s,o){const e=I({props:s,name:"MuiListItemIcon"}),{className:i,...c}=e,l=n.useContext(d),a={...e,alignItems:l.alignItems},m=v(a);return r.jsx(S,{className:x(m.root,i),ownerState:a,ref:o,...c})}),w=u(r.jsx("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"}));export{w as A,j as L};