@malloy-publisher/server 0.0.91 → 0.0.93

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 (310) hide show
  1. package/.prettierignore +1 -0
  2. package/dist/app/api-doc.yaml +36 -4
  3. package/dist/app/assets/index-D1sQfWlS.js +251 -0
  4. package/dist/app/assets/{index-DJPvt7yu.js → index-Dg-zTLb3.js} +1 -1
  5. package/dist/app/assets/{index.es139-nr8meTUp.js → index.es126-CKC26ttZ.js} +1 -1
  6. package/dist/app/assets/{index.es140-f9ybcYUt.js → index.es127-CBKpWhIe.js} +1 -1
  7. package/dist/app/assets/{index.es143-BrmH4hWW.js → index.es130-5z_n6lm6.js} +1 -1
  8. package/dist/app/assets/{index.es148-KJPSzIi5.js → index.es135-aJw1Xr-9.js} +1 -1
  9. package/dist/app/assets/{index.es156-AslbYSUk.js → index.es143-CAt8G2AV.js} +1 -1
  10. package/dist/app/assets/{index.es157-CGx9vJCM.js → index.es144-CaWYrbVR.js} +1 -1
  11. package/dist/app/assets/{index.es160-B4514fRp.js → index.es147-B_4j3qbz.js} +1 -1
  12. package/dist/app/assets/{index.es164-BdfNgGb4.js → index.es151-Byg3j7QH.js} +1 -1
  13. package/dist/app/assets/{index.es167-Cytvwvs5.js → index.es154-D8PMiD5x.js} +1 -1
  14. package/dist/app/assets/{index.es170-BF0Mj3Dj.js → index.es157-qx6EMeW2.js} +1 -1
  15. package/dist/app/assets/{index.es171-bDBK09mk.js → index.es158-CJWvYXRx.js} +1 -1
  16. package/dist/app/assets/{index.es185-BECCJjWR.js → index.es172-BamsV9CN.js} +1 -1
  17. package/dist/app/assets/{index.es186-DORBN8KQ.js → index.es173-CXyGU58j.js} +1 -1
  18. package/dist/app/assets/{index.es187-C1QXB69O.js → index.es174-C2o3B3o8.js} +1 -1
  19. package/dist/app/assets/{index.es189-BxZOchW8.js → index.es176-BB-1P5bb.js} +1 -1
  20. package/dist/app/assets/{index.es194-AsRZMTWT.js → index.es181-2PlTGcYG.js} +1 -1
  21. package/dist/app/assets/{index.es196-x3jX2idz.js → index.es183-DgoVwe-N.js} +1 -1
  22. package/dist/app/assets/{index.es197-Dtz8tRxv.js → index.es184-Cmc38osU.js} +1 -1
  23. package/dist/app/assets/{index.es202-BMtZpqF-.js → index.es189-DuMu0KfI.js} +1 -1
  24. package/dist/app/assets/{index.es203-gWIQWffw.js → index.es190-C117wYiK.js} +1 -1
  25. package/dist/app/assets/{index.es205-D7Lk4BX7.js → index.es192-Bm2ZoxNH.js} +1 -1
  26. package/dist/app/assets/{index.es206-BiJF4jj3.js → index.es193-BBtnt1bZ.js} +1 -1
  27. package/dist/app/assets/{index.es207-B-UJ_bzC.js → index.es194-CB2Nn3wg.js} +1 -1
  28. package/dist/app/assets/{index.es210-Cuht9bXE.js → index.es197-D91osx4R.js} +1 -1
  29. package/dist/app/assets/{index.es212-OHX8E5rN.js → index.es199-BtpESJSS.js} +1 -1
  30. package/dist/app/assets/{index.es213-ZuPzTQ_g.js → index.es200-BeG9RRw_.js} +1 -1
  31. package/dist/app/assets/{index.es214-D803Db5p.js → index.es201-k2nuCC3B.js} +1 -1
  32. package/dist/app/assets/{index.es220-7QoCPP2j.js → index.es207-C2uQegug.js} +1 -1
  33. package/dist/app/assets/{index.es221-XNqXVFFm.js → index.es208-BTucFWqR.js} +1 -1
  34. package/dist/app/assets/{index.es222-Cdb4luVg.js → index.es209-4dK47W8o.js} +1 -1
  35. package/dist/app/assets/{index.es223-CORMGf1M.js → index.es210-DO6X3-kz.js} +1 -1
  36. package/dist/app/assets/{index.es225-Cq-kOlxp.js → index.es212-CFG-vrrr.js} +1 -1
  37. package/dist/app/assets/{index.es229-E5IGXk-q.js → index.es216-TWO3Mhor.js} +1 -1
  38. package/dist/app/assets/{index.es230-Fc3aBcCM.js → index.es217-0tHVUThG.js} +1 -1
  39. package/dist/app/assets/{index.es238-PSs3scPq.js → index.es225-DHGKCs7a.js} +1 -1
  40. package/dist/app/assets/{index.es241-CL-_GK9e.js → index.es228-Bz0ZvI5L.js} +1 -1
  41. package/dist/app/assets/{index.es244-DKPCX9xC.js → index.es231-D1HdFvsl.js} +1 -1
  42. package/dist/app/assets/{index.es247-BSAYNLHy.js → index.es234-1j9jt1V9.js} +1 -1
  43. package/dist/app/assets/{index.es251--0-h5QiV.js → index.es238-DBm7c9HR.js} +1 -1
  44. package/dist/app/assets/{index.es253-BEn9NcoZ.js → index.es240-DCqDESzD.js} +1 -1
  45. package/dist/app/assets/{index.es261-MjZ_rv4c.js → index.es248-BEYN2dFo.js} +1 -1
  46. package/dist/app/assets/{index.es262-HBJu6fHJ.js → index.es249-DKdYiZA_.js} +1 -1
  47. package/dist/app/assets/{index.es269-DLa2GgqN.js → index.es256-CgBAGaDx.js} +1 -1
  48. package/dist/app/assets/{index.es270-CalwIzIq.js → index.es257-DMI3dJGJ.js} +1 -1
  49. package/dist/app/assets/{index.es280-BmnnGhn2.js → index.es267-B5ei8o6D.js} +1 -1
  50. package/dist/app/assets/{index.es284-C2YEYS8h.js → index.es271-DDBsSlrj.js} +1 -1
  51. package/dist/app/assets/{index.es290-BHjEYaA_.js → index.es277-aI_iYBJv.js} +1 -1
  52. package/dist/app/assets/{index.es295-CLE8Egbz.js → index.es282-DZQyCurk.js} +1 -1
  53. package/dist/app/assets/{index.es296-Bsq8yJGD.js → index.es283-DRQxI154.js} +1 -1
  54. package/dist/app/assets/{index.es298-CTsw_aX6.js → index.es285-DrT3oe3D.js} +1 -1
  55. package/dist/app/assets/{index.es302-BgJs_s58.js → index.es289-CKYiktdr.js} +1 -1
  56. package/dist/app/assets/{index.es304-Y67tbm3o.js → index.es291-BRH8qn2R.js} +1 -1
  57. package/dist/app/assets/{index.es306-Dsx0880i.js → index.es293-B_x7Y2b5.js} +1 -1
  58. package/dist/app/assets/{index.es309-COa7lSGF.js → index.es296-CMhur-CK.js} +1 -1
  59. package/dist/app/assets/{index.es310-C11TmHug.js → index.es297-BY9kHC-p.js} +1 -1
  60. package/dist/app/assets/{index.es314-BExIez_V.js → index.es301-CmwjGLCv.js} +1 -1
  61. package/dist/app/assets/{index.es316-DFqBRZWD.js → index.es303-BOa5F89I.js} +1 -1
  62. package/dist/app/assets/{index.es323-BClNDw1H.js → index.es310-BF6kc0UE.js} +1 -1
  63. package/dist/app/assets/{index.es325-f5hVUVjI.js → index.es312-CoCT5fTV.js} +1 -1
  64. package/dist/app/assets/{index.es327-DsTyRd6E.js → index.es314-CMYE9lCS.js} +1 -1
  65. package/dist/app/assets/{index.es331-BLhdwz0E.js → index.es318-C2_Stmju.js} +1 -1
  66. package/dist/app/assets/{index.es341-oDRBDM86.js → index.es328-DxiHjjdV.js} +1 -1
  67. package/dist/app/assets/{index.es342-DialnTnH.js → index.es329-D4H4qJV5.js} +1 -1
  68. package/dist/app/assets/{index.es349-DrBCM5L2.js → index.es336-DMBcHb9l.js} +1 -1
  69. package/dist/app/assets/{index.es350-B1R-_5vW.js → index.es337-BOcmfyvS.js} +1 -1
  70. package/dist/app/assets/{index.es50-Dwe0S21o.js → index.es56-C6ktttDI.js} +1 -1
  71. package/dist/app/assets/mui-UpaxdnvH.js +159 -0
  72. package/dist/app/index.html +2 -2
  73. package/dist/instrumentation.js +14 -0
  74. package/dist/server.js +4862 -1294
  75. package/eslint.config.mjs +8 -0
  76. package/package.json +2 -1
  77. package/publisher.config.json +25 -5
  78. package/src/config.ts +25 -2
  79. package/src/constants.ts +21 -5
  80. package/src/controller/connection.controller.ts +32 -3
  81. package/src/controller/package.controller.ts +1 -0
  82. package/src/controller/watch-mode.controller.ts +19 -4
  83. package/src/data_styles.ts +10 -3
  84. package/src/mcp/prompts/index.ts +9 -1
  85. package/src/mcp/resources/package_resource.ts +2 -1
  86. package/src/mcp/resources/source_resource.ts +1 -0
  87. package/src/mcp/resources/view_resource.ts +1 -0
  88. package/src/server.ts +23 -9
  89. package/src/service/connection.ts +277 -7
  90. package/src/service/db_utils.ts +3 -2
  91. package/src/service/model.ts +2 -0
  92. package/src/service/package.spec.ts +76 -54
  93. package/src/service/project.ts +159 -44
  94. package/src/service/project_store.spec.ts +482 -163
  95. package/src/service/project_store.ts +317 -70
  96. package/src/service/scheduler.ts +3 -2
  97. package/src/utils.ts +0 -1
  98. package/tests/harness/e2e.ts +60 -58
  99. package/tests/harness/uris.ts +21 -24
  100. package/tests/integration/mcp/mcp_resource.integration.spec.ts +10 -0
  101. package/dist/app/assets/index-CwH8v8Pf.js +0 -251
  102. package/dist/app/assets/mui-Bcj8oDBR.js +0 -161
  103. /package/dist/app/assets/{index.es128-CG6Dc4jp.js → index.es115-CG6Dc4jp.js} +0 -0
  104. /package/dist/app/assets/{index.es136-DsBKuouk.js → index.es123-DsBKuouk.js} +0 -0
  105. /package/dist/app/assets/{index.es137-D_z4Izcz.js → index.es124-D_z4Izcz.js} +0 -0
  106. /package/dist/app/assets/{index.es138-727ZlQH0.js → index.es125-727ZlQH0.js} +0 -0
  107. /package/dist/app/assets/{index.es141-Dn00JSTd.js → index.es128-Dn00JSTd.js} +0 -0
  108. /package/dist/app/assets/{index.es142-COJ4H7py.js → index.es129-COJ4H7py.js} +0 -0
  109. /package/dist/app/assets/{index.es144-Bu5BbsvL.js → index.es131-Bu5BbsvL.js} +0 -0
  110. /package/dist/app/assets/{index.es145-7O62HKoU.js → index.es132-7O62HKoU.js} +0 -0
  111. /package/dist/app/assets/{index.es146-BPT9niGB.js → index.es133-BPT9niGB.js} +0 -0
  112. /package/dist/app/assets/{index.es147-Dhn9LcZ4.js → index.es134-Dhn9LcZ4.js} +0 -0
  113. /package/dist/app/assets/{index.es149-eg146-Ew.js → index.es136-eg146-Ew.js} +0 -0
  114. /package/dist/app/assets/{index.es150-Du268qiB.js → index.es137-Du268qiB.js} +0 -0
  115. /package/dist/app/assets/{index.es151-fje9CFhw.js → index.es138-fje9CFhw.js} +0 -0
  116. /package/dist/app/assets/{index.es152-BwXTMy5W.js → index.es139-BwXTMy5W.js} +0 -0
  117. /package/dist/app/assets/{index.es153-3xVqZejG.js → index.es140-3xVqZejG.js} +0 -0
  118. /package/dist/app/assets/{index.es154-xW4inM5L.js → index.es141-xW4inM5L.js} +0 -0
  119. /package/dist/app/assets/{index.es155-DHo0CJ0O.js → index.es142-DHo0CJ0O.js} +0 -0
  120. /package/dist/app/assets/{index.es158-C3t2pwGQ.js → index.es145-C3t2pwGQ.js} +0 -0
  121. /package/dist/app/assets/{index.es159-DNquZEk8.js → index.es146-DNquZEk8.js} +0 -0
  122. /package/dist/app/assets/{index.es161-BHOwM8T6.js → index.es148-BHOwM8T6.js} +0 -0
  123. /package/dist/app/assets/{index.es162-DxSadP1t.js → index.es149-DxSadP1t.js} +0 -0
  124. /package/dist/app/assets/{index.es163-DbXoA79R.js → index.es150-DbXoA79R.js} +0 -0
  125. /package/dist/app/assets/{index.es165-Bp6g37R7.js → index.es152-Bp6g37R7.js} +0 -0
  126. /package/dist/app/assets/{index.es166-sacFqUAJ.js → index.es153-sacFqUAJ.js} +0 -0
  127. /package/dist/app/assets/{index.es168-C7gG9l05.js → index.es155-C7gG9l05.js} +0 -0
  128. /package/dist/app/assets/{index.es169-Dsg_Bt_b.js → index.es156-Dsg_Bt_b.js} +0 -0
  129. /package/dist/app/assets/{index.es172-D9R-vmeu.js → index.es159-D9R-vmeu.js} +0 -0
  130. /package/dist/app/assets/{index.es173-BPhBrDlE.js → index.es160-BPhBrDlE.js} +0 -0
  131. /package/dist/app/assets/{index.es174-C-TU5hQ_.js → index.es161-C-TU5hQ_.js} +0 -0
  132. /package/dist/app/assets/{index.es175-DtFQj3wx.js → index.es162-DtFQj3wx.js} +0 -0
  133. /package/dist/app/assets/{index.es176-m2LEI-9-.js → index.es163-m2LEI-9-.js} +0 -0
  134. /package/dist/app/assets/{index.es177-BoXegm-a.js → index.es164-BoXegm-a.js} +0 -0
  135. /package/dist/app/assets/{index.es178-B9wLZaAG.js → index.es165-B9wLZaAG.js} +0 -0
  136. /package/dist/app/assets/{index.es179-ClGRhx96.js → index.es166-ClGRhx96.js} +0 -0
  137. /package/dist/app/assets/{index.es180-DEIpsLCJ.js → index.es167-DEIpsLCJ.js} +0 -0
  138. /package/dist/app/assets/{index.es181-BgYniUM_.js → index.es168-BgYniUM_.js} +0 -0
  139. /package/dist/app/assets/{index.es182-COcR7UxN.js → index.es169-COcR7UxN.js} +0 -0
  140. /package/dist/app/assets/{index.es183-BjQB5zDj.js → index.es170-BjQB5zDj.js} +0 -0
  141. /package/dist/app/assets/{index.es184-C-nORZOA.js → index.es171-C-nORZOA.js} +0 -0
  142. /package/dist/app/assets/{index.es188-BX77sIaO.js → index.es175-BX77sIaO.js} +0 -0
  143. /package/dist/app/assets/{index.es190-B-DoSBHF.js → index.es177-B-DoSBHF.js} +0 -0
  144. /package/dist/app/assets/{index.es191-bCA53EVm.js → index.es178-bCA53EVm.js} +0 -0
  145. /package/dist/app/assets/{index.es192-w-ucz2PV.js → index.es179-w-ucz2PV.js} +0 -0
  146. /package/dist/app/assets/{index.es193-Dayu4EKP.js → index.es180-Dayu4EKP.js} +0 -0
  147. /package/dist/app/assets/{index.es195-DKXYxT9g.js → index.es182-DKXYxT9g.js} +0 -0
  148. /package/dist/app/assets/{index.es198-DfxzS6Rs.js → index.es185-DfxzS6Rs.js} +0 -0
  149. /package/dist/app/assets/{index.es199-SKMF96pI.js → index.es186-SKMF96pI.js} +0 -0
  150. /package/dist/app/assets/{index.es200-ajMbGru0.js → index.es187-ajMbGru0.js} +0 -0
  151. /package/dist/app/assets/{index.es201--30QC5Em.js → index.es188--30QC5Em.js} +0 -0
  152. /package/dist/app/assets/{index.es204-B430Bg39.js → index.es191-B430Bg39.js} +0 -0
  153. /package/dist/app/assets/{index.es208-CM8KxXT1.js → index.es195-CM8KxXT1.js} +0 -0
  154. /package/dist/app/assets/{index.es209-B1SYOhNW.js → index.es196-B1SYOhNW.js} +0 -0
  155. /package/dist/app/assets/{index.es211-DkBy-JyN.js → index.es198-DkBy-JyN.js} +0 -0
  156. /package/dist/app/assets/{index.es215-BILxekzW.js → index.es202-BILxekzW.js} +0 -0
  157. /package/dist/app/assets/{index.es216-C5wWYbrZ.js → index.es203-C5wWYbrZ.js} +0 -0
  158. /package/dist/app/assets/{index.es217-HzYwdGDm.js → index.es204-HzYwdGDm.js} +0 -0
  159. /package/dist/app/assets/{index.es218-T-Tgc4AT.js → index.es205-T-Tgc4AT.js} +0 -0
  160. /package/dist/app/assets/{index.es219-ifBTmRxC.js → index.es206-ifBTmRxC.js} +0 -0
  161. /package/dist/app/assets/{index.es224-BMj5Y0dO.js → index.es211-BMj5Y0dO.js} +0 -0
  162. /package/dist/app/assets/{index.es226-BjABl1g7.js → index.es213-BjABl1g7.js} +0 -0
  163. /package/dist/app/assets/{index.es227-xI-RfyKK.js → index.es214-xI-RfyKK.js} +0 -0
  164. /package/dist/app/assets/{index.es228-ySlJ1b_l.js → index.es215-ySlJ1b_l.js} +0 -0
  165. /package/dist/app/assets/{index.es231-BQoSv7ci.js → index.es218-BQoSv7ci.js} +0 -0
  166. /package/dist/app/assets/{index.es232-w8dY5SsB.js → index.es219-w8dY5SsB.js} +0 -0
  167. /package/dist/app/assets/{index.es233-TU54ms6u.js → index.es220-TU54ms6u.js} +0 -0
  168. /package/dist/app/assets/{index.es234-DREVFZK8.js → index.es221-DREVFZK8.js} +0 -0
  169. /package/dist/app/assets/{index.es235-BfivnA6A.js → index.es222-BfivnA6A.js} +0 -0
  170. /package/dist/app/assets/{index.es236-P4WzXJd0.js → index.es223-P4WzXJd0.js} +0 -0
  171. /package/dist/app/assets/{index.es237-BAng5TT0.js → index.es224-BAng5TT0.js} +0 -0
  172. /package/dist/app/assets/{index.es239-B5lbUyaz.js → index.es226-B5lbUyaz.js} +0 -0
  173. /package/dist/app/assets/{index.es240-mebxcVVE.js → index.es227-mebxcVVE.js} +0 -0
  174. /package/dist/app/assets/{index.es242-XBlWyCtg.js → index.es229-XBlWyCtg.js} +0 -0
  175. /package/dist/app/assets/{index.es243-BfCpw3nA.js → index.es230-BfCpw3nA.js} +0 -0
  176. /package/dist/app/assets/{index.es245-Cc5clBb7.js → index.es232-Cc5clBb7.js} +0 -0
  177. /package/dist/app/assets/{index.es246-IuBKFhSY.js → index.es233-IuBKFhSY.js} +0 -0
  178. /package/dist/app/assets/{index.es248-Du5NY7AG.js → index.es235-Du5NY7AG.js} +0 -0
  179. /package/dist/app/assets/{index.es249-Bvotw-X0.js → index.es236-Bvotw-X0.js} +0 -0
  180. /package/dist/app/assets/{index.es250-UIAJJxZW.js → index.es237-UIAJJxZW.js} +0 -0
  181. /package/dist/app/assets/{index.es252-D9-PGadD.js → index.es239-D9-PGadD.js} +0 -0
  182. /package/dist/app/assets/{index.es254-sdHcTMYB.js → index.es241-sdHcTMYB.js} +0 -0
  183. /package/dist/app/assets/{index.es255-Ci6OQyBP.js → index.es242-Ci6OQyBP.js} +0 -0
  184. /package/dist/app/assets/{index.es256-BC5c_5Pe.js → index.es243-BC5c_5Pe.js} +0 -0
  185. /package/dist/app/assets/{index.es257-Tz6hzZYG.js → index.es244-Tz6hzZYG.js} +0 -0
  186. /package/dist/app/assets/{index.es258-DB_GagMm.js → index.es245-DB_GagMm.js} +0 -0
  187. /package/dist/app/assets/{index.es259-DLbgOhZU.js → index.es246-DLbgOhZU.js} +0 -0
  188. /package/dist/app/assets/{index.es260-B0XVJmRM.js → index.es247-B0XVJmRM.js} +0 -0
  189. /package/dist/app/assets/{index.es263-shcSOmrb.js → index.es250-shcSOmrb.js} +0 -0
  190. /package/dist/app/assets/{index.es264-D4Tzg5kh.js → index.es251-D4Tzg5kh.js} +0 -0
  191. /package/dist/app/assets/{index.es265-Deuh7S70.js → index.es252-Deuh7S70.js} +0 -0
  192. /package/dist/app/assets/{index.es266-BUEGK8hf.js → index.es253-BUEGK8hf.js} +0 -0
  193. /package/dist/app/assets/{index.es267-BNioltXt.js → index.es254-BNioltXt.js} +0 -0
  194. /package/dist/app/assets/{index.es268-JqZropPD.js → index.es255-JqZropPD.js} +0 -0
  195. /package/dist/app/assets/{index.es271-LKU2TuZ1.js → index.es258-LKU2TuZ1.js} +0 -0
  196. /package/dist/app/assets/{index.es272-BFLt1xDp.js → index.es259-BFLt1xDp.js} +0 -0
  197. /package/dist/app/assets/{index.es273-DKykz6zU.js → index.es260-DKykz6zU.js} +0 -0
  198. /package/dist/app/assets/{index.es274-B3ZDOciz.js → index.es261-B3ZDOciz.js} +0 -0
  199. /package/dist/app/assets/{index.es275-CSHBycmS.js → index.es262-CSHBycmS.js} +0 -0
  200. /package/dist/app/assets/{index.es276-BIEUsx6d.js → index.es263-BIEUsx6d.js} +0 -0
  201. /package/dist/app/assets/{index.es277-B48N-Iqd.js → index.es264-B48N-Iqd.js} +0 -0
  202. /package/dist/app/assets/{index.es278-BY-TUvya.js → index.es265-BY-TUvya.js} +0 -0
  203. /package/dist/app/assets/{index.es279-zocC4JxJ.js → index.es266-zocC4JxJ.js} +0 -0
  204. /package/dist/app/assets/{index.es281-Cza_XSSt.js → index.es268-Cza_XSSt.js} +0 -0
  205. /package/dist/app/assets/{index.es282-Bg-kzb6g.js → index.es269-Bg-kzb6g.js} +0 -0
  206. /package/dist/app/assets/{index.es283-DhUJRlN_.js → index.es270-DhUJRlN_.js} +0 -0
  207. /package/dist/app/assets/{index.es285-C8lEn-DE.js → index.es272-C8lEn-DE.js} +0 -0
  208. /package/dist/app/assets/{index.es286-DhMKtDLN.js → index.es273-DhMKtDLN.js} +0 -0
  209. /package/dist/app/assets/{index.es287-CwjWoCRV.js → index.es274-CwjWoCRV.js} +0 -0
  210. /package/dist/app/assets/{index.es288-CzouJOBO.js → index.es275-CzouJOBO.js} +0 -0
  211. /package/dist/app/assets/{index.es289-B1bQXN8T.js → index.es276-B1bQXN8T.js} +0 -0
  212. /package/dist/app/assets/{index.es291-5LuOXUq_.js → index.es278-5LuOXUq_.js} +0 -0
  213. /package/dist/app/assets/{index.es292-DWJ3fJO_.js → index.es279-DWJ3fJO_.js} +0 -0
  214. /package/dist/app/assets/{index.es293-DJlmqQ1C.js → index.es280-DJlmqQ1C.js} +0 -0
  215. /package/dist/app/assets/{index.es294-QhoSD0DR.js → index.es281-QhoSD0DR.js} +0 -0
  216. /package/dist/app/assets/{index.es297-Be6lgOlo.js → index.es284-Be6lgOlo.js} +0 -0
  217. /package/dist/app/assets/{index.es299-BJ4Li9vH.js → index.es286-BJ4Li9vH.js} +0 -0
  218. /package/dist/app/assets/{index.es300-DQVVAn-B.js → index.es287-DQVVAn-B.js} +0 -0
  219. /package/dist/app/assets/{index.es301-BJGe-b2p.js → index.es288-BJGe-b2p.js} +0 -0
  220. /package/dist/app/assets/{index.es303-BLhTXw86.js → index.es290-BLhTXw86.js} +0 -0
  221. /package/dist/app/assets/{index.es305-atvbtKCR.js → index.es292-atvbtKCR.js} +0 -0
  222. /package/dist/app/assets/{index.es307-DkLiglaE.js → index.es294-DkLiglaE.js} +0 -0
  223. /package/dist/app/assets/{index.es308-C1w2a3ep.js → index.es295-C1w2a3ep.js} +0 -0
  224. /package/dist/app/assets/{index.es311-Cf8iN4DR.js → index.es298-Cf8iN4DR.js} +0 -0
  225. /package/dist/app/assets/{index.es312-COK4E0Yg.js → index.es299-COK4E0Yg.js} +0 -0
  226. /package/dist/app/assets/{index.es313-BknIz3MU.js → index.es300-BknIz3MU.js} +0 -0
  227. /package/dist/app/assets/{index.es315-BeQkCIfX.js → index.es302-BeQkCIfX.js} +0 -0
  228. /package/dist/app/assets/{index.es317-BSxZ-RaX.js → index.es304-BSxZ-RaX.js} +0 -0
  229. /package/dist/app/assets/{index.es318-C7L56vO4.js → index.es305-C7L56vO4.js} +0 -0
  230. /package/dist/app/assets/{index.es319-CUnW07Te.js → index.es306-CUnW07Te.js} +0 -0
  231. /package/dist/app/assets/{index.es320-C1XDQQGZ.js → index.es307-C1XDQQGZ.js} +0 -0
  232. /package/dist/app/assets/{index.es321-CQjiPCtT.js → index.es308-CQjiPCtT.js} +0 -0
  233. /package/dist/app/assets/{index.es322-DQ1-QYvQ.js → index.es309-DQ1-QYvQ.js} +0 -0
  234. /package/dist/app/assets/{index.es324-BbSNqyBO.js → index.es311-BbSNqyBO.js} +0 -0
  235. /package/dist/app/assets/{index.es326-CB2ApiWb.js → index.es313-CB2ApiWb.js} +0 -0
  236. /package/dist/app/assets/{index.es328-B_m7g4N7.js → index.es315-B_m7g4N7.js} +0 -0
  237. /package/dist/app/assets/{index.es329-B6W0miNI.js → index.es316-B6W0miNI.js} +0 -0
  238. /package/dist/app/assets/{index.es330-BMR_PYu6.js → index.es317-BMR_PYu6.js} +0 -0
  239. /package/dist/app/assets/{index.es332-Dj6nwHGl.js → index.es319-Dj6nwHGl.js} +0 -0
  240. /package/dist/app/assets/{index.es333-BpWG_bgh.js → index.es320-BpWG_bgh.js} +0 -0
  241. /package/dist/app/assets/{index.es334-BVUVsWT6.js → index.es321-BVUVsWT6.js} +0 -0
  242. /package/dist/app/assets/{index.es335-CAQ2eGtk.js → index.es322-CAQ2eGtk.js} +0 -0
  243. /package/dist/app/assets/{index.es336-BFOHcciG.js → index.es323-BFOHcciG.js} +0 -0
  244. /package/dist/app/assets/{index.es337-CdO5JTpU.js → index.es324-CdO5JTpU.js} +0 -0
  245. /package/dist/app/assets/{index.es338-CJaU5se_.js → index.es325-CJaU5se_.js} +0 -0
  246. /package/dist/app/assets/{index.es339-DYoNaHQp.js → index.es326-DYoNaHQp.js} +0 -0
  247. /package/dist/app/assets/{index.es340-m4uW47V2.js → index.es327-m4uW47V2.js} +0 -0
  248. /package/dist/app/assets/{index.es343-nyqBNV6O.js → index.es330-nyqBNV6O.js} +0 -0
  249. /package/dist/app/assets/{index.es344-C6j12Q_x.js → index.es331-C6j12Q_x.js} +0 -0
  250. /package/dist/app/assets/{index.es345-7A4Fjokl.js → index.es332-7A4Fjokl.js} +0 -0
  251. /package/dist/app/assets/{index.es346-CB0Krxn9.js → index.es333-CB0Krxn9.js} +0 -0
  252. /package/dist/app/assets/{index.es347-DCE3LsBG.js → index.es334-DCE3LsBG.js} +0 -0
  253. /package/dist/app/assets/{index.es348-C3FkfJm5.js → index.es335-C3FkfJm5.js} +0 -0
  254. /package/dist/app/assets/{index.es351-CVw76BM1.js → index.es338-CVw76BM1.js} +0 -0
  255. /package/dist/app/assets/{index.es352-HnGAYVZD.js → index.es339-HnGAYVZD.js} +0 -0
  256. /package/dist/app/assets/{index.es353-BVz_zdnA.js → index.es340-BVz_zdnA.js} +0 -0
  257. /package/dist/app/assets/{index.es354-C3khCPGq.js → index.es341-C3khCPGq.js} +0 -0
  258. /package/dist/app/assets/{index.es355-D-2ljcwZ.js → index.es342-D-2ljcwZ.js} +0 -0
  259. /package/dist/app/assets/{index.es356-Cv9koXgw.js → index.es343-Cv9koXgw.js} +0 -0
  260. /package/dist/app/assets/{index.es357-CD_QflpE.js → index.es344-CD_QflpE.js} +0 -0
  261. /package/dist/app/assets/{index.es358-DRW-0cLl.js → index.es345-DRW-0cLl.js} +0 -0
  262. /package/dist/app/assets/{index.es359-C-_shW-Y.js → index.es346-C-_shW-Y.js} +0 -0
  263. /package/dist/app/assets/{index.es360-LGGdnPYs.js → index.es347-LGGdnPYs.js} +0 -0
  264. /package/dist/app/assets/{index.es361-C3mMm8J8.js → index.es348-C3mMm8J8.js} +0 -0
  265. /package/dist/app/assets/{index.es362-BzJJZx-M.js → index.es349-BzJJZx-M.js} +0 -0
  266. /package/dist/app/assets/{index.es363-BXkSAIEj.js → index.es350-BXkSAIEj.js} +0 -0
  267. /package/dist/app/assets/{index.es364-BgDCqdQA.js → index.es351-BgDCqdQA.js} +0 -0
  268. /package/dist/app/assets/{index.es365-C8M2exoo.js → index.es352-C8M2exoo.js} +0 -0
  269. /package/dist/app/assets/{index.es366-DHJKELXO.js → index.es353-DHJKELXO.js} +0 -0
  270. /package/dist/app/assets/{index.es367-Cuk6v7N8.js → index.es354-Cuk6v7N8.js} +0 -0
  271. /package/dist/app/assets/{index.es368-DH5Ifo-i.js → index.es355-DH5Ifo-i.js} +0 -0
  272. /package/dist/app/assets/{index.es369-E3gJ1_iC.js → index.es356-E3gJ1_iC.js} +0 -0
  273. /package/dist/app/assets/{index.es370-DAi9KRSo.js → index.es357-DAi9KRSo.js} +0 -0
  274. /package/dist/app/assets/{index.es371-D7oLnXFd.js → index.es358-D7oLnXFd.js} +0 -0
  275. /package/dist/app/assets/{index.es372-BfjtVDDH.js → index.es359-BfjtVDDH.js} +0 -0
  276. /package/dist/app/assets/{index.es373-DnULxvSX.js → index.es360-DnULxvSX.js} +0 -0
  277. /package/dist/app/assets/{index.es374-CkXjmgJE.js → index.es361-CkXjmgJE.js} +0 -0
  278. /package/dist/app/assets/{index.es375-CfQXZHmo.js → index.es362-CfQXZHmo.js} +0 -0
  279. /package/dist/app/assets/{index.es376-DWedfzmr.js → index.es363-DWedfzmr.js} +0 -0
  280. /package/dist/app/assets/{index.es377-DUszq2jm.js → index.es364-DUszq2jm.js} +0 -0
  281. /package/dist/app/assets/{index.es378-B7mTdjB0.js → index.es365-B7mTdjB0.js} +0 -0
  282. /package/dist/app/assets/{index.es379-D5KoaKCx.js → index.es366-D5KoaKCx.js} +0 -0
  283. /package/dist/app/assets/{index.es380-BfHTSMKl.js → index.es367-BfHTSMKl.js} +0 -0
  284. /package/dist/app/assets/{index.es381-B0m2ddpp.js → index.es368-B0m2ddpp.js} +0 -0
  285. /package/dist/app/assets/{index.es382-CyktbL80.js → index.es369-CyktbL80.js} +0 -0
  286. /package/dist/app/assets/{index.es383-Csfq5Kiy.js → index.es370-Csfq5Kiy.js} +0 -0
  287. /package/dist/app/assets/{index.es384-CafNBF8u.js → index.es371-CafNBF8u.js} +0 -0
  288. /package/dist/app/assets/{index.es385-CTRr51gU.js → index.es372-CTRr51gU.js} +0 -0
  289. /package/dist/app/assets/{index.es386-D4h5O-jR.js → index.es373-D4h5O-jR.js} +0 -0
  290. /package/dist/app/assets/{index.es387-C39BiMTA.js → index.es374-C39BiMTA.js} +0 -0
  291. /package/dist/app/assets/{index.es388-Ddv68eIx.js → index.es375-Ddv68eIx.js} +0 -0
  292. /package/dist/app/assets/{index.es389-GBQ2dnAY.js → index.es376-GBQ2dnAY.js} +0 -0
  293. /package/dist/app/assets/{index.es390-PoHY5YXO.js → index.es377-PoHY5YXO.js} +0 -0
  294. /package/dist/app/assets/{index.es391-3e1v2bzS.js → index.es378-3e1v2bzS.js} +0 -0
  295. /package/dist/app/assets/{index.es392-CS3Unz2-.js → index.es379-CS3Unz2-.js} +0 -0
  296. /package/dist/app/assets/{index.es393-bN70gL4F.js → index.es380-bN70gL4F.js} +0 -0
  297. /package/dist/app/assets/{index.es394-CmCqftbK.js → index.es381-CmCqftbK.js} +0 -0
  298. /package/dist/app/assets/{index.es395-Ds-gbosJ.js → index.es382-Ds-gbosJ.js} +0 -0
  299. /package/dist/app/assets/{index.es396-CjDtw9vr.js → index.es383-CjDtw9vr.js} +0 -0
  300. /package/dist/app/assets/{index.es397-BthQWCQV.js → index.es384-BthQWCQV.js} +0 -0
  301. /package/dist/app/assets/{index.es398-DqwNpetd.js → index.es385-DqwNpetd.js} +0 -0
  302. /package/dist/app/assets/{index.es399-Bw305WKR.js → index.es386-Bw305WKR.js} +0 -0
  303. /package/dist/app/assets/{index.es400-DXbdFlpD.js → index.es387-DXbdFlpD.js} +0 -0
  304. /package/dist/app/assets/{index.es401-L9t79GZl.js → index.es388-L9t79GZl.js} +0 -0
  305. /package/dist/app/assets/{index.es402-CbfX1IO0.js → index.es389-CbfX1IO0.js} +0 -0
  306. /package/dist/app/assets/{index.es403-DBQeEorK.js → index.es390-DBQeEorK.js} +0 -0
  307. /package/dist/app/assets/{index.es404-BEBZ7ncR.js → index.es391-BEBZ7ncR.js} +0 -0
  308. /package/dist/app/assets/{index.es405-Bkuqu6BP.js → index.es392-Bkuqu6BP.js} +0 -0
  309. /package/dist/app/assets/{index.es406-D0r3Knsf.js → index.es393-D0r3Knsf.js} +0 -0
  310. /package/dist/app/assets/{index.es407-CVO1_9PV.js → index.es394-CVO1_9PV.js} +0 -0
