@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.
- package/.prettierignore +1 -0
- package/dist/app/api-doc.yaml +36 -4
- package/dist/app/assets/index-D1sQfWlS.js +251 -0
- package/dist/app/assets/{index-DJPvt7yu.js → index-Dg-zTLb3.js} +1 -1
- package/dist/app/assets/{index.es139-nr8meTUp.js → index.es126-CKC26ttZ.js} +1 -1
- package/dist/app/assets/{index.es140-f9ybcYUt.js → index.es127-CBKpWhIe.js} +1 -1
- package/dist/app/assets/{index.es143-BrmH4hWW.js → index.es130-5z_n6lm6.js} +1 -1
- package/dist/app/assets/{index.es148-KJPSzIi5.js → index.es135-aJw1Xr-9.js} +1 -1
- package/dist/app/assets/{index.es156-AslbYSUk.js → index.es143-CAt8G2AV.js} +1 -1
- package/dist/app/assets/{index.es157-CGx9vJCM.js → index.es144-CaWYrbVR.js} +1 -1
- package/dist/app/assets/{index.es160-B4514fRp.js → index.es147-B_4j3qbz.js} +1 -1
- package/dist/app/assets/{index.es164-BdfNgGb4.js → index.es151-Byg3j7QH.js} +1 -1
- package/dist/app/assets/{index.es167-Cytvwvs5.js → index.es154-D8PMiD5x.js} +1 -1
- package/dist/app/assets/{index.es170-BF0Mj3Dj.js → index.es157-qx6EMeW2.js} +1 -1
- package/dist/app/assets/{index.es171-bDBK09mk.js → index.es158-CJWvYXRx.js} +1 -1
- package/dist/app/assets/{index.es185-BECCJjWR.js → index.es172-BamsV9CN.js} +1 -1
- package/dist/app/assets/{index.es186-DORBN8KQ.js → index.es173-CXyGU58j.js} +1 -1
- package/dist/app/assets/{index.es187-C1QXB69O.js → index.es174-C2o3B3o8.js} +1 -1
- package/dist/app/assets/{index.es189-BxZOchW8.js → index.es176-BB-1P5bb.js} +1 -1
- package/dist/app/assets/{index.es194-AsRZMTWT.js → index.es181-2PlTGcYG.js} +1 -1
- package/dist/app/assets/{index.es196-x3jX2idz.js → index.es183-DgoVwe-N.js} +1 -1
- package/dist/app/assets/{index.es197-Dtz8tRxv.js → index.es184-Cmc38osU.js} +1 -1
- package/dist/app/assets/{index.es202-BMtZpqF-.js → index.es189-DuMu0KfI.js} +1 -1
- package/dist/app/assets/{index.es203-gWIQWffw.js → index.es190-C117wYiK.js} +1 -1
- package/dist/app/assets/{index.es205-D7Lk4BX7.js → index.es192-Bm2ZoxNH.js} +1 -1
- package/dist/app/assets/{index.es206-BiJF4jj3.js → index.es193-BBtnt1bZ.js} +1 -1
- package/dist/app/assets/{index.es207-B-UJ_bzC.js → index.es194-CB2Nn3wg.js} +1 -1
- package/dist/app/assets/{index.es210-Cuht9bXE.js → index.es197-D91osx4R.js} +1 -1
- package/dist/app/assets/{index.es212-OHX8E5rN.js → index.es199-BtpESJSS.js} +1 -1
- package/dist/app/assets/{index.es213-ZuPzTQ_g.js → index.es200-BeG9RRw_.js} +1 -1
- package/dist/app/assets/{index.es214-D803Db5p.js → index.es201-k2nuCC3B.js} +1 -1
- package/dist/app/assets/{index.es220-7QoCPP2j.js → index.es207-C2uQegug.js} +1 -1
- package/dist/app/assets/{index.es221-XNqXVFFm.js → index.es208-BTucFWqR.js} +1 -1
- package/dist/app/assets/{index.es222-Cdb4luVg.js → index.es209-4dK47W8o.js} +1 -1
- package/dist/app/assets/{index.es223-CORMGf1M.js → index.es210-DO6X3-kz.js} +1 -1
- package/dist/app/assets/{index.es225-Cq-kOlxp.js → index.es212-CFG-vrrr.js} +1 -1
- package/dist/app/assets/{index.es229-E5IGXk-q.js → index.es216-TWO3Mhor.js} +1 -1
- package/dist/app/assets/{index.es230-Fc3aBcCM.js → index.es217-0tHVUThG.js} +1 -1
- package/dist/app/assets/{index.es238-PSs3scPq.js → index.es225-DHGKCs7a.js} +1 -1
- package/dist/app/assets/{index.es241-CL-_GK9e.js → index.es228-Bz0ZvI5L.js} +1 -1
- package/dist/app/assets/{index.es244-DKPCX9xC.js → index.es231-D1HdFvsl.js} +1 -1
- package/dist/app/assets/{index.es247-BSAYNLHy.js → index.es234-1j9jt1V9.js} +1 -1
- package/dist/app/assets/{index.es251--0-h5QiV.js → index.es238-DBm7c9HR.js} +1 -1
- package/dist/app/assets/{index.es253-BEn9NcoZ.js → index.es240-DCqDESzD.js} +1 -1
- package/dist/app/assets/{index.es261-MjZ_rv4c.js → index.es248-BEYN2dFo.js} +1 -1
- package/dist/app/assets/{index.es262-HBJu6fHJ.js → index.es249-DKdYiZA_.js} +1 -1
- package/dist/app/assets/{index.es269-DLa2GgqN.js → index.es256-CgBAGaDx.js} +1 -1
- package/dist/app/assets/{index.es270-CalwIzIq.js → index.es257-DMI3dJGJ.js} +1 -1
- package/dist/app/assets/{index.es280-BmnnGhn2.js → index.es267-B5ei8o6D.js} +1 -1
- package/dist/app/assets/{index.es284-C2YEYS8h.js → index.es271-DDBsSlrj.js} +1 -1
- package/dist/app/assets/{index.es290-BHjEYaA_.js → index.es277-aI_iYBJv.js} +1 -1
- package/dist/app/assets/{index.es295-CLE8Egbz.js → index.es282-DZQyCurk.js} +1 -1
- package/dist/app/assets/{index.es296-Bsq8yJGD.js → index.es283-DRQxI154.js} +1 -1
- package/dist/app/assets/{index.es298-CTsw_aX6.js → index.es285-DrT3oe3D.js} +1 -1
- package/dist/app/assets/{index.es302-BgJs_s58.js → index.es289-CKYiktdr.js} +1 -1
- package/dist/app/assets/{index.es304-Y67tbm3o.js → index.es291-BRH8qn2R.js} +1 -1
- package/dist/app/assets/{index.es306-Dsx0880i.js → index.es293-B_x7Y2b5.js} +1 -1
- package/dist/app/assets/{index.es309-COa7lSGF.js → index.es296-CMhur-CK.js} +1 -1
- package/dist/app/assets/{index.es310-C11TmHug.js → index.es297-BY9kHC-p.js} +1 -1
- package/dist/app/assets/{index.es314-BExIez_V.js → index.es301-CmwjGLCv.js} +1 -1
- package/dist/app/assets/{index.es316-DFqBRZWD.js → index.es303-BOa5F89I.js} +1 -1
- package/dist/app/assets/{index.es323-BClNDw1H.js → index.es310-BF6kc0UE.js} +1 -1
- package/dist/app/assets/{index.es325-f5hVUVjI.js → index.es312-CoCT5fTV.js} +1 -1
- package/dist/app/assets/{index.es327-DsTyRd6E.js → index.es314-CMYE9lCS.js} +1 -1
- package/dist/app/assets/{index.es331-BLhdwz0E.js → index.es318-C2_Stmju.js} +1 -1
- package/dist/app/assets/{index.es341-oDRBDM86.js → index.es328-DxiHjjdV.js} +1 -1
- package/dist/app/assets/{index.es342-DialnTnH.js → index.es329-D4H4qJV5.js} +1 -1
- package/dist/app/assets/{index.es349-DrBCM5L2.js → index.es336-DMBcHb9l.js} +1 -1
- package/dist/app/assets/{index.es350-B1R-_5vW.js → index.es337-BOcmfyvS.js} +1 -1
- package/dist/app/assets/{index.es50-Dwe0S21o.js → index.es56-C6ktttDI.js} +1 -1
- package/dist/app/assets/mui-UpaxdnvH.js +159 -0
- package/dist/app/index.html +2 -2
- package/dist/instrumentation.js +14 -0
- package/dist/server.js +4862 -1294
- package/eslint.config.mjs +8 -0
- package/package.json +2 -1
- package/publisher.config.json +25 -5
- package/src/config.ts +25 -2
- package/src/constants.ts +21 -5
- package/src/controller/connection.controller.ts +32 -3
- package/src/controller/package.controller.ts +1 -0
- package/src/controller/watch-mode.controller.ts +19 -4
- package/src/data_styles.ts +10 -3
- package/src/mcp/prompts/index.ts +9 -1
- package/src/mcp/resources/package_resource.ts +2 -1
- package/src/mcp/resources/source_resource.ts +1 -0
- package/src/mcp/resources/view_resource.ts +1 -0
- package/src/server.ts +23 -9
- package/src/service/connection.ts +277 -7
- package/src/service/db_utils.ts +3 -2
- package/src/service/model.ts +2 -0
- package/src/service/package.spec.ts +76 -54
- package/src/service/project.ts +159 -44
- package/src/service/project_store.spec.ts +482 -163
- package/src/service/project_store.ts +317 -70
- package/src/service/scheduler.ts +3 -2
- package/src/utils.ts +0 -1
- package/tests/harness/e2e.ts +60 -58
- package/tests/harness/uris.ts +21 -24
- package/tests/integration/mcp/mcp_resource.integration.spec.ts +10 -0
- package/dist/app/assets/index-CwH8v8Pf.js +0 -251
- package/dist/app/assets/mui-Bcj8oDBR.js +0 -161
- /package/dist/app/assets/{index.es128-CG6Dc4jp.js → index.es115-CG6Dc4jp.js} +0 -0
- /package/dist/app/assets/{index.es136-DsBKuouk.js → index.es123-DsBKuouk.js} +0 -0
- /package/dist/app/assets/{index.es137-D_z4Izcz.js → index.es124-D_z4Izcz.js} +0 -0
- /package/dist/app/assets/{index.es138-727ZlQH0.js → index.es125-727ZlQH0.js} +0 -0
- /package/dist/app/assets/{index.es141-Dn00JSTd.js → index.es128-Dn00JSTd.js} +0 -0
- /package/dist/app/assets/{index.es142-COJ4H7py.js → index.es129-COJ4H7py.js} +0 -0
- /package/dist/app/assets/{index.es144-Bu5BbsvL.js → index.es131-Bu5BbsvL.js} +0 -0
- /package/dist/app/assets/{index.es145-7O62HKoU.js → index.es132-7O62HKoU.js} +0 -0
- /package/dist/app/assets/{index.es146-BPT9niGB.js → index.es133-BPT9niGB.js} +0 -0
- /package/dist/app/assets/{index.es147-Dhn9LcZ4.js → index.es134-Dhn9LcZ4.js} +0 -0
- /package/dist/app/assets/{index.es149-eg146-Ew.js → index.es136-eg146-Ew.js} +0 -0
- /package/dist/app/assets/{index.es150-Du268qiB.js → index.es137-Du268qiB.js} +0 -0
- /package/dist/app/assets/{index.es151-fje9CFhw.js → index.es138-fje9CFhw.js} +0 -0
- /package/dist/app/assets/{index.es152-BwXTMy5W.js → index.es139-BwXTMy5W.js} +0 -0
- /package/dist/app/assets/{index.es153-3xVqZejG.js → index.es140-3xVqZejG.js} +0 -0
- /package/dist/app/assets/{index.es154-xW4inM5L.js → index.es141-xW4inM5L.js} +0 -0
- /package/dist/app/assets/{index.es155-DHo0CJ0O.js → index.es142-DHo0CJ0O.js} +0 -0
- /package/dist/app/assets/{index.es158-C3t2pwGQ.js → index.es145-C3t2pwGQ.js} +0 -0
- /package/dist/app/assets/{index.es159-DNquZEk8.js → index.es146-DNquZEk8.js} +0 -0
- /package/dist/app/assets/{index.es161-BHOwM8T6.js → index.es148-BHOwM8T6.js} +0 -0
- /package/dist/app/assets/{index.es162-DxSadP1t.js → index.es149-DxSadP1t.js} +0 -0
- /package/dist/app/assets/{index.es163-DbXoA79R.js → index.es150-DbXoA79R.js} +0 -0
- /package/dist/app/assets/{index.es165-Bp6g37R7.js → index.es152-Bp6g37R7.js} +0 -0
- /package/dist/app/assets/{index.es166-sacFqUAJ.js → index.es153-sacFqUAJ.js} +0 -0
- /package/dist/app/assets/{index.es168-C7gG9l05.js → index.es155-C7gG9l05.js} +0 -0
- /package/dist/app/assets/{index.es169-Dsg_Bt_b.js → index.es156-Dsg_Bt_b.js} +0 -0
- /package/dist/app/assets/{index.es172-D9R-vmeu.js → index.es159-D9R-vmeu.js} +0 -0
- /package/dist/app/assets/{index.es173-BPhBrDlE.js → index.es160-BPhBrDlE.js} +0 -0
- /package/dist/app/assets/{index.es174-C-TU5hQ_.js → index.es161-C-TU5hQ_.js} +0 -0
- /package/dist/app/assets/{index.es175-DtFQj3wx.js → index.es162-DtFQj3wx.js} +0 -0
- /package/dist/app/assets/{index.es176-m2LEI-9-.js → index.es163-m2LEI-9-.js} +0 -0
- /package/dist/app/assets/{index.es177-BoXegm-a.js → index.es164-BoXegm-a.js} +0 -0
- /package/dist/app/assets/{index.es178-B9wLZaAG.js → index.es165-B9wLZaAG.js} +0 -0
- /package/dist/app/assets/{index.es179-ClGRhx96.js → index.es166-ClGRhx96.js} +0 -0
- /package/dist/app/assets/{index.es180-DEIpsLCJ.js → index.es167-DEIpsLCJ.js} +0 -0
- /package/dist/app/assets/{index.es181-BgYniUM_.js → index.es168-BgYniUM_.js} +0 -0
- /package/dist/app/assets/{index.es182-COcR7UxN.js → index.es169-COcR7UxN.js} +0 -0
- /package/dist/app/assets/{index.es183-BjQB5zDj.js → index.es170-BjQB5zDj.js} +0 -0
- /package/dist/app/assets/{index.es184-C-nORZOA.js → index.es171-C-nORZOA.js} +0 -0
- /package/dist/app/assets/{index.es188-BX77sIaO.js → index.es175-BX77sIaO.js} +0 -0
- /package/dist/app/assets/{index.es190-B-DoSBHF.js → index.es177-B-DoSBHF.js} +0 -0
- /package/dist/app/assets/{index.es191-bCA53EVm.js → index.es178-bCA53EVm.js} +0 -0
- /package/dist/app/assets/{index.es192-w-ucz2PV.js → index.es179-w-ucz2PV.js} +0 -0
- /package/dist/app/assets/{index.es193-Dayu4EKP.js → index.es180-Dayu4EKP.js} +0 -0
- /package/dist/app/assets/{index.es195-DKXYxT9g.js → index.es182-DKXYxT9g.js} +0 -0
- /package/dist/app/assets/{index.es198-DfxzS6Rs.js → index.es185-DfxzS6Rs.js} +0 -0
- /package/dist/app/assets/{index.es199-SKMF96pI.js → index.es186-SKMF96pI.js} +0 -0
- /package/dist/app/assets/{index.es200-ajMbGru0.js → index.es187-ajMbGru0.js} +0 -0
- /package/dist/app/assets/{index.es201--30QC5Em.js → index.es188--30QC5Em.js} +0 -0
- /package/dist/app/assets/{index.es204-B430Bg39.js → index.es191-B430Bg39.js} +0 -0
- /package/dist/app/assets/{index.es208-CM8KxXT1.js → index.es195-CM8KxXT1.js} +0 -0
- /package/dist/app/assets/{index.es209-B1SYOhNW.js → index.es196-B1SYOhNW.js} +0 -0
- /package/dist/app/assets/{index.es211-DkBy-JyN.js → index.es198-DkBy-JyN.js} +0 -0
- /package/dist/app/assets/{index.es215-BILxekzW.js → index.es202-BILxekzW.js} +0 -0
- /package/dist/app/assets/{index.es216-C5wWYbrZ.js → index.es203-C5wWYbrZ.js} +0 -0
- /package/dist/app/assets/{index.es217-HzYwdGDm.js → index.es204-HzYwdGDm.js} +0 -0
- /package/dist/app/assets/{index.es218-T-Tgc4AT.js → index.es205-T-Tgc4AT.js} +0 -0
- /package/dist/app/assets/{index.es219-ifBTmRxC.js → index.es206-ifBTmRxC.js} +0 -0
- /package/dist/app/assets/{index.es224-BMj5Y0dO.js → index.es211-BMj5Y0dO.js} +0 -0
- /package/dist/app/assets/{index.es226-BjABl1g7.js → index.es213-BjABl1g7.js} +0 -0
- /package/dist/app/assets/{index.es227-xI-RfyKK.js → index.es214-xI-RfyKK.js} +0 -0
- /package/dist/app/assets/{index.es228-ySlJ1b_l.js → index.es215-ySlJ1b_l.js} +0 -0
- /package/dist/app/assets/{index.es231-BQoSv7ci.js → index.es218-BQoSv7ci.js} +0 -0
- /package/dist/app/assets/{index.es232-w8dY5SsB.js → index.es219-w8dY5SsB.js} +0 -0
- /package/dist/app/assets/{index.es233-TU54ms6u.js → index.es220-TU54ms6u.js} +0 -0
- /package/dist/app/assets/{index.es234-DREVFZK8.js → index.es221-DREVFZK8.js} +0 -0
- /package/dist/app/assets/{index.es235-BfivnA6A.js → index.es222-BfivnA6A.js} +0 -0
- /package/dist/app/assets/{index.es236-P4WzXJd0.js → index.es223-P4WzXJd0.js} +0 -0
- /package/dist/app/assets/{index.es237-BAng5TT0.js → index.es224-BAng5TT0.js} +0 -0
- /package/dist/app/assets/{index.es239-B5lbUyaz.js → index.es226-B5lbUyaz.js} +0 -0
- /package/dist/app/assets/{index.es240-mebxcVVE.js → index.es227-mebxcVVE.js} +0 -0
- /package/dist/app/assets/{index.es242-XBlWyCtg.js → index.es229-XBlWyCtg.js} +0 -0
- /package/dist/app/assets/{index.es243-BfCpw3nA.js → index.es230-BfCpw3nA.js} +0 -0
- /package/dist/app/assets/{index.es245-Cc5clBb7.js → index.es232-Cc5clBb7.js} +0 -0
- /package/dist/app/assets/{index.es246-IuBKFhSY.js → index.es233-IuBKFhSY.js} +0 -0
- /package/dist/app/assets/{index.es248-Du5NY7AG.js → index.es235-Du5NY7AG.js} +0 -0
- /package/dist/app/assets/{index.es249-Bvotw-X0.js → index.es236-Bvotw-X0.js} +0 -0
- /package/dist/app/assets/{index.es250-UIAJJxZW.js → index.es237-UIAJJxZW.js} +0 -0
- /package/dist/app/assets/{index.es252-D9-PGadD.js → index.es239-D9-PGadD.js} +0 -0
- /package/dist/app/assets/{index.es254-sdHcTMYB.js → index.es241-sdHcTMYB.js} +0 -0
- /package/dist/app/assets/{index.es255-Ci6OQyBP.js → index.es242-Ci6OQyBP.js} +0 -0
- /package/dist/app/assets/{index.es256-BC5c_5Pe.js → index.es243-BC5c_5Pe.js} +0 -0
- /package/dist/app/assets/{index.es257-Tz6hzZYG.js → index.es244-Tz6hzZYG.js} +0 -0
- /package/dist/app/assets/{index.es258-DB_GagMm.js → index.es245-DB_GagMm.js} +0 -0
- /package/dist/app/assets/{index.es259-DLbgOhZU.js → index.es246-DLbgOhZU.js} +0 -0
- /package/dist/app/assets/{index.es260-B0XVJmRM.js → index.es247-B0XVJmRM.js} +0 -0
- /package/dist/app/assets/{index.es263-shcSOmrb.js → index.es250-shcSOmrb.js} +0 -0
- /package/dist/app/assets/{index.es264-D4Tzg5kh.js → index.es251-D4Tzg5kh.js} +0 -0
- /package/dist/app/assets/{index.es265-Deuh7S70.js → index.es252-Deuh7S70.js} +0 -0
- /package/dist/app/assets/{index.es266-BUEGK8hf.js → index.es253-BUEGK8hf.js} +0 -0
- /package/dist/app/assets/{index.es267-BNioltXt.js → index.es254-BNioltXt.js} +0 -0
- /package/dist/app/assets/{index.es268-JqZropPD.js → index.es255-JqZropPD.js} +0 -0
- /package/dist/app/assets/{index.es271-LKU2TuZ1.js → index.es258-LKU2TuZ1.js} +0 -0
- /package/dist/app/assets/{index.es272-BFLt1xDp.js → index.es259-BFLt1xDp.js} +0 -0
- /package/dist/app/assets/{index.es273-DKykz6zU.js → index.es260-DKykz6zU.js} +0 -0
- /package/dist/app/assets/{index.es274-B3ZDOciz.js → index.es261-B3ZDOciz.js} +0 -0
- /package/dist/app/assets/{index.es275-CSHBycmS.js → index.es262-CSHBycmS.js} +0 -0
- /package/dist/app/assets/{index.es276-BIEUsx6d.js → index.es263-BIEUsx6d.js} +0 -0
- /package/dist/app/assets/{index.es277-B48N-Iqd.js → index.es264-B48N-Iqd.js} +0 -0
- /package/dist/app/assets/{index.es278-BY-TUvya.js → index.es265-BY-TUvya.js} +0 -0
- /package/dist/app/assets/{index.es279-zocC4JxJ.js → index.es266-zocC4JxJ.js} +0 -0
- /package/dist/app/assets/{index.es281-Cza_XSSt.js → index.es268-Cza_XSSt.js} +0 -0
- /package/dist/app/assets/{index.es282-Bg-kzb6g.js → index.es269-Bg-kzb6g.js} +0 -0
- /package/dist/app/assets/{index.es283-DhUJRlN_.js → index.es270-DhUJRlN_.js} +0 -0
- /package/dist/app/assets/{index.es285-C8lEn-DE.js → index.es272-C8lEn-DE.js} +0 -0
- /package/dist/app/assets/{index.es286-DhMKtDLN.js → index.es273-DhMKtDLN.js} +0 -0
- /package/dist/app/assets/{index.es287-CwjWoCRV.js → index.es274-CwjWoCRV.js} +0 -0
- /package/dist/app/assets/{index.es288-CzouJOBO.js → index.es275-CzouJOBO.js} +0 -0
- /package/dist/app/assets/{index.es289-B1bQXN8T.js → index.es276-B1bQXN8T.js} +0 -0
- /package/dist/app/assets/{index.es291-5LuOXUq_.js → index.es278-5LuOXUq_.js} +0 -0
- /package/dist/app/assets/{index.es292-DWJ3fJO_.js → index.es279-DWJ3fJO_.js} +0 -0
- /package/dist/app/assets/{index.es293-DJlmqQ1C.js → index.es280-DJlmqQ1C.js} +0 -0
- /package/dist/app/assets/{index.es294-QhoSD0DR.js → index.es281-QhoSD0DR.js} +0 -0
- /package/dist/app/assets/{index.es297-Be6lgOlo.js → index.es284-Be6lgOlo.js} +0 -0
- /package/dist/app/assets/{index.es299-BJ4Li9vH.js → index.es286-BJ4Li9vH.js} +0 -0
- /package/dist/app/assets/{index.es300-DQVVAn-B.js → index.es287-DQVVAn-B.js} +0 -0
- /package/dist/app/assets/{index.es301-BJGe-b2p.js → index.es288-BJGe-b2p.js} +0 -0
- /package/dist/app/assets/{index.es303-BLhTXw86.js → index.es290-BLhTXw86.js} +0 -0
- /package/dist/app/assets/{index.es305-atvbtKCR.js → index.es292-atvbtKCR.js} +0 -0
- /package/dist/app/assets/{index.es307-DkLiglaE.js → index.es294-DkLiglaE.js} +0 -0
- /package/dist/app/assets/{index.es308-C1w2a3ep.js → index.es295-C1w2a3ep.js} +0 -0
- /package/dist/app/assets/{index.es311-Cf8iN4DR.js → index.es298-Cf8iN4DR.js} +0 -0
- /package/dist/app/assets/{index.es312-COK4E0Yg.js → index.es299-COK4E0Yg.js} +0 -0
- /package/dist/app/assets/{index.es313-BknIz3MU.js → index.es300-BknIz3MU.js} +0 -0
- /package/dist/app/assets/{index.es315-BeQkCIfX.js → index.es302-BeQkCIfX.js} +0 -0
- /package/dist/app/assets/{index.es317-BSxZ-RaX.js → index.es304-BSxZ-RaX.js} +0 -0
- /package/dist/app/assets/{index.es318-C7L56vO4.js → index.es305-C7L56vO4.js} +0 -0
- /package/dist/app/assets/{index.es319-CUnW07Te.js → index.es306-CUnW07Te.js} +0 -0
- /package/dist/app/assets/{index.es320-C1XDQQGZ.js → index.es307-C1XDQQGZ.js} +0 -0
- /package/dist/app/assets/{index.es321-CQjiPCtT.js → index.es308-CQjiPCtT.js} +0 -0
- /package/dist/app/assets/{index.es322-DQ1-QYvQ.js → index.es309-DQ1-QYvQ.js} +0 -0
- /package/dist/app/assets/{index.es324-BbSNqyBO.js → index.es311-BbSNqyBO.js} +0 -0
- /package/dist/app/assets/{index.es326-CB2ApiWb.js → index.es313-CB2ApiWb.js} +0 -0
- /package/dist/app/assets/{index.es328-B_m7g4N7.js → index.es315-B_m7g4N7.js} +0 -0
- /package/dist/app/assets/{index.es329-B6W0miNI.js → index.es316-B6W0miNI.js} +0 -0
- /package/dist/app/assets/{index.es330-BMR_PYu6.js → index.es317-BMR_PYu6.js} +0 -0
- /package/dist/app/assets/{index.es332-Dj6nwHGl.js → index.es319-Dj6nwHGl.js} +0 -0
- /package/dist/app/assets/{index.es333-BpWG_bgh.js → index.es320-BpWG_bgh.js} +0 -0
- /package/dist/app/assets/{index.es334-BVUVsWT6.js → index.es321-BVUVsWT6.js} +0 -0
- /package/dist/app/assets/{index.es335-CAQ2eGtk.js → index.es322-CAQ2eGtk.js} +0 -0
- /package/dist/app/assets/{index.es336-BFOHcciG.js → index.es323-BFOHcciG.js} +0 -0
- /package/dist/app/assets/{index.es337-CdO5JTpU.js → index.es324-CdO5JTpU.js} +0 -0
- /package/dist/app/assets/{index.es338-CJaU5se_.js → index.es325-CJaU5se_.js} +0 -0
- /package/dist/app/assets/{index.es339-DYoNaHQp.js → index.es326-DYoNaHQp.js} +0 -0
- /package/dist/app/assets/{index.es340-m4uW47V2.js → index.es327-m4uW47V2.js} +0 -0
- /package/dist/app/assets/{index.es343-nyqBNV6O.js → index.es330-nyqBNV6O.js} +0 -0
- /package/dist/app/assets/{index.es344-C6j12Q_x.js → index.es331-C6j12Q_x.js} +0 -0
- /package/dist/app/assets/{index.es345-7A4Fjokl.js → index.es332-7A4Fjokl.js} +0 -0
- /package/dist/app/assets/{index.es346-CB0Krxn9.js → index.es333-CB0Krxn9.js} +0 -0
- /package/dist/app/assets/{index.es347-DCE3LsBG.js → index.es334-DCE3LsBG.js} +0 -0
- /package/dist/app/assets/{index.es348-C3FkfJm5.js → index.es335-C3FkfJm5.js} +0 -0
- /package/dist/app/assets/{index.es351-CVw76BM1.js → index.es338-CVw76BM1.js} +0 -0
- /package/dist/app/assets/{index.es352-HnGAYVZD.js → index.es339-HnGAYVZD.js} +0 -0
- /package/dist/app/assets/{index.es353-BVz_zdnA.js → index.es340-BVz_zdnA.js} +0 -0
- /package/dist/app/assets/{index.es354-C3khCPGq.js → index.es341-C3khCPGq.js} +0 -0
- /package/dist/app/assets/{index.es355-D-2ljcwZ.js → index.es342-D-2ljcwZ.js} +0 -0
- /package/dist/app/assets/{index.es356-Cv9koXgw.js → index.es343-Cv9koXgw.js} +0 -0
- /package/dist/app/assets/{index.es357-CD_QflpE.js → index.es344-CD_QflpE.js} +0 -0
- /package/dist/app/assets/{index.es358-DRW-0cLl.js → index.es345-DRW-0cLl.js} +0 -0
- /package/dist/app/assets/{index.es359-C-_shW-Y.js → index.es346-C-_shW-Y.js} +0 -0
- /package/dist/app/assets/{index.es360-LGGdnPYs.js → index.es347-LGGdnPYs.js} +0 -0
- /package/dist/app/assets/{index.es361-C3mMm8J8.js → index.es348-C3mMm8J8.js} +0 -0
- /package/dist/app/assets/{index.es362-BzJJZx-M.js → index.es349-BzJJZx-M.js} +0 -0
- /package/dist/app/assets/{index.es363-BXkSAIEj.js → index.es350-BXkSAIEj.js} +0 -0
- /package/dist/app/assets/{index.es364-BgDCqdQA.js → index.es351-BgDCqdQA.js} +0 -0
- /package/dist/app/assets/{index.es365-C8M2exoo.js → index.es352-C8M2exoo.js} +0 -0
- /package/dist/app/assets/{index.es366-DHJKELXO.js → index.es353-DHJKELXO.js} +0 -0
- /package/dist/app/assets/{index.es367-Cuk6v7N8.js → index.es354-Cuk6v7N8.js} +0 -0
- /package/dist/app/assets/{index.es368-DH5Ifo-i.js → index.es355-DH5Ifo-i.js} +0 -0
- /package/dist/app/assets/{index.es369-E3gJ1_iC.js → index.es356-E3gJ1_iC.js} +0 -0
- /package/dist/app/assets/{index.es370-DAi9KRSo.js → index.es357-DAi9KRSo.js} +0 -0
- /package/dist/app/assets/{index.es371-D7oLnXFd.js → index.es358-D7oLnXFd.js} +0 -0
- /package/dist/app/assets/{index.es372-BfjtVDDH.js → index.es359-BfjtVDDH.js} +0 -0
- /package/dist/app/assets/{index.es373-DnULxvSX.js → index.es360-DnULxvSX.js} +0 -0
- /package/dist/app/assets/{index.es374-CkXjmgJE.js → index.es361-CkXjmgJE.js} +0 -0
- /package/dist/app/assets/{index.es375-CfQXZHmo.js → index.es362-CfQXZHmo.js} +0 -0
- /package/dist/app/assets/{index.es376-DWedfzmr.js → index.es363-DWedfzmr.js} +0 -0
- /package/dist/app/assets/{index.es377-DUszq2jm.js → index.es364-DUszq2jm.js} +0 -0
- /package/dist/app/assets/{index.es378-B7mTdjB0.js → index.es365-B7mTdjB0.js} +0 -0
- /package/dist/app/assets/{index.es379-D5KoaKCx.js → index.es366-D5KoaKCx.js} +0 -0
- /package/dist/app/assets/{index.es380-BfHTSMKl.js → index.es367-BfHTSMKl.js} +0 -0
- /package/dist/app/assets/{index.es381-B0m2ddpp.js → index.es368-B0m2ddpp.js} +0 -0
- /package/dist/app/assets/{index.es382-CyktbL80.js → index.es369-CyktbL80.js} +0 -0
- /package/dist/app/assets/{index.es383-Csfq5Kiy.js → index.es370-Csfq5Kiy.js} +0 -0
- /package/dist/app/assets/{index.es384-CafNBF8u.js → index.es371-CafNBF8u.js} +0 -0
- /package/dist/app/assets/{index.es385-CTRr51gU.js → index.es372-CTRr51gU.js} +0 -0
- /package/dist/app/assets/{index.es386-D4h5O-jR.js → index.es373-D4h5O-jR.js} +0 -0
- /package/dist/app/assets/{index.es387-C39BiMTA.js → index.es374-C39BiMTA.js} +0 -0
- /package/dist/app/assets/{index.es388-Ddv68eIx.js → index.es375-Ddv68eIx.js} +0 -0
- /package/dist/app/assets/{index.es389-GBQ2dnAY.js → index.es376-GBQ2dnAY.js} +0 -0
- /package/dist/app/assets/{index.es390-PoHY5YXO.js → index.es377-PoHY5YXO.js} +0 -0
- /package/dist/app/assets/{index.es391-3e1v2bzS.js → index.es378-3e1v2bzS.js} +0 -0
- /package/dist/app/assets/{index.es392-CS3Unz2-.js → index.es379-CS3Unz2-.js} +0 -0
- /package/dist/app/assets/{index.es393-bN70gL4F.js → index.es380-bN70gL4F.js} +0 -0
- /package/dist/app/assets/{index.es394-CmCqftbK.js → index.es381-CmCqftbK.js} +0 -0
- /package/dist/app/assets/{index.es395-Ds-gbosJ.js → index.es382-Ds-gbosJ.js} +0 -0
- /package/dist/app/assets/{index.es396-CjDtw9vr.js → index.es383-CjDtw9vr.js} +0 -0
- /package/dist/app/assets/{index.es397-BthQWCQV.js → index.es384-BthQWCQV.js} +0 -0
- /package/dist/app/assets/{index.es398-DqwNpetd.js → index.es385-DqwNpetd.js} +0 -0
- /package/dist/app/assets/{index.es399-Bw305WKR.js → index.es386-Bw305WKR.js} +0 -0
- /package/dist/app/assets/{index.es400-DXbdFlpD.js → index.es387-DXbdFlpD.js} +0 -0
- /package/dist/app/assets/{index.es401-L9t79GZl.js → index.es388-L9t79GZl.js} +0 -0
- /package/dist/app/assets/{index.es402-CbfX1IO0.js → index.es389-CbfX1IO0.js} +0 -0
- /package/dist/app/assets/{index.es403-DBQeEorK.js → index.es390-DBQeEorK.js} +0 -0
- /package/dist/app/assets/{index.es404-BEBZ7ncR.js → index.es391-BEBZ7ncR.js} +0 -0
- /package/dist/app/assets/{index.es405-Bkuqu6BP.js → index.es392-Bkuqu6BP.js} +0 -0
- /package/dist/app/assets/{index.es406-D0r3Knsf.js → index.es393-D0r3Knsf.js} +0 -0
- /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 {
|
|
11
|
-
|
|
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
|
|
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
|
-
|
|
43
|
-
logger.info(`Adding project "${
|
|
44
|
-
const
|
|
54
|
+
projectManifest.projects.map(async (project) => {
|
|
55
|
+
logger.info(`Adding project "${project.name}"`);
|
|
56
|
+
const projectInstance = await this.addProject(
|
|
45
57
|
{
|
|
46
|
-
name:
|
|
47
|
-
resource: `${API_PREFIX}/projects/${
|
|
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
|
|
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
|
-
|
|
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 ||
|
|
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
|
|
118
|
-
|
|
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 (
|
|
198
|
+
if (hasPackages) {
|
|
199
|
+
const packagesToProcess =
|
|
200
|
+
project?.packages || projectConfig?.packages || [];
|
|
121
201
|
absoluteProjectPath = await this.loadProjectIntoDisk(
|
|
122
202
|
projectName,
|
|
123
|
-
|
|
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: {
|
|
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
|
|
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(
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
243
|
-
await this.
|
|
244
|
-
|
|
245
|
-
|
|
382
|
+
// Download the entire location once
|
|
383
|
+
await this.downloadOrMountLocation(
|
|
384
|
+
location,
|
|
385
|
+
tempDownloadPath,
|
|
246
386
|
projectName,
|
|
387
|
+
"shared",
|
|
247
388
|
);
|
|
248
|
-
|
|
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,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return absoluteTargetPath;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
private async downloadOrMountLocation(
|
|
471
|
+
location: string,
|
|
472
|
+
targetPath: string,
|
|
473
|
+
projectName: string,
|
|
474
|
+
packageName: string,
|
|
475
|
+
) {
|
|
476
|
+
// Handle GCS paths
|
|
477
|
+
if (location.startsWith("gs://")) {
|
|
478
|
+
try {
|
|
479
|
+
logger.info(
|
|
480
|
+
`Downloading GCS directory from "${location}" to "${targetPath}"`,
|
|
481
|
+
);
|
|
482
|
+
await this.downloadGcsDirectory(location, projectName, targetPath);
|
|
483
|
+
return;
|
|
249
484
|
} catch (error) {
|
|
250
|
-
logger.error(`Failed to
|
|
485
|
+
logger.error(`Failed to download GCS directory "${location}"`, {
|
|
251
486
|
error,
|
|
252
487
|
});
|
|
253
|
-
throw
|
|
488
|
+
throw new PackageNotFoundError(
|
|
489
|
+
`Failed to download GCS directory: ${location}`,
|
|
490
|
+
);
|
|
254
491
|
}
|
|
255
492
|
}
|
|
256
493
|
|
|
257
|
-
// Handle
|
|
258
|
-
if (
|
|
259
|
-
|
|
494
|
+
// Handle GitHub URLs
|
|
495
|
+
if (
|
|
496
|
+
location.startsWith("https://github.com/") ||
|
|
497
|
+
location.startsWith("git@")
|
|
498
|
+
) {
|
|
260
499
|
try {
|
|
261
500
|
logger.info(
|
|
262
|
-
`
|
|
263
|
-
);
|
|
264
|
-
await this.downloadGcsDirectory(
|
|
265
|
-
projectPath,
|
|
266
|
-
projectName,
|
|
267
|
-
absoluteTargetPath,
|
|
501
|
+
`Cloning GitHub repository from "${location}" to "${targetPath}"`,
|
|
268
502
|
);
|
|
503
|
+
await this.downloadGitHubDirectory(location, targetPath);
|
|
504
|
+
return;
|
|
269
505
|
} catch (error) {
|
|
270
|
-
logger.error(`Failed to
|
|
506
|
+
logger.error(`Failed to clone GitHub repository "${location}"`, {
|
|
271
507
|
error,
|
|
272
508
|
});
|
|
273
|
-
throw
|
|
509
|
+
throw new PackageNotFoundError(
|
|
510
|
+
`Failed to clone GitHub repository: ${location}`,
|
|
511
|
+
);
|
|
274
512
|
}
|
|
275
|
-
return absoluteTargetPath;
|
|
276
513
|
}
|
|
277
514
|
|
|
278
|
-
// Handle S3
|
|
279
|
-
if (
|
|
515
|
+
// Handle S3 paths
|
|
516
|
+
if (location.startsWith("s3://")) {
|
|
280
517
|
try {
|
|
281
|
-
logger.info(
|
|
282
|
-
|
|
283
|
-
projectPath,
|
|
284
|
-
projectName,
|
|
285
|
-
absoluteTargetPath,
|
|
518
|
+
logger.info(
|
|
519
|
+
`Downloading S3 directory from "${location}" to "${targetPath}"`,
|
|
286
520
|
);
|
|
287
|
-
|
|
521
|
+
await this.downloadS3Directory(location, projectName, targetPath);
|
|
522
|
+
return;
|
|
288
523
|
} catch (error) {
|
|
289
|
-
logger.error(`Failed to
|
|
290
|
-
|
|
524
|
+
logger.error(`Failed to download S3 directory "${location}"`, {
|
|
525
|
+
error,
|
|
526
|
+
});
|
|
527
|
+
throw new PackageNotFoundError(
|
|
528
|
+
`Failed to download S3 directory: ${location}`,
|
|
529
|
+
);
|
|
291
530
|
}
|
|
292
531
|
}
|
|
293
532
|
|
|
294
|
-
// Handle
|
|
295
|
-
if (
|
|
296
|
-
projectPath.startsWith("https://github.com/") ||
|
|
297
|
-
projectPath.startsWith("git@")
|
|
298
|
-
) {
|
|
533
|
+
// Handle absolute paths
|
|
534
|
+
if (path.isAbsolute(location)) {
|
|
299
535
|
try {
|
|
300
|
-
logger.info(
|
|
301
|
-
|
|
302
|
-
|
|
536
|
+
logger.info(
|
|
537
|
+
`Mounting local directory at "${location}" to "${targetPath}"`,
|
|
538
|
+
);
|
|
539
|
+
await this.mountLocalDirectory(
|
|
540
|
+
location,
|
|
541
|
+
targetPath,
|
|
542
|
+
projectName,
|
|
543
|
+
packageName,
|
|
544
|
+
);
|
|
545
|
+
return;
|
|
303
546
|
} catch (error) {
|
|
304
|
-
logger.error(`Failed to mount
|
|
547
|
+
logger.error(`Failed to mount local directory "${location}"`, {
|
|
305
548
|
error,
|
|
306
549
|
});
|
|
307
|
-
throw
|
|
550
|
+
throw new PackageNotFoundError(
|
|
551
|
+
`Failed to mount local directory: ${location}`,
|
|
552
|
+
);
|
|
308
553
|
}
|
|
309
554
|
}
|
|
310
555
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
|
338
|
-
`
|
|
584
|
+
throw new PackageNotFoundError(
|
|
585
|
+
`Package ${packageName} for project ${projectName} not found in "${projectPath}"`,
|
|
339
586
|
);
|
|
340
587
|
}
|
|
341
588
|
}
|
package/src/service/scheduler.ts
CHANGED
|
@@ -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