@malloy-publisher/server 0.0.106 → 0.0.108

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 (318) hide show
  1. package/dist/app/api-doc.yaml +133 -0
  2. package/dist/app/assets/Chip-DGhbYY0q.js +1 -0
  3. package/dist/app/assets/Container-B0KHzXKt.js +1 -0
  4. package/dist/app/assets/DialogTitle-DR48y6tE.js +1 -0
  5. package/dist/app/assets/Edit-DALFdGEc.js +1 -0
  6. package/dist/app/assets/FormControlContext-BRoFhJft.js +1 -0
  7. package/dist/app/assets/HomePage-D_nRraEL.js +3 -0
  8. package/dist/app/assets/MainPage-B4hVmqCL.js +1 -0
  9. package/dist/app/assets/MenuItem-_baoLhUG.js +1 -0
  10. package/dist/app/assets/Modal-BXBDnsg2.js +1 -0
  11. package/dist/app/assets/ModelPage-BKTJdSxS.js +2 -0
  12. package/dist/app/assets/MoreVert-CShGo3pe.js +1 -0
  13. package/dist/app/assets/PackagePage-z3SwXvJf.js +2 -0
  14. package/dist/app/assets/ProjectPage-jU6PqHcz.js +1 -0
  15. package/dist/app/assets/RouteError-xhztAFCv.js +1 -0
  16. package/dist/app/assets/WorkbookPage-BFAQAKC6.js +6 -0
  17. package/dist/app/assets/index-Bzmq4WOt.js +676 -0
  18. package/dist/app/assets/index-DIS-Myin.js +420 -0
  19. package/dist/app/assets/{index-CvbMKVwx.js → index-DoB7q17I.js} +7 -7
  20. package/dist/app/assets/index.es20-BPDKJ1mC.js +1 -0
  21. package/dist/app/assets/index.es23-CGcuw-pl.js +2 -0
  22. package/dist/app/assets/{index.es231-02O061a5.js → index.es297-CXXkvqrk.js} +1 -1
  23. package/dist/app/assets/{index.es232-DOZR37hD.js → index.es298-Clb9Gx4p.js} +1 -1
  24. package/dist/app/assets/{index.es235-CwaFVls_.js → index.es301-CvjmNg6I.js} +1 -1
  25. package/dist/app/assets/{index.es240-BXsCiix7.js → index.es306-BTbwrAfY.js} +1 -1
  26. package/dist/app/assets/{index.es248-BBXwDGlH.js → index.es314-i9HKymPG.js} +1 -1
  27. package/dist/app/assets/{index.es249-it6O0zLZ.js → index.es315-ffN5HvPT.js} +1 -1
  28. package/dist/app/assets/{index.es252-BU8jndoZ.js → index.es318-Dt5n7rl7.js} +1 -1
  29. package/dist/app/assets/{index.es256-BvZRwMxf.js → index.es322-DarpkShG.js} +1 -1
  30. package/dist/app/assets/{index.es259-6-xstYpb.js → index.es325-DGXcHkJW.js} +1 -1
  31. package/dist/app/assets/{index.es262-BDUOVoIz.js → index.es328-OrbxFN0T.js} +1 -1
  32. package/dist/app/assets/{index.es263-CHueaYAb.js → index.es329-DOg4tLZf.js} +1 -1
  33. package/dist/app/assets/{index.es277-CbrHqWmX.js → index.es343-B3c-LWee.js} +1 -1
  34. package/dist/app/assets/{index.es278-CI5gPs5v.js → index.es344-BzlM_qzj.js} +1 -1
  35. package/dist/app/assets/{index.es279-DH9b__8l.js → index.es345-Bx5jaaik.js} +1 -1
  36. package/dist/app/assets/{index.es281-CGN0Pl1D.js → index.es347-D4l698Ba.js} +1 -1
  37. package/dist/app/assets/{index.es286-XRt1U2aU.js → index.es352-CpzIN4Ck.js} +1 -1
  38. package/dist/app/assets/{index.es288-DSszyNly.js → index.es354-BzQZ7qJD.js} +1 -1
  39. package/dist/app/assets/{index.es289-xrNpklpB.js → index.es355-DX--h2FO.js} +1 -1
  40. package/dist/app/assets/{index.es294-B75OnIUq.js → index.es360-Brs4IhQL.js} +1 -1
  41. package/dist/app/assets/{index.es295-wxT8LaCU.js → index.es361-C_jQQEMZ.js} +1 -1
  42. package/dist/app/assets/{index.es297-DCQpwhAH.js → index.es363-BZd8QWNz.js} +1 -1
  43. package/dist/app/assets/{index.es298-Dtm6S7Te.js → index.es364-5Y8szdnr.js} +1 -1
  44. package/dist/app/assets/{index.es299-CO3NhjF0.js → index.es365-iXnPxtgs.js} +1 -1
  45. package/dist/app/assets/{index.es302-BNx4kwZQ.js → index.es368-BBVgx6aX.js} +1 -1
  46. package/dist/app/assets/{index.es304-Cslijulp.js → index.es370-ClbIH95T.js} +1 -1
  47. package/dist/app/assets/{index.es305-Bj5y75UJ.js → index.es371-DmqxEYIc.js} +1 -1
  48. package/dist/app/assets/{index.es306-BY9A-bfA.js → index.es372-Bot_-48c.js} +1 -1
  49. package/dist/app/assets/{index.es312-BOpCGR-W.js → index.es378-B9aRQ00Z.js} +1 -1
  50. package/dist/app/assets/{index.es313-j4e0V-ax.js → index.es379-DQAEtWxw.js} +1 -1
  51. package/dist/app/assets/{index.es314-QPXF8A7X.js → index.es380-BBp8E5gV.js} +1 -1
  52. package/dist/app/assets/{index.es315-BBht-U5W.js → index.es381-Cl0nVZsB.js} +1 -1
  53. package/dist/app/assets/{index.es317-Ba6bfhqW.js → index.es383-BMW5Mbfn.js} +1 -1
  54. package/dist/app/assets/{index.es321-BzMKJGft.js → index.es387-Cqwn90T2.js} +1 -1
  55. package/dist/app/assets/{index.es322-Dsh6cVFT.js → index.es388-BGLiezvQ.js} +1 -1
  56. package/dist/app/assets/{index.es330-CwhtB6Ga.js → index.es396-Dnto5_1_.js} +1 -1
  57. package/dist/app/assets/{index.es333-BkIXdkt8.js → index.es399-oYyQuMIn.js} +1 -1
  58. package/dist/app/assets/{index.es336-CDPSHwok.js → index.es402-C7bOCmc3.js} +1 -1
  59. package/dist/app/assets/{index.es339-CpmgqEMA.js → index.es405-CgiLlAXi.js} +1 -1
  60. package/dist/app/assets/{index.es343-DpQJ0N3s.js → index.es409-CTqIYL8X.js} +1 -1
  61. package/dist/app/assets/{index.es345-Cu1t0B48.js → index.es411-DCscG5n_.js} +1 -1
  62. package/dist/app/assets/{index.es353-Boayqq8b.js → index.es419-D8w4xXW-.js} +1 -1
  63. package/dist/app/assets/{index.es354-B25Rulno.js → index.es420-CoY4mPyG.js} +1 -1
  64. package/dist/app/assets/{index.es361-BbYa_qYT.js → index.es427-DPgNELR1.js} +1 -1
  65. package/dist/app/assets/{index.es362-BnUI1TJX.js → index.es428-CKGg3G7e.js} +1 -1
  66. package/dist/app/assets/{index.es372-Din3gmuj.js → index.es438-DLZwD0On.js} +1 -1
  67. package/dist/app/assets/{index.es376-CAM-NFdA.js → index.es442-CeFC_3kB.js} +1 -1
  68. package/dist/app/assets/{index.es382-r9NT2hns.js → index.es448-Bkdic4-K.js} +1 -1
  69. package/dist/app/assets/{index.es387-DWtDDVHa.js → index.es453-BTUy9umd.js} +1 -1
  70. package/dist/app/assets/{index.es388-Cddokof0.js → index.es454-B-wtdVwd.js} +1 -1
  71. package/dist/app/assets/{index.es390-BgcDic1S.js → index.es456-DMl0frQV.js} +1 -1
  72. package/dist/app/assets/{index.es394-Cuad4cFu.js → index.es460-BCFWaHpj.js} +1 -1
  73. package/dist/app/assets/{index.es396-CQcbzzI_.js → index.es462-CMWboMtJ.js} +1 -1
  74. package/dist/app/assets/{index.es398-DBUoETTk.js → index.es464-3Yi-DUIC.js} +1 -1
  75. package/dist/app/assets/{index.es401-D7FZbPq9.js → index.es467-Bhyygz2G.js} +1 -1
  76. package/dist/app/assets/{index.es402-C5ht0e8l.js → index.es468-HCYOhbfy.js} +1 -1
  77. package/dist/app/assets/{index.es406-pes6PLHN.js → index.es472-BGdt37JU.js} +1 -1
  78. package/dist/app/assets/{index.es408-DV2ChDJw.js → index.es474-Cvsrw_ol.js} +1 -1
  79. package/dist/app/assets/{index.es415-BI_J_S9x.js → index.es481-CQK61FBO.js} +1 -1
  80. package/dist/app/assets/{index.es417-BNH1K0F3.js → index.es483-_fCFzllD.js} +1 -1
  81. package/dist/app/assets/{index.es419-DaaHuOeT.js → index.es485-onmvNF-0.js} +1 -1
  82. package/dist/app/assets/{index.es423-BFNF97RC.js → index.es489-7PLT4DLq.js} +1 -1
  83. package/dist/app/assets/{index.es433-TWQYaV1h.js → index.es499-C0JWr_xK.js} +1 -1
  84. package/dist/app/assets/{index.es434-Dhj89L3U.js → index.es500-D41F9-Tw.js} +1 -1
  85. package/dist/app/assets/{index.es441-9pPCdH1i.js → index.es507-DKp0nulG.js} +1 -1
  86. package/dist/app/assets/{index.es442-B_JzqX5N.js → index.es508-ilzXBvKZ.js} +1 -1
  87. package/dist/app/assets/index.es7-C8O8lseo.js +1 -0
  88. package/dist/app/assets/index.modern-Da9HWSay.js +17 -0
  89. package/dist/app/assets/{index.umd-DknWdzGi.js → index.umd-BJAbIV_-.js} +61 -61
  90. package/dist/app/assets/listItemTextClasses-DhilXbg6.js +1 -0
  91. package/dist/app/index.html +1 -3
  92. package/dist/server.js +1838 -6280
  93. package/eslint.config.mjs +16 -3
  94. package/package.json +10 -10
  95. package/publisher.config.json +32 -25
  96. package/src/config.ts +61 -1
  97. package/src/constants.ts +0 -1
  98. package/src/controller/connection.controller.ts +2 -2
  99. package/src/server.ts +73 -13
  100. package/src/service/connection.ts +25 -15
  101. package/src/service/package.spec.ts +67 -22
  102. package/src/service/package.ts +8 -1
  103. package/src/service/project.ts +13 -31
  104. package/src/service/project_store.spec.ts +30 -53
  105. package/src/service/project_store.ts +100 -68
  106. package/dist/app/assets/index-Bh1cWMgT.js +0 -240
  107. package/dist/app/assets/index-SM0qJxoC.js +0 -676
  108. package/dist/app/assets/index.es24-CDJ3b9GD.js +0 -2
  109. package/dist/app/assets/mui-BL9dYvR2.js +0 -159
  110. package/dist/app/assets/vendor-c5ypKtDW.js +0 -17
  111. /package/dist/app/assets/{index.es220-CG6Dc4jp.js → index.es286-CG6Dc4jp.js} +0 -0
  112. /package/dist/app/assets/{index.es228-DsBKuouk.js → index.es294-DsBKuouk.js} +0 -0
  113. /package/dist/app/assets/{index.es229-D_z4Izcz.js → index.es295-D_z4Izcz.js} +0 -0
  114. /package/dist/app/assets/{index.es230-727ZlQH0.js → index.es296-727ZlQH0.js} +0 -0
  115. /package/dist/app/assets/{index.es233-Dn00JSTd.js → index.es299-Dn00JSTd.js} +0 -0
  116. /package/dist/app/assets/{index.es234-COJ4H7py.js → index.es300-COJ4H7py.js} +0 -0
  117. /package/dist/app/assets/{index.es236-Bu5BbsvL.js → index.es302-Bu5BbsvL.js} +0 -0
  118. /package/dist/app/assets/{index.es237-7O62HKoU.js → index.es303-7O62HKoU.js} +0 -0
  119. /package/dist/app/assets/{index.es238-BPT9niGB.js → index.es304-BPT9niGB.js} +0 -0
  120. /package/dist/app/assets/{index.es239-Dhn9LcZ4.js → index.es305-Dhn9LcZ4.js} +0 -0
  121. /package/dist/app/assets/{index.es241-eg146-Ew.js → index.es307-eg146-Ew.js} +0 -0
  122. /package/dist/app/assets/{index.es242-Du268qiB.js → index.es308-Du268qiB.js} +0 -0
  123. /package/dist/app/assets/{index.es243-fje9CFhw.js → index.es309-fje9CFhw.js} +0 -0
  124. /package/dist/app/assets/{index.es244-BwXTMy5W.js → index.es310-BwXTMy5W.js} +0 -0
  125. /package/dist/app/assets/{index.es245-3xVqZejG.js → index.es311-3xVqZejG.js} +0 -0
  126. /package/dist/app/assets/{index.es246-xW4inM5L.js → index.es312-xW4inM5L.js} +0 -0
  127. /package/dist/app/assets/{index.es247-DHo0CJ0O.js → index.es313-DHo0CJ0O.js} +0 -0
  128. /package/dist/app/assets/{index.es250-C3t2pwGQ.js → index.es316-C3t2pwGQ.js} +0 -0
  129. /package/dist/app/assets/{index.es251-DNquZEk8.js → index.es317-DNquZEk8.js} +0 -0
  130. /package/dist/app/assets/{index.es253-BHOwM8T6.js → index.es319-BHOwM8T6.js} +0 -0
  131. /package/dist/app/assets/{index.es254-DxSadP1t.js → index.es320-DxSadP1t.js} +0 -0
  132. /package/dist/app/assets/{index.es255-DbXoA79R.js → index.es321-DbXoA79R.js} +0 -0
  133. /package/dist/app/assets/{index.es257-Bp6g37R7.js → index.es323-Bp6g37R7.js} +0 -0
  134. /package/dist/app/assets/{index.es258-sacFqUAJ.js → index.es324-sacFqUAJ.js} +0 -0
  135. /package/dist/app/assets/{index.es260-C7gG9l05.js → index.es326-C7gG9l05.js} +0 -0
  136. /package/dist/app/assets/{index.es261-Dsg_Bt_b.js → index.es327-Dsg_Bt_b.js} +0 -0
  137. /package/dist/app/assets/{index.es264-D9R-vmeu.js → index.es330-D9R-vmeu.js} +0 -0
  138. /package/dist/app/assets/{index.es265-BPhBrDlE.js → index.es331-BPhBrDlE.js} +0 -0
  139. /package/dist/app/assets/{index.es266-C-TU5hQ_.js → index.es332-C-TU5hQ_.js} +0 -0
  140. /package/dist/app/assets/{index.es267-DtFQj3wx.js → index.es333-DtFQj3wx.js} +0 -0
  141. /package/dist/app/assets/{index.es268-m2LEI-9-.js → index.es334-m2LEI-9-.js} +0 -0
  142. /package/dist/app/assets/{index.es269-BoXegm-a.js → index.es335-BoXegm-a.js} +0 -0
  143. /package/dist/app/assets/{index.es270-B9wLZaAG.js → index.es336-B9wLZaAG.js} +0 -0
  144. /package/dist/app/assets/{index.es271-ClGRhx96.js → index.es337-ClGRhx96.js} +0 -0
  145. /package/dist/app/assets/{index.es272-DEIpsLCJ.js → index.es338-DEIpsLCJ.js} +0 -0
  146. /package/dist/app/assets/{index.es273-BgYniUM_.js → index.es339-BgYniUM_.js} +0 -0
  147. /package/dist/app/assets/{index.es274-COcR7UxN.js → index.es340-COcR7UxN.js} +0 -0
  148. /package/dist/app/assets/{index.es275-BjQB5zDj.js → index.es341-BjQB5zDj.js} +0 -0
  149. /package/dist/app/assets/{index.es276-C-nORZOA.js → index.es342-C-nORZOA.js} +0 -0
  150. /package/dist/app/assets/{index.es280-BX77sIaO.js → index.es346-BX77sIaO.js} +0 -0
  151. /package/dist/app/assets/{index.es282-B-DoSBHF.js → index.es348-B-DoSBHF.js} +0 -0
  152. /package/dist/app/assets/{index.es283-bCA53EVm.js → index.es349-bCA53EVm.js} +0 -0
  153. /package/dist/app/assets/{index.es284-w-ucz2PV.js → index.es350-w-ucz2PV.js} +0 -0
  154. /package/dist/app/assets/{index.es285-Dayu4EKP.js → index.es351-Dayu4EKP.js} +0 -0
  155. /package/dist/app/assets/{index.es287-DKXYxT9g.js → index.es353-DKXYxT9g.js} +0 -0
  156. /package/dist/app/assets/{index.es290-DfxzS6Rs.js → index.es356-DfxzS6Rs.js} +0 -0
  157. /package/dist/app/assets/{index.es291-SKMF96pI.js → index.es357-SKMF96pI.js} +0 -0
  158. /package/dist/app/assets/{index.es292-ajMbGru0.js → index.es358-ajMbGru0.js} +0 -0
  159. /package/dist/app/assets/{index.es293--30QC5Em.js → index.es359--30QC5Em.js} +0 -0
  160. /package/dist/app/assets/{index.es296-B430Bg39.js → index.es362-B430Bg39.js} +0 -0
  161. /package/dist/app/assets/{index.es300-CM8KxXT1.js → index.es366-CM8KxXT1.js} +0 -0
  162. /package/dist/app/assets/{index.es301-B1SYOhNW.js → index.es367-B1SYOhNW.js} +0 -0
  163. /package/dist/app/assets/{index.es303-DkBy-JyN.js → index.es369-DkBy-JyN.js} +0 -0
  164. /package/dist/app/assets/{index.es307-BILxekzW.js → index.es373-BILxekzW.js} +0 -0
  165. /package/dist/app/assets/{index.es308-C5wWYbrZ.js → index.es374-C5wWYbrZ.js} +0 -0
  166. /package/dist/app/assets/{index.es309-HzYwdGDm.js → index.es375-HzYwdGDm.js} +0 -0
  167. /package/dist/app/assets/{index.es310-T-Tgc4AT.js → index.es376-T-Tgc4AT.js} +0 -0
  168. /package/dist/app/assets/{index.es311-ifBTmRxC.js → index.es377-ifBTmRxC.js} +0 -0
  169. /package/dist/app/assets/{index.es316-BMj5Y0dO.js → index.es382-BMj5Y0dO.js} +0 -0
  170. /package/dist/app/assets/{index.es318-BjABl1g7.js → index.es384-BjABl1g7.js} +0 -0
  171. /package/dist/app/assets/{index.es319-xI-RfyKK.js → index.es385-xI-RfyKK.js} +0 -0
  172. /package/dist/app/assets/{index.es320-ySlJ1b_l.js → index.es386-ySlJ1b_l.js} +0 -0
  173. /package/dist/app/assets/{index.es323-BQoSv7ci.js → index.es389-BQoSv7ci.js} +0 -0
  174. /package/dist/app/assets/{index.es324-w8dY5SsB.js → index.es390-w8dY5SsB.js} +0 -0
  175. /package/dist/app/assets/{index.es325-TU54ms6u.js → index.es391-TU54ms6u.js} +0 -0
  176. /package/dist/app/assets/{index.es326-DREVFZK8.js → index.es392-DREVFZK8.js} +0 -0
  177. /package/dist/app/assets/{index.es327-BfivnA6A.js → index.es393-BfivnA6A.js} +0 -0
  178. /package/dist/app/assets/{index.es328-P4WzXJd0.js → index.es394-P4WzXJd0.js} +0 -0
  179. /package/dist/app/assets/{index.es329-BAng5TT0.js → index.es395-BAng5TT0.js} +0 -0
  180. /package/dist/app/assets/{index.es331-B5lbUyaz.js → index.es397-B5lbUyaz.js} +0 -0
  181. /package/dist/app/assets/{index.es332-mebxcVVE.js → index.es398-mebxcVVE.js} +0 -0
  182. /package/dist/app/assets/{index.es334-XBlWyCtg.js → index.es400-XBlWyCtg.js} +0 -0
  183. /package/dist/app/assets/{index.es335-BfCpw3nA.js → index.es401-BfCpw3nA.js} +0 -0
  184. /package/dist/app/assets/{index.es337-Cc5clBb7.js → index.es403-Cc5clBb7.js} +0 -0
  185. /package/dist/app/assets/{index.es338-IuBKFhSY.js → index.es404-IuBKFhSY.js} +0 -0
  186. /package/dist/app/assets/{index.es340-Du5NY7AG.js → index.es406-Du5NY7AG.js} +0 -0
  187. /package/dist/app/assets/{index.es341-Bvotw-X0.js → index.es407-Bvotw-X0.js} +0 -0
  188. /package/dist/app/assets/{index.es342-UIAJJxZW.js → index.es408-UIAJJxZW.js} +0 -0
  189. /package/dist/app/assets/{index.es344-D9-PGadD.js → index.es410-D9-PGadD.js} +0 -0
  190. /package/dist/app/assets/{index.es346-sdHcTMYB.js → index.es412-sdHcTMYB.js} +0 -0
  191. /package/dist/app/assets/{index.es347-Ci6OQyBP.js → index.es413-Ci6OQyBP.js} +0 -0
  192. /package/dist/app/assets/{index.es348-BC5c_5Pe.js → index.es414-BC5c_5Pe.js} +0 -0
  193. /package/dist/app/assets/{index.es349-Tz6hzZYG.js → index.es415-Tz6hzZYG.js} +0 -0
  194. /package/dist/app/assets/{index.es350-DB_GagMm.js → index.es416-DB_GagMm.js} +0 -0
  195. /package/dist/app/assets/{index.es351-DLbgOhZU.js → index.es417-DLbgOhZU.js} +0 -0
  196. /package/dist/app/assets/{index.es352-B0XVJmRM.js → index.es418-B0XVJmRM.js} +0 -0
  197. /package/dist/app/assets/{index.es355-shcSOmrb.js → index.es421-shcSOmrb.js} +0 -0
  198. /package/dist/app/assets/{index.es356-D4Tzg5kh.js → index.es422-D4Tzg5kh.js} +0 -0
  199. /package/dist/app/assets/{index.es357-Deuh7S70.js → index.es423-Deuh7S70.js} +0 -0
  200. /package/dist/app/assets/{index.es358-BUEGK8hf.js → index.es424-BUEGK8hf.js} +0 -0
  201. /package/dist/app/assets/{index.es359-BNioltXt.js → index.es425-BNioltXt.js} +0 -0
  202. /package/dist/app/assets/{index.es360-JqZropPD.js → index.es426-JqZropPD.js} +0 -0
  203. /package/dist/app/assets/{index.es363-LKU2TuZ1.js → index.es429-LKU2TuZ1.js} +0 -0
  204. /package/dist/app/assets/{index.es364-BFLt1xDp.js → index.es430-BFLt1xDp.js} +0 -0
  205. /package/dist/app/assets/{index.es365-DKykz6zU.js → index.es431-DKykz6zU.js} +0 -0
  206. /package/dist/app/assets/{index.es366-B3ZDOciz.js → index.es432-B3ZDOciz.js} +0 -0
  207. /package/dist/app/assets/{index.es367-CSHBycmS.js → index.es433-CSHBycmS.js} +0 -0
  208. /package/dist/app/assets/{index.es368-BIEUsx6d.js → index.es434-BIEUsx6d.js} +0 -0
  209. /package/dist/app/assets/{index.es369-B48N-Iqd.js → index.es435-B48N-Iqd.js} +0 -0
  210. /package/dist/app/assets/{index.es370-BY-TUvya.js → index.es436-BY-TUvya.js} +0 -0
  211. /package/dist/app/assets/{index.es371-zocC4JxJ.js → index.es437-zocC4JxJ.js} +0 -0
  212. /package/dist/app/assets/{index.es373-Cza_XSSt.js → index.es439-Cza_XSSt.js} +0 -0
  213. /package/dist/app/assets/{index.es374-Bg-kzb6g.js → index.es440-Bg-kzb6g.js} +0 -0
  214. /package/dist/app/assets/{index.es375-DhUJRlN_.js → index.es441-DhUJRlN_.js} +0 -0
  215. /package/dist/app/assets/{index.es377-C8lEn-DE.js → index.es443-C8lEn-DE.js} +0 -0
  216. /package/dist/app/assets/{index.es378-DhMKtDLN.js → index.es444-DhMKtDLN.js} +0 -0
  217. /package/dist/app/assets/{index.es379-CwjWoCRV.js → index.es445-CwjWoCRV.js} +0 -0
  218. /package/dist/app/assets/{index.es380-CzouJOBO.js → index.es446-CzouJOBO.js} +0 -0
  219. /package/dist/app/assets/{index.es381-B1bQXN8T.js → index.es447-B1bQXN8T.js} +0 -0
  220. /package/dist/app/assets/{index.es383-5LuOXUq_.js → index.es449-5LuOXUq_.js} +0 -0
  221. /package/dist/app/assets/{index.es384-DWJ3fJO_.js → index.es450-DWJ3fJO_.js} +0 -0
  222. /package/dist/app/assets/{index.es385-DJlmqQ1C.js → index.es451-DJlmqQ1C.js} +0 -0
  223. /package/dist/app/assets/{index.es386-QhoSD0DR.js → index.es452-QhoSD0DR.js} +0 -0
  224. /package/dist/app/assets/{index.es389-Be6lgOlo.js → index.es455-Be6lgOlo.js} +0 -0
  225. /package/dist/app/assets/{index.es391-BJ4Li9vH.js → index.es457-BJ4Li9vH.js} +0 -0
  226. /package/dist/app/assets/{index.es392-DQVVAn-B.js → index.es458-DQVVAn-B.js} +0 -0
  227. /package/dist/app/assets/{index.es393-BJGe-b2p.js → index.es459-BJGe-b2p.js} +0 -0
  228. /package/dist/app/assets/{index.es395-BLhTXw86.js → index.es461-BLhTXw86.js} +0 -0
  229. /package/dist/app/assets/{index.es397-atvbtKCR.js → index.es463-atvbtKCR.js} +0 -0
  230. /package/dist/app/assets/{index.es399-DkLiglaE.js → index.es465-DkLiglaE.js} +0 -0
  231. /package/dist/app/assets/{index.es400-C1w2a3ep.js → index.es466-C1w2a3ep.js} +0 -0
  232. /package/dist/app/assets/{index.es403-Cf8iN4DR.js → index.es469-Cf8iN4DR.js} +0 -0
  233. /package/dist/app/assets/{index.es404-COK4E0Yg.js → index.es470-COK4E0Yg.js} +0 -0
  234. /package/dist/app/assets/{index.es405-BknIz3MU.js → index.es471-BknIz3MU.js} +0 -0
  235. /package/dist/app/assets/{index.es407-BeQkCIfX.js → index.es473-BeQkCIfX.js} +0 -0
  236. /package/dist/app/assets/{index.es409-BSxZ-RaX.js → index.es475-BSxZ-RaX.js} +0 -0
  237. /package/dist/app/assets/{index.es410-C7L56vO4.js → index.es476-C7L56vO4.js} +0 -0
  238. /package/dist/app/assets/{index.es411-CUnW07Te.js → index.es477-CUnW07Te.js} +0 -0
  239. /package/dist/app/assets/{index.es412-C1XDQQGZ.js → index.es478-C1XDQQGZ.js} +0 -0
  240. /package/dist/app/assets/{index.es413-CQjiPCtT.js → index.es479-CQjiPCtT.js} +0 -0
  241. /package/dist/app/assets/{index.es414-DQ1-QYvQ.js → index.es480-DQ1-QYvQ.js} +0 -0
  242. /package/dist/app/assets/{index.es416-BbSNqyBO.js → index.es482-BbSNqyBO.js} +0 -0
  243. /package/dist/app/assets/{index.es418-CB2ApiWb.js → index.es484-CB2ApiWb.js} +0 -0
  244. /package/dist/app/assets/{index.es420-B_m7g4N7.js → index.es486-B_m7g4N7.js} +0 -0
  245. /package/dist/app/assets/{index.es421-B6W0miNI.js → index.es487-B6W0miNI.js} +0 -0
  246. /package/dist/app/assets/{index.es422-BMR_PYu6.js → index.es488-BMR_PYu6.js} +0 -0
  247. /package/dist/app/assets/{index.es424-Dj6nwHGl.js → index.es490-Dj6nwHGl.js} +0 -0
  248. /package/dist/app/assets/{index.es425-BpWG_bgh.js → index.es491-BpWG_bgh.js} +0 -0
  249. /package/dist/app/assets/{index.es426-BVUVsWT6.js → index.es492-BVUVsWT6.js} +0 -0
  250. /package/dist/app/assets/{index.es427-CAQ2eGtk.js → index.es493-CAQ2eGtk.js} +0 -0
  251. /package/dist/app/assets/{index.es428-BFOHcciG.js → index.es494-BFOHcciG.js} +0 -0
  252. /package/dist/app/assets/{index.es429-CdO5JTpU.js → index.es495-CdO5JTpU.js} +0 -0
  253. /package/dist/app/assets/{index.es430-CJaU5se_.js → index.es496-CJaU5se_.js} +0 -0
  254. /package/dist/app/assets/{index.es431-DYoNaHQp.js → index.es497-DYoNaHQp.js} +0 -0
  255. /package/dist/app/assets/{index.es432-m4uW47V2.js → index.es498-m4uW47V2.js} +0 -0
  256. /package/dist/app/assets/{index.es435-nyqBNV6O.js → index.es501-nyqBNV6O.js} +0 -0
  257. /package/dist/app/assets/{index.es436-C6j12Q_x.js → index.es502-C6j12Q_x.js} +0 -0
  258. /package/dist/app/assets/{index.es437-7A4Fjokl.js → index.es503-7A4Fjokl.js} +0 -0
  259. /package/dist/app/assets/{index.es438-CB0Krxn9.js → index.es504-CB0Krxn9.js} +0 -0
  260. /package/dist/app/assets/{index.es439-DCE3LsBG.js → index.es505-DCE3LsBG.js} +0 -0
  261. /package/dist/app/assets/{index.es440-C3FkfJm5.js → index.es506-C3FkfJm5.js} +0 -0
  262. /package/dist/app/assets/{index.es443-CVw76BM1.js → index.es509-CVw76BM1.js} +0 -0
  263. /package/dist/app/assets/{index.es444-HnGAYVZD.js → index.es510-HnGAYVZD.js} +0 -0
  264. /package/dist/app/assets/{index.es445-BVz_zdnA.js → index.es511-BVz_zdnA.js} +0 -0
  265. /package/dist/app/assets/{index.es446-C3khCPGq.js → index.es512-C3khCPGq.js} +0 -0
  266. /package/dist/app/assets/{index.es447-D-2ljcwZ.js → index.es513-D-2ljcwZ.js} +0 -0
  267. /package/dist/app/assets/{index.es448-Cv9koXgw.js → index.es514-Cv9koXgw.js} +0 -0
  268. /package/dist/app/assets/{index.es449-CD_QflpE.js → index.es515-CD_QflpE.js} +0 -0
  269. /package/dist/app/assets/{index.es450-DRW-0cLl.js → index.es516-DRW-0cLl.js} +0 -0
  270. /package/dist/app/assets/{index.es451-C-_shW-Y.js → index.es517-C-_shW-Y.js} +0 -0
  271. /package/dist/app/assets/{index.es452-LGGdnPYs.js → index.es518-LGGdnPYs.js} +0 -0
  272. /package/dist/app/assets/{index.es453-C3mMm8J8.js → index.es519-C3mMm8J8.js} +0 -0
  273. /package/dist/app/assets/{index.es454-BzJJZx-M.js → index.es520-BzJJZx-M.js} +0 -0
  274. /package/dist/app/assets/{index.es455-BXkSAIEj.js → index.es521-BXkSAIEj.js} +0 -0
  275. /package/dist/app/assets/{index.es456-BgDCqdQA.js → index.es522-BgDCqdQA.js} +0 -0
  276. /package/dist/app/assets/{index.es457-C8M2exoo.js → index.es523-C8M2exoo.js} +0 -0
  277. /package/dist/app/assets/{index.es458-DHJKELXO.js → index.es524-DHJKELXO.js} +0 -0
  278. /package/dist/app/assets/{index.es459-Cuk6v7N8.js → index.es525-Cuk6v7N8.js} +0 -0
  279. /package/dist/app/assets/{index.es460-DH5Ifo-i.js → index.es526-DH5Ifo-i.js} +0 -0
  280. /package/dist/app/assets/{index.es461-E3gJ1_iC.js → index.es527-E3gJ1_iC.js} +0 -0
  281. /package/dist/app/assets/{index.es462-DAi9KRSo.js → index.es528-DAi9KRSo.js} +0 -0
  282. /package/dist/app/assets/{index.es463-D7oLnXFd.js → index.es529-D7oLnXFd.js} +0 -0
  283. /package/dist/app/assets/{index.es464-BfjtVDDH.js → index.es530-BfjtVDDH.js} +0 -0
  284. /package/dist/app/assets/{index.es465-DnULxvSX.js → index.es531-DnULxvSX.js} +0 -0
  285. /package/dist/app/assets/{index.es466-CkXjmgJE.js → index.es532-CkXjmgJE.js} +0 -0
  286. /package/dist/app/assets/{index.es467-CfQXZHmo.js → index.es533-CfQXZHmo.js} +0 -0
  287. /package/dist/app/assets/{index.es468-DWedfzmr.js → index.es534-DWedfzmr.js} +0 -0
  288. /package/dist/app/assets/{index.es469-DUszq2jm.js → index.es535-DUszq2jm.js} +0 -0
  289. /package/dist/app/assets/{index.es470-B7mTdjB0.js → index.es536-B7mTdjB0.js} +0 -0
  290. /package/dist/app/assets/{index.es471-D5KoaKCx.js → index.es537-D5KoaKCx.js} +0 -0
  291. /package/dist/app/assets/{index.es472-BfHTSMKl.js → index.es538-BfHTSMKl.js} +0 -0
  292. /package/dist/app/assets/{index.es473-B0m2ddpp.js → index.es539-B0m2ddpp.js} +0 -0
  293. /package/dist/app/assets/{index.es474-CyktbL80.js → index.es540-CyktbL80.js} +0 -0
  294. /package/dist/app/assets/{index.es475-Csfq5Kiy.js → index.es541-Csfq5Kiy.js} +0 -0
  295. /package/dist/app/assets/{index.es476-CafNBF8u.js → index.es542-CafNBF8u.js} +0 -0
  296. /package/dist/app/assets/{index.es477-CTRr51gU.js → index.es543-CTRr51gU.js} +0 -0
  297. /package/dist/app/assets/{index.es478-D4h5O-jR.js → index.es544-D4h5O-jR.js} +0 -0
  298. /package/dist/app/assets/{index.es479-C39BiMTA.js → index.es545-C39BiMTA.js} +0 -0
  299. /package/dist/app/assets/{index.es480-Ddv68eIx.js → index.es546-Ddv68eIx.js} +0 -0
  300. /package/dist/app/assets/{index.es481-GBQ2dnAY.js → index.es547-GBQ2dnAY.js} +0 -0
  301. /package/dist/app/assets/{index.es482-PoHY5YXO.js → index.es548-PoHY5YXO.js} +0 -0
  302. /package/dist/app/assets/{index.es483-3e1v2bzS.js → index.es549-3e1v2bzS.js} +0 -0
  303. /package/dist/app/assets/{index.es484-CS3Unz2-.js → index.es550-CS3Unz2-.js} +0 -0
  304. /package/dist/app/assets/{index.es485-bN70gL4F.js → index.es551-bN70gL4F.js} +0 -0
  305. /package/dist/app/assets/{index.es486-CmCqftbK.js → index.es552-CmCqftbK.js} +0 -0
  306. /package/dist/app/assets/{index.es487-Ds-gbosJ.js → index.es553-Ds-gbosJ.js} +0 -0
  307. /package/dist/app/assets/{index.es488-CjDtw9vr.js → index.es554-CjDtw9vr.js} +0 -0
  308. /package/dist/app/assets/{index.es489-BthQWCQV.js → index.es555-BthQWCQV.js} +0 -0
  309. /package/dist/app/assets/{index.es490-DqwNpetd.js → index.es556-DqwNpetd.js} +0 -0
  310. /package/dist/app/assets/{index.es491-Bw305WKR.js → index.es557-Bw305WKR.js} +0 -0
  311. /package/dist/app/assets/{index.es492-DXbdFlpD.js → index.es558-DXbdFlpD.js} +0 -0
  312. /package/dist/app/assets/{index.es493-L9t79GZl.js → index.es559-L9t79GZl.js} +0 -0
  313. /package/dist/app/assets/{index.es494-CbfX1IO0.js → index.es560-CbfX1IO0.js} +0 -0
  314. /package/dist/app/assets/{index.es495-DBQeEorK.js → index.es561-DBQeEorK.js} +0 -0
  315. /package/dist/app/assets/{index.es496-BEBZ7ncR.js → index.es562-BEBZ7ncR.js} +0 -0
  316. /package/dist/app/assets/{index.es497-Bkuqu6BP.js → index.es563-Bkuqu6BP.js} +0 -0
  317. /package/dist/app/assets/{index.es498-D0r3Knsf.js → index.es564-D0r3Knsf.js} +0 -0
  318. /package/dist/app/assets/{index.es499-CVO1_9PV.js → index.es565-CVO1_9PV.js} +0 -0
