@malloy-publisher/server 0.0.91 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/.prettierignore +1 -0
  2. package/dist/app/assets/{index-CwH8v8Pf.js → index-DYO_URL-.js} +100 -100
  3. package/dist/app/assets/{index-DJPvt7yu.js → index-Dg-zTLb3.js} +1 -1
  4. package/dist/app/assets/{index.es139-nr8meTUp.js → index.es126-CKC26ttZ.js} +1 -1
  5. package/dist/app/assets/{index.es140-f9ybcYUt.js → index.es127-CBKpWhIe.js} +1 -1
  6. package/dist/app/assets/{index.es143-BrmH4hWW.js → index.es130-5z_n6lm6.js} +1 -1
  7. package/dist/app/assets/{index.es148-KJPSzIi5.js → index.es135-aJw1Xr-9.js} +1 -1
  8. package/dist/app/assets/{index.es156-AslbYSUk.js → index.es143-CAt8G2AV.js} +1 -1
  9. package/dist/app/assets/{index.es157-CGx9vJCM.js → index.es144-CaWYrbVR.js} +1 -1
  10. package/dist/app/assets/{index.es160-B4514fRp.js → index.es147-B_4j3qbz.js} +1 -1
  11. package/dist/app/assets/{index.es164-BdfNgGb4.js → index.es151-Byg3j7QH.js} +1 -1
  12. package/dist/app/assets/{index.es167-Cytvwvs5.js → index.es154-D8PMiD5x.js} +1 -1
  13. package/dist/app/assets/{index.es170-BF0Mj3Dj.js → index.es157-qx6EMeW2.js} +1 -1
  14. package/dist/app/assets/{index.es171-bDBK09mk.js → index.es158-CJWvYXRx.js} +1 -1
  15. package/dist/app/assets/{index.es185-BECCJjWR.js → index.es172-BamsV9CN.js} +1 -1
  16. package/dist/app/assets/{index.es186-DORBN8KQ.js → index.es173-CXyGU58j.js} +1 -1
  17. package/dist/app/assets/{index.es187-C1QXB69O.js → index.es174-C2o3B3o8.js} +1 -1
  18. package/dist/app/assets/{index.es189-BxZOchW8.js → index.es176-BB-1P5bb.js} +1 -1
  19. package/dist/app/assets/{index.es194-AsRZMTWT.js → index.es181-2PlTGcYG.js} +1 -1
  20. package/dist/app/assets/{index.es196-x3jX2idz.js → index.es183-DgoVwe-N.js} +1 -1
  21. package/dist/app/assets/{index.es197-Dtz8tRxv.js → index.es184-Cmc38osU.js} +1 -1
  22. package/dist/app/assets/{index.es202-BMtZpqF-.js → index.es189-DuMu0KfI.js} +1 -1
  23. package/dist/app/assets/{index.es203-gWIQWffw.js → index.es190-C117wYiK.js} +1 -1
  24. package/dist/app/assets/{index.es205-D7Lk4BX7.js → index.es192-Bm2ZoxNH.js} +1 -1
  25. package/dist/app/assets/{index.es206-BiJF4jj3.js → index.es193-BBtnt1bZ.js} +1 -1
  26. package/dist/app/assets/{index.es207-B-UJ_bzC.js → index.es194-CB2Nn3wg.js} +1 -1
  27. package/dist/app/assets/{index.es210-Cuht9bXE.js → index.es197-D91osx4R.js} +1 -1
  28. package/dist/app/assets/{index.es212-OHX8E5rN.js → index.es199-BtpESJSS.js} +1 -1
  29. package/dist/app/assets/{index.es213-ZuPzTQ_g.js → index.es200-BeG9RRw_.js} +1 -1
  30. package/dist/app/assets/{index.es214-D803Db5p.js → index.es201-k2nuCC3B.js} +1 -1
  31. package/dist/app/assets/{index.es220-7QoCPP2j.js → index.es207-C2uQegug.js} +1 -1
  32. package/dist/app/assets/{index.es221-XNqXVFFm.js → index.es208-BTucFWqR.js} +1 -1
  33. package/dist/app/assets/{index.es222-Cdb4luVg.js → index.es209-4dK47W8o.js} +1 -1
  34. package/dist/app/assets/{index.es223-CORMGf1M.js → index.es210-DO6X3-kz.js} +1 -1
  35. package/dist/app/assets/{index.es225-Cq-kOlxp.js → index.es212-CFG-vrrr.js} +1 -1
  36. package/dist/app/assets/{index.es229-E5IGXk-q.js → index.es216-TWO3Mhor.js} +1 -1
  37. package/dist/app/assets/{index.es230-Fc3aBcCM.js → index.es217-0tHVUThG.js} +1 -1
  38. package/dist/app/assets/{index.es238-PSs3scPq.js → index.es225-DHGKCs7a.js} +1 -1
  39. package/dist/app/assets/{index.es241-CL-_GK9e.js → index.es228-Bz0ZvI5L.js} +1 -1
  40. package/dist/app/assets/{index.es244-DKPCX9xC.js → index.es231-D1HdFvsl.js} +1 -1
  41. package/dist/app/assets/{index.es247-BSAYNLHy.js → index.es234-1j9jt1V9.js} +1 -1
  42. package/dist/app/assets/{index.es251--0-h5QiV.js → index.es238-DBm7c9HR.js} +1 -1
  43. package/dist/app/assets/{index.es253-BEn9NcoZ.js → index.es240-DCqDESzD.js} +1 -1
  44. package/dist/app/assets/{index.es261-MjZ_rv4c.js → index.es248-BEYN2dFo.js} +1 -1
  45. package/dist/app/assets/{index.es262-HBJu6fHJ.js → index.es249-DKdYiZA_.js} +1 -1
  46. package/dist/app/assets/{index.es269-DLa2GgqN.js → index.es256-CgBAGaDx.js} +1 -1
  47. package/dist/app/assets/{index.es270-CalwIzIq.js → index.es257-DMI3dJGJ.js} +1 -1
  48. package/dist/app/assets/{index.es280-BmnnGhn2.js → index.es267-B5ei8o6D.js} +1 -1
  49. package/dist/app/assets/{index.es284-C2YEYS8h.js → index.es271-DDBsSlrj.js} +1 -1
  50. package/dist/app/assets/{index.es290-BHjEYaA_.js → index.es277-aI_iYBJv.js} +1 -1
  51. package/dist/app/assets/{index.es295-CLE8Egbz.js → index.es282-DZQyCurk.js} +1 -1
  52. package/dist/app/assets/{index.es296-Bsq8yJGD.js → index.es283-DRQxI154.js} +1 -1
  53. package/dist/app/assets/{index.es298-CTsw_aX6.js → index.es285-DrT3oe3D.js} +1 -1
  54. package/dist/app/assets/{index.es302-BgJs_s58.js → index.es289-CKYiktdr.js} +1 -1
  55. package/dist/app/assets/{index.es304-Y67tbm3o.js → index.es291-BRH8qn2R.js} +1 -1
  56. package/dist/app/assets/{index.es306-Dsx0880i.js → index.es293-B_x7Y2b5.js} +1 -1
  57. package/dist/app/assets/{index.es309-COa7lSGF.js → index.es296-CMhur-CK.js} +1 -1
  58. package/dist/app/assets/{index.es310-C11TmHug.js → index.es297-BY9kHC-p.js} +1 -1
  59. package/dist/app/assets/{index.es314-BExIez_V.js → index.es301-CmwjGLCv.js} +1 -1
  60. package/dist/app/assets/{index.es316-DFqBRZWD.js → index.es303-BOa5F89I.js} +1 -1
  61. package/dist/app/assets/{index.es323-BClNDw1H.js → index.es310-BF6kc0UE.js} +1 -1
  62. package/dist/app/assets/{index.es325-f5hVUVjI.js → index.es312-CoCT5fTV.js} +1 -1
  63. package/dist/app/assets/{index.es327-DsTyRd6E.js → index.es314-CMYE9lCS.js} +1 -1
  64. package/dist/app/assets/{index.es331-BLhdwz0E.js → index.es318-C2_Stmju.js} +1 -1
  65. package/dist/app/assets/{index.es341-oDRBDM86.js → index.es328-DxiHjjdV.js} +1 -1
  66. package/dist/app/assets/{index.es342-DialnTnH.js → index.es329-D4H4qJV5.js} +1 -1
  67. package/dist/app/assets/{index.es349-DrBCM5L2.js → index.es336-DMBcHb9l.js} +1 -1
  68. package/dist/app/assets/{index.es350-B1R-_5vW.js → index.es337-BOcmfyvS.js} +1 -1
  69. package/dist/app/assets/{index.es50-Dwe0S21o.js → index.es50-CDMydA2o.js} +1 -1
  70. package/dist/app/assets/mui-UpaxdnvH.js +159 -0
  71. package/dist/app/index.html +2 -2
  72. package/dist/server.js +294 -92
  73. package/eslint.config.mjs +8 -0
  74. package/package.json +2 -1
  75. package/publisher.config.json +25 -5
  76. package/src/config.ts +25 -2
  77. package/src/constants.ts +1 -1
  78. package/src/controller/package.controller.ts +1 -0
  79. package/src/controller/watch-mode.controller.ts +19 -4
  80. package/src/data_styles.ts +10 -3
  81. package/src/mcp/prompts/index.ts +9 -1
  82. package/src/mcp/resources/package_resource.ts +2 -1
  83. package/src/mcp/resources/source_resource.ts +1 -0
  84. package/src/mcp/resources/view_resource.ts +1 -0
  85. package/src/server.ts +9 -9
  86. package/src/service/connection.ts +17 -4
  87. package/src/service/db_utils.ts +3 -2
  88. package/src/service/model.ts +2 -0
  89. package/src/service/package.spec.ts +76 -54
  90. package/src/service/project.ts +159 -44
  91. package/src/service/project_store.spec.ts +477 -165
  92. package/src/service/project_store.ts +315 -68
  93. package/src/service/scheduler.ts +3 -2
  94. package/src/utils.ts +0 -1
  95. package/tests/harness/e2e.ts +60 -58
  96. package/tests/harness/uris.ts +21 -24
  97. package/tests/integration/mcp/mcp_resource.integration.spec.ts +10 -0
  98. package/dist/app/assets/mui-Bcj8oDBR.js +0 -161
  99. /package/dist/app/assets/{index.es128-CG6Dc4jp.js → index.es115-CG6Dc4jp.js} +0 -0
  100. /package/dist/app/assets/{index.es136-DsBKuouk.js → index.es123-DsBKuouk.js} +0 -0
  101. /package/dist/app/assets/{index.es137-D_z4Izcz.js → index.es124-D_z4Izcz.js} +0 -0
  102. /package/dist/app/assets/{index.es138-727ZlQH0.js → index.es125-727ZlQH0.js} +0 -0
  103. /package/dist/app/assets/{index.es141-Dn00JSTd.js → index.es128-Dn00JSTd.js} +0 -0
  104. /package/dist/app/assets/{index.es142-COJ4H7py.js → index.es129-COJ4H7py.js} +0 -0
  105. /package/dist/app/assets/{index.es144-Bu5BbsvL.js → index.es131-Bu5BbsvL.js} +0 -0
  106. /package/dist/app/assets/{index.es145-7O62HKoU.js → index.es132-7O62HKoU.js} +0 -0
  107. /package/dist/app/assets/{index.es146-BPT9niGB.js → index.es133-BPT9niGB.js} +0 -0
  108. /package/dist/app/assets/{index.es147-Dhn9LcZ4.js → index.es134-Dhn9LcZ4.js} +0 -0
  109. /package/dist/app/assets/{index.es149-eg146-Ew.js → index.es136-eg146-Ew.js} +0 -0
  110. /package/dist/app/assets/{index.es150-Du268qiB.js → index.es137-Du268qiB.js} +0 -0
  111. /package/dist/app/assets/{index.es151-fje9CFhw.js → index.es138-fje9CFhw.js} +0 -0
  112. /package/dist/app/assets/{index.es152-BwXTMy5W.js → index.es139-BwXTMy5W.js} +0 -0
  113. /package/dist/app/assets/{index.es153-3xVqZejG.js → index.es140-3xVqZejG.js} +0 -0
  114. /package/dist/app/assets/{index.es154-xW4inM5L.js → index.es141-xW4inM5L.js} +0 -0
  115. /package/dist/app/assets/{index.es155-DHo0CJ0O.js → index.es142-DHo0CJ0O.js} +0 -0
  116. /package/dist/app/assets/{index.es158-C3t2pwGQ.js → index.es145-C3t2pwGQ.js} +0 -0
  117. /package/dist/app/assets/{index.es159-DNquZEk8.js → index.es146-DNquZEk8.js} +0 -0
  118. /package/dist/app/assets/{index.es161-BHOwM8T6.js → index.es148-BHOwM8T6.js} +0 -0
  119. /package/dist/app/assets/{index.es162-DxSadP1t.js → index.es149-DxSadP1t.js} +0 -0
  120. /package/dist/app/assets/{index.es163-DbXoA79R.js → index.es150-DbXoA79R.js} +0 -0
  121. /package/dist/app/assets/{index.es165-Bp6g37R7.js → index.es152-Bp6g37R7.js} +0 -0
  122. /package/dist/app/assets/{index.es166-sacFqUAJ.js → index.es153-sacFqUAJ.js} +0 -0
  123. /package/dist/app/assets/{index.es168-C7gG9l05.js → index.es155-C7gG9l05.js} +0 -0
  124. /package/dist/app/assets/{index.es169-Dsg_Bt_b.js → index.es156-Dsg_Bt_b.js} +0 -0
  125. /package/dist/app/assets/{index.es172-D9R-vmeu.js → index.es159-D9R-vmeu.js} +0 -0
  126. /package/dist/app/assets/{index.es173-BPhBrDlE.js → index.es160-BPhBrDlE.js} +0 -0
  127. /package/dist/app/assets/{index.es174-C-TU5hQ_.js → index.es161-C-TU5hQ_.js} +0 -0
  128. /package/dist/app/assets/{index.es175-DtFQj3wx.js → index.es162-DtFQj3wx.js} +0 -0
  129. /package/dist/app/assets/{index.es176-m2LEI-9-.js → index.es163-m2LEI-9-.js} +0 -0
  130. /package/dist/app/assets/{index.es177-BoXegm-a.js → index.es164-BoXegm-a.js} +0 -0
  131. /package/dist/app/assets/{index.es178-B9wLZaAG.js → index.es165-B9wLZaAG.js} +0 -0
  132. /package/dist/app/assets/{index.es179-ClGRhx96.js → index.es166-ClGRhx96.js} +0 -0
  133. /package/dist/app/assets/{index.es180-DEIpsLCJ.js → index.es167-DEIpsLCJ.js} +0 -0
  134. /package/dist/app/assets/{index.es181-BgYniUM_.js → index.es168-BgYniUM_.js} +0 -0
  135. /package/dist/app/assets/{index.es182-COcR7UxN.js → index.es169-COcR7UxN.js} +0 -0
  136. /package/dist/app/assets/{index.es183-BjQB5zDj.js → index.es170-BjQB5zDj.js} +0 -0
  137. /package/dist/app/assets/{index.es184-C-nORZOA.js → index.es171-C-nORZOA.js} +0 -0
  138. /package/dist/app/assets/{index.es188-BX77sIaO.js → index.es175-BX77sIaO.js} +0 -0
  139. /package/dist/app/assets/{index.es190-B-DoSBHF.js → index.es177-B-DoSBHF.js} +0 -0
  140. /package/dist/app/assets/{index.es191-bCA53EVm.js → index.es178-bCA53EVm.js} +0 -0
  141. /package/dist/app/assets/{index.es192-w-ucz2PV.js → index.es179-w-ucz2PV.js} +0 -0
  142. /package/dist/app/assets/{index.es193-Dayu4EKP.js → index.es180-Dayu4EKP.js} +0 -0
  143. /package/dist/app/assets/{index.es195-DKXYxT9g.js → index.es182-DKXYxT9g.js} +0 -0
  144. /package/dist/app/assets/{index.es198-DfxzS6Rs.js → index.es185-DfxzS6Rs.js} +0 -0
  145. /package/dist/app/assets/{index.es199-SKMF96pI.js → index.es186-SKMF96pI.js} +0 -0
  146. /package/dist/app/assets/{index.es200-ajMbGru0.js → index.es187-ajMbGru0.js} +0 -0
  147. /package/dist/app/assets/{index.es201--30QC5Em.js → index.es188--30QC5Em.js} +0 -0
  148. /package/dist/app/assets/{index.es204-B430Bg39.js → index.es191-B430Bg39.js} +0 -0
  149. /package/dist/app/assets/{index.es208-CM8KxXT1.js → index.es195-CM8KxXT1.js} +0 -0
  150. /package/dist/app/assets/{index.es209-B1SYOhNW.js → index.es196-B1SYOhNW.js} +0 -0
  151. /package/dist/app/assets/{index.es211-DkBy-JyN.js → index.es198-DkBy-JyN.js} +0 -0
  152. /package/dist/app/assets/{index.es215-BILxekzW.js → index.es202-BILxekzW.js} +0 -0
  153. /package/dist/app/assets/{index.es216-C5wWYbrZ.js → index.es203-C5wWYbrZ.js} +0 -0
  154. /package/dist/app/assets/{index.es217-HzYwdGDm.js → index.es204-HzYwdGDm.js} +0 -0
  155. /package/dist/app/assets/{index.es218-T-Tgc4AT.js → index.es205-T-Tgc4AT.js} +0 -0
  156. /package/dist/app/assets/{index.es219-ifBTmRxC.js → index.es206-ifBTmRxC.js} +0 -0
  157. /package/dist/app/assets/{index.es224-BMj5Y0dO.js → index.es211-BMj5Y0dO.js} +0 -0
  158. /package/dist/app/assets/{index.es226-BjABl1g7.js → index.es213-BjABl1g7.js} +0 -0
  159. /package/dist/app/assets/{index.es227-xI-RfyKK.js → index.es214-xI-RfyKK.js} +0 -0
  160. /package/dist/app/assets/{index.es228-ySlJ1b_l.js → index.es215-ySlJ1b_l.js} +0 -0
  161. /package/dist/app/assets/{index.es231-BQoSv7ci.js → index.es218-BQoSv7ci.js} +0 -0
  162. /package/dist/app/assets/{index.es232-w8dY5SsB.js → index.es219-w8dY5SsB.js} +0 -0
  163. /package/dist/app/assets/{index.es233-TU54ms6u.js → index.es220-TU54ms6u.js} +0 -0
  164. /package/dist/app/assets/{index.es234-DREVFZK8.js → index.es221-DREVFZK8.js} +0 -0
  165. /package/dist/app/assets/{index.es235-BfivnA6A.js → index.es222-BfivnA6A.js} +0 -0
  166. /package/dist/app/assets/{index.es236-P4WzXJd0.js → index.es223-P4WzXJd0.js} +0 -0
  167. /package/dist/app/assets/{index.es237-BAng5TT0.js → index.es224-BAng5TT0.js} +0 -0
  168. /package/dist/app/assets/{index.es239-B5lbUyaz.js → index.es226-B5lbUyaz.js} +0 -0
  169. /package/dist/app/assets/{index.es240-mebxcVVE.js → index.es227-mebxcVVE.js} +0 -0
  170. /package/dist/app/assets/{index.es242-XBlWyCtg.js → index.es229-XBlWyCtg.js} +0 -0
  171. /package/dist/app/assets/{index.es243-BfCpw3nA.js → index.es230-BfCpw3nA.js} +0 -0
  172. /package/dist/app/assets/{index.es245-Cc5clBb7.js → index.es232-Cc5clBb7.js} +0 -0
  173. /package/dist/app/assets/{index.es246-IuBKFhSY.js → index.es233-IuBKFhSY.js} +0 -0
  174. /package/dist/app/assets/{index.es248-Du5NY7AG.js → index.es235-Du5NY7AG.js} +0 -0
  175. /package/dist/app/assets/{index.es249-Bvotw-X0.js → index.es236-Bvotw-X0.js} +0 -0
  176. /package/dist/app/assets/{index.es250-UIAJJxZW.js → index.es237-UIAJJxZW.js} +0 -0
  177. /package/dist/app/assets/{index.es252-D9-PGadD.js → index.es239-D9-PGadD.js} +0 -0
  178. /package/dist/app/assets/{index.es254-sdHcTMYB.js → index.es241-sdHcTMYB.js} +0 -0
  179. /package/dist/app/assets/{index.es255-Ci6OQyBP.js → index.es242-Ci6OQyBP.js} +0 -0
  180. /package/dist/app/assets/{index.es256-BC5c_5Pe.js → index.es243-BC5c_5Pe.js} +0 -0
  181. /package/dist/app/assets/{index.es257-Tz6hzZYG.js → index.es244-Tz6hzZYG.js} +0 -0
  182. /package/dist/app/assets/{index.es258-DB_GagMm.js → index.es245-DB_GagMm.js} +0 -0
  183. /package/dist/app/assets/{index.es259-DLbgOhZU.js → index.es246-DLbgOhZU.js} +0 -0
  184. /package/dist/app/assets/{index.es260-B0XVJmRM.js → index.es247-B0XVJmRM.js} +0 -0
  185. /package/dist/app/assets/{index.es263-shcSOmrb.js → index.es250-shcSOmrb.js} +0 -0
  186. /package/dist/app/assets/{index.es264-D4Tzg5kh.js → index.es251-D4Tzg5kh.js} +0 -0
  187. /package/dist/app/assets/{index.es265-Deuh7S70.js → index.es252-Deuh7S70.js} +0 -0
  188. /package/dist/app/assets/{index.es266-BUEGK8hf.js → index.es253-BUEGK8hf.js} +0 -0
  189. /package/dist/app/assets/{index.es267-BNioltXt.js → index.es254-BNioltXt.js} +0 -0
  190. /package/dist/app/assets/{index.es268-JqZropPD.js → index.es255-JqZropPD.js} +0 -0
  191. /package/dist/app/assets/{index.es271-LKU2TuZ1.js → index.es258-LKU2TuZ1.js} +0 -0
  192. /package/dist/app/assets/{index.es272-BFLt1xDp.js → index.es259-BFLt1xDp.js} +0 -0
  193. /package/dist/app/assets/{index.es273-DKykz6zU.js → index.es260-DKykz6zU.js} +0 -0
  194. /package/dist/app/assets/{index.es274-B3ZDOciz.js → index.es261-B3ZDOciz.js} +0 -0
  195. /package/dist/app/assets/{index.es275-CSHBycmS.js → index.es262-CSHBycmS.js} +0 -0
  196. /package/dist/app/assets/{index.es276-BIEUsx6d.js → index.es263-BIEUsx6d.js} +0 -0
  197. /package/dist/app/assets/{index.es277-B48N-Iqd.js → index.es264-B48N-Iqd.js} +0 -0
  198. /package/dist/app/assets/{index.es278-BY-TUvya.js → index.es265-BY-TUvya.js} +0 -0
  199. /package/dist/app/assets/{index.es279-zocC4JxJ.js → index.es266-zocC4JxJ.js} +0 -0
  200. /package/dist/app/assets/{index.es281-Cza_XSSt.js → index.es268-Cza_XSSt.js} +0 -0
  201. /package/dist/app/assets/{index.es282-Bg-kzb6g.js → index.es269-Bg-kzb6g.js} +0 -0
  202. /package/dist/app/assets/{index.es283-DhUJRlN_.js → index.es270-DhUJRlN_.js} +0 -0
  203. /package/dist/app/assets/{index.es285-C8lEn-DE.js → index.es272-C8lEn-DE.js} +0 -0
  204. /package/dist/app/assets/{index.es286-DhMKtDLN.js → index.es273-DhMKtDLN.js} +0 -0
  205. /package/dist/app/assets/{index.es287-CwjWoCRV.js → index.es274-CwjWoCRV.js} +0 -0
  206. /package/dist/app/assets/{index.es288-CzouJOBO.js → index.es275-CzouJOBO.js} +0 -0
  207. /package/dist/app/assets/{index.es289-B1bQXN8T.js → index.es276-B1bQXN8T.js} +0 -0
  208. /package/dist/app/assets/{index.es291-5LuOXUq_.js → index.es278-5LuOXUq_.js} +0 -0
  209. /package/dist/app/assets/{index.es292-DWJ3fJO_.js → index.es279-DWJ3fJO_.js} +0 -0
  210. /package/dist/app/assets/{index.es293-DJlmqQ1C.js → index.es280-DJlmqQ1C.js} +0 -0
  211. /package/dist/app/assets/{index.es294-QhoSD0DR.js → index.es281-QhoSD0DR.js} +0 -0
  212. /package/dist/app/assets/{index.es297-Be6lgOlo.js → index.es284-Be6lgOlo.js} +0 -0
  213. /package/dist/app/assets/{index.es299-BJ4Li9vH.js → index.es286-BJ4Li9vH.js} +0 -0
  214. /package/dist/app/assets/{index.es300-DQVVAn-B.js → index.es287-DQVVAn-B.js} +0 -0
  215. /package/dist/app/assets/{index.es301-BJGe-b2p.js → index.es288-BJGe-b2p.js} +0 -0
  216. /package/dist/app/assets/{index.es303-BLhTXw86.js → index.es290-BLhTXw86.js} +0 -0
  217. /package/dist/app/assets/{index.es305-atvbtKCR.js → index.es292-atvbtKCR.js} +0 -0
  218. /package/dist/app/assets/{index.es307-DkLiglaE.js → index.es294-DkLiglaE.js} +0 -0
  219. /package/dist/app/assets/{index.es308-C1w2a3ep.js → index.es295-C1w2a3ep.js} +0 -0
  220. /package/dist/app/assets/{index.es311-Cf8iN4DR.js → index.es298-Cf8iN4DR.js} +0 -0
  221. /package/dist/app/assets/{index.es312-COK4E0Yg.js → index.es299-COK4E0Yg.js} +0 -0
  222. /package/dist/app/assets/{index.es313-BknIz3MU.js → index.es300-BknIz3MU.js} +0 -0
  223. /package/dist/app/assets/{index.es315-BeQkCIfX.js → index.es302-BeQkCIfX.js} +0 -0
  224. /package/dist/app/assets/{index.es317-BSxZ-RaX.js → index.es304-BSxZ-RaX.js} +0 -0
  225. /package/dist/app/assets/{index.es318-C7L56vO4.js → index.es305-C7L56vO4.js} +0 -0
  226. /package/dist/app/assets/{index.es319-CUnW07Te.js → index.es306-CUnW07Te.js} +0 -0
  227. /package/dist/app/assets/{index.es320-C1XDQQGZ.js → index.es307-C1XDQQGZ.js} +0 -0
  228. /package/dist/app/assets/{index.es321-CQjiPCtT.js → index.es308-CQjiPCtT.js} +0 -0
  229. /package/dist/app/assets/{index.es322-DQ1-QYvQ.js → index.es309-DQ1-QYvQ.js} +0 -0
  230. /package/dist/app/assets/{index.es324-BbSNqyBO.js → index.es311-BbSNqyBO.js} +0 -0
  231. /package/dist/app/assets/{index.es326-CB2ApiWb.js → index.es313-CB2ApiWb.js} +0 -0
  232. /package/dist/app/assets/{index.es328-B_m7g4N7.js → index.es315-B_m7g4N7.js} +0 -0
  233. /package/dist/app/assets/{index.es329-B6W0miNI.js → index.es316-B6W0miNI.js} +0 -0
  234. /package/dist/app/assets/{index.es330-BMR_PYu6.js → index.es317-BMR_PYu6.js} +0 -0
  235. /package/dist/app/assets/{index.es332-Dj6nwHGl.js → index.es319-Dj6nwHGl.js} +0 -0
  236. /package/dist/app/assets/{index.es333-BpWG_bgh.js → index.es320-BpWG_bgh.js} +0 -0
  237. /package/dist/app/assets/{index.es334-BVUVsWT6.js → index.es321-BVUVsWT6.js} +0 -0
  238. /package/dist/app/assets/{index.es335-CAQ2eGtk.js → index.es322-CAQ2eGtk.js} +0 -0
  239. /package/dist/app/assets/{index.es336-BFOHcciG.js → index.es323-BFOHcciG.js} +0 -0
  240. /package/dist/app/assets/{index.es337-CdO5JTpU.js → index.es324-CdO5JTpU.js} +0 -0
  241. /package/dist/app/assets/{index.es338-CJaU5se_.js → index.es325-CJaU5se_.js} +0 -0
  242. /package/dist/app/assets/{index.es339-DYoNaHQp.js → index.es326-DYoNaHQp.js} +0 -0
  243. /package/dist/app/assets/{index.es340-m4uW47V2.js → index.es327-m4uW47V2.js} +0 -0
  244. /package/dist/app/assets/{index.es343-nyqBNV6O.js → index.es330-nyqBNV6O.js} +0 -0
  245. /package/dist/app/assets/{index.es344-C6j12Q_x.js → index.es331-C6j12Q_x.js} +0 -0
  246. /package/dist/app/assets/{index.es345-7A4Fjokl.js → index.es332-7A4Fjokl.js} +0 -0
  247. /package/dist/app/assets/{index.es346-CB0Krxn9.js → index.es333-CB0Krxn9.js} +0 -0
  248. /package/dist/app/assets/{index.es347-DCE3LsBG.js → index.es334-DCE3LsBG.js} +0 -0
  249. /package/dist/app/assets/{index.es348-C3FkfJm5.js → index.es335-C3FkfJm5.js} +0 -0
  250. /package/dist/app/assets/{index.es351-CVw76BM1.js → index.es338-CVw76BM1.js} +0 -0
  251. /package/dist/app/assets/{index.es352-HnGAYVZD.js → index.es339-HnGAYVZD.js} +0 -0
  252. /package/dist/app/assets/{index.es353-BVz_zdnA.js → index.es340-BVz_zdnA.js} +0 -0
  253. /package/dist/app/assets/{index.es354-C3khCPGq.js → index.es341-C3khCPGq.js} +0 -0
  254. /package/dist/app/assets/{index.es355-D-2ljcwZ.js → index.es342-D-2ljcwZ.js} +0 -0
  255. /package/dist/app/assets/{index.es356-Cv9koXgw.js → index.es343-Cv9koXgw.js} +0 -0
  256. /package/dist/app/assets/{index.es357-CD_QflpE.js → index.es344-CD_QflpE.js} +0 -0
  257. /package/dist/app/assets/{index.es358-DRW-0cLl.js → index.es345-DRW-0cLl.js} +0 -0
  258. /package/dist/app/assets/{index.es359-C-_shW-Y.js → index.es346-C-_shW-Y.js} +0 -0
  259. /package/dist/app/assets/{index.es360-LGGdnPYs.js → index.es347-LGGdnPYs.js} +0 -0
  260. /package/dist/app/assets/{index.es361-C3mMm8J8.js → index.es348-C3mMm8J8.js} +0 -0
  261. /package/dist/app/assets/{index.es362-BzJJZx-M.js → index.es349-BzJJZx-M.js} +0 -0
  262. /package/dist/app/assets/{index.es363-BXkSAIEj.js → index.es350-BXkSAIEj.js} +0 -0
  263. /package/dist/app/assets/{index.es364-BgDCqdQA.js → index.es351-BgDCqdQA.js} +0 -0
  264. /package/dist/app/assets/{index.es365-C8M2exoo.js → index.es352-C8M2exoo.js} +0 -0
  265. /package/dist/app/assets/{index.es366-DHJKELXO.js → index.es353-DHJKELXO.js} +0 -0
  266. /package/dist/app/assets/{index.es367-Cuk6v7N8.js → index.es354-Cuk6v7N8.js} +0 -0
  267. /package/dist/app/assets/{index.es368-DH5Ifo-i.js → index.es355-DH5Ifo-i.js} +0 -0
  268. /package/dist/app/assets/{index.es369-E3gJ1_iC.js → index.es356-E3gJ1_iC.js} +0 -0
  269. /package/dist/app/assets/{index.es370-DAi9KRSo.js → index.es357-DAi9KRSo.js} +0 -0
  270. /package/dist/app/assets/{index.es371-D7oLnXFd.js → index.es358-D7oLnXFd.js} +0 -0
  271. /package/dist/app/assets/{index.es372-BfjtVDDH.js → index.es359-BfjtVDDH.js} +0 -0
  272. /package/dist/app/assets/{index.es373-DnULxvSX.js → index.es360-DnULxvSX.js} +0 -0
  273. /package/dist/app/assets/{index.es374-CkXjmgJE.js → index.es361-CkXjmgJE.js} +0 -0
  274. /package/dist/app/assets/{index.es375-CfQXZHmo.js → index.es362-CfQXZHmo.js} +0 -0
  275. /package/dist/app/assets/{index.es376-DWedfzmr.js → index.es363-DWedfzmr.js} +0 -0
  276. /package/dist/app/assets/{index.es377-DUszq2jm.js → index.es364-DUszq2jm.js} +0 -0
  277. /package/dist/app/assets/{index.es378-B7mTdjB0.js → index.es365-B7mTdjB0.js} +0 -0
  278. /package/dist/app/assets/{index.es379-D5KoaKCx.js → index.es366-D5KoaKCx.js} +0 -0
  279. /package/dist/app/assets/{index.es380-BfHTSMKl.js → index.es367-BfHTSMKl.js} +0 -0
  280. /package/dist/app/assets/{index.es381-B0m2ddpp.js → index.es368-B0m2ddpp.js} +0 -0
  281. /package/dist/app/assets/{index.es382-CyktbL80.js → index.es369-CyktbL80.js} +0 -0
  282. /package/dist/app/assets/{index.es383-Csfq5Kiy.js → index.es370-Csfq5Kiy.js} +0 -0
  283. /package/dist/app/assets/{index.es384-CafNBF8u.js → index.es371-CafNBF8u.js} +0 -0
  284. /package/dist/app/assets/{index.es385-CTRr51gU.js → index.es372-CTRr51gU.js} +0 -0
  285. /package/dist/app/assets/{index.es386-D4h5O-jR.js → index.es373-D4h5O-jR.js} +0 -0
  286. /package/dist/app/assets/{index.es387-C39BiMTA.js → index.es374-C39BiMTA.js} +0 -0
  287. /package/dist/app/assets/{index.es388-Ddv68eIx.js → index.es375-Ddv68eIx.js} +0 -0
  288. /package/dist/app/assets/{index.es389-GBQ2dnAY.js → index.es376-GBQ2dnAY.js} +0 -0
  289. /package/dist/app/assets/{index.es390-PoHY5YXO.js → index.es377-PoHY5YXO.js} +0 -0
  290. /package/dist/app/assets/{index.es391-3e1v2bzS.js → index.es378-3e1v2bzS.js} +0 -0
  291. /package/dist/app/assets/{index.es392-CS3Unz2-.js → index.es379-CS3Unz2-.js} +0 -0
  292. /package/dist/app/assets/{index.es393-bN70gL4F.js → index.es380-bN70gL4F.js} +0 -0
  293. /package/dist/app/assets/{index.es394-CmCqftbK.js → index.es381-CmCqftbK.js} +0 -0
  294. /package/dist/app/assets/{index.es395-Ds-gbosJ.js → index.es382-Ds-gbosJ.js} +0 -0
  295. /package/dist/app/assets/{index.es396-CjDtw9vr.js → index.es383-CjDtw9vr.js} +0 -0
  296. /package/dist/app/assets/{index.es397-BthQWCQV.js → index.es384-BthQWCQV.js} +0 -0
  297. /package/dist/app/assets/{index.es398-DqwNpetd.js → index.es385-DqwNpetd.js} +0 -0
  298. /package/dist/app/assets/{index.es399-Bw305WKR.js → index.es386-Bw305WKR.js} +0 -0
  299. /package/dist/app/assets/{index.es400-DXbdFlpD.js → index.es387-DXbdFlpD.js} +0 -0
  300. /package/dist/app/assets/{index.es401-L9t79GZl.js → index.es388-L9t79GZl.js} +0 -0
  301. /package/dist/app/assets/{index.es402-CbfX1IO0.js → index.es389-CbfX1IO0.js} +0 -0
  302. /package/dist/app/assets/{index.es403-DBQeEorK.js → index.es390-DBQeEorK.js} +0 -0
  303. /package/dist/app/assets/{index.es404-BEBZ7ncR.js → index.es391-BEBZ7ncR.js} +0 -0
  304. /package/dist/app/assets/{index.es405-Bkuqu6BP.js → index.es392-Bkuqu6BP.js} +0 -0
  305. /package/dist/app/assets/{index.es406-D0r3Knsf.js → index.es393-D0r3Knsf.js} +0 -0
  306. /package/dist/app/assets/{index.es407-CVO1_9PV.js → index.es394-CVO1_9PV.js} +0 -0
