@malloy-publisher/server 0.0.106 → 0.0.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/api-doc.yaml +133 -0
- package/dist/app/assets/Chip-DGhbYY0q.js +1 -0
- package/dist/app/assets/Container-B0KHzXKt.js +1 -0
- package/dist/app/assets/DialogTitle-DR48y6tE.js +1 -0
- package/dist/app/assets/Edit-DALFdGEc.js +1 -0
- package/dist/app/assets/FormControlContext-BRoFhJft.js +1 -0
- package/dist/app/assets/HomePage-D_nRraEL.js +3 -0
- package/dist/app/assets/MainPage-B4hVmqCL.js +1 -0
- package/dist/app/assets/MenuItem-_baoLhUG.js +1 -0
- package/dist/app/assets/Modal-BXBDnsg2.js +1 -0
- package/dist/app/assets/ModelPage-BKTJdSxS.js +2 -0
- package/dist/app/assets/MoreVert-CShGo3pe.js +1 -0
- package/dist/app/assets/PackagePage-z3SwXvJf.js +2 -0
- package/dist/app/assets/ProjectPage-jU6PqHcz.js +1 -0
- package/dist/app/assets/RouteError-xhztAFCv.js +1 -0
- package/dist/app/assets/WorkbookPage-BFAQAKC6.js +6 -0
- package/dist/app/assets/index-Bzmq4WOt.js +676 -0
- package/dist/app/assets/index-DIS-Myin.js +420 -0
- package/dist/app/assets/{index-CvbMKVwx.js → index-DoB7q17I.js} +7 -7
- package/dist/app/assets/index.es20-BPDKJ1mC.js +1 -0
- package/dist/app/assets/index.es23-CGcuw-pl.js +2 -0
- package/dist/app/assets/{index.es231-02O061a5.js → index.es297-CXXkvqrk.js} +1 -1
- package/dist/app/assets/{index.es232-DOZR37hD.js → index.es298-Clb9Gx4p.js} +1 -1
- package/dist/app/assets/{index.es235-CwaFVls_.js → index.es301-CvjmNg6I.js} +1 -1
- package/dist/app/assets/{index.es240-BXsCiix7.js → index.es306-BTbwrAfY.js} +1 -1
- package/dist/app/assets/{index.es248-BBXwDGlH.js → index.es314-i9HKymPG.js} +1 -1
- package/dist/app/assets/{index.es249-it6O0zLZ.js → index.es315-ffN5HvPT.js} +1 -1
- package/dist/app/assets/{index.es252-BU8jndoZ.js → index.es318-Dt5n7rl7.js} +1 -1
- package/dist/app/assets/{index.es256-BvZRwMxf.js → index.es322-DarpkShG.js} +1 -1
- package/dist/app/assets/{index.es259-6-xstYpb.js → index.es325-DGXcHkJW.js} +1 -1
- package/dist/app/assets/{index.es262-BDUOVoIz.js → index.es328-OrbxFN0T.js} +1 -1
- package/dist/app/assets/{index.es263-CHueaYAb.js → index.es329-DOg4tLZf.js} +1 -1
- package/dist/app/assets/{index.es277-CbrHqWmX.js → index.es343-B3c-LWee.js} +1 -1
- package/dist/app/assets/{index.es278-CI5gPs5v.js → index.es344-BzlM_qzj.js} +1 -1
- package/dist/app/assets/{index.es279-DH9b__8l.js → index.es345-Bx5jaaik.js} +1 -1
- package/dist/app/assets/{index.es281-CGN0Pl1D.js → index.es347-D4l698Ba.js} +1 -1
- package/dist/app/assets/{index.es286-XRt1U2aU.js → index.es352-CpzIN4Ck.js} +1 -1
- package/dist/app/assets/{index.es288-DSszyNly.js → index.es354-BzQZ7qJD.js} +1 -1
- package/dist/app/assets/{index.es289-xrNpklpB.js → index.es355-DX--h2FO.js} +1 -1
- package/dist/app/assets/{index.es294-B75OnIUq.js → index.es360-Brs4IhQL.js} +1 -1
- package/dist/app/assets/{index.es295-wxT8LaCU.js → index.es361-C_jQQEMZ.js} +1 -1
- package/dist/app/assets/{index.es297-DCQpwhAH.js → index.es363-BZd8QWNz.js} +1 -1
- package/dist/app/assets/{index.es298-Dtm6S7Te.js → index.es364-5Y8szdnr.js} +1 -1
- package/dist/app/assets/{index.es299-CO3NhjF0.js → index.es365-iXnPxtgs.js} +1 -1
- package/dist/app/assets/{index.es302-BNx4kwZQ.js → index.es368-BBVgx6aX.js} +1 -1
- package/dist/app/assets/{index.es304-Cslijulp.js → index.es370-ClbIH95T.js} +1 -1
- package/dist/app/assets/{index.es305-Bj5y75UJ.js → index.es371-DmqxEYIc.js} +1 -1
- package/dist/app/assets/{index.es306-BY9A-bfA.js → index.es372-Bot_-48c.js} +1 -1
- package/dist/app/assets/{index.es312-BOpCGR-W.js → index.es378-B9aRQ00Z.js} +1 -1
- package/dist/app/assets/{index.es313-j4e0V-ax.js → index.es379-DQAEtWxw.js} +1 -1
- package/dist/app/assets/{index.es314-QPXF8A7X.js → index.es380-BBp8E5gV.js} +1 -1
- package/dist/app/assets/{index.es315-BBht-U5W.js → index.es381-Cl0nVZsB.js} +1 -1
- package/dist/app/assets/{index.es317-Ba6bfhqW.js → index.es383-BMW5Mbfn.js} +1 -1
- package/dist/app/assets/{index.es321-BzMKJGft.js → index.es387-Cqwn90T2.js} +1 -1
- package/dist/app/assets/{index.es322-Dsh6cVFT.js → index.es388-BGLiezvQ.js} +1 -1
- package/dist/app/assets/{index.es330-CwhtB6Ga.js → index.es396-Dnto5_1_.js} +1 -1
- package/dist/app/assets/{index.es333-BkIXdkt8.js → index.es399-oYyQuMIn.js} +1 -1
- package/dist/app/assets/{index.es336-CDPSHwok.js → index.es402-C7bOCmc3.js} +1 -1
- package/dist/app/assets/{index.es339-CpmgqEMA.js → index.es405-CgiLlAXi.js} +1 -1
- package/dist/app/assets/{index.es343-DpQJ0N3s.js → index.es409-CTqIYL8X.js} +1 -1
- package/dist/app/assets/{index.es345-Cu1t0B48.js → index.es411-DCscG5n_.js} +1 -1
- package/dist/app/assets/{index.es353-Boayqq8b.js → index.es419-D8w4xXW-.js} +1 -1
- package/dist/app/assets/{index.es354-B25Rulno.js → index.es420-CoY4mPyG.js} +1 -1
- package/dist/app/assets/{index.es361-BbYa_qYT.js → index.es427-DPgNELR1.js} +1 -1
- package/dist/app/assets/{index.es362-BnUI1TJX.js → index.es428-CKGg3G7e.js} +1 -1
- package/dist/app/assets/{index.es372-Din3gmuj.js → index.es438-DLZwD0On.js} +1 -1
- package/dist/app/assets/{index.es376-CAM-NFdA.js → index.es442-CeFC_3kB.js} +1 -1
- package/dist/app/assets/{index.es382-r9NT2hns.js → index.es448-Bkdic4-K.js} +1 -1
- package/dist/app/assets/{index.es387-DWtDDVHa.js → index.es453-BTUy9umd.js} +1 -1
- package/dist/app/assets/{index.es388-Cddokof0.js → index.es454-B-wtdVwd.js} +1 -1
- package/dist/app/assets/{index.es390-BgcDic1S.js → index.es456-DMl0frQV.js} +1 -1
- package/dist/app/assets/{index.es394-Cuad4cFu.js → index.es460-BCFWaHpj.js} +1 -1
- package/dist/app/assets/{index.es396-CQcbzzI_.js → index.es462-CMWboMtJ.js} +1 -1
- package/dist/app/assets/{index.es398-DBUoETTk.js → index.es464-3Yi-DUIC.js} +1 -1
- package/dist/app/assets/{index.es401-D7FZbPq9.js → index.es467-Bhyygz2G.js} +1 -1
- package/dist/app/assets/{index.es402-C5ht0e8l.js → index.es468-HCYOhbfy.js} +1 -1
- package/dist/app/assets/{index.es406-pes6PLHN.js → index.es472-BGdt37JU.js} +1 -1
- package/dist/app/assets/{index.es408-DV2ChDJw.js → index.es474-Cvsrw_ol.js} +1 -1
- package/dist/app/assets/{index.es415-BI_J_S9x.js → index.es481-CQK61FBO.js} +1 -1
- package/dist/app/assets/{index.es417-BNH1K0F3.js → index.es483-_fCFzllD.js} +1 -1
- package/dist/app/assets/{index.es419-DaaHuOeT.js → index.es485-onmvNF-0.js} +1 -1
- package/dist/app/assets/{index.es423-BFNF97RC.js → index.es489-7PLT4DLq.js} +1 -1
- package/dist/app/assets/{index.es433-TWQYaV1h.js → index.es499-C0JWr_xK.js} +1 -1
- package/dist/app/assets/{index.es434-Dhj89L3U.js → index.es500-D41F9-Tw.js} +1 -1
- package/dist/app/assets/{index.es441-9pPCdH1i.js → index.es507-DKp0nulG.js} +1 -1
- package/dist/app/assets/{index.es442-B_JzqX5N.js → index.es508-ilzXBvKZ.js} +1 -1
- package/dist/app/assets/index.es7-C8O8lseo.js +1 -0
- package/dist/app/assets/index.modern-Da9HWSay.js +17 -0
- package/dist/app/assets/{index.umd-DknWdzGi.js → index.umd-BJAbIV_-.js} +61 -61
- package/dist/app/assets/listItemTextClasses-DhilXbg6.js +1 -0
- package/dist/app/index.html +1 -3
- package/dist/server.js +1838 -6280
- package/eslint.config.mjs +16 -3
- package/package.json +10 -10
- package/publisher.config.json +32 -25
- package/src/config.ts +61 -1
- package/src/constants.ts +0 -1
- package/src/controller/connection.controller.ts +2 -2
- package/src/server.ts +73 -13
- package/src/service/connection.ts +25 -15
- package/src/service/package.spec.ts +67 -22
- package/src/service/package.ts +8 -1
- package/src/service/project.ts +13 -31
- package/src/service/project_store.spec.ts +30 -53
- package/src/service/project_store.ts +100 -68
- package/dist/app/assets/index-Bh1cWMgT.js +0 -240
- package/dist/app/assets/index-SM0qJxoC.js +0 -676
- package/dist/app/assets/index.es24-CDJ3b9GD.js +0 -2
- package/dist/app/assets/mui-BL9dYvR2.js +0 -159
- package/dist/app/assets/vendor-c5ypKtDW.js +0 -17
- /package/dist/app/assets/{index.es220-CG6Dc4jp.js → index.es286-CG6Dc4jp.js} +0 -0
- /package/dist/app/assets/{index.es228-DsBKuouk.js → index.es294-DsBKuouk.js} +0 -0
- /package/dist/app/assets/{index.es229-D_z4Izcz.js → index.es295-D_z4Izcz.js} +0 -0
- /package/dist/app/assets/{index.es230-727ZlQH0.js → index.es296-727ZlQH0.js} +0 -0
- /package/dist/app/assets/{index.es233-Dn00JSTd.js → index.es299-Dn00JSTd.js} +0 -0
- /package/dist/app/assets/{index.es234-COJ4H7py.js → index.es300-COJ4H7py.js} +0 -0
- /package/dist/app/assets/{index.es236-Bu5BbsvL.js → index.es302-Bu5BbsvL.js} +0 -0
- /package/dist/app/assets/{index.es237-7O62HKoU.js → index.es303-7O62HKoU.js} +0 -0
- /package/dist/app/assets/{index.es238-BPT9niGB.js → index.es304-BPT9niGB.js} +0 -0
- /package/dist/app/assets/{index.es239-Dhn9LcZ4.js → index.es305-Dhn9LcZ4.js} +0 -0
- /package/dist/app/assets/{index.es241-eg146-Ew.js → index.es307-eg146-Ew.js} +0 -0
- /package/dist/app/assets/{index.es242-Du268qiB.js → index.es308-Du268qiB.js} +0 -0
- /package/dist/app/assets/{index.es243-fje9CFhw.js → index.es309-fje9CFhw.js} +0 -0
- /package/dist/app/assets/{index.es244-BwXTMy5W.js → index.es310-BwXTMy5W.js} +0 -0
- /package/dist/app/assets/{index.es245-3xVqZejG.js → index.es311-3xVqZejG.js} +0 -0
- /package/dist/app/assets/{index.es246-xW4inM5L.js → index.es312-xW4inM5L.js} +0 -0
- /package/dist/app/assets/{index.es247-DHo0CJ0O.js → index.es313-DHo0CJ0O.js} +0 -0
- /package/dist/app/assets/{index.es250-C3t2pwGQ.js → index.es316-C3t2pwGQ.js} +0 -0
- /package/dist/app/assets/{index.es251-DNquZEk8.js → index.es317-DNquZEk8.js} +0 -0
- /package/dist/app/assets/{index.es253-BHOwM8T6.js → index.es319-BHOwM8T6.js} +0 -0
- /package/dist/app/assets/{index.es254-DxSadP1t.js → index.es320-DxSadP1t.js} +0 -0
- /package/dist/app/assets/{index.es255-DbXoA79R.js → index.es321-DbXoA79R.js} +0 -0
- /package/dist/app/assets/{index.es257-Bp6g37R7.js → index.es323-Bp6g37R7.js} +0 -0
- /package/dist/app/assets/{index.es258-sacFqUAJ.js → index.es324-sacFqUAJ.js} +0 -0
- /package/dist/app/assets/{index.es260-C7gG9l05.js → index.es326-C7gG9l05.js} +0 -0
- /package/dist/app/assets/{index.es261-Dsg_Bt_b.js → index.es327-Dsg_Bt_b.js} +0 -0
- /package/dist/app/assets/{index.es264-D9R-vmeu.js → index.es330-D9R-vmeu.js} +0 -0
- /package/dist/app/assets/{index.es265-BPhBrDlE.js → index.es331-BPhBrDlE.js} +0 -0
- /package/dist/app/assets/{index.es266-C-TU5hQ_.js → index.es332-C-TU5hQ_.js} +0 -0
- /package/dist/app/assets/{index.es267-DtFQj3wx.js → index.es333-DtFQj3wx.js} +0 -0
- /package/dist/app/assets/{index.es268-m2LEI-9-.js → index.es334-m2LEI-9-.js} +0 -0
- /package/dist/app/assets/{index.es269-BoXegm-a.js → index.es335-BoXegm-a.js} +0 -0
- /package/dist/app/assets/{index.es270-B9wLZaAG.js → index.es336-B9wLZaAG.js} +0 -0
- /package/dist/app/assets/{index.es271-ClGRhx96.js → index.es337-ClGRhx96.js} +0 -0
- /package/dist/app/assets/{index.es272-DEIpsLCJ.js → index.es338-DEIpsLCJ.js} +0 -0
- /package/dist/app/assets/{index.es273-BgYniUM_.js → index.es339-BgYniUM_.js} +0 -0
- /package/dist/app/assets/{index.es274-COcR7UxN.js → index.es340-COcR7UxN.js} +0 -0
- /package/dist/app/assets/{index.es275-BjQB5zDj.js → index.es341-BjQB5zDj.js} +0 -0
- /package/dist/app/assets/{index.es276-C-nORZOA.js → index.es342-C-nORZOA.js} +0 -0
- /package/dist/app/assets/{index.es280-BX77sIaO.js → index.es346-BX77sIaO.js} +0 -0
- /package/dist/app/assets/{index.es282-B-DoSBHF.js → index.es348-B-DoSBHF.js} +0 -0
- /package/dist/app/assets/{index.es283-bCA53EVm.js → index.es349-bCA53EVm.js} +0 -0
- /package/dist/app/assets/{index.es284-w-ucz2PV.js → index.es350-w-ucz2PV.js} +0 -0
- /package/dist/app/assets/{index.es285-Dayu4EKP.js → index.es351-Dayu4EKP.js} +0 -0
- /package/dist/app/assets/{index.es287-DKXYxT9g.js → index.es353-DKXYxT9g.js} +0 -0
- /package/dist/app/assets/{index.es290-DfxzS6Rs.js → index.es356-DfxzS6Rs.js} +0 -0
- /package/dist/app/assets/{index.es291-SKMF96pI.js → index.es357-SKMF96pI.js} +0 -0
- /package/dist/app/assets/{index.es292-ajMbGru0.js → index.es358-ajMbGru0.js} +0 -0
- /package/dist/app/assets/{index.es293--30QC5Em.js → index.es359--30QC5Em.js} +0 -0
- /package/dist/app/assets/{index.es296-B430Bg39.js → index.es362-B430Bg39.js} +0 -0
- /package/dist/app/assets/{index.es300-CM8KxXT1.js → index.es366-CM8KxXT1.js} +0 -0
- /package/dist/app/assets/{index.es301-B1SYOhNW.js → index.es367-B1SYOhNW.js} +0 -0
- /package/dist/app/assets/{index.es303-DkBy-JyN.js → index.es369-DkBy-JyN.js} +0 -0
- /package/dist/app/assets/{index.es307-BILxekzW.js → index.es373-BILxekzW.js} +0 -0
- /package/dist/app/assets/{index.es308-C5wWYbrZ.js → index.es374-C5wWYbrZ.js} +0 -0
- /package/dist/app/assets/{index.es309-HzYwdGDm.js → index.es375-HzYwdGDm.js} +0 -0
- /package/dist/app/assets/{index.es310-T-Tgc4AT.js → index.es376-T-Tgc4AT.js} +0 -0
- /package/dist/app/assets/{index.es311-ifBTmRxC.js → index.es377-ifBTmRxC.js} +0 -0
- /package/dist/app/assets/{index.es316-BMj5Y0dO.js → index.es382-BMj5Y0dO.js} +0 -0
- /package/dist/app/assets/{index.es318-BjABl1g7.js → index.es384-BjABl1g7.js} +0 -0
- /package/dist/app/assets/{index.es319-xI-RfyKK.js → index.es385-xI-RfyKK.js} +0 -0
- /package/dist/app/assets/{index.es320-ySlJ1b_l.js → index.es386-ySlJ1b_l.js} +0 -0
- /package/dist/app/assets/{index.es323-BQoSv7ci.js → index.es389-BQoSv7ci.js} +0 -0
- /package/dist/app/assets/{index.es324-w8dY5SsB.js → index.es390-w8dY5SsB.js} +0 -0
- /package/dist/app/assets/{index.es325-TU54ms6u.js → index.es391-TU54ms6u.js} +0 -0
- /package/dist/app/assets/{index.es326-DREVFZK8.js → index.es392-DREVFZK8.js} +0 -0
- /package/dist/app/assets/{index.es327-BfivnA6A.js → index.es393-BfivnA6A.js} +0 -0
- /package/dist/app/assets/{index.es328-P4WzXJd0.js → index.es394-P4WzXJd0.js} +0 -0
- /package/dist/app/assets/{index.es329-BAng5TT0.js → index.es395-BAng5TT0.js} +0 -0
- /package/dist/app/assets/{index.es331-B5lbUyaz.js → index.es397-B5lbUyaz.js} +0 -0
- /package/dist/app/assets/{index.es332-mebxcVVE.js → index.es398-mebxcVVE.js} +0 -0
- /package/dist/app/assets/{index.es334-XBlWyCtg.js → index.es400-XBlWyCtg.js} +0 -0
- /package/dist/app/assets/{index.es335-BfCpw3nA.js → index.es401-BfCpw3nA.js} +0 -0
- /package/dist/app/assets/{index.es337-Cc5clBb7.js → index.es403-Cc5clBb7.js} +0 -0
- /package/dist/app/assets/{index.es338-IuBKFhSY.js → index.es404-IuBKFhSY.js} +0 -0
- /package/dist/app/assets/{index.es340-Du5NY7AG.js → index.es406-Du5NY7AG.js} +0 -0
- /package/dist/app/assets/{index.es341-Bvotw-X0.js → index.es407-Bvotw-X0.js} +0 -0
- /package/dist/app/assets/{index.es342-UIAJJxZW.js → index.es408-UIAJJxZW.js} +0 -0
- /package/dist/app/assets/{index.es344-D9-PGadD.js → index.es410-D9-PGadD.js} +0 -0
- /package/dist/app/assets/{index.es346-sdHcTMYB.js → index.es412-sdHcTMYB.js} +0 -0
- /package/dist/app/assets/{index.es347-Ci6OQyBP.js → index.es413-Ci6OQyBP.js} +0 -0
- /package/dist/app/assets/{index.es348-BC5c_5Pe.js → index.es414-BC5c_5Pe.js} +0 -0
- /package/dist/app/assets/{index.es349-Tz6hzZYG.js → index.es415-Tz6hzZYG.js} +0 -0
- /package/dist/app/assets/{index.es350-DB_GagMm.js → index.es416-DB_GagMm.js} +0 -0
- /package/dist/app/assets/{index.es351-DLbgOhZU.js → index.es417-DLbgOhZU.js} +0 -0
- /package/dist/app/assets/{index.es352-B0XVJmRM.js → index.es418-B0XVJmRM.js} +0 -0
- /package/dist/app/assets/{index.es355-shcSOmrb.js → index.es421-shcSOmrb.js} +0 -0
- /package/dist/app/assets/{index.es356-D4Tzg5kh.js → index.es422-D4Tzg5kh.js} +0 -0
- /package/dist/app/assets/{index.es357-Deuh7S70.js → index.es423-Deuh7S70.js} +0 -0
- /package/dist/app/assets/{index.es358-BUEGK8hf.js → index.es424-BUEGK8hf.js} +0 -0
- /package/dist/app/assets/{index.es359-BNioltXt.js → index.es425-BNioltXt.js} +0 -0
- /package/dist/app/assets/{index.es360-JqZropPD.js → index.es426-JqZropPD.js} +0 -0
- /package/dist/app/assets/{index.es363-LKU2TuZ1.js → index.es429-LKU2TuZ1.js} +0 -0
- /package/dist/app/assets/{index.es364-BFLt1xDp.js → index.es430-BFLt1xDp.js} +0 -0
- /package/dist/app/assets/{index.es365-DKykz6zU.js → index.es431-DKykz6zU.js} +0 -0
- /package/dist/app/assets/{index.es366-B3ZDOciz.js → index.es432-B3ZDOciz.js} +0 -0
- /package/dist/app/assets/{index.es367-CSHBycmS.js → index.es433-CSHBycmS.js} +0 -0
- /package/dist/app/assets/{index.es368-BIEUsx6d.js → index.es434-BIEUsx6d.js} +0 -0
- /package/dist/app/assets/{index.es369-B48N-Iqd.js → index.es435-B48N-Iqd.js} +0 -0
- /package/dist/app/assets/{index.es370-BY-TUvya.js → index.es436-BY-TUvya.js} +0 -0
- /package/dist/app/assets/{index.es371-zocC4JxJ.js → index.es437-zocC4JxJ.js} +0 -0
- /package/dist/app/assets/{index.es373-Cza_XSSt.js → index.es439-Cza_XSSt.js} +0 -0
- /package/dist/app/assets/{index.es374-Bg-kzb6g.js → index.es440-Bg-kzb6g.js} +0 -0
- /package/dist/app/assets/{index.es375-DhUJRlN_.js → index.es441-DhUJRlN_.js} +0 -0
- /package/dist/app/assets/{index.es377-C8lEn-DE.js → index.es443-C8lEn-DE.js} +0 -0
- /package/dist/app/assets/{index.es378-DhMKtDLN.js → index.es444-DhMKtDLN.js} +0 -0
- /package/dist/app/assets/{index.es379-CwjWoCRV.js → index.es445-CwjWoCRV.js} +0 -0
- /package/dist/app/assets/{index.es380-CzouJOBO.js → index.es446-CzouJOBO.js} +0 -0
- /package/dist/app/assets/{index.es381-B1bQXN8T.js → index.es447-B1bQXN8T.js} +0 -0
- /package/dist/app/assets/{index.es383-5LuOXUq_.js → index.es449-5LuOXUq_.js} +0 -0
- /package/dist/app/assets/{index.es384-DWJ3fJO_.js → index.es450-DWJ3fJO_.js} +0 -0
- /package/dist/app/assets/{index.es385-DJlmqQ1C.js → index.es451-DJlmqQ1C.js} +0 -0
- /package/dist/app/assets/{index.es386-QhoSD0DR.js → index.es452-QhoSD0DR.js} +0 -0
- /package/dist/app/assets/{index.es389-Be6lgOlo.js → index.es455-Be6lgOlo.js} +0 -0
- /package/dist/app/assets/{index.es391-BJ4Li9vH.js → index.es457-BJ4Li9vH.js} +0 -0
- /package/dist/app/assets/{index.es392-DQVVAn-B.js → index.es458-DQVVAn-B.js} +0 -0
- /package/dist/app/assets/{index.es393-BJGe-b2p.js → index.es459-BJGe-b2p.js} +0 -0
- /package/dist/app/assets/{index.es395-BLhTXw86.js → index.es461-BLhTXw86.js} +0 -0
- /package/dist/app/assets/{index.es397-atvbtKCR.js → index.es463-atvbtKCR.js} +0 -0
- /package/dist/app/assets/{index.es399-DkLiglaE.js → index.es465-DkLiglaE.js} +0 -0
- /package/dist/app/assets/{index.es400-C1w2a3ep.js → index.es466-C1w2a3ep.js} +0 -0
- /package/dist/app/assets/{index.es403-Cf8iN4DR.js → index.es469-Cf8iN4DR.js} +0 -0
- /package/dist/app/assets/{index.es404-COK4E0Yg.js → index.es470-COK4E0Yg.js} +0 -0
- /package/dist/app/assets/{index.es405-BknIz3MU.js → index.es471-BknIz3MU.js} +0 -0
- /package/dist/app/assets/{index.es407-BeQkCIfX.js → index.es473-BeQkCIfX.js} +0 -0
- /package/dist/app/assets/{index.es409-BSxZ-RaX.js → index.es475-BSxZ-RaX.js} +0 -0
- /package/dist/app/assets/{index.es410-C7L56vO4.js → index.es476-C7L56vO4.js} +0 -0
- /package/dist/app/assets/{index.es411-CUnW07Te.js → index.es477-CUnW07Te.js} +0 -0
- /package/dist/app/assets/{index.es412-C1XDQQGZ.js → index.es478-C1XDQQGZ.js} +0 -0
- /package/dist/app/assets/{index.es413-CQjiPCtT.js → index.es479-CQjiPCtT.js} +0 -0
- /package/dist/app/assets/{index.es414-DQ1-QYvQ.js → index.es480-DQ1-QYvQ.js} +0 -0
- /package/dist/app/assets/{index.es416-BbSNqyBO.js → index.es482-BbSNqyBO.js} +0 -0
- /package/dist/app/assets/{index.es418-CB2ApiWb.js → index.es484-CB2ApiWb.js} +0 -0
- /package/dist/app/assets/{index.es420-B_m7g4N7.js → index.es486-B_m7g4N7.js} +0 -0
- /package/dist/app/assets/{index.es421-B6W0miNI.js → index.es487-B6W0miNI.js} +0 -0
- /package/dist/app/assets/{index.es422-BMR_PYu6.js → index.es488-BMR_PYu6.js} +0 -0
- /package/dist/app/assets/{index.es424-Dj6nwHGl.js → index.es490-Dj6nwHGl.js} +0 -0
- /package/dist/app/assets/{index.es425-BpWG_bgh.js → index.es491-BpWG_bgh.js} +0 -0
- /package/dist/app/assets/{index.es426-BVUVsWT6.js → index.es492-BVUVsWT6.js} +0 -0
- /package/dist/app/assets/{index.es427-CAQ2eGtk.js → index.es493-CAQ2eGtk.js} +0 -0
- /package/dist/app/assets/{index.es428-BFOHcciG.js → index.es494-BFOHcciG.js} +0 -0
- /package/dist/app/assets/{index.es429-CdO5JTpU.js → index.es495-CdO5JTpU.js} +0 -0
- /package/dist/app/assets/{index.es430-CJaU5se_.js → index.es496-CJaU5se_.js} +0 -0
- /package/dist/app/assets/{index.es431-DYoNaHQp.js → index.es497-DYoNaHQp.js} +0 -0
- /package/dist/app/assets/{index.es432-m4uW47V2.js → index.es498-m4uW47V2.js} +0 -0
- /package/dist/app/assets/{index.es435-nyqBNV6O.js → index.es501-nyqBNV6O.js} +0 -0
- /package/dist/app/assets/{index.es436-C6j12Q_x.js → index.es502-C6j12Q_x.js} +0 -0
- /package/dist/app/assets/{index.es437-7A4Fjokl.js → index.es503-7A4Fjokl.js} +0 -0
- /package/dist/app/assets/{index.es438-CB0Krxn9.js → index.es504-CB0Krxn9.js} +0 -0
- /package/dist/app/assets/{index.es439-DCE3LsBG.js → index.es505-DCE3LsBG.js} +0 -0
- /package/dist/app/assets/{index.es440-C3FkfJm5.js → index.es506-C3FkfJm5.js} +0 -0
- /package/dist/app/assets/{index.es443-CVw76BM1.js → index.es509-CVw76BM1.js} +0 -0
- /package/dist/app/assets/{index.es444-HnGAYVZD.js → index.es510-HnGAYVZD.js} +0 -0
- /package/dist/app/assets/{index.es445-BVz_zdnA.js → index.es511-BVz_zdnA.js} +0 -0
- /package/dist/app/assets/{index.es446-C3khCPGq.js → index.es512-C3khCPGq.js} +0 -0
- /package/dist/app/assets/{index.es447-D-2ljcwZ.js → index.es513-D-2ljcwZ.js} +0 -0
- /package/dist/app/assets/{index.es448-Cv9koXgw.js → index.es514-Cv9koXgw.js} +0 -0
- /package/dist/app/assets/{index.es449-CD_QflpE.js → index.es515-CD_QflpE.js} +0 -0
- /package/dist/app/assets/{index.es450-DRW-0cLl.js → index.es516-DRW-0cLl.js} +0 -0
- /package/dist/app/assets/{index.es451-C-_shW-Y.js → index.es517-C-_shW-Y.js} +0 -0
- /package/dist/app/assets/{index.es452-LGGdnPYs.js → index.es518-LGGdnPYs.js} +0 -0
- /package/dist/app/assets/{index.es453-C3mMm8J8.js → index.es519-C3mMm8J8.js} +0 -0
- /package/dist/app/assets/{index.es454-BzJJZx-M.js → index.es520-BzJJZx-M.js} +0 -0
- /package/dist/app/assets/{index.es455-BXkSAIEj.js → index.es521-BXkSAIEj.js} +0 -0
- /package/dist/app/assets/{index.es456-BgDCqdQA.js → index.es522-BgDCqdQA.js} +0 -0
- /package/dist/app/assets/{index.es457-C8M2exoo.js → index.es523-C8M2exoo.js} +0 -0
- /package/dist/app/assets/{index.es458-DHJKELXO.js → index.es524-DHJKELXO.js} +0 -0
- /package/dist/app/assets/{index.es459-Cuk6v7N8.js → index.es525-Cuk6v7N8.js} +0 -0
- /package/dist/app/assets/{index.es460-DH5Ifo-i.js → index.es526-DH5Ifo-i.js} +0 -0
- /package/dist/app/assets/{index.es461-E3gJ1_iC.js → index.es527-E3gJ1_iC.js} +0 -0
- /package/dist/app/assets/{index.es462-DAi9KRSo.js → index.es528-DAi9KRSo.js} +0 -0
- /package/dist/app/assets/{index.es463-D7oLnXFd.js → index.es529-D7oLnXFd.js} +0 -0
- /package/dist/app/assets/{index.es464-BfjtVDDH.js → index.es530-BfjtVDDH.js} +0 -0
- /package/dist/app/assets/{index.es465-DnULxvSX.js → index.es531-DnULxvSX.js} +0 -0
- /package/dist/app/assets/{index.es466-CkXjmgJE.js → index.es532-CkXjmgJE.js} +0 -0
- /package/dist/app/assets/{index.es467-CfQXZHmo.js → index.es533-CfQXZHmo.js} +0 -0
- /package/dist/app/assets/{index.es468-DWedfzmr.js → index.es534-DWedfzmr.js} +0 -0
- /package/dist/app/assets/{index.es469-DUszq2jm.js → index.es535-DUszq2jm.js} +0 -0
- /package/dist/app/assets/{index.es470-B7mTdjB0.js → index.es536-B7mTdjB0.js} +0 -0
- /package/dist/app/assets/{index.es471-D5KoaKCx.js → index.es537-D5KoaKCx.js} +0 -0
- /package/dist/app/assets/{index.es472-BfHTSMKl.js → index.es538-BfHTSMKl.js} +0 -0
- /package/dist/app/assets/{index.es473-B0m2ddpp.js → index.es539-B0m2ddpp.js} +0 -0
- /package/dist/app/assets/{index.es474-CyktbL80.js → index.es540-CyktbL80.js} +0 -0
- /package/dist/app/assets/{index.es475-Csfq5Kiy.js → index.es541-Csfq5Kiy.js} +0 -0
- /package/dist/app/assets/{index.es476-CafNBF8u.js → index.es542-CafNBF8u.js} +0 -0
- /package/dist/app/assets/{index.es477-CTRr51gU.js → index.es543-CTRr51gU.js} +0 -0
- /package/dist/app/assets/{index.es478-D4h5O-jR.js → index.es544-D4h5O-jR.js} +0 -0
- /package/dist/app/assets/{index.es479-C39BiMTA.js → index.es545-C39BiMTA.js} +0 -0
- /package/dist/app/assets/{index.es480-Ddv68eIx.js → index.es546-Ddv68eIx.js} +0 -0
- /package/dist/app/assets/{index.es481-GBQ2dnAY.js → index.es547-GBQ2dnAY.js} +0 -0
- /package/dist/app/assets/{index.es482-PoHY5YXO.js → index.es548-PoHY5YXO.js} +0 -0
- /package/dist/app/assets/{index.es483-3e1v2bzS.js → index.es549-3e1v2bzS.js} +0 -0
- /package/dist/app/assets/{index.es484-CS3Unz2-.js → index.es550-CS3Unz2-.js} +0 -0
- /package/dist/app/assets/{index.es485-bN70gL4F.js → index.es551-bN70gL4F.js} +0 -0
- /package/dist/app/assets/{index.es486-CmCqftbK.js → index.es552-CmCqftbK.js} +0 -0
- /package/dist/app/assets/{index.es487-Ds-gbosJ.js → index.es553-Ds-gbosJ.js} +0 -0
- /package/dist/app/assets/{index.es488-CjDtw9vr.js → index.es554-CjDtw9vr.js} +0 -0
- /package/dist/app/assets/{index.es489-BthQWCQV.js → index.es555-BthQWCQV.js} +0 -0
- /package/dist/app/assets/{index.es490-DqwNpetd.js → index.es556-DqwNpetd.js} +0 -0
- /package/dist/app/assets/{index.es491-Bw305WKR.js → index.es557-Bw305WKR.js} +0 -0
- /package/dist/app/assets/{index.es492-DXbdFlpD.js → index.es558-DXbdFlpD.js} +0 -0
- /package/dist/app/assets/{index.es493-L9t79GZl.js → index.es559-L9t79GZl.js} +0 -0
- /package/dist/app/assets/{index.es494-CbfX1IO0.js → index.es560-CbfX1IO0.js} +0 -0
- /package/dist/app/assets/{index.es495-DBQeEorK.js → index.es561-DBQeEorK.js} +0 -0
- /package/dist/app/assets/{index.es496-BEBZ7ncR.js → index.es562-BEBZ7ncR.js} +0 -0
- /package/dist/app/assets/{index.es497-Bkuqu6BP.js → index.es563-Bkuqu6BP.js} +0 -0
- /package/dist/app/assets/{index.es498-D0r3Knsf.js → index.es564-D0r3Knsf.js} +0 -0
- /package/dist/app/assets/{index.es499-CVO1_9PV.js → index.es565-CVO1_9PV.js} +0 -0
package/src/service/project.ts
CHANGED
|
@@ -35,23 +35,22 @@ export class Project {
|
|
|
35
35
|
private packageStatuses: Map<string, PackageInfo> = new Map();
|
|
36
36
|
private malloyConnections: Map<string, BaseConnection>;
|
|
37
37
|
private apiConnections: ApiConnection[];
|
|
38
|
-
private internalConnections: InternalConnection[];
|
|
39
38
|
private projectPath: string;
|
|
40
39
|
private projectName: string;
|
|
40
|
+
private serverRootPath: string;
|
|
41
41
|
public metadata: ApiProject;
|
|
42
42
|
|
|
43
43
|
constructor(
|
|
44
44
|
projectName: string,
|
|
45
45
|
projectPath: string,
|
|
46
46
|
malloyConnections: Map<string, BaseConnection>,
|
|
47
|
-
internalConnections: InternalConnection[],
|
|
48
47
|
apiConnections: InternalConnection[],
|
|
48
|
+
serverRootPath: string,
|
|
49
49
|
) {
|
|
50
50
|
this.projectName = projectName;
|
|
51
51
|
this.projectPath = projectPath;
|
|
52
|
+
this.serverRootPath = serverRootPath;
|
|
52
53
|
this.malloyConnections = malloyConnections;
|
|
53
|
-
// InternalConnections have full connection details for doing schema inspection
|
|
54
|
-
this.internalConnections = internalConnections;
|
|
55
54
|
this.apiConnections = apiConnections;
|
|
56
55
|
this.metadata = {
|
|
57
56
|
resource: `${API_PREFIX}/projects/${this.projectName}`,
|
|
@@ -82,7 +81,6 @@ export class Project {
|
|
|
82
81
|
// Update the project's connection maps
|
|
83
82
|
this.malloyConnections = malloyConnections;
|
|
84
83
|
this.apiConnections = apiConnections;
|
|
85
|
-
this.internalConnections = apiConnections;
|
|
86
84
|
|
|
87
85
|
logger.info(
|
|
88
86
|
`Successfully updated connections for project ${this.projectName}`,
|
|
@@ -101,6 +99,7 @@ export class Project {
|
|
|
101
99
|
projectName: string,
|
|
102
100
|
projectPath: string,
|
|
103
101
|
defaultConnections: ApiConnection[],
|
|
102
|
+
serverRootPath?: string,
|
|
104
103
|
): Promise<Project> {
|
|
105
104
|
if (!(await fs.promises.stat(projectPath)).isDirectory()) {
|
|
106
105
|
throw new ProjectNotFoundError(
|
|
@@ -112,7 +111,12 @@ export class Project {
|
|
|
112
111
|
let apiConnections: InternalConnection[] = [];
|
|
113
112
|
|
|
114
113
|
logger.info(`Creating project with connection configuration`);
|
|
115
|
-
const result = await createConnections(
|
|
114
|
+
const result = await createConnections(
|
|
115
|
+
projectPath,
|
|
116
|
+
defaultConnections,
|
|
117
|
+
projectName,
|
|
118
|
+
serverRootPath,
|
|
119
|
+
);
|
|
116
120
|
malloyConnections = result.malloyConnections;
|
|
117
121
|
apiConnections = result.apiConnections;
|
|
118
122
|
|
|
@@ -129,17 +133,7 @@ export class Project {
|
|
|
129
133
|
projectPath,
|
|
130
134
|
malloyConnections,
|
|
131
135
|
apiConnections,
|
|
132
|
-
|
|
133
|
-
// Create a new ApiConnection object from each InternalConnection
|
|
134
|
-
// by excluding the internal connection details
|
|
135
|
-
// We don't want to send passwords and connection strings to the client
|
|
136
|
-
return {
|
|
137
|
-
name: internalConnection.name,
|
|
138
|
-
type: internalConnection.type,
|
|
139
|
-
attributes: internalConnection.attributes,
|
|
140
|
-
resource: internalConnection.resource,
|
|
141
|
-
};
|
|
142
|
-
}),
|
|
136
|
+
serverRootPath || "",
|
|
143
137
|
);
|
|
144
138
|
}
|
|
145
139
|
|
|
@@ -176,20 +170,6 @@ export class Project {
|
|
|
176
170
|
return connection;
|
|
177
171
|
}
|
|
178
172
|
|
|
179
|
-
// Returns a connection with full connection details for doing schema inspection
|
|
180
|
-
// Don't send this to the client as it contains sensitive information
|
|
181
|
-
public getInternalConnection(connectionName: string): InternalConnection {
|
|
182
|
-
const connection = this.internalConnections.find(
|
|
183
|
-
(connection) => connection.name === connectionName,
|
|
184
|
-
);
|
|
185
|
-
if (!connection) {
|
|
186
|
-
throw new ConnectionNotFoundError(
|
|
187
|
-
`Connection ${connectionName} not found`,
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
return connection;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
173
|
public getMalloyConnection(connectionName: string): BaseConnection {
|
|
194
174
|
const connection = this.malloyConnections.get(connectionName);
|
|
195
175
|
if (!connection) {
|
|
@@ -290,6 +270,7 @@ export class Project {
|
|
|
290
270
|
packageName,
|
|
291
271
|
path.join(this.projectPath, packageName),
|
|
292
272
|
this.malloyConnections,
|
|
273
|
+
this.serverRootPath,
|
|
293
274
|
);
|
|
294
275
|
this.packages.set(packageName, _package);
|
|
295
276
|
|
|
@@ -334,6 +315,7 @@ export class Project {
|
|
|
334
315
|
packageName,
|
|
335
316
|
packagePath,
|
|
336
317
|
this.malloyConnections,
|
|
318
|
+
this.serverRootPath,
|
|
337
319
|
),
|
|
338
320
|
);
|
|
339
321
|
} catch (error) {
|
|
@@ -15,19 +15,6 @@ const serverRootPath = path.join(
|
|
|
15
15
|
"pathways-worker-publisher-project-store-test",
|
|
16
16
|
);
|
|
17
17
|
const projectName = "organizationName-projectName";
|
|
18
|
-
const testConnections: Connection[] = [
|
|
19
|
-
{
|
|
20
|
-
name: "testConnection",
|
|
21
|
-
type: "postgres",
|
|
22
|
-
postgresConnection: {
|
|
23
|
-
host: "host",
|
|
24
|
-
port: 1234,
|
|
25
|
-
databaseName: "databaseName",
|
|
26
|
-
userName: "userName",
|
|
27
|
-
password: "password",
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
];
|
|
31
18
|
|
|
32
19
|
let sandbox: sinon.SinonSandbox;
|
|
33
20
|
|
|
@@ -72,13 +59,6 @@ describe("ProjectStore Service", () => {
|
|
|
72
59
|
const projectPath = path.join(serverRootPath, projectName);
|
|
73
60
|
mkdirSync(projectPath, { recursive: true });
|
|
74
61
|
|
|
75
|
-
// Create connections file
|
|
76
|
-
const connectionsPath = path.join(
|
|
77
|
-
projectPath,
|
|
78
|
-
"publisher.connections.json",
|
|
79
|
-
);
|
|
80
|
-
writeFileSync(connectionsPath, JSON.stringify(testConnections));
|
|
81
|
-
|
|
82
62
|
// Create publisher config
|
|
83
63
|
const publisherConfigPath = path.join(
|
|
84
64
|
serverRootPath,
|
|
@@ -87,6 +67,7 @@ describe("ProjectStore Service", () => {
|
|
|
87
67
|
writeFileSync(
|
|
88
68
|
publisherConfigPath,
|
|
89
69
|
JSON.stringify({
|
|
70
|
+
frozenConfig: false,
|
|
90
71
|
projects: [
|
|
91
72
|
{
|
|
92
73
|
name: projectName,
|
|
@@ -96,6 +77,12 @@ describe("ProjectStore Service", () => {
|
|
|
96
77
|
location: projectPath,
|
|
97
78
|
},
|
|
98
79
|
],
|
|
80
|
+
connections: [
|
|
81
|
+
{
|
|
82
|
+
name: "testConnection",
|
|
83
|
+
type: "postgres",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
99
86
|
},
|
|
100
87
|
],
|
|
101
88
|
}),
|
|
@@ -117,16 +104,6 @@ describe("ProjectStore Service", () => {
|
|
|
117
104
|
mkdirSync(projectPath1, { recursive: true });
|
|
118
105
|
mkdirSync(projectPath2, { recursive: true });
|
|
119
106
|
|
|
120
|
-
// Create connections files
|
|
121
|
-
writeFileSync(
|
|
122
|
-
path.join(projectPath1, "publisher.connections.json"),
|
|
123
|
-
JSON.stringify(testConnections),
|
|
124
|
-
);
|
|
125
|
-
writeFileSync(
|
|
126
|
-
path.join(projectPath2, "publisher.connections.json"),
|
|
127
|
-
JSON.stringify(testConnections),
|
|
128
|
-
);
|
|
129
|
-
|
|
130
107
|
// Create publisher config
|
|
131
108
|
const publisherConfigPath = path.join(
|
|
132
109
|
serverRootPath,
|
|
@@ -135,6 +112,7 @@ describe("ProjectStore Service", () => {
|
|
|
135
112
|
writeFileSync(
|
|
136
113
|
publisherConfigPath,
|
|
137
114
|
JSON.stringify({
|
|
115
|
+
frozenConfig: false,
|
|
138
116
|
projects: [
|
|
139
117
|
{
|
|
140
118
|
name: projectName1,
|
|
@@ -144,6 +122,12 @@ describe("ProjectStore Service", () => {
|
|
|
144
122
|
location: projectPath1,
|
|
145
123
|
},
|
|
146
124
|
],
|
|
125
|
+
connections: [
|
|
126
|
+
{
|
|
127
|
+
name: "testConnection",
|
|
128
|
+
type: "postgres",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
147
131
|
},
|
|
148
132
|
{
|
|
149
133
|
name: projectName2,
|
|
@@ -153,6 +137,13 @@ describe("ProjectStore Service", () => {
|
|
|
153
137
|
location: projectPath2,
|
|
154
138
|
},
|
|
155
139
|
],
|
|
140
|
+
connections: [
|
|
141
|
+
{
|
|
142
|
+
name: "testConnection2",
|
|
143
|
+
type: "bigquery",
|
|
144
|
+
bigqueryConnection: {},
|
|
145
|
+
},
|
|
146
|
+
],
|
|
156
147
|
},
|
|
157
148
|
],
|
|
158
149
|
}),
|
|
@@ -174,14 +165,6 @@ describe("ProjectStore Service", () => {
|
|
|
174
165
|
// Create a project directory
|
|
175
166
|
const projectPath = path.join(serverRootPath, projectName);
|
|
176
167
|
mkdirSync(projectPath, { recursive: true });
|
|
177
|
-
|
|
178
|
-
// Create connections file
|
|
179
|
-
const connectionsPath = path.join(
|
|
180
|
-
projectPath,
|
|
181
|
-
"publisher.connections.json",
|
|
182
|
-
);
|
|
183
|
-
writeFileSync(connectionsPath, JSON.stringify(testConnections));
|
|
184
|
-
|
|
185
168
|
// Create publisher config
|
|
186
169
|
const publisherConfigPath = path.join(
|
|
187
170
|
serverRootPath,
|
|
@@ -221,13 +204,6 @@ describe("ProjectStore Service", () => {
|
|
|
221
204
|
const projectPath = path.join(serverRootPath, projectName);
|
|
222
205
|
mkdirSync(projectPath, { recursive: true });
|
|
223
206
|
|
|
224
|
-
// Create connections file
|
|
225
|
-
const connectionsPath = path.join(
|
|
226
|
-
projectPath,
|
|
227
|
-
"publisher.connections.json",
|
|
228
|
-
);
|
|
229
|
-
writeFileSync(connectionsPath, JSON.stringify(testConnections));
|
|
230
|
-
|
|
231
207
|
// Create publisher config
|
|
232
208
|
const publisherConfigPath = path.join(
|
|
233
209
|
serverRootPath,
|
|
@@ -310,14 +286,6 @@ describe("ProjectStore Service", () => {
|
|
|
310
286
|
const projectPath = path.join(serverRootPath, projectName);
|
|
311
287
|
mkdirSync(projectPath, { recursive: true });
|
|
312
288
|
|
|
313
|
-
// Create connections file
|
|
314
|
-
const connectionsPath = path.join(
|
|
315
|
-
projectPath,
|
|
316
|
-
"publisher.connections.json",
|
|
317
|
-
);
|
|
318
|
-
writeFileSync(connectionsPath, JSON.stringify(testConnections));
|
|
319
|
-
|
|
320
|
-
// Create publisher config
|
|
321
289
|
const publisherConfigPath = path.join(
|
|
322
290
|
serverRootPath,
|
|
323
291
|
"publisher.config.json",
|
|
@@ -325,6 +293,7 @@ describe("ProjectStore Service", () => {
|
|
|
325
293
|
writeFileSync(
|
|
326
294
|
publisherConfigPath,
|
|
327
295
|
JSON.stringify({
|
|
296
|
+
frozenConfig: false,
|
|
328
297
|
projects: [
|
|
329
298
|
{
|
|
330
299
|
name: projectName,
|
|
@@ -334,11 +303,19 @@ describe("ProjectStore Service", () => {
|
|
|
334
303
|
location: projectPath,
|
|
335
304
|
},
|
|
336
305
|
],
|
|
306
|
+
connections: [
|
|
307
|
+
{
|
|
308
|
+
name: "testConnection",
|
|
309
|
+
type: "postgres",
|
|
310
|
+
},
|
|
311
|
+
],
|
|
337
312
|
},
|
|
338
313
|
],
|
|
339
314
|
}),
|
|
340
315
|
);
|
|
341
316
|
|
|
317
|
+
await projectStore.finishedInitialization;
|
|
318
|
+
|
|
342
319
|
// Test concurrent access to the same project
|
|
343
320
|
const promises = Array.from({ length: 5 }, () =>
|
|
344
321
|
projectStore.getProject(projectName),
|
|
@@ -6,13 +6,13 @@ import * as path from "path";
|
|
|
6
6
|
import simpleGit from "simple-git";
|
|
7
7
|
import { Writable } from "stream";
|
|
8
8
|
import { components } from "../api";
|
|
9
|
-
import { getPublisherConfig, isPublisherConfigFrozen } from "../config";
|
|
10
9
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from "../
|
|
10
|
+
getProcessedPublisherConfig,
|
|
11
|
+
isPublisherConfigFrozen,
|
|
12
|
+
ProcessedPublisherConfig,
|
|
13
|
+
ProcessedProject,
|
|
14
|
+
} from "../config";
|
|
15
|
+
import { API_PREFIX, PUBLISHER_CONFIG_NAME, publisherPath } from "../constants";
|
|
16
16
|
import {
|
|
17
17
|
FrozenConfigError,
|
|
18
18
|
PackageNotFoundError,
|
|
@@ -57,6 +57,7 @@ export class ProjectStore {
|
|
|
57
57
|
{
|
|
58
58
|
name: project.name,
|
|
59
59
|
resource: `${API_PREFIX}/projects/${project.name}`,
|
|
60
|
+
connections: project.connections,
|
|
60
61
|
},
|
|
61
62
|
true,
|
|
62
63
|
);
|
|
@@ -154,6 +155,7 @@ export class ProjectStore {
|
|
|
154
155
|
project = await this.addProject({
|
|
155
156
|
name: projectName,
|
|
156
157
|
resource: `${API_PREFIX}/projects/${projectName}`,
|
|
158
|
+
connections: projectConfig?.connections || [],
|
|
157
159
|
});
|
|
158
160
|
}
|
|
159
161
|
return project;
|
|
@@ -213,6 +215,7 @@ export class ProjectStore {
|
|
|
213
215
|
projectName,
|
|
214
216
|
absoluteProjectPath,
|
|
215
217
|
project.connections || [],
|
|
218
|
+
this.serverRootPath,
|
|
216
219
|
);
|
|
217
220
|
this.projects.set(projectName, newProject);
|
|
218
221
|
return newProject;
|
|
@@ -266,29 +269,25 @@ export class ProjectStore {
|
|
|
266
269
|
return project;
|
|
267
270
|
}
|
|
268
271
|
|
|
269
|
-
public static async reloadProjectManifest(
|
|
272
|
+
public static async reloadProjectManifest(
|
|
273
|
+
serverRootPath: string,
|
|
274
|
+
): Promise<ProcessedPublisherConfig> {
|
|
270
275
|
try {
|
|
271
|
-
return
|
|
276
|
+
return getProcessedPublisherConfig(serverRootPath);
|
|
272
277
|
} catch (error) {
|
|
273
278
|
if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
274
279
|
logger.error(
|
|
275
280
|
`Error reading ${PUBLISHER_CONFIG_NAME}. Generating from directory`,
|
|
276
281
|
{ error },
|
|
277
282
|
);
|
|
278
|
-
return { projects: [] };
|
|
283
|
+
return { frozenConfig: false, projects: [] };
|
|
279
284
|
} else {
|
|
280
285
|
// If publisher.config.json is missing, generate the manifest from directories
|
|
281
286
|
try {
|
|
282
287
|
const entries = await fs.promises.readdir(serverRootPath, {
|
|
283
288
|
withFileTypes: true,
|
|
284
289
|
});
|
|
285
|
-
const projects:
|
|
286
|
-
name: string;
|
|
287
|
-
packages: {
|
|
288
|
-
name: string;
|
|
289
|
-
location: string;
|
|
290
|
-
}[];
|
|
291
|
-
}[] = [];
|
|
290
|
+
const projects: ProcessedProject[] = [];
|
|
292
291
|
for (const entry of entries) {
|
|
293
292
|
if (entry.isDirectory()) {
|
|
294
293
|
projects.push({
|
|
@@ -296,18 +295,19 @@ export class ProjectStore {
|
|
|
296
295
|
packages: [
|
|
297
296
|
{
|
|
298
297
|
name: entry.name,
|
|
299
|
-
location: entry.name,
|
|
298
|
+
location: `./${entry.name}` as const,
|
|
300
299
|
},
|
|
301
300
|
],
|
|
301
|
+
connections: [],
|
|
302
302
|
});
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
|
-
return { projects };
|
|
305
|
+
return { frozenConfig: false, projects };
|
|
306
306
|
} catch (lsError) {
|
|
307
307
|
logger.error(`Error listing directories in ${serverRootPath}`, {
|
|
308
308
|
error: lsError,
|
|
309
309
|
});
|
|
310
|
-
return { projects: [] };
|
|
310
|
+
return { frozenConfig: false, projects: [] };
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
313
|
}
|
|
@@ -429,52 +429,27 @@ export class ProjectStore {
|
|
|
429
429
|
);
|
|
430
430
|
}
|
|
431
431
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
this.serverRootPath,
|
|
439
|
-
CONNECTIONS_MANIFEST_NAME,
|
|
440
|
-
);
|
|
441
|
-
const connectionsFileInProject = path.join(
|
|
442
|
-
absoluteTargetPath,
|
|
443
|
-
CONNECTIONS_MANIFEST_NAME,
|
|
432
|
+
} catch (error) {
|
|
433
|
+
logger.error(`Failed to download or mount location "${location}"`, {
|
|
434
|
+
error,
|
|
435
|
+
});
|
|
436
|
+
throw new PackageNotFoundError(
|
|
437
|
+
`Failed to download or mount location: ${location}`,
|
|
444
438
|
);
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
{
|
|
448
|
-
path: connectionsFileInDownload,
|
|
449
|
-
description: "projectLocation",
|
|
450
|
-
},
|
|
451
|
-
{ path: connectionsFileInServerRoot, description: "serverRoot" },
|
|
452
|
-
];
|
|
453
|
-
|
|
454
|
-
for (const source of sources) {
|
|
455
|
-
try {
|
|
456
|
-
await fs.promises.access(source.path, fs.constants.F_OK);
|
|
457
|
-
await fs.promises.cp(source.path, connectionsFileInProject);
|
|
458
|
-
logger.info(
|
|
459
|
-
`Copied ${CONNECTIONS_MANIFEST_NAME} from ${source.description} to project directory`,
|
|
460
|
-
);
|
|
461
|
-
break;
|
|
462
|
-
} catch (_error) {
|
|
463
|
-
if (source.description === "projectLocation") {
|
|
464
|
-
logger.info(
|
|
465
|
-
`No ${CONNECTIONS_MANIFEST_NAME} found in downloaded location, checking in server root for ${CONNECTIONS_MANIFEST_NAME}`,
|
|
466
|
-
);
|
|
467
|
-
} else {
|
|
468
|
-
logger.info(`No ${CONNECTIONS_MANIFEST_NAME} found`);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
} finally {
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
473
441
|
// Clean up temporary download directory
|
|
474
442
|
await fs.promises.rm(tempDownloadPath, {
|
|
475
443
|
recursive: true,
|
|
476
444
|
force: true,
|
|
477
445
|
});
|
|
446
|
+
} catch (error) {
|
|
447
|
+
logger.warn(
|
|
448
|
+
`Failed to clean up temporary download directory "${tempDownloadPath}"`,
|
|
449
|
+
{
|
|
450
|
+
error,
|
|
451
|
+
},
|
|
452
|
+
);
|
|
478
453
|
}
|
|
479
454
|
}
|
|
480
455
|
|
|
@@ -716,23 +691,80 @@ export class ProjectStore {
|
|
|
716
691
|
}
|
|
717
692
|
|
|
718
693
|
async downloadGitHubDirectory(githubUrl: string, absoluteDirPath: string) {
|
|
719
|
-
|
|
694
|
+
// First we'll clone the repo without the additional path
|
|
695
|
+
// E.g. we're removing `/tree/main/imdb` from https://github.com/credibledata/malloy-samples/tree/main/imdb
|
|
696
|
+
const githubRepoRegex =
|
|
697
|
+
/github\.com\/(?<owner>[^/]+)\/(?<repoName>[^/]+)(?<packagePath>\/[^/]+)*/;
|
|
698
|
+
const match = githubUrl.match(githubRepoRegex);
|
|
699
|
+
if (!match) {
|
|
700
|
+
throw new Error(`Invalid GitHub URL: ${githubUrl}`);
|
|
701
|
+
}
|
|
702
|
+
const { owner, repoName, packagePath } = match.groups!;
|
|
703
|
+
const cleanPackagePath = packagePath.replace("/tree/main", "");
|
|
704
|
+
// We'll make sure whatever was in absoluteDirPath is removed,
|
|
705
|
+
// so we have a nice a clean directory where we can clone the repo
|
|
706
|
+
await fs.promises.rm(absoluteDirPath, {
|
|
707
|
+
recursive: true,
|
|
708
|
+
force: true,
|
|
709
|
+
});
|
|
720
710
|
await fs.promises.mkdir(absoluteDirPath, { recursive: true });
|
|
721
|
-
|
|
711
|
+
const repoUrl = `https://github.com/${owner}/${repoName}`;
|
|
712
|
+
// We'll clone the repo into absoluteDirPath
|
|
722
713
|
await new Promise<void>((resolve, reject) => {
|
|
723
|
-
simpleGit().clone(
|
|
714
|
+
simpleGit().clone(repoUrl, absoluteDirPath, {}, (err) => {
|
|
724
715
|
if (err) {
|
|
725
716
|
console.error(err);
|
|
726
|
-
logger.error(
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
error: err,
|
|
730
|
-
},
|
|
731
|
-
);
|
|
717
|
+
logger.error(`Failed to clone GitHub repository "${repoUrl}"`, {
|
|
718
|
+
error: err,
|
|
719
|
+
});
|
|
732
720
|
reject(err);
|
|
733
721
|
}
|
|
734
722
|
resolve();
|
|
735
723
|
});
|
|
736
724
|
});
|
|
725
|
+
// After cloning, we'll replace all contents of absoluteDirPath with the contents of absoluteDirPath/cleanPackagePath
|
|
726
|
+
// E.g. we're moving /var/publisher/asd123/imdb/publisher.json into /var/publisher/asd123/publisher.json
|
|
727
|
+
|
|
728
|
+
// Remove all contents of absoluteDirPath (/var/publisher/asd123)
|
|
729
|
+
// except for the cleanPackagePath directory (/var/publisher/asd123/imdb)
|
|
730
|
+
const packageFullPath = path.join(absoluteDirPath, cleanPackagePath);
|
|
731
|
+
|
|
732
|
+
// Check if the cleanPackagePath (/var/publisher/asd123/imdb) exists
|
|
733
|
+
const packageExists = await fs.promises
|
|
734
|
+
.access(packageFullPath)
|
|
735
|
+
.then(() => true)
|
|
736
|
+
.catch(() => false);
|
|
737
|
+
|
|
738
|
+
if (!packageExists) {
|
|
739
|
+
throw new Error(
|
|
740
|
+
`Package path "${cleanPackagePath}" does not exist in the cloned repository.`,
|
|
741
|
+
);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// Remove everything in absoluteDirPath (/var/publisher/asd123)
|
|
745
|
+
const dirContents = await fs.promises.readdir(absoluteDirPath);
|
|
746
|
+
for (const entry of dirContents) {
|
|
747
|
+
// Don't remove the cleanPackagePath directory itself (/var/publisher/asd123/imdb)
|
|
748
|
+
if (entry !== cleanPackagePath.replace(/^\/+/, "").split("/")[0]) {
|
|
749
|
+
await fs.promises.rm(path.join(absoluteDirPath, entry), {
|
|
750
|
+
recursive: true,
|
|
751
|
+
force: true,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
// Now, move the contents of packageFullPath (/var/publisher/asd123/imdb) up to absoluteDirPath (/var/publisher/asd123)
|
|
757
|
+
const packageContents = await fs.promises.readdir(packageFullPath);
|
|
758
|
+
for (const entry of packageContents) {
|
|
759
|
+
await fs.promises.rename(
|
|
760
|
+
path.join(packageFullPath, entry),
|
|
761
|
+
path.join(absoluteDirPath, entry),
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
// Remove the now-empty cleanPackagePath directory (/var/publisher/asd123/imdb)
|
|
766
|
+
await fs.promises.rm(packageFullPath, { recursive: true, force: true });
|
|
767
|
+
|
|
768
|
+
// https://github.com/credibledata/malloy-samples/imdb/publisher.json -> ${absoluteDirPath}/publisher.json
|
|
737
769
|
}
|
|
738
770
|
}
|