@@ -4,16 +4,19 @@ import { PostgresConnection } from "@malloydata/db-postgres";
4
4
  import { SnowflakeConnection } from "@malloydata/db-snowflake";
5
5
  import { TrinoConnection } from "@malloydata/db-trino";
6
6
  import { Connection } from "@malloydata/malloy";
7
+ import { BadRequestError } from "../errors";
8
+ import { logAxiosError, logger } from "../logger";
7
9
  import { BaseConnection } from "@malloydata/malloy/connection";
8
10
  import fs from "fs/promises";
9
11
  import path from "path";
10
12
  import { v4 as uuidv4 } from "uuid";
11
13
  import { components } from "../api";
12
- import { CONNECTIONS_MANIFEST_NAME } from "../constants";
13
- import { logger } from "../logger";
14
+ import { CONNECTIONS_MANIFEST_NAME, TEMP_DIR_PATH } from "../constants";
15
+ import { AxiosError } from "axios";
14
16
 
15
17
  type ApiConnection = components["schemas"]["Connection"];
16
18
  type ApiConnectionAttributes = components["schemas"]["ConnectionAttributes"];
19
+ type ApiConnectionStatus = components["schemas"]["ConnectionStatus"];
17
20
 
18
21
  // Extends the public API connection with the internal connection objects
