@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
@@ -1,14 +1,23 @@
1
1
  import { GetObjectCommand, S3 } from "@aws-sdk/client-s3";
2
2
  import { Storage } from "@google-cloud/storage";
3
+ import AdmZip from "adm-zip";
3
4
  import * as fs from "fs";
4
5
  import * as path from "path";
5
- import AdmZip from "adm-zip";
6
6
  import simpleGit from "simple-git";
7
7
  import { Writable } from "stream";
8
8
  import { components } from "../api";
9
9
  import { getPublisherConfig, isPublisherConfigFrozen } from "../config";
10
- import { API_PREFIX, PUBLISHER_CONFIG_NAME, publisherPath } from "../constants";
11
- import { FrozenConfigError, ProjectNotFoundError } from "../errors";
10
+ import {
11
+ API_PREFIX,
12
+ CONNECTIONS_MANIFEST_NAME,
13
+ PUBLISHER_CONFIG_NAME,
14
+ publisherPath,
15
+ } from "../constants";
16
+ import {
17
+ FrozenConfigError,
18
+ PackageNotFoundError,
19
+ ProjectNotFoundError,
20
+ } from "../errors";
12
21
  import { logger } from "../logger";
13
22
  import { Project } from "./project";
14
23
  type ApiProject = components["schemas"]["Project"];
