@metabase/cli 0.4.1-alpha.fix-transform-test-ee-path.b41b46c → 0.5.0
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-CcjydN8e.mjs → add-collection-COtKcy6Y.mjs} +4 -4
- package/dist/{alert-DBTU8iHe.mjs → alert-DMlSjPEv.mjs} +7 -7
- package/dist/{alerts-DsgnumqY.mjs → alerts-s3al16NZ.mjs} +6 -6
- package/dist/{append-DUFn3_Og.mjs → append-CbGmdeLw.mjs} +4 -4
- package/dist/{archive-CWs273rN.mjs → archive-5EY9UJU_.mjs} +3 -3
- package/dist/{archive-Bxl1oeJr.mjs → archive-BFmx4B91.mjs} +3 -3
- package/dist/{archive-CcPTctIo.mjs → archive-BZCYIBhQ.mjs} +3 -3
- package/dist/{archive-sfqadV_a.mjs → archive-C_UHeanE.mjs} +3 -3
- package/dist/{archive-CC6THE3k.mjs → archive-Ce4eArrs.mjs} +3 -3
- package/dist/{archive-CI-WE7dA.mjs → archive-CnDriekB.mjs} +5 -5
- package/dist/{archive-DVgglC0F.mjs → archive-DDO2XX0E.mjs} +4 -4
- package/dist/{archive-DjQkD1WI.mjs → archive-DW7x0IFB.mjs} +4 -4
- package/dist/{archive-BEzfnrwM.mjs → archive-DvbaSglr.mjs} +3 -3
- package/dist/{archive-BTfOiOnx.mjs → archive-DzSdJVqE.mjs} +5 -5
- package/dist/{archive-jwyopr47.mjs → archive-a05W75XH.mjs} +3 -3
- package/dist/{auth-IQKgyb_x.mjs → auth-DOz7KW5E.mjs} +5 -5
- package/dist/{body-CT1cQrhp.mjs → body-Di7940x_.mjs} +2 -3
- package/dist/{branch-flag-Czh8JT1G.mjs → branch-flag-CfJ8vwgu.mjs} +1 -1
- package/dist/{branches-ByUeNOBP.mjs → branches-BC-vlk6i.mjs} +3 -3
- package/dist/{breaking-BKR88YVq.mjs → breaking-ByrjsFjq.mjs} +6 -6
- package/dist/{broken-DeS3_Cg2.mjs → broken-DLSk1T88.mjs} +8 -8
- package/dist/{bulk-discard-values-DY7svs0d.mjs → bulk-discard-values-VKGj8c7z.mjs} +5 -5
- package/dist/{bulk-edit-3EfcsqCu.mjs → bulk-edit-CpuleeCQ.mjs} +5 -5
- package/dist/{bulk-rescan-values-BpwnC_WY.mjs → bulk-rescan-values-DeGwiqLS.mjs} +5 -5
- package/dist/{bulk-sync-schema-Dwbs0TsG.mjs → bulk-sync-schema-BKVhauW1.mjs} +5 -5
- package/dist/{cancel-Nz4jJ-Ey.mjs → cancel-qKj45001.mjs} +3 -3
- package/dist/{cancel-task-CX_qYiJ0.mjs → cancel-task-nmBBd1Ky.mjs} +3 -3
- package/dist/card-Buc-X4Mh.mjs +25 -0
- package/dist/{cards-FUW8-5PO.mjs → cards-Bq73s48q.mjs} +4 -4
- package/dist/cli.mjs +628 -229
- package/dist/{client-5y-BaV3d.mjs → client-BmURNkkW.mjs} +997 -365
- package/dist/{collection-DPiztU_l.mjs → collection-C03LXnCT.mjs} +1 -1
- package/dist/collection-D-sS0AFw.mjs +21 -0
- package/dist/{collection-namespace-Q_up_tSg.mjs → collection-namespace-DaDzK31i.mjs} +1 -2
- package/dist/{collection-BgPYl2c5.mjs → collection-zrZoJfgR.mjs} +1 -1
- package/dist/{content-translation-CSkaKlqa.mjs → content-translation-BlG41YrA.mjs} +3 -3
- package/dist/{copy-WlNBviDZ.mjs → copy-DOKlVa7H.mjs} +6 -6
- package/dist/{copy-fikpWJO4.mjs → copy-DTiYs_a2.mjs} +4 -4
- package/dist/{copy-flags-j38p0var.mjs → copy-flags-BhGWC5kS.mjs} +2 -2
- package/dist/{create-C4dDHOzR.mjs → create-1rLk8b5q.mjs} +3 -3
- package/dist/{create-BmCz5lro.mjs → create-B1QDNU1x.mjs} +6 -6
- package/dist/{create-BI73JzZN.mjs → create-B1bX6ngX.mjs} +4 -4
- package/dist/{create-9sPJd45D.mjs → create-B5BwdPwT.mjs} +6 -6
- package/dist/{create-CC89lXeE.mjs → create-BKKNIe93.mjs} +3 -3
- package/dist/{create-COv2mYmk.mjs → create-BXX_n64u.mjs} +4 -4
- package/dist/{create-CEezFRTJ.mjs → create-BpwZJZxb.mjs} +5 -5
- package/dist/{create-DqGen4jU.mjs → create-C0kz0oYc.mjs} +3 -3
- package/dist/{create-CLLcjbzq.mjs → create-Cob0gLsA.mjs} +3 -3
- package/dist/{create-yLNBBrwG.mjs → create-DPggIXfn.mjs} +4 -4
- package/dist/{create-DdnC7PkI.mjs → create-DUytP2Y1.mjs} +4 -4
- package/dist/{create-CO6gBV7I.mjs → create-DraZzrLO.mjs} +4 -4
- package/dist/{create-Dp1597uC.mjs → create-Duj_2YIF.mjs} +4 -4
- package/dist/{create-C0MNevKK.mjs → create-JaFhqysM.mjs} +5 -5
- package/dist/{create-branch-Cflee_NY.mjs → create-branch-B5jB4tKk.mjs} +3 -3
- package/dist/{create-CYqqBKhE.mjs → create-d0trLAzB.mjs} +4 -4
- package/dist/{create-Ci7o6-Fk.mjs → create-vOw8gmBU.mjs} +3 -3
- package/dist/{csv-CX1wws5-.mjs → csv-DfExp9H_.mjs} +4 -4
- package/dist/{current-task-BTnORR7t.mjs → current-task-CbXIH_RA.mjs} +4 -4
- package/dist/dashboard-DH_soSQp.mjs +35 -0
- package/dist/{database-D-CRyRIv.mjs → database-BdKkae1m.mjs} +1 -1
- package/dist/{database-MlUPpitM.mjs → database-DoNoZ8Yc.mjs} +1 -1
- package/dist/{dataset-p5oNPQgL.mjs → dataset-DZgJm5hP.mjs} +3 -14
- package/dist/{db-DNevs1XU.mjs → db-C82M3Gpg.mjs} +7 -7
- package/dist/{delete-BJ18ifIG.mjs → delete-9xHRd2CG.mjs} +4 -4
- package/dist/{delete-dfrM_M6T.mjs → delete-B4BfGfiJ.mjs} +4 -4
- package/dist/{delete-D5Jy83V-.mjs → delete-D0xFMRRq.mjs} +4 -4
- package/dist/{delete-CCUYbNae.mjs → delete-DJ7SNXiH.mjs} +4 -4
- package/dist/{delete-ChmqxYa7.mjs → delete-hcw_4pBG.mjs} +4 -4
- package/dist/{delete-Ch797MmM.mjs → delete-hwPqKXeY.mjs} +4 -4
- package/dist/{delete-runtime-Cc7TASG7.mjs → delete-runtime-DkgYUQ_n.mjs} +1 -1
- package/dist/{delete-table-0xxoSknN.mjs → delete-table-DhTMft7u.mjs} +4 -4
- package/dist/{dependencies-GvzMLOS2.mjs → dependencies-B8H2gA04.mjs} +5 -5
- package/dist/dependency-CLznxtLE.mjs +15 -0
- package/dist/{dependency-BZxbh7qe.mjs → dependency-Dc33mjgd.mjs} +2 -2
- package/dist/{dependency-DaGeVAHF.mjs → dependency-tQBxYjFX.mjs} +1 -1
- package/dist/{dependents-BRqKb0Pu.mjs → dependents-B2GcS5kB.mjs} +9 -9
- package/dist/{dirty-Bq2cf5AG.mjs → dirty-Cz2rUd6S.mjs} +4 -4
- package/dist/{discard-values-k5-ePxWl.mjs → discard-values-QWuWGaVK.mjs} +5 -5
- package/dist/{document-COQzVLjW.mjs → document-BDobDiap.mjs} +1 -1
- package/dist/document-WhSEyI-3.mjs +20 -0
- package/dist/{document-BsaKF8UR.mjs → document-wfWbV0B_.mjs} +1 -1
- package/dist/{download-Dpbarf8I.mjs → download-Dw15fUMy.mjs} +2 -2
- package/dist/{eid-BEc1p_um.mjs → eid-Ex4G-ZlN.mjs} +4 -4
- package/dist/{entity-c_Br4SFc.mjs → entity-DBKPaMr5.mjs} +2 -2
- package/dist/{entry-flags-z8cZTfaQ.mjs → entry-flags-DgY3IXFe.mjs} +4 -4
- package/dist/{events-DBpOpy2y.mjs → events-BibJ4ya0.mjs} +4 -4
- package/dist/{export-F-R_vF48.mjs → export-U8MdaatW.mjs} +7 -7
- package/dist/{export-flags-QbLI0sKz.mjs → export-flags-BrfeyE8D.mjs} +2 -2
- package/dist/{export-preflight-0BvDa8Oz.mjs → export-preflight-A28L45au.mjs} +5 -5
- package/dist/field-qF1KRJYB.mjs +21 -0
- package/dist/{fields-DOdrazv2.mjs → fields-i1TFa_th.mjs} +4 -4
- package/dist/{filter-flags-DiUgZ6vZ.mjs → filter-flags-Bm3vuSM-.mjs} +3 -3
- package/dist/{fks-41Ig_ZQ2.mjs → fks-Dcfn3-73.mjs} +6 -6
- package/dist/{get-Dwp_BfIp.mjs → get-B4_3DID6.mjs} +5 -5
- package/dist/{get-TbBkN-jS.mjs → get-BCdtCwaG.mjs} +3 -3
- package/dist/{get-BVaN-tgY.mjs → get-BKDTRMNU.mjs} +3 -3
- package/dist/{get-CVJFF8Lb.mjs → get-BiPSePQc.mjs} +3 -3
- package/dist/{get-DaxwG0AP.mjs → get-C3ojRVJ_.mjs} +4 -4
- package/dist/{get-B8hREA2A.mjs → get-CCLWWqTD.mjs} +4 -4
- package/dist/{get-aC5jUA1y.mjs → get-CVpIQb8v.mjs} +5 -5
- package/dist/{get-BjJdy_Iw.mjs → get-CcwRn8Y2.mjs} +5 -5
- package/dist/{get-BAV-KpLU.mjs → get-CobILQ_7.mjs} +3 -3
- package/dist/{get-OKOOd2yb.mjs → get-Cwj1Q-at.mjs} +3 -3
- package/dist/{get-DwUB0K2G.mjs → get-D0NZ0ZO1.mjs} +3 -3
- package/dist/{get-2l2CbHc6.mjs → get-DPZUIPjv.mjs} +3 -3
- package/dist/{get-D1c-C-_Q2.mjs → get-DUwX-RU82.mjs} +3 -3
- package/dist/{get-Bby33eun.mjs → get-DqYn9mez.mjs} +4 -4
- package/dist/{get-CPhMYZDP.mjs → get-Dz3dNirC.mjs} +4 -4
- package/dist/{get-CfeNeyGE.mjs → get-EKBYludD.mjs} +3 -3
- package/dist/{get-YinpF0y5.mjs → get-HFQSttF3.mjs} +5 -5
- package/dist/{get-CjK2GzFn.mjs → get-IjoHBExI.mjs} +5 -5
- package/dist/{get-BlLUy1G0.mjs → get-hAoJtVCK.mjs} +3 -3
- package/dist/{get-run-PeXiUJwf.mjs → get-run-B2SnsZSY.mjs} +4 -4
- package/dist/git-sync-BlgB_-8-.mjs +29 -0
- package/dist/{git-sync-DspFahwV.mjs → git-sync-Ch1V1fEK.mjs} +1 -1
- package/dist/{glossary-CdW6RFId.mjs → glossary-6LLpItof.mjs} +1 -1
- package/dist/glossary-BvVxqjxJ.mjs +14 -0
- package/dist/{glossary-Del97Jqg.mjs → glossary-wnuxoE_I.mjs} +1 -1
- package/dist/{graph-M7V_js_w.mjs → graph-CHlfxVy1.mjs} +6 -6
- package/dist/{group-D4w87fXL.mjs → group-B3X3LTcU.mjs} +1 -1
- package/dist/{has-remote-changes-D7uABGR0.mjs → has-remote-changes-DCMpqGgE.mjs} +3 -3
- package/dist/{import-CABYSyWS.mjs → import-C7MZhKo6.mjs} +7 -7
- package/dist/{input-DjHsV-kD.mjs → input-sRdxNc3T.mjs} +1 -1
- package/dist/{is-dirty-DpQBXuVa.mjs → is-dirty-DpLyHebS.mjs} +2 -2
- package/dist/{items-BqUCPf-J.mjs → items-1ME_eg27.mjs} +6 -6
- package/dist/{key-BTaxFn_7.mjs → key-DMtgTOwN.mjs} +1 -1
- package/dist/{library-DmkpcZPb.mjs → library-CP-9yepy.mjs} +1 -1
- package/dist/{library-DDrpsgMv.mjs → library-D2ogEIfI.mjs} +5 -5
- package/dist/{library-C4M8TF2N.mjs → library-fWEv38OB.mjs} +2 -2
- package/dist/{list-Dd9o6Tut.mjs → list-B0h-j1E7.mjs} +3 -3
- package/dist/{list-ISpYiawJ.mjs → list-BUZ91ctZ.mjs} +5 -5
- package/dist/{list-CLRezReA.mjs → list-BUwDGyIu.mjs} +5 -5
- package/dist/{list-C9H24xr5.mjs → list-BXcDPU5d.mjs} +6 -6
- package/dist/{list-BQXq0A65.mjs → list-BoVeF8QA.mjs} +6 -6
- package/dist/{list-CHUwj_Qh.mjs → list-C1oEpUZG.mjs} +3 -3
- package/dist/{list-Hiq5T4Bt.mjs → list-C9996vbS.mjs} +3 -3
- package/dist/{list-DO767sO1.mjs → list-CJ5FyCnL.mjs} +4 -4
- package/dist/{list-BFAc460G.mjs → list-CQi3AgS5.mjs} +4 -4
- package/dist/{list-yDJq3wNs.mjs → list-CVh8DHOO.mjs} +5 -5
- package/dist/{list-D217irjK.mjs → list-DBAEy3Rx.mjs} +3 -3
- package/dist/{list-glgnTw7w.mjs → list-DkCadZ2E.mjs} +3 -3
- package/dist/{list-CEU9UXaZ.mjs → list-DzP7YXdZ.mjs} +3 -3
- package/dist/{list-aHFBopQd.mjs → list-LMlJ4uAY.mjs} +4 -4
- package/dist/{list-BXRUiZuH.mjs → list-NINy7ybI.mjs} +4 -4
- package/dist/{list-CONZkA9i.mjs → list-OXiXtdiM.mjs} +5 -5
- package/dist/{list-BygxQkq7.mjs → list-STy8UHs2.mjs} +6 -6
- package/dist/{list-CZF_gQnI.mjs → list-Ud7F0XdU.mjs} +3 -3
- package/dist/{list-D0MlsdSX.mjs → list-dCi6OaIE.mjs} +4 -4
- package/dist/{login-DCWam2ec.mjs → login-BMON3Fft.mjs} +6 -6
- package/dist/{logout-CmrJqhkc.mjs → logout-Cx934GzW.mjs} +2 -2
- package/dist/{measure-c_VUyXFN.mjs → measure-CUqJtDNm.mjs} +6 -6
- package/dist/{notification-Cuuwoksm.mjs → notification-CCZ9mrOw.mjs} +1 -1
- package/dist/{parameter-values-CnwWZrJ_.mjs → parameter-values-DCrU02Az.mjs} +3 -3
- package/dist/{parse-enum-BPKULOSw.mjs → parse-enum-Do5Cptbv.mjs} +1 -1
- package/dist/{parse-id-aMXePsUP.mjs → parse-id-oCbmouCn.mjs} +1 -1
- package/dist/{parse-ref-8bVX_9IN.mjs → parse-ref-Df8gusl4.mjs} +1 -1
- package/dist/{parse-text-Bm6eUa-p.mjs → parse-text-CVrP7GmZ.mjs} +1 -1
- package/dist/{path-CGbz-QSr.mjs → path-DTuSDGd6.mjs} +4 -4
- package/dist/{poll-DFZRtTA_.mjs → poll-BKo5dK0l.mjs} +2 -2
- package/dist/{preflight-ChJ0pemy.mjs → preflight-UeYuGDPr.mjs} +2 -3
- package/dist/{process-B3Di_HtV.mjs → process-BpmZXbcw.mjs} +1 -1
- package/dist/{publish-7ke00CtK.mjs → publish-D3GwLC-K.mjs} +4 -4
- package/dist/{pulse-CIza18rO.mjs → pulse-DzVPfb5J.mjs} +1 -1
- package/dist/{query-8M7ZN2Ca.mjs → query-B1Cp9EO6.mjs} +4 -4
- package/dist/{query-DNa-fGS7.mjs → query-Ct697cY-.mjs} +11 -12
- package/dist/{remapping-Cy1CEown.mjs → remapping-RsoPWE7c.mjs} +4 -4
- package/dist/{remove-collection-B2CL66No.mjs → remove-collection-BJo3Wd9K.mjs} +4 -4
- package/dist/{render-ColPG5G7.mjs → render-C_ev6qoW.mjs} +2 -2
- package/dist/{replace-COC3ggyx.mjs → replace-BSAGp3cR.mjs} +4 -4
- package/dist/requirement-check-T3bjQ0Mr.mjs +60 -0
- package/dist/{rescan-values-DUX58myu.mjs → rescan-values-CE62_2dc.mjs} +5 -5
- package/dist/{rescan-values-DXzXTw9a.mjs → rescan-values-rpro4Kw2.mjs} +5 -5
- package/dist/{run-C5wf-lug.mjs → run-B3BRodEp.mjs} +3 -3
- package/dist/{run-T2a4m1x9.mjs → run-BI1QO9Kn.mjs} +7 -7
- package/dist/{runs-Datc76Wu.mjs → runs-CUseZezf.mjs} +5 -5
- package/dist/{runtime-C3AL15Dp.mjs → runtime-C5Ha6Ou8.mjs} +248 -534
- package/dist/{schema-tables-CR2S5mNc.mjs → schema-tables-C7YkyRh0.mjs} +6 -6
- package/dist/{schemas-OrGjEuVc.mjs → schemas-Bj5sJ9uB.mjs} +4 -4
- package/dist/{search-BEXBlfak.mjs → search-BsAwK7Rk.mjs} +5 -5
- package/dist/{search-CJYSB5eP.mjs → search-CB1A4HWx.mjs} +6 -6
- package/dist/{segment-Tt8GaRnc.mjs → segment-BEjaeLc5.mjs} +6 -6
- package/dist/{send-uNLODakO.mjs → send-Dfh8d1gG.mjs} +3 -3
- package/dist/{set-DRp3F4wz.mjs → set-DA8dKyzi.mjs} +4 -4
- package/dist/{set-active-CAt6ieXS.mjs → set-active-AyjKtBD-.mjs} +3 -3
- package/dist/{set-sensitivity--Qq2RXVE.mjs → set-sensitivity-D0613dHA.mjs} +4 -4
- package/dist/{setting-DMqvipRp.mjs → setting-B-bxCkC0.mjs} +4 -4
- package/dist/{setup-B2PC1NVz.mjs → setup-Bvvqlz9d.mjs} +3 -3
- package/dist/{signal-0Yt8JTMn.mjs → signal-Dm4N0Bcc.mjs} +1 -1
- package/dist/{skill-list-Cyx1935Q.mjs → skill-list-DkuCf0k4.mjs} +9 -3
- package/dist/{skills-Dlp0MK6g.mjs → skills-DlDCTGVE.mjs} +2 -2
- package/dist/{skills-D7wu2iff.mjs → skills-DxrO7HUz.mjs} +3 -3
- package/dist/snippet-B7Kau5U8.mjs +19 -0
- package/dist/{stash-CHeQPI8Z.mjs → stash-j9JPv3ns.mjs} +5 -5
- package/dist/{status-Bdt5XWrQ.mjs → status-DcbvbRc5.mjs} +3 -3
- package/dist/{status-gTN3G-rs.mjs → status-DxNcrfnI.mjs} +16 -7
- package/dist/{subscription-C9alueg1.mjs → subscription-CSR2t-xK.mjs} +6 -6
- package/dist/{subscriptions-DJKbcxDy.mjs → subscriptions--0YvW40u.mjs} +6 -6
- package/dist/{summary-kaC0aINr.mjs → summary-Dslv78-r.mjs} +3 -3
- package/dist/{sync-schema-CyKovAb9.mjs → sync-schema-BSJiokQf.mjs} +6 -6
- package/dist/{sync-schema-C29bGCtt.mjs → sync-schema-Dgij5ICd.mjs} +5 -5
- package/dist/{sync-task-BAMOf6_t.mjs → sync-task-a1zyF1Qb.mjs} +4 -5
- package/dist/{table-BFIOH6Pb.mjs → table-Uvu1roSx.mjs} +2 -2
- package/dist/table-qjgz2eek.mjs +26 -0
- package/dist/{table-selector-flags-CSoedTgm.mjs → table-selector-flags-B9OiA3Z1.mjs} +3 -3
- package/dist/{table-Ci6bhZkb.mjs → table-zAdW5_3H.mjs} +5 -5
- package/dist/{text-CdtEI6l6.mjs → text-821Rn8M9.mjs} +1 -1
- package/dist/timeline-CNkrY3e3.mjs +21 -0
- package/dist/{timeline-event-DN3y8vwW.mjs → timeline-event-CSzx8EDP.mjs} +6 -6
- package/dist/{transform-D4z70PIN.mjs → transform-BKX6tl3i.mjs} +1 -1
- package/dist/transform-Y86R7_2F.mjs +28 -0
- package/dist/transform-job-Cg_1jzWI.mjs +22 -0
- package/dist/{transform-tag-CIKnNaQH.mjs → transform-tag-DHg7j15d.mjs} +5 -5
- package/dist/{transforms-BQjwZKTN.mjs → transforms-DwxPfMiG.mjs} +5 -5
- package/dist/{tree-C21CG5rm.mjs → tree-COFmA20J.mjs} +3 -3
- package/dist/{unpublish-C7MRZTmS.mjs → unpublish-BQClh4U7.mjs} +3 -3
- package/dist/{unreferenced-BJUIC_Ct.mjs → unreferenced-DKc0zZDl.mjs} +6 -6
- package/dist/{update-CuYvtXQY.mjs → update-B-wcIl8T.mjs} +4 -4
- package/dist/{update-DDH6FTe6.mjs → update-B8jQTspb.mjs} +8 -8
- package/dist/{update-9b4JHJWR.mjs → update-BBLbEPEP.mjs} +4 -4
- package/dist/{update-C0QcHFIP.mjs → update-BNwjjMk6.mjs} +5 -5
- package/dist/{update-BXFGGYT8.mjs → update-BVFfoopT.mjs} +5 -5
- package/dist/{update-CVO8Srng.mjs → update-BVMgrMy7.mjs} +5 -5
- package/dist/{update-CCHTQjsP.mjs → update-Bgy2amR0.mjs} +6 -6
- package/dist/{update-CYy-r_Jq.mjs → update-C9HK3i8s.mjs} +5 -5
- package/dist/{update-IEVAFvpi.mjs → update-CFfr1ZdL.mjs} +4 -4
- package/dist/{update-B2F22ryV.mjs → update-CMRWXoZ2.mjs} +4 -4
- package/dist/{update-D6oHLn1g.mjs → update-CPmPnEvm.mjs} +6 -6
- package/dist/{update-Duxk_-dC.mjs → update-Ca8LSZer.mjs} +5 -5
- package/dist/{update-CBcJTZo6.mjs → update-DJwu8UT2.mjs} +4 -4
- package/dist/{update-DX1s6KnO.mjs → update-Dwr3n7_n.mjs} +7 -7
- package/dist/{update-DEnsF5zT.mjs → update-MxvqmZ3z.mjs} +6 -6
- package/dist/{update-dashcard-C4ZndfvP.mjs → update-dashcard-C8QN2Qcu.mjs} +4 -4
- package/dist/{update-EpHReUGk.mjs → update-kM3TDlEp.mjs} +5 -5
- package/dist/{update-CZ2eSAV5.mjs → update-myfBF5qV.mjs} +4 -4
- package/dist/{upgrade-o2DpB66j.mjs → upgrade-BBOEVIRa.mjs} +4 -4
- package/dist/{upload-CEtKrueq.mjs → upload-CoBd4qBp.mjs} +3 -3
- package/dist/{upload-DJB7DMA1.mjs → upload-CxpXpjCf.mjs} +2 -2
- package/dist/upload-fcim1xtK.mjs +13 -0
- package/dist/{uuid-D9oozo8p.mjs → uuid-DW30GY7B.mjs} +2 -2
- package/dist/{validate-D_iikPkc.mjs → validate-n85yMraN.mjs} +1 -1
- package/dist/{validate-query-BEYjmSv2.mjs → validate-query-BwXvFFYi.mjs} +2 -2
- package/dist/{values-De8aGDiJ.mjs → values-B6eFE4K5.mjs} +3 -3
- package/dist/{verify-DVjaammv.mjs → verify-BSq7x66g.mjs} +3 -3
- package/dist/{verify-ob8JSLxv.mjs → verify-DnU-wXIs.mjs} +4 -4
- package/dist/{verify-DKmz4xJs.mjs → verify-Dp8tUbP3.mjs} +3 -3
- package/dist/{wait-BN_MzTng.mjs → wait-D6Tw4ZxO.mjs} +6 -6
- package/dist/{wait-flags-DQlX2yM_.mjs → wait-flags-BRUzMI6S.mjs} +2 -2
- package/dist/{window-2ybHqui2.mjs → window-BqMFpWMh.mjs} +1 -1
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +5 -8
- package/skill-data/dashboard/SKILL.md +6 -0
- package/skill-data/git-sync/SKILL.md +64 -14
- package/skill-data/transform/SKILL.md +1 -63
- package/dist/card-DmQO85ej.mjs +0 -25
- package/dist/collection-BPVrTfTv.mjs +0 -21
- package/dist/create-DQM_AB3I.mjs +0 -34
- package/dist/dashboard-c_wOMtS9.mjs +0 -35
- package/dist/delete-CZTG4wI2.mjs +0 -44
- package/dist/dependency-D6DMbPVm.mjs +0 -15
- package/dist/document-DCqe5MO9.mjs +0 -20
- package/dist/field-CcCQ0goz.mjs +0 -21
- package/dist/get-DxpDAUz4.mjs +0 -32
- package/dist/git-sync-CO199xCu.mjs +0 -29
- package/dist/glossary-LdAlftZW.mjs +0 -14
- package/dist/list-CQJABPGk.mjs +0 -35
- package/dist/run-C_nqwWmC.mjs +0 -63
- package/dist/snippet-D-5bKT_U.mjs +0 -19
- package/dist/table-8c-V5afO.mjs +0 -26
- package/dist/timeline-BetOmLYk.mjs +0 -21
- package/dist/transform-job-DALBzYVV.mjs +0 -22
- package/dist/transform-p-6_thIh.mjs +0 -28
- package/dist/transform-test-BjjCQ2xm.mjs +0 -169
- package/dist/transform-test-C5Havg4o.mjs +0 -16
- package/dist/transform-test-DHGKeuHa.mjs +0 -32
- package/dist/transport-DuU3fLui.mjs +0 -313
- package/dist/update-BQben_Xm.mjs +0 -41
- package/dist/upload-BqNErDXE.mjs +0 -13
- package/skill-data/transform-test-plan/SKILL.md +0 -82
- package/skill-data/transform-test-plan/references/checklist.md +0 -32
- package/skill-data/transform-test-plan/references/checks.md +0 -156
package/dist/cli.mjs
CHANGED
|
@@ -120,15 +120,6 @@ var InternalError = class extends MetabaseError {
|
|
|
120
120
|
this.name = "InternalError";
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
|
-
var FailedResultError = class extends MetabaseError {
|
|
124
|
-
category = "failed";
|
|
125
|
-
isRetryable = false;
|
|
126
|
-
developerDetail = null;
|
|
127
|
-
constructor(message) {
|
|
128
|
-
super(message);
|
|
129
|
-
this.name = "FailedResultError";
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
123
|
var AbortError = class extends MetabaseError {
|
|
133
124
|
category = "abort";
|
|
134
125
|
isRetryable = false;
|
|
@@ -138,6 +129,9 @@ var AbortError = class extends MetabaseError {
|
|
|
138
129
|
this.name = "AbortError";
|
|
139
130
|
}
|
|
140
131
|
};
|
|
132
|
+
function isNonInterruptFailure(error) {
|
|
133
|
+
return error instanceof MetabaseError && !(error instanceof AbortError);
|
|
134
|
+
}
|
|
141
135
|
var ChainedRequestError = class extends MetabaseError {
|
|
142
136
|
cause;
|
|
143
137
|
constructor(message, cause) {
|
|
@@ -165,6 +159,16 @@ var UnknownError = class extends MetabaseError {
|
|
|
165
159
|
this.developerDetail = input;
|
|
166
160
|
}
|
|
167
161
|
};
|
|
162
|
+
var PartialWriteError = class extends MetabaseError {
|
|
163
|
+
category = "partial-write";
|
|
164
|
+
isRetryable = false;
|
|
165
|
+
developerDetail;
|
|
166
|
+
constructor(message, developerDetail) {
|
|
167
|
+
super(message);
|
|
168
|
+
this.name = "PartialWriteError";
|
|
169
|
+
this.developerDetail = developerDetail;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
168
172
|
function toMetabaseError(error) {
|
|
169
173
|
if (error instanceof MetabaseError) return error;
|
|
170
174
|
if (error instanceof ZodError) return new ConfigError(error.issues.map(formatZodIssue).join("; "));
|
|
@@ -577,7 +581,7 @@ const connectionFlags = {
|
|
|
577
581
|
},
|
|
578
582
|
skipPreflight: {
|
|
579
583
|
type: "boolean",
|
|
580
|
-
description: "Skip the
|
|
584
|
+
description: "Skip the client's version and license checks made before a request, and let the server answer",
|
|
581
585
|
alias: "skip-preflight"
|
|
582
586
|
}
|
|
583
587
|
};
|
|
@@ -623,7 +627,7 @@ function trustSystemCa() {
|
|
|
623
627
|
//#endregion
|
|
624
628
|
//#region package.json
|
|
625
629
|
var name = "@metabase/cli";
|
|
626
|
-
var version = "0.
|
|
630
|
+
var version = "0.5.0";
|
|
627
631
|
var description = "Metabase CLI";
|
|
628
632
|
//#endregion
|
|
629
633
|
//#region src/runtime/command-augment.ts
|
|
@@ -643,39 +647,38 @@ const main = defineCommand({
|
|
|
643
647
|
description
|
|
644
648
|
},
|
|
645
649
|
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
|
-
alert: () => import("./alert-
|
|
656
|
-
collection: () => import("./collection-
|
|
657
|
-
library: () => import("./library-
|
|
658
|
-
document: () => import("./document-
|
|
659
|
-
glossary: () => import("./glossary-
|
|
660
|
-
transform: () => import("./transform-
|
|
661
|
-
"transform-job": () => import("./transform-job-
|
|
662
|
-
"transform-tag": () => import("./transform-tag-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
timeline: () => import("./timeline-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
skills: () => import("./skills-D7wu2iff.mjs").then((mod) => mod.default)
|
|
650
|
+
auth: () => import("./auth-DOz7KW5E.mjs").then((mod) => mod.default),
|
|
651
|
+
db: () => import("./db-C82M3Gpg.mjs").then((mod) => mod.default),
|
|
652
|
+
table: () => import("./table-qjgz2eek.mjs").then((mod) => mod.default),
|
|
653
|
+
field: () => import("./field-qF1KRJYB.mjs").then((mod) => mod.default),
|
|
654
|
+
upload: () => import("./upload-fcim1xtK.mjs").then((mod) => mod.default),
|
|
655
|
+
"content-translation": () => import("./content-translation-BlG41YrA.mjs").then((mod) => mod.default),
|
|
656
|
+
card: () => import("./card-Buc-X4Mh.mjs").then((mod) => mod.default),
|
|
657
|
+
dashboard: () => import("./dashboard-DH_soSQp.mjs").then((mod) => mod.default),
|
|
658
|
+
subscription: () => import("./subscription-CSR2t-xK.mjs").then((mod) => mod.default),
|
|
659
|
+
alert: () => import("./alert-DMlSjPEv.mjs").then((mod) => mod.default),
|
|
660
|
+
collection: () => import("./collection-D-sS0AFw.mjs").then((mod) => mod.default),
|
|
661
|
+
library: () => import("./library-D2ogEIfI.mjs").then((mod) => mod.default),
|
|
662
|
+
document: () => import("./document-WhSEyI-3.mjs").then((mod) => mod.default),
|
|
663
|
+
glossary: () => import("./glossary-BvVxqjxJ.mjs").then((mod) => mod.default),
|
|
664
|
+
transform: () => import("./transform-Y86R7_2F.mjs").then((mod) => mod.default),
|
|
665
|
+
"transform-job": () => import("./transform-job-Cg_1jzWI.mjs").then((mod) => mod.default),
|
|
666
|
+
"transform-tag": () => import("./transform-tag-DHg7j15d.mjs").then((mod) => mod.default),
|
|
667
|
+
setting: () => import("./setting-B-bxCkC0.mjs").then((mod) => mod.default),
|
|
668
|
+
search: () => import("./search-CB1A4HWx.mjs").then((mod) => mod.default),
|
|
669
|
+
"git-sync": () => import("./git-sync-BlgB_-8-.mjs").then((mod) => mod.default),
|
|
670
|
+
setup: () => import("./setup-Bvvqlz9d.mjs").then((mod) => mod.default),
|
|
671
|
+
snippet: () => import("./snippet-B7Kau5U8.mjs").then((mod) => mod.default),
|
|
672
|
+
segment: () => import("./segment-BEjaeLc5.mjs").then((mod) => mod.default),
|
|
673
|
+
measure: () => import("./measure-CUqJtDNm.mjs").then((mod) => mod.default),
|
|
674
|
+
dependency: () => import("./dependency-CLznxtLE.mjs").then((mod) => mod.default),
|
|
675
|
+
timeline: () => import("./timeline-CNkrY3e3.mjs").then((mod) => mod.default),
|
|
676
|
+
"timeline-event": () => import("./timeline-event-CSzx8EDP.mjs").then((mod) => mod.default),
|
|
677
|
+
eid: () => import("./eid-Ex4G-ZlN.mjs").then((mod) => mod.default),
|
|
678
|
+
query: () => import("./query-Ct697cY-.mjs").then((mod) => mod.default),
|
|
679
|
+
uuid: () => import("./uuid-DW30GY7B.mjs").then((mod) => mod.default),
|
|
680
|
+
upgrade: () => import("./upgrade-BBOEVIRa.mjs").then((mod) => mod.default),
|
|
681
|
+
skills: () => import("./skills-DxrO7HUz.mjs").then((mod) => mod.default)
|
|
679
682
|
}
|
|
680
683
|
});
|
|
681
684
|
setMetabaseAugment(main, {
|
|
@@ -693,6 +696,551 @@ setMetabaseAugment(main, {
|
|
|
693
696
|
requires: null
|
|
694
697
|
});
|
|
695
698
|
//#endregion
|
|
699
|
+
//#region ../client/src/json.ts
|
|
700
|
+
const JSON_CONTENT_TYPE = "application/json";
|
|
701
|
+
function parseJson(input, schema, opts = {}) {
|
|
702
|
+
const result = parseJsonResult(input, schema, opts);
|
|
703
|
+
if (!result.ok) throw result.error;
|
|
704
|
+
return result.value;
|
|
705
|
+
}
|
|
706
|
+
function parseJsonResult(input, schema, opts = {}) {
|
|
707
|
+
const sourcePrefix = opts.source === void 0 ? "" : `${opts.source}: `;
|
|
708
|
+
let raw;
|
|
709
|
+
try {
|
|
710
|
+
raw = JSON.parse(input);
|
|
711
|
+
} catch (error) {
|
|
712
|
+
return {
|
|
713
|
+
ok: false,
|
|
714
|
+
error: new ConfigError(`${sourcePrefix}invalid JSON: ${errorMessage(error)}`)
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
const parsed = schema.safeParse(raw);
|
|
718
|
+
if (!parsed.success) return {
|
|
719
|
+
ok: false,
|
|
720
|
+
error: new ValidationError(`${sourcePrefix}value did not match expected schema`, {
|
|
721
|
+
source: opts.source ?? "<input>",
|
|
722
|
+
zodIssues: parsed.error.issues
|
|
723
|
+
})
|
|
724
|
+
};
|
|
725
|
+
return {
|
|
726
|
+
ok: true,
|
|
727
|
+
value: parsed.data
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
function parseJsonOrPlain(text, contentType, schema, opts = {}) {
|
|
731
|
+
if (!isJsonContentType(contentType)) return parseJson(JSON.stringify(text), schema, opts);
|
|
732
|
+
const attempt = parseJsonResult(text, schema, opts);
|
|
733
|
+
if (attempt.ok) return attempt.value;
|
|
734
|
+
if (attempt.error instanceof ValidationError) throw attempt.error;
|
|
735
|
+
return parseJson(JSON.stringify(text), schema, opts);
|
|
736
|
+
}
|
|
737
|
+
function isJsonContentType(contentType) {
|
|
738
|
+
return contentType !== null && contentType.includes("application/json");
|
|
739
|
+
}
|
|
740
|
+
//#endregion
|
|
741
|
+
//#region ../client/src/predicates.ts
|
|
742
|
+
function isPlainObject(value) {
|
|
743
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
744
|
+
}
|
|
745
|
+
const JAVA_WHITESPACE = " \n\v\f\r \u2028\u2029 ";
|
|
746
|
+
const UNICODE_ESCAPE_DIGITS = 4;
|
|
747
|
+
function unicodeEscape(char) {
|
|
748
|
+
return `\\u${char.charCodeAt(0).toString(16).padStart(UNICODE_ESCAPE_DIGITS, "0")}`;
|
|
749
|
+
}
|
|
750
|
+
const JAVA_WHITESPACE_ESCAPED = [...JAVA_WHITESPACE].map(unicodeEscape).join("");
|
|
751
|
+
/** Matches a string Metabase reads as not blank: one holding a character that is not Java whitespace. */
|
|
752
|
+
const NOT_BLANK = new RegExp(`[^${JAVA_WHITESPACE_ESCAPED}]`);
|
|
753
|
+
/** Whether Metabase reads `value` as blank: empty, or Java whitespace only. */
|
|
754
|
+
function isBlank(value) {
|
|
755
|
+
return !NOT_BLANK.test(value);
|
|
756
|
+
}
|
|
757
|
+
//#endregion
|
|
758
|
+
//#region ../client/src/http/sanitize.ts
|
|
759
|
+
const SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
760
|
+
"authorization",
|
|
761
|
+
"x-api-key",
|
|
762
|
+
"x-metabase-session",
|
|
763
|
+
"cookie",
|
|
764
|
+
"set-cookie",
|
|
765
|
+
"proxy-authorization"
|
|
766
|
+
]);
|
|
767
|
+
const REDACTED = "[REDACTED]";
|
|
768
|
+
function redactHeaders(headers) {
|
|
769
|
+
const result = {};
|
|
770
|
+
const entries = headers instanceof Headers ? headers.entries() : Object.entries(headers);
|
|
771
|
+
for (const [key, value] of entries) result[key] = SECRET_HEADER_NAMES.has(key.toLowerCase()) ? REDACTED : value;
|
|
772
|
+
return result;
|
|
773
|
+
}
|
|
774
|
+
function redactBody(body, ctx) {
|
|
775
|
+
let result = body;
|
|
776
|
+
for (const secret of ctx.knownSecrets) {
|
|
777
|
+
if (secret.length === 0) continue;
|
|
778
|
+
result = result.replaceAll(secret, REDACTED);
|
|
779
|
+
}
|
|
780
|
+
return result;
|
|
781
|
+
}
|
|
782
|
+
const SERVER_ERROR_STATUSES_START = 500;
|
|
783
|
+
const SERVER_ERROR_STATUSES_END = 600;
|
|
784
|
+
const TEXT_CONTENT_TYPE = "text/plain";
|
|
785
|
+
const ROUTE_MISSING_LITERAL = "API endpoint does not exist.";
|
|
786
|
+
const RESOURCE_MISSING_LITERAL = "Not found.";
|
|
787
|
+
const STATUS_CLASSIFICATIONS = {
|
|
788
|
+
401: { retryable: false },
|
|
789
|
+
403: {
|
|
790
|
+
retryable: false,
|
|
791
|
+
message: "The request was refused (403): the signed-in user is not allowed to do this."
|
|
792
|
+
},
|
|
793
|
+
404: { retryable: false },
|
|
794
|
+
409: {
|
|
795
|
+
retryable: false,
|
|
796
|
+
message: "The request was refused (409): it conflicts with what already exists."
|
|
797
|
+
},
|
|
798
|
+
408: {
|
|
799
|
+
retryable: true,
|
|
800
|
+
message: "Metabase timed out responding."
|
|
801
|
+
},
|
|
802
|
+
425: { retryable: true },
|
|
803
|
+
429: {
|
|
804
|
+
retryable: true,
|
|
805
|
+
message: "Metabase rate-limited the request."
|
|
806
|
+
},
|
|
807
|
+
500: { retryable: true },
|
|
808
|
+
502: { retryable: true },
|
|
809
|
+
503: { retryable: true },
|
|
810
|
+
504: {
|
|
811
|
+
retryable: true,
|
|
812
|
+
message: "Metabase timed out responding."
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
const ErrorEnvelope = z.object({
|
|
816
|
+
message: z.string().optional(),
|
|
817
|
+
error: z.string().optional(),
|
|
818
|
+
"error-message": z.string().optional(),
|
|
819
|
+
via: z.array(z.object({ message: z.string().optional() }).loose()).optional(),
|
|
820
|
+
"specific-errors": z.unknown().optional(),
|
|
821
|
+
errors: z.unknown().optional(),
|
|
822
|
+
"error-code": z.string().optional(),
|
|
823
|
+
"non-remote-synced-models": z.unknown().optional(),
|
|
824
|
+
"remote-synced-models": z.unknown().optional()
|
|
825
|
+
}).loose();
|
|
826
|
+
const NonRemoteSyncedDependencies = z.array(z.number().int()).min(1);
|
|
827
|
+
const RemoteSyncedDependent = z.record(z.string(), z.number().int());
|
|
828
|
+
const RemoteSyncedDependents = z.array(RemoteSyncedDependent).min(1);
|
|
829
|
+
const MAX_LISTED_REMOTE_SYNC_ENTRIES = 20;
|
|
830
|
+
const REMOTE_SYNC_ENTRY_SEPARATOR = ", ";
|
|
831
|
+
const NON_REMOTE_SYNCED_REMEDY = "Move that content into a synced collection first, or move the collection that holds it.";
|
|
832
|
+
const REMOTE_SYNCED_REMEDY = "Update that content so it no longer uses this first, or move it out of sync along with this.";
|
|
833
|
+
const FieldErrorNodeSchema = z.lazy(() => z.union([
|
|
834
|
+
z.string(),
|
|
835
|
+
z.array(z.string()),
|
|
836
|
+
z.record(z.string(), FieldErrorNodeSchema)
|
|
837
|
+
]));
|
|
838
|
+
const FieldErrorTree = z.record(z.string(), FieldErrorNodeSchema);
|
|
839
|
+
const FIELD_MESSAGE_SEPARATOR = "; ";
|
|
840
|
+
const MAX_EXTRACTED_MESSAGE_LEN = 500;
|
|
841
|
+
const ELLIPSIS = "…";
|
|
842
|
+
const GOT_VALUE_PATTERN = /got: ((?:[^"\\]|\\.)*)/g;
|
|
843
|
+
const MAX_GOT_VALUE_LEN = 60;
|
|
844
|
+
var HttpError = class extends MetabaseError {
|
|
845
|
+
category = "http";
|
|
846
|
+
status;
|
|
847
|
+
kind;
|
|
848
|
+
serverMessage;
|
|
849
|
+
developerDetail;
|
|
850
|
+
constructor(input) {
|
|
851
|
+
const sanitizedBody = sanitizeBody(input.rawBody, input.redactionContext);
|
|
852
|
+
const redactedHeaders = redactHeaders(input.responseHeaders);
|
|
853
|
+
const kind = classifyKind(input.status, sanitizedBody, redactedHeaders);
|
|
854
|
+
const said = {
|
|
855
|
+
envelope: parseEnvelopeMessage(sanitizedBody),
|
|
856
|
+
text: plainTextMessage(sanitizedBody, redactedHeaders)
|
|
857
|
+
};
|
|
858
|
+
super(input.overrideUserMessage ?? buildUserMessage(kind, input, said));
|
|
859
|
+
const fields = extractEnvelopeViews(sanitizedBody);
|
|
860
|
+
this.name = "HttpError";
|
|
861
|
+
this.status = input.status;
|
|
862
|
+
this.kind = kind;
|
|
863
|
+
this.serverMessage = said.envelope ?? said.text;
|
|
864
|
+
this.developerDetail = {
|
|
865
|
+
status: input.status,
|
|
866
|
+
statusText: input.statusText,
|
|
867
|
+
method: input.method,
|
|
868
|
+
url: input.url,
|
|
869
|
+
responseHeaders: redactedHeaders,
|
|
870
|
+
body: sanitizedBody,
|
|
871
|
+
fieldErrors: fields.fieldErrors,
|
|
872
|
+
specificFieldErrors: fields.specificFieldErrors,
|
|
873
|
+
errorCode: fields.errorCode,
|
|
874
|
+
nonRemoteSyncedDependencies: fields.nonRemoteSyncedDependencies,
|
|
875
|
+
remoteSyncedDependents: fields.remoteSyncedDependents
|
|
876
|
+
};
|
|
877
|
+
}
|
|
878
|
+
get isRetryable() {
|
|
879
|
+
return isRetryableStatus(this.status);
|
|
880
|
+
}
|
|
881
|
+
get fieldErrors() {
|
|
882
|
+
return this.developerDetail.fieldErrors;
|
|
883
|
+
}
|
|
884
|
+
get specificFieldErrors() {
|
|
885
|
+
return this.developerDetail.specificFieldErrors;
|
|
886
|
+
}
|
|
887
|
+
get errorCode() {
|
|
888
|
+
return this.developerDetail.errorCode;
|
|
889
|
+
}
|
|
890
|
+
get nonRemoteSyncedDependencies() {
|
|
891
|
+
return this.developerDetail.nonRemoteSyncedDependencies;
|
|
892
|
+
}
|
|
893
|
+
get remoteSyncedDependents() {
|
|
894
|
+
return this.developerDetail.remoteSyncedDependents;
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
function chainRequestFailure(cause, message) {
|
|
898
|
+
if (cause instanceof HttpError) return new HttpError({
|
|
899
|
+
status: cause.status,
|
|
900
|
+
statusText: cause.developerDetail.statusText,
|
|
901
|
+
method: cause.developerDetail.method,
|
|
902
|
+
url: cause.developerDetail.url,
|
|
903
|
+
responseHeaders: cause.developerDetail.responseHeaders,
|
|
904
|
+
rawBody: cause.developerDetail.body,
|
|
905
|
+
overrideUserMessage: message
|
|
906
|
+
});
|
|
907
|
+
return new ChainedRequestError(message, cause);
|
|
908
|
+
}
|
|
909
|
+
function isRetryableStatus(status) {
|
|
910
|
+
return STATUS_CLASSIFICATIONS[status]?.retryable === true;
|
|
911
|
+
}
|
|
912
|
+
function sanitizeBody(rawBody, ctx) {
|
|
913
|
+
if (rawBody === null) return null;
|
|
914
|
+
if (ctx === void 0) return rawBody;
|
|
915
|
+
return redactBody(rawBody, ctx);
|
|
916
|
+
}
|
|
917
|
+
function classifyKind(status, sanitizedBody, redactedHeaders) {
|
|
918
|
+
if (status === 401) return "auth";
|
|
919
|
+
if (status === 403) return "forbidden";
|
|
920
|
+
if (status === 409) return "conflict";
|
|
921
|
+
if (status === 404) return isRouteMissingResponse(sanitizedBody, redactedHeaders) ? "route-missing" : "resource-missing";
|
|
922
|
+
if (status === 429) return "rate-limit";
|
|
923
|
+
if (status >= SERVER_ERROR_STATUSES_START && status < SERVER_ERROR_STATUSES_END) return "server-error";
|
|
924
|
+
return "generic";
|
|
925
|
+
}
|
|
926
|
+
function isRouteMissingResponse(sanitizedBody, redactedHeaders) {
|
|
927
|
+
if (sanitizedBody?.includes(ROUTE_MISSING_LITERAL)) return true;
|
|
928
|
+
if (sanitizedBody?.includes(RESOURCE_MISSING_LITERAL)) return false;
|
|
929
|
+
if (redactedHeaders["content-type"]?.includes("application/json")) return false;
|
|
930
|
+
if (sanitizedBody === null || sanitizedBody.trim() === "") return true;
|
|
931
|
+
return parseEnvelope(sanitizedBody) === null;
|
|
932
|
+
}
|
|
933
|
+
function buildUserMessage(kind, input, said) {
|
|
934
|
+
if (kind === "route-missing") return buildRouteMissingMessage(input);
|
|
935
|
+
if (kind === "resource-missing") return `Not found: ${input.method} ${pathFromUrl(input.url)}.`;
|
|
936
|
+
if (said.envelope !== null) return said.envelope;
|
|
937
|
+
if (kind === "auth") return `Invalid or unauthorized API key (host: ${hostFromUrl(input.url)}).`;
|
|
938
|
+
if (said.text !== null) return said.text;
|
|
939
|
+
return defaultMessageForStatus(input.status);
|
|
940
|
+
}
|
|
941
|
+
function plainTextMessage(sanitizedBody, redactedHeaders) {
|
|
942
|
+
if (sanitizedBody === null || !redactedHeaders["content-type"]?.includes(TEXT_CONTENT_TYPE)) return null;
|
|
943
|
+
const trimmed = sanitizedBody.trim();
|
|
944
|
+
return trimmed === "" ? null : condenseMessage(trimmed);
|
|
945
|
+
}
|
|
946
|
+
function buildRouteMissingMessage(input) {
|
|
947
|
+
const path = pathFromUrl(input.url);
|
|
948
|
+
if (!input.serverTag) return `This endpoint is not available on the connected Metabase: ${input.method} ${path}.`;
|
|
949
|
+
return `This endpoint is not available on Metabase ${input.serverTag}: ${input.method} ${path}. It may require a newer Metabase major version.`;
|
|
950
|
+
}
|
|
951
|
+
function pathFromUrl(url) {
|
|
952
|
+
const parsed = new URL(url);
|
|
953
|
+
return parsed.pathname + parsed.search;
|
|
954
|
+
}
|
|
955
|
+
function hostFromUrl(url) {
|
|
956
|
+
return new URL(url).host;
|
|
957
|
+
}
|
|
958
|
+
function parseEnvelope(sanitizedBody) {
|
|
959
|
+
if (!sanitizedBody) return null;
|
|
960
|
+
const result = parseJsonResult(sanitizedBody, ErrorEnvelope);
|
|
961
|
+
return result.ok ? result.value : null;
|
|
962
|
+
}
|
|
963
|
+
const NO_ENVELOPE_VIEWS = {
|
|
964
|
+
fieldErrors: null,
|
|
965
|
+
specificFieldErrors: null,
|
|
966
|
+
errorCode: null,
|
|
967
|
+
nonRemoteSyncedDependencies: null,
|
|
968
|
+
remoteSyncedDependents: null
|
|
969
|
+
};
|
|
970
|
+
function extractEnvelopeViews(sanitizedBody) {
|
|
971
|
+
const envelope = parseEnvelope(sanitizedBody);
|
|
972
|
+
if (envelope === null) return NO_ENVELOPE_VIEWS;
|
|
973
|
+
return {
|
|
974
|
+
fieldErrors: parseFieldErrors(envelope.errors),
|
|
975
|
+
specificFieldErrors: parseFieldErrors(envelope["specific-errors"]),
|
|
976
|
+
errorCode: envelope["error-code"] ?? null,
|
|
977
|
+
nonRemoteSyncedDependencies: parseOrNull(NonRemoteSyncedDependencies, envelope["non-remote-synced-models"]),
|
|
978
|
+
remoteSyncedDependents: parseOrNull(RemoteSyncedDependents, envelope["remote-synced-models"])
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
function parseOrNull(schema, value) {
|
|
982
|
+
const parsed = schema.safeParse(value);
|
|
983
|
+
return parsed.success ? parsed.data : null;
|
|
984
|
+
}
|
|
985
|
+
function parseFieldErrors(value) {
|
|
986
|
+
const parsed = FieldErrorTree.safeParse(value);
|
|
987
|
+
if (!parsed.success) return null;
|
|
988
|
+
const entries = collectLeafEntries(parsed.data, []);
|
|
989
|
+
if (entries.length === 0) return null;
|
|
990
|
+
return Object.fromEntries(entries.map((entry) => [entry.path, entry.message]));
|
|
991
|
+
}
|
|
992
|
+
function parseEnvelopeMessage(sanitizedBody) {
|
|
993
|
+
const envelope = parseEnvelope(sanitizedBody);
|
|
994
|
+
if (envelope === null) return null;
|
|
995
|
+
const topLevel = envelope.message ?? envelope.error ?? envelope["error-message"];
|
|
996
|
+
if (topLevel) return appendRemoteSyncConflict(condenseMessage(topLevel), envelope);
|
|
997
|
+
const viaMessage = envelope.via?.find((entry) => entry.message)?.message;
|
|
998
|
+
if (viaMessage) return condenseMessage(viaMessage);
|
|
999
|
+
const specific = formatErrorTree(envelope["specific-errors"]);
|
|
1000
|
+
if (specific) return condenseMessage(specific);
|
|
1001
|
+
const generic = formatErrorTree(envelope.errors);
|
|
1002
|
+
if (generic) return condenseMessage(generic);
|
|
1003
|
+
return null;
|
|
1004
|
+
}
|
|
1005
|
+
function appendRemoteSyncConflict(message, envelope) {
|
|
1006
|
+
const dependencies = parseOrNull(NonRemoteSyncedDependencies, envelope["non-remote-synced-models"]);
|
|
1007
|
+
if (dependencies !== null) {
|
|
1008
|
+
const ids = listRemoteSyncEntries(dependencies.map(String));
|
|
1009
|
+
return `${withoutTrailingPeriod(message)}: ids ${ids}. ${NON_REMOTE_SYNCED_REMEDY}`;
|
|
1010
|
+
}
|
|
1011
|
+
const dependents = parseOrNull(RemoteSyncedDependents, envelope["remote-synced-models"]);
|
|
1012
|
+
if (dependents !== null) {
|
|
1013
|
+
const named = listRemoteSyncEntries([...new Set(dependents.map(formatRemoteSyncedDependent))]);
|
|
1014
|
+
return `${withoutTrailingPeriod(message)}: ${named}. ${REMOTE_SYNCED_REMEDY}`;
|
|
1015
|
+
}
|
|
1016
|
+
return message;
|
|
1017
|
+
}
|
|
1018
|
+
function formatRemoteSyncedDependent(dependent) {
|
|
1019
|
+
return Object.entries(dependent).map(([model, id]) => `${model} ${id}`).join(" / ");
|
|
1020
|
+
}
|
|
1021
|
+
function listRemoteSyncEntries(entries) {
|
|
1022
|
+
const listed = entries.slice(0, MAX_LISTED_REMOTE_SYNC_ENTRIES).join(REMOTE_SYNC_ENTRY_SEPARATOR);
|
|
1023
|
+
const unlisted = entries.length - MAX_LISTED_REMOTE_SYNC_ENTRIES;
|
|
1024
|
+
return unlisted > 0 ? `${listed}${REMOTE_SYNC_ENTRY_SEPARATOR}and ${unlisted} more` : listed;
|
|
1025
|
+
}
|
|
1026
|
+
function withoutTrailingPeriod(message) {
|
|
1027
|
+
return message.endsWith(".") ? message.slice(0, -1) : message;
|
|
1028
|
+
}
|
|
1029
|
+
function formatErrorTree(value) {
|
|
1030
|
+
const entries = collectLeafEntries(value, []);
|
|
1031
|
+
if (entries.length === 0) return null;
|
|
1032
|
+
return entries.map(formatLeafEntry).join(FIELD_MESSAGE_SEPARATOR);
|
|
1033
|
+
}
|
|
1034
|
+
function formatLeafEntry(entry) {
|
|
1035
|
+
return entry.path === "" ? entry.message : `${entry.path}: ${entry.message}`;
|
|
1036
|
+
}
|
|
1037
|
+
function collectLeafEntries(value, path) {
|
|
1038
|
+
if (typeof value === "string") {
|
|
1039
|
+
const trimmed = value.trim();
|
|
1040
|
+
return trimmed === "" ? [] : [{
|
|
1041
|
+
path: path.join("."),
|
|
1042
|
+
message: trimmed
|
|
1043
|
+
}];
|
|
1044
|
+
}
|
|
1045
|
+
if (Array.isArray(value)) {
|
|
1046
|
+
const messages = value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
|
|
1047
|
+
if (messages.length === 0) return [];
|
|
1048
|
+
return [{
|
|
1049
|
+
path: path.join("."),
|
|
1050
|
+
message: messages.join(FIELD_MESSAGE_SEPARATOR)
|
|
1051
|
+
}];
|
|
1052
|
+
}
|
|
1053
|
+
if (isPlainObject(value)) return Object.entries(value).flatMap(([key, child]) => collectLeafEntries(child, [...path, key]));
|
|
1054
|
+
return [];
|
|
1055
|
+
}
|
|
1056
|
+
function condenseMessage(message) {
|
|
1057
|
+
const trimmed = message.replace(GOT_VALUE_PATTERN, trimGotValue);
|
|
1058
|
+
if (trimmed.length <= MAX_EXTRACTED_MESSAGE_LEN) return trimmed;
|
|
1059
|
+
return trimmed.slice(0, MAX_EXTRACTED_MESSAGE_LEN - 1) + ELLIPSIS;
|
|
1060
|
+
}
|
|
1061
|
+
function trimGotValue(match, value) {
|
|
1062
|
+
if (value.length <= MAX_GOT_VALUE_LEN) return match;
|
|
1063
|
+
return `got: ${value.slice(0, MAX_GOT_VALUE_LEN)}${ELLIPSIS}`;
|
|
1064
|
+
}
|
|
1065
|
+
function defaultMessageForStatus(status) {
|
|
1066
|
+
return STATUS_CLASSIFICATIONS[status]?.message ?? `Metabase returned ${status}.`;
|
|
1067
|
+
}
|
|
1068
|
+
//#endregion
|
|
1069
|
+
//#region ../client/src/version/features.ts
|
|
1070
|
+
const FEATURE_RULES = {
|
|
1071
|
+
transforms: { since: 59 },
|
|
1072
|
+
transformJobActivation: { since: 61 },
|
|
1073
|
+
measures: { since: 59 },
|
|
1074
|
+
library: {
|
|
1075
|
+
since: 59,
|
|
1076
|
+
tokenFeature: "library"
|
|
1077
|
+
},
|
|
1078
|
+
remoteSync: {
|
|
1079
|
+
since: 58,
|
|
1080
|
+
tokenFeature: "remote_sync"
|
|
1081
|
+
},
|
|
1082
|
+
remoteSyncRemoteChanges: {
|
|
1083
|
+
since: 59,
|
|
1084
|
+
tokenFeature: "remote_sync"
|
|
1085
|
+
},
|
|
1086
|
+
remoteSyncCollectionsOnlyUpdate: { since: 60 },
|
|
1087
|
+
remoteSyncExportPreflight: {
|
|
1088
|
+
since: 63,
|
|
1089
|
+
tokenFeature: "remote_sync"
|
|
1090
|
+
},
|
|
1091
|
+
remoteSyncBranchGuard: { since: 63 },
|
|
1092
|
+
remoteSyncMerge: {
|
|
1093
|
+
since: 63,
|
|
1094
|
+
tokenFeature: "remote_sync"
|
|
1095
|
+
},
|
|
1096
|
+
contentTranslation: {
|
|
1097
|
+
since: 58,
|
|
1098
|
+
tokenFeature: "content_translation"
|
|
1099
|
+
},
|
|
1100
|
+
contentVerification: {
|
|
1101
|
+
since: 58,
|
|
1102
|
+
tokenFeature: "content_verification"
|
|
1103
|
+
},
|
|
1104
|
+
transformTargetTableId: { since: 61 },
|
|
1105
|
+
transformTargetTableLinkedOnCreate: {
|
|
1106
|
+
since: 61,
|
|
1107
|
+
until: 61
|
|
1108
|
+
},
|
|
1109
|
+
transformJobRunIdIsNumeric: { since: 64 },
|
|
1110
|
+
transformCheckpointReset: { since: 60 },
|
|
1111
|
+
fieldDataSensitivity: { since: 64 },
|
|
1112
|
+
fieldRemappingAppendsDisplayColumns: {
|
|
1113
|
+
since: 58,
|
|
1114
|
+
until: 59
|
|
1115
|
+
},
|
|
1116
|
+
transformDagRuns: { since: 64 },
|
|
1117
|
+
unifiedTransformRuns: { since: 64 },
|
|
1118
|
+
transformTests: {
|
|
1119
|
+
since: 65,
|
|
1120
|
+
tokenFeature: "transforms-testing"
|
|
1121
|
+
},
|
|
1122
|
+
libraryChildrenCarryType: { since: 62 },
|
|
1123
|
+
collectionItemsTotalOnEmptyPage: { since: 64 },
|
|
1124
|
+
invalidMbqlIsBadRequest: { since: 59 },
|
|
1125
|
+
boxplotDisplay: { since: 59 },
|
|
1126
|
+
nativeTableTemplateTag: { since: 59 },
|
|
1127
|
+
smartLinkMeasureModel: { since: 60 },
|
|
1128
|
+
dashboardSubscriptionFilters: {
|
|
1129
|
+
since: 58,
|
|
1130
|
+
tokenFeature: "dashboard_subscription_filters"
|
|
1131
|
+
},
|
|
1132
|
+
dependencyGraph: {
|
|
1133
|
+
since: 58,
|
|
1134
|
+
tokenFeature: "dependencies"
|
|
1135
|
+
},
|
|
1136
|
+
dependencyItemListings: {
|
|
1137
|
+
since: 59,
|
|
1138
|
+
tokenFeature: "dependencies"
|
|
1139
|
+
},
|
|
1140
|
+
dependencyAsyncBackfill: {
|
|
1141
|
+
since: 60,
|
|
1142
|
+
tokenFeature: "dependencies"
|
|
1143
|
+
},
|
|
1144
|
+
measureDependencyGraph: { since: 59 },
|
|
1145
|
+
tableListAccessFilters: { since: 59 },
|
|
1146
|
+
tableListTransformTargets: { since: 60 },
|
|
1147
|
+
tableListPublishedFilter: { since: 63 },
|
|
1148
|
+
tableUnusedFilter: {
|
|
1149
|
+
since: 58,
|
|
1150
|
+
tokenFeature: "dependencies"
|
|
1151
|
+
},
|
|
1152
|
+
tableDataLayerTiers: { since: 59 },
|
|
1153
|
+
bulkTableEdit: { since: 59 },
|
|
1154
|
+
tableUserValueWithdrawal: { since: 64 },
|
|
1155
|
+
bulkTableSync: { since: 59 },
|
|
1156
|
+
erd: {
|
|
1157
|
+
since: 62,
|
|
1158
|
+
tokenFeature: "schema-viewer"
|
|
1159
|
+
},
|
|
1160
|
+
documentCopy: { since: 59 },
|
|
1161
|
+
transformInspector: {
|
|
1162
|
+
since: 60,
|
|
1163
|
+
tokenFeature: "transforms-python"
|
|
1164
|
+
},
|
|
1165
|
+
pythonLibrary: {
|
|
1166
|
+
since: 58,
|
|
1167
|
+
tokenFeature: "transforms-python"
|
|
1168
|
+
},
|
|
1169
|
+
pythonTestRun: {
|
|
1170
|
+
since: 60,
|
|
1171
|
+
tokenFeature: "transforms-python"
|
|
1172
|
+
},
|
|
1173
|
+
sourceReplacement: {
|
|
1174
|
+
since: 60,
|
|
1175
|
+
tokenFeature: "dependencies"
|
|
1176
|
+
},
|
|
1177
|
+
metricDefinitionQuery: { since: 60 },
|
|
1178
|
+
metricDimensionListing: { since: 64 },
|
|
1179
|
+
oauthFullAccessScopeUnadvertised: { since: 64 },
|
|
1180
|
+
exportCsvByteOrderMark: { since: 63 }
|
|
1181
|
+
};
|
|
1182
|
+
function isFeatureName(name) {
|
|
1183
|
+
return Object.hasOwn(FEATURE_RULES, name);
|
|
1184
|
+
}
|
|
1185
|
+
const FEATURE_NAMES = Object.keys(FEATURE_RULES).filter(isFeatureName);
|
|
1186
|
+
const Features = z.record(z.enum(FEATURE_NAMES), z.boolean());
|
|
1187
|
+
function evaluateFeatures(major, tokenFeatures) {
|
|
1188
|
+
const entries = FEATURE_NAMES.map((name) => [name, ruleHolds(FEATURE_RULES[name], major, tokenFeatures)]);
|
|
1189
|
+
return Features.parse(Object.fromEntries(entries));
|
|
1190
|
+
}
|
|
1191
|
+
function ruleHolds(rule, major, tokenFeatures) {
|
|
1192
|
+
return ruleGap(rule, major, tokenFeatures) === null;
|
|
1193
|
+
}
|
|
1194
|
+
function ruleGap(rule, major, tokenFeatures) {
|
|
1195
|
+
if (!versionHolds(rule, major)) return { kind: "version" };
|
|
1196
|
+
if (rule.tokenFeature === void 0) return null;
|
|
1197
|
+
return tokenFeatures !== null && tokenFeatures[rule.tokenFeature] === true ? null : {
|
|
1198
|
+
kind: "token",
|
|
1199
|
+
tokenFeature: rule.tokenFeature
|
|
1200
|
+
};
|
|
1201
|
+
}
|
|
1202
|
+
function versionHolds(rule, major) {
|
|
1203
|
+
if (major === "development") return rule.until === void 0;
|
|
1204
|
+
return major >= rule.since && (rule.until === void 0 || major <= rule.until);
|
|
1205
|
+
}
|
|
1206
|
+
//#endregion
|
|
1207
|
+
//#region ../client/src/version/capability-error.ts
|
|
1208
|
+
const RequirementReason = z.enum([
|
|
1209
|
+
"version-too-old",
|
|
1210
|
+
"missing-token-feature",
|
|
1211
|
+
"superseded-by-feature"
|
|
1212
|
+
]);
|
|
1213
|
+
const RequirementFailure = z.object({
|
|
1214
|
+
reason: RequirementReason,
|
|
1215
|
+
detail: z.string(),
|
|
1216
|
+
feature: z.enum(FEATURE_NAMES),
|
|
1217
|
+
since: z.number().int(),
|
|
1218
|
+
tokenFeature: z.string().nullable(),
|
|
1219
|
+
serverVersion: z.string()
|
|
1220
|
+
});
|
|
1221
|
+
function versionTooOldMessage(since, serverVersion) {
|
|
1222
|
+
return `This operation requires Metabase v${since}+ (this server is ${serverVersion}). Upgrade Metabase to use it.`;
|
|
1223
|
+
}
|
|
1224
|
+
function missingTokenFeatureMessage(tokenFeature) {
|
|
1225
|
+
return `This operation requires the '${tokenFeature}' premium feature (not enabled on this server).`;
|
|
1226
|
+
}
|
|
1227
|
+
var CapabilityError = class extends MetabaseError {
|
|
1228
|
+
category = "capability";
|
|
1229
|
+
isRetryable = false;
|
|
1230
|
+
developerDetail;
|
|
1231
|
+
constructor(failure, refusal = null) {
|
|
1232
|
+
super(capabilityMessage(failure, refusal), refusal === null ? void 0 : { cause: refusal });
|
|
1233
|
+
this.name = "CapabilityError";
|
|
1234
|
+
this.developerDetail = failure;
|
|
1235
|
+
}
|
|
1236
|
+
};
|
|
1237
|
+
function capabilityMessage(failure, refusal) {
|
|
1238
|
+
if (refusal === null || refusal.status !== 400) return failure.detail;
|
|
1239
|
+
const said = refusal.serverMessage;
|
|
1240
|
+
if (said === null) return failure.detail;
|
|
1241
|
+
return `${failure.detail}\nMetabase answered ${refusal.status}: ${said}`;
|
|
1242
|
+
}
|
|
1243
|
+
//#endregion
|
|
696
1244
|
//#region src/core/profile-refreshed-error.ts
|
|
697
1245
|
var ProfileRefreshedError = class extends MetabaseError {
|
|
698
1246
|
category;
|
|
@@ -742,6 +1290,17 @@ function legacyEnvWarning(canonical) {
|
|
|
742
1290
|
function warn(message) {
|
|
743
1291
|
process.stderr.write(message + "\n");
|
|
744
1292
|
}
|
|
1293
|
+
const PREFLIGHT_RISK = "may ignore or rewrite what it does not support and answer without saying so";
|
|
1294
|
+
const PREFLIGHT_SKIP_REMEDY = `If this server does support it, rerun with --skip-preflight; a server without it ${PREFLIGHT_RISK}.`;
|
|
1295
|
+
function preflightSkippedNotice(refusal) {
|
|
1296
|
+
return `Skipped preflight: ${withoutFinalPeriod(refusal)}. A server without it ${PREFLIGHT_RISK}.`;
|
|
1297
|
+
}
|
|
1298
|
+
function preflightUncheckedNotice(reason) {
|
|
1299
|
+
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}.`;
|
|
1300
|
+
}
|
|
1301
|
+
function withoutFinalPeriod(text) {
|
|
1302
|
+
return text.endsWith(".") ? text.slice(0, -1) : text;
|
|
1303
|
+
}
|
|
745
1304
|
const LIST_TRUNCATION_REMEDY = "narrow the selection or raise --max-bytes";
|
|
746
1305
|
function listTruncationNotice(bytes, nextOffset, hint) {
|
|
747
1306
|
return `… cut at ${bytes} bytes; ${typeof nextOffset === "number" ? `continue with --offset ${nextOffset}, ` : ""}${hint ?? LIST_TRUNCATION_REMEDY}`;
|
|
@@ -844,23 +1403,6 @@ function jsonByteLength(value) {
|
|
|
844
1403
|
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
845
1404
|
}
|
|
846
1405
|
//#endregion
|
|
847
|
-
//#region ../client/src/predicates.ts
|
|
848
|
-
function isPlainObject(value) {
|
|
849
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
850
|
-
}
|
|
851
|
-
const JAVA_WHITESPACE = " \n\v\f\r \u2028\u2029 ";
|
|
852
|
-
const UNICODE_ESCAPE_DIGITS = 4;
|
|
853
|
-
function unicodeEscape(char) {
|
|
854
|
-
return `\\u${char.charCodeAt(0).toString(16).padStart(UNICODE_ESCAPE_DIGITS, "0")}`;
|
|
855
|
-
}
|
|
856
|
-
const JAVA_WHITESPACE_ESCAPED = [...JAVA_WHITESPACE].map(unicodeEscape).join("");
|
|
857
|
-
/** Matches a string Metabase reads as not blank: one holding a character that is not Java whitespace. */
|
|
858
|
-
const NOT_BLANK = new RegExp(`[^${JAVA_WHITESPACE_ESCAPED}]`);
|
|
859
|
-
/** Whether Metabase reads `value` as blank: empty, or Java whitespace only. */
|
|
860
|
-
function isBlank(value) {
|
|
861
|
-
return !NOT_BLANK.test(value);
|
|
862
|
-
}
|
|
863
|
-
//#endregion
|
|
864
1406
|
//#region src/output/projection.ts
|
|
865
1407
|
function projectForList(item, view, opts) {
|
|
866
1408
|
const full = opts.format === "text" && opts.fields === void 0 ? false : opts.full;
|
|
@@ -980,23 +1522,18 @@ function writeText(text) {
|
|
|
980
1522
|
process.stdout.write(text + "\n");
|
|
981
1523
|
}
|
|
982
1524
|
function renderItem(item, view, opts) {
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
return renderItemBody(item, view, applyProjection(item, view, opts.full, opts.fields), opts) + "\n";
|
|
1525
|
+
const body = renderItemBody(item, view, applyProjection(item, view, opts.full, opts.fields), opts) + "\n";
|
|
1526
|
+
assertItemWithinMaxBytes(body, opts);
|
|
1527
|
+
process.stdout.write(body);
|
|
987
1528
|
}
|
|
988
1529
|
function renderSummary(item, view, summaryText, opts) {
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
const
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
}
|
|
997
|
-
function summaryBody(item, view, summaryText, opts) {
|
|
998
|
-
if (opts.format === "json" || opts.fields !== void 0 || opts.full) return itemBody(item, view, opts);
|
|
999
|
-
return (typeof summaryText === "function" ? summaryText() : summaryText) + "\n";
|
|
1530
|
+
if (opts.format === "json" || opts.fields !== void 0 || opts.full) {
|
|
1531
|
+
renderItem(item, view, opts);
|
|
1532
|
+
return;
|
|
1533
|
+
}
|
|
1534
|
+
const body = (typeof summaryText === "function" ? summaryText() : summaryText) + "\n";
|
|
1535
|
+
assertItemWithinMaxBytes(body, opts);
|
|
1536
|
+
process.stdout.write(body);
|
|
1000
1537
|
}
|
|
1001
1538
|
function renderList(envelope, view, opts) {
|
|
1002
1539
|
renderListWithExtras(envelope, {}, view, opts);
|
|
@@ -1075,16 +1612,11 @@ function renderKeyValueLines(pairs) {
|
|
|
1075
1612
|
const padding = Math.max(...pairs.map(([label]) => label.length));
|
|
1076
1613
|
return pairs.map(([label, value]) => `${label.padEnd(padding)} ${value}`).join("\n");
|
|
1077
1614
|
}
|
|
1078
|
-
function
|
|
1079
|
-
|
|
1080
|
-
if (oversize !== null) throw new ConfigError(oversize);
|
|
1081
|
-
process.stdout.write(body);
|
|
1082
|
-
}
|
|
1083
|
-
function oversizeMessage(body, opts) {
|
|
1084
|
-
if (opts.maxBytes <= 0) return null;
|
|
1615
|
+
function assertItemWithinMaxBytes(body, opts) {
|
|
1616
|
+
if (opts.maxBytes <= 0) return;
|
|
1085
1617
|
const bytes = Buffer.byteLength(body, "utf8");
|
|
1086
|
-
if (bytes <= opts.maxBytes) return
|
|
1087
|
-
|
|
1618
|
+
if (bytes <= opts.maxBytes) return;
|
|
1619
|
+
throw new ConfigError(itemOversizeMessage(bytes, opts.maxBytes, opts.oversizeHint));
|
|
1088
1620
|
}
|
|
1089
1621
|
//#endregion
|
|
1090
1622
|
//#region src/output/error.ts
|
|
@@ -1103,9 +1635,9 @@ function exitCodeFor(category) {
|
|
|
1103
1635
|
case "http":
|
|
1104
1636
|
case "validation":
|
|
1105
1637
|
case "response-shape":
|
|
1638
|
+
case "partial-write":
|
|
1106
1639
|
case "timeout":
|
|
1107
1640
|
case "internal":
|
|
1108
|
-
case "failed":
|
|
1109
1641
|
case "unknown": return FAILURE_EXIT_CODE;
|
|
1110
1642
|
}
|
|
1111
1643
|
}
|
|
@@ -1124,11 +1656,15 @@ function isVersionTooOld(detail) {
|
|
|
1124
1656
|
function isRouteMissing(handled) {
|
|
1125
1657
|
return "kind" in handled && handled.kind === ROUTE_MISSING_KIND;
|
|
1126
1658
|
}
|
|
1659
|
+
function isRefusedBeforeSending(handled) {
|
|
1660
|
+
return handled instanceof CapabilityError && handled.cause === void 0;
|
|
1661
|
+
}
|
|
1127
1662
|
function remediesFor(handled) {
|
|
1128
1663
|
if (handled instanceof ProfileRefreshedError) return [];
|
|
1129
|
-
if (isVersionTooOld(handled.developerDetail)) return [DOWNGRADE_REMEDY];
|
|
1130
1664
|
if (isRouteMissing(handled)) return [ROUTE_MISSING_REMEDY];
|
|
1131
|
-
|
|
1665
|
+
const downgrade = isVersionTooOld(handled.developerDetail) ? [DOWNGRADE_REMEDY] : [];
|
|
1666
|
+
const skip = isRefusedBeforeSending(handled) ? [PREFLIGHT_SKIP_REMEDY] : [];
|
|
1667
|
+
return [...downgrade, ...skip];
|
|
1132
1668
|
}
|
|
1133
1669
|
function writeTextError(handled, verbose) {
|
|
1134
1670
|
process.stderr.write(handled.userMessage + "\n");
|
|
@@ -1154,143 +1690,6 @@ function writeJsonError(handled, exitCode, verbose) {
|
|
|
1154
1690
|
process.stderr.write(serializeJson(envelope, stderrPretty()) + "\n");
|
|
1155
1691
|
}
|
|
1156
1692
|
//#endregion
|
|
1157
|
-
//#region ../client/src/version/features.ts
|
|
1158
|
-
const FEATURE_RULES = {
|
|
1159
|
-
transforms: { since: 59 },
|
|
1160
|
-
transformJobActivation: { since: 61 },
|
|
1161
|
-
measures: { since: 59 },
|
|
1162
|
-
library: {
|
|
1163
|
-
since: 59,
|
|
1164
|
-
tokenFeature: "library"
|
|
1165
|
-
},
|
|
1166
|
-
remoteSync: {
|
|
1167
|
-
since: 60,
|
|
1168
|
-
tokenFeature: "remote_sync"
|
|
1169
|
-
},
|
|
1170
|
-
remoteSyncExportPreflight: {
|
|
1171
|
-
since: 63,
|
|
1172
|
-
tokenFeature: "remote_sync"
|
|
1173
|
-
},
|
|
1174
|
-
remoteSyncBranchGuard: { since: 63 },
|
|
1175
|
-
remoteSyncMerge: {
|
|
1176
|
-
since: 63,
|
|
1177
|
-
tokenFeature: "remote_sync"
|
|
1178
|
-
},
|
|
1179
|
-
contentTranslation: {
|
|
1180
|
-
since: 58,
|
|
1181
|
-
tokenFeature: "content_translation"
|
|
1182
|
-
},
|
|
1183
|
-
contentVerification: {
|
|
1184
|
-
since: 58,
|
|
1185
|
-
tokenFeature: "content_verification"
|
|
1186
|
-
},
|
|
1187
|
-
transformTargetTableId: { since: 61 },
|
|
1188
|
-
transformTargetTableLinkedOnCreate: {
|
|
1189
|
-
since: 61,
|
|
1190
|
-
until: 61
|
|
1191
|
-
},
|
|
1192
|
-
transformJobRunIdIsNumeric: { since: 64 },
|
|
1193
|
-
transformCheckpointReset: { since: 60 },
|
|
1194
|
-
fieldDataSensitivity: { since: 64 },
|
|
1195
|
-
fieldRemappingAppendsDisplayColumns: {
|
|
1196
|
-
since: 58,
|
|
1197
|
-
until: 59
|
|
1198
|
-
},
|
|
1199
|
-
transformDagRuns: { since: 64 },
|
|
1200
|
-
unifiedTransformRuns: { since: 64 },
|
|
1201
|
-
transformTests: {
|
|
1202
|
-
since: 65,
|
|
1203
|
-
tokenFeature: "transforms-testing"
|
|
1204
|
-
},
|
|
1205
|
-
libraryChildrenCarryType: { since: 62 },
|
|
1206
|
-
collectionItemsTotalOnEmptyPage: { since: 64 },
|
|
1207
|
-
invalidMbqlIsBadRequest: { since: 59 },
|
|
1208
|
-
boxplotDisplay: { since: 59 },
|
|
1209
|
-
nativeTableTemplateTag: { since: 59 },
|
|
1210
|
-
compiledQueryOmitsCollection: {
|
|
1211
|
-
since: 59,
|
|
1212
|
-
until: 62
|
|
1213
|
-
},
|
|
1214
|
-
smartLinkMeasureModel: { since: 60 },
|
|
1215
|
-
dashboardSubscriptionFilters: {
|
|
1216
|
-
since: 58,
|
|
1217
|
-
tokenFeature: "dashboard_subscription_filters"
|
|
1218
|
-
},
|
|
1219
|
-
dependencyGraph: {
|
|
1220
|
-
since: 58,
|
|
1221
|
-
tokenFeature: "dependencies"
|
|
1222
|
-
},
|
|
1223
|
-
dependencyItemListings: {
|
|
1224
|
-
since: 59,
|
|
1225
|
-
tokenFeature: "dependencies"
|
|
1226
|
-
},
|
|
1227
|
-
dependencyAsyncBackfill: {
|
|
1228
|
-
since: 60,
|
|
1229
|
-
tokenFeature: "dependencies"
|
|
1230
|
-
},
|
|
1231
|
-
measureDependencyGraph: { since: 59 },
|
|
1232
|
-
tableListAccessFilters: { since: 59 },
|
|
1233
|
-
tableListTransformTargets: { since: 60 },
|
|
1234
|
-
tableListPublishedFilter: { since: 63 },
|
|
1235
|
-
tableUnusedFilter: {
|
|
1236
|
-
since: 58,
|
|
1237
|
-
tokenFeature: "dependencies"
|
|
1238
|
-
},
|
|
1239
|
-
tableDataLayerTiers: { since: 59 },
|
|
1240
|
-
bulkTableEdit: { since: 59 },
|
|
1241
|
-
tableUserValueWithdrawal: { since: 64 },
|
|
1242
|
-
bulkTableSync: { since: 59 },
|
|
1243
|
-
erd: {
|
|
1244
|
-
since: 62,
|
|
1245
|
-
tokenFeature: "schema-viewer"
|
|
1246
|
-
},
|
|
1247
|
-
documentCopy: { since: 59 },
|
|
1248
|
-
transformInspector: {
|
|
1249
|
-
since: 60,
|
|
1250
|
-
tokenFeature: "transforms-python"
|
|
1251
|
-
},
|
|
1252
|
-
pythonLibrary: {
|
|
1253
|
-
since: 58,
|
|
1254
|
-
tokenFeature: "transforms-python"
|
|
1255
|
-
},
|
|
1256
|
-
pythonTestRun: {
|
|
1257
|
-
since: 60,
|
|
1258
|
-
tokenFeature: "transforms-python"
|
|
1259
|
-
},
|
|
1260
|
-
sourceReplacement: {
|
|
1261
|
-
since: 60,
|
|
1262
|
-
tokenFeature: "dependencies"
|
|
1263
|
-
},
|
|
1264
|
-
metricDefinitionQuery: { since: 60 },
|
|
1265
|
-
metricDimensionListing: { since: 64 },
|
|
1266
|
-
oauthFullAccessScope: { since: 63 },
|
|
1267
|
-
exportCsvByteOrderMark: { since: 63 }
|
|
1268
|
-
};
|
|
1269
|
-
function isFeatureName(name) {
|
|
1270
|
-
return Object.hasOwn(FEATURE_RULES, name);
|
|
1271
|
-
}
|
|
1272
|
-
const FEATURE_NAMES = Object.keys(FEATURE_RULES).filter(isFeatureName);
|
|
1273
|
-
const Features = z.record(z.enum(FEATURE_NAMES), z.boolean());
|
|
1274
|
-
function evaluateFeatures(major, tokenFeatures) {
|
|
1275
|
-
const entries = FEATURE_NAMES.map((name) => [name, ruleHolds(FEATURE_RULES[name], major, tokenFeatures)]);
|
|
1276
|
-
return Features.parse(Object.fromEntries(entries));
|
|
1277
|
-
}
|
|
1278
|
-
function ruleHolds(rule, major, tokenFeatures) {
|
|
1279
|
-
return ruleGap(rule, major, tokenFeatures) === null;
|
|
1280
|
-
}
|
|
1281
|
-
function ruleGap(rule, major, tokenFeatures) {
|
|
1282
|
-
if (!versionHolds(rule, major)) return { kind: "version" };
|
|
1283
|
-
if (rule.tokenFeature === void 0) return null;
|
|
1284
|
-
return tokenFeatures !== null && tokenFeatures[rule.tokenFeature] === true ? null : {
|
|
1285
|
-
kind: "token",
|
|
1286
|
-
tokenFeature: rule.tokenFeature
|
|
1287
|
-
};
|
|
1288
|
-
}
|
|
1289
|
-
function versionHolds(rule, major) {
|
|
1290
|
-
if (major === "development") return rule.until === void 0;
|
|
1291
|
-
return major >= rule.since && (rule.until === void 0 || major <= rule.until);
|
|
1292
|
-
}
|
|
1293
|
-
//#endregion
|
|
1294
1693
|
//#region ../client/src/version/requirements.ts
|
|
1295
1694
|
const METHOD_REQUIREMENTS = {
|
|
1296
1695
|
"card.list": [],
|
|
@@ -1354,7 +1753,7 @@ const METHOD_REQUIREMENTS = {
|
|
|
1354
1753
|
"gitSync.cancelTask": ["remoteSync"],
|
|
1355
1754
|
"gitSync.isDirty": ["remoteSync"],
|
|
1356
1755
|
"gitSync.dirty": ["remoteSync"],
|
|
1357
|
-
"gitSync.hasRemoteChanges": ["
|
|
1756
|
+
"gitSync.hasRemoteChanges": ["remoteSyncRemoteChanges"],
|
|
1358
1757
|
"gitSync.import": ["remoteSync"],
|
|
1359
1758
|
"gitSync.export": ["remoteSync"],
|
|
1360
1759
|
"gitSync.exportPreflight": ["remoteSyncExportPreflight"],
|
|
@@ -1364,8 +1763,8 @@ const METHOD_REQUIREMENTS = {
|
|
|
1364
1763
|
"gitSync.setCollectionSynced": ["remoteSync"],
|
|
1365
1764
|
"gitSync.syncedCollections": ["remoteSync"],
|
|
1366
1765
|
"gitSync.remoteUrl": [],
|
|
1367
|
-
"gitSync.branch": [],
|
|
1368
|
-
"gitSync.trackedBranch": [],
|
|
1766
|
+
"gitSync.branch": ["remoteSync"],
|
|
1767
|
+
"gitSync.trackedBranch": ["remoteSync"],
|
|
1369
1768
|
"gitSync.waitForTask": ["remoteSync"],
|
|
1370
1769
|
"glossary.list": [],
|
|
1371
1770
|
"glossary.create": [],
|
|
@@ -1892,4 +2291,4 @@ run().catch((error) => {
|
|
|
1892
2291
|
reportError(error);
|
|
1893
2292
|
});
|
|
1894
2293
|
//#endregion
|
|
1895
|
-
export {
|
|
2294
|
+
export { setMetabaseAugment as $, consumeLegacyEnvWarnings as A, isNonInterruptFailure as At, evaluateFeatures as B, warn as C, ResponseShapeError as Ct, ENV_SKILLS_DIR as D, errorMessage as Dt, ENV_PROFILE as E, ValidationError as Et, missingTokenFeatureMessage as F, isRetryableStatus as G, ruleGap as H, versionTooOldMessage as I, isPlainObject as J, NOT_BLANK as K, FEATURE_NAMES as L, ProfileRefreshedError as M, escapeJsonPointerSegment as Mt, CapabilityError as N, ENV_SKIP_PREFLIGHT as O, formatZodIssue as Ot, RequirementFailure as P, parseJsonResult as Q, FEATURE_RULES as R, preflightUncheckedNotice as S, PartialWriteError as St, ENV_DISABLE_KEYRING as T, UnknownError as Tt, HttpError as U, isFeatureName as V, chainRequestFailure as W, parseJson as X, JSON_CONTENT_TYPE as Y, parseJsonOrPlain as Z, promptPassword as _, AbortError as _t, renderItem as a, listFlags as at, listTruncationNotice as b, MetabaseError as bt, renderSummary as c, profileFlag as ct, writeText as d, listEnvelopeSchemaWithExtras as dt, name as et, MALFORMED_CELL as f, assertArgv as ft, promptConfirm as g, parseEnumCsv as gt, projectForList as h, parseEnum as ht, reportError as i, listFlag as it, readEnv as j, KNOWN_RANGE as jt, ENV_URL as k, isFileNotFoundError as kt, serializeJson as l, DEFAULT_MAX_BYTES as lt, renderRows as m, parseCsv as mt, isMethodKey as n, connectionFlags as nt, renderList as o, listFlagsWithDefaultLimit as ot, formatScalar as p, givenFlagKeys as pt, isBlank as q, methodRequirements as r, formatFlags as rt, renderListWithExtras as s, outputFlags as st, interruptSignal as t, version as tt, writeJson as u, listEnvelopeSchema as ut, promptSelect as v, ConfigError as vt, ENV_API_KEY as w, TimeoutError as wt, preflightSkippedNotice as x, NetworkError as xt, promptText as y, InternalError as yt, Features as z };
|