19
22
  // which contains passwords and connection strings.
@@ -53,16 +56,26 @@ export async function createConnections(
53
56
  const connectionMap = new Map<string, BaseConnection>();
54
57
  const connectionConfig = await readConnectionConfig(basePath);
55
58
 
56
- for (const connection of [...defaultConnections, ...connectionConfig]) {
59
+ const allConnections = [...defaultConnections, ...connectionConfig];
60
+
61
+ const processedConnections = new Set<string>();
62
+ const apiConnections: InternalConnection[] = [];
63
+
64
+ for (const connection of allConnections) {
65
+ if (connection.name && processedConnections.has(connection.name)) {
66
+ continue;
67
+ }
68
+
57
69
  logger.info(`Adding connection ${connection.name}`, {
58
70
  connection,
59
71
  });
60
- // This case shouldn't happen. The package validation logic should
61
- // catch it.
72
+
62
73
  if (!connection.name) {
63
74
  throw "Invalid connection configuration. No name.";
64
75
  }
65
76
 
77
+ processedConnections.add(connection.name);
78
+
66
79
  switch (connection.type) {
67
80
  case "postgres": {
68
81
  const configReader = async () => {
@@ -119,7 +132,7 @@ export async function createConnections(
119
132
  let serviceAccountKeyPath = undefined;
120
133
  if (connection.bigqueryConnection.serviceAccountKeyJson) {
121
134
  serviceAccountKeyPath = path.join(
122
- "/tmp",
135
+ TEMP_DIR_PATH,
123
136
  `${connection.name}-${uuidv4()}-service-account-key.json`,
124
137
  );
125
138
  await fs.writeFile(
@@ -218,11 +231,14 @@ export async function createConnections(
218
231
  throw new Error(`Unsupported connection type: ${connection.type}`);
219
232
  }
220
233
  }
234
+
235
+ // Add the connection to apiConnections (this will be sanitized when returned)
236
+ apiConnections.push(connection);
221
237
  }
222
238
 
223
239
  return {
224
240
  malloyConnections: connectionMap,
225
- apiConnections: connectionConfig,
241
+ apiConnections: apiConnections,
226
242
  };
227
243
  }
228
244
 
@@ -242,3 +258,257 @@ function getConnectionAttributes(
242
258
  canStream: canStream,
243
259
  };
244
260
  }
261
+
262
+ export async function testConnectionConfig(
263
+ connectionConfig: ApiConnection,
264
+ ): Promise<ApiConnectionStatus> {
265
+ let testResult: { status: "ok" | "failed"; errorMessage?: string };
266
+
267
+ switch (connectionConfig.type) {
268
+ case "postgres": {
269
+ if (!connectionConfig.postgresConnection) {
270
+ throw new Error(
271
+ "Invalid connection configuration. No postgres connection.",
272
+ );
273
+ }
274
+
275
+ const postgresConfig = connectionConfig.postgresConnection;
276
+ if (
277
+ !postgresConfig.host ||
278
+ !postgresConfig.port ||
279
+ !postgresConfig.userName ||
280
+ !postgresConfig.password ||
281
+ !postgresConfig.databaseName
282
+ ) {
283
+ throw new Error(
284
+ "PostgreSQL connection requires: host, port, userName, password, and databaseName",
285
+ );
286
+ }
287
+
288
+ const configReader = async () => {
289
+ return {
290
+ host: postgresConfig.host,
291
+ port: postgresConfig.port,
292
+ username: postgresConfig.userName,
293
+ password: postgresConfig.password,
294
+ databaseName: postgresConfig.databaseName,
295
+ connectionString: postgresConfig.connectionString,
296
+ };
297
+ };
298
+
299
+ const postgresConnection = new PostgresConnection(
300
+ "testConnection",
301
+ () => ({}),
302
+ configReader,
303
+ );
304
+
305
+ try {
306
+ await postgresConnection.test();
307
+ testResult = { status: "ok" };
308
+ } catch (error) {
309
+ if (error instanceof AxiosError) {
310
+ logAxiosError(error);
311
+ } else {
312
+ logger.error(error);
313
+ }
314
+ testResult = {
315
+ status: "failed",
316
+ errorMessage: (error as Error).message,
317
+ };
318
+ }
319
+ break;
320
+ }
321
+
322
+ case "snowflake": {
323
+ if (!connectionConfig.snowflakeConnection) {
324
+ throw new Error(
325
+ "Invalid connection configuration. No snowflake connection.",
326
+ );
327
+ }
328
+
329
+ const snowflakeConfig = connectionConfig.snowflakeConnection;
330
+ if (
331
+ !snowflakeConfig.account ||
332
+ !snowflakeConfig.username ||
333
+ !snowflakeConfig.password ||
334
+ !snowflakeConfig.warehouse ||
335
+ !snowflakeConfig.database ||
336
+ !snowflakeConfig.schema
337
+ ) {
338
+ throw new Error(
339
+ "Snowflake connection requires: account, username, password, warehouse, database, and schema",
340
+ );
341
+ }
342
+
343
+ const snowflakeConnectionOptions = {
344
+ connOptions: {
345
+ account: snowflakeConfig.account,
346
+ username: snowflakeConfig.username,
347
+ password: snowflakeConfig.password,
348
+ warehouse: snowflakeConfig.warehouse,
349
+ database: snowflakeConfig.database,
350
+ schema: snowflakeConfig.schema,
351
+ timeout: snowflakeConfig.responseTimeoutMilliseconds,
352
+ },
353
+ };
354
+ const snowflakeConnection = new SnowflakeConnection(
355
+ "testConnection",
356
+ snowflakeConnectionOptions,
357
+ );
358
+
359
+ try {
360
+ await snowflakeConnection.test();
361
+ testResult = { status: "ok" };
362
+ } catch (error) {
363
+ if (error instanceof AxiosError) {
364
+ logAxiosError(error);
365
+ } else {
366
+ logger.error(error);
367
+ }
368
+ testResult = {
369
+ status: "failed",
370
+ errorMessage: (error as Error).message,
371
+ };
372
+ }
373
+ break;
374
+ }
375
+
376
+ case "bigquery": {
377
+ if (!connectionConfig.bigqueryConnection) {
378
+ throw new Error(
379
+ "Invalid connection configuration. No bigquery connection.",
380
+ );
381
+ }
382
+
383
+ const bigqueryConfig = connectionConfig.bigqueryConnection;
384
+ if (
385
+ !bigqueryConfig.serviceAccountKeyJson ||
386
+ !bigqueryConfig.defaultProjectId
387
+ ) {
388
+ throw new Error(
389
+ "BigQuery connection requires: serviceAccountKeyJson and defaultProjectId",
390
+ );
391
+ }
392
+
393
+ const serviceAccountKeyPath = path.join(
394
+ TEMP_DIR_PATH,
395
+ `test-${uuidv4()}-service-account-key.json`,
396
+ );
397
+
398
+ try {
399
+ await fs.writeFile(
400
+ serviceAccountKeyPath,
401
+ connectionConfig.bigqueryConnection
402
+ .serviceAccountKeyJson as string,
403
+ );
404
+
405
+ const bigqueryConnectionOptions = {
406
+ projectId: connectionConfig.bigqueryConnection.defaultProjectId,
407
+ serviceAccountKeyPath: serviceAccountKeyPath,
408
+ location: connectionConfig.bigqueryConnection.location,
409
+ maximumBytesBilled:
410
+ connectionConfig.bigqueryConnection.maximumBytesBilled,
411
+ timeoutMs:
412
+ connectionConfig.bigqueryConnection.queryTimeoutMilliseconds,
413
+ billingProjectId:
414
+ connectionConfig.bigqueryConnection.billingProjectId,
415
+ };
416
+ const bigqueryConnection = new BigQueryConnection(
417
+ "testConnection",
418
+ () => ({}),
419
+ bigqueryConnectionOptions,
420
+ );
421
+
422
+ await bigqueryConnection.test();
423
+ testResult = { status: "ok" };
424
+ } catch (error) {
425
+ if (error instanceof AxiosError) {
426
+ logAxiosError(error);
427
+ } else {
428
+ logger.error(error);
429
+ }
430
+ testResult = {
431
+ status: "failed",
432
+ errorMessage: (error as Error).message,
433
+ };
434
+ } finally {
435
+ try {
436
+ await fs.unlink(serviceAccountKeyPath);
437
+ } catch (cleanupError) {
438
+ logger.warn(
439
+ `Failed to cleanup temporary file ${serviceAccountKeyPath}:`,
440
+ cleanupError,
441
+ );
442
+ }
443
+ }
444
+ break;
445
+ }
446
+
447
+ case "trino": {
448
+ if (!connectionConfig.trinoConnection) {
449
+ throw new Error("Trino connection configuration is missing.");
450
+ }
451
+
452
+ const trinoConfig = connectionConfig.trinoConnection;
453
+ if (
454
+ !trinoConfig.server ||
455
+ !trinoConfig.port ||
456
+ !trinoConfig.catalog ||
457
+ !trinoConfig.schema ||
458
+ !trinoConfig.user ||
459
+ !trinoConfig.password
460
+ ) {
461
+ throw new Error(
462
+ "Trino connection requires: server, port, catalog, schema, user, and password",
463
+ );
464
+ }
465
+
466
+ const trinoConnectionOptions = {
467
+ server: trinoConfig.server,
468
+ port: trinoConfig.port,
469
+ catalog: trinoConfig.catalog,
470
+ schema: trinoConfig.schema,
471
+ user: trinoConfig.user,
472
+ password: trinoConfig.password,
473
+ };
474
+ const trinoConnection = new TrinoConnection(
475
+ "testConnection",
476
+ {},
477
+ trinoConnectionOptions,
478
+ );
479
+
480
+ try {
481
+ await trinoConnection.test();
482
+ testResult = { status: "ok" };
483
+ } catch (error) {
484
+ if (error instanceof AxiosError) {
485
+ logAxiosError(error);
486
+ } else {
487
+ logger.error(error);
488
+ }
489
+ testResult = {
490
+ status: "failed",
491
+ errorMessage: (error as Error).message,
492
+ };
493
+ }
494
+ break;
495
+ }
496
+
497
+ default:
498
+ throw new BadRequestError(
499
+ `Unsupported connection type: ${connectionConfig.type}`,
500
+ );
501
+ }
502
+
503
+ if (testResult.status === "failed") {
504
+ return {
505
+ status: "failed",
506
+ errorMessage: testResult.errorMessage || "Connection test failed",
507
+ };
508
+ }
509
+
510
+ return {
511
+ status: "ok",
512
+ errorMessage: "",
513
+ };
514
+ }
@@ -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(