@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/eslint.config.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { fixupConfigRules, fixupPluginRules } from "@eslint/compat";
|
|
2
|
+
import { FlatCompat } from "@eslint/eslintrc";
|
|
3
|
+
import js from "@eslint/js";
|
|
2
4
|
import typescriptEslint from "@typescript-eslint/eslint-plugin";
|
|
3
|
-
import globals from "globals";
|
|
4
5
|
import tsParser from "@typescript-eslint/parser";
|
|
6
|
+
import globals from "globals";
|
|
5
7
|
import path from "node:path";
|
|
6
8
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import js from "@eslint/js";
|
|
8
|
-
import { FlatCompat } from "@eslint/eslintrc";
|
|
9
9
|
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
11
|
const __dirname = path.dirname(__filename);
|
|
@@ -16,6 +16,19 @@ const compat = new FlatCompat({
|
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
export default [
|
|
19
|
+
{
|
|
20
|
+
ignores: [
|
|
21
|
+
"**/node_modules/**",
|
|
22
|
+
"**/dist/**",
|
|
23
|
+
"**/build/**",
|
|
24
|
+
"**/.DS_Store",
|
|
25
|
+
"**/__pycache__/**",
|
|
26
|
+
"**/*.py[cod]",
|
|
27
|
+
"**/*.egg-info/**",
|
|
28
|
+
"**/.env",
|
|
29
|
+
"**/*.log",
|
|
30
|
+
],
|
|
31
|
+
},
|
|
19
32
|
...fixupConfigRules(
|
|
20
33
|
compat.extends(
|
|
21
34
|
"eslint:recommended",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@malloy-publisher/server",
|
|
3
3
|
"description": "Malloy Publisher Server",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.108",
|
|
5
5
|
"main": "dist/server.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"malloy-publisher": "dist/server.js"
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@google-cloud/storage": "^7.16.0",
|
|
26
|
-
"@malloydata/db-bigquery": "^0.0.
|
|
27
|
-
"@malloydata/db-duckdb": "^0.0.
|
|
28
|
-
"@malloydata/db-mysql": "^0.0.
|
|
29
|
-
"@malloydata/db-postgres": "^0.0.
|
|
30
|
-
"@malloydata/db-snowflake": "^0.0.
|
|
31
|
-
"@malloydata/db-trino": "^0.0.
|
|
32
|
-
"@malloydata/malloy": "^0.0.
|
|
33
|
-
"@malloydata/malloy-sql": "^0.0.
|
|
34
|
-
"@malloydata/render": "^0.0.
|
|
26
|
+
"@malloydata/db-bigquery": "^0.0.310",
|
|
27
|
+
"@malloydata/db-duckdb": "^0.0.310",
|
|
28
|
+
"@malloydata/db-mysql": "^0.0.310",
|
|
29
|
+
"@malloydata/db-postgres": "^0.0.310",
|
|
30
|
+
"@malloydata/db-snowflake": "^0.0.310",
|
|
31
|
+
"@malloydata/db-trino": "^0.0.310",
|
|
32
|
+
"@malloydata/malloy": "^0.0.310",
|
|
33
|
+
"@malloydata/malloy-sql": "^0.0.310",
|
|
34
|
+
"@malloydata/render": "^0.0.310",
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.13.2",
|
|
36
36
|
"@opentelemetry/api": "^1.9.0",
|
|
37
37
|
"@opentelemetry/auto-instrumentations-node": "^0.57.0",
|
package/publisher.config.json
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
2
|
+
"frozenConfig": false,
|
|
3
|
+
"projects": [
|
|
4
|
+
{
|
|
5
|
+
"name": "malloy-samples",
|
|
6
|
+
"packages": [
|
|
7
|
+
{
|
|
8
|
+
"name": "ecommerce",
|
|
9
|
+
"location": "https://github.com/credibledata/malloy-samples/tree/main/ecommerce"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "imdb",
|
|
13
|
+
"location": "https://github.com/credibledata/malloy-samples/tree/main/imdb"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "faa",
|
|
17
|
+
"location": "https://github.com/credibledata/malloy-samples/tree/main/faa"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "bigquery-hackernews",
|
|
21
|
+
"location": "https://github.com/credibledata/malloy-samples/tree/main/bigquery-hackernews"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"connections": [
|
|
25
|
+
{
|
|
26
|
+
"name": "bigquery",
|
|
27
|
+
"type": "bigquery",
|
|
28
|
+
"bigqueryConnection": {}
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import { PUBLISHER_CONFIG_NAME } from "./constants";
|
|
3
|
+
import { PUBLISHER_CONFIG_NAME, API_PREFIX } from "./constants";
|
|
4
|
+
import { components } from "./api";
|
|
4
5
|
|
|
5
6
|
type FilesystemPath = `./${string}` | `../${string}` | `/${string}`;
|
|
6
7
|
type GcsPath = `gs://${string}`;
|
|
8
|
+
type ApiConnection = components["schemas"]["Connection"];
|
|
7
9
|
|
|
8
10
|
export type Package = {
|
|
9
11
|
name: string;
|
|
10
12
|
location: FilesystemPath | GcsPath;
|
|
11
13
|
};
|
|
12
14
|
|
|
15
|
+
export type Connection = {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
13
20
|
export type Project = {
|
|
14
21
|
name: string;
|
|
15
22
|
packages: Package[];
|
|
23
|
+
connections?: Connection[];
|
|
16
24
|
};
|
|
17
25
|
|
|
18
26
|
export type PublisherConfig = {
|
|
@@ -20,6 +28,17 @@ export type PublisherConfig = {
|
|
|
20
28
|
projects: Project[];
|
|
21
29
|
};
|
|
22
30
|
|
|
31
|
+
export type ProcessedProject = {
|
|
32
|
+
name: string;
|
|
33
|
+
packages: Package[];
|
|
34
|
+
connections: ApiConnection[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type ProcessedPublisherConfig = {
|
|
38
|
+
frozenConfig: boolean;
|
|
39
|
+
projects: ProcessedProject[];
|
|
40
|
+
};
|
|
41
|
+
|
|
23
42
|
export const getPublisherConfig = (serverRoot: string): PublisherConfig => {
|
|
24
43
|
const publisherConfigPath = path.join(serverRoot, PUBLISHER_CONFIG_NAME);
|
|
25
44
|
if (!fs.existsSync(publisherConfigPath)) {
|
|
@@ -47,3 +66,44 @@ export const isPublisherConfigFrozen = (serverRoot: string) => {
|
|
|
47
66
|
const publisherConfig = getPublisherConfig(serverRoot);
|
|
48
67
|
return Boolean(publisherConfig.frozenConfig);
|
|
49
68
|
};
|
|
69
|
+
|
|
70
|
+
export const getConnectionsFromPublisherConfig = (
|
|
71
|
+
serverRoot: string,
|
|
72
|
+
projectName: string,
|
|
73
|
+
): Connection[] => {
|
|
74
|
+
const publisherConfig = getPublisherConfig(serverRoot);
|
|
75
|
+
const project = publisherConfig.projects.find((p) => p.name === projectName);
|
|
76
|
+
return project?.connections || [];
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const convertConnectionsToApiConnections = (
|
|
80
|
+
connections: Connection[],
|
|
81
|
+
): ApiConnection[] => {
|
|
82
|
+
return connections.map((conn) => ({
|
|
83
|
+
...conn,
|
|
84
|
+
name: conn.name,
|
|
85
|
+
type: conn.type as
|
|
86
|
+
| "postgres"
|
|
87
|
+
| "bigquery"
|
|
88
|
+
| "snowflake"
|
|
89
|
+
| "trino"
|
|
90
|
+
| "mysql",
|
|
91
|
+
resource: `${API_PREFIX}/connections/${conn.name}`,
|
|
92
|
+
}));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const getProcessedPublisherConfig = (
|
|
96
|
+
serverRoot: string,
|
|
97
|
+
): ProcessedPublisherConfig => {
|
|
98
|
+
const rawConfig = getPublisherConfig(serverRoot);
|
|
99
|
+
return {
|
|
100
|
+
frozenConfig: rawConfig.frozenConfig,
|
|
101
|
+
projects: rawConfig.projects.map((project) => ({
|
|
102
|
+
name: project.name,
|
|
103
|
+
packages: project.packages,
|
|
104
|
+
connections: convertConnectionsToApiConnections(
|
|
105
|
+
project.connections || [],
|
|
106
|
+
),
|
|
107
|
+
})),
|
|
108
|
+
};
|
|
109
|
+
};
|
package/src/constants.ts
CHANGED
|
@@ -5,7 +5,6 @@ export const API_PREFIX = "/api/v0";
|
|
|
5
5
|
export const README_NAME = "README.md";
|
|
6
6
|
export const PUBLISHER_CONFIG_NAME = "publisher.config.json";
|
|
7
7
|
export const PACKAGE_MANIFEST_NAME = "publisher.json";
|
|
8
|
-
export const CONNECTIONS_MANIFEST_NAME = "publisher.connections.json";
|
|
9
8
|
export const MODEL_FILE_SUFFIX = ".malloy";
|
|
10
9
|
export const NOTEBOOK_FILE_SUFFIX = ".malloynb";
|
|
11
10
|
export const ROW_LIMIT = 1000;
|
|
@@ -46,7 +46,7 @@ export class ConnectionController {
|
|
|
46
46
|
connectionName: string,
|
|
47
47
|
): Promise<ApiSchemaName[]> {
|
|
48
48
|
const project = await this.projectStore.getProject(projectName, false);
|
|
49
|
-
const connection = project.
|
|
49
|
+
const connection = project.getApiConnection(connectionName);
|
|
50
50
|
return getSchemasForConnection(connection);
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -57,7 +57,7 @@ export class ConnectionController {
|
|
|
57
57
|
schemaName: string,
|
|
58
58
|
): Promise<string[]> {
|
|
59
59
|
const project = await this.projectStore.getProject(projectName, false);
|
|
60
|
-
const connection = project.
|
|
60
|
+
const connection = project.getApiConnection(connectionName);
|
|
61
61
|
return getTablesForSchema(connection, schemaName);
|
|
62
62
|
}
|
|
63
63
|
|
package/src/server.ts
CHANGED
|
@@ -3,7 +3,6 @@ import * as bodyParser from "body-parser";
|
|
|
3
3
|
import cors from "cors";
|
|
4
4
|
import express from "express";
|
|
5
5
|
import * as http from "http";
|
|
6
|
-
import { createProxyMiddleware } from "http-proxy-middleware";
|
|
7
6
|
import { AddressInfo } from "net";
|
|
8
7
|
import * as path from "path";
|
|
9
8
|
import { ConnectionController } from "./controller/connection.controller";
|
|
@@ -81,7 +80,6 @@ const isDevelopment = process.env["NODE_ENV"] === "development";
|
|
|
81
80
|
|
|
82
81
|
const app = express();
|
|
83
82
|
app.use(loggerMiddleware);
|
|
84
|
-
app.use(cors());
|
|
85
83
|
|
|
86
84
|
const projectStore = new ProjectStore(SERVER_ROOT);
|
|
87
85
|
const watchModeController = new WatchModeController(projectStore);
|
|
@@ -186,16 +184,6 @@ if (!isDevelopment) {
|
|
|
186
184
|
// In development mode, proxy requests to React dev server
|
|
187
185
|
// Handle API routes first
|
|
188
186
|
app.use(`${API_PREFIX}`, loggerMiddleware);
|
|
189
|
-
|
|
190
|
-
// Proxy everything else to Vite
|
|
191
|
-
app.use(
|
|
192
|
-
createProxyMiddleware({
|
|
193
|
-
target: "http://localhost:5173",
|
|
194
|
-
changeOrigin: true,
|
|
195
|
-
ws: true,
|
|
196
|
-
pathFilter: (path) => !path.startsWith("/api/"),
|
|
197
|
-
}),
|
|
198
|
-
);
|
|
199
187
|
}
|
|
200
188
|
|
|
201
189
|
const setVersionIdError = (res: express.Response) => {
|
|
@@ -205,7 +193,12 @@ const setVersionIdError = (res: express.Response) => {
|
|
|
205
193
|
res.status(status).json(json);
|
|
206
194
|
};
|
|
207
195
|
|
|
208
|
-
app.use(
|
|
196
|
+
app.use(
|
|
197
|
+
cors({
|
|
198
|
+
origin: "http://localhost:5173",
|
|
199
|
+
credentials: true,
|
|
200
|
+
}),
|
|
201
|
+
);
|
|
209
202
|
app.use(bodyParser.json());
|
|
210
203
|
|
|
211
204
|
app.get(`${API_PREFIX}/status`, async (_req, res) => {
|
|
@@ -378,6 +371,9 @@ app.get(
|
|
|
378
371
|
},
|
|
379
372
|
);
|
|
380
373
|
|
|
374
|
+
/**
|
|
375
|
+
* @deprecated Use /projects/:projectName/connections/:connectionName/sqlSource POST method instead
|
|
376
|
+
*/
|
|
381
377
|
app.get(
|
|
382
378
|
`${API_PREFIX}/projects/:projectName/connections/:connectionName/sqlSource`,
|
|
383
379
|
async (req, res) => {
|
|
@@ -397,6 +393,25 @@ app.get(
|
|
|
397
393
|
},
|
|
398
394
|
);
|
|
399
395
|
|
|
396
|
+
app.post(
|
|
397
|
+
`${API_PREFIX}/projects/:projectName/connections/:connectionName/sqlSource`,
|
|
398
|
+
async (req, res) => {
|
|
399
|
+
try {
|
|
400
|
+
res.status(200).json(
|
|
401
|
+
await connectionController.getConnectionSqlSource(
|
|
402
|
+
req.params.projectName,
|
|
403
|
+
req.params.connectionName,
|
|
404
|
+
req.body.sqlStatement as string,
|
|
405
|
+
),
|
|
406
|
+
);
|
|
407
|
+
} catch (error) {
|
|
408
|
+
logger.error(error);
|
|
409
|
+
const { json, status } = internalErrorToHttpError(error as Error);
|
|
410
|
+
res.status(status).json(json);
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
);
|
|
414
|
+
|
|
400
415
|
app.get(
|
|
401
416
|
`${API_PREFIX}/projects/:projectName/connections/:connectionName/tableSource`,
|
|
402
417
|
async (req, res) => {
|
|
@@ -417,6 +432,9 @@ app.get(
|
|
|
417
432
|
},
|
|
418
433
|
);
|
|
419
434
|
|
|
435
|
+
/**
|
|
436
|
+
* @deprecated Use /projects/:projectName/connections/:connectionName/queryData POST method instead
|
|
437
|
+
*/
|
|
420
438
|
app.get(
|
|
421
439
|
`${API_PREFIX}/projects/:projectName/connections/:connectionName/queryData`,
|
|
422
440
|
async (req, res) => {
|
|
@@ -437,6 +455,29 @@ app.get(
|
|
|
437
455
|
},
|
|
438
456
|
);
|
|
439
457
|
|
|
458
|
+
app.post(
|
|
459
|
+
`${API_PREFIX}/projects/:projectName/connections/:connectionName/queryData`,
|
|
460
|
+
async (req, res) => {
|
|
461
|
+
try {
|
|
462
|
+
res.status(200).json(
|
|
463
|
+
await connectionController.getConnectionQueryData(
|
|
464
|
+
req.params.projectName,
|
|
465
|
+
req.params.connectionName,
|
|
466
|
+
req.body.sqlStatement as string,
|
|
467
|
+
req.query.options as string,
|
|
468
|
+
),
|
|
469
|
+
);
|
|
470
|
+
} catch (error) {
|
|
471
|
+
logger.error(error);
|
|
472
|
+
const { json, status } = internalErrorToHttpError(error as Error);
|
|
473
|
+
res.status(status).json(json);
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* @deprecated Use /projects/:projectName/connections/:connectionName/temporaryTable POST method instead
|
|
480
|
+
*/
|
|
440
481
|
app.get(
|
|
441
482
|
`${API_PREFIX}/projects/:projectName/connections/:connectionName/temporaryTable`,
|
|
442
483
|
async (req, res) => {
|
|
@@ -456,6 +497,25 @@ app.get(
|
|
|
456
497
|
},
|
|
457
498
|
);
|
|
458
499
|
|
|
500
|
+
app.post(
|
|
501
|
+
`${API_PREFIX}/projects/:projectName/connections/:connectionName/temporaryTable`,
|
|
502
|
+
async (req, res) => {
|
|
503
|
+
try {
|
|
504
|
+
res.status(200).json(
|
|
505
|
+
await connectionController.getConnectionTemporaryTable(
|
|
506
|
+
req.params.projectName,
|
|
507
|
+
req.params.connectionName,
|
|
508
|
+
req.body.sqlStatement as string,
|
|
509
|
+
),
|
|
510
|
+
);
|
|
511
|
+
} catch (error) {
|
|
512
|
+
logger.error(error);
|
|
513
|
+
const { json, status } = internalErrorToHttpError(error as Error);
|
|
514
|
+
res.status(status).json(json);
|
|
515
|
+
}
|
|
516
|
+
},
|
|
517
|
+
);
|
|
518
|
+
|
|
459
519
|
app.get(`${API_PREFIX}/projects/:projectName/packages`, async (req, res) => {
|
|
460
520
|
if (req.query.versionId) {
|
|
461
521
|
setVersionIdError(res);
|
|
@@ -11,7 +11,11 @@ import fs from "fs/promises";
|
|
|
11
11
|
import path from "path";
|
|
12
12
|
import { v4 as uuidv4 } from "uuid";
|
|
13
13
|
import { components } from "../api";
|
|
14
|
-
import {
|
|
14
|
+
import { TEMP_DIR_PATH } from "../constants";
|
|
15
|
+
import {
|
|
16
|
+
convertConnectionsToApiConnections,
|
|
17
|
+
getConnectionsFromPublisherConfig,
|
|
18
|
+
} from "../config";
|
|
15
19
|
import { AxiosError } from "axios";
|
|
16
20
|
|
|
17
21
|
type ApiConnection = components["schemas"]["Connection"];
|
|
@@ -29,32 +33,38 @@ export type InternalConnection = ApiConnection & {
|
|
|
29
33
|
};
|
|
30
34
|
|
|
31
35
|
export async function readConnectionConfig(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// If there's no connection manifest, it's no problem. Just return an
|
|
40
|
-
// empty array.
|
|
41
|
-
return new Array<InternalConnection>();
|
|
36
|
+
_basePath: string,
|
|
37
|
+
projectName?: string,
|
|
38
|
+
serverRootPath?: string,
|
|
39
|
+
): Promise<ApiConnection[]> {
|
|
40
|
+
// If no project name is provided, return empty array for backward compatibility
|
|
41
|
+
if (!projectName || !serverRootPath) {
|
|
42
|
+
return new Array<ApiConnection>();
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
// Get connections from publisher config
|
|
46
|
+
const connections = getConnectionsFromPublisherConfig(
|
|
47
|
+
serverRootPath,
|
|
48
|
+
projectName,
|
|
49
|
+
);
|
|
50
|
+
return convertConnectionsToApiConnections(connections);
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
export async function createConnections(
|
|
50
54
|
basePath: string,
|
|
51
55
|
defaultConnections: ApiConnection[] = [],
|
|
56
|
+
projectName?: string,
|
|
57
|
+
serverRootPath?: string,
|
|
52
58
|
): Promise<{
|
|
53
59
|
malloyConnections: Map<string, BaseConnection>;
|
|
54
60
|
apiConnections: InternalConnection[];
|
|
55
61
|
}> {
|
|
56
62
|
const connectionMap = new Map<string, BaseConnection>();
|
|
57
|
-
const connectionConfig = await readConnectionConfig(
|
|
63
|
+
const connectionConfig = await readConnectionConfig(
|
|
64
|
+
basePath,
|
|
65
|
+
projectName,
|
|
66
|
+
serverRootPath,
|
|
67
|
+
);
|
|
58
68
|
|
|
59
69
|
const allConnections = [...defaultConnections, ...connectionConfig];
|
|
60
70
|
|
|
@@ -4,7 +4,7 @@ import { join } from "path";
|
|
|
4
4
|
import sinon from "sinon";
|
|
5
5
|
import { PackageNotFoundError } from "../errors";
|
|
6
6
|
import { readConnectionConfig } from "./connection";
|
|
7
|
-
import {
|
|
7
|
+
import { Model } from "./model";
|
|
8
8
|
import { Package } from "./package";
|
|
9
9
|
import { Scheduler } from "./scheduler";
|
|
10
10
|
import { Stats } from "fs";
|
|
@@ -12,11 +12,6 @@ import { Stats } from "fs";
|
|
|
12
12
|
// Minimal partial types for mocking
|
|
13
13
|
type PartialScheduler = Pick<Scheduler, "list">;
|
|
14
14
|
|
|
15
|
-
const connectionMocks: ApiConnection[] = [
|
|
16
|
-
{ name: "conn1", type: "postgres", postgresConnection: {} },
|
|
17
|
-
{ name: "conn2", type: "bigquery", bigqueryConnection: {} },
|
|
18
|
-
];
|
|
19
|
-
|
|
20
15
|
describe("service/package", () => {
|
|
21
16
|
const testPackageDirectory = "testPackage";
|
|
22
17
|
|
|
@@ -30,11 +25,6 @@ describe("service/package", () => {
|
|
|
30
25
|
join(testPackageDirectory, "database.csv"),
|
|
31
26
|
parquetBuffer,
|
|
32
27
|
);
|
|
33
|
-
const content = JSON.stringify(connectionMocks);
|
|
34
|
-
await fs.writeFile(
|
|
35
|
-
join(testPackageDirectory, "publisher.connections.json"),
|
|
36
|
-
content,
|
|
37
|
-
);
|
|
38
28
|
const publisherContent = JSON.stringify({ description: "Test package" });
|
|
39
29
|
await fs.writeFile(
|
|
40
30
|
join(testPackageDirectory, "publisher.json"),
|
|
@@ -85,6 +75,7 @@ describe("service/package", () => {
|
|
|
85
75
|
"testPackage",
|
|
86
76
|
testPackageDirectory,
|
|
87
77
|
new Map(),
|
|
78
|
+
"/server/root",
|
|
88
79
|
),
|
|
89
80
|
).rejects.toThrowError(
|
|
90
81
|
new PackageNotFoundError(
|
|
@@ -124,6 +115,7 @@ describe("service/package", () => {
|
|
|
124
115
|
"testPackage",
|
|
125
116
|
testPackageDirectory,
|
|
126
117
|
new Map(),
|
|
118
|
+
"/server/root",
|
|
127
119
|
);
|
|
128
120
|
|
|
129
121
|
expect(packageInstance).toBeInstanceOf(Package);
|
|
@@ -232,23 +224,76 @@ describe("service/package", () => {
|
|
|
232
224
|
});
|
|
233
225
|
|
|
234
226
|
describe("readConnectionConfig", () => {
|
|
235
|
-
it("should return an empty array if
|
|
236
|
-
await fs.rm(
|
|
237
|
-
join(testPackageDirectory, "publisher.connections.json"),
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
sinon.stub(fs, "stat").rejects(new Error("File not found"));
|
|
241
|
-
|
|
227
|
+
it("should return an empty array if no project name or server root path is provided", async () => {
|
|
242
228
|
const config = await readConnectionConfig(testPackageDirectory);
|
|
243
229
|
expect(Array.isArray(config)).toBe(true);
|
|
244
230
|
expect(config).toHaveLength(0);
|
|
245
231
|
});
|
|
246
232
|
|
|
247
|
-
it("should return
|
|
248
|
-
|
|
249
|
-
|
|
233
|
+
it("should return an empty array if project name or server root path is missing", async () => {
|
|
234
|
+
const config1 = await readConnectionConfig(
|
|
235
|
+
testPackageDirectory,
|
|
236
|
+
"testProject",
|
|
237
|
+
);
|
|
238
|
+
expect(Array.isArray(config1)).toBe(true);
|
|
239
|
+
expect(config1).toHaveLength(0);
|
|
240
|
+
|
|
241
|
+
const config2 = await readConnectionConfig(
|
|
242
|
+
testPackageDirectory,
|
|
243
|
+
undefined,
|
|
244
|
+
"/server/root",
|
|
245
|
+
);
|
|
246
|
+
expect(Array.isArray(config2)).toBe(true);
|
|
247
|
+
expect(config2).toHaveLength(0);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it("should return connections from publisher config when project name and server root are provided", async () => {
|
|
251
|
+
const tempServerRoot = "/tmp/test-server-root";
|
|
252
|
+
const tempConfigPath = join(
|
|
253
|
+
tempServerRoot,
|
|
254
|
+
"publisher.config.json",
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
// Create temp directory and config file
|
|
258
|
+
await fs.mkdir(tempServerRoot, { recursive: true });
|
|
259
|
+
await fs.writeFile(
|
|
260
|
+
tempConfigPath,
|
|
261
|
+
JSON.stringify({
|
|
262
|
+
frozenConfig: false,
|
|
263
|
+
projects: [
|
|
264
|
+
{
|
|
265
|
+
name: "testProject",
|
|
266
|
+
packages: [],
|
|
267
|
+
connections: [
|
|
268
|
+
{ name: "test-conn", type: "postgres" },
|
|
269
|
+
{ name: "test-conn2", type: "bigquery" },
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
}),
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
const config = await readConnectionConfig(
|
|
277
|
+
testPackageDirectory,
|
|
278
|
+
"testProject",
|
|
279
|
+
tempServerRoot,
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
expect(Array.isArray(config)).toBe(true);
|
|
283
|
+
expect(config).toHaveLength(2);
|
|
284
|
+
expect(config[0]).toMatchObject({
|
|
285
|
+
name: "test-conn",
|
|
286
|
+
type: "postgres",
|
|
287
|
+
resource: "/api/v0/connections/test-conn",
|
|
288
|
+
});
|
|
289
|
+
expect(config[1]).toMatchObject({
|
|
290
|
+
name: "test-conn2",
|
|
291
|
+
type: "bigquery",
|
|
292
|
+
resource: "/api/v0/connections/test-conn2",
|
|
293
|
+
});
|
|
250
294
|
|
|
251
|
-
|
|
295
|
+
// Clean up
|
|
296
|
+
await fs.rm(tempServerRoot, { recursive: true, force: true });
|
|
252
297
|
});
|
|
253
298
|
});
|
|
254
299
|
});
|
package/src/service/package.ts
CHANGED
|
@@ -72,6 +72,7 @@ export class Package {
|
|
|
72
72
|
packageName: string,
|
|
73
73
|
packagePath: string,
|
|
74
74
|
projectConnections: Map<string, Connection>,
|
|
75
|
+
serverRootPath: string,
|
|
75
76
|
): Promise<Package> {
|
|
76
77
|
const startTime = performance.now();
|
|
77
78
|
await Package.validatePackageManifestExistsOrThrowError(packagePath);
|
|
@@ -107,7 +108,12 @@ export class Package {
|
|
|
107
108
|
});
|
|
108
109
|
// Package connections override project connections.
|
|
109
110
|
const { malloyConnections: packageConnections } =
|
|
110
|
-
await createConnections(
|
|
111
|
+
await createConnections(
|
|
112
|
+
packagePath,
|
|
113
|
+
[],
|
|
114
|
+
projectName,
|
|
115
|
+
serverRootPath,
|
|
116
|
+
);
|
|
111
117
|
const connectionsTime = performance.now();
|
|
112
118
|
logger.info("Package connections created", {
|
|
113
119
|
packageName,
|
|
@@ -297,6 +303,7 @@ export class Package {
|
|
|
297
303
|
try {
|
|
298
304
|
await fs.stat(packageConfigPath);
|
|
299
305
|
} catch {
|
|
306
|
+
logger.error(`Can't find ${packageConfigPath}`);
|
|
300
307
|
throw new PackageNotFoundError(
|
|
301
308
|
`Package manifest for ${packagePath} does not exist.`,
|
|
302
309
|
);
|