@@ -18,13 +27,16 @@ export class ProjectStore {
18
27
  private projects: Map<string, Project> = new Map();
19
28
  public publisherConfigIsFrozen: boolean;
20
29
  public finishedInitialization: Promise<void>;
30
+ private isInitialized: boolean = false;
21
31
  private s3Client = new S3({
22
32
  followRegionRedirects: true,
23
33
  });
24
- private gcsClient = new Storage();
34
+ private gcsClient: Storage;
25
35
 
26
36
  constructor(serverRootPath: string) {
27
37
  this.serverRootPath = serverRootPath;
38
+ this.gcsClient = new Storage();
39
+
28
40
  this.finishedInitialization = this.initialize();
29
41
  }
30
42
 
@@ -39,19 +51,19 @@ export class ProjectStore {
39
51
  );
40
52
  logger.info(`Initializing project store.`);
41
53
  await Promise.all(
42
- Object.keys(projectManifest.projects).map(async (projectName) => {
43
- logger.info(`Adding project "${projectName}"`);
44
- const project = await this.addProject(
54
+ projectManifest.projects.map(async (project) => {
55
+ logger.info(`Adding project "${project.name}"`);
56
+ const projectInstance = await this.addProject(
45
57
  {
46
- name: projectName,
47
- resource: `${API_PREFIX}/projects/${projectName}`,
48
- location: projectManifest.projects[projectName],
58
+ name: project.name,
59
+ resource: `${API_PREFIX}/projects/${project.name}`,
49
60
  },
50
61
  true,
51
62
  );
52
- return project.listPackages();
63
+ return projectInstance.listPackages();
53
64
  }),
54
65
  );
66
+ this.isInitialized = true;
55
67
  logger.info(
56
68
  `Project store successfully initialized in ${performance.now() - initialTime}ms`,
57
69
  );
@@ -62,8 +74,10 @@ export class ProjectStore {
62
74
  }
63
75
  }
64
76
 
65
- public async listProjects() {
66
- await this.finishedInitialization;
77
+ public async listProjects(skipInitializationCheck: boolean = false) {
78
+ if (!skipInitializationCheck) {
79
+ await this.finishedInitialization;
80
+ }
67
81
  return Promise.all(
68
82
  Array.from(this.projects.values()).map((project) =>
69
83
  project.serialize(),
@@ -71,6 +85,52 @@ export class ProjectStore {
71
85
  );
72
86
  }
73
87
 
88
+ public async getStatus() {
89
+ const status = {
90
+ timestamp: Date.now(),
91
+ projects: [] as Array<components["schemas"]["Project"]>,
92
+ initialized: this.isInitialized,
93
+ };
94
+
95
+ const projects = await this.listProjects(true);
96
+
97
+ await Promise.all(
98
+ projects.map(async (project) => {
99
+ try {
100
+ const packages = project.packages;
101
+ const connections = project.connections;
102
+
103
+ logger.info(`Project ${project.name} status:`, {
104
+ connectionsCount: project.connections?.length || 0,
105
+ packagesCount: packages?.length || 0,
106
+ });
107
+
108
+ const _connections = connections?.map((connection) => {
109
+ return {
110
+ ...connection,
111
+ attributes: undefined,
112
+ };
113
+ });
114
+
115
+ const _project = {
116
+ ...project,
117
+ connections: _connections,
118
+ };
119
+ project.connections = _connections;
120
+ status.projects.push(_project);
121
+ } catch (error) {
122
+ logger.error("Error listing packages and connections", {
123
+ error,
124
+ });
125
+ throw new Error(
126
+ "Error listing packages and connections: " + error,
127
+ );
128
+ }
129
+ }),
130
+ );
131
+ return status;
132
+ }
133
+
74
134
  public async getProject(
75
135
  projectName: string,
76
136
  reload: boolean = false,
@@ -81,8 +141,11 @@ export class ProjectStore {
81
141
  const projectManifest = await ProjectStore.reloadProjectManifest(
82
142
  this.serverRootPath,
83
143
  );
144
+ const projectConfig = projectManifest.projects.find(
145
+ (p) => p.name === projectName,
146
+ );
84
147
  const projectPath =
85
- project?.metadata.location || projectManifest.projects[projectName];
148
+ project?.metadata.location || projectConfig?.packages[0]?.location;
86
149
  if (!projectPath) {
87
150
  throw new ProjectNotFoundError(
88
151
  `Project "${projectName}" could not be resolved to a path.`,
@@ -111,16 +174,34 @@ export class ProjectStore {
111
174
  if (!projectName) {
112
175
  throw new Error("Project name is required");
113
176
  }
177
+
178
+ // Check if project already exists and update it instead of creating a new one
179
+ const existingProject = this.projects.get(projectName);
180
+ if (existingProject) {
181
+ logger.info(`Project ${projectName} already exists, updating it`);
182
+ const updatedProject = await existingProject.update(project);
183
+ this.projects.set(projectName, updatedProject);
184
+ return updatedProject;
185
+ }
186
+
114
187
  const projectManifest = await ProjectStore.reloadProjectManifest(
115
188
  this.serverRootPath,
116
189
  );
117
- const projectPath =
118
- project.location || projectManifest.projects[projectName];
190
+ const projectConfig = projectManifest.projects.find(
191
+ (p) => p.name === projectName,
192
+ );
193
+
194
+ const hasPackages =
195
+ (project?.packages && project.packages.length > 0) ||
196
+ (projectConfig?.packages && projectConfig.packages.length > 0);
119
197
  let absoluteProjectPath: string;
120
- if (projectPath) {
198
+ if (hasPackages) {
199
+ const packagesToProcess =
200
+ project?.packages || projectConfig?.packages || [];
121
201
  absoluteProjectPath = await this.loadProjectIntoDisk(
122
202
  projectName,
123
- projectPath,
203
+ projectName,
204
+ packagesToProcess,
124
205
  );
125
206
  if (absoluteProjectPath.endsWith(".zip")) {
126
207
  absoluteProjectPath = await this.unzipProject(absoluteProjectPath);
@@ -194,17 +275,31 @@ export class ProjectStore {
194
275
  `Error reading ${PUBLISHER_CONFIG_NAME}. Generating from directory`,
195
276
  { error },
196
277
  );
197
- return { projects: {} };
278
+ return { projects: [] };
198
279
  } else {
199
280
  // If publisher.config.json is missing, generate the manifest from directories
200
281
  try {
201
282
  const entries = await fs.promises.readdir(serverRootPath, {
202
283
  withFileTypes: true,
203
284
  });
204
- const projects: { [key: string]: string } = {};
285
+ const projects: {
286
+ name: string;
287
+ packages: {
288
+ name: string;
289
+ location: string;
290
+ }[];
291
+ }[] = [];
205
292
  for (const entry of entries) {
206
293
  if (entry.isDirectory()) {
207
- projects[entry.name] = entry.name;
294
+ projects.push({
295
+ name: entry.name,
296
+ packages: [
297
+ {
298
+ name: entry.name,
299
+ location: entry.name,
300
+ },
301
+ ],
302
+ });
208
303
  }
209
304
  }
210
305
  return { projects };
@@ -212,7 +307,7 @@ export class ProjectStore {
212
307
  logger.error(`Error listing directories in ${serverRootPath}`, {
213
308
  error: lsError,
214
309
  });
215
- return { projects: {} };
310
+ return { projects: [] };
216
311
  }
217
312
  }
218
313
  }
@@ -234,89 +329,241 @@ export class ProjectStore {
234
329
  return absoluteProjectPath;
235
330
  }
236
331
 
237
- private async loadProjectIntoDisk(projectName: string, projectPath: string) {
238
- const absoluteTargetPath = `${publisherPath}/${projectName}`;
239
- // Handle absolute paths
240
- if (projectPath.startsWith("/") || projectPath.startsWith("./")) {
332
+ private async loadProjectIntoDisk(
333
+ projectName: string,
334
+ projectPath: string,
335
+ packages: ApiProject["packages"],
336
+ ) {
337
+ const absoluteTargetPath = `${publisherPath}/${projectPath}`;
338
+
339
+ if (!packages || packages.length === 0) {
340
+ throw new PackageNotFoundError(
341
+ `No packages found for project ${projectName}`,
342
+ );
343
+ }
344
+
345
+ // Group packages by location to optimize downloads
346
+ const locationGroups = new Map<
347
+ string,
348
+ Array<{ name: string; location: string }>
349
+ >();
350
+
351
+ for (const _package of packages) {
352
+ if (!_package.name) {
353
+ throw new PackageNotFoundError(`Package has no name specified`);
354
+ }
355
+
356
+ if (!_package.location) {
357
+ throw new PackageNotFoundError(
358
+ `Package ${_package.name} has no location specified`,
359
+ );
360
+ }
361
+
362
+ const location = _package.location;
363
+ const packageName = _package.name;
364
+
365
+ if (!locationGroups.has(location)) {
366
+ locationGroups.set(location, []);
367
+ }
368
+ locationGroups.get(location)!.push({ name: packageName, location });
369
+ }
370
+
371
+ // Processing by each unique location
372
+ for (const [location, packagesForLocation] of locationGroups) {
373
+ // Create a temporary directory for the shared download
374
+ const tempDownloadPath = `${absoluteTargetPath}/.temp_${Buffer.from(
375
+ location,
376
+ )
377
+ .toString("base64")
378
+ .replace(/[^a-zA-Z0-9]/g, "")}`;
379
+ await fs.promises.mkdir(tempDownloadPath, { recursive: true });
380
+
241
381
  try {
242
- logger.info(`Mounting local directory at "${projectPath}"`);
243
- await this.mountLocalDirectory(
244
- projectPath,
245
- absoluteTargetPath,
382
+ // Download the entire location once
383
+ await this.downloadOrMountLocation(
384
+ location,
385
+ tempDownloadPath,
246
386
  projectName,
387
+ "shared",
247
388
  );
248
- return absoluteTargetPath;
249
- } catch (error) {
250
- logger.error(`Failed to mount local directory "${projectPath}"`, {
251
- error,
389
+
390
+ // Extract each package from the downloaded content
391
+ for (const _package of packagesForLocation) {
392
+ const packageDir = _package.name;
393
+ const absolutePackagePath = `${absoluteTargetPath}/${packageDir}`;
394
+
395
+ // Check if the package directory exists in the downloaded content
396
+ const packagePathInDownload = path.join(
397
+ tempDownloadPath,
398
+ packageDir,
399
+ );
400
+ const packageExists = await fs.promises
401
+ .access(packagePathInDownload)
402
+ .then(() => true)
403
+ .catch(() => false);
404
+
405
+ if (packageExists) {
406
+ // Copy the specific package directory
407
+ await fs.promises.mkdir(absolutePackagePath, {
408
+ recursive: true,
409
+ });
410
+ await fs.promises.cp(
411
+ packagePathInDownload,
412
+ absolutePackagePath,
413
+ { recursive: true },
414
+ );
415
+ logger.info(
416
+ `Extracted package "${packageDir}" from shared download`,
417
+ );
418
+ } else {
419
+ // If package directory doesn't exist, copy the entire download as the package
420
+ // This handles cases where the location itself is the package
421
+ await fs.promises.mkdir(absolutePackagePath, {
422
+ recursive: true,
423
+ });
424
+ await fs.promises.cp(tempDownloadPath, absolutePackagePath, {
425
+ recursive: true,
426
+ });
427
+ logger.info(
428
+ `Copied entire download as package "${packageDir}"`,
429
+ );
430
+ }
431
+ }
432
+
433
+ const connectionsFileInDownload = path.join(
434
+ tempDownloadPath,
435
+ CONNECTIONS_MANIFEST_NAME,
436
+ );
437
+ const connectionsFileInProject = path.join(
438
+ absoluteTargetPath,
439
+ CONNECTIONS_MANIFEST_NAME,
440
+ );
441
+
442
+ try {
443
+ await fs.promises.access(
444
+ connectionsFileInDownload,
445
+ fs.constants.F_OK,
446
+ );
447
+ await fs.promises.cp(
448
+ connectionsFileInDownload,
449
+ connectionsFileInProject,
450
+ );
451
+ logger.info(
452
+ `Copied ${CONNECTIONS_MANIFEST_NAME} to project directory`,
453
+ );
454
+ } catch (error) {
455
+ console.error(error);
456
+ logger.info(`No ${CONNECTIONS_MANIFEST_NAME} found`);
457
+ }
458
+ } finally {
459
+ // Clean up temporary download directory
460
+ await fs.promises.rm(tempDownloadPath, {
461
+ recursive: true,
462
+ force: true,
252
463
  });
253
- throw error;
254
464
  }
255
465
  }
256
466
 
257
- // Handle GCS URIs
258
- if (projectPath.startsWith("gs://")) {
259
- // Download from GCS
467
+ return absoluteTargetPath;
468
+ }
469
+
470
+ private async downloadOrMountLocation(
471
+ location: string,
472
+ targetPath: string,
473
+ projectName: string,
474
+ packageName: string,
475
+ ) {
476
+ // Handle absolute paths
477
+ if (location.startsWith("/")) {
260
478
  try {
261
479
  logger.info(
262
- `Downloading GCS path "${projectPath}" to "${absoluteTargetPath}"`,
480
+ `Mounting local directory at "${location}" to "${targetPath}"`,
263
481
  );
264
- await this.downloadGcsDirectory(
265
- projectPath,
482
+ await this.mountLocalDirectory(
483
+ location,
484
+ targetPath,
266
485
  projectName,
267
- absoluteTargetPath,
486
+ packageName,
268
487
  );
488
+ return;
269
489
  } catch (error) {
270
- logger.error(`Failed to download GCS path "${projectPath}"`, {
490
+ logger.error(`Failed to mount local directory "${location}"`, {
271
491
  error,
272
492
  });
273
- throw error;
493
+ throw new PackageNotFoundError(
494
+ `Failed to mount local directory: ${location}`,
495
+ );
274
496
  }
275
- return absoluteTargetPath;
276
497
  }
277
498
 
278
- // Handle S3 URIs
279
- if (projectPath.startsWith("s3://")) {
499
+ // Handle GCS paths
500
+ if (location.startsWith("gs://")) {
280
501
  try {
281
- logger.info(`Mounting S3 path "${projectPath}"`);
282
- await this.downloadS3Directory(
283
- projectPath,
284
- projectName,
285
- absoluteTargetPath,
502
+ logger.info(
503
+ `Downloading GCS directory from "${location}" to "${targetPath}"`,
286
504
  );
287
- return absoluteTargetPath;
505
+ await this.downloadGcsDirectory(location, projectName, targetPath);
506
+ return;
288
507
  } catch (error) {
289
- logger.error(`Failed to mount S3 path "${projectPath}"`, { error });
290
- throw error;
508
+ logger.error(`Failed to download GCS directory "${location}"`, {
509
+ error,
510
+ });
511
+ throw new PackageNotFoundError(
512
+ `Failed to download GCS directory: ${location}`,
513
+ );
291
514
  }
292
515
  }
293
516
 
294
- // Handle GitHub URIs
517
+ // Handle GitHub URLs
295
518
  if (
296
- projectPath.startsWith("https://github.com/") ||
297
- projectPath.startsWith("git@")
519
+ location.startsWith("https://github.com/") ||
520
+ location.startsWith("git@")
298
521
  ) {
299
522
  try {
300
- logger.info(`Mounting GitHub path "${projectPath}"`);
301
- await this.downloadGitHubDirectory(projectPath, absoluteTargetPath);
302
- return absoluteTargetPath;
523
+ logger.info(
524
+ `Cloning GitHub repository from "${location}" to "${targetPath}"`,
525
+ );
526
+ await this.downloadGitHubDirectory(location, targetPath);
527
+ return;
528
+ } catch (error) {
529
+ logger.error(`Failed to clone GitHub repository "${location}"`, {
530
+ error,
531
+ });
532
+ throw new PackageNotFoundError(
533
+ `Failed to clone GitHub repository: ${location}`,
534
+ );
535
+ }
536
+ }
537
+
538
+ // Handle S3 paths
539
+ if (location.startsWith("s3://")) {
540
+ try {
541
+ logger.info(
542
+ `Downloading S3 directory from "${location}" to "${targetPath}"`,
543
+ );
544
+ await this.downloadS3Directory(location, projectName, targetPath);
545
+ return;
303
546
  } catch (error) {
304
- logger.error(`Failed to mount GitHub path "${projectPath}"`, {
547
+ logger.error(`Failed to download S3 directory "${location}"`, {
305
548
  error,
306
549
  });
307
- throw error;
550
+ throw new PackageNotFoundError(
551
+ `Failed to download S3 directory: ${location}`,
552
+ );
308
553
  }
309
554
  }
310
555
 
311
- const errorMsg = `Invalid project path: "${projectPath}". Paths must start with "/" or "./" or a GCS/S3/GitHub URI.`;
312
- logger.error(errorMsg, { projectName, projectPath });
313
- throw new ProjectNotFoundError(errorMsg);
556
+ // If we get here, the path format is not supported
557
+ const errorMsg = `Invalid package path: "${location}". Must be an absolute mounted path or a GCS/S3/GitHub URI.`;
558
+ logger.error(errorMsg, { projectName, location });
559
+ throw new PackageNotFoundError(errorMsg);
314
560
  }
315
561
 
316
562
  public async mountLocalDirectory(
317
563
  projectPath: string,
318
564
  absoluteTargetPath: string,
319
565
  projectName: string,
566
+ packageName: string,
320
567
  ) {
321
568
  if (projectPath.endsWith(".zip")) {
322
569
  projectPath = await this.unzipProject(projectPath);
@@ -334,8 +581,8 @@ export class ProjectStore {
334
581
  recursive: true,
335
582
  });
336
583
  } else {
337
- throw new ProjectNotFoundError(
338
- `Project ${projectName} not found in "${projectPath}"`,
584
+ throw new PackageNotFoundError(
585
+ `Package ${packageName} for project ${projectName} not found in "${projectPath}"`,
339
586
  );
340
587
  }
341
588
  }
@@ -3,6 +3,7 @@ import { components } from "../api";
3
3
  import { logger } from "../logger";
4
4
  import { Model } from "./model";
5
5
 
6
+ // @ts-expect-error TODO: Fix missing Source type in API
6
7
  type ApiSource = components["schemas"]["Source"];
7
8
  type ApiView = components["schemas"]["View"];
8
9
  type ApiQuery = components["schemas"]["Query"];
@@ -162,8 +163,8 @@ export class Scheduler {
162
163
 
163
164
  models.forEach((m) => {
164
165
  m.getSources()?.forEach((s) => {
165
- s.views?.forEach((v) => {
166
- v.annotations?.forEach((a) => {
166
+ s.views?.forEach((v: ApiView) => {
167
+ v.annotations?.forEach((a: string) => {
167
168
  if (a.startsWith(SCHEDULE_ANNOTATION)) {
168
169
  schedules.push(new Schedule(m, s, v, undefined, a));
169
170
  }
package/src/utils.ts CHANGED
@@ -11,4 +11,3 @@ export const URL_READER: URLReader = {
11
11
  return fs.promises.readFile(path, "utf8");
12
12
  },
13
13
  };
14
-