@metabase/cli 0.5.2 → 0.5.3
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/README.md +1 -1
- package/dist/{add-collection-C0BQHjJd.mjs → add-collection-c1dfnavz.mjs} +1 -1
- package/dist/{alert-mXHOt00T.mjs → alert-BkpPdBQ_.mjs} +6 -6
- package/dist/{alerts-CyB1Z7AU.mjs → alerts-TDYiIxjs.mjs} +2 -2
- package/dist/api-key-9jVV67hF.mjs +38 -0
- package/dist/api-key-DbsqHlN6.mjs +31 -0
- package/dist/api-key-wGtJ8kYy.mjs +13 -0
- package/dist/{append-DeHhUAeY.mjs → append-CoeZRD6u.mjs} +2 -2
- package/dist/{archive-CjVd1fJ5.mjs → archive-3fdIvMsf.mjs} +1 -1
- package/dist/{archive-Bi-Sfq5T.mjs → archive-9uzfWGuq.mjs} +1 -1
- package/dist/{archive-CpvpGZlz.mjs → archive-CAJHrKwd.mjs} +1 -1
- package/dist/{archive-DRMXvkiI.mjs → archive-CH1h8jz5.mjs} +1 -1
- package/dist/{archive-DfDqPgtk.mjs → archive-D-BJwRLc.mjs} +1 -1
- package/dist/{archive-CfNLlebd.mjs → archive-DQRehboT.mjs} +1 -1
- package/dist/{archive-CCKxZEuq.mjs → archive-DY76wU2k.mjs} +1 -1
- package/dist/{archive-B1MA5MZp.mjs → archive-DZDkfhdH.mjs} +1 -1
- package/dist/{archive-HCVTRXI2.mjs → archive-DxUnaV4x.mjs} +1 -1
- package/dist/{archive-DpgtAdEa.mjs → archive-N3lp1o-k.mjs} +1 -1
- package/dist/{archive-qy0CFo1s2.mjs → archive-NfFWXRx5.mjs} +1 -1
- package/dist/{archive-CDSAXKKB.mjs → archive-f7wKQ7Uy.mjs} +1 -1
- package/dist/{auth-_cdypXeX.mjs → auth-hgkvHPpH.mjs} +4 -4
- package/dist/{body-C0VnEiRV.mjs → body-M5qsJoub.mjs} +1 -1
- package/dist/{branches-C7mNYAky.mjs → branches-B3gHAanU.mjs} +1 -1
- package/dist/{breaking-BindR3ZW.mjs → breaking-DuWIof4T.mjs} +1 -1
- package/dist/{broken-SoXfkx7d.mjs → broken-D2ST8sTx.mjs} +1 -1
- package/dist/{bulk-discard-values-D_d5_1w5.mjs → bulk-discard-values-77khEfpj.mjs} +2 -2
- package/dist/{bulk-edit-Cce05vb_.mjs → bulk-edit-girwcjY6.mjs} +2 -2
- package/dist/{bulk-rescan-values-DIQN4VT_.mjs → bulk-rescan-values-Df8KK8um.mjs} +1 -1
- package/dist/{bulk-sync-schema-DLWf5dCl.mjs → bulk-sync-schema-DEPUZ6MN.mjs} +1 -1
- package/dist/{cancel-rnd6UI-6.mjs → cancel-Oek5PJnu.mjs} +1 -1
- package/dist/{cancel-task-acq1GT6Z.mjs → cancel-task-rkqY0qLU.mjs} +1 -1
- package/dist/{card-BnL92zoT.mjs → card-BWTjCE93.mjs} +8 -8
- package/dist/{cards-DmzPtx81.mjs → cards-DWJOtZoN.mjs} +1 -1
- package/dist/cli.mjs +51 -35
- package/dist/{client-D-Aw6JLk.mjs → client-BFP2Ssqu.mjs} +110 -3
- package/dist/{collection-DRHGwFSL.mjs → collection-9_mj8rVX.mjs} +7 -7
- package/dist/{content-translation-DxT1OMnP.mjs → content-translation-B3oARbgD.mjs} +2 -2
- package/dist/{copy-BTdTiDQo.mjs → copy-BzBp5FaY.mjs} +1 -1
- package/dist/{copy-CyFf3e2Y.mjs → copy-C7Rc4qM7.mjs} +1 -1
- package/dist/{create-DeCPAYJi.mjs → create-71_DODbc.mjs} +2 -2
- package/dist/{create-roJbQOmm.mjs → create-BKRD11i-.mjs} +1 -1
- package/dist/{create-BH6zpwKD.mjs → create-Bc4ADRmU.mjs} +2 -2
- package/dist/{create-DeiBnRRz.mjs → create-Bh3q3eHg.mjs} +2 -2
- package/dist/{create-D6NLpIzV.mjs → create-ByeGK_BE.mjs} +2 -2
- package/dist/{create-GU8_GNbN.mjs → create-C-2ivjed.mjs} +2 -2
- package/dist/{create-qtTB8rIE.mjs → create-C0gmhNnk.mjs} +2 -2
- package/dist/create-C3H9ljex.mjs +34 -0
- package/dist/{create-BwIOlpLc.mjs → create-CGE1D0Ay.mjs} +2 -2
- package/dist/{create-DiG165B2.mjs → create-CGxxztoE.mjs} +2 -2
- package/dist/{create-Ce5YVusp.mjs → create-CfXKNnkK.mjs} +2 -2
- package/dist/{create-B3QZpifA.mjs → create-CjGEkSFz.mjs} +2 -2
- package/dist/{create-Dn8V5siS.mjs → create-DO4ic4Kx.mjs} +2 -2
- package/dist/{create-C3rabvE_.mjs → create-DQJ9h86G.mjs} +2 -2
- package/dist/{create-CuJJd7Rh.mjs → create-YBDXZgyP.mjs} +2 -2
- package/dist/{create-Bg3WTMMU.mjs → create-YIC3Q0a-.mjs} +2 -2
- package/dist/create-_rOCx5b8.mjs +38 -0
- package/dist/{create-branch-C4Ql9G2g.mjs → create-branch-DBCBMDWh.mjs} +1 -1
- package/dist/{create-Ch-NbeMr.mjs → create-f0bBEfDI.mjs} +2 -2
- package/dist/{create-DsCydgm22.mjs → create-myJ8HR4B.mjs} +2 -2
- package/dist/{create-B6dABrs7.mjs → create-vgP9K2eH2.mjs} +2 -2
- package/dist/{csv-DmuyyLdz.mjs → csv-Dtgy7sTg.mjs} +2 -2
- package/dist/{current-task-C2PPBVVv.mjs → current-task-AwQisIT9.mjs} +1 -1
- package/dist/{dashboard-Bq1pae4N.mjs → dashboard-BZV-0Qjp.mjs} +11 -11
- package/dist/{data-action-BZ2PvlaP.mjs → data-action-B7kRpvCH.mjs} +7 -7
- package/dist/data-app-BIAvvV2P.mjs +41 -0
- package/dist/data-app-BUW-HlUo.mjs +52 -0
- package/dist/data-app-Blz61mG5.mjs +29 -0
- package/dist/data-app-project-BL4xpu_m.mjs +57 -0
- package/dist/{db-BgKKN1-4.mjs → db-wsSYKqCB.mjs} +7 -7
- package/dist/delete-4v4_lDwD.mjs +44 -0
- package/dist/{delete-DtIbkF42.mjs → delete-BHX_F8Qu.mjs} +2 -2
- package/dist/{delete-DiZg2wit.mjs → delete-BP9-YS-f.mjs} +2 -2
- package/dist/delete-BSgxmR3y.mjs +40 -0
- package/dist/{delete-_XC6R-Jn.mjs → delete-BegkpIGi.mjs} +2 -2
- package/dist/{delete-DeqGTuwO.mjs → delete-D9FB7qjX.mjs} +2 -2
- package/dist/{delete-CH32Ew4m.mjs → delete-DmM5L0wO.mjs} +2 -2
- package/dist/{delete-CS6hsBnd.mjs → delete-E-g5b-HU.mjs} +2 -2
- package/dist/{delete-B3aylPHD.mjs → delete-WrV9I9uw.mjs} +2 -2
- package/dist/delete-runtime-CJ7gMYA1.mjs +72 -0
- package/dist/{delete-table-BEuMlqw1.mjs → delete-table-CJq8JM5J.mjs} +2 -2
- package/dist/{delete-5ZOvFr-7.mjs → delete-wnHUWWjX.mjs} +2 -2
- package/dist/{dependencies-DD48u9i3.mjs → dependencies-CnW3RSoZ.mjs} +1 -1
- package/dist/{dependency-6kfpR8Ga.mjs → dependency-DDRGBlFL.mjs} +5 -5
- package/dist/{dependents-ByfHs8pO.mjs → dependents-DHXqJ3lo.mjs} +1 -1
- package/dist/{dirty-DsrGfLit.mjs → dirty-BRPWPUYH.mjs} +1 -1
- package/dist/{discard-values-BfpwwC62.mjs → discard-values-DBHfVN8o.mjs} +2 -2
- package/dist/{document-C0mZEg5w.mjs → document-BeLf7NqP.mjs} +6 -6
- package/dist/{download-kpgGtfpw.mjs → download-BFu9xYHX.mjs} +1 -1
- package/dist/{eid-Tp-ACZ4O.mjs → eid-eKmbXRds.mjs} +2 -2
- package/dist/{entry-flags-nhBrUS6p.mjs → entry-flags-Cxn09krz.mjs} +2 -2
- package/dist/{events-Dm9-ofXu.mjs → events-CZL9MU64.mjs} +1 -1
- package/dist/{execute-BL0dAlrp.mjs → execute-DBJGtHHG.mjs} +2 -2
- package/dist/{export-preflight-BMlz3Hp9.mjs → export-preflight-SM9zJkBp.mjs} +1 -1
- package/dist/{export-CIW-dHft.mjs → export-xn_-NaBd.mjs} +1 -1
- package/dist/{field-BUkyWiWk.mjs → field-CQDz-6DK.mjs} +7 -7
- package/dist/{fields-CcerFaiu.mjs → fields-CB06GFBW.mjs} +1 -1
- package/dist/{fks-CYfBesHV.mjs → fks-CSoS7xZ6.mjs} +1 -1
- package/dist/{get-CZgAr8rM.mjs → get--1qTpTIQ.mjs} +1 -1
- package/dist/{get-Cj3-w_Nu.mjs → get-B8xQXMU6.mjs} +1 -1
- package/dist/{get-CEJE9Rmp.mjs → get-B8xrmipw.mjs} +1 -1
- package/dist/{get-LRTRu85E.mjs → get-BIf6eFWZ.mjs} +1 -1
- package/dist/{get--E7UvR-v.mjs → get-BQ7SAJEz.mjs} +1 -1
- package/dist/{get-DHSuVxrH.mjs → get-BSPxmP_W.mjs} +1 -1
- package/dist/{get-BvEHWLGL.mjs → get-BW3jSR3y.mjs} +1 -1
- package/dist/{get-DKbGKa6F.mjs → get-BYAzIaGG.mjs} +1 -1
- package/dist/{get-p2sZvp7v.mjs → get-BZDUOZxI.mjs} +1 -1
- package/dist/{get-CmxYFUuR.mjs → get-BZFyqZXa.mjs} +1 -1
- package/dist/{get-B0RQPTV-2.mjs → get-BfFZCiZR.mjs} +1 -1
- package/dist/get-Bq_9VSTa.mjs +28 -0
- package/dist/{get-BFloqjrN.mjs → get-Bt4C-oxh.mjs} +1 -1
- package/dist/{get-eNRULmE5.mjs → get-C1rCVUYw.mjs} +2 -2
- package/dist/{get-RCDF-hEq.mjs → get-Cc4-e-Q_.mjs} +1 -1
- package/dist/{get-BaiyMem3.mjs → get-Cl-O6dFs.mjs} +1 -1
- package/dist/{get-Be7yjY9v.mjs → get-CtDZOoWy.mjs} +1 -1
- package/dist/{get-BLnQ2aut.mjs → get-CuSwArMS.mjs} +1 -1
- package/dist/{get-Dp45rXRS.mjs → get-DIfjxTP8.mjs} +1 -1
- package/dist/{get-DRhcS76J.mjs → get-DePbMmjc.mjs} +1 -1
- package/dist/{get-CRfrkxqc.mjs → get-eZEHipwA.mjs} +1 -1
- package/dist/{get-HzDQViDP2.mjs → get-jbOgdCQg.mjs} +1 -1
- package/dist/{get-run-C3AHKn3-.mjs → get-run-C-CNDbv3.mjs} +1 -1
- package/dist/git-sync-D_T9oNC6.mjs +29 -0
- package/dist/{glossary-B9Eo4hXc.mjs → glossary-BVK5DaLV.mjs} +4 -4
- package/dist/{graph-BGOYocJc.mjs → graph-CqBe2J4N.mjs} +1 -1
- package/dist/{has-remote-changes-DxsRvZsw.mjs → has-remote-changes-CDe1teSb.mjs} +1 -1
- package/dist/{import-izn2_OsW.mjs → import-B64gjryF.mjs} +1 -1
- package/dist/{is-dirty-DHYYRl6Y.mjs → is-dirty-DhR3Xqjk.mjs} +1 -1
- package/dist/{items-mIoZBqUc.mjs → items-CLl2QgS8.mjs} +1 -1
- package/dist/{library-5I0TlXmf.mjs → library-C3eO2J07.mjs} +4 -4
- package/dist/{list-jT5ndEGr.mjs → list-B7Yvz5vA.mjs} +1 -1
- package/dist/{list-BKhJfFyB.mjs → list-BIqqh3A-.mjs} +1 -1
- package/dist/{list-NeImhwLD.mjs → list-BiSwl56L.mjs} +1 -1
- package/dist/{list-BxIulkp3.mjs → list-BmvitCWZ.mjs} +1 -1
- package/dist/{list-OWPg67JC.mjs → list-C3GBocvB.mjs} +3 -3
- package/dist/{list-CuEPFHrk.mjs → list-C7TFreS8.mjs} +1 -1
- package/dist/{list-C1dEh2yq.mjs → list-CA939qkn.mjs} +1 -1
- package/dist/{list-CpxEOoqw.mjs → list-CFaJA317.mjs} +1 -1
- package/dist/{list-B8FPpgct.mjs → list-CdcFNphE.mjs} +1 -1
- package/dist/{list-D8jiz8YP.mjs → list-CjpZCiks.mjs} +1 -1
- package/dist/{list-B6TYzXyW.mjs → list-Cu6ET_yD.mjs} +1 -1
- package/dist/{list-C-f-G-cC.mjs → list-D4HNG282.mjs} +1 -1
- package/dist/{list-C6roDyBd.mjs → list-DDPvxfhe.mjs} +1 -1
- package/dist/{list-DV4wojtv.mjs → list-DLLzMaS3.mjs} +1 -1
- package/dist/{list-BEBAq1xc.mjs → list-DLwby7YA.mjs} +1 -1
- package/dist/{list-C3CXHKTW.mjs → list-D_IT8l9B.mjs} +1 -1
- package/dist/{list-CmOTwt_z.mjs → list-DpfOh8-5.mjs} +1 -1
- package/dist/{list-CTlIVHeG.mjs → list-DrIcKxXX.mjs} +2 -2
- package/dist/{list-DVnPzc5m.mjs → list-DyFu5Wx1.mjs} +1 -1
- package/dist/{list-O_nmgwSj.mjs → list-DyQNRVAf.mjs} +1 -1
- package/dist/list-YFwmHXGG.mjs +33 -0
- package/dist/{list-CT7AOXTS.mjs → list-eGlqXJno.mjs} +1 -1
- package/dist/list-s9_LlXCV.mjs +29 -0
- package/dist/{login-DOW1mr40.mjs → login-Bg7Z3jDy.mjs} +3 -3
- package/dist/{logout-BQ8wywf7.mjs → logout-CAmp7DcS.mjs} +1 -1
- package/dist/{measure-Bz-bGn-Z.mjs → measure-C31HLp1C.mjs} +5 -5
- package/dist/{parameter-values-B7rr6fcy.mjs → parameter-values-3eHpqznI.mjs} +1 -1
- package/dist/{path-CHQguAPa.mjs → path-XwdHlC23.mjs} +2 -2
- package/dist/{publish-CaoFOucS.mjs → publish-C2-pK0cf.mjs} +1 -1
- package/dist/{query-0u1WR1bV.mjs → query-DkaUzmMa.mjs} +2 -2
- package/dist/{query-CzDBwAZD.mjs → query-pmw23KkL.mjs} +1 -1
- package/dist/{remapping-CodmT28F.mjs → remapping-C3htTzJn.mjs} +1 -1
- package/dist/{remove-collection-DfUsf6Dd.mjs → remove-collection-p_t9rUUX.mjs} +1 -1
- package/dist/{render-DP6UoZNT.mjs → render-C50k8-jc.mjs} +1 -1
- package/dist/{replace-qWiUOgmn.mjs → replace-BQBuFJ1B.mjs} +2 -2
- package/dist/{requirement-check-sfmyH2PH.mjs → requirement-check-CpiVuL0H.mjs} +1 -1
- package/dist/{rescan-values-BcrhdSj_.mjs → rescan-values-Ctq8wpkI.mjs} +1 -1
- package/dist/{rescan-values-BuDmeda3.mjs → rescan-values-DOqXJ3qH.mjs} +1 -1
- package/dist/{run-BBRnFayr.mjs → run-2xgPRuKR.mjs} +1 -1
- package/dist/{run-DXXD-CnS.mjs → run-CtMbObQI.mjs} +2 -2
- package/dist/{run-BG_5lR0x.mjs → run-Dn3e8G4x.mjs} +1 -1
- package/dist/{runs-CovgMSwy.mjs → runs-CgNoQW6M.mjs} +1 -1
- package/dist/{runtime-Cmes70jO.mjs → runtime-Y4VFWmmr.mjs} +1 -1
- package/dist/scaffold-BuL0_ptz.mjs +50 -0
- package/dist/{schema-tables-CjKl8jr5.mjs → schema-tables-BdXuo_lG.mjs} +1 -1
- package/dist/{schemas-CAGvBAD_.mjs → schemas-Dap3KFwY.mjs} +1 -1
- package/dist/{search-DFU6FHRd.mjs → search-DUmFK5Sy.mjs} +1 -1
- package/dist/{search-OpYS2Ub4.mjs → search-Dxcejw_v.mjs} +1 -1
- package/dist/{segment-D-SKpFzF.mjs → segment-CebcXn2E.mjs} +5 -5
- package/dist/{send-DNu83_3E.mjs → send-DYdwcPTb.mjs} +1 -1
- package/dist/{set-active-32IaLx1O.mjs → set-active-CVI_DDQi.mjs} +1 -1
- package/dist/set-bundle-DX5HqDji.mjs +40 -0
- package/dist/{set-data-actions-DRhgAfhE.mjs → set-data-actions-DAI1XCQ2.mjs} +1 -1
- package/dist/set-enabled-0QI-CHAT.mjs +41 -0
- package/dist/{set-sensitivity-D_i3XEe8.mjs → set-sensitivity-DqGkiLSr.mjs} +1 -1
- package/dist/{set-CGYZcLVo.mjs → set-xs8Vyvy2.mjs} +2 -2
- package/dist/{setting-BBn9Lv9J.mjs → setting-Bmry-y_l.mjs} +3 -3
- package/dist/{setup-8d7Uplhy.mjs → setup-UM8N9Vh3.mjs} +2 -2
- package/dist/{skills-BeIDC-_H.mjs → skills-BiSfuDqA.mjs} +3 -3
- package/dist/{skills-BZGd_9d3.mjs → skills-CcLTm3_2.mjs} +1 -1
- package/dist/slug-qeARO25o.mjs +15 -0
- package/dist/{snippet-CpZ5cJ_y.mjs → snippet-DKARah-L.mjs} +5 -5
- package/dist/{stash-Dyc1xZ8u.mjs → stash-e5cSvnj3.mjs} +1 -1
- package/dist/{status-lCN8unWe.mjs → status-BHiO3YBe.mjs} +1 -1
- package/dist/{status-CQZwl1PX.mjs → status-CH7BAWGe.mjs} +2 -2
- package/dist/{subscription-CEFxmtGH.mjs → subscription-DWleULhN.mjs} +5 -5
- package/dist/{subscriptions-AU14uznL.mjs → subscriptions-DcCOA2p1.mjs} +2 -2
- package/dist/{summary-Do9IBOQM.mjs → summary-CipFA6M6.mjs} +1 -1
- package/dist/{sync-schema-_gw9RQyF.mjs → sync-schema-C45WO4db.mjs} +1 -1
- package/dist/{sync-schema-B3nyoKZl.mjs → sync-schema-D7p-P8F6.mjs} +1 -1
- package/dist/table-BPYHnzyV.mjs +26 -0
- package/dist/{timeline-x0s_3sfc.mjs → timeline-C2m_QHxn.mjs} +7 -7
- package/dist/{timeline-event-B-nGnoVL.mjs → timeline-event-BF1dqSnD.mjs} +5 -5
- package/dist/transform-N_elgRuh.mjs +28 -0
- package/dist/transform-job-CTV6KRP2.mjs +22 -0
- package/dist/{transform-tag-dKCqQPTd.mjs → transform-tag-BYoguZfW.mjs} +4 -4
- package/dist/{transform-test-jFuzVhlT.mjs → transform-test-jaBpHOM5.mjs} +6 -6
- package/dist/{transforms-DRAws1f4.mjs → transforms-C6MFnT4C.mjs} +1 -1
- package/dist/{transport-Ck4anhoc.mjs → transport-k_fabWdF.mjs} +2 -2
- package/dist/{tree-Ddsj298M.mjs → tree-C4Igf6xs.mjs} +1 -1
- package/dist/typed-schema-Bo0Q6C0S.mjs +45 -0
- package/dist/{unpublish-BMfjQ8UV.mjs → unpublish-EStytsEm.mjs} +1 -1
- package/dist/{unreferenced-DRQrvH5r.mjs → unreferenced-DtUuyBrr.mjs} +1 -1
- package/dist/{update-pXVhyiFo.mjs → update-B0Na11v-.mjs} +2 -2
- package/dist/{update-CGpiLu7N.mjs → update-B1UXRPN-.mjs} +2 -2
- package/dist/{update-CnxzmPRG.mjs → update-BOg1jZ_s.mjs} +2 -2
- package/dist/{update-C1VwtJWu.mjs → update-BXLY92om.mjs} +2 -2
- package/dist/{update-6sfqiInZ.mjs → update-Bba_zPSE.mjs} +2 -2
- package/dist/{update-DlFHoUxe.mjs → update-BogvN2Mb.mjs} +2 -2
- package/dist/{update-D1aKeWfo.mjs → update-CCLpNTPa.mjs} +2 -2
- package/dist/{update-_hHnM1Hx.mjs → update-CciLWH_s.mjs} +2 -2
- package/dist/{update-BQLTaw3z.mjs → update-DAG8m5f4.mjs} +2 -2
- package/dist/{update-BtfUX9CN.mjs → update-DECiEVlk.mjs} +2 -2
- package/dist/update-DIBaY-fy.mjs +37 -0
- package/dist/{update-0AoF6QJ_.mjs → update-DT2ViMFr.mjs} +2 -2
- package/dist/{update-BCC1Igr2.mjs → update-DT8U29Kk.mjs} +2 -2
- package/dist/{update-8eXJso_l.mjs → update-DhgfReDD.mjs} +2 -2
- package/dist/{update-Bpsdi6kM.mjs → update-DkvIK-eL.mjs} +2 -2
- package/dist/{update-C1x90FSH.mjs → update-FfeHReec.mjs} +2 -2
- package/dist/{update-C19B1Sry.mjs → update-HbggUPuy.mjs} +2 -2
- package/dist/{update-DrT10fxQ.mjs → update-VGgvQu7W.mjs} +2 -2
- package/dist/{update-dashcard-CDI0Tnxy.mjs → update-dashcard-m-hkIGUu.mjs} +2 -2
- package/dist/{update-BIL0JPqm.mjs → update-pk0b6vXU.mjs} +2 -2
- package/dist/{update-DpP1EEC0.mjs → update-z8ZGCg1r.mjs} +2 -2
- package/dist/{upgrade-Cfouv1Ii.mjs → upgrade-iETJ8fH2.mjs} +1 -1
- package/dist/{upload-DnLXgUA-.mjs → upload-BF5pdKRN.mjs} +1 -1
- package/dist/{upload-DIEcI5iM.mjs → upload-CoK5LnyA.mjs} +2 -2
- package/dist/{upload-Cqv-In6j.mjs → upload-CqSGEZQW.mjs} +3 -3
- package/dist/{uuid-D0sH5txV.mjs → uuid-8Ha-8bDX.mjs} +1 -1
- package/dist/{values-BFPO6y5o.mjs → values-BsgA7-6h.mjs} +1 -1
- package/dist/{verify-C-StvB4f.mjs → verify-CzBZbP4W.mjs} +1 -1
- package/dist/{verify-CuGs0X3C.mjs → verify-cjUPMF_B.mjs} +1 -1
- package/dist/{verify-7fW020r_.mjs → verify-crIrbGZV.mjs} +2 -2
- package/dist/{wait-Cvt8xO0h.mjs → wait-mFUfpSaj.mjs} +1 -1
- package/package.json +2 -2
- package/skill-data/core/SKILL.md +1 -1
- package/skill-data/data-action/SKILL.md +1 -1
- package/skill-data/data-app/SKILL.md +138 -0
- package/skill-data/data-app/template/.env.local.example +2 -0
- package/skill-data/data-app/template/LICENSE +21 -0
- package/skill-data/data-app/template/README.md +29 -0
- package/skill-data/data-app/template/gitignore +5 -0
- package/skill-data/data-app/template/package.json +25 -0
- package/skill-data/data-app/template/src/App.tsx +9 -0
- package/skill-data/data-app/template/src/index.tsx +14 -0
- package/skill-data/data-app/template/src/theme.ts +25 -0
- package/skill-data/data-app/template/tsconfig.json +25 -0
- package/skill-data/data-app/template/vite.config.ts +3 -0
- package/skill-data/data-app-actions/SKILL.md +96 -0
- package/skill-data/data-app-data/SKILL.md +158 -0
- package/skill-data/data-app-filters/SKILL.md +87 -0
- package/skill-data/data-app-ui/SKILL.md +120 -0
- package/dist/delete-runtime-DRGveT8H.mjs +0 -55
- package/dist/git-sync-CNTB5jvI.mjs +0 -29
- package/dist/table-Cb_Uvw8m.mjs +0 -26
- package/dist/transform-job-Dlx2c6II.mjs +0 -22
- package/dist/transform-kP11Mv9_.mjs +0 -28
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: data-app-filters
|
|
3
|
+
description: Build the filter controls of a Metabase data app — the filter contract, which cards a filter reaches, All by default, options from their own question, a searchable combobox for entities, date presets, `DateRangePopover` and `DateRangeCalendar` with labels from `useDateFormatter`, and a single-date picker. Triggers — "add a filter to the app", "filter the chart by date", "a date range picker", "filter by customer", "a dropdown of categories", "the filter doesn't change the chart", "the date shows the previous day". The query side — runtime clauses and their limits — is in `data-app-data`.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
5
|
+
requires: [dataApps]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Filter controls in a data app
|
|
9
|
+
|
|
10
|
+
A filter is an ordinary React control whose state becomes `filter(...)` clauses in a hook's second argument, on a column the question returns (`data-app-data`, _Runtime clauses_). This skill covers the controls; "panel" below means a chart, KPI or table on the page.
|
|
11
|
+
|
|
12
|
+
## Write the contract first
|
|
13
|
+
|
|
14
|
+
Before any control, write one row per filter: the question that gives its options, the raw value `filter(...)` receives, the panels whose question returns that column, and the panels whose question doesn't.
|
|
15
|
+
|
|
16
|
+
| Filter | Options question | Raw value | Panels | Not these |
|
|
17
|
+
| --------- | -------------------------- | ------------ | ---------------------- | -------------- |
|
|
18
|
+
| Franchise | franchises, by id and name | franchise id | orders, revenue, stock | — |
|
|
19
|
+
| Plan | orders broken out by plan | plan text | orders | revenue, stock |
|
|
20
|
+
|
|
21
|
+
- A filter in the page's global bar changes every panel that can take it. One that can't reach a panel is scoped to its section, visibly, or left out. A KPI and its detail table about the same thing take the same filters, unless the UI says why not.
|
|
22
|
+
- One date control per scope. Never a global date range beside a page-specific date where one of the two does nothing; a page whose cards use another date column gets one control for that column.
|
|
23
|
+
- Build each panel's clauses from its own question's columns, inline at its hook call. Never reuse an array built for another question.
|
|
24
|
+
|
|
25
|
+
## Values and options
|
|
26
|
+
|
|
27
|
+
- Every filter starts at **All**. Keep it as `"all"` in state and send it as no clause (`[]`); treat `""`, `null` and `undefined` the same way. In a Yes/No/All filter, Yes and No each filter (`true`, `false`), and only All sends nothing.
|
|
28
|
+
- Options come at runtime from their own question in the app's collection, broken out on the filtered column — never hardcoded unless the user gave a closed list. Dedupe them from its rows, and keep the label apart from the value.
|
|
29
|
+
- Filter by a stable raw value (an id) and show its label; never filter by a display label when an id exists, and never feed free text into an exact-id filter.
|
|
30
|
+
- All stays selectable while options load, come back empty or fail; don't disable the control. When fresh options no longer hold the selected value, reset to All:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (selected !== "all" && !options.some((option) => option.value === selected)) {
|
|
35
|
+
setSelected("all");
|
|
36
|
+
}
|
|
37
|
+
}, [options, selected]);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Entities: a searchable combobox
|
|
41
|
+
|
|
42
|
+
Any list whose options come from a question — an id shown as a name, a category, anything that can grow — is one searchable combobox, even while it's short. A `<select>` is only for a short closed list the user gave. Prefer the app's component library or a small established combobox package; hand-roll only a small one. Either way:
|
|
43
|
+
|
|
44
|
+
- Click or focus opens the list at once, before any typing; search matches labels, not ids.
|
|
45
|
+
- All is always an option, and picking an option stores its raw value.
|
|
46
|
+
- The list is capped or scrolls, and looks like the app's other controls.
|
|
47
|
+
- Don't close the list from the trigger's `onBlur` when the popover holds an auto-focused input — moving focus into it closes the list at once. Close on selection, Escape, or focus leaving the whole wrapper.
|
|
48
|
+
|
|
49
|
+
## Date ranges
|
|
50
|
+
|
|
51
|
+
A preset bar lists the durations, then All time, then Custom last — leave Custom out only if the user asked for fixed presets. Every option ends in the same `[start, end]` range (All time is `[null, null]`), so one `between` filter serves them all. Custom is `DateRangePopover` around your own trigger, or `DateRangeCalendar` inline, both from `@metabase/embedding-sdk-react/data-app`. No date-picker library and no `<input type="date">` for a range.
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { DateRangePopover, filter, useDateFormatter } from "@metabase/embedding-sdk-react/data-app";
|
|
55
|
+
|
|
56
|
+
const { formatDateRange } = useDateFormatter();
|
|
57
|
+
const [range, setRange] = useState<[string | null, string | null]>([null, null]);
|
|
58
|
+
const [start, end] = range;
|
|
59
|
+
// at the hook: filters: start && end ? [filter({ type: "column", name: "CREATED_AT" }, "between", [start, end])] : []
|
|
60
|
+
|
|
61
|
+
<DateRangePopover value={range} onChange={setRange}>
|
|
62
|
+
<button className="filter-button">{formatDateRange(range) || "Custom"}</button>
|
|
63
|
+
</DateRangePopover>;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- Both ends are `YYYY-MM-DD` strings, the shape `filter(...)` takes. `onChange` fires on every click, so a half-picked range arrives as `[start, null]`: filter only once both ends are set, never with a sentinel date.
|
|
67
|
+
- The child is the trigger: one element or a `forwardRef` component, since the popover attaches a ref and a click handler.
|
|
68
|
+
- Label it with `formatDateRange(range)` (or `formatDate` for one end), which formats in the instance's locale; both take a dayjs `format`, and `formatDateRange` a `separator`. It returns `""` until the SDK loads. Never `new Date("YYYY-MM-DD")`: a date-only string parses as UTC and shows the previous day west of Greenwich.
|
|
69
|
+
- The popover closes once both ends are picked (`closeOnSelect`); `opened` and `onOpenedChange` control it yourself. Also `defaultValue`, `minDate` and `maxDate` (`YYYY-MM-DD`), `numberOfColumns` (default 2) and `position` (default `bottom-start`). `DateRangeCalendar` takes the same value props plus `className` and `style`.
|
|
70
|
+
|
|
71
|
+
A preset's range, from local dates — never `toISOString()`, which shifts the day:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const ymd = (d: Date) =>
|
|
75
|
+
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
76
|
+
const lastMonths = (n: number): [string, string] => {
|
|
77
|
+
const end = new Date();
|
|
78
|
+
const start = new Date(end.getFullYear(), end.getMonth() - n, end.getDate());
|
|
79
|
+
return [ymd(start), ymd(end)];
|
|
80
|
+
};
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**A single date or a date-time** is the one case for a library: `npm install react-datepicker`, import `react-datepicker/dist/react-datepicker.css`, type the callback (`(date: Date | null) => …`), and convert with `ymd` above. Pass `null`, never `new Date("")`, for an empty value.
|
|
84
|
+
|
|
85
|
+
## Check
|
|
86
|
+
|
|
87
|
+
For every visible filter: All runs the unfiltered question; its options come from a question; each option changes every panel the contract says it reaches, and no other; a preset bar ends with Custom; and no scope has two date controls. Search the filter controls for `<select` and `type="date"` — an action form keeps its date inputs. Then build and publish (`data-app`, _Build and publish_).
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: data-app-ui
|
|
3
|
+
description: Write a Metabase data app's UI — what the sandbox blocks and what replaces it, external APIs through `allowed_hosts`, layout and sizing, the SDK theme, a custom error state, the SDK components on offer, a Metabase chart versus a hand-drawn one and its visualization settings, pages with `DataAppRouter`, and what the app may show. Triggers — "change the layout", "theme the app", "add a page", "link between pages", "call an external API from the app", "the chart overflows", "invisible chart labels", "make it look like our brand". Creating and publishing is `data-app`; its data is `data-app-data`.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
5
|
+
requires: [dataApps]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# A data app's UI
|
|
9
|
+
|
|
10
|
+
Everything here runs inside the sandbox, the same in the dev preview as in Metabase; check each change in the preview and its diagnostics feed (`data-app`).
|
|
11
|
+
|
|
12
|
+
## Source
|
|
13
|
+
|
|
14
|
+
- Plain ESM and TSX. SDK components come from `@metabase/embedding-sdk-react`; the data hooks, routing, `copy`, `DateRangePopover`, `DateRangeCalendar` and `useDateFormatter` from `@metabase/embedding-sdk-react/data-app`. JSX needs no `import React`; import hooks and React types by name.
|
|
15
|
+
- React, React DOM and both SDK entries come from the host. Never read SDK values off `globalThis`: the sandbox globals there are private.
|
|
16
|
+
- The build is one self-contained file: CSS is inlined, `import logo from "./logo.png"` is a data URI, `import Icon from "./icon.svg?react"` a component (add `declare module "*.svg?react";` in a `.d.ts` under `src/` if the editor doesn't know it). Keep large binaries out. There's no `index.html` and no Vite plugin to add: solve it in `src/`.
|
|
17
|
+
- Once the app grows: `src/App.tsx` for routing and composition, `pages/` one file per screen, `components/`, `hooks/`, `lib/` for pure helpers.
|
|
18
|
+
|
|
19
|
+
## What the app shows
|
|
20
|
+
|
|
21
|
+
- Only what Metabase returned, or deterministic transforms of it: no sample data, invented KPIs, trends, statuses, or claims such as "real-time" or "at risk" the data doesn't support. A section no question supports is left out.
|
|
22
|
+
- Don't read a `rate`, `score`, `margin` or `percent` column as a percentage or threshold — no `%`, `* 100`, colors or stars — unless its `semanticType` in `src/metabase.ts`, or the user, says so.
|
|
23
|
+
- Every panel has a loading state, its error, and an empty state for no rows — never an empty slot or a stale value.
|
|
24
|
+
- Label with names, not ids; currency to two decimals, counts as integers; a `null` breakout is "Unknown". A trend needs several points: never a sparkline from one value. Cap long lists with a limit, pages or a scroll area.
|
|
25
|
+
|
|
26
|
+
## What the sandbox blocks
|
|
27
|
+
|
|
28
|
+
| Blocked | Use instead |
|
|
29
|
+
| ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
30
|
+
| `fetch` to Metabase or to any origin outside the app's `allowed_hosts`; `XMLHttpRequest`; `WebSocket` | The data hooks for Metabase; _External APIs_ for anything else. |
|
|
31
|
+
| `alert`, `confirm`, `prompt` | A modal in your own tree. |
|
|
32
|
+
| `localStorage`, `sessionStorage`, `indexedDB`, `document.cookie` | Nothing persists across reloads; persist through an action (`data-app-actions`). |
|
|
33
|
+
| `window.open`, `history.pushState`, `history.replaceState` | `useDataAppLocation().navigate`; `<a target="_blank" rel="noopener">` for external links. |
|
|
34
|
+
| `navigator.clipboard`, `execCommand("copy")` | `await copy(text)` in a user event — write-only, there's no paste. |
|
|
35
|
+
| `navigator.geolocation` and other device APIs | Nothing. |
|
|
36
|
+
| Key, input, composition and clipboard listeners (`keydown`, `paste`, `input`, …) on `window` or `document` | A React handler (`onKeyDown`, `onPaste`, …) on your own element. |
|
|
37
|
+
|
|
38
|
+
**External APIs.** A raw `fetch` reaches only the origins in the app's `allowed_hosts`, exact or with a `*.` subdomain wildcard: `mb data-app update <slug> --body '{"allowed_hosts":["https://api.example.com"]}'`, plus an `allowed_hosts:` list in `data_app.yaml` beside `package.json` for the preview, then restart `npm run dev`. Never list the Metabase URL. In Metabase the same list governs `<iframe src>` and native `<form action>` submits, and the target must allow framing; the preview blocks both. Use `<form onSubmit>` with `preventDefault`: a native submit navigates the app away.
|
|
39
|
+
|
|
40
|
+
## Layout
|
|
41
|
+
|
|
42
|
+
- The root element gets `minHeight: "100vh"` (plus `boxSizing: "border-box"` with padding) and the page background; never `height`. Regions that reach the bottom, such as a sidebar, go in a flex-column root with `flex: 1`. Check the emptiest screens — loading, empty, a lone KPI — since they render shortest.
|
|
43
|
+
- SDK questions don't size to their parent: pass `height` and `width` to the component that draws (`StaticQuestion`, `InteractiveQuestion`, or `InteractiveQuestion.QuestionVisualization`) — the height actually left in its panel, or `height="100%"` in a fixed-height box. A KPI needs little: about `120` for a `scalar`, more for a `smartscalar`'s comparison or a `gauge`.
|
|
44
|
+
- Don't wrap an SDK question in `overflow: hidden`, hover transforms or hover-driven layout shifts: its menus and tooltips need stable geometry.
|
|
45
|
+
|
|
46
|
+
## Theme
|
|
47
|
+
|
|
48
|
+
`src/theme.ts`, passed as `providerProps.theme`, is the only way to style SDK components, one theme for the whole app; it never styles your own UI (inline styles or CSS modules).
|
|
49
|
+
|
|
50
|
+
| Key | Rule |
|
|
51
|
+
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `colors.brand` | The app's accent. |
|
|
53
|
+
| `colors["brand-hover"]`, `colors["brand-hover-light"]` | A light tint (`#EAF4FF` for a blue brand), never the saturated brand. |
|
|
54
|
+
| `colors.charts` | All 8 slots, starting with `brand`, vivid and distinct — never pale tints, which can color labels. An empty slot keeps Metabase's color. |
|
|
55
|
+
| `colors.background`, `colors["background-secondary"]` | The color of the SDK component's own container: `white` inside a white card. |
|
|
56
|
+
| `colors["text-primary"]`, `-secondary`, `-tertiary` | Contrast with `background`; set them whenever you set it. Missing contrast is the "invisible chart labels" bug. |
|
|
57
|
+
| `colors.positive`, `colors.negative`, `fontFamily` | Up and down in trends and changes; the SDK's typeface. A `text-hover` must contrast with both brand-hover colors in open menus. |
|
|
58
|
+
|
|
59
|
+
**Error state.** A question that can't load shows Metabase's neutral error. To match the app, add an `errorComponent` to `providerProps` — it replaces the error of every SDK component, so keep the wording generic, render its `message` (a `ReactNode`) as it is, and use no data hooks in it:
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import type { SdkErrorComponentProps } from "@metabase/embedding-sdk-react";
|
|
63
|
+
|
|
64
|
+
export function AppError({ message }: SdkErrorComponentProps) {
|
|
65
|
+
return <div style={{ padding: 16, color: "#6b7280" }}>{message}</div>;
|
|
66
|
+
}
|
|
67
|
+
// src/index.tsx: providerProps: { theme, errorComponent: AppError }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## SDK components
|
|
71
|
+
|
|
72
|
+
| Import | For |
|
|
73
|
+
| -------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
74
|
+
| `StaticQuestion` | A chart, KPI or table without drill-through — the default. |
|
|
75
|
+
| `InteractiveQuestion` | One meant to be explored: drill-through, chart switching, the editor. |
|
|
76
|
+
| `StaticDashboard`, `InteractiveDashboard`, `EditableDashboard` | A dashboard. |
|
|
77
|
+
| `CreateQuestion`, `MetabotQuestion`, `CollectionBrowser`, `CreateDashboardModal` | Authoring flows, rarely in an app. |
|
|
78
|
+
|
|
79
|
+
## A Metabase chart or your own
|
|
80
|
+
|
|
81
|
+
Ask "can Metabase draw this at all?", never "which looks closer to the design?" — and decide per element, not per page.
|
|
82
|
+
|
|
83
|
+
- **Yes** — bar, line, area, combo, row, pie, scalar, smartscalar, gauge, progress, funnel, scatter, waterfall, boxplot, sankey, pivot, map, tables: render it with `useMetabaseQueryObject` and `StaticQuestion` (`data-app-data`). It keeps the instance's formatting, tooltips, theming and drill-through. Styling is never a reason to draw it yourself.
|
|
84
|
+
- **No**, or the user asked for a custom one — scorecards, timelines, calendar grids, one visual from several queries: draw it from `useMetabaseQuery` rows, with SVG or a chart library the app already has.
|
|
85
|
+
- A KPI is `scalar`, `smartscalar`, `gauge` or `progress`; put what Metabase doesn't draw (a caption, stars) beside it.
|
|
86
|
+
- `InteractiveQuestion`: pass `isSaveEnabled={false}`, and `title={false}` in a panel with its own heading. Children replace its layout: `<InteractiveQuestion card={card}><InteractiveQuestion.QuestionVisualization height={360} /></InteractiveQuestion>` is the chart alone.
|
|
87
|
+
|
|
88
|
+
**Visualization settings.** Add `visualizationSettings` only for a change the user asked for. Their keys are a question's `visualization_settings` keys — the `visualization` skill lists them — and the installed types decide what's legal: `rg -n "<key>|declare type .*VisualizationSettings" node_modules/@metabase/embedding-sdk-react/dist/index.d.ts`, never the whole file, never from memory. Keep them few: keys such as `graph.dimensions`, `pie.metric` and `column_settings` name result columns and break when the question changes.
|
|
89
|
+
|
|
90
|
+
- A `table` with two breakouts and one aggregation renders as a pivot when a breakout has at most 16 values; `{ "table.pivot": false }` keeps one row per group.
|
|
91
|
+
- A scalar shows the first column: with a key column first, point it at the number with `{ "scalar.field": "avg_rating" }`.
|
|
92
|
+
- A header: `column_settings: { '["name","approvers"]': { column_title: "Approvers" } }`.
|
|
93
|
+
|
|
94
|
+
## Pages
|
|
95
|
+
|
|
96
|
+
No router library — it calls `history.pushState`, which the sandbox blocks. Wrap the app once in `<DataAppRouter>`, link with `<DataAppLink to="/customers/42">` (an `<a href>` that takes the usual anchor props), and read `{ pathname, navigate }` from `useDataAppLocation()`. There's no `useParams`: match `pathname` yourself.
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
const TABS = [
|
|
100
|
+
{ path: "/", label: "Overview", render: () => <Overview /> },
|
|
101
|
+
{ path: "/customers", label: "Customers", render: () => <Customers /> },
|
|
102
|
+
];
|
|
103
|
+
// `/` and any unknown path open the first tab
|
|
104
|
+
const activeTab = (pathname: string) =>
|
|
105
|
+
TABS.find((tab) => tab.path !== "/" && pathname.startsWith(tab.path)) ?? TABS[0];
|
|
106
|
+
|
|
107
|
+
function Page() {
|
|
108
|
+
const { pathname } = useDataAppLocation();
|
|
109
|
+
const customerId = pathname.match(/^\/customers\/(\d+)$/)?.[1];
|
|
110
|
+
return customerId ? <CustomerDetail id={Number(customerId)} /> : activeTab(pathname).render();
|
|
111
|
+
}
|
|
112
|
+
// nav: <DataAppLink to={tab.path} aria-current={tab === activeTab(pathname) ? "page" : undefined}>
|
|
113
|
+
// App: <DataAppRouter><Nav /><Page /></DataAppRouter>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Metabase mirrors each route to `/apps/<slug>/<path>`, and a reload there opens that page. A middle-click opens a new tab only in the preview; in Metabase that tab shows "This data app can't be opened directly." Check in the preview: reload on a sub-path, then on `/` — the first tab shows, marked selected.
|
|
117
|
+
|
|
118
|
+
## Before handoff
|
|
119
|
+
|
|
120
|
+
`npm run dev` only transpiles: run `npm run typecheck` after every round of edits and fix what it reports, and report the result, errors grouped by cause. Search the changed files and fix what turns up: `card={{` (every `card` comes from `useMemo`), `row[0]` and `as unknown as` (rows are keyed by column name), `<select` for a list from a question (`data-app-filters`), `type="date"` and `new Date(` in a date filter, `* 100` and `%`. Read the diagnostics feed with every panel mounted, then build and publish (`data-app`, _Build and publish_).
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { St as ConfigError, _ as promptConfirm, c as renderSummary } from "./cli.mjs";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
//#region src/commands/delete-runtime.ts
|
|
4
|
-
const DeleteResult = z.object({
|
|
5
|
-
deleted: z.boolean(),
|
|
6
|
-
aborted: z.boolean(),
|
|
7
|
-
id: z.number().int()
|
|
8
|
-
});
|
|
9
|
-
const deleteResultView = {
|
|
10
|
-
compactPick: DeleteResult,
|
|
11
|
-
tableColumns: [
|
|
12
|
-
{
|
|
13
|
-
key: "id",
|
|
14
|
-
label: "ID"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
key: "deleted",
|
|
18
|
-
label: "Deleted"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
key: "aborted",
|
|
22
|
-
label: "Aborted"
|
|
23
|
-
}
|
|
24
|
-
]
|
|
25
|
-
};
|
|
26
|
-
async function confirmDestructive(args) {
|
|
27
|
-
if (args.yes) return true;
|
|
28
|
-
if (process.stdin.isTTY !== true) throw new ConfigError(`refusing to ${args.action} without confirmation — pass --yes to proceed non-interactively`);
|
|
29
|
-
return promptConfirm({
|
|
30
|
-
message: args.promptMessage,
|
|
31
|
-
initialValue: false
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
async function confirmAndDelete(args) {
|
|
35
|
-
if (!await confirmDestructive({
|
|
36
|
-
yes: args.yes,
|
|
37
|
-
action: `delete ${args.id}`,
|
|
38
|
-
promptMessage: args.promptMessage
|
|
39
|
-
})) {
|
|
40
|
-
renderSummary({
|
|
41
|
-
deleted: false,
|
|
42
|
-
aborted: true,
|
|
43
|
-
id: args.id
|
|
44
|
-
}, deleteResultView, args.abortMessage, args.ctx);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
await args.deleteResource();
|
|
48
|
-
renderSummary({
|
|
49
|
-
deleted: true,
|
|
50
|
-
aborted: false,
|
|
51
|
-
id: args.id
|
|
52
|
-
}, deleteResultView, args.successMessage, args.ctx);
|
|
53
|
-
}
|
|
54
|
-
//#endregion
|
|
55
|
-
export { confirmAndDelete as n, confirmDestructive as r, DeleteResult as t };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { t as defineCommandGroup } from "./group-81zoQcEP.mjs";
|
|
2
|
-
//#region src/commands/git-sync/index.ts
|
|
3
|
-
var git_sync_default = defineCommandGroup({
|
|
4
|
-
name: "git-sync",
|
|
5
|
-
description: "Sync Metabase content with a git remote",
|
|
6
|
-
skills: [{
|
|
7
|
-
skill: "git-sync",
|
|
8
|
-
purpose: "import/export round-trip and dirty checks"
|
|
9
|
-
}],
|
|
10
|
-
subCommands: {
|
|
11
|
-
status: () => import("./status-lCN8unWe.mjs").then((mod) => mod.default),
|
|
12
|
-
"is-dirty": () => import("./is-dirty-DHYYRl6Y.mjs").then((mod) => mod.default),
|
|
13
|
-
"has-remote-changes": () => import("./has-remote-changes-DxsRvZsw.mjs").then((mod) => mod.default),
|
|
14
|
-
dirty: () => import("./dirty-DsrGfLit.mjs").then((mod) => mod.default),
|
|
15
|
-
"current-task": () => import("./current-task-C2PPBVVv.mjs").then((mod) => mod.default),
|
|
16
|
-
"cancel-task": () => import("./cancel-task-acq1GT6Z.mjs").then((mod) => mod.default),
|
|
17
|
-
wait: () => import("./wait-Cvt8xO0h.mjs").then((mod) => mod.default),
|
|
18
|
-
import: () => import("./import-izn2_OsW.mjs").then((mod) => mod.default),
|
|
19
|
-
export: () => import("./export-CIW-dHft.mjs").then((mod) => mod.default),
|
|
20
|
-
"export-preflight": () => import("./export-preflight-BMlz3Hp9.mjs").then((mod) => mod.default),
|
|
21
|
-
stash: () => import("./stash-Dyc1xZ8u.mjs").then((mod) => mod.default),
|
|
22
|
-
branches: () => import("./branches-C7mNYAky.mjs").then((mod) => mod.default),
|
|
23
|
-
"create-branch": () => import("./create-branch-C4Ql9G2g.mjs").then((mod) => mod.default),
|
|
24
|
-
"add-collection": () => import("./add-collection-C0BQHjJd.mjs").then((mod) => mod.default),
|
|
25
|
-
"remove-collection": () => import("./remove-collection-DfUsf6Dd.mjs").then((mod) => mod.default)
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
//#endregion
|
|
29
|
-
export { git_sync_default as default };
|
package/dist/table-Cb_Uvw8m.mjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { t as defineCommandGroup } from "./group-81zoQcEP.mjs";
|
|
2
|
-
//#region src/commands/table/index.ts
|
|
3
|
-
var table_default = defineCommandGroup({
|
|
4
|
-
name: "table",
|
|
5
|
-
description: "Manage Metabase tables",
|
|
6
|
-
skills: [{
|
|
7
|
-
skill: "metadata",
|
|
8
|
-
purpose: "table and column metadata, semantic types, visibility"
|
|
9
|
-
}],
|
|
10
|
-
subCommands: {
|
|
11
|
-
list: () => import("./list-BxIulkp3.mjs").then((m) => m.default),
|
|
12
|
-
get: () => import("./get-DRhcS76J.mjs").then((m) => m.default),
|
|
13
|
-
fields: () => import("./fields-CcerFaiu.mjs").then((m) => m.default),
|
|
14
|
-
fks: () => import("./fks-CYfBesHV.mjs").then((m) => m.default),
|
|
15
|
-
update: () => import("./update-8eXJso_l.mjs").then((m) => m.default),
|
|
16
|
-
"sync-schema": () => import("./sync-schema-B3nyoKZl.mjs").then((m) => m.default),
|
|
17
|
-
"rescan-values": () => import("./rescan-values-BuDmeda3.mjs").then((m) => m.default),
|
|
18
|
-
"discard-values": () => import("./discard-values-BfpwwC62.mjs").then((m) => m.default),
|
|
19
|
-
"bulk-edit": () => import("./bulk-edit-Cce05vb_.mjs").then((m) => m.default),
|
|
20
|
-
"bulk-sync-schema": () => import("./bulk-sync-schema-DLWf5dCl.mjs").then((m) => m.default),
|
|
21
|
-
"bulk-rescan-values": () => import("./bulk-rescan-values-DIQN4VT_.mjs").then((m) => m.default),
|
|
22
|
-
"bulk-discard-values": () => import("./bulk-discard-values-D_d5_1w5.mjs").then((m) => m.default)
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
//#endregion
|
|
26
|
-
export { table_default as default };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { t as defineCommandGroup } from "./group-81zoQcEP.mjs";
|
|
2
|
-
//#region src/commands/transform-job/index.ts
|
|
3
|
-
var transform_job_default = defineCommandGroup({
|
|
4
|
-
name: "transform-job",
|
|
5
|
-
description: "Manage Metabase transform jobs",
|
|
6
|
-
skills: [{
|
|
7
|
-
skill: "transform",
|
|
8
|
-
purpose: "tag-driven job schedules"
|
|
9
|
-
}],
|
|
10
|
-
subCommands: {
|
|
11
|
-
list: () => import("./list-BEBAq1xc.mjs").then((mod) => mod.default),
|
|
12
|
-
get: () => import("./get-Cj3-w_Nu.mjs").then((mod) => mod.default),
|
|
13
|
-
create: () => import("./create-DiG165B2.mjs").then((mod) => mod.default),
|
|
14
|
-
update: () => import("./update-DpP1EEC0.mjs").then((mod) => mod.default),
|
|
15
|
-
delete: () => import("./delete-DeqGTuwO.mjs").then((mod) => mod.default),
|
|
16
|
-
run: () => import("./run-BG_5lR0x.mjs").then((mod) => mod.default),
|
|
17
|
-
transforms: () => import("./transforms-DRAws1f4.mjs").then((mod) => mod.default),
|
|
18
|
-
"set-active": () => import("./set-active-32IaLx1O.mjs").then((mod) => mod.default)
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
//#endregion
|
|
22
|
-
export { transform_job_default as default };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { t as defineCommandGroup } from "./group-81zoQcEP.mjs";
|
|
2
|
-
//#region src/commands/transform/index.ts
|
|
3
|
-
var transform_default = defineCommandGroup({
|
|
4
|
-
name: "transform",
|
|
5
|
-
description: "Manage Metabase transforms",
|
|
6
|
-
skills: [{
|
|
7
|
-
skill: "transform",
|
|
8
|
-
purpose: "body shape, run-with-wait, iterate"
|
|
9
|
-
}, {
|
|
10
|
-
skill: "mbql",
|
|
11
|
-
purpose: "MBQL source.query bodies"
|
|
12
|
-
}],
|
|
13
|
-
subCommands: {
|
|
14
|
-
list: () => import("./list-CT7AOXTS.mjs").then((mod) => mod.default),
|
|
15
|
-
get: () => import("./get-BFloqjrN.mjs").then((mod) => mod.default),
|
|
16
|
-
dependencies: () => import("./dependencies-DD48u9i3.mjs").then((mod) => mod.default),
|
|
17
|
-
create: () => import("./create-B6dABrs7.mjs").then((mod) => mod.default),
|
|
18
|
-
update: () => import("./update-CnxzmPRG.mjs").then((mod) => mod.default),
|
|
19
|
-
delete: () => import("./delete-CH32Ew4m.mjs").then((mod) => mod.default),
|
|
20
|
-
"delete-table": () => import("./delete-table-BEuMlqw1.mjs").then((mod) => mod.default),
|
|
21
|
-
run: () => import("./run-BBRnFayr.mjs").then((mod) => mod.default),
|
|
22
|
-
cancel: () => import("./cancel-rnd6UI-6.mjs").then((mod) => mod.default),
|
|
23
|
-
"get-run": () => import("./get-run-C3AHKn3-.mjs").then((mod) => mod.default),
|
|
24
|
-
runs: () => import("./runs-CovgMSwy.mjs").then((mod) => mod.default)
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
//#endregion
|
|
28
|
-
export { transform_default as default };
|