@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
package/eslint.config.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { fixupConfigRules, fixupPluginRules } from "@eslint/compat";
2
+ import { FlatCompat } from "@eslint/eslintrc";
3
+ import js from "@eslint/js";
2
4
  import typescriptEslint from "@typescript-eslint/eslint-plugin";
3
- import globals from "globals";
4
5
  import tsParser from "@typescript-eslint/parser";
6
+ import globals from "globals";
5
7
  import path from "node:path";
6
8
  import { fileURLToPath } from "node:url";
7
- import js from "@eslint/js";
8
- import { FlatCompat } from "@eslint/eslintrc";
9
9
 
10
10
  const __filename = fileURLToPath(import.meta.url);
11
11
  const __dirname = path.dirname(__filename);
@@ -16,6 +16,19 @@ const compat = new FlatCompat({
16
16
  });
17
17
 
18
18
  export default [
19
+ {
20
+ ignores: [
21
+ "**/node_modules/**",
22
+ "**/dist/**",
23
+ "**/build/**",
24
+ "**/.DS_Store",
25
+ "**/__pycache__/**",
26
+ "**/*.py[cod]",
27
+ "**/*.egg-info/**",
28
+ "**/.env",
29
+ "**/*.log",
30
+ ],
31
+ },
19
32
  ...fixupConfigRules(
20
33
  compat.extends(
21
34
  "eslint:recommended",
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.106",
4
+ "version": "0.0.108",
5
5
  "main": "dist/server.js",
6
6
  "bin": {
7
7
  "malloy-publisher": "dist/server.js"
@@ -23,15 +23,15 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@google-cloud/storage": "^7.16.0",
26
- "@malloydata/db-bigquery": "^0.0.307",
27
- "@malloydata/db-duckdb": "^0.0.307",
28
- "@malloydata/db-mysql": "^0.0.307",
29
- "@malloydata/db-postgres": "^0.0.307",
30
- "@malloydata/db-snowflake": "^0.0.307",
31
- "@malloydata/db-trino": "^0.0.307",
32
- "@malloydata/malloy": "^0.0.307",
33
- "@malloydata/malloy-sql": "^0.0.307",
34
- "@malloydata/render": "^0.0.307",
26
+ "@malloydata/db-bigquery": "^0.0.310",
27
+ "@malloydata/db-duckdb": "^0.0.310",
28
+ "@malloydata/db-mysql": "^0.0.310",
29
+ "@malloydata/db-postgres": "^0.0.310",
30
+ "@malloydata/db-snowflake": "^0.0.310",
31
+ "@malloydata/db-trino": "^0.0.310",
32
+ "@malloydata/malloy": "^0.0.310",
33
+ "@malloydata/malloy-sql": "^0.0.310",
34
+ "@malloydata/render": "^0.0.310",
35
35
  "@modelcontextprotocol/sdk": "^1.13.2",
36
36
  "@opentelemetry/api": "^1.9.0",
37
37
  "@opentelemetry/auto-instrumentations-node": "^0.57.0",
@@ -1,26 +1,33 @@
1
1
  {
2
- "frozenConfig": false,
3
- "projects": [
4
- {
5
- "name": "malloy-samples",
6
- "packages": [
7
- {
8
- "name": "ecommerce",
9
- "location": "https://github.com/credibledata/malloy-samples"
10
- },
11
- {
12
- "name": "imdb",
13
- "location": "https://github.com/credibledata/malloy-samples"
14
- },
15
- {
16
- "name": "faa",
17
- "location": "https://github.com/credibledata/malloy-samples"
18
- },
19
- {
20
- "name": "bigquery-hackernews",
21
- "location": "https://github.com/credibledata/malloy-samples"
22
- }
23
- ]
24
- }
25
- ]
26
- }
2
+ "frozenConfig": false,
3
+ "projects": [
4
+ {
5
+ "name": "malloy-samples",
6
+ "packages": [
7
+ {
8
+ "name": "ecommerce",
9
+ "location": "https://github.com/credibledata/malloy-samples/tree/main/ecommerce"
10
+ },
11
+ {
12
+ "name": "imdb",
13
+ "location": "https://github.com/credibledata/malloy-samples/tree/main/imdb"
14
+ },
15
+ {
16
+ "name": "faa",
17
+ "location": "https://github.com/credibledata/malloy-samples/tree/main/faa"
18
+ },
19
+ {
20
+ "name": "bigquery-hackernews",
21
+ "location": "https://github.com/credibledata/malloy-samples/tree/main/bigquery-hackernews"
22
+ }
23
+ ],
24
+ "connections": [
25
+ {
26
+ "name": "bigquery",
27
+ "type": "bigquery",
28
+ "bigqueryConnection": {}
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ }
package/src/config.ts CHANGED
@@ -1,18 +1,26 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import { PUBLISHER_CONFIG_NAME } from "./constants";
3
+ import { PUBLISHER_CONFIG_NAME, API_PREFIX } from "./constants";
4
+ import { components } from "./api";
4
5
 
5
6
  type FilesystemPath = `./${string}` | `../${string}` | `/${string}`;
6
7
  type GcsPath = `gs://${string}`;
8
+ type ApiConnection = components["schemas"]["Connection"];
7
9
 
8
10
  export type Package = {
9
11
  name: string;
10
12
  location: FilesystemPath | GcsPath;
11
13
  };
12
14
 
15
+ export type Connection = {
16
+ name: string;
17
+ type: string;
18
+ };
19
+
13
20
  export type Project = {
14
21
  name: string;
15
22
  packages: Package[];
23
+ connections?: Connection[];
16
24
  };
17
25
 
18
26
  export type PublisherConfig = {
@@ -20,6 +28,17 @@ export type PublisherConfig = {
20
28
  projects: Project[];
21
29
  };
22
30
 
31
+ export type ProcessedProject = {
32
+ name: string;
33
+ packages: Package[];
34
+ connections: ApiConnection[];
35
+ };
36
+
37
+ export type ProcessedPublisherConfig = {
38
+ frozenConfig: boolean;
39
+ projects: ProcessedProject[];
40
+ };
41
+
23
42
  export const getPublisherConfig = (serverRoot: string): PublisherConfig => {
24
43
  const publisherConfigPath = path.join(serverRoot, PUBLISHER_CONFIG_NAME);
25
44
  if (!fs.existsSync(publisherConfigPath)) {
@@ -47,3 +66,44 @@ export const isPublisherConfigFrozen = (serverRoot: string) => {
47
66
  const publisherConfig = getPublisherConfig(serverRoot);
48
67
  return Boolean(publisherConfig.frozenConfig);
49
68
  };
69
+
70
+ export const getConnectionsFromPublisherConfig = (
71
+ serverRoot: string,
72
+ projectName: string,
73
+ ): Connection[] => {
74
+ const publisherConfig = getPublisherConfig(serverRoot);
75
+ const project = publisherConfig.projects.find((p) => p.name === projectName);
76
+ return project?.connections || [];
77
+ };
78
+
79
+ export const convertConnectionsToApiConnections = (
80
+ connections: Connection[],
81
+ ): ApiConnection[] => {
82
+ return connections.map((conn) => ({
83
+ ...conn,
84
+ name: conn.name,
85
+ type: conn.type as
86
+ | "postgres"
87
+ | "bigquery"
88
+ | "snowflake"
89
+ | "trino"
90
+ | "mysql",
91
+ resource: `${API_PREFIX}/connections/${conn.name}`,
92
+ }));
93
+ };
94
+
95
+ export const getProcessedPublisherConfig = (
96
+ serverRoot: string,
97
+ ): ProcessedPublisherConfig => {
98
+ const rawConfig = getPublisherConfig(serverRoot);
99
+ return {
100
+ frozenConfig: rawConfig.frozenConfig,
101
+ projects: rawConfig.projects.map((project) => ({
102
+ name: project.name,
103
+ packages: project.packages,
104
+ connections: convertConnectionsToApiConnections(
105
+ project.connections || [],
106
+ ),
107
+ })),
108
+ };
109
+ };
package/src/constants.ts CHANGED
@@ -5,7 +5,6 @@ export const API_PREFIX = "/api/v0";
5
5
  export const README_NAME = "README.md";
6
6
  export const PUBLISHER_CONFIG_NAME = "publisher.config.json";
7
7
  export const PACKAGE_MANIFEST_NAME = "publisher.json";
8
- export const CONNECTIONS_MANIFEST_NAME = "publisher.connections.json";
9
8
  export const MODEL_FILE_SUFFIX = ".malloy";
10
9
  export const NOTEBOOK_FILE_SUFFIX = ".malloynb";
11
10
  export const ROW_LIMIT = 1000;
@@ -46,7 +46,7 @@ export class ConnectionController {
46
46
  connectionName: string,
47
47
  ): Promise<ApiSchemaName[]> {
48
48
  const project = await this.projectStore.getProject(projectName, false);
49
- const connection = project.getInternalConnection(connectionName);
49
+ const connection = project.getApiConnection(connectionName);
50
50
  return getSchemasForConnection(connection);
51
51
  }
52
52
 
@@ -57,7 +57,7 @@ export class ConnectionController {
57
57
  schemaName: string,
58
58
  ): Promise<string[]> {
59
59
  const project = await this.projectStore.getProject(projectName, false);
60
- const connection = project.getInternalConnection(connectionName);
60
+ const connection = project.getApiConnection(connectionName);
61
61
  return getTablesForSchema(connection, schemaName);
62
62
  }
63
63
 
package/src/server.ts CHANGED
@@ -3,7 +3,6 @@ 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";
7
6
  import { AddressInfo } from "net";
8
7
  import * as path from "path";
9
8
  import { ConnectionController } from "./controller/connection.controller";
@@ -81,7 +80,6 @@ const isDevelopment = process.env["NODE_ENV"] === "development";
81
80
 
82
81
  const app = express();
83
82
  app.use(loggerMiddleware);
84
- app.use(cors());
85
83
 
86
84
  const projectStore = new ProjectStore(SERVER_ROOT);
87
85
  const watchModeController = new WatchModeController(projectStore);
@@ -186,16 +184,6 @@ if (!isDevelopment) {
186
184
  // In development mode, proxy requests to React dev server
187
185
  // Handle API routes first
188
186
  app.use(`${API_PREFIX}`, loggerMiddleware);
189
-
190
- // Proxy everything else to Vite
191
- app.use(
192
- createProxyMiddleware({
193
- target: "http://localhost:5173",
194
- changeOrigin: true,
195
- ws: true,
196
- pathFilter: (path) => !path.startsWith("/api/"),
197
- }),
198
- );
199
187
  }
200
188
 
201
189
  const setVersionIdError = (res: express.Response) => {
@@ -205,7 +193,12 @@ const setVersionIdError = (res: express.Response) => {
205
193
  res.status(status).json(json);
206
194
  };
207
195
 
208
- app.use(cors());
196
+ app.use(
197
+ cors({
198
+ origin: "http://localhost:5173",
199
+ credentials: true,
200
+ }),
201
+ );
209
202
  app.use(bodyParser.json());
210
203
 
211
204
  app.get(`${API_PREFIX}/status`, async (_req, res) => {
@@ -378,6 +371,9 @@ app.get(
378
371
  },
379
372
  );
380
373
 
374
+ /**
375
+ * @deprecated Use /projects/:projectName/connections/:connectionName/sqlSource POST method instead
376
+ */
381
377
  app.get(
382
378
  `${API_PREFIX}/projects/:projectName/connections/:connectionName/sqlSource`,
383
379
  async (req, res) => {
@@ -397,6 +393,25 @@ app.get(
397
393
  },
398
394
  );
399
395
 
396
+ app.post(
397
+ `${API_PREFIX}/projects/:projectName/connections/:connectionName/sqlSource`,
398
+ async (req, res) => {
399
+ try {
400
+ res.status(200).json(
401
+ await connectionController.getConnectionSqlSource(
402
+ req.params.projectName,
403
+ req.params.connectionName,
404
+ req.body.sqlStatement as string,
405
+ ),
406
+ );
407
+ } catch (error) {
408
+ logger.error(error);
409
+ const { json, status } = internalErrorToHttpError(error as Error);
410
+ res.status(status).json(json);
411
+ }
412
+ },
413
+ );
414
+
400
415
  app.get(
401
416
  `${API_PREFIX}/projects/:projectName/connections/:connectionName/tableSource`,
402
417
  async (req, res) => {
@@ -417,6 +432,9 @@ app.get(
417
432
  },
418
433
  );
419
434
 
435
+ /**
436
+ * @deprecated Use /projects/:projectName/connections/:connectionName/queryData POST method instead
437
+ */
420
438
  app.get(
421
439
  `${API_PREFIX}/projects/:projectName/connections/:connectionName/queryData`,
422
440
  async (req, res) => {
@@ -437,6 +455,29 @@ app.get(
437
455
  },
438
456
  );
439
457
 
458
+ app.post(
459
+ `${API_PREFIX}/projects/:projectName/connections/:connectionName/queryData`,
460
+ async (req, res) => {
461
+ try {
462
+ res.status(200).json(
463
+ await connectionController.getConnectionQueryData(
464
+ req.params.projectName,
465
+ req.params.connectionName,
466
+ req.body.sqlStatement as string,
467
+ req.query.options as string,
468
+ ),
469
+ );
470
+ } catch (error) {
471
+ logger.error(error);
472
+ const { json, status } = internalErrorToHttpError(error as Error);
473
+ res.status(status).json(json);
474
+ }
475
+ },
476
+ );
477
+
478
+ /**
479
+ * @deprecated Use /projects/:projectName/connections/:connectionName/temporaryTable POST method instead
480
+ */
440
481
  app.get(
441
482
  `${API_PREFIX}/projects/:projectName/connections/:connectionName/temporaryTable`,
442
483
  async (req, res) => {
@@ -456,6 +497,25 @@ app.get(
456
497
  },
457
498
  );
458
499
 
500
+ app.post(
501
+ `${API_PREFIX}/projects/:projectName/connections/:connectionName/temporaryTable`,
502
+ async (req, res) => {
503
+ try {
504
+ res.status(200).json(
505
+ await connectionController.getConnectionTemporaryTable(
506
+ req.params.projectName,
507
+ req.params.connectionName,
508
+ req.body.sqlStatement as string,
509
+ ),
510
+ );
511
+ } catch (error) {
512
+ logger.error(error);
513
+ const { json, status } = internalErrorToHttpError(error as Error);
514
+ res.status(status).json(json);
515
+ }
516
+ },
517
+ );
518
+
459
519
  app.get(`${API_PREFIX}/projects/:projectName/packages`, async (req, res) => {
460
520
  if (req.query.versionId) {
461
521
  setVersionIdError(res);
@@ -11,7 +11,11 @@ import fs from "fs/promises";
11
11
  import path from "path";
12
12
  import { v4 as uuidv4 } from "uuid";
13
13
  import { components } from "../api";
14
- import { CONNECTIONS_MANIFEST_NAME, TEMP_DIR_PATH } from "../constants";
14
+ import { TEMP_DIR_PATH } from "../constants";
15
+ import {
16
+ convertConnectionsToApiConnections,
17
+ getConnectionsFromPublisherConfig,
18
+ } from "../config";
15
19
  import { AxiosError } from "axios";
16
20
 
17
21
  type ApiConnection = components["schemas"]["Connection"];
@@ -29,32 +33,38 @@ export type InternalConnection = ApiConnection & {
29
33
  };
30
34
 
31
35
  export async function readConnectionConfig(
32
- basePath: string,
33
- ): Promise<InternalConnection[]> {
34
- const fullPath = path.join(basePath, CONNECTIONS_MANIFEST_NAME);
35
-
36
- try {
37
- await fs.stat(fullPath);
38
- } catch {
39
- // If there's no connection manifest, it's no problem. Just return an
40
- // empty array.
41
- return new Array<InternalConnection>();
36
+ _basePath: string,
37
+ projectName?: string,
38
+ serverRootPath?: string,
39
+ ): Promise<ApiConnection[]> {
40
+ // If no project name is provided, return empty array for backward compatibility
41
+ if (!projectName || !serverRootPath) {
42
+ return new Array<ApiConnection>();
42
43
  }
43
44
 
44
- const connectionFileContents = await fs.readFile(fullPath);
45
- // TODO: Validate connection manifest. Define manifest type in public API.
46
- return JSON.parse(connectionFileContents.toString()) as ApiConnection[];
45
+ // Get connections from publisher config
46
+ const connections = getConnectionsFromPublisherConfig(
47
+ serverRootPath,
48
+ projectName,
49
+ );
50
+ return convertConnectionsToApiConnections(connections);
47
51
  }
48
52
 
49
53
  export async function createConnections(
50
54
  basePath: string,
51
55
  defaultConnections: ApiConnection[] = [],
56
+ projectName?: string,
57
+ serverRootPath?: string,
52
58
  ): Promise<{
53
59
  malloyConnections: Map<string, BaseConnection>;
54
60
  apiConnections: InternalConnection[];
55
61
  }> {
56
62
  const connectionMap = new Map<string, BaseConnection>();
57
- const connectionConfig = await readConnectionConfig(basePath);
63
+ const connectionConfig = await readConnectionConfig(
64
+ basePath,
65
+ projectName,
66
+ serverRootPath,
67
+ );
58
68
 
59
69
  const allConnections = [...defaultConnections, ...connectionConfig];
60
70
 
@@ -4,7 +4,7 @@ import { join } from "path";
4
4
  import sinon from "sinon";
5
5
  import { PackageNotFoundError } from "../errors";
6
6
  import { readConnectionConfig } from "./connection";
7
- import { ApiConnection, Model } from "./model";
7
+ import { Model } from "./model";
8
8
  import { Package } from "./package";
9
9
  import { Scheduler } from "./scheduler";
10
10
  import { Stats } from "fs";
@@ -12,11 +12,6 @@ import { Stats } from "fs";
12
12
  // Minimal partial types for mocking
13
13
  type PartialScheduler = Pick<Scheduler, "list">;
14
14
 
15
- const connectionMocks: ApiConnection[] = [
16
- { name: "conn1", type: "postgres", postgresConnection: {} },
17
- { name: "conn2", type: "bigquery", bigqueryConnection: {} },
18
- ];
19
-
20
15
  describe("service/package", () => {
21
16
  const testPackageDirectory = "testPackage";
22
17
 
@@ -30,11 +25,6 @@ describe("service/package", () => {
30
25
  join(testPackageDirectory, "database.csv"),
31
26
  parquetBuffer,
32
27
  );
33
- const content = JSON.stringify(connectionMocks);
34
- await fs.writeFile(
35
- join(testPackageDirectory, "publisher.connections.json"),
36
- content,
37
- );
38
28
  const publisherContent = JSON.stringify({ description: "Test package" });
39
29
  await fs.writeFile(
40
30
  join(testPackageDirectory, "publisher.json"),
@@ -85,6 +75,7 @@ describe("service/package", () => {
85
75
  "testPackage",
86
76
  testPackageDirectory,
87
77
  new Map(),
78
+ "/server/root",
88
79
  ),
89
80
  ).rejects.toThrowError(
90
81
  new PackageNotFoundError(
@@ -124,6 +115,7 @@ describe("service/package", () => {
124
115
  "testPackage",
125
116
  testPackageDirectory,
126
117
  new Map(),
118
+ "/server/root",
127
119
  );
128
120
 
129
121
  expect(packageInstance).toBeInstanceOf(Package);
@@ -232,23 +224,76 @@ describe("service/package", () => {
232
224
  });
233
225
 
234
226
  describe("readConnectionConfig", () => {
235
- it("should return an empty array if the connection manifest does not exist", async () => {
236
- await fs.rm(
237
- join(testPackageDirectory, "publisher.connections.json"),
238
- );
239
-
240
- sinon.stub(fs, "stat").rejects(new Error("File not found"));
241
-
227
+ it("should return an empty array if no project name or server root path is provided", async () => {
242
228
  const config = await readConnectionConfig(testPackageDirectory);
243
229
  expect(Array.isArray(config)).toBe(true);
244
230
  expect(config).toHaveLength(0);
245
231
  });
246
232
 
247
- it("should return the parsed connection config if it exists", async () => {
248
- sinon.stub(fs, "stat").resolves();
249
- const config = await readConnectionConfig(testPackageDirectory);
233
+ it("should return an empty array if project name or server root path is missing", async () => {
234
+ const config1 = await readConnectionConfig(
235
+ testPackageDirectory,
236
+ "testProject",
237
+ );
238
+ expect(Array.isArray(config1)).toBe(true);
239
+ expect(config1).toHaveLength(0);
240
+
241
+ const config2 = await readConnectionConfig(
242
+ testPackageDirectory,
243
+ undefined,
244
+ "/server/root",
245
+ );
246
+ expect(Array.isArray(config2)).toBe(true);
247
+ expect(config2).toHaveLength(0);
248
+ });
249
+
250
+ it("should return connections from publisher config when project name and server root are provided", async () => {
251
+ const tempServerRoot = "/tmp/test-server-root";
252
+ const tempConfigPath = join(
253
+ tempServerRoot,
254
+ "publisher.config.json",
255
+ );
256
+
257
+ // Create temp directory and config file
258
+ await fs.mkdir(tempServerRoot, { recursive: true });
259
+ await fs.writeFile(
260
+ tempConfigPath,
261
+ JSON.stringify({
262
+ frozenConfig: false,
263
+ projects: [
264
+ {
265
+ name: "testProject",
266
+ packages: [],
267
+ connections: [
268
+ { name: "test-conn", type: "postgres" },
269
+ { name: "test-conn2", type: "bigquery" },
270
+ ],
271
+ },
272
+ ],
273
+ }),
274
+ );
275
+
276
+ const config = await readConnectionConfig(
277
+ testPackageDirectory,
278
+ "testProject",
279
+ tempServerRoot,
280
+ );
281
+
282
+ expect(Array.isArray(config)).toBe(true);
283
+ expect(config).toHaveLength(2);
284
+ expect(config[0]).toMatchObject({
285
+ name: "test-conn",
286
+ type: "postgres",
287
+ resource: "/api/v0/connections/test-conn",
288
+ });
289
+ expect(config[1]).toMatchObject({
290
+ name: "test-conn2",
291
+ type: "bigquery",
292
+ resource: "/api/v0/connections/test-conn2",
293
+ });
250
294
 
251
- expect(config).toEqual(connectionMocks);
295
+ // Clean up
296
+ await fs.rm(tempServerRoot, { recursive: true, force: true });
252
297
  });
253
298
  });
254
299
  });
@@ -72,6 +72,7 @@ export class Package {
72
72
  packageName: string,
73
73
  packagePath: string,
74
74
  projectConnections: Map<string, Connection>,
75
+ serverRootPath: string,
75
76
  ): Promise<Package> {
76
77
  const startTime = performance.now();
77
78
  await Package.validatePackageManifestExistsOrThrowError(packagePath);
@@ -107,7 +108,12 @@ export class Package {
107
108
  });
108
109
  // Package connections override project connections.
109
110
  const { malloyConnections: packageConnections } =
110
- await createConnections(packagePath);
111
+ await createConnections(
112
+ packagePath,
113
+ [],
114
+ projectName,
115
+ serverRootPath,
116
+ );
111
117
  const connectionsTime = performance.now();
112
118
  logger.info("Package connections created", {
113
119
  packageName,
@@ -297,6 +303,7 @@ export class Package {
297
303
  try {
298
304
  await fs.stat(packageConfigPath);
299
305
  } catch {
306
+ logger.error(`Can't find ${packageConfigPath}`);
300
307
  throw new PackageNotFoundError(
301
308
  `Package manifest for ${packagePath} does not exist.`,
302
309
  );