@malloy-publisher/server 0.0.88 → 0.0.90
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/build.ts +1 -0
- package/dist/app/api-doc.yaml +43 -5
- package/dist/app/assets/index-2BGzlUQa.js +251 -0
- package/dist/app/assets/{index-CNRCklos.js → index-Bq29VQqL.js} +1 -1
- package/dist/app/assets/{index-lhN38COk.js → index-D1X7Y0Ve.js} +5 -5
- package/dist/app/assets/index.es126-CKC26ttZ.js +1 -0
- package/dist/app/assets/index.es127-CBKpWhIe.js +1 -0
- package/dist/app/assets/index.es130-5z_n6lm6.js +1 -0
- package/dist/app/assets/index.es135-aJw1Xr-9.js +1 -0
- package/dist/app/assets/index.es143-CAt8G2AV.js +1 -0
- package/dist/app/assets/index.es144-CaWYrbVR.js +1 -0
- package/dist/app/assets/index.es147-B_4j3qbz.js +1 -0
- package/dist/app/assets/index.es151-Byg3j7QH.js +1 -0
- package/dist/app/assets/index.es154-D8PMiD5x.js +1 -0
- package/dist/app/assets/index.es157-qx6EMeW2.js +1 -0
- package/dist/app/assets/index.es158-CJWvYXRx.js +1 -0
- package/dist/app/assets/index.es172-BamsV9CN.js +1 -0
- package/dist/app/assets/index.es173-CXyGU58j.js +1 -0
- package/dist/app/assets/index.es174-C2o3B3o8.js +1 -0
- package/dist/app/assets/index.es176-BB-1P5bb.js +1 -0
- package/dist/app/assets/index.es181-2PlTGcYG.js +1 -0
- package/dist/app/assets/index.es183-DgoVwe-N.js +1 -0
- package/dist/app/assets/index.es184-Cmc38osU.js +1 -0
- package/dist/app/assets/index.es189-DuMu0KfI.js +1 -0
- package/dist/app/assets/index.es190-C117wYiK.js +1 -0
- package/dist/app/assets/index.es192-Bm2ZoxNH.js +1 -0
- package/dist/app/assets/index.es193-BBtnt1bZ.js +1 -0
- package/dist/app/assets/index.es194-CB2Nn3wg.js +1 -0
- package/dist/app/assets/index.es197-D91osx4R.js +1 -0
- package/dist/app/assets/index.es199-BtpESJSS.js +1 -0
- package/dist/app/assets/index.es200-BeG9RRw_.js +1 -0
- package/dist/app/assets/index.es201-k2nuCC3B.js +1 -0
- package/dist/app/assets/index.es207-C2uQegug.js +1 -0
- package/dist/app/assets/index.es208-BTucFWqR.js +1 -0
- package/dist/app/assets/index.es209-4dK47W8o.js +1 -0
- package/dist/app/assets/index.es210-DO6X3-kz.js +1 -0
- package/dist/app/assets/index.es212-CFG-vrrr.js +1 -0
- package/dist/app/assets/index.es216-TWO3Mhor.js +1 -0
- package/dist/app/assets/index.es217-0tHVUThG.js +1 -0
- package/dist/app/assets/index.es225-DHGKCs7a.js +1 -0
- package/dist/app/assets/{latex-LfGCYGw5-BH0TQ0ei.js → index.es228-Bz0ZvI5L.js} +1 -1
- package/dist/app/assets/index.es231-D1HdFvsl.js +1 -0
- package/dist/app/assets/index.es234-1j9jt1V9.js +1 -0
- package/dist/app/assets/index.es238-DBm7c9HR.js +1 -0
- package/dist/app/assets/index.es240-DCqDESzD.js +1 -0
- package/dist/app/assets/{nginx-Can2eAjw-CdY2tLiv.js → index.es248-BEYN2dFo.js} +1 -1
- package/dist/app/assets/index.es249-DKdYiZA_.js +1 -0
- package/dist/app/assets/index.es256-CgBAGaDx.js +1 -0
- package/dist/app/assets/index.es257-DMI3dJGJ.js +1 -0
- package/dist/app/assets/index.es267-B5ei8o6D.js +1 -0
- package/dist/app/assets/index.es271-DDBsSlrj.js +1 -0
- package/dist/app/assets/index.es277-aI_iYBJv.js +1 -0
- package/dist/app/assets/index.es282-DZQyCurk.js +1 -0
- package/dist/app/assets/index.es283-DRQxI154.js +1 -0
- package/dist/app/assets/index.es285-DrT3oe3D.js +1 -0
- package/dist/app/assets/index.es289-CKYiktdr.js +1 -0
- package/dist/app/assets/index.es291-BRH8qn2R.js +1 -0
- package/dist/app/assets/index.es293-B_x7Y2b5.js +1 -0
- package/dist/app/assets/index.es296-CMhur-CK.js +1 -0
- package/dist/app/assets/index.es297-BY9kHC-p.js +1 -0
- package/dist/app/assets/index.es301-CmwjGLCv.js +1 -0
- package/dist/app/assets/index.es303-BOa5F89I.js +1 -0
- package/dist/app/assets/index.es310-BF6kc0UE.js +1 -0
- package/dist/app/assets/index.es312-CoCT5fTV.js +1 -0
- package/dist/app/assets/index.es314-CMYE9lCS.js +1 -0
- package/dist/app/assets/index.es318-C2_Stmju.js +1 -0
- package/dist/app/assets/index.es328-DxiHjjdV.js +1 -0
- package/dist/app/assets/index.es329-D4H4qJV5.js +1 -0
- package/dist/app/assets/index.es336-DMBcHb9l.js +1 -0
- package/dist/app/assets/index.es337-BOcmfyvS.js +1 -0
- package/dist/app/assets/index.es49-D9XPPIF9.js +2 -0
- package/dist/app/assets/{index.umd-CSPhcx55.js → index.umd-BN4_E5KD.js} +1 -1
- package/dist/app/assets/mui-YektUyEU.js +161 -0
- package/dist/app/assets/vendor-c5ypKtDW.js +17 -0
- package/dist/app/index.html +3 -1
- package/dist/instrumentation.js +28 -4
- package/dist/server.js +38461 -48955
- package/package.json +5 -2
- package/src/constants.ts +9 -1
- package/src/controller/connection.controller.ts +21 -4
- package/src/controller/package.controller.ts +12 -1
- package/src/controller/schedule.controller.ts +3 -3
- package/src/logger.ts +9 -0
- package/src/server.ts +36 -30
- package/src/service/connection.ts +152 -154
- package/src/service/package.spec.ts +12 -10
- package/src/service/package.ts +11 -4
- package/src/service/project.ts +72 -33
- package/src/service/project_store.spec.ts +73 -51
- package/src/service/project_store.ts +76 -11
- package/tests/harness/mcp_test_setup.ts +5 -5
- package/dist/app/assets/RenderedResult-BAZuT25g-DLMDvQic.js +0 -2
- package/dist/app/assets/angular-html-0fTdLuKf-C_Z-qPys.js +0 -1
- package/dist/app/assets/angular-ts-wkniW60G-CLxf_aqD.js +0 -1
- package/dist/app/assets/apl-TLDHFJX6-4Ja2pao0.js +0 -1
- package/dist/app/assets/astro-Uf8_VxKJ-CLNq6E27.js +0 -1
- package/dist/app/assets/blade-BtR00Gx0-BH_u9bLw.js +0 -1
- package/dist/app/assets/bsl-BIXPNqL4-B7NuXuWJ.js +0 -1
- package/dist/app/assets/cairo-tXZKA2PT-BLBT-6ii.js +0 -1
- package/dist/app/assets/cobol-DMssKNmC-B2fukI-w.js +0 -1
- package/dist/app/assets/coffee-D_GzM8k1-4lliG68M.js +0 -1
- package/dist/app/assets/cpp-CJF2i3ah-pZOsOWe_.js +0 -1
- package/dist/app/assets/crystal-BKWnaU3g-DLUiimt9.js +0 -1
- package/dist/app/assets/edge-CgxR-qhM-C4-j-4jN.js +0 -1
- package/dist/app/assets/elixir-DZkeSPwW-CcKXTVRL.js +0 -1
- package/dist/app/assets/elm-BKuV1HE1-DhehEoOI.js +0 -1
- package/dist/app/assets/erb-BLwkpXUJ-ChmaBI6f.js +0 -1
- package/dist/app/assets/fortran-fixed-form-s9Hnb3av-DpX1AVnn.js +0 -1
- package/dist/app/assets/fsharp-Cv0x43wb-Dg8cqrY9.js +0 -1
- package/dist/app/assets/gdresource-CMcKXvgJ-CWt23EK3.js +0 -1
- package/dist/app/assets/git-commit-BspYIY3P-n1pa9hpQ.js +0 -1
- package/dist/app/assets/git-rebase--zLBTjUa-D_BU2XLr.js +0 -1
- package/dist/app/assets/glimmer-js-DhY9umHJ-VrvmblrN.js +0 -1
- package/dist/app/assets/glimmer-ts-CCrHcYH5-JtH9P_df.js +0 -1
- package/dist/app/assets/glsl-XLGYNq5B-BsoackK0.js +0 -1
- package/dist/app/assets/graphql-DWpQF4JI-Bg_kbUNo.js +0 -1
- package/dist/app/assets/hack-CQrV-ytR-DsU69WFl.js +0 -1
- package/dist/app/assets/haml-CMN0hQaL-P2mc1-Uz.js +0 -1
- package/dist/app/assets/handlebars-Cc-7fXX5-1wmMMko9.js +0 -1
- package/dist/app/assets/html-B0P_v3yU-5FUQOWqS.js +0 -1
- package/dist/app/assets/html-derivative-D59SHfh8-CSkG6UyS.js +0 -1
- package/dist/app/assets/http-Dcjm_K1m-BIoBBtFi.js +0 -1
- package/dist/app/assets/hxml-BNKImryz-C86vEiUs.js +0 -1
- package/dist/app/assets/imba-Drd0AMDo-ClNo5Aft.js +0 -1
- package/dist/app/assets/index-CobAY3LE.js +0 -427
- package/dist/app/assets/jinja-CCSYduCH-DYrHgqe4.js +0 -1
- package/dist/app/assets/jison-BygvlveW-CnxAXEK_.js +0 -1
- package/dist/app/assets/julia-CiahampL-V7UYV-sq.js +0 -1
- package/dist/app/assets/liquid-CvufO3kO-CDc-Ahzk.js +0 -1
- package/dist/app/assets/lua-BVfhNLDr-CWJMHgTQ.js +0 -1
- package/dist/app/assets/marko-CHlMS8w5-BMD3FaEa.js +0 -1
- package/dist/app/assets/mdc-4K6B6lHG-BAGHtNo-.js +0 -1
- package/dist/app/assets/nim-B3r2RtQZ-VfCbv_TB.js +0 -1
- package/dist/app/assets/perl-DaMQyPwp-C4BFOiY3.js +0 -1
- package/dist/app/assets/php-BL3EfPBi-BMN5eA9q.js +0 -1
- package/dist/app/assets/pug-HKe4Luo3-BjTLA0bL.js +0 -1
- package/dist/app/assets/qml-FlMIyjU9-DSnJ_WBo.js +0 -1
- package/dist/app/assets/razor-CeqqNtyB-CTLKKD1r.js +0 -1
- package/dist/app/assets/rst-C3D6-dqL-DnZbUBhI.js +0 -1
- package/dist/app/assets/ruby-DcPLUUK3-ComHSJZD.js +0 -1
- package/dist/app/assets/sas-tDSYjXcL-BoaRjvJ1.js +0 -1
- package/dist/app/assets/scss-DhHc4lxB-DOVe6m7U.js +0 -1
- package/dist/app/assets/shaderlab-CvqEIoL0-D4Zbm5h2.js +0 -1
- package/dist/app/assets/shellsession-8OLo3sB6-BcsC7Rtk.js +0 -1
- package/dist/app/assets/soy-EwHMOVPj-g2bfMTqc.js +0 -1
- package/dist/app/assets/sparql-DhuelBut-DSDXMn9h.js +0 -1
- package/dist/app/assets/stata-Dok6hMw0-Dx5Z5W33.js +0 -1
- package/dist/app/assets/svelte-01qw6Rxm-BPq1Epw_.js +0 -1
- package/dist/app/assets/templ-Hmy8U0DD-bZJvPZVc.js +0 -1
- package/dist/app/assets/tex-mHs7a43s-GNY7iZwJ.js +0 -1
- package/dist/app/assets/ts-tags-DYZ4SGcN-DHCrqCAy.js +0 -1
- package/dist/app/assets/twig-BmytkGQV-gxvDbPvi.js +0 -1
- package/dist/app/assets/vue-Bl1uVNsA-B0HO5ROf.js +0 -1
- package/dist/app/assets/vue-html-DHr5wjBG-BZddcMPi.js +0 -1
- package/dist/app/assets/xml-ChBsf5uy-CRY5u_dA.js +0 -1
- package/dist/app/assets/xsl-BefjlXrd-kO2fudRX.js +0 -1
- /package/dist/app/assets/{wasm-DQxwEHae-CG6Dc4jp.js → index.es115-CG6Dc4jp.js} +0 -0
- /package/dist/app/assets/{abap-BmBUA35e-DsBKuouk.js → index.es123-DsBKuouk.js} +0 -0
- /package/dist/app/assets/{actionscript-3-zFUbzQa9-D_z4Izcz.js → index.es124-D_z4Izcz.js} +0 -0
- /package/dist/app/assets/{ada-CBvPkFpZ-727ZlQH0.js → index.es125-727ZlQH0.js} +0 -0
- /package/dist/app/assets/{apache-CVNlsSDc-Dn00JSTd.js → index.es128-Dn00JSTd.js} +0 -0
- /package/dist/app/assets/{apex-DFk3KRB1-COJ4H7py.js → index.es129-COJ4H7py.js} +0 -0
- /package/dist/app/assets/{applescript-CYMR_y0g-Bu5BbsvL.js → index.es131-Bu5BbsvL.js} +0 -0
- /package/dist/app/assets/{ara-4QmU5e04-7O62HKoU.js → index.es132-7O62HKoU.js} +0 -0
- /package/dist/app/assets/{asciidoc-v_1bjgUg-BPT9niGB.js → index.es133-BPT9niGB.js} +0 -0
- /package/dist/app/assets/{asm-RC0Yh-NZ-Dhn9LcZ4.js → index.es134-Dhn9LcZ4.js} +0 -0
- /package/dist/app/assets/{awk-gPH8MVMW-eg146-Ew.js → index.es136-eg146-Ew.js} +0 -0
- /package/dist/app/assets/{ballerina-kvLnRU_e-Du268qiB.js → index.es137-Du268qiB.js} +0 -0
- /package/dist/app/assets/{bat-BHYy44sT-fje9CFhw.js → index.es138-fje9CFhw.js} +0 -0
- /package/dist/app/assets/{beancount-D-MADTs_-BwXTMy5W.js → index.es139-BwXTMy5W.js} +0 -0
- /package/dist/app/assets/{berry-Ci9U0o4h-3xVqZejG.js → index.es140-3xVqZejG.js} +0 -0
- /package/dist/app/assets/{bibtex-CX618D15-xW4inM5L.js → index.es141-xW4inM5L.js} +0 -0
- /package/dist/app/assets/{bicep-iuYiPopT-DHo0CJ0O.js → index.es142-DHo0CJ0O.js} +0 -0
- /package/dist/app/assets/{c-DASdrs7p-C3t2pwGQ.js → index.es145-C3t2pwGQ.js} +0 -0
- /package/dist/app/assets/{cadence-BDALQi26-DNquZEk8.js → index.es146-DNquZEk8.js} +0 -0
- /package/dist/app/assets/{clarity-CNgV2Ths-BHOwM8T6.js → index.es148-BHOwM8T6.js} +0 -0
- /package/dist/app/assets/{clojure-CsKKFGwv-DxSadP1t.js → index.es149-DxSadP1t.js} +0 -0
- /package/dist/app/assets/{cmake-Dr-A3iJx-DbXoA79R.js → index.es150-DbXoA79R.js} +0 -0
- /package/dist/app/assets/{codeowners-Bt9yU6NX-Bp6g37R7.js → index.es152-Bp6g37R7.js} +0 -0
- /package/dist/app/assets/{codeql-DBNTqJi1-sacFqUAJ.js → index.es153-sacFqUAJ.js} +0 -0
- /package/dist/app/assets/{common-lisp-r7ZEOG7T-C7gG9l05.js → index.es155-C7gG9l05.js} +0 -0
- /package/dist/app/assets/{coq-CB6Pv_W9-Dsg_Bt_b.js → index.es156-Dsg_Bt_b.js} +0 -0
- /package/dist/app/assets/{csharp-CYWRhZ2R-D9R-vmeu.js → index.es159-D9R-vmeu.js} +0 -0
- /package/dist/app/assets/{css-D1aVdRIU-BPhBrDlE.js → index.es160-BPhBrDlE.js} +0 -0
- /package/dist/app/assets/{csv-DvCncUGQ-C-TU5hQ_.js → index.es161-C-TU5hQ_.js} +0 -0
- /package/dist/app/assets/{cue-BXMrmvay-DtFQj3wx.js → index.es162-DtFQj3wx.js} +0 -0
- /package/dist/app/assets/{cypher-DTm5zNR1-m2LEI-9-.js → index.es163-m2LEI-9-.js} +0 -0
- /package/dist/app/assets/{d-D6ZXmn3l-BoXegm-a.js → index.es164-BoXegm-a.js} +0 -0
- /package/dist/app/assets/{dart-Dz59Is3F-B9wLZaAG.js → index.es165-B9wLZaAG.js} +0 -0
- /package/dist/app/assets/{dax-DTVGzydb-ClGRhx96.js → index.es166-ClGRhx96.js} +0 -0
- /package/dist/app/assets/{desktop-Db9vb-dl-DEIpsLCJ.js → index.es167-DEIpsLCJ.js} +0 -0
- /package/dist/app/assets/{diff-XmNrvgM1-BgYniUM_.js → index.es168-BgYniUM_.js} +0 -0
- /package/dist/app/assets/{docker-DWH2onkn-COcR7UxN.js → index.es169-COcR7UxN.js} +0 -0
- /package/dist/app/assets/{dotenv-4337wvzu-BjQB5zDj.js → index.es170-BjQB5zDj.js} +0 -0
- /package/dist/app/assets/{dream-maker-CvvfrJSx-C-nORZOA.js → index.es171-C-nORZOA.js} +0 -0
- /package/dist/app/assets/{emacs-lisp-BAefI874-BX77sIaO.js → index.es175-BX77sIaO.js} +0 -0
- /package/dist/app/assets/{erlang-CmIiwF3I-B-DoSBHF.js → index.es177-B-DoSBHF.js} +0 -0
- /package/dist/app/assets/{fennel-DNqkz9pE-bCA53EVm.js → index.es178-bCA53EVm.js} +0 -0
- /package/dist/app/assets/{fish-DIm72t2T-w-ucz2PV.js → index.es179-w-ucz2PV.js} +0 -0
- /package/dist/app/assets/{fluent-BapTxJsC-Dayu4EKP.js → index.es180-Dayu4EKP.js} +0 -0
- /package/dist/app/assets/{fortran-free-form-CNDsBFUj-DKXYxT9g.js → index.es182-DKXYxT9g.js} +0 -0
- /package/dist/app/assets/{gdscript-D7aheHm--DfxzS6Rs.js → index.es185-DfxzS6Rs.js} +0 -0
- /package/dist/app/assets/{gdshader-BGJEsM2Z-SKMF96pI.js → index.es186-SKMF96pI.js} +0 -0
- /package/dist/app/assets/{genie-C9gPjc6J-ajMbGru0.js → index.es187-ajMbGru0.js} +0 -0
- /package/dist/app/assets/{gherkin-bka1Exbx--30QC5Em.js → index.es188--30QC5Em.js} +0 -0
- /package/dist/app/assets/{gleam-B4k9YFGD-B430Bg39.js → index.es191-B430Bg39.js} +0 -0
- /package/dist/app/assets/{gnuplot-DnWoRZt--CM8KxXT1.js → index.es195-CM8KxXT1.js} +0 -0
- /package/dist/app/assets/{go-BErP6iv1-B1SYOhNW.js → index.es196-B1SYOhNW.js} +0 -0
- /package/dist/app/assets/{groovy-IWs5-NIO-DkBy-JyN.js → index.es198-DkBy-JyN.js} +0 -0
- /package/dist/app/assets/{haskell-CtlGos0K-BILxekzW.js → index.es202-BILxekzW.js} +0 -0
- /package/dist/app/assets/{haxe-CZZ33vZw-C5wWYbrZ.js → index.es203-C5wWYbrZ.js} +0 -0
- /package/dist/app/assets/{hcl-6hOg9WP4-HzYwdGDm.js → index.es204-HzYwdGDm.js} +0 -0
- /package/dist/app/assets/{hjson-CgwED-oz-T-Tgc4AT.js → index.es205-T-Tgc4AT.js} +0 -0
- /package/dist/app/assets/{hlsl-3-lv4gi7-ifBTmRxC.js → index.es206-ifBTmRxC.js} +0 -0
- /package/dist/app/assets/{hy-C2xHhR6I-BMj5Y0dO.js → index.es211-BMj5Y0dO.js} +0 -0
- /package/dist/app/assets/{ini-BUcvsX-U-BjABl1g7.js → index.es213-BjABl1g7.js} +0 -0
- /package/dist/app/assets/{java-B7odJ7Ap-xI-RfyKK.js → index.es214-xI-RfyKK.js} +0 -0
- /package/dist/app/assets/{javascript-fa8UlHZE-ySlJ1b_l.js → index.es215-ySlJ1b_l.js} +0 -0
- /package/dist/app/assets/{json-71t8ZF9g-BQoSv7ci.js → index.es218-BQoSv7ci.js} +0 -0
- /package/dist/app/assets/{json5-Z7F6rA6a-w8dY5SsB.js → index.es219-w8dY5SsB.js} +0 -0
- /package/dist/app/assets/{jsonc-Dphhs4m2-TU54ms6u.js → index.es220-TU54ms6u.js} +0 -0
- /package/dist/app/assets/{jsonl-D9jj92Gg-DREVFZK8.js → index.es221-DREVFZK8.js} +0 -0
- /package/dist/app/assets/{jsonnet-DEQ7IUoJ-BfivnA6A.js → index.es222-BfivnA6A.js} +0 -0
- /package/dist/app/assets/{jssm-j74e88UX-P4WzXJd0.js → index.es223-P4WzXJd0.js} +0 -0
- /package/dist/app/assets/{jsx-Bkesy5tT-BAng5TT0.js → index.es224-BAng5TT0.js} +0 -0
- /package/dist/app/assets/{kotlin-DCgZY7Ii-B5lbUyaz.js → index.es226-B5lbUyaz.js} +0 -0
- /package/dist/app/assets/{kusto-Cw029H-v-mebxcVVE.js → index.es227-mebxcVVE.js} +0 -0
- /package/dist/app/assets/{lean-CYSet4vs-XBlWyCtg.js → index.es229-XBlWyCtg.js} +0 -0
- /package/dist/app/assets/{less-DQA4v-Nm-BfCpw3nA.js → index.es230-BfCpw3nA.js} +0 -0
- /package/dist/app/assets/{log-D2eRfqDn-Cc5clBb7.js → index.es232-Cc5clBb7.js} +0 -0
- /package/dist/app/assets/{logo-QEAtGWZ9-IuBKFhSY.js → index.es233-IuBKFhSY.js} +0 -0
- /package/dist/app/assets/{luau-BjYGiqID-Du5NY7AG.js → index.es235-Du5NY7AG.js} +0 -0
- /package/dist/app/assets/{make-BjuHP00g-Bvotw-X0.js → index.es236-Bvotw-X0.js} +0 -0
- /package/dist/app/assets/{markdown-B6guhLWd-UIAJJxZW.js → index.es237-UIAJJxZW.js} +0 -0
- /package/dist/app/assets/{matlab-BpQlIJiw-D9-PGadD.js → index.es239-D9-PGadD.js} +0 -0
- /package/dist/app/assets/{mdx-DIoECIFU-sdHcTMYB.js → index.es241-sdHcTMYB.js} +0 -0
- /package/dist/app/assets/{mermaid-BZ7WHNIe-Ci6OQyBP.js → index.es242-Ci6OQyBP.js} +0 -0
- /package/dist/app/assets/{mipsasm-DusDYkFc-BC5c_5Pe.js → index.es243-BC5c_5Pe.js} +0 -0
- /package/dist/app/assets/{mojo-CY9jaezJ-Tz6hzZYG.js → index.es244-Tz6hzZYG.js} +0 -0
- /package/dist/app/assets/{move-ChphFumd-DB_GagMm.js → index.es245-DB_GagMm.js} +0 -0
- /package/dist/app/assets/{narrat-Dz4d7OmN-DLbgOhZU.js → index.es246-DLbgOhZU.js} +0 -0
- /package/dist/app/assets/{nextflow-DW0Yq9a2-B0XVJmRM.js → index.es247-B0XVJmRM.js} +0 -0
- /package/dist/app/assets/{nix-Cg5uV_xg-shcSOmrb.js → index.es250-shcSOmrb.js} +0 -0
- /package/dist/app/assets/{nushell-BfRnzRWn-D4Tzg5kh.js → index.es251-D4Tzg5kh.js} +0 -0
- /package/dist/app/assets/{objective-c-BGg9R27G-Deuh7S70.js → index.es252-Deuh7S70.js} +0 -0
- /package/dist/app/assets/{objective-cpp-CJ3y3V_5-BUEGK8hf.js → index.es253-BUEGK8hf.js} +0 -0
- /package/dist/app/assets/{ocaml-BZLsfx_o-BNioltXt.js → index.es254-BNioltXt.js} +0 -0
- /package/dist/app/assets/{pascal-l2bqd7Dz-JqZropPD.js → index.es255-JqZropPD.js} +0 -0
- /package/dist/app/assets/{plsql-oVq_K_wH-LKU2TuZ1.js → index.es258-LKU2TuZ1.js} +0 -0
- /package/dist/app/assets/{po-5jaeIyVd-BFLt1xDp.js → index.es259-BFLt1xDp.js} +0 -0
- /package/dist/app/assets/{polar-wcLp8ci7-DKykz6zU.js → index.es260-DKykz6zU.js} +0 -0
- /package/dist/app/assets/{postcss-BZ3MNRIJ-B3ZDOciz.js → index.es261-B3ZDOciz.js} +0 -0
- /package/dist/app/assets/{powerquery-CgRa2XRw-CSHBycmS.js → index.es262-CSHBycmS.js} +0 -0
- /package/dist/app/assets/{powershell-Diwyv8Eh-BIEUsx6d.js → index.es263-BIEUsx6d.js} +0 -0
- /package/dist/app/assets/{prisma-COL_v1x4-B48N-Iqd.js → index.es264-B48N-Iqd.js} +0 -0
- /package/dist/app/assets/{prolog-CuvJOxqT-BY-TUvya.js → index.es265-BY-TUvya.js} +0 -0
- /package/dist/app/assets/{proto-o9HLmF90-zocC4JxJ.js → index.es266-zocC4JxJ.js} +0 -0
- /package/dist/app/assets/{puppet-wpGOnQp5-Cza_XSSt.js → index.es268-Cza_XSSt.js} +0 -0
- /package/dist/app/assets/{purescript-B_1NgE2N-Bg-kzb6g.js → index.es269-Bg-kzb6g.js} +0 -0
- /package/dist/app/assets/{python-xYxLFJY--DhUJRlN_.js → index.es270-DhUJRlN_.js} +0 -0
- /package/dist/app/assets/{qmldir-BInDYbpo-C8lEn-DE.js → index.es272-C8lEn-DE.js} +0 -0
- /package/dist/app/assets/{qss-D-h4NdUG-DhMKtDLN.js → index.es273-DhMKtDLN.js} +0 -0
- /package/dist/app/assets/{r-F-9I-ITZ-CwjWoCRV.js → index.es274-CwjWoCRV.js} +0 -0
- /package/dist/app/assets/{racket-BoD1TBFT-CzouJOBO.js → index.es275-CzouJOBO.js} +0 -0
- /package/dist/app/assets/{raku-IaYcw19m-B1bQXN8T.js → index.es276-B1bQXN8T.js} +0 -0
- /package/dist/app/assets/{reg-CMUdAgIP-5LuOXUq_.js → index.es278-5LuOXUq_.js} +0 -0
- /package/dist/app/assets/{regexp-GiFkbxS--DWJ3fJO_.js → index.es279-DWJ3fJO_.js} +0 -0
- /package/dist/app/assets/{rel-BaRn3QX7-DJlmqQ1C.js → index.es280-DJlmqQ1C.js} +0 -0
- /package/dist/app/assets/{riscv-B9V3SsvW-QhoSD0DR.js → index.es281-QhoSD0DR.js} +0 -0
- /package/dist/app/assets/{rust-Pc7DCsZD-Be6lgOlo.js → index.es284-Be6lgOlo.js} +0 -0
- /package/dist/app/assets/{sass-iCyS6eP9-BJ4Li9vH.js → index.es286-BJ4Li9vH.js} +0 -0
- /package/dist/app/assets/{scala-Cly-fENF-DQVVAn-B.js → index.es287-DQVVAn-B.js} +0 -0
- /package/dist/app/assets/{scheme-Zi24oEYu-BJGe-b2p.js → index.es288-BJGe-b2p.js} +0 -0
- /package/dist/app/assets/{sdbl-BBamrXFL-BLhTXw86.js → index.es290-BLhTXw86.js} +0 -0
- /package/dist/app/assets/{shellscript-Dn0-btNd-atvbtKCR.js → index.es292-atvbtKCR.js} +0 -0
- /package/dist/app/assets/{smalltalk-Cns31tKw-DkLiglaE.js → index.es294-DkLiglaE.js} +0 -0
- /package/dist/app/assets/{solidity-BG_k8fA_-C1w2a3ep.js → index.es295-C1w2a3ep.js} +0 -0
- /package/dist/app/assets/{splunk-CTqDjQdo-Cf8iN4DR.js → index.es298-Cf8iN4DR.js} +0 -0
- /package/dist/app/assets/{sql-DCkt643--COK4E0Yg.js → index.es299-COK4E0Yg.js} +0 -0
- /package/dist/app/assets/{ssh-config-DHHGll-v-BknIz3MU.js → index.es300-BknIz3MU.js} +0 -0
- /package/dist/app/assets/{stylus-n_9f0QQ5-BeQkCIfX.js → index.es302-BeQkCIfX.js} +0 -0
- /package/dist/app/assets/{swift-BAWqNR8A-BSxZ-RaX.js → index.es304-BSxZ-RaX.js} +0 -0
- /package/dist/app/assets/{system-verilog-Cui-g-ut-C7L56vO4.js → index.es305-C7L56vO4.js} +0 -0
- /package/dist/app/assets/{systemd-CsKYQIQK-CUnW07Te.js → index.es306-CUnW07Te.js} +0 -0
- /package/dist/app/assets/{talonscript-D2dGh8FO-C1XDQQGZ.js → index.es307-C1XDQQGZ.js} +0 -0
- /package/dist/app/assets/{tasl-D3W8HMV6-CQjiPCtT.js → index.es308-CQjiPCtT.js} +0 -0
- /package/dist/app/assets/{tcl-2y0Fuc4S-DQ1-QYvQ.js → index.es309-DQ1-QYvQ.js} +0 -0
- /package/dist/app/assets/{terraform-BGW6Oerf-BbSNqyBO.js → index.es311-BbSNqyBO.js} +0 -0
- /package/dist/app/assets/{toml-CQSfOn0e-CB2ApiWb.js → index.es313-CB2ApiWb.js} +0 -0
- /package/dist/app/assets/{tsv-BtvSkaG0-B_m7g4N7.js → index.es315-B_m7g4N7.js} +0 -0
- /package/dist/app/assets/{tsx-DiGsgWT8-B6W0miNI.js → index.es316-B6W0miNI.js} +0 -0
- /package/dist/app/assets/{turtle-BJ2wmjPc-BMR_PYu6.js → index.es317-BMR_PYu6.js} +0 -0
- /package/dist/app/assets/{typescript-buWNZFwO-Dj6nwHGl.js → index.es319-Dj6nwHGl.js} +0 -0
- /package/dist/app/assets/{typespec-bLbdsxJL-BpWG_bgh.js → index.es320-BpWG_bgh.js} +0 -0
- /package/dist/app/assets/{typst-Y9_SmXTs-BVUVsWT6.js → index.es321-BVUVsWT6.js} +0 -0
- /package/dist/app/assets/{v-wa8Orrdd-CAQ2eGtk.js → index.es322-CAQ2eGtk.js} +0 -0
- /package/dist/app/assets/{vala-DRdriFr_-BFOHcciG.js → index.es323-BFOHcciG.js} +0 -0
- /package/dist/app/assets/{vb-E2_-jk4M-CdO5JTpU.js → index.es324-CdO5JTpU.js} +0 -0
- /package/dist/app/assets/{verilog-B1iBoR5_-CJaU5se_.js → index.es325-CJaU5se_.js} +0 -0
- /package/dist/app/assets/{vhdl-CRVaAhXk-DYoNaHQp.js → index.es326-DYoNaHQp.js} +0 -0
- /package/dist/app/assets/{viml-B-zWOd7Z-m4uW47V2.js → index.es327-m4uW47V2.js} +0 -0
- /package/dist/app/assets/{vyper-DWutKXpa-nyqBNV6O.js → index.es330-nyqBNV6O.js} +0 -0
- /package/dist/app/assets/{wasm-Bv5f0gKv-C6j12Q_x.js → index.es331-C6j12Q_x.js} +0 -0
- /package/dist/app/assets/{wenyan-BMYnfus1-7A4Fjokl.js → index.es332-7A4Fjokl.js} +0 -0
- /package/dist/app/assets/{wgsl-DnPoPGDU-CB0Krxn9.js → index.es333-CB0Krxn9.js} +0 -0
- /package/dist/app/assets/{wikitext-CntM04PE-DCE3LsBG.js → index.es334-DCE3LsBG.js} +0 -0
- /package/dist/app/assets/{wolfram-Ws5qPlX9-C3FkfJm5.js → index.es335-C3FkfJm5.js} +0 -0
- /package/dist/app/assets/{yaml-Bbg74JKr-CVw76BM1.js → index.es338-CVw76BM1.js} +0 -0
- /package/dist/app/assets/{zenscript-C0RKE4nU-HnGAYVZD.js → index.es339-HnGAYVZD.js} +0 -0
- /package/dist/app/assets/{zig-D6SXBGNm-BVz_zdnA.js → index.es340-BVz_zdnA.js} +0 -0
- /package/dist/app/assets/{andromeeda-uXNdzNpk-C3khCPGq.js → index.es341-C3khCPGq.js} +0 -0
- /package/dist/app/assets/{aurora-x-BwoVEUWZ-D-2ljcwZ.js → index.es342-D-2ljcwZ.js} +0 -0
- /package/dist/app/assets/{ayu-dark-CxPZkpb2-Cv9koXgw.js → index.es343-Cv9koXgw.js} +0 -0
- /package/dist/app/assets/{catppuccin-frappe-BrTOiad2-CD_QflpE.js → index.es344-CD_QflpE.js} +0 -0
- /package/dist/app/assets/{catppuccin-latte-D-dc_R4m-DRW-0cLl.js → index.es345-DRW-0cLl.js} +0 -0
- /package/dist/app/assets/{catppuccin-macchiato-DN4jOp0G-C-_shW-Y.js → index.es346-C-_shW-Y.js} +0 -0
- /package/dist/app/assets/{catppuccin-mocha-B8yCE3-3-LGGdnPYs.js → index.es347-LGGdnPYs.js} +0 -0
- /package/dist/app/assets/{dark-plus-pUHDTVV0-C3mMm8J8.js → index.es348-C3mMm8J8.js} +0 -0
- /package/dist/app/assets/{dracula-BtZx2Kac-BzJJZx-M.js → index.es349-BzJJZx-M.js} +0 -0
- /package/dist/app/assets/{dracula-soft-BKa-aqBv-BXkSAIEj.js → index.es350-BXkSAIEj.js} +0 -0
- /package/dist/app/assets/{everforest-dark-DMCBqXCK-BgDCqdQA.js → index.es351-BgDCqdQA.js} +0 -0
- /package/dist/app/assets/{everforest-light-BbXl82Em-C8M2exoo.js → index.es352-C8M2exoo.js} +0 -0
- /package/dist/app/assets/{github-dark-DenFmJkN-DHJKELXO.js → index.es353-DHJKELXO.js} +0 -0
- /package/dist/app/assets/{github-dark-default-BJPUVz4H-Cuk6v7N8.js → index.es354-Cuk6v7N8.js} +0 -0
- /package/dist/app/assets/{github-dark-dimmed-DUshB20C-DH5Ifo-i.js → index.es355-DH5Ifo-i.js} +0 -0
- /package/dist/app/assets/{github-dark-high-contrast-D3aGCnF8-E3gJ1_iC.js → index.es356-E3gJ1_iC.js} +0 -0
- /package/dist/app/assets/{github-light-JYsPkUQd-DAi9KRSo.js → index.es357-DAi9KRSo.js} +0 -0
- /package/dist/app/assets/{github-light-default-D99KPAby-D7oLnXFd.js → index.es358-D7oLnXFd.js} +0 -0
- /package/dist/app/assets/{github-light-high-contrast-BbmZE-Mp-BfjtVDDH.js → index.es359-BfjtVDDH.js} +0 -0
- /package/dist/app/assets/{houston-BDYrDoDW-DnULxvSX.js → index.es360-DnULxvSX.js} +0 -0
- /package/dist/app/assets/{kanagawa-dragon-CiKur4Hl-CkXjmgJE.js → index.es361-CkXjmgJE.js} +0 -0
- /package/dist/app/assets/{kanagawa-lotus-BKu-smKu-CfQXZHmo.js → index.es362-CfQXZHmo.js} +0 -0
- /package/dist/app/assets/{kanagawa-wave-CQwozSzG-DWedfzmr.js → index.es363-DWedfzmr.js} +0 -0
- /package/dist/app/assets/{laserwave-6a00oqik-DUszq2jm.js → index.es364-DUszq2jm.js} +0 -0
- /package/dist/app/assets/{light-plus-CZuVqSLX-B7mTdjB0.js → index.es365-B7mTdjB0.js} +0 -0
- /package/dist/app/assets/{material-theme-D6KBX41T-D5KoaKCx.js → index.es366-D5KoaKCx.js} +0 -0
- /package/dist/app/assets/{material-theme-darker-CkRroheE-BfHTSMKl.js → index.es367-BfHTSMKl.js} +0 -0
- /package/dist/app/assets/{material-theme-lighter-BUBw43Yz-B0m2ddpp.js → index.es368-B0m2ddpp.js} +0 -0
- /package/dist/app/assets/{material-theme-ocean-ClGX14Ja-CyktbL80.js → index.es369-CyktbL80.js} +0 -0
- /package/dist/app/assets/{material-theme-palenight-C1RVm8K1-Csfq5Kiy.js → index.es370-Csfq5Kiy.js} +0 -0
- /package/dist/app/assets/{min-dark-C7ak0t6c-CafNBF8u.js → index.es371-CafNBF8u.js} +0 -0
- /package/dist/app/assets/{min-light-CKFxVcPp-CTRr51gU.js → index.es372-CTRr51gU.js} +0 -0
- /package/dist/app/assets/{monokai-C1KBYcO0-D4h5O-jR.js → index.es373-D4h5O-jR.js} +0 -0
- /package/dist/app/assets/{night-owl-Bm2rzalh-C39BiMTA.js → index.es374-C39BiMTA.js} +0 -0
- /package/dist/app/assets/{nord-CC5OiUXg-Ddv68eIx.js → index.es375-Ddv68eIx.js} +0 -0
- /package/dist/app/assets/{one-dark-pro-D7-kP8fv-GBQ2dnAY.js → index.es376-GBQ2dnAY.js} +0 -0
- /package/dist/app/assets/{one-light-D9sNaUtq-PoHY5YXO.js → index.es377-PoHY5YXO.js} +0 -0
- /package/dist/app/assets/{plastic-CSTz3KZp-3e1v2bzS.js → index.es378-3e1v2bzS.js} +0 -0
- /package/dist/app/assets/{poimandres-C-VADXHD-CS3Unz2-.js → index.es379-CS3Unz2-.js} +0 -0
- /package/dist/app/assets/{red-7y8PH7HH-bN70gL4F.js → index.es380-bN70gL4F.js} +0 -0
- /package/dist/app/assets/{rose-pine-DhT-HZE9-CmCqftbK.js → index.es381-CmCqftbK.js} +0 -0
- /package/dist/app/assets/{rose-pine-dawn-DiCjL2i4-Ds-gbosJ.js → index.es382-Ds-gbosJ.js} +0 -0
- /package/dist/app/assets/{rose-pine-moon-BNmGHlcn-CjDtw9vr.js → index.es383-CjDtw9vr.js} +0 -0
- /package/dist/app/assets/{slack-dark-i7wN4OET-BthQWCQV.js → index.es384-BthQWCQV.js} +0 -0
- /package/dist/app/assets/{slack-ochin-ndHf0LoP-DqwNpetd.js → index.es385-DqwNpetd.js} +0 -0
- /package/dist/app/assets/{snazzy-light-BlSJXAu4-Bw305WKR.js → index.es386-Bw305WKR.js} +0 -0
- /package/dist/app/assets/{solarized-dark-UTmkh7lw-DXbdFlpD.js → index.es387-DXbdFlpD.js} +0 -0
- /package/dist/app/assets/{solarized-light-BheCkDPT-L9t79GZl.js → index.es388-L9t79GZl.js} +0 -0
- /package/dist/app/assets/{synthwave-84-NU3C_KFZ-CbfX1IO0.js → index.es389-CbfX1IO0.js} +0 -0
- /package/dist/app/assets/{tokyo-night-LhP3hHhi-DBQeEorK.js → index.es390-DBQeEorK.js} +0 -0
- /package/dist/app/assets/{vesper-CJsaOsSM-BEBZ7ncR.js → index.es391-BEBZ7ncR.js} +0 -0
- /package/dist/app/assets/{vitesse-black-BoGvW84i-Bkuqu6BP.js → index.es392-Bkuqu6BP.js} +0 -0
- /package/dist/app/assets/{vitesse-dark-Cym-eLtO-D0r3Knsf.js → index.es393-D0r3Knsf.js} +0 -0
- /package/dist/app/assets/{vitesse-light-CcmG315c-CVO1_9PV.js → index.es394-CVO1_9PV.js} +0 -0
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.90",
|
|
5
5
|
"main": "dist/server.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"malloy-publisher": "dist/server.js"
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
"access": "public"
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
|
-
"test": "bun test
|
|
13
|
+
"test": "bun test --timeout 100000",
|
|
14
14
|
"build": "bun generate-api-types && bun build:app && NODE_ENV=production bun run build.ts",
|
|
15
|
+
"build:server-only": "bun generate-api-types && NODE_ENV=production bun run build.ts",
|
|
15
16
|
"start": "NODE_ENV=production node ./dist/server.js",
|
|
16
17
|
"start:dev": "NODE_ENV=development bun --watch src/server.ts",
|
|
17
18
|
"start:instrumented": "node --require ./dist/instrumentation.js ./dist/server.js",
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
|
38
39
|
"@opentelemetry/sdk-node": "^0.200.0",
|
|
39
40
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
41
|
+
"adm-zip": "^0.5.16",
|
|
40
42
|
"async-mutex": "^0.5.0",
|
|
41
43
|
"aws-sdk": "^2.1692.0",
|
|
42
44
|
"body-parser": "^1.20.2",
|
|
@@ -60,6 +62,7 @@
|
|
|
60
62
|
"@eslint/eslintrc": "^3.3.1",
|
|
61
63
|
"@eslint/js": "^9.23.0",
|
|
62
64
|
"@faker-js/faker": "^9.4.0",
|
|
65
|
+
"@types/adm-zip": "^0.5.7",
|
|
63
66
|
"@types/cors": "^2.8.12",
|
|
64
67
|
"@types/express": "^4.17.14",
|
|
65
68
|
"@types/morgan": "^1.9.9",
|
package/src/constants.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import fs from "fs";
|
|
1
2
|
export const API_PREFIX = "/api/v0";
|
|
2
3
|
export const README_NAME = "README.md";
|
|
3
4
|
export const PUBLISHER_CONFIG_NAME = "publisher.config.json";
|
|
@@ -5,4 +6,11 @@ export const PACKAGE_MANIFEST_NAME = "publisher.json";
|
|
|
5
6
|
export const CONNECTIONS_MANIFEST_NAME = "publisher.connections.json";
|
|
6
7
|
export const MODEL_FILE_SUFFIX = ".malloy";
|
|
7
8
|
export const NOTEBOOK_FILE_SUFFIX = ".malloynb";
|
|
8
|
-
export const ROW_LIMIT = 1000;
|
|
9
|
+
export const ROW_LIMIT = 1000;
|
|
10
|
+
|
|
11
|
+
export let publisherPath = "/etc/publisher";
|
|
12
|
+
try {
|
|
13
|
+
fs.accessSync(publisherPath, fs.constants.W_OK);
|
|
14
|
+
} catch (e) {
|
|
15
|
+
publisherPath = "/tmp/publisher";
|
|
16
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
RunSQLOptions,
|
|
3
|
+
TableSourceDef,
|
|
4
|
+
TestableConnection,
|
|
5
|
+
} from "@malloydata/malloy";
|
|
2
6
|
import { Connection, PersistSQLResults } from "@malloydata/malloy/connection";
|
|
3
|
-
import { TableSourceDef } from "../../../../../malloy/packages/malloy/dist";
|
|
4
7
|
import { components } from "../api";
|
|
5
8
|
import { ConnectionError } from "../errors";
|
|
6
9
|
import { logger } from "../logger";
|
|
@@ -11,6 +14,7 @@ import {
|
|
|
11
14
|
import { ProjectStore } from "../service/project_store";
|
|
12
15
|
|
|
13
16
|
type ApiConnection = components["schemas"]["Connection"];
|
|
17
|
+
type ApiConnectionStatus = components["schemas"]["ConnectionStatus"];
|
|
14
18
|
type ApiSqlSource = components["schemas"]["SqlSource"];
|
|
15
19
|
type ApiTableSource = components["schemas"]["TableSource"];
|
|
16
20
|
type ApiQueryData = components["schemas"]["QueryData"];
|
|
@@ -57,15 +61,28 @@ export class ConnectionController {
|
|
|
57
61
|
return getTablesForSchema(connection, schemaName);
|
|
58
62
|
}
|
|
59
63
|
|
|
60
|
-
public async testConnection(
|
|
64
|
+
public async testConnection(
|
|
65
|
+
projectName: string,
|
|
66
|
+
connectionName: string,
|
|
67
|
+
): Promise<ApiConnectionStatus> {
|
|
61
68
|
const project = await this.projectStore.getProject(projectName, false);
|
|
62
69
|
const connection = project.getMalloyConnection(
|
|
63
70
|
connectionName,
|
|
64
71
|
) as Connection;
|
|
65
72
|
try {
|
|
66
73
|
await (connection as TestableConnection).test();
|
|
74
|
+
return {
|
|
75
|
+
status: "ok",
|
|
76
|
+
errorMessage: "",
|
|
77
|
+
};
|
|
67
78
|
} catch (error) {
|
|
68
|
-
|
|
79
|
+
if (error instanceof ConnectionError) {
|
|
80
|
+
return {
|
|
81
|
+
status: "failed",
|
|
82
|
+
errorMessage: error.message,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
69
86
|
}
|
|
70
87
|
}
|
|
71
88
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { components } from "../api";
|
|
2
|
+
import { publisherPath } from "../constants";
|
|
2
3
|
import { BadRequestError, FrozenConfigError } from "../errors";
|
|
3
4
|
import { ProjectStore } from "../service/project_store";
|
|
4
5
|
|
|
@@ -72,7 +73,7 @@ export class PackageController {
|
|
|
72
73
|
packageName: string,
|
|
73
74
|
packageLocation: string,
|
|
74
75
|
) {
|
|
75
|
-
const absoluteTargetPath =
|
|
76
|
+
const absoluteTargetPath = `${publisherPath}/${projectName}/${packageName}`;
|
|
76
77
|
if (
|
|
77
78
|
packageLocation.startsWith("https://") ||
|
|
78
79
|
packageLocation.startsWith("git@")
|
|
@@ -93,6 +94,16 @@ export class PackageController {
|
|
|
93
94
|
projectName,
|
|
94
95
|
absoluteTargetPath,
|
|
95
96
|
);
|
|
97
|
+
} else if (packageLocation.startsWith("/")) {
|
|
98
|
+
if (packageLocation.endsWith(".zip")) {
|
|
99
|
+
packageLocation =
|
|
100
|
+
await this.projectStore.unzipProject(packageLocation);
|
|
101
|
+
}
|
|
102
|
+
await this.projectStore.mountLocalDirectory(
|
|
103
|
+
packageLocation,
|
|
104
|
+
absoluteTargetPath,
|
|
105
|
+
projectName,
|
|
106
|
+
);
|
|
96
107
|
}
|
|
97
108
|
}
|
|
98
109
|
}
|
|
@@ -14,8 +14,8 @@ export class ScheduleController {
|
|
|
14
14
|
projectName: string,
|
|
15
15
|
packageName: string,
|
|
16
16
|
): Promise<ApiSchedule[]> {
|
|
17
|
-
const project = await this.projectStore
|
|
18
|
-
const p = await project
|
|
19
|
-
return p
|
|
17
|
+
const project = await this.projectStore?.getProject?.(projectName);
|
|
18
|
+
const p = await project?.getPackage?.(packageName);
|
|
19
|
+
return p?.listSchedules?.();
|
|
20
20
|
}
|
|
21
21
|
}
|
package/src/logger.ts
CHANGED
|
@@ -20,11 +20,20 @@ export const logger = winston.createLogger({
|
|
|
20
20
|
|
|
21
21
|
export const loggerMiddleware: RequestHandler = (req, res, next) => {
|
|
22
22
|
const startTime = performance.now();
|
|
23
|
+
const resJson = res.json;
|
|
24
|
+
res.json = (body: unknown) => {
|
|
25
|
+
res.locals.body = body;
|
|
26
|
+
return resJson.call(res, body);
|
|
27
|
+
};
|
|
23
28
|
res.on("finish", () => {
|
|
24
29
|
const endTime = performance.now();
|
|
25
30
|
logger.info(`${req.method} ${req.url}`, {
|
|
26
31
|
statusCode: res.statusCode,
|
|
27
32
|
duration: endTime - startTime,
|
|
33
|
+
payload: req.body,
|
|
34
|
+
response: res.locals.body,
|
|
35
|
+
params: req.params,
|
|
36
|
+
query: req.query,
|
|
28
37
|
});
|
|
29
38
|
});
|
|
30
39
|
next();
|
package/src/server.ts
CHANGED
|
@@ -92,7 +92,7 @@ const databaseController = new DatabaseController(projectStore);
|
|
|
92
92
|
const queryController = new QueryController(projectStore);
|
|
93
93
|
const scheduleController = new ScheduleController(projectStore);
|
|
94
94
|
|
|
95
|
-
const mcpApp = express();
|
|
95
|
+
export const mcpApp = express();
|
|
96
96
|
|
|
97
97
|
mcpApp.use(MCP_ENDPOINT, express.json());
|
|
98
98
|
mcpApp.use(MCP_ENDPOINT, cors());
|
|
@@ -208,6 +208,13 @@ const setVersionIdError = (res: express.Response) => {
|
|
|
208
208
|
app.use(cors());
|
|
209
209
|
app.use(bodyParser.json());
|
|
210
210
|
|
|
211
|
+
app.get(`${API_PREFIX}/status`, async (_req, res) => {
|
|
212
|
+
res.status(200).json({
|
|
213
|
+
timestamp: Date.now(),
|
|
214
|
+
projects: await projectStore.listProjects(),
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
211
218
|
app.get(`${API_PREFIX}/watch-mode/status`, watchModeController.getWatchStatus);
|
|
212
219
|
app.post(`${API_PREFIX}/watch-mode/start`, watchModeController.startWatching);
|
|
213
220
|
app.post(`${API_PREFIX}/watch-mode/stop`, watchModeController.stopWatchMode);
|
|
@@ -224,7 +231,9 @@ app.get(`${API_PREFIX}/projects`, async (_req, res) => {
|
|
|
224
231
|
|
|
225
232
|
app.post(`${API_PREFIX}/projects`, async (req, res) => {
|
|
226
233
|
try {
|
|
227
|
-
|
|
234
|
+
logger.info("Adding project", { body: req.body });
|
|
235
|
+
const project = await projectStore.addProject(req.body);
|
|
236
|
+
res.status(200).json(await project.serialize());
|
|
228
237
|
} catch (error) {
|
|
229
238
|
logger.error(error);
|
|
230
239
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -238,7 +247,7 @@ app.get(`${API_PREFIX}/projects/:projectName`, async (req, res) => {
|
|
|
238
247
|
req.params.projectName,
|
|
239
248
|
req.query.reload === "true",
|
|
240
249
|
);
|
|
241
|
-
res.status(200).json(project.
|
|
250
|
+
res.status(200).json(await project.serialize());
|
|
242
251
|
} catch (error) {
|
|
243
252
|
logger.error(error);
|
|
244
253
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -248,7 +257,8 @@ app.get(`${API_PREFIX}/projects/:projectName`, async (req, res) => {
|
|
|
248
257
|
|
|
249
258
|
app.patch(`${API_PREFIX}/projects/:projectName`, async (req, res) => {
|
|
250
259
|
try {
|
|
251
|
-
|
|
260
|
+
const project = await projectStore.updateProject(req.body);
|
|
261
|
+
res.status(200).json(await project.serialize());
|
|
252
262
|
} catch (error) {
|
|
253
263
|
logger.error(error);
|
|
254
264
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -258,9 +268,8 @@ app.patch(`${API_PREFIX}/projects/:projectName`, async (req, res) => {
|
|
|
258
268
|
|
|
259
269
|
app.delete(`${API_PREFIX}/projects/:projectName`, async (req, res) => {
|
|
260
270
|
try {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
);
|
|
271
|
+
const project = await projectStore.deleteProject(req.params.projectName);
|
|
272
|
+
res.status(200).json(await project.serialize());
|
|
264
273
|
} catch (error) {
|
|
265
274
|
logger.error(error);
|
|
266
275
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -302,12 +311,11 @@ app.get(
|
|
|
302
311
|
`${API_PREFIX}/projects/:projectName/connections/:connectionName/test`,
|
|
303
312
|
async (req, res) => {
|
|
304
313
|
try {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
req.params.connectionName,
|
|
309
|
-
),
|
|
314
|
+
const connectionStatus = await connectionController.testConnection(
|
|
315
|
+
req.params.projectName,
|
|
316
|
+
req.params.connectionName,
|
|
310
317
|
);
|
|
318
|
+
res.status(200).json(connectionStatus);
|
|
311
319
|
} catch (error) {
|
|
312
320
|
logger.error(error);
|
|
313
321
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -451,9 +459,11 @@ app.get(`${API_PREFIX}/projects/:projectName/packages`, async (req, res) => {
|
|
|
451
459
|
|
|
452
460
|
app.post(`${API_PREFIX}/projects/:projectName/packages`, async (req, res) => {
|
|
453
461
|
try {
|
|
454
|
-
|
|
455
|
-
|
|
462
|
+
const _package = await packageController.addPackage(
|
|
463
|
+
req.params.projectName,
|
|
464
|
+
req.body,
|
|
456
465
|
);
|
|
466
|
+
res.status(200).json(_package?.getPackageMetadata());
|
|
457
467
|
} catch (error) {
|
|
458
468
|
logger.error(error);
|
|
459
469
|
const { json, status } = internalErrorToHttpError(error as Error);
|
|
@@ -711,22 +721,18 @@ app.use(
|
|
|
711
721
|
);
|
|
712
722
|
|
|
713
723
|
const mainServer = http.createServer(app);
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
logger.info(
|
|
722
|
-
"Running in development mode - proxying to React dev server at http://localhost:5173",
|
|
723
|
-
);
|
|
724
|
-
}
|
|
725
|
-
});
|
|
726
|
-
mcpApp.listen(MCP_PORT, PUBLISHER_HOST, () => {
|
|
724
|
+
|
|
725
|
+
mainServer.listen(PUBLISHER_PORT, PUBLISHER_HOST, () => {
|
|
726
|
+
const address = mainServer.address() as AddressInfo;
|
|
727
|
+
logger.info(
|
|
728
|
+
`Publisher server listening at http://${address.address}:${address.port}`,
|
|
729
|
+
);
|
|
730
|
+
if (isDevelopment) {
|
|
727
731
|
logger.info(
|
|
728
|
-
|
|
732
|
+
"Running in development mode - proxying to React dev server at http://localhost:5173",
|
|
729
733
|
);
|
|
730
|
-
}
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
mcpApp.listen(MCP_PORT, PUBLISHER_HOST, () => {
|
|
737
|
+
logger.info(`MCP server listening at http://${PUBLISHER_HOST}:${MCP_PORT}`);
|
|
731
738
|
});
|
|
732
|
-
|
|
@@ -10,6 +10,7 @@ import path from "path";
|
|
|
10
10
|
import { v4 as uuidv4 } from "uuid";
|
|
11
11
|
import { components } from "../api";
|
|
12
12
|
import { CONNECTIONS_MANIFEST_NAME } from "../constants";
|
|
13
|
+
import { logger } from "../logger";
|
|
13
14
|
|
|
14
15
|
type ApiConnection = components["schemas"]["Connection"];
|
|
15
16
|
type ApiConnectionAttributes = components["schemas"]["ConnectionAttributes"];
|
|
@@ -42,184 +43,181 @@ export async function readConnectionConfig(
|
|
|
42
43
|
return JSON.parse(connectionFileContents.toString()) as ApiConnection[];
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
export async function createConnections(
|
|
46
|
+
export async function createConnections(
|
|
47
|
+
basePath: string,
|
|
48
|
+
defaultConnections: ApiConnection[] = [],
|
|
49
|
+
): Promise<{
|
|
46
50
|
malloyConnections: Map<string, BaseConnection>;
|
|
47
51
|
apiConnections: InternalConnection[];
|
|
48
52
|
}> {
|
|
49
53
|
const connectionMap = new Map<string, BaseConnection>();
|
|
50
54
|
const connectionConfig = await readConnectionConfig(basePath);
|
|
51
55
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
for (const connection of [...defaultConnections, ...connectionConfig]) {
|
|
57
|
+
logger.info(`Adding connection ${connection.name}`, {
|
|
58
|
+
connection,
|
|
59
|
+
});
|
|
60
|
+
// This case shouldn't happen. The package validation logic should
|
|
61
|
+
// catch it.
|
|
62
|
+
if (!connection.name) {
|
|
63
|
+
throw "Invalid connection configuration. No name.";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
switch (connection.type) {
|
|
67
|
+
case "postgres": {
|
|
68
|
+
const configReader = async () => {
|
|
69
|
+
if (!connection.postgresConnection) {
|
|
70
|
+
throw "Invalid connection configuration. No postgres connection.";
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
host: connection.postgresConnection.host,
|
|
74
|
+
port: connection.postgresConnection.port,
|
|
75
|
+
username: connection.postgresConnection.userName,
|
|
76
|
+
password: connection.postgresConnection.password,
|
|
77
|
+
databaseName: connection.postgresConnection.databaseName,
|
|
78
|
+
connectionString:
|
|
79
|
+
connection.postgresConnection.connectionString,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
const postgresConnection = new PostgresConnection(
|
|
83
|
+
connection.name,
|
|
84
|
+
() => ({}),
|
|
85
|
+
configReader,
|
|
86
|
+
);
|
|
87
|
+
connectionMap.set(connection.name, postgresConnection);
|
|
88
|
+
connection.attributes = getConnectionAttributes(postgresConnection);
|
|
89
|
+
break;
|
|
58
90
|
}
|
|
59
91
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (!connection.postgresConnection) {
|
|
64
|
-
throw "Invalid connection configuration. No postgres connection.";
|
|
65
|
-
}
|
|
66
|
-
return {
|
|
67
|
-
host: connection.postgresConnection.host,
|
|
68
|
-
port: connection.postgresConnection.port,
|
|
69
|
-
username: connection.postgresConnection.userName,
|
|
70
|
-
password: connection.postgresConnection.password,
|
|
71
|
-
databaseName: connection.postgresConnection.databaseName,
|
|
72
|
-
connectionString:
|
|
73
|
-
connection.postgresConnection.connectionString,
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
const postgresConnection = new PostgresConnection(
|
|
77
|
-
connection.name,
|
|
78
|
-
() => ({}),
|
|
79
|
-
configReader,
|
|
80
|
-
);
|
|
81
|
-
connectionMap.set(connection.name, postgresConnection);
|
|
82
|
-
connection.attributes =
|
|
83
|
-
getConnectionAttributes(postgresConnection);
|
|
84
|
-
break;
|
|
92
|
+
case "mysql": {
|
|
93
|
+
if (!connection.mysqlConnection) {
|
|
94
|
+
throw "Invalid connection configuration. No mysql connection.";
|
|
85
95
|
}
|
|
96
|
+
const config = {
|
|
97
|
+
host: connection.mysqlConnection.host,
|
|
98
|
+
port: connection.mysqlConnection.port,
|
|
99
|
+
user: connection.mysqlConnection.user,
|
|
100
|
+
password: connection.mysqlConnection.password,
|
|
101
|
+
database: connection.mysqlConnection.database,
|
|
102
|
+
};
|
|
103
|
+
const mysqlConnection = new MySQLConnection(
|
|
104
|
+
connection.name,
|
|
105
|
+
config,
|
|
106
|
+
);
|
|
107
|
+
connectionMap.set(connection.name, mysqlConnection);
|
|
108
|
+
connection.attributes = getConnectionAttributes(mysqlConnection);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
86
111
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
const config = {
|
|
92
|
-
host: connection.mysqlConnection.host,
|
|
93
|
-
port: connection.mysqlConnection.port,
|
|
94
|
-
user: connection.mysqlConnection.user,
|
|
95
|
-
password: connection.mysqlConnection.password,
|
|
96
|
-
database: connection.mysqlConnection.database,
|
|
97
|
-
};
|
|
98
|
-
const mysqlConnection = new MySQLConnection(
|
|
99
|
-
connection.name,
|
|
100
|
-
config,
|
|
101
|
-
);
|
|
102
|
-
connectionMap.set(connection.name, mysqlConnection);
|
|
103
|
-
connection.attributes = getConnectionAttributes(mysqlConnection);
|
|
104
|
-
break;
|
|
112
|
+
case "bigquery": {
|
|
113
|
+
if (!connection.bigqueryConnection) {
|
|
114
|
+
throw "Invalid connection configuration. No bigquery connection.";
|
|
105
115
|
}
|
|
106
116
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
serviceAccountKeyPath
|
|
117
|
-
|
|
118
|
-
`${connection.name}-${uuidv4()}-service-account-key.json`,
|
|
119
|
-
);
|
|
120
|
-
await fs.writeFile(
|
|
121
|
-
serviceAccountKeyPath,
|
|
122
|
-
connection.bigqueryConnection
|
|
123
|
-
.serviceAccountKeyJson as string,
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const bigqueryConnectionOptions = {
|
|
128
|
-
projectId: connection.bigqueryConnection.defaultProjectId,
|
|
129
|
-
serviceAccountKeyPath: serviceAccountKeyPath,
|
|
130
|
-
location: connection.bigqueryConnection.location,
|
|
131
|
-
maximumBytesBilled:
|
|
132
|
-
connection.bigqueryConnection.maximumBytesBilled,
|
|
133
|
-
timeoutMs:
|
|
134
|
-
connection.bigqueryConnection.queryTimeoutMilliseconds,
|
|
135
|
-
billingProjectId:
|
|
136
|
-
connection.bigqueryConnection.billingProjectId,
|
|
137
|
-
};
|
|
138
|
-
const bigqueryConnection = new BigQueryConnection(
|
|
139
|
-
connection.name,
|
|
140
|
-
() => ({}),
|
|
141
|
-
bigqueryConnectionOptions,
|
|
117
|
+
// If a service account key file is provided, we persist it to disk
|
|
118
|
+
// and pass the path to the BigQueryConnection.
|
|
119
|
+
let serviceAccountKeyPath = undefined;
|
|
120
|
+
if (connection.bigqueryConnection.serviceAccountKeyJson) {
|
|
121
|
+
serviceAccountKeyPath = path.join(
|
|
122
|
+
"/tmp",
|
|
123
|
+
`${connection.name}-${uuidv4()}-service-account-key.json`,
|
|
124
|
+
);
|
|
125
|
+
await fs.writeFile(
|
|
126
|
+
serviceAccountKeyPath,
|
|
127
|
+
connection.bigqueryConnection.serviceAccountKeyJson as string,
|
|
142
128
|
);
|
|
143
|
-
connectionMap.set(connection.name, bigqueryConnection);
|
|
144
|
-
connection.attributes =
|
|
145
|
-
getConnectionAttributes(bigqueryConnection);
|
|
146
|
-
break;
|
|
147
129
|
}
|
|
148
130
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
131
|
+
const bigqueryConnectionOptions = {
|
|
132
|
+
projectId: connection.bigqueryConnection.defaultProjectId,
|
|
133
|
+
serviceAccountKeyPath: serviceAccountKeyPath,
|
|
134
|
+
location: connection.bigqueryConnection.location,
|
|
135
|
+
maximumBytesBilled:
|
|
136
|
+
connection.bigqueryConnection.maximumBytesBilled,
|
|
137
|
+
timeoutMs:
|
|
138
|
+
connection.bigqueryConnection.queryTimeoutMilliseconds,
|
|
139
|
+
billingProjectId: connection.bigqueryConnection.billingProjectId,
|
|
140
|
+
};
|
|
141
|
+
const bigqueryConnection = new BigQueryConnection(
|
|
142
|
+
connection.name,
|
|
143
|
+
() => ({}),
|
|
144
|
+
bigqueryConnectionOptions,
|
|
145
|
+
);
|
|
146
|
+
connectionMap.set(connection.name, bigqueryConnection);
|
|
147
|
+
connection.attributes = getConnectionAttributes(bigqueryConnection);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
162
150
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
151
|
+
case "snowflake": {
|
|
152
|
+
if (!connection.snowflakeConnection) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
"Snowflake connection configuration is missing.",
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
if (!connection.snowflakeConnection.account) {
|
|
158
|
+
throw new Error("Snowflake account is required.");
|
|
159
|
+
}
|
|
166
160
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
161
|
+
if (!connection.snowflakeConnection.username) {
|
|
162
|
+
throw new Error("Snowflake username is required.");
|
|
163
|
+
}
|
|
170
164
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
account: connection.snowflakeConnection.account,
|
|
174
|
-
username: connection.snowflakeConnection.username,
|
|
175
|
-
password: connection.snowflakeConnection.password,
|
|
176
|
-
warehouse: connection.snowflakeConnection.warehouse,
|
|
177
|
-
database: connection.snowflakeConnection.database,
|
|
178
|
-
schema: connection.snowflakeConnection.schema,
|
|
179
|
-
timeout:
|
|
180
|
-
connection.snowflakeConnection
|
|
181
|
-
.responseTimeoutMilliseconds,
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
const snowflakeConnection = new SnowflakeConnection(
|
|
185
|
-
connection.name,
|
|
186
|
-
snowflakeConnectionOptions,
|
|
187
|
-
);
|
|
188
|
-
connectionMap.set(connection.name, snowflakeConnection);
|
|
189
|
-
connection.attributes =
|
|
190
|
-
getConnectionAttributes(snowflakeConnection);
|
|
191
|
-
break;
|
|
165
|
+
if (!connection.snowflakeConnection.password) {
|
|
166
|
+
throw new Error("Snowflake password is required.");
|
|
192
167
|
}
|
|
193
168
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
throw new Error("Trino connection configuration is missing.");
|
|
197
|
-
}
|
|
198
|
-
const trinoConnectionOptions = {
|
|
199
|
-
server: connection.trinoConnection.server,
|
|
200
|
-
port: connection.trinoConnection.port,
|
|
201
|
-
catalog: connection.trinoConnection.catalog,
|
|
202
|
-
schema: connection.trinoConnection.schema,
|
|
203
|
-
user: connection.trinoConnection.user,
|
|
204
|
-
password: connection.trinoConnection.password,
|
|
205
|
-
};
|
|
206
|
-
const trinoConnection = new TrinoConnection(
|
|
207
|
-
connection.name,
|
|
208
|
-
{},
|
|
209
|
-
trinoConnectionOptions,
|
|
210
|
-
);
|
|
211
|
-
connectionMap.set(connection.name, trinoConnection);
|
|
212
|
-
connection.attributes = getConnectionAttributes(trinoConnection);
|
|
213
|
-
break;
|
|
169
|
+
if (!connection.snowflakeConnection.warehouse) {
|
|
170
|
+
throw new Error("Snowflake warehouse is required.");
|
|
214
171
|
}
|
|
215
172
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
173
|
+
const snowflakeConnectionOptions = {
|
|
174
|
+
connOptions: {
|
|
175
|
+
account: connection.snowflakeConnection.account,
|
|
176
|
+
username: connection.snowflakeConnection.username,
|
|
177
|
+
password: connection.snowflakeConnection.password,
|
|
178
|
+
warehouse: connection.snowflakeConnection.warehouse,
|
|
179
|
+
database: connection.snowflakeConnection.database,
|
|
180
|
+
schema: connection.snowflakeConnection.schema,
|
|
181
|
+
timeout:
|
|
182
|
+
connection.snowflakeConnection.responseTimeoutMilliseconds,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
const snowflakeConnection = new SnowflakeConnection(
|
|
186
|
+
connection.name,
|
|
187
|
+
snowflakeConnectionOptions,
|
|
188
|
+
);
|
|
189
|
+
connectionMap.set(connection.name, snowflakeConnection);
|
|
190
|
+
connection.attributes =
|
|
191
|
+
getConnectionAttributes(snowflakeConnection);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
case "trino": {
|
|
196
|
+
if (!connection.trinoConnection) {
|
|
197
|
+
throw new Error("Trino connection configuration is missing.");
|
|
220
198
|
}
|
|
199
|
+
const trinoConnectionOptions = {
|
|
200
|
+
server: connection.trinoConnection.server,
|
|
201
|
+
port: connection.trinoConnection.port,
|
|
202
|
+
catalog: connection.trinoConnection.catalog,
|
|
203
|
+
schema: connection.trinoConnection.schema,
|
|
204
|
+
user: connection.trinoConnection.user,
|
|
205
|
+
password: connection.trinoConnection.password,
|
|
206
|
+
};
|
|
207
|
+
const trinoConnection = new TrinoConnection(
|
|
208
|
+
connection.name,
|
|
209
|
+
{},
|
|
210
|
+
trinoConnectionOptions,
|
|
211
|
+
);
|
|
212
|
+
connectionMap.set(connection.name, trinoConnection);
|
|
213
|
+
connection.attributes = getConnectionAttributes(trinoConnection);
|
|
214
|
+
break;
|
|
221
215
|
}
|
|
222
|
-
|
|
216
|
+
|
|
217
|
+
default: {
|
|
218
|
+
throw new Error(`Unsupported connection type: ${connection.type}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
223
221
|
}
|
|
224
222
|
|
|
225
223
|
return {
|