@@ -35,23 +35,22 @@ export class Project {
35
35
  private packageStatuses: Map<string, PackageInfo> = new Map();
36
36
  private malloyConnections: Map<string, BaseConnection>;
37
37
  private apiConnections: ApiConnection[];
38
- private internalConnections: InternalConnection[];
39
38
  private projectPath: string;
40
39
  private projectName: string;
40
+ private serverRootPath: string;
41
41
  public metadata: ApiProject;
42
42
 
43
43
  constructor(
44
44
  projectName: string,
45
45
  projectPath: string,
46
46
  malloyConnections: Map<string, BaseConnection>,
47
- internalConnections: InternalConnection[],
48
47
  apiConnections: InternalConnection[],
48
+ serverRootPath: string,
49
49
  ) {
50
50
  this.projectName = projectName;
51
51
  this.projectPath = projectPath;
52
+ this.serverRootPath = serverRootPath;
52
53
  this.malloyConnections = malloyConnections;
53
- // InternalConnections have full connection details for doing schema inspection
54
- this.internalConnections = internalConnections;
55
54
  this.apiConnections = apiConnections;
56
55
  this.metadata = {
57
56
  resource: `${API_PREFIX}/projects/${this.projectName}`,
@@ -82,7 +81,6 @@ export class Project {
82
81
  // Update the project's connection maps
83
82
  this.malloyConnections = malloyConnections;
84
83
  this.apiConnections = apiConnections;
85
- this.internalConnections = apiConnections;
86
84
 
87
85
  logger.info(
88
86
  `Successfully updated connections for project ${this.projectName}`,
@@ -101,6 +99,7 @@ export class Project {
101
99
  projectName: string,
102
100
  projectPath: string,
103
101
  defaultConnections: ApiConnection[],
102
+ serverRootPath?: string,
104
103
  ): Promise<Project> {
105
104
  if (!(await fs.promises.stat(projectPath)).isDirectory()) {
106
105
  throw new ProjectNotFoundError(
@@ -112,7 +111,12 @@ export class Project {
112
111
  let apiConnections: InternalConnection[] = [];
113
112
 
114
113
  logger.info(`Creating project with connection configuration`);
115
- const result = await createConnections(projectPath, defaultConnections);
114
+ const result = await createConnections(
115
+ projectPath,
116
+ defaultConnections,
117
+ projectName,
118
+ serverRootPath,
119
+ );
116
120
  malloyConnections = result.malloyConnections;
117
121
  apiConnections = result.apiConnections;
118
122
 
@@ -129,17 +133,7 @@ export class Project {
129
133
  projectPath,
130
134
  malloyConnections,
131
135
  apiConnections,
132
- apiConnections.map((internalConnection) => {
133
- // Create a new ApiConnection object from each InternalConnection
134
- // by excluding the internal connection details
135
- // We don't want to send passwords and connection strings to the client
136
- return {
137
- name: internalConnection.name,
138
- type: internalConnection.type,
139
- attributes: internalConnection.attributes,
140
- resource: internalConnection.resource,
141
- };
142
- }),
136
+ serverRootPath || "",
143
137
  );
144
138
  }
145
139
 
@@ -176,20 +170,6 @@ export class Project {
176
170
  return connection;
177
171
  }
178
172
 
179
- // Returns a connection with full connection details for doing schema inspection
180
- // Don't send this to the client as it contains sensitive information
181
- public getInternalConnection(connectionName: string): InternalConnection {
182
- const connection = this.internalConnections.find(
183
- (connection) => connection.name === connectionName,
184
- );
185
- if (!connection) {
186
- throw new ConnectionNotFoundError(
187
- `Connection ${connectionName} not found`,
188
- );
189
- }
190
- return connection;
191
- }
192
-
193
173
  public getMalloyConnection(connectionName: string): BaseConnection {
194
174
  const connection = this.malloyConnections.get(connectionName);
195
175
  if (!connection) {
@@ -290,6 +270,7 @@ export class Project {
290
270
  packageName,
291
271
  path.join(this.projectPath, packageName),
292
272
  this.malloyConnections,
273
+ this.serverRootPath,
293
274
  );
294
275
  this.packages.set(packageName, _package);
295
276
 
@@ -334,6 +315,7 @@ export class Project {
334
315
  packageName,
335
316
  packagePath,
336
317
  this.malloyConnections,
318
+ this.serverRootPath,
337
319
  ),
338
320
  );
339
321
  } catch (error) {
@@ -15,19 +15,6 @@ const serverRootPath = path.join(
15
15
  "pathways-worker-publisher-project-store-test",
16
16
  );
17
17
  const projectName = "organizationName-projectName";
18
- const testConnections: Connection[] = [
19
- {
20
- name: "testConnection",
21
- type: "postgres",
22
- postgresConnection: {
23
- host: "host",
24
- port: 1234,
25
- databaseName: "databaseName",
26
- userName: "userName",
27
- password: "password",
28
- },
29
- },
30
- ];
31
18
 
32
19
  let sandbox: sinon.SinonSandbox;
33
20
 
@@ -72,13 +59,6 @@ describe("ProjectStore Service", () => {
72
59
  const projectPath = path.join(serverRootPath, projectName);
73
60
  mkdirSync(projectPath, { recursive: true });
74
61
 
75
- // Create connections file
76
- const connectionsPath = path.join(
77
- projectPath,
78
- "publisher.connections.json",
79
- );
80
- writeFileSync(connectionsPath, JSON.stringify(testConnections));
81
-
82
62
  // Create publisher config
83
63
  const publisherConfigPath = path.join(
84
64
  serverRootPath,
@@ -87,6 +67,7 @@ describe("ProjectStore Service", () => {
87
67
  writeFileSync(
88
68
  publisherConfigPath,
89
69
  JSON.stringify({
70
+ frozenConfig: false,
90
71
  projects: [
91
72
  {
92
73
  name: projectName,
@@ -96,6 +77,12 @@ describe("ProjectStore Service", () => {
96
77
  location: projectPath,
97
78
  },
98
79
  ],
80
+ connections: [
81
+ {
82
+ name: "testConnection",
83
+ type: "postgres",
84
+ },
85
+ ],
99
86
  },
100
87
  ],
101
88
  }),
@@ -117,16 +104,6 @@ describe("ProjectStore Service", () => {
117
104
  mkdirSync(projectPath1, { recursive: true });
118
105
  mkdirSync(projectPath2, { recursive: true });
119
106
 
120
- // Create connections files
121
- writeFileSync(
122
- path.join(projectPath1, "publisher.connections.json"),
123
- JSON.stringify(testConnections),
124
- );
125
- writeFileSync(
126
- path.join(projectPath2, "publisher.connections.json"),
127
- JSON.stringify(testConnections),
128
- );
129
-
130
107
  // Create publisher config
131
108
  const publisherConfigPath = path.join(
132
109
  serverRootPath,
@@ -135,6 +112,7 @@ describe("ProjectStore Service", () => {
135
112
  writeFileSync(
136
113
  publisherConfigPath,
137
114
  JSON.stringify({
115
+ frozenConfig: false,
138
116
  projects: [
139
117
  {
140
118
  name: projectName1,
@@ -144,6 +122,12 @@ describe("ProjectStore Service", () => {
144
122
  location: projectPath1,
145
123
  },
146
124
  ],
125
+ connections: [
126
+ {
127
+ name: "testConnection",
128
+ type: "postgres",
129
+ },
130
+ ],
147
131
  },
148
132
  {
149
133
  name: projectName2,
@@ -153,6 +137,13 @@ describe("ProjectStore Service", () => {
153
137
  location: projectPath2,
154
138
  },
155
139
  ],
140
+ connections: [
141
+ {
142
+ name: "testConnection2",
143
+ type: "bigquery",
144
+ bigqueryConnection: {},
145
+ },
146
+ ],
156
147
  },
157
148
  ],
158
149
  }),
@@ -174,14 +165,6 @@ describe("ProjectStore Service", () => {
174
165
  // Create a project directory
175
166
  const projectPath = path.join(serverRootPath, projectName);
176
167
  mkdirSync(projectPath, { recursive: true });
177
-
178
- // Create connections file
179
- const connectionsPath = path.join(
180
- projectPath,
181
- "publisher.connections.json",
182
- );
183
- writeFileSync(connectionsPath, JSON.stringify(testConnections));
184
-
185
168
  // Create publisher config
186
169
  const publisherConfigPath = path.join(
187
170
  serverRootPath,
@@ -221,13 +204,6 @@ describe("ProjectStore Service", () => {
221
204
  const projectPath = path.join(serverRootPath, projectName);
222
205
  mkdirSync(projectPath, { recursive: true });
223
206
 
224
- // Create connections file
225
- const connectionsPath = path.join(
226
- projectPath,
227
- "publisher.connections.json",
228
- );
229
- writeFileSync(connectionsPath, JSON.stringify(testConnections));
230
-
231
207
  // Create publisher config
232
208
  const publisherConfigPath = path.join(
233
209
  serverRootPath,
@@ -310,14 +286,6 @@ describe("ProjectStore Service", () => {
310
286
  const projectPath = path.join(serverRootPath, projectName);
311
287
  mkdirSync(projectPath, { recursive: true });
312
288
 
313
- // Create connections file
314
- const connectionsPath = path.join(
315
- projectPath,
316
- "publisher.connections.json",
317
- );
318
- writeFileSync(connectionsPath, JSON.stringify(testConnections));
319
-
320
- // Create publisher config
321
289
  const publisherConfigPath = path.join(
322
290
  serverRootPath,
323
291
  "publisher.config.json",
@@ -325,6 +293,7 @@ describe("ProjectStore Service", () => {
325
293
  writeFileSync(
326
294
  publisherConfigPath,
327
295
  JSON.stringify({
296
+ frozenConfig: false,
328
297
  projects: [
329
298
  {
330
299
  name: projectName,
@@ -334,11 +303,19 @@ describe("ProjectStore Service", () => {
334
303
  location: projectPath,
335
304
  },
336
305
  ],
306
+ connections: [
307
+ {
308
+ name: "testConnection",
309
+ type: "postgres",
310
+ },
311
+ ],
337
312
  },
338
313
  ],
339
314
  }),
340
315
  );
341
316
 
317
+ await projectStore.finishedInitialization;
318
+
342
319
  // Test concurrent access to the same project
343
320
  const promises = Array.from({ length: 5 }, () =>
344
321
  projectStore.getProject(projectName),
@@ -6,13 +6,13 @@ import * as path from "path";
6
6
  import simpleGit from "simple-git";
7
7
  import { Writable } from "stream";
8
8
  import { components } from "../api";
9
- import { getPublisherConfig, isPublisherConfigFrozen } from "../config";
10
9
  import {
11
- API_PREFIX,
12
- CONNECTIONS_MANIFEST_NAME,
13
- PUBLISHER_CONFIG_NAME,
14
- publisherPath,
15
- } from "../constants";
10
+ getProcessedPublisherConfig,
11
+ isPublisherConfigFrozen,
12
+ ProcessedPublisherConfig,
13
+ ProcessedProject,
14
+ } from "../config";
15
+ import { API_PREFIX, PUBLISHER_CONFIG_NAME, publisherPath } from "../constants";
16
16
  import {
17
17
  FrozenConfigError,
18
18
  PackageNotFoundError,
@@ -57,6 +57,7 @@ export class ProjectStore {
57
57
  {
58
58
  name: project.name,
59
59
  resource: `${API_PREFIX}/projects/${project.name}`,
60
+ connections: project.connections,
60
61
  },
61
62
  true,
62
63
  );
@@ -154,6 +155,7 @@ export class ProjectStore {
154
155
  project = await this.addProject({
155
156
  name: projectName,
156
157
  resource: `${API_PREFIX}/projects/${projectName}`,
158
+ connections: projectConfig?.connections || [],
157
159
  });
158
160
  }
159
161
  return project;
@@ -213,6 +215,7 @@ export class ProjectStore {
213
215
  projectName,
214
216
  absoluteProjectPath,
215
217
  project.connections || [],
218
+ this.serverRootPath,
216
219
  );
217
220
  this.projects.set(projectName, newProject);
218
221
  return newProject;
@@ -266,29 +269,25 @@ export class ProjectStore {
266
269
  return project;
267
270
  }
268
271
 
269
- public static async reloadProjectManifest(serverRootPath: string) {
272
+ public static async reloadProjectManifest(
273
+ serverRootPath: string,
274
+ ): Promise<ProcessedPublisherConfig> {
270
275
  try {
271
- return getPublisherConfig(serverRootPath);
276
+ return getProcessedPublisherConfig(serverRootPath);
272
277
  } catch (error) {
273
278
  if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
274
279
  logger.error(
275
280
  `Error reading ${PUBLISHER_CONFIG_NAME}. Generating from directory`,
276
281
  { error },
277
282
  );
278
- return { projects: [] };
283
+ return { frozenConfig: false, projects: [] };
279
284
  } else {
280
285
  // If publisher.config.json is missing, generate the manifest from directories
281
286
  try {
282
287
  const entries = await fs.promises.readdir(serverRootPath, {
283
288
  withFileTypes: true,
284
289
  });
285
- const projects: {
286
- name: string;
287
- packages: {
288
- name: string;
289
- location: string;
290
- }[];
291
- }[] = [];
290
+ const projects: ProcessedProject[] = [];
292
291
  for (const entry of entries) {
293
292
  if (entry.isDirectory()) {
294
293
  projects.push({
@@ -296,18 +295,19 @@ export class ProjectStore {
296
295
  packages: [
297
296
  {
298
297
  name: entry.name,
299
- location: entry.name,
298
+ location: `./${entry.name}` as const,
300
299
  },
301
300
  ],
301
+ connections: [],
302
302
  });
303
303
  }
304
304
  }
305
- return { projects };
305
+ return { frozenConfig: false, projects };
306
306
  } catch (lsError) {
307
307
  logger.error(`Error listing directories in ${serverRootPath}`, {
308
308
  error: lsError,
309
309
  });
310
- return { projects: [] };
310
+ return { frozenConfig: false, projects: [] };
311
311
  }
312
312
  }
313
313
  }
@@ -429,52 +429,27 @@ export class ProjectStore {
429
429
  );
430
430
  }
431
431
  }
432
-
433
- const connectionsFileInDownload = path.join(
434
- tempDownloadPath,
435
- CONNECTIONS_MANIFEST_NAME,
436
- );
437
- const connectionsFileInServerRoot = path.join(
438
- this.serverRootPath,
439
- CONNECTIONS_MANIFEST_NAME,
440
- );
441
- const connectionsFileInProject = path.join(
442
- absoluteTargetPath,
443
- CONNECTIONS_MANIFEST_NAME,
432
+ } catch (error) {
433
+ logger.error(`Failed to download or mount location "${location}"`, {
434
+ error,
435
+ });
436
+ throw new PackageNotFoundError(
437
+ `Failed to download or mount location: ${location}`,
444
438
  );
445
-
446
- const sources = [
447
- {
448
- path: connectionsFileInDownload,
449
- description: "projectLocation",
450
- },
451
- { path: connectionsFileInServerRoot, description: "serverRoot" },
452
- ];
453
-
454
- for (const source of sources) {
455
- try {
456
- await fs.promises.access(source.path, fs.constants.F_OK);
457
- await fs.promises.cp(source.path, connectionsFileInProject);
458
- logger.info(
459
- `Copied ${CONNECTIONS_MANIFEST_NAME} from ${source.description} to project directory`,
460
- );
461
- break;
462
- } catch (_error) {
463
- if (source.description === "projectLocation") {
464
- logger.info(
465
- `No ${CONNECTIONS_MANIFEST_NAME} found in downloaded location, checking in server root for ${CONNECTIONS_MANIFEST_NAME}`,
466
- );
467
- } else {
468
- logger.info(`No ${CONNECTIONS_MANIFEST_NAME} found`);
469
- }
470
- }
471
- }
472
- } finally {
439
+ }
440
+ try {
473
441
  // Clean up temporary download directory
474
442
  await fs.promises.rm(tempDownloadPath, {
475
443
  recursive: true,
476
444
  force: true,
477
445
  });
446
+ } catch (error) {
447
+ logger.warn(
448
+ `Failed to clean up temporary download directory "${tempDownloadPath}"`,
449
+ {
450
+ error,
451
+ },
452
+ );
478
453
  }
479
454
  }
480
455
 
@@ -716,23 +691,80 @@ export class ProjectStore {
716
691
  }
717
692
 
718
693
  async downloadGitHubDirectory(githubUrl: string, absoluteDirPath: string) {
719
- await fs.promises.rm(absoluteDirPath, { recursive: true, force: true });
694
+ // First we'll clone the repo without the additional path
695
+ // 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) {
700
+ throw new Error(`Invalid GitHub URL: ${githubUrl}`);
701
+ }
702
+ const { owner, repoName, packagePath } = match.groups!;
703
+ const cleanPackagePath = packagePath.replace("/tree/main", "");
704
+ // We'll make sure whatever was in absoluteDirPath is removed,
705
+ // so we have a nice a clean directory where we can clone the repo
706
+ await fs.promises.rm(absoluteDirPath, {
707
+ recursive: true,
708
+ force: true,
709
+ });
720
710
  await fs.promises.mkdir(absoluteDirPath, { recursive: true });
721
-
711
+ const repoUrl = `https://github.com/${owner}/${repoName}`;
712
+ // We'll clone the repo into absoluteDirPath
722
713
  await new Promise<void>((resolve, reject) => {
723
- simpleGit().clone(githubUrl, absoluteDirPath, {}, (err) => {
714
+ simpleGit().clone(repoUrl, absoluteDirPath, {}, (err) => {
724
715
  if (err) {
725
716
  console.error(err);
726
- logger.error(
727
- `Failed to clone GitHub repository "${githubUrl}"`,
728
- {
729
- error: err,
730
- },
731
- );
717
+ logger.error(`Failed to clone GitHub repository "${repoUrl}"`, {
718
+ error: err,
719
+ });
732
720
  reject(err);
733
721
  }
734
722
  resolve();
735
723
  });
736
724
  });
725
+ // After cloning, we'll replace all contents of absoluteDirPath with the contents of absoluteDirPath/cleanPackagePath
726
+ // E.g. we're moving /var/publisher/asd123/imdb/publisher.json into /var/publisher/asd123/publisher.json
727
+
728
+ // Remove all contents of absoluteDirPath (/var/publisher/asd123)
729
+ // except for the cleanPackagePath directory (/var/publisher/asd123/imdb)
730
+ const packageFullPath = path.join(absoluteDirPath, cleanPackagePath);
731
+
732
+ // Check if the cleanPackagePath (/var/publisher/asd123/imdb) exists
733
+ const packageExists = await fs.promises
734
+ .access(packageFullPath)
735
+ .then(() => true)
736
+ .catch(() => false);
737
+
738
+ if (!packageExists) {
739
+ throw new Error(
740
+ `Package path "${cleanPackagePath}" does not exist in the cloned repository.`,
741
+ );
742
+ }
743
+
744
+ // Remove everything in absoluteDirPath (/var/publisher/asd123)
745
+ const dirContents = await fs.promises.readdir(absoluteDirPath);
746
+ for (const entry of dirContents) {
747
+ // Don't remove the cleanPackagePath directory itself (/var/publisher/asd123/imdb)
748
+ if (entry !== cleanPackagePath.replace(/^\/+/, "").split("/")[0]) {
749
+ await fs.promises.rm(path.join(absoluteDirPath, entry), {
750
+ recursive: true,
751
+ force: true,
752
+ });
753
+ }
754
+ }
755
+
756
+ // Now, move the contents of packageFullPath (/var/publisher/asd123/imdb) up to absoluteDirPath (/var/publisher/asd123)
757
+ const packageContents = await fs.promises.readdir(packageFullPath);
758
+ for (const entry of packageContents) {
759
+ await fs.promises.rename(
760
+ path.join(packageFullPath, entry),
761
+ path.join(absoluteDirPath, entry),
762
+ );
763
+ }
764
+
765
+ // Remove the now-empty cleanPackagePath directory (/var/publisher/asd123/imdb)
766
+ await fs.promises.rm(packageFullPath, { recursive: true, force: true });
767
+
768
+ // https://github.com/credibledata/malloy-samples/imdb/publisher.json -> ${absoluteDirPath}/publisher.json
737
769
  }
738
770
  }