@metabase/cli 0.4.1-alpha.release-65-integration-branch.5cbe297 → 0.5.1
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/{add-collection-hv29px39.mjs → add-collection-BnGPc0Vv.mjs} +4 -4
- package/dist/{alert-DnTCjYIu.mjs → alert-DQkF8jYR.mjs} +7 -7
- package/dist/{alerts-_ELZ12ye.mjs → alerts-BncG7w1_.mjs} +6 -6
- package/dist/{append-B9sLLPYT.mjs → append-D4ekYCuD.mjs} +4 -4
- package/dist/{archive-BhIeDoLk.mjs → archive-BQ4OA-R4.mjs} +3 -3
- package/dist/{archive-CwBk5vxQ.mjs → archive-BXr9kFNz.mjs} +3 -3
- package/dist/{archive-BdX0Uvf2.mjs → archive-BifJXCHF.mjs} +3 -3
- package/dist/{archive-DD8C0Krt2.mjs → archive-CxNUeWII2.mjs} +4 -4
- package/dist/{archive-BRX5fKPb.mjs → archive-D2WCz3Oe.mjs} +3 -3
- package/dist/{archive-DDUSmbjn.mjs → archive-DjHLWUfC.mjs} +5 -5
- package/dist/{archive-CdfyB0To.mjs → archive-DnCF-Ecm.mjs} +5 -5
- package/dist/{archive-ZnHzMJaM.mjs → archive-DocyUIME.mjs} +5 -5
- package/dist/{archive-CKWWyI1i.mjs → archive-DpCP4yR1.mjs} +4 -4
- package/dist/{archive-D22VL5Bx.mjs → archive-EhW6blNc.mjs} +3 -3
- package/dist/{archive-3MQyc5Ih.mjs → archive-ULXc3xzI.mjs} +3 -3
- package/dist/{archive-BAHzxkPR.mjs → archive-v08JESCM.mjs} +5 -5
- package/dist/{auth-Ca84a5fv.mjs → auth-BPbsm8yV.mjs} +5 -5
- package/dist/{body-BVrHLwJU.mjs → body-BkkQkGJg.mjs} +2 -3
- package/dist/{branch-flag-Czh8JT1G.mjs → branch-flag-CTDvbaBa.mjs} +1 -1
- package/dist/{branches-frSt4WcS.mjs → branches-lPHtM_xR.mjs} +3 -3
- package/dist/{breaking-zlgxxwdd.mjs → breaking-DjMlCD96.mjs} +6 -6
- package/dist/{broken-BUAzpKLc.mjs → broken-DUX3GWS5.mjs} +8 -8
- package/dist/{bulk-discard-values-DU15VJPb.mjs → bulk-discard-values-Dl8Lzypf.mjs} +5 -5
- package/dist/{bulk-edit-TSa4lNkM.mjs → bulk-edit-N2xLVtfG.mjs} +5 -5
- package/dist/{bulk-rescan-values-BYJAsPC1.mjs → bulk-rescan-values-BK2rH2Ik.mjs} +5 -5
- package/dist/{bulk-sync-schema-DtaOwEtW.mjs → bulk-sync-schema-BKJc9Rzq.mjs} +5 -5
- package/dist/{cancel-DCOvSQsq.mjs → cancel-DzkRVGIk.mjs} +3 -3
- package/dist/{cancel-task-osQLETJh.mjs → cancel-task-BiTlDY7a.mjs} +3 -3
- package/dist/card-BTBDBsu-.mjs +25 -0
- package/dist/{cards-B1pyPl77.mjs → cards-CSL8ukS1.mjs} +4 -4
- package/dist/cli.mjs +619 -198
- package/dist/{client-1UIUBA_V.mjs → client-BBwYPXDW.mjs} +443 -380
- package/dist/collection-B19phRNU.mjs +21 -0
- package/dist/{collection-BgPYl2c5.mjs → collection-B2wRXyTF.mjs} +11 -3
- package/dist/{collection-DPiztU_l.mjs → collection-CTnYZ2Jj.mjs} +1 -1
- package/dist/{collection-namespace-Cizv6-94.mjs → collection-namespace-B1OkM7p1.mjs} +1 -2
- package/dist/{content-translation-XnHISl5-.mjs → content-translation-DoGTQnvH.mjs} +3 -3
- package/dist/{copy-DAKdksBm.mjs → copy-BYukQEtf.mjs} +4 -4
- package/dist/{copy-BCVW48Jq.mjs → copy-XlCT3gvG.mjs} +6 -6
- package/dist/{copy-flags-D7NTgAz1.mjs → copy-flags-ByB2MicL.mjs} +2 -2
- package/dist/{create-qCgnB-oZ.mjs → create-3_oY9KHY.mjs} +3 -3
- package/dist/{create-KyeJjhxH2.mjs → create-B3fm5I-l2.mjs} +4 -4
- package/dist/{create-CuhQ1Khk.mjs → create-BP39g5Jk.mjs} +5 -5
- package/dist/{create-cqbpWaOi.mjs → create-Bl9sS7v7.mjs} +4 -4
- package/dist/{create-BzE4q6F_.mjs → create-Bnb1abv_.mjs} +4 -4
- package/dist/{create-Br5JxAeE.mjs → create-CLZ7w83R.mjs} +4 -4
- package/dist/{create-B5eo9PSN.mjs → create-CYoarNrb.mjs} +4 -4
- package/dist/{create-B57D5E-o.mjs → create-CbT4SPHV.mjs} +5 -5
- package/dist/{create-BfA1pnmS.mjs → create-Cdt8u1wF.mjs} +6 -6
- package/dist/{create-C7fVbQbQ.mjs → create-CqF7vqXC.mjs} +4 -4
- package/dist/{create-XnYN2zoc.mjs → create-CrtIqtXN.mjs} +6 -6
- package/dist/{create-B1ifNWcE.mjs → create-D5_c5SHo.mjs} +5 -5
- package/dist/{create-CW4WF073.mjs → create-DBNxy5rN.mjs} +5 -5
- package/dist/{create-g4pZa_Xa.mjs → create-DZJQp3r7.mjs} +3 -3
- package/dist/{create-D2iZsTRV.mjs → create-DxMmIHI4.mjs} +5 -5
- package/dist/{create-BOvtRwRz.mjs → create-T4PZPVE9.mjs} +4 -4
- package/dist/{create-branch-Cli5cXvk.mjs → create-branch-CUNFdKyB.mjs} +3 -3
- package/dist/{create-D7zeAm-0.mjs → create-jr4xJgSI.mjs} +4 -4
- package/dist/{create--b64pMVM.mjs → create-k1Bo7h7g.mjs} +5 -5
- package/dist/{csv-CWIcAm_-.mjs → csv-CcnhKpuj.mjs} +4 -4
- package/dist/{current-task-eBjusv2o.mjs → current-task-nl2z8sHI.mjs} +4 -4
- package/dist/dashboard-BP0p62fp.mjs +35 -0
- package/dist/data-action-Cr17CfgE.mjs +24 -0
- package/dist/{database-BT7DVgSr.mjs → database-2HYCdHqK.mjs} +1 -1
- package/dist/{database-Kq2AL5jH.mjs → database-BewllGR7.mjs} +1 -1
- package/dist/{dataset-BmvCxGoE.mjs → dataset-D-x2Ho2i.mjs} +3 -14
- package/dist/{db-_H9HAS6H.mjs → db-m5bQcXdn.mjs} +7 -7
- package/dist/{delete-B0O-mf63.mjs → delete-BOma6qIq.mjs} +4 -4
- package/dist/{delete-BMvVkW-m.mjs → delete-BUCh72Bq.mjs} +4 -4
- package/dist/{delete-CynbfvS2.mjs → delete-BXMc-g3Q.mjs} +4 -4
- package/dist/{delete-BW5QXiyJ.mjs → delete-BrbmJ3sn.mjs} +4 -4
- package/dist/{delete-C7QmQlp9.mjs → delete-DulVnxD_.mjs} +4 -4
- package/dist/{delete-DPU-uQxU.mjs → delete-Oc2GE170.mjs} +4 -4
- package/dist/{delete-DOn2uk0u.mjs → delete-QHsiWYay.mjs} +4 -4
- package/dist/{delete-runtime-Cc7TASG7.mjs → delete-runtime-CkNvZfFA.mjs} +1 -1
- package/dist/{delete-table-DFqm6bAq.mjs → delete-table-LgJ17t6j.mjs} +4 -4
- package/dist/{delete-BztmAfPc.mjs → delete-xf2n7SNg.mjs} +4 -4
- package/dist/{dependencies-DZ-kMsDa.mjs → dependencies-BE5QW7Lb.mjs} +5 -5
- package/dist/{dependency-BHKwKjhO.mjs → dependency-BACk_cVP.mjs} +2 -2
- package/dist/dependency-BlTYysYG.mjs +15 -0
- package/dist/{dependency-B4J1bwFh.mjs → dependency-qP1hx2YN.mjs} +1 -1
- package/dist/{dependents-Ia2fe_KK.mjs → dependents-mbgHQNiv.mjs} +9 -9
- package/dist/{dirty-BrXAPows.mjs → dirty-fYlA1N1e.mjs} +4 -4
- package/dist/{discard-values-B9mTgFbV.mjs → discard-values-cIRBP5nT.mjs} +5 -5
- package/dist/document-BaRQ5fBd.mjs +20 -0
- package/dist/{document-BsaKF8UR.mjs → document-DVIu3Vj4.mjs} +1 -1
- package/dist/{document-COQzVLjW.mjs → document-UMG6me2P.mjs} +1 -1
- package/dist/{download-CZdsDdhG.mjs → download-CokVpeK6.mjs} +2 -2
- package/dist/{eid-DsGNJ16z.mjs → eid-CaumGUFD.mjs} +5 -5
- package/dist/{eid-translation-zEHtr5Oc.mjs → eid-translation-Ba92VOHe.mjs} +1 -0
- package/dist/{entity-BFajNdQp.mjs → entity-BHYJtRxp.mjs} +2 -2
- package/dist/{entry-flags-BaZUoxUR.mjs → entry-flags-DjICpQkc.mjs} +4 -4
- package/dist/{events-rkMIMpnS.mjs → events-jEo9fytL.mjs} +6 -6
- package/dist/{execute-DvBse4aF.mjs → execute-H09Qus4_.mjs} +4 -4
- package/dist/{export-BCkzx9zk.mjs → export-YtdZo7LZ.mjs} +7 -7
- package/dist/{export-flags-TuwwRhD6.mjs → export-flags-DzW0Ktkh.mjs} +2 -2
- package/dist/{export-preflight-p7botJyN.mjs → export-preflight-Db_TChn5.mjs} +5 -5
- package/dist/field-DktidTPB.mjs +21 -0
- package/dist/{fields-CJVXOLbB.mjs → fields-DUXlosmx.mjs} +4 -4
- package/dist/{filter-flags-yY4RM312.mjs → filter-flags-DTDcU7OI.mjs} +3 -3
- package/dist/{fks-B6hjrdJP.mjs → fks-Cl2sq-c0.mjs} +6 -6
- package/dist/{get-D1p-5ibI.mjs → get-B-WT6ess.mjs} +5 -5
- package/dist/{get-DpYTiE4D.mjs → get-BilMWiFq.mjs} +5 -5
- package/dist/{get-CWBN0G-4.mjs → get-Bt_zhviQ.mjs} +3 -3
- package/dist/{get-DsbDxSpy.mjs → get-CM596pmP.mjs} +3 -3
- package/dist/{get-BxUgfEPW.mjs → get-CTtzccwr.mjs} +4 -4
- package/dist/{get-oLc5jgid2.mjs → get-CVMWhbA82.mjs} +4 -4
- package/dist/{get-Eforof5e.mjs → get-CWyRAHpz.mjs} +5 -5
- package/dist/{get-BvUNnNRq.mjs → get-C_rjxpoe.mjs} +3 -3
- package/dist/{get-B5L4BUGK.mjs → get-Cg0up9gm.mjs} +3 -3
- package/dist/{get-xmhwvAQJ.mjs → get-CqlNUyFY.mjs} +5 -5
- package/dist/{get-CXeFg0F2.mjs → get-DPiNYmXo.mjs} +5 -5
- package/dist/{get-DyS1mRI6.mjs → get-DTDvlLT3.mjs} +3 -3
- package/dist/{get-C6uLL4bJ.mjs → get-DtcChy9h.mjs} +5 -5
- package/dist/{get-BYtFVJHT.mjs → get-DyK_bvg6.mjs} +4 -4
- package/dist/{get-Do1LC4I52.mjs → get-DySyvotk2.mjs} +5 -5
- package/dist/{get-D7HPiBB0.mjs → get-FxCF0rxc.mjs} +4 -4
- package/dist/{get-CoJcgFky.mjs → get-GuWW4J24.mjs} +5 -5
- package/dist/{get-DPlSzRI0.mjs → get-XS-6R81E.mjs} +3 -3
- package/dist/{get-zotSW00n.mjs → get-oQNL6pLY.mjs} +3 -3
- package/dist/{get-BwKQw_rR.mjs → get-okEsnkvC.mjs} +3 -3
- package/dist/{get-run-bU-d--nM.mjs → get-run-CFGxSm_S.mjs} +4 -4
- package/dist/{get-DSjITPED.mjs → get-zPMv3kZE.mjs} +5 -5
- package/dist/git-sync-BwkWeJAz.mjs +29 -0
- package/dist/{git-sync-DspFahwV.mjs → git-sync-Ch1V1fEK.mjs} +1 -1
- package/dist/glossary-BSgRQ2HO.mjs +14 -0
- package/dist/{glossary-Del97Jqg.mjs → glossary-BkGmCI4X.mjs} +1 -1
- package/dist/{glossary-CdW6RFId.mjs → glossary-QN-hHfOT.mjs} +1 -1
- package/dist/{graph-CHXJ6mB7.mjs → graph-Wf4e0XIa.mjs} +6 -6
- package/dist/{group-D4w87fXL.mjs → group-81zoQcEP.mjs} +1 -1
- package/dist/{has-remote-changes-BXEe8Sv5.mjs → has-remote-changes-BsS3XB0P.mjs} +3 -3
- package/dist/{import-DZQb4bUo.mjs → import-CXd5HdB0.mjs} +7 -7
- package/dist/{input-DjHsV-kD.mjs → input-AXP2LCOV.mjs} +1 -1
- package/dist/{is-dirty-DwQ2_CCB.mjs → is-dirty-TDcfeOde.mjs} +2 -2
- package/dist/{items-DNdICQ7M.mjs → items-BxvhoxYm.mjs} +6 -6
- package/dist/{key-BTaxFn_7.mjs → key-CUPbYxkk.mjs} +1 -1
- package/dist/{library-C4M8TF2N.mjs → library-BKSFtIV9.mjs} +2 -2
- package/dist/{library-DmkpcZPb.mjs → library-DuIrR8LS.mjs} +1 -1
- package/dist/{library-Cdj_uj1H.mjs → library-DzejNMqX.mjs} +5 -5
- package/dist/{list-DoLqxEjq.mjs → list-3Dh5yeq-.mjs} +3 -3
- package/dist/{list-__Q79YXk.mjs → list-6nGX0Rqc.mjs} +4 -4
- package/dist/{list-hINHmdMT.mjs → list-B3Pngm2j.mjs} +5 -5
- package/dist/{list-89ZgbsvW.mjs → list-B5kRBn7k.mjs} +5 -5
- package/dist/{list-DsyvHBAv.mjs → list-B8V_OESj.mjs} +3 -3
- package/dist/{list-DcHPY1Ti.mjs → list-BUjI5G0_.mjs} +4 -4
- package/dist/{list-gqemddWB.mjs → list-Ba7u5Ai9.mjs} +4 -4
- package/dist/{list-CzxrdWB8.mjs → list-CCCy6cBI.mjs} +6 -6
- package/dist/{list-Owrzgtkc.mjs → list-CRXTfEFk.mjs} +3 -3
- package/dist/{list-C7PV9fYj.mjs → list-CUj04tg3.mjs} +6 -6
- package/dist/{list-OKHcr76i.mjs → list-Cf6A9Csi.mjs} +3 -3
- package/dist/{list-F4ENGV7j.mjs → list-Cr5Hoq-E.mjs} +4 -4
- package/dist/{list-C-WGqRqN.mjs → list-D1Q8H3jn.mjs} +6 -6
- package/dist/{list-epIn3uFZ.mjs → list-D7yH-64Z.mjs} +5 -5
- package/dist/{list-M20foZz2.mjs → list-DA1Fo6S6.mjs} +3 -3
- package/dist/{list-CYlPgzD1.mjs → list-D_fsrh8w.mjs} +5 -5
- package/dist/{list-03zaydQe.mjs → list-DjlfBd7W.mjs} +3 -3
- package/dist/{list-CZoaZc9g.mjs → list-DlgjWr4r.mjs} +5 -5
- package/dist/{list-2EWHwbQs.mjs → list-Do-Xnz0I.mjs} +4 -4
- package/dist/{list-Be6kDkyT.mjs → list-DpK3ioES.mjs} +6 -6
- package/dist/{list-CLJvuPXn.mjs → list-DsR58aMq.mjs} +5 -5
- package/dist/{login-BSqGgX8S.mjs → login-CXbCAcuB.mjs} +6 -6
- package/dist/{logout-D92O4mQK.mjs → logout-B6IGzkpG.mjs} +2 -2
- package/dist/{measure-DhX_mmZK.mjs → measure-CbMgNhlG.mjs} +6 -6
- package/dist/{notification-Cuuwoksm.mjs → notification-W2SVssyY.mjs} +1 -1
- package/dist/{parameter-values-BY2WA9qg.mjs → parameter-values-IWi_DNhp.mjs} +3 -3
- package/dist/{parse-enum-BPKULOSw.mjs → parse-enum-B2rGiC6p.mjs} +1 -1
- package/dist/{parse-id-CxHp2akh.mjs → parse-id-Cv5eM7sg.mjs} +1 -1
- package/dist/{parse-ref-8bVX_9IN.mjs → parse-ref-DW7ik6ny.mjs} +1 -1
- package/dist/{parse-text-Bm6eUa-p.mjs → parse-text-CUCSWOeR.mjs} +1 -1
- package/dist/{path-D4Q1ZzCw.mjs → path-C9r9urRK.mjs} +4 -4
- package/dist/{poll-DFZRtTA_.mjs → poll-CX3jPtXb.mjs} +2 -2
- package/dist/{preflight-BPaonBKy.mjs → preflight-CiTgqNUy.mjs} +2 -3
- package/dist/{process-B3Di_HtV.mjs → process-DImdroix.mjs} +1 -1
- package/dist/{publish-BhgyrJ6c.mjs → publish-xH1n74gd.mjs} +4 -4
- package/dist/{pulse-CIza18rO.mjs → pulse-CFj1WfIC.mjs} +1 -1
- package/dist/{query-CsBe-kJn.mjs → query-BOCw0FBK.mjs} +4 -4
- package/dist/{query-DvlGWjgG.mjs → query-CN3BW5WB.mjs} +11 -12
- package/dist/{remapping-CCEivr42.mjs → remapping-Dggq2Fv0.mjs} +4 -4
- package/dist/{remove-collection-LpgGBYCl.mjs → remove-collection-cxSSFxza.mjs} +4 -4
- package/dist/{render-D5ehBS-7.mjs → render-Cb8Hct67.mjs} +2 -2
- package/dist/{replace-DeWgkbfZ.mjs → replace-wVi_XDut.mjs} +4 -4
- package/dist/requirement-check-BE3PuGsC.mjs +60 -0
- package/dist/{rescan-values-CDDVS1tl.mjs → rescan-values-C7b1Ghy-.mjs} +5 -5
- package/dist/{rescan-values-aF18XAv6.mjs → rescan-values-DAp_avxY.mjs} +5 -5
- package/dist/{run-DyGMvbMm.mjs → run-CE6ei7s7.mjs} +4 -4
- package/dist/{run-Buf4B8QH.mjs → run-CUGs7mok.mjs} +4 -4
- package/dist/{run-DlG3Ykj1.mjs → run-DywhwjNG.mjs} +6 -6
- package/dist/{runs-D2CXgW10.mjs → runs--14jim_0.mjs} +5 -5
- package/dist/{runtime-X6hVzSMW.mjs → runtime-Ckns6TKK.mjs} +248 -534
- package/dist/{schema-tables-FUOIyoUU.mjs → schema-tables-CeW0kpA5.mjs} +6 -6
- package/dist/{schemas-CmfNeqzG.mjs → schemas-CHMD0HrY.mjs} +4 -4
- package/dist/{search-BAXg-EJw.mjs → search-CXRavT7G.mjs} +1 -0
- package/dist/{search-Dl7xzF6Q.mjs → search-DyC54bGf.mjs} +7 -7
- package/dist/{search-CLpDqYpY.mjs → search-LmBQu1Jg.mjs} +5 -5
- package/dist/{segment-Bx28f38v.mjs → segment-DeT_Yic6.mjs} +6 -6
- package/dist/{send-CoGV2zkp.mjs → send-BWSJMrDL.mjs} +3 -3
- package/dist/{set-active-CbiJv8Hg.mjs → set-active-C5cLG4_O.mjs} +4 -4
- package/dist/{set-CrR9IumN.mjs → set-r2xiXrT_.mjs} +4 -4
- package/dist/{set-sensitivity-CTHVxpnU.mjs → set-sensitivity-BMLKazua.mjs} +4 -4
- package/dist/{setting-CUxdweNJ.mjs → setting-CDRusiqP.mjs} +4 -4
- package/dist/{setup-4uySIB-t.mjs → setup-BZaJVww3.mjs} +3 -3
- package/dist/{signal-0Yt8JTMn.mjs → signal-4tpCIkqR.mjs} +1 -1
- package/dist/{skill-list-goCqmfFF.mjs → skill-list-D2FhhYS3.mjs} +9 -3
- package/dist/{skills-86j411Qz.mjs → skills-9ihLaSmM.mjs} +3 -3
- package/dist/{skills-DeWsLMwC.mjs → skills-y2iVfW9k.mjs} +2 -2
- package/dist/snippet-Ce0o33Rj.mjs +19 -0
- package/dist/{stash-BNKlbxtD.mjs → stash-Dj-mnIa4.mjs} +5 -5
- package/dist/{status-B7bwHLkk.mjs → status-B2Xj_q8f.mjs} +3 -3
- package/dist/{status-Bul9El-c.mjs → status-BtWz7Pzn.mjs} +16 -7
- package/dist/{subscription-DPAGevGU.mjs → subscription-Dh--agqE.mjs} +6 -6
- package/dist/{subscriptions-DIRsHcKP.mjs → subscriptions-CJ8Jdp9A.mjs} +6 -6
- package/dist/{summary-CeVt80Kb.mjs → summary-ccbkNDbC.mjs} +3 -3
- package/dist/{sync-schema-B9fLcZoa.mjs → sync-schema-CewUOkmm.mjs} +6 -6
- package/dist/{sync-schema-oDTbhjW1.mjs → sync-schema-HwQectZd.mjs} +5 -5
- package/dist/{sync-task-BAMOf6_t.mjs → sync-task-DEzhiaU9.mjs} +3 -3
- package/dist/{table-BFIOH6Pb.mjs → table-CFZU-BRg.mjs} +2 -2
- package/dist/table-P9ovwcaB.mjs +26 -0
- package/dist/{table-selector-flags-BUR0-n6j.mjs → table-selector-flags-p4jun7-v.mjs} +3 -3
- package/dist/{table-Ci6bhZkb.mjs → table-zAdW5_3H.mjs} +5 -5
- package/dist/{text-CdtEI6l6.mjs → text-C2VwKF9D.mjs} +1 -1
- package/dist/{timeline-uDCmwGFT.mjs → timeline-BgWz8DYK.mjs} +1 -1
- package/dist/timeline-DLaBypse.mjs +21 -0
- package/dist/{timeline-CCSU2qOS.mjs → timeline-DcsCXNUt.mjs} +5 -1
- package/dist/{timeline-event-BY2Hj72e.mjs → timeline-event-xAAR6b-v.mjs} +6 -6
- package/dist/transform-10YE8j5K.mjs +28 -0
- package/dist/{transform-D4z70PIN.mjs → transform-CWGJB8N_.mjs} +1 -1
- package/dist/{transform-job-AaMZRxAq.mjs → transform-job-BBZ5L46v.mjs} +1 -1
- package/dist/{transform-job-CCguL6LP.mjs → transform-job-ClX8e5iO.mjs} +2 -1
- package/dist/transform-job-D97AutnF.mjs +22 -0
- package/dist/{transform-tag-CzjLKILh.mjs → transform-tag-BXusFzMX.mjs} +5 -5
- package/dist/{transform-test-BjjCQ2xm.mjs → transform-test-Bexa_K89.mjs} +5 -1
- package/dist/{transform-test-DHGKeuHa.mjs → transform-test-C49ZTK7M.mjs} +1 -1
- package/dist/transform-test-UsH1udc4.mjs +16 -0
- package/dist/{transforms-0uhBh0H4.mjs → transforms-CqV01bMM.mjs} +5 -5
- package/dist/{transport-BmNrb0Lz.mjs → transport-0qFZhEuP.mjs} +144 -41
- package/dist/{tree-oBEw8hDj.mjs → tree-Td6rgyOa.mjs} +3 -3
- package/dist/{unpublish-BJ9OKN1N.mjs → unpublish-D4XTZsFW.mjs} +3 -3
- package/dist/{unreferenced-D6UyA_Nu.mjs → unreferenced-cR-l4zXN.mjs} +6 -6
- package/dist/{update-7zsDGAWa.mjs → update-BJL5975i.mjs} +6 -6
- package/dist/{update-DGwGjOnH.mjs → update-BqkqMOVN.mjs} +5 -5
- package/dist/{update-CKe2Bwpv.mjs → update-C4iu-vQm.mjs} +6 -6
- package/dist/{update-D9eLVWFQ.mjs → update-C7Wmom6x.mjs} +5 -5
- package/dist/{update-BK_SpSrG.mjs → update-C7dZLbsf.mjs} +4 -4
- package/dist/{update-BZgHTH5P.mjs → update-C8xdeYI2.mjs} +4 -4
- package/dist/{update-BqrZ-8IK.mjs → update-CHB4kvz-.mjs} +8 -8
- package/dist/{update-M7yDPmJ-.mjs → update-CND9At61.mjs} +5 -5
- package/dist/{update-bGDXSnBh.mjs → update-CpwWURTp.mjs} +5 -5
- package/dist/{update-CKJ6Das4.mjs → update-D-cTgmb0.mjs} +6 -6
- package/dist/{update-DKagaJw0.mjs → update-DFK2iUSP.mjs} +6 -6
- package/dist/{update-Cv6IMLyu.mjs → update-DROjGe3Q.mjs} +4 -4
- package/dist/{update-Bdi40RG0.mjs → update-DZHgr6Gu.mjs} +5 -5
- package/dist/{update-CHA4VWKT.mjs → update-Dk0E66Va.mjs} +5 -5
- package/dist/{update-DgmlUn64.mjs → update-DqCZsbLh.mjs} +6 -6
- package/dist/{update-CEhub3Wz.mjs → update-DrVc25R8.mjs} +5 -5
- package/dist/{update-CYQkWLpZ.mjs → update-Js0IiqCq.mjs} +6 -6
- package/dist/{update-DneJLQXe.mjs → update-dQeji6RA.mjs} +7 -7
- package/dist/{update-dashcard-DNsf-gJ1.mjs → update-dashcard-BmkfJ7t9.mjs} +4 -4
- package/dist/{update-CXfLvhmK.mjs → update-nGURR-y6.mjs} +6 -6
- package/dist/{upgrade-BRJH93W0.mjs → upgrade-B6V_1cUh.mjs} +4 -4
- package/dist/{upload-DJB7DMA1.mjs → upload-B6zBzMPW.mjs} +2 -2
- package/dist/{upload-CGz8u2wG.mjs → upload-CfYmBv51.mjs} +3 -3
- package/dist/upload-Dvjfz16M.mjs +13 -0
- package/dist/{uuid-3qmLYgrG.mjs → uuid-B8ynbkqG.mjs} +2 -2
- package/dist/{validate-D_iikPkc.mjs → validate-C7DGkwb-.mjs} +1 -1
- package/dist/{validate-query-DIcK8alR.mjs → validate-query-CYUvRvVM.mjs} +2 -2
- package/dist/{values-Bn2Wcz4t.mjs → values-36bzf9cK.mjs} +3 -3
- package/dist/{verify-CA4PEHlO.mjs → verify-BdW-GExk.mjs} +3 -3
- package/dist/{verify-C2K-zMuQ.mjs → verify-C4Tml4fD.mjs} +3 -3
- package/dist/{verify-CCX2N98Q.mjs → verify-Cs9e28YA.mjs} +4 -4
- package/dist/{wait-DCgCJBqX.mjs → wait-BV6JOdgi.mjs} +6 -6
- package/dist/{wait-flags-aRQHTjwg.mjs → wait-flags-DjyK03cm.mjs} +2 -2
- package/dist/{window-2ybHqui2.mjs → window-CfK_j6m1.mjs} +1 -1
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +11 -5
- package/skill-data/dashboard/SKILL.md +6 -0
- package/skill-data/git-sync/SKILL.md +64 -14
- package/dist/card-P2-4BkXV.mjs +0 -25
- package/dist/collection-BI8Fy9vS.mjs +0 -21
- package/dist/dashboard-C-YJxDam.mjs +0 -35
- package/dist/data-action-DER3EMD7.mjs +0 -24
- package/dist/dependency-v9fHJ-N-.mjs +0 -15
- package/dist/document-CGvUmD9i.mjs +0 -20
- package/dist/field-C9AcBe8x.mjs +0 -21
- package/dist/git-sync-D4R0cHvk.mjs +0 -29
- package/dist/glossary-C6EnoEXg.mjs +0 -14
- package/dist/snippet-C3gamfFK.mjs +0 -19
- package/dist/table-C--k-JXA.mjs +0 -26
- package/dist/timeline-ClMmTycg.mjs +0 -21
- package/dist/transform-BZaNFGeK.mjs +0 -28
- package/dist/transform-job-QMI2qWin.mjs +0 -22
- package/dist/transform-test-B9le1jKH.mjs +0 -16
- package/dist/upload-T5wS1XtL.mjs +0 -13
package/dist/cli.mjs
CHANGED
|
@@ -138,6 +138,9 @@ var AbortError = class extends MetabaseError {
|
|
|
138
138
|
this.name = "AbortError";
|
|
139
139
|
}
|
|
140
140
|
};
|
|
141
|
+
function isNonInterruptFailure(error) {
|
|
142
|
+
return error instanceof MetabaseError && !(error instanceof AbortError);
|
|
143
|
+
}
|
|
141
144
|
var ChainedRequestError = class extends MetabaseError {
|
|
142
145
|
cause;
|
|
143
146
|
constructor(message, cause) {
|
|
@@ -165,6 +168,16 @@ var UnknownError = class extends MetabaseError {
|
|
|
165
168
|
this.developerDetail = input;
|
|
166
169
|
}
|
|
167
170
|
};
|
|
171
|
+
var PartialWriteError = class extends MetabaseError {
|
|
172
|
+
category = "partial-write";
|
|
173
|
+
isRetryable = false;
|
|
174
|
+
developerDetail;
|
|
175
|
+
constructor(message, developerDetail) {
|
|
176
|
+
super(message);
|
|
177
|
+
this.name = "PartialWriteError";
|
|
178
|
+
this.developerDetail = developerDetail;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
168
181
|
function toMetabaseError(error) {
|
|
169
182
|
if (error instanceof MetabaseError) return error;
|
|
170
183
|
if (error instanceof ZodError) return new ConfigError(error.issues.map(formatZodIssue).join("; "));
|
|
@@ -577,7 +590,7 @@ const connectionFlags = {
|
|
|
577
590
|
},
|
|
578
591
|
skipPreflight: {
|
|
579
592
|
type: "boolean",
|
|
580
|
-
description: "Skip the
|
|
593
|
+
description: "Skip the client's version and license checks made before a request, and let the server answer",
|
|
581
594
|
alias: "skip-preflight"
|
|
582
595
|
}
|
|
583
596
|
};
|
|
@@ -623,7 +636,7 @@ function trustSystemCa() {
|
|
|
623
636
|
//#endregion
|
|
624
637
|
//#region package.json
|
|
625
638
|
var name = "@metabase/cli";
|
|
626
|
-
var version = "0.
|
|
639
|
+
var version = "0.5.1";
|
|
627
640
|
var description = "Metabase CLI";
|
|
628
641
|
//#endregion
|
|
629
642
|
//#region src/runtime/command-augment.ts
|
|
@@ -643,40 +656,40 @@ const main = defineCommand({
|
|
|
643
656
|
description
|
|
644
657
|
},
|
|
645
658
|
subCommands: {
|
|
646
|
-
auth: () => import("./auth-
|
|
647
|
-
db: () => import("./db-
|
|
648
|
-
table: () => import("./table-
|
|
649
|
-
field: () => import("./field-
|
|
650
|
-
upload: () => import("./upload-
|
|
651
|
-
"content-translation": () => import("./content-translation-
|
|
652
|
-
card: () => import("./card-
|
|
653
|
-
dashboard: () => import("./dashboard-
|
|
654
|
-
subscription: () => import("./subscription-
|
|
655
|
-
"data-action": () => import("./data-action-
|
|
656
|
-
alert: () => import("./alert-
|
|
657
|
-
collection: () => import("./collection-
|
|
658
|
-
library: () => import("./library-
|
|
659
|
-
document: () => import("./document-
|
|
660
|
-
glossary: () => import("./glossary-
|
|
661
|
-
transform: () => import("./transform-
|
|
662
|
-
"transform-job": () => import("./transform-job-
|
|
663
|
-
"transform-tag": () => import("./transform-tag-
|
|
664
|
-
"transform-test": () => import("./transform-test-
|
|
665
|
-
setting: () => import("./setting-
|
|
666
|
-
search: () => import("./search-
|
|
667
|
-
"git-sync": () => import("./git-sync-
|
|
668
|
-
setup: () => import("./setup-
|
|
669
|
-
snippet: () => import("./snippet-
|
|
670
|
-
segment: () => import("./segment-
|
|
671
|
-
measure: () => import("./measure-
|
|
672
|
-
dependency: () => import("./dependency-
|
|
673
|
-
timeline: () => import("./timeline-
|
|
674
|
-
"timeline-event": () => import("./timeline-event-
|
|
675
|
-
eid: () => import("./eid-
|
|
676
|
-
query: () => import("./query-
|
|
677
|
-
uuid: () => import("./uuid-
|
|
678
|
-
upgrade: () => import("./upgrade-
|
|
679
|
-
skills: () => import("./skills-
|
|
659
|
+
auth: () => import("./auth-BPbsm8yV.mjs").then((mod) => mod.default),
|
|
660
|
+
db: () => import("./db-m5bQcXdn.mjs").then((mod) => mod.default),
|
|
661
|
+
table: () => import("./table-P9ovwcaB.mjs").then((mod) => mod.default),
|
|
662
|
+
field: () => import("./field-DktidTPB.mjs").then((mod) => mod.default),
|
|
663
|
+
upload: () => import("./upload-Dvjfz16M.mjs").then((mod) => mod.default),
|
|
664
|
+
"content-translation": () => import("./content-translation-DoGTQnvH.mjs").then((mod) => mod.default),
|
|
665
|
+
card: () => import("./card-BTBDBsu-.mjs").then((mod) => mod.default),
|
|
666
|
+
dashboard: () => import("./dashboard-BP0p62fp.mjs").then((mod) => mod.default),
|
|
667
|
+
subscription: () => import("./subscription-Dh--agqE.mjs").then((mod) => mod.default),
|
|
668
|
+
"data-action": () => import("./data-action-Cr17CfgE.mjs").then((mod) => mod.default),
|
|
669
|
+
alert: () => import("./alert-DQkF8jYR.mjs").then((mod) => mod.default),
|
|
670
|
+
collection: () => import("./collection-B19phRNU.mjs").then((mod) => mod.default),
|
|
671
|
+
library: () => import("./library-DzejNMqX.mjs").then((mod) => mod.default),
|
|
672
|
+
document: () => import("./document-BaRQ5fBd.mjs").then((mod) => mod.default),
|
|
673
|
+
glossary: () => import("./glossary-BSgRQ2HO.mjs").then((mod) => mod.default),
|
|
674
|
+
transform: () => import("./transform-10YE8j5K.mjs").then((mod) => mod.default),
|
|
675
|
+
"transform-job": () => import("./transform-job-D97AutnF.mjs").then((mod) => mod.default),
|
|
676
|
+
"transform-tag": () => import("./transform-tag-BXusFzMX.mjs").then((mod) => mod.default),
|
|
677
|
+
"transform-test": () => import("./transform-test-UsH1udc4.mjs").then((mod) => mod.default),
|
|
678
|
+
setting: () => import("./setting-CDRusiqP.mjs").then((mod) => mod.default),
|
|
679
|
+
search: () => import("./search-DyC54bGf.mjs").then((mod) => mod.default),
|
|
680
|
+
"git-sync": () => import("./git-sync-BwkWeJAz.mjs").then((mod) => mod.default),
|
|
681
|
+
setup: () => import("./setup-BZaJVww3.mjs").then((mod) => mod.default),
|
|
682
|
+
snippet: () => import("./snippet-Ce0o33Rj.mjs").then((mod) => mod.default),
|
|
683
|
+
segment: () => import("./segment-DeT_Yic6.mjs").then((mod) => mod.default),
|
|
684
|
+
measure: () => import("./measure-CbMgNhlG.mjs").then((mod) => mod.default),
|
|
685
|
+
dependency: () => import("./dependency-BlTYysYG.mjs").then((mod) => mod.default),
|
|
686
|
+
timeline: () => import("./timeline-DLaBypse.mjs").then((mod) => mod.default),
|
|
687
|
+
"timeline-event": () => import("./timeline-event-xAAR6b-v.mjs").then((mod) => mod.default),
|
|
688
|
+
eid: () => import("./eid-CaumGUFD.mjs").then((mod) => mod.default),
|
|
689
|
+
query: () => import("./query-CN3BW5WB.mjs").then((mod) => mod.default),
|
|
690
|
+
uuid: () => import("./uuid-B8ynbkqG.mjs").then((mod) => mod.default),
|
|
691
|
+
upgrade: () => import("./upgrade-B6V_1cUh.mjs").then((mod) => mod.default),
|
|
692
|
+
skills: () => import("./skills-9ihLaSmM.mjs").then((mod) => mod.default)
|
|
680
693
|
}
|
|
681
694
|
});
|
|
682
695
|
setMetabaseAugment(main, {
|
|
@@ -694,6 +707,554 @@ setMetabaseAugment(main, {
|
|
|
694
707
|
requires: null
|
|
695
708
|
});
|
|
696
709
|
//#endregion
|
|
710
|
+
//#region ../client/src/json.ts
|
|
711
|
+
const JSON_CONTENT_TYPE = "application/json";
|
|
712
|
+
function parseJson(input, schema, opts = {}) {
|
|
713
|
+
const result = parseJsonResult(input, schema, opts);
|
|
714
|
+
if (!result.ok) throw result.error;
|
|
715
|
+
return result.value;
|
|
716
|
+
}
|
|
717
|
+
function parseJsonResult(input, schema, opts = {}) {
|
|
718
|
+
const sourcePrefix = opts.source === void 0 ? "" : `${opts.source}: `;
|
|
719
|
+
let raw;
|
|
720
|
+
try {
|
|
721
|
+
raw = JSON.parse(input);
|
|
722
|
+
} catch (error) {
|
|
723
|
+
return {
|
|
724
|
+
ok: false,
|
|
725
|
+
error: new ConfigError(`${sourcePrefix}invalid JSON: ${errorMessage(error)}`)
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
const parsed = schema.safeParse(raw);
|
|
729
|
+
if (!parsed.success) return {
|
|
730
|
+
ok: false,
|
|
731
|
+
error: new ValidationError(`${sourcePrefix}value did not match expected schema`, {
|
|
732
|
+
source: opts.source ?? "<input>",
|
|
733
|
+
zodIssues: parsed.error.issues
|
|
734
|
+
})
|
|
735
|
+
};
|
|
736
|
+
return {
|
|
737
|
+
ok: true,
|
|
738
|
+
value: parsed.data
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
function parseJsonOrPlain(text, contentType, schema, opts = {}) {
|
|
742
|
+
if (!isJsonContentType(contentType)) return parseJson(JSON.stringify(text), schema, opts);
|
|
743
|
+
const attempt = parseJsonResult(text, schema, opts);
|
|
744
|
+
if (attempt.ok) return attempt.value;
|
|
745
|
+
if (attempt.error instanceof ValidationError) throw attempt.error;
|
|
746
|
+
return parseJson(JSON.stringify(text), schema, opts);
|
|
747
|
+
}
|
|
748
|
+
function isJsonContentType(contentType) {
|
|
749
|
+
return contentType !== null && contentType.includes("application/json");
|
|
750
|
+
}
|
|
751
|
+
//#endregion
|
|
752
|
+
//#region ../client/src/predicates.ts
|
|
753
|
+
function isPlainObject(value) {
|
|
754
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
755
|
+
}
|
|
756
|
+
const JAVA_WHITESPACE = " \n\v\f\r \u2028\u2029 ";
|
|
757
|
+
const UNICODE_ESCAPE_DIGITS = 4;
|
|
758
|
+
function unicodeEscape(char) {
|
|
759
|
+
return `\\u${char.charCodeAt(0).toString(16).padStart(UNICODE_ESCAPE_DIGITS, "0")}`;
|
|
760
|
+
}
|
|
761
|
+
const JAVA_WHITESPACE_ESCAPED = [...JAVA_WHITESPACE].map(unicodeEscape).join("");
|
|
762
|
+
/** Matches a string Metabase reads as not blank: one holding a character that is not Java whitespace. */
|
|
763
|
+
const NOT_BLANK = new RegExp(`[^${JAVA_WHITESPACE_ESCAPED}]`);
|
|
764
|
+
/** Whether Metabase reads `value` as blank: empty, or Java whitespace only. */
|
|
765
|
+
function isBlank(value) {
|
|
766
|
+
return !NOT_BLANK.test(value);
|
|
767
|
+
}
|
|
768
|
+
//#endregion
|
|
769
|
+
//#region ../client/src/http/sanitize.ts
|
|
770
|
+
const SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
771
|
+
"authorization",
|
|
772
|
+
"x-api-key",
|
|
773
|
+
"x-metabase-session",
|
|
774
|
+
"cookie",
|
|
775
|
+
"set-cookie",
|
|
776
|
+
"proxy-authorization"
|
|
777
|
+
]);
|
|
778
|
+
const REDACTED = "[REDACTED]";
|
|
779
|
+
function redactHeaders(headers) {
|
|
780
|
+
const result = {};
|
|
781
|
+
const entries = headers instanceof Headers ? headers.entries() : Object.entries(headers);
|
|
782
|
+
for (const [key, value] of entries) result[key] = SECRET_HEADER_NAMES.has(key.toLowerCase()) ? REDACTED : value;
|
|
783
|
+
return result;
|
|
784
|
+
}
|
|
785
|
+
function redactBody(body, ctx) {
|
|
786
|
+
let result = body;
|
|
787
|
+
for (const secret of ctx.knownSecrets) {
|
|
788
|
+
if (secret.length === 0) continue;
|
|
789
|
+
result = result.replaceAll(secret, REDACTED);
|
|
790
|
+
}
|
|
791
|
+
return result;
|
|
792
|
+
}
|
|
793
|
+
const SERVER_ERROR_STATUSES_START = 500;
|
|
794
|
+
const SERVER_ERROR_STATUSES_END = 600;
|
|
795
|
+
const TEXT_CONTENT_TYPE = "text/plain";
|
|
796
|
+
const ROUTE_MISSING_LITERAL = "API endpoint does not exist.";
|
|
797
|
+
const RESOURCE_MISSING_LITERAL = "Not found.";
|
|
798
|
+
const STATUS_CLASSIFICATIONS = {
|
|
799
|
+
401: { retryable: false },
|
|
800
|
+
403: {
|
|
801
|
+
retryable: false,
|
|
802
|
+
message: "The request was refused (403): the signed-in user is not allowed to do this."
|
|
803
|
+
},
|
|
804
|
+
404: { retryable: false },
|
|
805
|
+
409: {
|
|
806
|
+
retryable: false,
|
|
807
|
+
message: "The request was refused (409): it conflicts with what already exists."
|
|
808
|
+
},
|
|
809
|
+
408: {
|
|
810
|
+
retryable: true,
|
|
811
|
+
message: "Metabase timed out responding."
|
|
812
|
+
},
|
|
813
|
+
425: { retryable: true },
|
|
814
|
+
429: {
|
|
815
|
+
retryable: true,
|
|
816
|
+
message: "Metabase rate-limited the request."
|
|
817
|
+
},
|
|
818
|
+
500: { retryable: true },
|
|
819
|
+
502: { retryable: true },
|
|
820
|
+
503: { retryable: true },
|
|
821
|
+
504: {
|
|
822
|
+
retryable: true,
|
|
823
|
+
message: "Metabase timed out responding."
|
|
824
|
+
}
|
|
825
|
+
};
|
|
826
|
+
const ErrorEnvelope = z.object({
|
|
827
|
+
message: z.string().optional(),
|
|
828
|
+
error: z.string().optional(),
|
|
829
|
+
"error-message": z.string().optional(),
|
|
830
|
+
via: z.array(z.object({ message: z.string().optional() }).loose()).optional(),
|
|
831
|
+
"specific-errors": z.unknown().optional(),
|
|
832
|
+
errors: z.unknown().optional(),
|
|
833
|
+
"error-code": z.string().optional(),
|
|
834
|
+
"non-remote-synced-models": z.unknown().optional(),
|
|
835
|
+
"remote-synced-models": z.unknown().optional()
|
|
836
|
+
}).loose();
|
|
837
|
+
const NonRemoteSyncedDependencies = z.array(z.number().int()).min(1);
|
|
838
|
+
const RemoteSyncedDependent = z.record(z.string(), z.number().int());
|
|
839
|
+
const RemoteSyncedDependents = z.array(RemoteSyncedDependent).min(1);
|
|
840
|
+
const MAX_LISTED_REMOTE_SYNC_ENTRIES = 20;
|
|
841
|
+
const REMOTE_SYNC_ENTRY_SEPARATOR = ", ";
|
|
842
|
+
const NON_REMOTE_SYNCED_REMEDY = "Move that content into a synced collection first, or move the collection that holds it.";
|
|
843
|
+
const REMOTE_SYNCED_REMEDY = "Update that content so it no longer uses this first, or move it out of sync along with this.";
|
|
844
|
+
const FieldErrorNodeSchema = z.lazy(() => z.union([
|
|
845
|
+
z.string(),
|
|
846
|
+
z.array(z.string()),
|
|
847
|
+
z.record(z.string(), FieldErrorNodeSchema)
|
|
848
|
+
]));
|
|
849
|
+
const FieldErrorTree = z.record(z.string(), FieldErrorNodeSchema);
|
|
850
|
+
const FIELD_MESSAGE_SEPARATOR = "; ";
|
|
851
|
+
const MAX_EXTRACTED_MESSAGE_LEN = 500;
|
|
852
|
+
const ELLIPSIS = "…";
|
|
853
|
+
const GOT_VALUE_PATTERN = /got: ((?:[^"\\]|\\.)*)/g;
|
|
854
|
+
const MAX_GOT_VALUE_LEN = 60;
|
|
855
|
+
var HttpError = class extends MetabaseError {
|
|
856
|
+
category = "http";
|
|
857
|
+
status;
|
|
858
|
+
kind;
|
|
859
|
+
serverMessage;
|
|
860
|
+
developerDetail;
|
|
861
|
+
constructor(input) {
|
|
862
|
+
const sanitizedBody = sanitizeBody(input.rawBody, input.redactionContext);
|
|
863
|
+
const redactedHeaders = redactHeaders(input.responseHeaders);
|
|
864
|
+
const kind = classifyKind(input.status, sanitizedBody, redactedHeaders);
|
|
865
|
+
const said = {
|
|
866
|
+
envelope: parseEnvelopeMessage(sanitizedBody),
|
|
867
|
+
text: plainTextMessage(sanitizedBody, redactedHeaders)
|
|
868
|
+
};
|
|
869
|
+
super(input.overrideUserMessage ?? buildUserMessage(kind, input, said));
|
|
870
|
+
const fields = extractEnvelopeViews(sanitizedBody);
|
|
871
|
+
this.name = "HttpError";
|
|
872
|
+
this.status = input.status;
|
|
873
|
+
this.kind = kind;
|
|
874
|
+
this.serverMessage = said.envelope ?? said.text;
|
|
875
|
+
this.developerDetail = {
|
|
876
|
+
status: input.status,
|
|
877
|
+
statusText: input.statusText,
|
|
878
|
+
method: input.method,
|
|
879
|
+
url: input.url,
|
|
880
|
+
responseHeaders: redactedHeaders,
|
|
881
|
+
body: sanitizedBody,
|
|
882
|
+
fieldErrors: fields.fieldErrors,
|
|
883
|
+
specificFieldErrors: fields.specificFieldErrors,
|
|
884
|
+
errorCode: fields.errorCode,
|
|
885
|
+
nonRemoteSyncedDependencies: fields.nonRemoteSyncedDependencies,
|
|
886
|
+
remoteSyncedDependents: fields.remoteSyncedDependents
|
|
887
|
+
};
|
|
888
|
+
}
|
|
889
|
+
get isRetryable() {
|
|
890
|
+
return isRetryableStatus(this.status);
|
|
891
|
+
}
|
|
892
|
+
get fieldErrors() {
|
|
893
|
+
return this.developerDetail.fieldErrors;
|
|
894
|
+
}
|
|
895
|
+
get specificFieldErrors() {
|
|
896
|
+
return this.developerDetail.specificFieldErrors;
|
|
897
|
+
}
|
|
898
|
+
get errorCode() {
|
|
899
|
+
return this.developerDetail.errorCode;
|
|
900
|
+
}
|
|
901
|
+
get nonRemoteSyncedDependencies() {
|
|
902
|
+
return this.developerDetail.nonRemoteSyncedDependencies;
|
|
903
|
+
}
|
|
904
|
+
get remoteSyncedDependents() {
|
|
905
|
+
return this.developerDetail.remoteSyncedDependents;
|
|
906
|
+
}
|
|
907
|
+
};
|
|
908
|
+
function chainRequestFailure(cause, message) {
|
|
909
|
+
if (cause instanceof HttpError) return new HttpError({
|
|
910
|
+
status: cause.status,
|
|
911
|
+
statusText: cause.developerDetail.statusText,
|
|
912
|
+
method: cause.developerDetail.method,
|
|
913
|
+
url: cause.developerDetail.url,
|
|
914
|
+
responseHeaders: cause.developerDetail.responseHeaders,
|
|
915
|
+
rawBody: cause.developerDetail.body,
|
|
916
|
+
overrideUserMessage: message
|
|
917
|
+
});
|
|
918
|
+
return new ChainedRequestError(message, cause);
|
|
919
|
+
}
|
|
920
|
+
function isRetryableStatus(status) {
|
|
921
|
+
return STATUS_CLASSIFICATIONS[status]?.retryable === true;
|
|
922
|
+
}
|
|
923
|
+
function sanitizeBody(rawBody, ctx) {
|
|
924
|
+
if (rawBody === null) return null;
|
|
925
|
+
if (ctx === void 0) return rawBody;
|
|
926
|
+
return redactBody(rawBody, ctx);
|
|
927
|
+
}
|
|
928
|
+
function classifyKind(status, sanitizedBody, redactedHeaders) {
|
|
929
|
+
if (status === 401) return "auth";
|
|
930
|
+
if (status === 403) return "forbidden";
|
|
931
|
+
if (status === 409) return "conflict";
|
|
932
|
+
if (status === 404) return isRouteMissingResponse(sanitizedBody, redactedHeaders) ? "route-missing" : "resource-missing";
|
|
933
|
+
if (status === 429) return "rate-limit";
|
|
934
|
+
if (status >= SERVER_ERROR_STATUSES_START && status < SERVER_ERROR_STATUSES_END) return "server-error";
|
|
935
|
+
return "generic";
|
|
936
|
+
}
|
|
937
|
+
function isRouteMissingResponse(sanitizedBody, redactedHeaders) {
|
|
938
|
+
if (sanitizedBody?.includes(ROUTE_MISSING_LITERAL)) return true;
|
|
939
|
+
if (sanitizedBody?.includes(RESOURCE_MISSING_LITERAL)) return false;
|
|
940
|
+
if (redactedHeaders["content-type"]?.includes("application/json")) return false;
|
|
941
|
+
if (sanitizedBody === null || sanitizedBody.trim() === "") return true;
|
|
942
|
+
return parseEnvelope(sanitizedBody) === null;
|
|
943
|
+
}
|
|
944
|
+
function buildUserMessage(kind, input, said) {
|
|
945
|
+
if (kind === "route-missing") return buildRouteMissingMessage(input);
|
|
946
|
+
if (kind === "resource-missing") return `Not found: ${input.method} ${pathFromUrl(input.url)}.`;
|
|
947
|
+
if (said.envelope !== null) return said.envelope;
|
|
948
|
+
if (kind === "auth") return `Invalid or unauthorized API key (host: ${hostFromUrl(input.url)}).`;
|
|
949
|
+
if (said.text !== null) return said.text;
|
|
950
|
+
return defaultMessageForStatus(input.status);
|
|
951
|
+
}
|
|
952
|
+
function plainTextMessage(sanitizedBody, redactedHeaders) {
|
|
953
|
+
if (sanitizedBody === null || !redactedHeaders["content-type"]?.includes(TEXT_CONTENT_TYPE)) return null;
|
|
954
|
+
const trimmed = sanitizedBody.trim();
|
|
955
|
+
return trimmed === "" ? null : condenseMessage(trimmed);
|
|
956
|
+
}
|
|
957
|
+
function buildRouteMissingMessage(input) {
|
|
958
|
+
const path = pathFromUrl(input.url);
|
|
959
|
+
if (!input.serverTag) return `This endpoint is not available on the connected Metabase: ${input.method} ${path}.`;
|
|
960
|
+
return `This endpoint is not available on Metabase ${input.serverTag}: ${input.method} ${path}. It may require a newer Metabase major version.`;
|
|
961
|
+
}
|
|
962
|
+
function pathFromUrl(url) {
|
|
963
|
+
const parsed = new URL(url);
|
|
964
|
+
return parsed.pathname + parsed.search;
|
|
965
|
+
}
|
|
966
|
+
function hostFromUrl(url) {
|
|
967
|
+
return new URL(url).host;
|
|
968
|
+
}
|
|
969
|
+
function parseEnvelope(sanitizedBody) {
|
|
970
|
+
if (!sanitizedBody) return null;
|
|
971
|
+
const result = parseJsonResult(sanitizedBody, ErrorEnvelope);
|
|
972
|
+
return result.ok ? result.value : null;
|
|
973
|
+
}
|
|
974
|
+
const NO_ENVELOPE_VIEWS = {
|
|
975
|
+
fieldErrors: null,
|
|
976
|
+
specificFieldErrors: null,
|
|
977
|
+
errorCode: null,
|
|
978
|
+
nonRemoteSyncedDependencies: null,
|
|
979
|
+
remoteSyncedDependents: null
|
|
980
|
+
};
|
|
981
|
+
function extractEnvelopeViews(sanitizedBody) {
|
|
982
|
+
const envelope = parseEnvelope(sanitizedBody);
|
|
983
|
+
if (envelope === null) return NO_ENVELOPE_VIEWS;
|
|
984
|
+
return {
|
|
985
|
+
fieldErrors: parseFieldErrors(envelope.errors),
|
|
986
|
+
specificFieldErrors: parseFieldErrors(envelope["specific-errors"]),
|
|
987
|
+
errorCode: envelope["error-code"] ?? null,
|
|
988
|
+
nonRemoteSyncedDependencies: parseOrNull(NonRemoteSyncedDependencies, envelope["non-remote-synced-models"]),
|
|
989
|
+
remoteSyncedDependents: parseOrNull(RemoteSyncedDependents, envelope["remote-synced-models"])
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
function parseOrNull(schema, value) {
|
|
993
|
+
const parsed = schema.safeParse(value);
|
|
994
|
+
return parsed.success ? parsed.data : null;
|
|
995
|
+
}
|
|
996
|
+
function parseFieldErrors(value) {
|
|
997
|
+
const parsed = FieldErrorTree.safeParse(value);
|
|
998
|
+
if (!parsed.success) return null;
|
|
999
|
+
const entries = collectLeafEntries(parsed.data, []);
|
|
1000
|
+
if (entries.length === 0) return null;
|
|
1001
|
+
return Object.fromEntries(entries.map((entry) => [entry.path, entry.message]));
|
|
1002
|
+
}
|
|
1003
|
+
function parseEnvelopeMessage(sanitizedBody) {
|
|
1004
|
+
const envelope = parseEnvelope(sanitizedBody);
|
|
1005
|
+
if (envelope === null) return null;
|
|
1006
|
+
const topLevel = envelope.message ?? envelope.error ?? envelope["error-message"];
|
|
1007
|
+
if (topLevel) return appendRemoteSyncConflict(condenseMessage(topLevel), envelope);
|
|
1008
|
+
const viaMessage = envelope.via?.find((entry) => entry.message)?.message;
|
|
1009
|
+
if (viaMessage) return condenseMessage(viaMessage);
|
|
1010
|
+
const specific = formatErrorTree(envelope["specific-errors"]);
|
|
1011
|
+
if (specific) return condenseMessage(specific);
|
|
1012
|
+
const generic = formatErrorTree(envelope.errors);
|
|
1013
|
+
if (generic) return condenseMessage(generic);
|
|
1014
|
+
return null;
|
|
1015
|
+
}
|
|
1016
|
+
function appendRemoteSyncConflict(message, envelope) {
|
|
1017
|
+
const dependencies = parseOrNull(NonRemoteSyncedDependencies, envelope["non-remote-synced-models"]);
|
|
1018
|
+
if (dependencies !== null) {
|
|
1019
|
+
const ids = listRemoteSyncEntries(dependencies.map(String));
|
|
1020
|
+
return `${withoutTrailingPeriod(message)}: ids ${ids}. ${NON_REMOTE_SYNCED_REMEDY}`;
|
|
1021
|
+
}
|
|
1022
|
+
const dependents = parseOrNull(RemoteSyncedDependents, envelope["remote-synced-models"]);
|
|
1023
|
+
if (dependents !== null) {
|
|
1024
|
+
const named = listRemoteSyncEntries([...new Set(dependents.map(formatRemoteSyncedDependent))]);
|
|
1025
|
+
return `${withoutTrailingPeriod(message)}: ${named}. ${REMOTE_SYNCED_REMEDY}`;
|
|
1026
|
+
}
|
|
1027
|
+
return message;
|
|
1028
|
+
}
|
|
1029
|
+
function formatRemoteSyncedDependent(dependent) {
|
|
1030
|
+
return Object.entries(dependent).map(([model, id]) => `${model} ${id}`).join(" / ");
|
|
1031
|
+
}
|
|
1032
|
+
function listRemoteSyncEntries(entries) {
|
|
1033
|
+
const listed = entries.slice(0, MAX_LISTED_REMOTE_SYNC_ENTRIES).join(REMOTE_SYNC_ENTRY_SEPARATOR);
|
|
1034
|
+
const unlisted = entries.length - MAX_LISTED_REMOTE_SYNC_ENTRIES;
|
|
1035
|
+
return unlisted > 0 ? `${listed}${REMOTE_SYNC_ENTRY_SEPARATOR}and ${unlisted} more` : listed;
|
|
1036
|
+
}
|
|
1037
|
+
function withoutTrailingPeriod(message) {
|
|
1038
|
+
return message.endsWith(".") ? message.slice(0, -1) : message;
|
|
1039
|
+
}
|
|
1040
|
+
function formatErrorTree(value) {
|
|
1041
|
+
const entries = collectLeafEntries(value, []);
|
|
1042
|
+
if (entries.length === 0) return null;
|
|
1043
|
+
return entries.map(formatLeafEntry).join(FIELD_MESSAGE_SEPARATOR);
|
|
1044
|
+
}
|
|
1045
|
+
function formatLeafEntry(entry) {
|
|
1046
|
+
return entry.path === "" ? entry.message : `${entry.path}: ${entry.message}`;
|
|
1047
|
+
}
|
|
1048
|
+
function collectLeafEntries(value, path) {
|
|
1049
|
+
if (typeof value === "string") {
|
|
1050
|
+
const trimmed = value.trim();
|
|
1051
|
+
return trimmed === "" ? [] : [{
|
|
1052
|
+
path: path.join("."),
|
|
1053
|
+
message: trimmed
|
|
1054
|
+
}];
|
|
1055
|
+
}
|
|
1056
|
+
if (Array.isArray(value)) {
|
|
1057
|
+
const messages = value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
|
|
1058
|
+
if (messages.length === 0) return [];
|
|
1059
|
+
return [{
|
|
1060
|
+
path: path.join("."),
|
|
1061
|
+
message: messages.join(FIELD_MESSAGE_SEPARATOR)
|
|
1062
|
+
}];
|
|
1063
|
+
}
|
|
1064
|
+
if (isPlainObject(value)) return Object.entries(value).flatMap(([key, child]) => collectLeafEntries(child, [...path, key]));
|
|
1065
|
+
return [];
|
|
1066
|
+
}
|
|
1067
|
+
function condenseMessage(message) {
|
|
1068
|
+
const trimmed = message.replace(GOT_VALUE_PATTERN, trimGotValue);
|
|
1069
|
+
if (trimmed.length <= MAX_EXTRACTED_MESSAGE_LEN) return trimmed;
|
|
1070
|
+
return trimmed.slice(0, MAX_EXTRACTED_MESSAGE_LEN - 1) + ELLIPSIS;
|
|
1071
|
+
}
|
|
1072
|
+
function trimGotValue(match, value) {
|
|
1073
|
+
if (value.length <= MAX_GOT_VALUE_LEN) return match;
|
|
1074
|
+
return `got: ${value.slice(0, MAX_GOT_VALUE_LEN)}${ELLIPSIS}`;
|
|
1075
|
+
}
|
|
1076
|
+
function defaultMessageForStatus(status) {
|
|
1077
|
+
return STATUS_CLASSIFICATIONS[status]?.message ?? `Metabase returned ${status}.`;
|
|
1078
|
+
}
|
|
1079
|
+
//#endregion
|
|
1080
|
+
//#region ../client/src/version/features.ts
|
|
1081
|
+
const FEATURE_RULES = {
|
|
1082
|
+
dataActionCollections: { since: 65 },
|
|
1083
|
+
dataActionsWithoutModel: { since: 65 },
|
|
1084
|
+
transforms: { since: 59 },
|
|
1085
|
+
transformJobActivation: { since: 61 },
|
|
1086
|
+
measures: { since: 59 },
|
|
1087
|
+
library: {
|
|
1088
|
+
since: 59,
|
|
1089
|
+
tokenFeature: "library"
|
|
1090
|
+
},
|
|
1091
|
+
libraryDashboards: { since: 65 },
|
|
1092
|
+
remoteSync: {
|
|
1093
|
+
since: 58,
|
|
1094
|
+
tokenFeature: "remote_sync"
|
|
1095
|
+
},
|
|
1096
|
+
remoteSyncRemoteChanges: {
|
|
1097
|
+
since: 59,
|
|
1098
|
+
tokenFeature: "remote_sync"
|
|
1099
|
+
},
|
|
1100
|
+
remoteSyncCollectionsOnlyUpdate: { since: 60 },
|
|
1101
|
+
remoteSyncExportPreflight: {
|
|
1102
|
+
since: 63,
|
|
1103
|
+
tokenFeature: "remote_sync"
|
|
1104
|
+
},
|
|
1105
|
+
remoteSyncBranchGuard: { since: 63 },
|
|
1106
|
+
remoteSyncMerge: {
|
|
1107
|
+
since: 63,
|
|
1108
|
+
tokenFeature: "remote_sync"
|
|
1109
|
+
},
|
|
1110
|
+
contentTranslation: {
|
|
1111
|
+
since: 58,
|
|
1112
|
+
tokenFeature: "content_translation"
|
|
1113
|
+
},
|
|
1114
|
+
contentVerification: {
|
|
1115
|
+
since: 58,
|
|
1116
|
+
tokenFeature: "content_verification"
|
|
1117
|
+
},
|
|
1118
|
+
transformTargetTableId: { since: 61 },
|
|
1119
|
+
transformTargetTableLinkedOnCreate: {
|
|
1120
|
+
since: 61,
|
|
1121
|
+
until: 61
|
|
1122
|
+
},
|
|
1123
|
+
transformJobRunIdIsNumeric: { since: 64 },
|
|
1124
|
+
transformCheckpointReset: { since: 60 },
|
|
1125
|
+
fieldDataSensitivity: { since: 64 },
|
|
1126
|
+
fieldRemappingAppendsDisplayColumns: {
|
|
1127
|
+
since: 58,
|
|
1128
|
+
until: 59
|
|
1129
|
+
},
|
|
1130
|
+
transformDagRuns: { since: 64 },
|
|
1131
|
+
unifiedTransformRuns: { since: 64 },
|
|
1132
|
+
transformTests: {
|
|
1133
|
+
since: 65,
|
|
1134
|
+
tokenFeature: "transforms-testing"
|
|
1135
|
+
},
|
|
1136
|
+
libraryChildrenCarryType: { since: 62 },
|
|
1137
|
+
collectionItemsTotalOnEmptyPage: { since: 64 },
|
|
1138
|
+
invalidMbqlIsBadRequest: { since: 59 },
|
|
1139
|
+
boxplotDisplay: { since: 59 },
|
|
1140
|
+
nativeTableTemplateTag: { since: 59 },
|
|
1141
|
+
smartLinkMeasureModel: { since: 60 },
|
|
1142
|
+
dashboardSubscriptionFilters: {
|
|
1143
|
+
since: 58,
|
|
1144
|
+
tokenFeature: "dashboard_subscription_filters"
|
|
1145
|
+
},
|
|
1146
|
+
dependencyGraph: {
|
|
1147
|
+
since: 58,
|
|
1148
|
+
tokenFeature: "dependencies"
|
|
1149
|
+
},
|
|
1150
|
+
dependencyItemListings: {
|
|
1151
|
+
since: 59,
|
|
1152
|
+
tokenFeature: "dependencies"
|
|
1153
|
+
},
|
|
1154
|
+
dependencyAsyncBackfill: {
|
|
1155
|
+
since: 60,
|
|
1156
|
+
tokenFeature: "dependencies"
|
|
1157
|
+
},
|
|
1158
|
+
measureDependencyGraph: { since: 59 },
|
|
1159
|
+
tableListAccessFilters: { since: 59 },
|
|
1160
|
+
tableListTransformTargets: { since: 60 },
|
|
1161
|
+
tableListPublishedFilter: { since: 63 },
|
|
1162
|
+
tableUnusedFilter: {
|
|
1163
|
+
since: 58,
|
|
1164
|
+
tokenFeature: "dependencies"
|
|
1165
|
+
},
|
|
1166
|
+
tableDataLayerTiers: { since: 59 },
|
|
1167
|
+
bulkTableEdit: { since: 59 },
|
|
1168
|
+
tableUserValueWithdrawal: { since: 64 },
|
|
1169
|
+
bulkTableSync: { since: 59 },
|
|
1170
|
+
erd: {
|
|
1171
|
+
since: 62,
|
|
1172
|
+
tokenFeature: "schema-viewer"
|
|
1173
|
+
},
|
|
1174
|
+
documentCopy: { since: 59 },
|
|
1175
|
+
transformInspector: {
|
|
1176
|
+
since: 60,
|
|
1177
|
+
tokenFeature: "transforms-python"
|
|
1178
|
+
},
|
|
1179
|
+
pythonLibrary: {
|
|
1180
|
+
since: 58,
|
|
1181
|
+
tokenFeature: "transforms-python"
|
|
1182
|
+
},
|
|
1183
|
+
pythonTestRun: {
|
|
1184
|
+
since: 60,
|
|
1185
|
+
tokenFeature: "transforms-python"
|
|
1186
|
+
},
|
|
1187
|
+
sourceReplacement: {
|
|
1188
|
+
since: 60,
|
|
1189
|
+
tokenFeature: "dependencies"
|
|
1190
|
+
},
|
|
1191
|
+
metricDefinitionQuery: { since: 60 },
|
|
1192
|
+
metricDimensionListing: { since: 64 },
|
|
1193
|
+
oauthFullAccessScopeUnadvertised: { since: 64 },
|
|
1194
|
+
exportCsvByteOrderMark: { since: 63 }
|
|
1195
|
+
};
|
|
1196
|
+
function isFeatureName(name) {
|
|
1197
|
+
return Object.hasOwn(FEATURE_RULES, name);
|
|
1198
|
+
}
|
|
1199
|
+
const FEATURE_NAMES = Object.keys(FEATURE_RULES).filter(isFeatureName);
|
|
1200
|
+
const Features = z.record(z.enum(FEATURE_NAMES), z.boolean());
|
|
1201
|
+
function evaluateFeatures(major, tokenFeatures) {
|
|
1202
|
+
const entries = FEATURE_NAMES.map((name) => [name, ruleHolds(FEATURE_RULES[name], major, tokenFeatures)]);
|
|
1203
|
+
return Features.parse(Object.fromEntries(entries));
|
|
1204
|
+
}
|
|
1205
|
+
function ruleHolds(rule, major, tokenFeatures) {
|
|
1206
|
+
return ruleGap(rule, major, tokenFeatures) === null;
|
|
1207
|
+
}
|
|
1208
|
+
function ruleGap(rule, major, tokenFeatures) {
|
|
1209
|
+
if (!versionHolds(rule, major)) return { kind: "version" };
|
|
1210
|
+
if (rule.tokenFeature === void 0) return null;
|
|
1211
|
+
return tokenFeatures !== null && tokenFeatures[rule.tokenFeature] === true ? null : {
|
|
1212
|
+
kind: "token",
|
|
1213
|
+
tokenFeature: rule.tokenFeature
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
function versionHolds(rule, major) {
|
|
1217
|
+
if (major === "development") return rule.until === void 0;
|
|
1218
|
+
return major >= rule.since && (rule.until === void 0 || major <= rule.until);
|
|
1219
|
+
}
|
|
1220
|
+
//#endregion
|
|
1221
|
+
//#region ../client/src/version/capability-error.ts
|
|
1222
|
+
const RequirementReason = z.enum([
|
|
1223
|
+
"version-too-old",
|
|
1224
|
+
"missing-token-feature",
|
|
1225
|
+
"superseded-by-feature"
|
|
1226
|
+
]);
|
|
1227
|
+
const RequirementFailure = z.object({
|
|
1228
|
+
reason: RequirementReason,
|
|
1229
|
+
detail: z.string(),
|
|
1230
|
+
feature: z.enum(FEATURE_NAMES),
|
|
1231
|
+
since: z.number().int(),
|
|
1232
|
+
tokenFeature: z.string().nullable(),
|
|
1233
|
+
serverVersion: z.string()
|
|
1234
|
+
});
|
|
1235
|
+
function versionTooOldMessage(since, serverVersion) {
|
|
1236
|
+
return `This operation requires Metabase v${since}+ (this server is ${serverVersion}). Upgrade Metabase to use it.`;
|
|
1237
|
+
}
|
|
1238
|
+
function missingTokenFeatureMessage(tokenFeature) {
|
|
1239
|
+
return `This operation requires the '${tokenFeature}' premium feature (not enabled on this server).`;
|
|
1240
|
+
}
|
|
1241
|
+
var CapabilityError = class extends MetabaseError {
|
|
1242
|
+
category = "capability";
|
|
1243
|
+
isRetryable = false;
|
|
1244
|
+
developerDetail;
|
|
1245
|
+
constructor(failure, refusal = null) {
|
|
1246
|
+
super(capabilityMessage(failure, refusal), refusal === null ? void 0 : { cause: refusal });
|
|
1247
|
+
this.name = "CapabilityError";
|
|
1248
|
+
this.developerDetail = failure;
|
|
1249
|
+
}
|
|
1250
|
+
};
|
|
1251
|
+
function capabilityMessage(failure, refusal) {
|
|
1252
|
+
if (refusal === null || refusal.status !== 400) return failure.detail;
|
|
1253
|
+
const said = refusal.serverMessage;
|
|
1254
|
+
if (said === null) return failure.detail;
|
|
1255
|
+
return `${failure.detail}\nMetabase answered ${refusal.status}: ${said}`;
|
|
1256
|
+
}
|
|
1257
|
+
//#endregion
|
|
697
1258
|
//#region src/core/profile-refreshed-error.ts
|
|
698
1259
|
var ProfileRefreshedError = class extends MetabaseError {
|
|
699
1260
|
category;
|
|
@@ -743,6 +1304,17 @@ function legacyEnvWarning(canonical) {
|
|
|
743
1304
|
function warn(message) {
|
|
744
1305
|
process.stderr.write(message + "\n");
|
|
745
1306
|
}
|
|
1307
|
+
const PREFLIGHT_RISK = "may ignore or rewrite what it does not support and answer without saying so";
|
|
1308
|
+
const PREFLIGHT_SKIP_REMEDY = `If this server does support it, rerun with --skip-preflight; a server without it ${PREFLIGHT_RISK}.`;
|
|
1309
|
+
function preflightSkippedNotice(refusal) {
|
|
1310
|
+
return `Skipped preflight: ${withoutFinalPeriod(refusal)}. A server without it ${PREFLIGHT_RISK}.`;
|
|
1311
|
+
}
|
|
1312
|
+
function preflightUncheckedNotice(reason) {
|
|
1313
|
+
return `Skipped preflight: could not check the server (${withoutFinalPeriod(reason)}), so the request went out unchecked. A server without a feature it needs ${PREFLIGHT_RISK}.`;
|
|
1314
|
+
}
|
|
1315
|
+
function withoutFinalPeriod(text) {
|
|
1316
|
+
return text.endsWith(".") ? text.slice(0, -1) : text;
|
|
1317
|
+
}
|
|
746
1318
|
const LIST_TRUNCATION_REMEDY = "narrow the selection or raise --max-bytes";
|
|
747
1319
|
function listTruncationNotice(bytes, nextOffset, hint) {
|
|
748
1320
|
return `… cut at ${bytes} bytes; ${typeof nextOffset === "number" ? `continue with --offset ${nextOffset}, ` : ""}${hint ?? LIST_TRUNCATION_REMEDY}`;
|
|
@@ -845,23 +1417,6 @@ function jsonByteLength(value) {
|
|
|
845
1417
|
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
846
1418
|
}
|
|
847
1419
|
//#endregion
|
|
848
|
-
//#region ../client/src/predicates.ts
|
|
849
|
-
function isPlainObject(value) {
|
|
850
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
851
|
-
}
|
|
852
|
-
const JAVA_WHITESPACE = " \n\v\f\r \u2028\u2029 ";
|
|
853
|
-
const UNICODE_ESCAPE_DIGITS = 4;
|
|
854
|
-
function unicodeEscape(char) {
|
|
855
|
-
return `\\u${char.charCodeAt(0).toString(16).padStart(UNICODE_ESCAPE_DIGITS, "0")}`;
|
|
856
|
-
}
|
|
857
|
-
const JAVA_WHITESPACE_ESCAPED = [...JAVA_WHITESPACE].map(unicodeEscape).join("");
|
|
858
|
-
/** Matches a string Metabase reads as not blank: one holding a character that is not Java whitespace. */
|
|
859
|
-
const NOT_BLANK = new RegExp(`[^${JAVA_WHITESPACE_ESCAPED}]`);
|
|
860
|
-
/** Whether Metabase reads `value` as blank: empty, or Java whitespace only. */
|
|
861
|
-
function isBlank(value) {
|
|
862
|
-
return !NOT_BLANK.test(value);
|
|
863
|
-
}
|
|
864
|
-
//#endregion
|
|
865
1420
|
//#region src/output/projection.ts
|
|
866
1421
|
function projectForList(item, view, opts) {
|
|
867
1422
|
const full = opts.format === "text" && opts.fields === void 0 ? false : opts.full;
|
|
@@ -1104,6 +1659,7 @@ function exitCodeFor(category) {
|
|
|
1104
1659
|
case "http":
|
|
1105
1660
|
case "validation":
|
|
1106
1661
|
case "response-shape":
|
|
1662
|
+
case "partial-write":
|
|
1107
1663
|
case "timeout":
|
|
1108
1664
|
case "internal":
|
|
1109
1665
|
case "failed":
|
|
@@ -1125,11 +1681,15 @@ function isVersionTooOld(detail) {
|
|
|
1125
1681
|
function isRouteMissing(handled) {
|
|
1126
1682
|
return "kind" in handled && handled.kind === ROUTE_MISSING_KIND;
|
|
1127
1683
|
}
|
|
1684
|
+
function isRefusedBeforeSending(handled) {
|
|
1685
|
+
return handled instanceof CapabilityError && handled.cause === void 0;
|
|
1686
|
+
}
|
|
1128
1687
|
function remediesFor(handled) {
|
|
1129
1688
|
if (handled instanceof ProfileRefreshedError) return [];
|
|
1130
|
-
if (isVersionTooOld(handled.developerDetail)) return [DOWNGRADE_REMEDY];
|
|
1131
1689
|
if (isRouteMissing(handled)) return [ROUTE_MISSING_REMEDY];
|
|
1132
|
-
|
|
1690
|
+
const downgrade = isVersionTooOld(handled.developerDetail) ? [DOWNGRADE_REMEDY] : [];
|
|
1691
|
+
const skip = isRefusedBeforeSending(handled) ? [PREFLIGHT_SKIP_REMEDY] : [];
|
|
1692
|
+
return [...downgrade, ...skip];
|
|
1133
1693
|
}
|
|
1134
1694
|
function writeTextError(handled, verbose) {
|
|
1135
1695
|
process.stderr.write(handled.userMessage + "\n");
|
|
@@ -1155,145 +1715,6 @@ function writeJsonError(handled, exitCode, verbose) {
|
|
|
1155
1715
|
process.stderr.write(serializeJson(envelope, stderrPretty()) + "\n");
|
|
1156
1716
|
}
|
|
1157
1717
|
//#endregion
|
|
1158
|
-
//#region ../client/src/version/features.ts
|
|
1159
|
-
const FEATURE_RULES = {
|
|
1160
|
-
dataActionCollections: { since: 65 },
|
|
1161
|
-
dataActionsWithoutModel: { since: 65 },
|
|
1162
|
-
transforms: { since: 59 },
|
|
1163
|
-
transformJobActivation: { since: 61 },
|
|
1164
|
-
measures: { since: 59 },
|
|
1165
|
-
library: {
|
|
1166
|
-
since: 59,
|
|
1167
|
-
tokenFeature: "library"
|
|
1168
|
-
},
|
|
1169
|
-
remoteSync: {
|
|
1170
|
-
since: 60,
|
|
1171
|
-
tokenFeature: "remote_sync"
|
|
1172
|
-
},
|
|
1173
|
-
remoteSyncExportPreflight: {
|
|
1174
|
-
since: 63,
|
|
1175
|
-
tokenFeature: "remote_sync"
|
|
1176
|
-
},
|
|
1177
|
-
remoteSyncBranchGuard: { since: 63 },
|
|
1178
|
-
remoteSyncMerge: {
|
|
1179
|
-
since: 63,
|
|
1180
|
-
tokenFeature: "remote_sync"
|
|
1181
|
-
},
|
|
1182
|
-
contentTranslation: {
|
|
1183
|
-
since: 58,
|
|
1184
|
-
tokenFeature: "content_translation"
|
|
1185
|
-
},
|
|
1186
|
-
contentVerification: {
|
|
1187
|
-
since: 58,
|
|
1188
|
-
tokenFeature: "content_verification"
|
|
1189
|
-
},
|
|
1190
|
-
transformTargetTableId: { since: 61 },
|
|
1191
|
-
transformTargetTableLinkedOnCreate: {
|
|
1192
|
-
since: 61,
|
|
1193
|
-
until: 61
|
|
1194
|
-
},
|
|
1195
|
-
transformJobRunIdIsNumeric: { since: 64 },
|
|
1196
|
-
transformCheckpointReset: { since: 60 },
|
|
1197
|
-
fieldDataSensitivity: { since: 64 },
|
|
1198
|
-
fieldRemappingAppendsDisplayColumns: {
|
|
1199
|
-
since: 58,
|
|
1200
|
-
until: 59
|
|
1201
|
-
},
|
|
1202
|
-
transformDagRuns: { since: 64 },
|
|
1203
|
-
unifiedTransformRuns: { since: 64 },
|
|
1204
|
-
transformTests: {
|
|
1205
|
-
since: 65,
|
|
1206
|
-
tokenFeature: "transforms-testing"
|
|
1207
|
-
},
|
|
1208
|
-
libraryChildrenCarryType: { since: 62 },
|
|
1209
|
-
collectionItemsTotalOnEmptyPage: { since: 64 },
|
|
1210
|
-
invalidMbqlIsBadRequest: { since: 59 },
|
|
1211
|
-
boxplotDisplay: { since: 59 },
|
|
1212
|
-
nativeTableTemplateTag: { since: 59 },
|
|
1213
|
-
compiledQueryOmitsCollection: {
|
|
1214
|
-
since: 59,
|
|
1215
|
-
until: 62
|
|
1216
|
-
},
|
|
1217
|
-
smartLinkMeasureModel: { since: 60 },
|
|
1218
|
-
dashboardSubscriptionFilters: {
|
|
1219
|
-
since: 58,
|
|
1220
|
-
tokenFeature: "dashboard_subscription_filters"
|
|
1221
|
-
},
|
|
1222
|
-
dependencyGraph: {
|
|
1223
|
-
since: 58,
|
|
1224
|
-
tokenFeature: "dependencies"
|
|
1225
|
-
},
|
|
1226
|
-
dependencyItemListings: {
|
|
1227
|
-
since: 59,
|
|
1228
|
-
tokenFeature: "dependencies"
|
|
1229
|
-
},
|
|
1230
|
-
dependencyAsyncBackfill: {
|
|
1231
|
-
since: 60,
|
|
1232
|
-
tokenFeature: "dependencies"
|
|
1233
|
-
},
|
|
1234
|
-
measureDependencyGraph: { since: 59 },
|
|
1235
|
-
tableListAccessFilters: { since: 59 },
|
|
1236
|
-
tableListTransformTargets: { since: 60 },
|
|
1237
|
-
tableListPublishedFilter: { since: 63 },
|
|
1238
|
-
tableUnusedFilter: {
|
|
1239
|
-
since: 58,
|
|
1240
|
-
tokenFeature: "dependencies"
|
|
1241
|
-
},
|
|
1242
|
-
tableDataLayerTiers: { since: 59 },
|
|
1243
|
-
bulkTableEdit: { since: 59 },
|
|
1244
|
-
tableUserValueWithdrawal: { since: 64 },
|
|
1245
|
-
bulkTableSync: { since: 59 },
|
|
1246
|
-
erd: {
|
|
1247
|
-
since: 62,
|
|
1248
|
-
tokenFeature: "schema-viewer"
|
|
1249
|
-
},
|
|
1250
|
-
documentCopy: { since: 59 },
|
|
1251
|
-
transformInspector: {
|
|
1252
|
-
since: 60,
|
|
1253
|
-
tokenFeature: "transforms-python"
|
|
1254
|
-
},
|
|
1255
|
-
pythonLibrary: {
|
|
1256
|
-
since: 58,
|
|
1257
|
-
tokenFeature: "transforms-python"
|
|
1258
|
-
},
|
|
1259
|
-
pythonTestRun: {
|
|
1260
|
-
since: 60,
|
|
1261
|
-
tokenFeature: "transforms-python"
|
|
1262
|
-
},
|
|
1263
|
-
sourceReplacement: {
|
|
1264
|
-
since: 60,
|
|
1265
|
-
tokenFeature: "dependencies"
|
|
1266
|
-
},
|
|
1267
|
-
metricDefinitionQuery: { since: 60 },
|
|
1268
|
-
metricDimensionListing: { since: 64 },
|
|
1269
|
-
oauthFullAccessScope: { since: 63 },
|
|
1270
|
-
exportCsvByteOrderMark: { since: 63 }
|
|
1271
|
-
};
|
|
1272
|
-
function isFeatureName(name) {
|
|
1273
|
-
return Object.hasOwn(FEATURE_RULES, name);
|
|
1274
|
-
}
|
|
1275
|
-
const FEATURE_NAMES = Object.keys(FEATURE_RULES).filter(isFeatureName);
|
|
1276
|
-
const Features = z.record(z.enum(FEATURE_NAMES), z.boolean());
|
|
1277
|
-
function evaluateFeatures(major, tokenFeatures) {
|
|
1278
|
-
const entries = FEATURE_NAMES.map((name) => [name, ruleHolds(FEATURE_RULES[name], major, tokenFeatures)]);
|
|
1279
|
-
return Features.parse(Object.fromEntries(entries));
|
|
1280
|
-
}
|
|
1281
|
-
function ruleHolds(rule, major, tokenFeatures) {
|
|
1282
|
-
return ruleGap(rule, major, tokenFeatures) === null;
|
|
1283
|
-
}
|
|
1284
|
-
function ruleGap(rule, major, tokenFeatures) {
|
|
1285
|
-
if (!versionHolds(rule, major)) return { kind: "version" };
|
|
1286
|
-
if (rule.tokenFeature === void 0) return null;
|
|
1287
|
-
return tokenFeatures !== null && tokenFeatures[rule.tokenFeature] === true ? null : {
|
|
1288
|
-
kind: "token",
|
|
1289
|
-
tokenFeature: rule.tokenFeature
|
|
1290
|
-
};
|
|
1291
|
-
}
|
|
1292
|
-
function versionHolds(rule, major) {
|
|
1293
|
-
if (major === "development") return rule.until === void 0;
|
|
1294
|
-
return major >= rule.since && (rule.until === void 0 || major <= rule.until);
|
|
1295
|
-
}
|
|
1296
|
-
//#endregion
|
|
1297
1718
|
//#region ../client/src/version/requirements.ts
|
|
1298
1719
|
const METHOD_REQUIREMENTS = {
|
|
1299
1720
|
"card.list": [],
|
|
@@ -1364,7 +1785,7 @@ const METHOD_REQUIREMENTS = {
|
|
|
1364
1785
|
"gitSync.cancelTask": ["remoteSync"],
|
|
1365
1786
|
"gitSync.isDirty": ["remoteSync"],
|
|
1366
1787
|
"gitSync.dirty": ["remoteSync"],
|
|
1367
|
-
"gitSync.hasRemoteChanges": ["
|
|
1788
|
+
"gitSync.hasRemoteChanges": ["remoteSyncRemoteChanges"],
|
|
1368
1789
|
"gitSync.import": ["remoteSync"],
|
|
1369
1790
|
"gitSync.export": ["remoteSync"],
|
|
1370
1791
|
"gitSync.exportPreflight": ["remoteSyncExportPreflight"],
|
|
@@ -1374,8 +1795,8 @@ const METHOD_REQUIREMENTS = {
|
|
|
1374
1795
|
"gitSync.setCollectionSynced": ["remoteSync"],
|
|
1375
1796
|
"gitSync.syncedCollections": ["remoteSync"],
|
|
1376
1797
|
"gitSync.remoteUrl": [],
|
|
1377
|
-
"gitSync.branch": [],
|
|
1378
|
-
"gitSync.trackedBranch": [],
|
|
1798
|
+
"gitSync.branch": ["remoteSync"],
|
|
1799
|
+
"gitSync.trackedBranch": ["remoteSync"],
|
|
1379
1800
|
"gitSync.waitForTask": ["remoteSync"],
|
|
1380
1801
|
"glossary.list": [],
|
|
1381
1802
|
"glossary.create": [],
|
|
@@ -1902,4 +2323,4 @@ run().catch((error) => {
|
|
|
1902
2323
|
reportError(error);
|
|
1903
2324
|
});
|
|
1904
2325
|
//#endregion
|
|
1905
|
-
export {
|
|
2326
|
+
export { parseJsonResult as $, ENV_URL as A, formatZodIssue as At, Features as B, preflightUncheckedNotice as C, NetworkError as Ct, ENV_PROFILE as D, UnknownError as Dt, ENV_DISABLE_KEYRING as E, TimeoutError as Et, RequirementFailure as F, chainRequestFailure as G, isFeatureName as H, missingTokenFeatureMessage as I, isBlank as J, isRetryableStatus as K, versionTooOldMessage as L, readEnv as M, isNonInterruptFailure as Mt, ProfileRefreshedError as N, KNOWN_RANGE as Nt, ENV_SKILLS_DIR as O, ValidationError as Ot, CapabilityError as P, escapeJsonPointerSegment as Pt, parseJsonOrPlain as Q, FEATURE_NAMES as R, preflightSkippedNotice as S, MetabaseError as St, ENV_API_KEY as T, ResponseShapeError as Tt, ruleGap as U, evaluateFeatures as V, HttpError as W, JSON_CONTENT_TYPE as X, isPlainObject as Y, parseJson as Z, promptConfirm as _, parseEnumCsv as _t, renderItem as a, listFlag as at, promptText as b, FailedResultError as bt, renderSummary as c, outputFlags as ct, writeJson as d, listEnvelopeSchema as dt, setMetabaseAugment as et, writeText as f, listEnvelopeSchemaWithExtras as ft, projectForList as g, parseEnum as gt, renderRows as h, parseCsv as ht, reportError as i, formatFlags as it, consumeLegacyEnvWarnings as j, isFileNotFoundError as jt, ENV_SKIP_PREFLIGHT as k, errorMessage as kt, renderSummaryWithinMaxBytes as l, profileFlag as lt, formatScalar as m, givenFlagKeys as mt, isMethodKey as n, version as nt, renderList as o, listFlags as ot, MALFORMED_CELL as p, assertArgv as pt, NOT_BLANK as q, methodRequirements as r, connectionFlags as rt, renderListWithExtras as s, listFlagsWithDefaultLimit as st, interruptSignal as t, name as tt, serializeJson as u, DEFAULT_MAX_BYTES as ut, promptPassword as v, AbortError as vt, warn as w, PartialWriteError as wt, listTruncationNotice as x, InternalError as xt, promptSelect as y, ConfigError as yt, FEATURE_RULES as z };
|