package/eslint.config.mjs CHANGED
@@ -50,6 +50,14 @@ export default [
50
50
 
51
51
  rules: {
52
52
  "react/react-in-jsx-scope": "off",
53
+ "@typescript-eslint/no-unused-vars": [
54
+ "error",
55
+ {
56
+ argsIgnorePattern: "^_",
57
+ varsIgnorePattern: "^_",
58
+ caughtErrorsIgnorePattern: "^_",
59
+ },
60
+ ],
53
61
  },
54
62
  },
55
63
  ];
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.91",
4
+ "version": "0.0.92",
5
5
  "main": "dist/server.js",
6
6
  "bin": {
7
7
  "malloy-publisher": "dist/server.js"
@@ -63,6 +63,7 @@
63
63
  "@eslint/js": "^9.23.0",
64
64
  "@faker-js/faker": "^9.4.0",
65
65
  "@types/adm-zip": "^0.5.7",
66
+ "@types/bun": "^1.2.20",
66
67
  "@types/cors": "^2.8.12",
67
68
  "@types/express": "^4.17.14",
68
69
  "@types/morgan": "^1.9.9",
@@ -1,6 +1,26 @@
1
1
  {
2
- "frozenConfig": false,
3
- "projects": {
4
- "malloy-samples": "https://github.com/ms2data/malloy-samples"
5
- }
6
- }
2
+ "frozenConfig": false,
3
+ "projects": [
4
+ {
5
+ "name": "malloy-samples",
6
+ "packages": [
7
+ {
8
+ "name": "ecommerce",
9
+ "location": "https://github.com/ms2data/malloy-samples"
10
+ },
11
+ {
12
+ "name": "imdb",
13
+ "location": "https://github.com/ms2data/malloy-samples"
14
+ },
15
+ {
16
+ "name": "faa",
17
+ "location": "https://github.com/ms2data/malloy-samples"
18
+ },
19
+ {
20
+ "name": "bigquery-hackernews",
21
+ "location": "https://github.com/ms2data/malloy-samples"
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
package/src/config.ts CHANGED
@@ -4,14 +4,37 @@ import { PUBLISHER_CONFIG_NAME } from "./constants";
4
4
 
5
5
  type FilesystemPath = `./${string}` | `../${string}` | `/${string}`;
6
6
  type GcsPath = `gs://${string}`;
7
+
8
+ export type Package = {
9
+ name: string;
10
+ location: FilesystemPath | GcsPath;
11
+ };
12
+
13
+ export type Project = {
14
+ name: string;
15
+ packages: Package[];
16
+ };
17
+
7
18
  export type PublisherConfig = {
8
19
  frozenConfig: boolean;
9
- projects: Record<string, FilesystemPath | GcsPath>;
20
+ projects: Project[];
10
21
  };
11
22
 
12
23
  export const getPublisherConfig = (serverRoot: string): PublisherConfig => {
13
24
  const publisherConfigPath = path.join(serverRoot, PUBLISHER_CONFIG_NAME);
14
- return JSON.parse(fs.readFileSync(publisherConfigPath, "utf8"));
25
+ const rawConfig = JSON.parse(fs.readFileSync(publisherConfigPath, "utf8"));
26
+
27
+ if (
28
+ rawConfig.projects &&
29
+ typeof rawConfig.projects === "object" &&
30
+ !Array.isArray(rawConfig.projects)
31
+ ) {
32
+ throw new Error(
33
+ "Config has changed. Please update your config to the new format.",
34
+ );
35
+ }
36
+
37
+ return rawConfig as PublisherConfig;
15
38
  };
16
39
 
17
40
  export const isPublisherConfigFrozen = (serverRoot: string) => {
package/src/constants.ts CHANGED
@@ -11,6 +11,6 @@ export const ROW_LIMIT = 1000;
11
11
  export let publisherPath = "/etc/publisher";
12
12
  try {
13
13
  fs.accessSync(publisherPath, fs.constants.W_OK);
14
- } catch (e) {
14
+ } catch {
15
15
  publisherPath = "/tmp/publisher";
16
16
  }
@@ -103,6 +103,7 @@ export class PackageController {
103
103
  packageLocation,
104
104
  absoluteTargetPath,
105
105
  projectName,
106
+ packageName,
106
107
  );
107
108
  }
108
109
  }
@@ -7,7 +7,7 @@ import { ProjectStore } from "../service/project_store";
7
7
 
8
8
  type StartWatchReq = components["schemas"]["StartWatchRequest"];
9
9
  type WatchStatusRes = components["schemas"]["WatchStatus"];
10
- type Handler<Req = {}, Res = void> = RequestHandler<{}, Res, Req>;
10
+ type Handler<Req = object, Res = void> = RequestHandler<object, Res, Req>;
11
11
 
12
12
  export class WatchModeController {
13
13
  watchingPath: string | null;
@@ -19,7 +19,7 @@ export class WatchModeController {
19
19
  this.watchingProjectName = null;
20
20
  }
21
21
 
22
- public getWatchStatus: Handler<{}, WatchStatusRes> = async (_req, res) => {
22
+ public getWatchStatus: Handler<void, WatchStatusRes> = async (_req, res) => {
23
23
  return res.json({
24
24
  enabled: !!this.watchingPath,
25
25
  watchingPath: this.watchingPath,
@@ -27,14 +27,29 @@ export class WatchModeController {
27
27
  });
28
28
  };
29
29
 
30
- public startWatching: Handler<StartWatchReq> = async (req, res) => {
30
+ public startWatching: Handler<StartWatchReq, { error: string }> = async (
31
+ req,
32
+ res,
33
+ ) => {
31
34
  const projectManifest = await ProjectStore.reloadProjectManifest(
32
35
  this.projectStore.serverRootPath,
33
36
  );
34
37
  this.watchingProjectName = req.body.projectName;
38
+
39
+ // Find the project in the new array structure
40
+ const project = projectManifest.projects.find(
41
+ (p) => p.name === req.body.projectName,
42
+ );
43
+ if (!project || !project.packages || project.packages.length === 0) {
44
+ res.status(404).json({
45
+ error: `Project ${req.body.projectName} not found or has no packages`,
46
+ });
47
+ return;
48
+ }
49
+
35
50
  this.watchingPath = path.join(
36
51
  this.projectStore.serverRootPath,
37
- projectManifest.projects[req.body.projectName],
52
+ req.body.projectName,
38
53
  );
39
54
  this.watcher = chokidar.watch(this.watchingPath, {
40
55
  ignored: (path, stats) =>
@@ -1,4 +1,5 @@
1
1
  import { URLReader } from "@malloydata/malloy";
2
+ // @ts-expect-error until this gets merged https://github.com/malloydata/malloy/pull/2484
2
3
  import { DataStyles } from "@malloydata/render";
3
4
  import { logger } from "./logger";
4
5
 
@@ -25,7 +26,9 @@ export async function dataStylesForFile(
25
26
  // created, so that the error can be shown there.
26
27
  let stylesText;
27
28
  try {
28
- stylesText = await urlReader.readURL(new URL(fileName, url));
29
+ stylesText = (await urlReader.readURL(
30
+ new URL(fileName, url),
31
+ )) as string;
29
32
  } catch (error) {
30
33
  logger.error(`Error loading data style '${fileName}': ${error}`);
31
34
  stylesText = "{}";
@@ -53,10 +56,14 @@ export class HackyDataStylesAccumulator implements URLReader {
53
56
  const contents = await this.urlReader.readURL(url);
54
57
  this.dataStyles = {
55
58
  ...this.dataStyles,
56
- ...(await dataStylesForFile(url.toString(), contents, this.urlReader)),
59
+ ...(await dataStylesForFile(
60
+ url.toString(),
61
+ contents as string,
62
+ this.urlReader,
63
+ )),
57
64
  };
58
65
 
59
- return contents;
66
+ return contents as string;
60
67
  }
61
68
 
62
69
  getHackyAccumulatedDataStyles(): DataStyles {
@@ -1,3 +1,11 @@
1
- export { withVersion, PROMPTS, MALLOY_PROMPTS, ExplainArgsSchema, GenerateQueryArgsSchema, TranslateSqlArgsSchema, SummarizeModelArgsSchema } from "./prompt_definitions";
1
+ export {
2
+ withVersion,
3
+ PROMPTS,
4
+ MALLOY_PROMPTS,
5
+ ExplainArgsSchema,
6
+ GenerateQueryArgsSchema,
7
+ TranslateSqlArgsSchema,
8
+ SummarizeModelArgsSchema,
9
+ } from "./prompt_definitions";
2
10
  export { promptHandlerMap, makePromptHandler } from "./handlers";
3
11
  export { registerPromptCapability } from "./prompt_service";
@@ -38,13 +38,14 @@ async function handleGetPackageContents(
38
38
  const packageInstance = await project.getPackage(packageName, false);
39
39
 
40
40
  // Use listModels() which returns { path: string, type: 'source' | 'notebook' }[]
41
- const entries = packageInstance.listModels();
41
+ const entries = await packageInstance.listModels();
42
42
 
43
43
  // Use a type that includes metadata explicitly
44
44
  const resourceDefinitions: { uri: string; metadata: unknown }[] = [];
45
45
 
46
46
  for (const entry of entries) {
47
47
  const entryPath = entry.path; // e.g., "flights.malloy", "overview.malloynb"
48
+ // @ts-expect-error TODO: Fix missing type in API
48
49
  const entryType = entry.type; // 'source' or 'notebook'
49
50
 
50
51
  if (typeof entryPath !== "string" || entryPath === "") {
@@ -91,6 +91,7 @@ export function registerSourceResource(
91
91
  }
92
92
  // Add type annotation for 's'
93
93
  const source = sources.find(
94
+ // @ts-expect-error TODO: Fix missing Source type in API
94
95
  (s: components["schemas"]["Source"]) =>
95
96
  s.name === sourceName,
96
97
  );
@@ -83,6 +83,7 @@ export function registerViewResource(
83
83
  throw new Error("Could not retrieve sources from model.");
84
84
  }
85
85
  const source = sources.find(
86
+ // @ts-expect-error TODO: Fix missing Source type in API
86
87
  (s: components["schemas"]["Source"]) =>
87
88
  s.name === sourceName,
88
89
  );
package/src/server.ts CHANGED
@@ -13,11 +13,7 @@ import { PackageController } from "./controller/package.controller";
13
13
  import { QueryController } from "./controller/query.controller";
14
14
  import { ScheduleController } from "./controller/schedule.controller";
15
15
  import { WatchModeController } from "./controller/watch-mode.controller";
16
- import {
17
- internalErrorToHttpError,
18
- NotImplementedError,
19
- PackageNotFoundError,
20
- } from "./errors";
16
+ import { internalErrorToHttpError, NotImplementedError } from "./errors";
21
17
  import { logger, loggerMiddleware } from "./logger";
22
18
  import { initializeMcpServer } from "./mcp/server";
23
19
  import { ProjectStore } from "./service/project_store";
@@ -213,10 +209,14 @@ app.use(cors());
213
209
  app.use(bodyParser.json());
214
210
 
215
211
  app.get(`${API_PREFIX}/status`, async (_req, res) => {
216
- res.status(200).json({
217
- timestamp: Date.now(),
218
- projects: await projectStore.listProjects(),
219
- });
212
+ try {
213
+ const status = await projectStore.getStatus();
214
+ res.status(200).json(status);
215
+ } catch (error) {
216
+ logger.error("Error getting status", { error });
217
+ const { json, status } = internalErrorToHttpError(error as Error);
218
+ res.status(status).json(json);
219
+ }
220
220
  });
221
221
 
222
222
  app.get(`${API_PREFIX}/watch-mode/status`, watchModeController.getWatchStatus);
@@ -53,16 +53,26 @@ export async function createConnections(
53
53
  const connectionMap = new Map<string, BaseConnection>();
54
54
  const connectionConfig = await readConnectionConfig(basePath);
55
55
 
56
- for (const connection of [...defaultConnections, ...connectionConfig]) {
56
+ const allConnections = [...defaultConnections, ...connectionConfig];
57
+
58
+ const processedConnections = new Set<string>();
59
+ const apiConnections: InternalConnection[] = [];
60
+
61
+ for (const connection of allConnections) {
62
+ if (connection.name && processedConnections.has(connection.name)) {
63
+ continue;
64
+ }
65
+
57
66
  logger.info(`Adding connection ${connection.name}`, {
58
67
  connection,
59
68
  });
60
- // This case shouldn't happen. The package validation logic should
61
- // catch it.
69
+
62
70
  if (!connection.name) {
63
71
  throw "Invalid connection configuration. No name.";
64
72
  }
65
73
 
74
+ processedConnections.add(connection.name);
75
+
66
76
  switch (connection.type) {
67
77
  case "postgres": {
68
78
  const configReader = async () => {
@@ -218,11 +228,14 @@ export async function createConnections(
218
228
  throw new Error(`Unsupported connection type: ${connection.type}`);
219
229
  }
220
230
  }
231
+
232
+ // Add the connection to apiConnections (this will be sanitized when returned)
233
+ apiConnections.push(connection);
221
234
  }
222
235
 
223
236
  return {
224
237
  malloyConnections: connectionMap,
225
- apiConnections: connectionConfig,
238
+ apiConnections: apiConnections,
226
239
  };
227
240
  }
228
241
 
@@ -9,6 +9,7 @@ import { components } from "../api";
9
9
  import { logger } from "../logger";
10
10
  import {
11
11
  ApiConnection,
12
+ // @ts-expect-error TODO: Fix missing MysqlConnection type in API
12
13
  MysqlConnection,
13
14
  PostgresConnection,
14
15
  SnowflakeConnection,
@@ -68,7 +69,7 @@ async function getSnowflakeConnection(
68
69
  }
69
70
  return new Promise((resolve, reject) => {
70
71
  const connection = snowflake.createConnection({
71
- account: apiSnowflakeConnection.account,
72
+ account: apiSnowflakeConnection.account as string,
72
73
  username: apiSnowflakeConnection.username,
73
74
  password: apiSnowflakeConnection.password,
74
75
  database: apiSnowflakeConnection.database,
@@ -318,7 +319,7 @@ async function getSnowflakeSchemas(
318
319
  return new Promise((resolve, reject) => {
319
320
  connection.execute({
320
321
  sqlText: "SHOW SCHEMAS",
321
- complete: (err, stmt, rows) => {
322
+ complete: (err, _stmt, rows) => {
322
323
  if (err) {
323
324
  reject(err);
324
325
  } else {
@@ -20,6 +20,7 @@ import {
20
20
  MalloySQLStatementType,
21
21
  } from "@malloydata/malloy-sql";
22
22
  import malloyPackage from "@malloydata/malloy/package.json";
23
+ // @ts-expect-error until this gets merged https://github.com/malloydata/malloy/pull/2484
23
24
  import { DataStyles } from "@malloydata/render";
24
25
  import { metrics } from "@opentelemetry/api";
25
26
  import * as fs from "fs/promises";
@@ -42,6 +43,7 @@ import { URL_READER } from "../utils";
42
43
  type ApiCompiledModel = components["schemas"]["CompiledModel"];
43
44
  type ApiNotebookCell = components["schemas"]["NotebookCell"];
44
45
  type ApiCompiledNotebook = components["schemas"]["CompiledNotebook"];
46
+ // @ts-expect-error TODO: Fix missing Source type in API
45
47
  type ApiSource = components["schemas"]["Source"];
46
48
  type ApiView = components["schemas"]["View"];
47
49
  type ApiQuery = components["schemas"]["Query"];
@@ -7,6 +7,7 @@ import { readConnectionConfig } from "./connection";
7
7
  import { ApiConnection, Model } from "./model";
8
8
  import { Package } from "./package";
9
9
  import { Scheduler } from "./scheduler";
10
+ import { Stats } from "fs";
10
11
 
11
12
  // Minimal partial types for mocking
12
13
  type PartialScheduler = Pick<Scheduler, "list">;
@@ -55,8 +56,16 @@ describe("service/package", () => {
55
56
  { name: "testPackage", description: "Test package" },
56
57
  [],
57
58
  new Map([
58
- ["model1.malloy", { getPath: () => "model1.malloy" } as any],
59
- ["model2.malloynb", { getPath: () => "model2.malloynb" } as any],
59
+ [
60
+ "model1.malloy",
61
+ // @ts-expect-error PartialModel is a partial type
62
+ { getPath: () => "model1.malloy" } as PartialModel,
63
+ ],
64
+ [
65
+ "model2.malloynb",
66
+ // @ts-expect-error PartialModel is a partial type
67
+ { getPath: () => "model2.malloynb" } as PartialModel,
68
+ ],
60
69
  ]),
61
70
  undefined,
62
71
  );
@@ -78,60 +87,69 @@ describe("service/package", () => {
78
87
  new Map(),
79
88
  ),
80
89
  ).rejects.toThrowError(
81
- PackageNotFoundError,
82
- "Package manifest for testPackage does not exist.",
90
+ new PackageNotFoundError(
91
+ "Package manifest for testPackage does not exist.",
92
+ ),
83
93
  );
84
94
  });
85
- it("should return a Package object if the package exists", async () => {
86
- sinon.stub(fs, "stat").resolves();
87
- const readFileStub = sinon
88
- .stub(fs, "readFile")
89
- .resolves(
90
- Buffer.from(JSON.stringify({ description: "Test package" })),
95
+ it(
96
+ "should return a Package object if the package exists",
97
+ async () => {
98
+ sinon.stub(fs, "stat").resolves();
99
+ const readFileStub = sinon
100
+ .stub(fs, "readFile")
101
+ .resolves(
102
+ Buffer.from(
103
+ JSON.stringify({ description: "Test package" }),
104
+ ),
105
+ );
106
+
107
+ // Still use Partial<Model> for the stub resolution type
108
+ type PartialModel = Pick<Model, "getPath">;
109
+ sinon
110
+ .stub(Model, "create")
111
+ // @ts-expect-error PartialModel is a partial type
112
+ .resolves({ getPath: () => "model1.model" } as PartialModel);
113
+
114
+ // @ts-expect-error PartialScheduler is a partial type
115
+ sinon.stub(Scheduler, "create").returns({
116
+ list: () => [],
117
+ } as PartialScheduler);
118
+
119
+ readFileStub.restore();
120
+ readFileStub.resolves(Buffer.from(JSON.stringify([])));
121
+
122
+ const packageInstance = await Package.create(
123
+ "testProject",
124
+ "testPackage",
125
+ testPackageDirectory,
126
+ new Map(),
91
127
  );
92
128
 
93
- // Still use Partial<Model> for the stub resolution type
94
- type PartialModel = Pick<Model, "getPath">;
95
- sinon
96
- .stub(Model, "create")
97
- .resolves({ getPath: () => "model1.model" } as PartialModel);
98
-
99
- sinon.stub(Scheduler, "create").returns({
100
- list: () => [],
101
- } as PartialScheduler);
102
-
103
- readFileStub.restore();
104
- readFileStub.resolves(Buffer.from(JSON.stringify([])));
105
-
106
- const packageInstance = await Package.create(
107
- "testProject",
108
- "testPackage",
109
- testPackageDirectory,
110
- new Map(),
111
- );
112
-
113
- expect(packageInstance).toBeInstanceOf(Package);
114
- expect(packageInstance.getPackageName()).toBe("testPackage");
115
- expect(packageInstance.getPackageMetadata().description).toBe(
116
- "Test package",
117
- );
118
- expect(packageInstance.listDatabases()).toEqual([
119
- {
120
- path: "database.csv",
121
- type: "embedded",
122
- info: {
123
- name: "database.csv",
124
- columns: [
125
- { name: "Name", type: "string" },
126
- { name: "Value", type: "number" },
127
- ],
128
- rowCount: 3,
129
+ expect(packageInstance).toBeInstanceOf(Package);
130
+ expect(packageInstance.getPackageName()).toBe("testPackage");
131
+ expect(packageInstance.getPackageMetadata().description).toBe(
132
+ "Test package",
133
+ );
134
+ expect(packageInstance.listDatabases()).toEqual([
135
+ {
136
+ path: "database.csv",
137
+ type: "embedded",
138
+ info: {
139
+ name: "database.csv",
140
+ columns: [
141
+ { name: "Name", type: "string" },
142
+ { name: "Value", type: "number" },
143
+ ],
144
+ rowCount: 3,
145
+ },
129
146
  },
130
- },
131
- ]);
132
- expect(packageInstance.listModels()).toBeEmpty();
133
- expect(packageInstance.listSchedules()).toBeEmpty();
134
- });
147
+ ]);
148
+ expect(packageInstance.listModels()).toBeEmpty();
149
+ expect(packageInstance.listSchedules()).toBeEmpty();
150
+ },
151
+ { timeout: 15000 },
152
+ );
135
153
  });
136
154
 
137
155
  describe("listModels", () => {
@@ -149,7 +167,8 @@ describe("service/package", () => {
149
167
  {
150
168
  getPath: () => "model1.malloy",
151
169
  getModel: () => "foo",
152
- } as any,
170
+ // @ts-expect-error PartialModel is a partial type
171
+ } as PartialModel,
153
172
  ],
154
173
  [
155
174
  "model2.malloynb",
@@ -160,7 +179,8 @@ describe("service/package", () => {
160
179
  message: "This is the error",
161
180
  };
162
181
  },
163
- } as any,
182
+ // @ts-expect-error PartialModel is a partial type
183
+ } as PartialModel,
164
184
  ],
165
185
  ]),
166
186
  undefined,
@@ -169,6 +189,7 @@ describe("service/package", () => {
169
189
  const models = await packageInstance.listModels();
170
190
  expect(models).toEqual([
171
191
  {
192
+ // @ts-expect-error TODO: Fix missing projectName type in API
172
193
  projectName: "testProject",
173
194
  packageName: "testPackage",
174
195
  path: "model1.malloy",
@@ -179,6 +200,7 @@ describe("service/package", () => {
179
200
  const notebooks = await packageInstance.listNotebooks();
180
201
  expect(notebooks).toEqual([
181
202
  {
203
+ // @ts-expect-error TODO: Fix missing projectName type in API
182
204
  projectName: "testProject",
183
205
  packageName: "testPackage",
184
206
  path: "model2.malloynb",
@@ -190,7 +212,7 @@ describe("service/package", () => {
190
212
 
191
213
  describe("getDatabaseInfo", () => {
192
214
  it("should return the size of the database file", async () => {
193
- sinon.stub(fs, "stat").resolves({ size: 13 } as { size: number });
215
+ sinon.stub(fs, "stat").resolves({ size: 13 } as Stats);
194
216
 
195
217
  // @ts-expect-error Accessing private static method for testing
196
218
  const info = await Package.getDatabaseInfo(