@metabase/cli 0.5.10 → 0.5.12
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-B6_b7Z0h.mjs → add-collection-Bdnq6dfy.mjs} +1 -1
- package/dist/{alert-CaOd6Sye.mjs → alert-o2pHsbTh.mjs} +6 -6
- package/dist/{alerts-B4XDd_EG.mjs → alerts-DS_uGWg-.mjs} +2 -2
- package/dist/{api-key-BEyGzjhr.mjs → api-key-CfniVimJ.mjs} +3 -3
- package/dist/{append-D4yRU3nt.mjs → append-DQCGJbx4.mjs} +2 -2
- package/dist/{archive-pMSD0Cou.mjs → archive-8xnKLGce.mjs} +1 -1
- package/dist/{archive-DoZ8HBxg.mjs → archive-BGHhmYW5.mjs} +1 -1
- package/dist/{archive-B4KdkRj1.mjs → archive-BbXaLXFf.mjs} +1 -1
- package/dist/{archive-B0wPQhnH.mjs → archive-BhNU06xM.mjs} +1 -1
- package/dist/{archive-jtNM7hhn.mjs → archive-CNrp0Xu5.mjs} +1 -1
- package/dist/{archive-CSt4KxhB.mjs → archive-CXsX26eE.mjs} +1 -1
- package/dist/{archive-BTsVi373.mjs → archive-CynNRHMt.mjs} +1 -1
- package/dist/{archive-BTpXIs7W.mjs → archive-DPETdLEn.mjs} +1 -1
- package/dist/{archive-DJT5Du9l.mjs → archive-DdnsMLHq.mjs} +1 -1
- package/dist/{archive-BkCFPiWS.mjs → archive-Dku9fvdF.mjs} +1 -1
- package/dist/{archive-BxN7gbKa.mjs → archive-DoDF-x8G.mjs} +1 -1
- package/dist/{archive-btZAAdMv.mjs → archive-DpT24NkM.mjs} +1 -1
- package/dist/{auth-BtrN725t.mjs → auth-BQxyR2Ky.mjs} +4 -4
- package/dist/{branches-D4Lwau0h.mjs → branches-wa3G1T3B.mjs} +1 -1
- package/dist/{breaking-DH9tr0ug.mjs → breaking-Cem7y-9U.mjs} +1 -1
- package/dist/{broken-DiT2Ww1u.mjs → broken-BkGLSqSO.mjs} +1 -1
- package/dist/{bulk-discard-values-D7jD6GjV.mjs → bulk-discard-values-BHryu-rZ.mjs} +1 -1
- package/dist/{bulk-edit-DsetARSf.mjs → bulk-edit-BPFITnRN.mjs} +1 -1
- package/dist/{bulk-rescan-values-DSUVmXSh.mjs → bulk-rescan-values-DaeLpv7G.mjs} +1 -1
- package/dist/{bulk-sync-schema-n5Qe7UnU.mjs → bulk-sync-schema-C_HNWZpZ.mjs} +1 -1
- package/dist/{cancel-oFccoFiE.mjs → cancel-DiMIFIU9.mjs} +1 -1
- package/dist/{cancel-task-kpJZ4G2I.mjs → cancel-task-0N0qb4_g.mjs} +1 -1
- package/dist/{card-Bnkg5z4G.mjs → card-CWDFIZAt.mjs} +8 -8
- package/dist/{cards-BCU56A8s.mjs → cards-Cu4jpvyn.mjs} +1 -1
- package/dist/{ci-DfbKRU5x.mjs → ci-CpsS8nSN.mjs} +1 -1
- package/dist/cli.mjs +41 -40
- package/dist/{client-BvjSFQ8P.mjs → client-C8qLIQKB.mjs} +17 -4
- package/dist/{collection-CXYDfvsX.mjs → collection-DF-kPs9K.mjs} +7 -7
- package/dist/{content-translation-CsRsYA5Q.mjs → content-translation-CfV9Ro5C.mjs} +2 -2
- package/dist/{copy-CR8wSNpp.mjs → copy-C8TUUSSh.mjs} +1 -1
- package/dist/{copy-7kyXaQVn.mjs → copy-x3tre7ha.mjs} +1 -1
- package/dist/{create-BIgILG1P.mjs → create-0nBN5L6G.mjs} +2 -2
- package/dist/{create-DHJ75ufg.mjs → create-6kfGBJ0u.mjs} +1 -1
- package/dist/{create-BhHZBIc4.mjs → create-B8qSd0YU.mjs} +1 -1
- package/dist/{create-DaspEGaN.mjs → create-BEAJgGgc.mjs} +1 -1
- package/dist/{create-gD1BKkjH.mjs → create-BaIQ7zio.mjs} +1 -1
- package/dist/{create-D6FGsFnV.mjs → create-BsbmZHOQ.mjs} +1 -1
- package/dist/{create-BZ9x1_Dm.mjs → create-CCxsc9eK.mjs} +1 -1
- package/dist/{create-BewmenPL.mjs → create-CLxy2CyM.mjs} +1 -1
- package/dist/{create-Cx47jTQ9.mjs → create-Cj75IfaX.mjs} +1 -1
- package/dist/{create-C1CwTQjk.mjs → create-CtMZUIOK.mjs} +1 -1
- package/dist/{create-BAxf_Wqm.mjs → create-DG1mYdU7.mjs} +1 -1
- package/dist/{create-DVYRfN1s.mjs → create-DIRUAgUx.mjs} +1 -1
- package/dist/{create-BZ_tLyVg.mjs → create-DS1ayvrI.mjs} +1 -1
- package/dist/{create-Ddt8jkGe.mjs → create-DcFQ2i9q.mjs} +1 -1
- package/dist/{create-BMe3ZtQi.mjs → create-DloJkv0t.mjs} +1 -1
- package/dist/{create-DG9NIdWy.mjs → create-axKIP4Lc.mjs} +1 -1
- package/dist/{create-branch-CSqKpG-X.mjs → create-branch-CQHIvpmr.mjs} +1 -1
- package/dist/{create-CxZe8ghH2.mjs → create-cXQtGG2g2.mjs} +1 -1
- package/dist/{create-BrFgRgjY.mjs → create-lsrPI45N.mjs} +1 -1
- package/dist/{create-DYf1fYsW.mjs → create-zuE-3HGv.mjs} +1 -1
- package/dist/{csv-CEQ5iHiR.mjs → csv-zQ5stw4T.mjs} +2 -2
- package/dist/{current-task-Cwn-A02w.mjs → current-task-CYWaDg5P.mjs} +1 -1
- package/dist/{dashboard-BQMAwgQv.mjs → dashboard-CDNnQXAe.mjs} +11 -11
- package/dist/{data-action-BOyBN50C.mjs → data-action-DX_TuywQ.mjs} +7 -7
- package/dist/{data-app-CTxlD3Sa.mjs → data-app-xTQWmzq-.mjs} +8 -7
- package/dist/{db-DjrLLqDW.mjs → db-DBT-XMcs.mjs} +7 -7
- package/dist/{delete-B3zIJHbp.mjs → delete-BHHw-4oq.mjs} +1 -1
- package/dist/{delete-BecCd6_I.mjs → delete-CSlir440.mjs} +1 -1
- package/dist/{delete-Crc2lguC.mjs → delete-DAE74TK7.mjs} +1 -1
- package/dist/{delete-DvHo5Dau.mjs → delete-DiBfDyWE.mjs} +1 -1
- package/dist/{delete-CYPidCqb.mjs → delete-Du3GTGrS.mjs} +1 -1
- package/dist/{delete-B8wPN6Mi.mjs → delete-Du7t8vTU.mjs} +1 -1
- package/dist/{delete-auLsOacz.mjs → delete-DwbfrWC4.mjs} +1 -1
- package/dist/{delete-rBkGuteA.mjs → delete-FOycMM5r.mjs} +1 -1
- package/dist/{delete-CA8N6OSh.mjs → delete-lSNap63e.mjs} +1 -1
- package/dist/{delete-table-CWo5Azjp.mjs → delete-table-Bn3lb-gW.mjs} +1 -1
- package/dist/{dependencies-B5rZybIE.mjs → dependencies-CHQOCCXo.mjs} +1 -1
- package/dist/{dependency-BCvsKkvF.mjs → dependency-BQuI3QS1.mjs} +5 -5
- package/dist/{dependents-DTokHohZ.mjs → dependents-COag5f7O.mjs} +1 -1
- package/dist/{dirty-DJzqGN8R.mjs → dirty-DEsgt8QN.mjs} +1 -1
- package/dist/{discard-values-Z0Aaau-z.mjs → discard-values-CkGnpZB3.mjs} +1 -1
- package/dist/{document-DaQNhYhh.mjs → document-BY74mMhh.mjs} +6 -6
- package/dist/{download-CUNQkaWC.mjs → download-DMxWx04z.mjs} +1 -1
- package/dist/{eid-CA9nIsPk.mjs → eid-Dk7g1tz0.mjs} +1 -1
- package/dist/embedding-sdk-DdFCPKMa.mjs +32 -0
- package/dist/{entry-flags-CsbT7fHf.mjs → entry-flags-C63qXMR4.mjs} +1 -1
- package/dist/{events-CtMOLbVW.mjs → events-DtN-OE9S.mjs} +1 -1
- package/dist/{execute-BFKWsB4U.mjs → execute-CEbgEWvO.mjs} +1 -1
- package/dist/{export-DsbEWoLo.mjs → export-CikXGxZP.mjs} +2 -2
- package/dist/{export-preflight-TRzdLXI_.mjs → export-preflight-2RkCrd6x.mjs} +1 -1
- package/dist/{field-BnSUwI5l.mjs → field-SgHCyoPp.mjs} +7 -7
- package/dist/{fields-Cf-yzUqO.mjs → fields-30XWd-y0.mjs} +1 -1
- package/dist/{fks-BL7aqSz3.mjs → fks-DbCuuP96.mjs} +1 -1
- package/dist/{generate-actions-D8iT2Vx_.mjs → generate-actions-PYrvMiLN.mjs} +1 -1
- package/dist/{generate-queries-Cmo2IFAd.mjs → generate-queries-DlGaK7DB.mjs} +1 -1
- package/dist/{generate-schema-Hubesglp.mjs → generate-schema-DqXCs2iX.mjs} +1 -1
- package/dist/{get-10d6M3WX.mjs → get-B5IXr2LA.mjs} +1 -1
- package/dist/{get-B_1SDjVE.mjs → get-BPg5lW4z.mjs} +1 -1
- package/dist/{get-xMWLwAHj.mjs → get-BY2dpwUf.mjs} +1 -1
- package/dist/{get-B0AwjMgu.mjs → get-BiJUoTTz.mjs} +1 -1
- package/dist/{get-BsLJ6NN4.mjs → get-C3VvI9wW.mjs} +1 -1
- package/dist/{get-CNwSqJ34.mjs → get-C4V3bjdM.mjs} +1 -1
- package/dist/{get-O81o3nAv.mjs → get-CDy5pcag.mjs} +1 -1
- package/dist/{get-CORcDYjE.mjs → get-CWt5CGo1.mjs} +1 -1
- package/dist/{get-DAsNzVI7.mjs → get-ChuHytCB.mjs} +1 -1
- package/dist/{get-DUvEGkvw.mjs → get-D2QYpaHG.mjs} +1 -1
- package/dist/{get-BRfgDBX1.mjs → get-DBnnbbJU.mjs} +1 -1
- package/dist/{get-45g97RD0.mjs → get-DNtdPWc7.mjs} +1 -1
- package/dist/{get-DIYDn-tm.mjs → get-DdtPtNWP.mjs} +1 -1
- package/dist/{get-B7I96VF7.mjs → get-DffZWqVG.mjs} +1 -1
- package/dist/{get-C4TSvV8x.mjs → get-DgVbjtv7.mjs} +2 -2
- package/dist/{get-CkiiPNoS.mjs → get-DhzTEa4L.mjs} +1 -1
- package/dist/{get-CHmUuPoY.mjs → get-DpJr1uPp.mjs} +1 -1
- package/dist/{get-C1d4sGGj.mjs → get-Dv5FwVWt.mjs} +1 -1
- package/dist/{get-BPrKH_VC.mjs → get-FQUF2V2a.mjs} +1 -1
- package/dist/{get-CQx83tws.mjs → get-c5S1A1KR.mjs} +1 -1
- package/dist/{get-Cvl3jefC.mjs → get-f6LqvU79.mjs} +1 -1
- package/dist/{get-run-uEQGMjmi.mjs → get-run-BdEVSnOR.mjs} +1 -1
- package/dist/{get-B6uK0K5I.mjs → get-titd1P4z.mjs} +1 -1
- package/dist/git-sync-BY0dqrLE.mjs +29 -0
- package/dist/{glossary-Cb37yiw3.mjs → glossary-C2p6xe3-.mjs} +4 -4
- package/dist/{graph-BKuSPVVZ.mjs → graph-Dp0sxg6m.mjs} +1 -1
- package/dist/{has-remote-changes-BUCHJZqQ.mjs → has-remote-changes-CMMXEsXa.mjs} +1 -1
- package/dist/{import-B-ekaPHP.mjs → import-DZmfmoBw.mjs} +2 -2
- package/dist/{is-dirty-BGcu7D5c.mjs → is-dirty-DgrWNWdj.mjs} +1 -1
- package/dist/{items-vDPpkZUK.mjs → items-BvyV49xR.mjs} +1 -1
- package/dist/{library-n-3eu6WW.mjs → library-CMC67i7O.mjs} +4 -4
- package/dist/{list-Ci8Y9AdJ.mjs → list-9tV8el7U.mjs} +1 -1
- package/dist/{list-UJ3nPrrD.mjs → list-AcjI7IXu.mjs} +1 -1
- package/dist/{list-DMdRy6Cx.mjs → list-B1NRLXpA.mjs} +1 -1
- package/dist/{list-Qy-5LvDC.mjs → list-BV-qhqJB.mjs} +1 -1
- package/dist/{list-jfxTNTSm.mjs → list-BcTm5zD7.mjs} +1 -1
- package/dist/{list-PvFvPn0p.mjs → list-Bh0hf0aa.mjs} +1 -1
- package/dist/{list-BoOFUEYh.mjs → list-BjIwIaNZ.mjs} +1 -1
- package/dist/{list-J5FxC72O.mjs → list-Bkmb6qmP.mjs} +1 -1
- package/dist/{list-D5yxCOsl.mjs → list-Bt2qs02U.mjs} +1 -1
- package/dist/{list-CoM1L7ZK.mjs → list-C0bBB4ay.mjs} +1 -1
- package/dist/{list-mkXqkfck.mjs → list-CSK4Ee6N.mjs} +1 -1
- package/dist/{list-nd6-vgOU.mjs → list-CUQa6nrb.mjs} +1 -1
- package/dist/{list-BtENqZIq.mjs → list-CcFPkvbL.mjs} +1 -1
- package/dist/{list-BSQPBkVu.mjs → list-ClMrjYPe.mjs} +1 -1
- package/dist/{list-BiXIUvBg.mjs → list-D2I4stFV.mjs} +3 -3
- package/dist/{list-C8a6WeMs.mjs → list-D7iymMGH.mjs} +1 -1
- package/dist/{list-D-zjbHfR.mjs → list-DK0LD_us.mjs} +1 -1
- package/dist/{list-e8h2S-3y.mjs → list-DPNOIQbS.mjs} +1 -1
- package/dist/{list-BIOCkt1A.mjs → list-DgEws5kk.mjs} +1 -1
- package/dist/{list-CADlvzKj.mjs → list-DyKjezNg.mjs} +1 -1
- package/dist/{list-JWWHtIMj.mjs → list-XRvOaGPo.mjs} +1 -1
- package/dist/{list-DJAlAVuS.mjs → list-pMhI_i46.mjs} +2 -2
- package/dist/{list-DU2dKd2T.mjs → list-rPk7T17I.mjs} +1 -1
- package/dist/{login-DcneUyj9.mjs → login-DGfZBNuL.mjs} +3 -3
- package/dist/{logout-wA2-ebUy.mjs → logout-bG_ZJkyr.mjs} +1 -1
- package/dist/{measure-BICKq4Ud.mjs → measure-Do19ivCX.mjs} +5 -5
- package/dist/{nano-id-qEgGloYk.mjs → nano-id-D_xVCG80.mjs} +1 -1
- package/dist/{parameter-values-d_zi14dw.mjs → parameter-values-gcfN0NVF.mjs} +1 -1
- package/dist/{path-Cn1xCJb_.mjs → path-bfe3wQV4.mjs} +2 -2
- package/dist/{poll-BGWVry_U.mjs → poll-DsKAeWSG.mjs} +1 -1
- package/dist/{publish-C89wo-cw.mjs → publish-uDuRQoQ5.mjs} +1 -1
- package/dist/{query-L29u5CEu.mjs → query-BBblM0de.mjs} +1 -1
- package/dist/{query-ja91JN10.mjs → query-yzdVy8IY.mjs} +1 -1
- package/dist/registry-flag-C6CMpxSu.mjs +96 -0
- package/dist/{remapping-B8aqlkSk.mjs → remapping-BYNOF4xJ.mjs} +1 -1
- package/dist/{remove-collection-LbKh838S.mjs → remove-collection-C_nLjEG6.mjs} +1 -1
- package/dist/{render-C96TStlT.mjs → render-DPahQNYA.mjs} +1 -1
- package/dist/{replace-B9Cyb9q2.mjs → replace-Dx_IgvBM.mjs} +2 -2
- package/dist/{requirement-check-XJCPOfWw.mjs → requirement-check-juL6K2it.mjs} +1 -1
- package/dist/{rescan-values-Ca4FVr2Q.mjs → rescan-values-B_5r6t7K.mjs} +1 -1
- package/dist/{rescan-values-uxZ22Z0c.mjs → rescan-values-C1ryy_S5.mjs} +1 -1
- package/dist/{run-CtGMVO3W.mjs → run-B19FOhID.mjs} +2 -2
- package/dist/{run-DskhDpUQ.mjs → run-By9Q7-P6.mjs} +2 -2
- package/dist/{run-BQvsDYzx.mjs → run-DM99qbxN.mjs} +1 -1
- package/dist/{run-B4zwhVuB.mjs → run-Dh4TQtVl.mjs} +186 -166
- package/dist/{runs-C0s-CfQE.mjs → runs-BlnHJEpy.mjs} +1 -1
- package/dist/{runtime-B8leBJ1G.mjs → runtime-DMb47Kan.mjs} +2 -2
- package/dist/{scaffold-BdrbFYhc.mjs → scaffold-xys21-_c.mjs} +5 -4
- package/dist/{schema-8tGj8t5W.mjs → schema-CItr2vjk.mjs} +1 -1
- package/dist/{schema-tables-DZRvTRLf.mjs → schema-tables-CxgXdUtj.mjs} +1 -1
- package/dist/{schemas-yiE-cMoI.mjs → schemas-BLhPyQRt.mjs} +1 -1
- package/dist/sdk-version-C_rurdw5.mjs +61 -0
- package/dist/{search-Cdd2cDNA.mjs → search-D9RL_Ao0.mjs} +1 -1
- package/dist/{search-1-5z-NQO.mjs → search-DW9byR1X.mjs} +1 -1
- package/dist/{segment-DcLtYcgq.mjs → segment-DYN7sJO_.mjs} +5 -5
- package/dist/semver-T6ZMOJpf.mjs +8 -0
- package/dist/{send-I5nk7MpB.mjs → send-OMqLoun6.mjs} +1 -1
- package/dist/{set-vigeEoz9.mjs → set-DjYrobzO.mjs} +1 -1
- package/dist/{set-active-DrgsPOnr.mjs → set-active-RCOa06in.mjs} +1 -1
- package/dist/{set-data-actions-C-TNEnTJ.mjs → set-data-actions-CcZHF3ot.mjs} +1 -1
- package/dist/{set-enabled-Co0jIMn0.mjs → set-enabled-IrDIT7Uc.mjs} +1 -1
- package/dist/{set-sensitivity-DCOxoynX.mjs → set-sensitivity-ZJb78vYE.mjs} +1 -1
- package/dist/{setting-DqHsywkM.mjs → setting-DjFeW_Bd.mjs} +3 -3
- package/dist/{setup-2EJT5aTc.mjs → setup-71MuR246.mjs} +1 -1
- package/dist/{skills-n1IpS3pA.mjs → skills-6NMamShR.mjs} +3 -3
- package/dist/{skills-xJsQWYll.mjs → skills-yg-WfvpW.mjs} +1 -1
- package/dist/{snippet-CDLpUxOv.mjs → snippet-CnTWEAgc.mjs} +5 -5
- package/dist/{stash-C7VstG6F.mjs → stash-CREL1rEx.mjs} +2 -2
- package/dist/{status-DZh35kON.mjs → status-C7_WDust.mjs} +1 -1
- package/dist/{status-BclmIIUO.mjs → status-CIK0pGS1.mjs} +2 -2
- package/dist/{subscription-DaEZk3Am.mjs → subscription-Cssyopsy.mjs} +5 -5
- package/dist/{subscriptions-DcOtdHen.mjs → subscriptions-DW-rgYA2.mjs} +2 -2
- package/dist/{summary-yoqD8lKK.mjs → summary-BgYasLRg.mjs} +1 -1
- package/dist/{sync-schema-C7mvw4JY.mjs → sync-schema-Bw5lh64d.mjs} +1 -1
- package/dist/{sync-schema-QcmZUpbc.mjs → sync-schema-CERYSKAq.mjs} +2 -2
- package/dist/table-Be5Vl7JT.mjs +26 -0
- package/dist/{timeline-xSDfBYEA.mjs → timeline-C1EGYIWm.mjs} +7 -7
- package/dist/{timeline-event-B3bnxvSU.mjs → timeline-event-CNResXsb.mjs} +5 -5
- package/dist/transform-Cev-LAhH.mjs +28 -0
- package/dist/transform-job-BnI6Ivqh.mjs +22 -0
- package/dist/{transform-tag-Dh_xkEHJ.mjs → transform-tag-Co2WuSBJ.mjs} +4 -4
- package/dist/{transform-test-DO4J2dGZ.mjs → transform-test-DJTET6yX.mjs} +6 -6
- package/dist/{transforms-BhycY9Dy.mjs → transforms-D4WJPdxv.mjs} +1 -1
- package/dist/{transport-B4wfgpqB.mjs → transport-C23PjC9C.mjs} +2 -2
- package/dist/{tree-C0Jqbvr7.mjs → tree-BOzjsQT9.mjs} +1 -1
- package/dist/{unpublish-0erfDFu-.mjs → unpublish-jVyBAFYQ.mjs} +1 -1
- package/dist/{unreferenced-CHJuU079.mjs → unreferenced-CxZBGK-v.mjs} +1 -1
- package/dist/{update-DAl3J-6n.mjs → update-B0fK8ufL.mjs} +1 -1
- package/dist/{update-CZkKz3PD.mjs → update-B2zy3jnR.mjs} +1 -1
- package/dist/{update-BHz5uxTe.mjs → update-B82aqBJ5.mjs} +1 -1
- package/dist/{update-BYfjNqm0.mjs → update-B9xWx1RV.mjs} +1 -1
- package/dist/{update-CR1zzVES.mjs → update-BP4Jzan1.mjs} +1 -1
- package/dist/{update-C7_YQxNg.mjs → update-BPSI4D36.mjs} +1 -1
- package/dist/{update-Dh1X_b9e2.mjs → update-BvbuAD8_2.mjs} +1 -1
- package/dist/{update-Bzbst6T5.mjs → update-C86ovTcd.mjs} +1 -1
- package/dist/{update-DqN3ikiq.mjs → update-CnOJU0E9.mjs} +2 -2
- package/dist/{update-CjKfz61h.mjs → update-DS7FwMdV.mjs} +1 -1
- package/dist/{update-DnGjFqwP.mjs → update-DTkJqBmp.mjs} +1 -1
- package/dist/{update-Is5yboYO.mjs → update-DTwwlTus.mjs} +1 -1
- package/dist/{update-C8Ec4fCx.mjs → update-Datagi0N.mjs} +1 -1
- package/dist/{update-BGCKUTtV.mjs → update-DhyyfH1b.mjs} +1 -1
- package/dist/{update-BPaXLS7J.mjs → update-DkzE2qOr.mjs} +1 -1
- package/dist/{update-BAl0aZsq.mjs → update-DmVDc-cc.mjs} +1 -1
- package/dist/{update-CBcKfzne.mjs → update-Dmfimhno.mjs} +1 -1
- package/dist/{update-ujP9d00H.mjs → update-SQtRtpRg.mjs} +1 -1
- package/dist/{update-dashcard-B8s5t0jG.mjs → update-dashcard-dhjE7CQz.mjs} +1 -1
- package/dist/{update-DSlAN-t5.mjs → update-nzPxtrWU.mjs} +1 -1
- package/dist/{upgrade-Dc43HJun.mjs → upgrade-Ckdl0SYl.mjs} +7 -87
- package/dist/{upload-xXTXZQsW.mjs → upload-CTj7eVZk.mjs} +1 -1
- package/dist/{upload-DIiiLP23.mjs → upload-DGl7iSh3.mjs} +3 -3
- package/dist/{upload-DWwwFANs.mjs → upload-UYuGBsus.mjs} +2 -2
- package/dist/{uuid-BNZQ6Dyb.mjs → uuid-CPLh7mDU.mjs} +1 -1
- package/dist/{values-thjqrbtC.mjs → values-Bplkmfue.mjs} +1 -1
- package/dist/{verify-CqJPc-DW.mjs → verify-Cg1TFaPs.mjs} +2 -2
- package/dist/{verify-DNhhRy4T.mjs → verify-CzlfG_Or.mjs} +1 -1
- package/dist/{verify-CLObQxZk.mjs → verify-pLZ7b7JP.mjs} +1 -1
- package/dist/{wait-DxeRAukN.mjs → wait-D9yIDRpl.mjs} +3 -3
- package/dist/{wait-flags-P5MIy4fp.mjs → wait-flags-C4CH6rTJ.mjs} +1 -1
- package/package.json +1 -1
- package/skill-data/data-app/SKILL.md +9 -7
- package/skill-data/data-app/template/README.md +8 -4
- package/skill-data/data-app-data/SKILL.md +13 -1
- package/dist/git-sync-CswhluG_.mjs +0 -29
- package/dist/table-CSv2nzuP.mjs +0 -26
- package/dist/transform-D5ugnljj.mjs +0 -28
- package/dist/transform-job-C3uL7HVt.mjs +0 -22
- package/skill-data/data-app/template/LICENSE +0 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { g as errorMessage } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { O as warn, ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { a as CollectionCompact, r as Collection } from "./collection-Cz2qLX2m.mjs";
|
|
5
5
|
import { i as tableSelectorFlags, n as parseTableSelectors } from "./table-selector-flags-FNPxRc9B.mjs";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { o as ConfigError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { X as chainRequestFailure, Y as HttpError, _ as MALFORMED_CELL, ct as connectionFlags, et as parseJson, f as renderSummary, h as writeJson, l as renderItem, m as serializeJson, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
3
|
-
import { n as readJsonBody, t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { n as readJsonBody, t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { o as CardQueryResult } from "./card-BJRZ5D5Q.mjs";
|
|
6
6
|
import { n as Field } from "./field-C2qOViFZ.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { o as ConfigError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { ct as connectionFlags, et as parseJson, f as renderSummary, mt as profileFlag, pt as outputFlags, yt as parseOptionalInteger } from "./cli.mjs";
|
|
3
3
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
4
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
4
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
5
5
|
import { o as CardQueryResult } from "./card-BJRZ5D5Q.mjs";
|
|
6
6
|
import { t as cardQueryView } from "./card-VipF12MJ.mjs";
|
|
7
7
|
import { i as formatQueryResult, n as exportFlags, r as readExportRequest, t as assertStreamedOutput } from "./export-flags-DkbYlWlE.mjs";
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { g as errorMessage, l as MetabaseError, p as TimeoutError, u as NetworkError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
|
+
import { et as parseJson, nt as parseJsonResult, t as interruptSignal } from "./cli.mjs";
|
|
3
|
+
import { D as USER_AGENT, G as throwIfAborted, W as combineAborts } from "./runtime-DMb47Kan.mjs";
|
|
4
|
+
import { t as SemverString } from "./semver-T6ZMOJpf.mjs";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
//#region src/core/npm-registry.ts
|
|
7
|
+
const DEFAULT_REGISTRY = "https://registry.npmjs.org";
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 15e3;
|
|
9
|
+
const ERROR_BODY_BYTE_CAP = 8 * 1024;
|
|
10
|
+
const NpmDistTags = z.object({ latest: SemverString }).catchall(SemverString);
|
|
11
|
+
const NpmErrorBody = z.object({ error: z.string() }).loose();
|
|
12
|
+
var NpmRegistryError = class extends MetabaseError {
|
|
13
|
+
category = "http";
|
|
14
|
+
isRetryable = false;
|
|
15
|
+
developerDetail;
|
|
16
|
+
constructor(detail) {
|
|
17
|
+
super(registryErrorMessage(detail));
|
|
18
|
+
this.name = "NpmRegistryError";
|
|
19
|
+
this.developerDetail = detail;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
function registryErrorMessage({ status, url, rawBody }) {
|
|
23
|
+
const answered = `npm registry answered HTTP ${status} for GET ${url}`;
|
|
24
|
+
if (rawBody === null) return answered;
|
|
25
|
+
const said = parseJsonResult(rawBody, NpmErrorBody);
|
|
26
|
+
return said.ok ? `${answered}: ${said.value.error}` : answered;
|
|
27
|
+
}
|
|
28
|
+
async function fetchNpmDistTags(packageName, opts) {
|
|
29
|
+
const registry = opts.registry ?? "https://registry.npmjs.org";
|
|
30
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
31
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
32
|
+
const url = buildDistTagsUrl(registry, packageName);
|
|
33
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
34
|
+
const combined = combineAborts(timeoutSignal, opts.signal);
|
|
35
|
+
let response;
|
|
36
|
+
try {
|
|
37
|
+
response = await fetchImpl(url, {
|
|
38
|
+
method: "GET",
|
|
39
|
+
headers: {
|
|
40
|
+
accept: "application/json",
|
|
41
|
+
"user-agent": opts.userAgent
|
|
42
|
+
},
|
|
43
|
+
signal: combined
|
|
44
|
+
});
|
|
45
|
+
} catch (error) {
|
|
46
|
+
throwIfAborted(opts.signal);
|
|
47
|
+
if (timeoutSignal.aborted) throw new TimeoutError(`npm registry request timed out after ${timeoutMs}ms`, {
|
|
48
|
+
kind: "http",
|
|
49
|
+
method: "GET",
|
|
50
|
+
url,
|
|
51
|
+
timeoutMs
|
|
52
|
+
});
|
|
53
|
+
const cause = errorMessage(error);
|
|
54
|
+
throw new NetworkError(`could not reach npm registry: ${cause}`, {
|
|
55
|
+
method: "GET",
|
|
56
|
+
url,
|
|
57
|
+
cause
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (!response.ok) throw new NpmRegistryError({
|
|
61
|
+
status: response.status,
|
|
62
|
+
url,
|
|
63
|
+
rawBody: await readErrorBody(response)
|
|
64
|
+
});
|
|
65
|
+
return parseJson(await response.text(), NpmDistTags, { source: url });
|
|
66
|
+
}
|
|
67
|
+
function buildDistTagsUrl(registry, packageName) {
|
|
68
|
+
return `${registry.replace(/\/+$/, "")}/-/package/${packageName.replace("/", "%2F")}/dist-tags`;
|
|
69
|
+
}
|
|
70
|
+
async function readErrorBody(response) {
|
|
71
|
+
try {
|
|
72
|
+
return (await response.text()).slice(0, ERROR_BODY_BYTE_CAP);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return `[body read failed: ${errorMessage(error)}]`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/commands/registry-flag.ts
|
|
79
|
+
const registryFlag = { registry: {
|
|
80
|
+
type: "string",
|
|
81
|
+
description: `npm registry URL (default: ${DEFAULT_REGISTRY})`
|
|
82
|
+
} };
|
|
83
|
+
function distTagsOptions(registryArg) {
|
|
84
|
+
const registry = registryArg?.trim();
|
|
85
|
+
if (registry === void 0 || registry === "") return {
|
|
86
|
+
userAgent: USER_AGENT,
|
|
87
|
+
signal: interruptSignal
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
userAgent: USER_AGENT,
|
|
91
|
+
registry,
|
|
92
|
+
signal: interruptSignal
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { registryFlag as n, fetchNpmDistTags as r, distTagsOptions as t };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags, v as formatScalar } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { n as parseText } from "./parse-text-C4LYzIFa.mjs";
|
|
5
5
|
import { i as fieldRemappingMissView, r as fieldRemappingMatchView, t as FieldRemappingResult, u as toValueLabel } from "./field-CT4r6b92.mjs";
|
|
6
6
|
//#region src/commands/field/remapping.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { u as SyncSettingsUpdateResult } from "./git-sync-DP4wQFzm.mjs";
|
|
5
5
|
import { c as syncSettingsUpdateView } from "./git-sync-D1aKczo6.mjs";
|
|
6
6
|
//#region src/commands/git-sync/remove-collection.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { x as KNOWN_RANGE } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import "./cli.mjs";
|
|
3
|
-
import { nt as Skew } from "./runtime-
|
|
3
|
+
import { nt as Skew } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
//#region src/commands/auth/render.ts
|
|
5
5
|
const SKEW_LABEL = Object.freeze({
|
|
6
6
|
supported: "supported",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { n as UploadUpdateResult } from "./upload-DAtxBBms.mjs";
|
|
5
|
-
import { n as requireUploadFilePath, t as readCsvFile } from "./upload-
|
|
5
|
+
import { n as requireUploadFilePath, t as readCsvFile } from "./upload-CTj7eVZk.mjs";
|
|
6
6
|
import { n as uploadUpdateResultView } from "./upload-C3z5ZaXA.mjs";
|
|
7
7
|
//#region src/commands/upload/replace.ts
|
|
8
8
|
var replace_default = defineMetabaseCommand({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as missingTokenFeatureMessage, U as FEATURE_RULES, V as versionTooOldMessage } from "./cli.mjs";
|
|
2
|
-
import { at as describeVersion, it as featureGap } from "./runtime-
|
|
2
|
+
import { at as describeVersion, it as featureGap } from "./runtime-DMb47Kan.mjs";
|
|
3
3
|
//#region ../client/src/version/requirement-check.ts
|
|
4
4
|
/** The first of `features` the profile lacks, or `null` when it has every one. */
|
|
5
5
|
function checkFeatures(features, profile) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { p as TableFieldValuesResult } from "./table-hgrX1i-R.mjs";
|
|
5
5
|
import { i as tableFieldValuesResultView } from "./table-CcUdjp8F.mjs";
|
|
6
6
|
//#region src/commands/table/rescan-values.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { a as DatabaseSyncResult } from "./database-C5ucihp3.mjs";
|
|
5
5
|
import { n as databaseSyncResultView } from "./database-u_spHEa0.mjs";
|
|
6
6
|
//#region src/commands/db/rescan-values.ts
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { o as ConfigError, s as FailedResultError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { ct as connectionFlags, mt as profileFlag, p as renderSummaryWithinMaxBytes, pt as outputFlags, t as interruptSignal } from "./cli.mjs";
|
|
3
3
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
4
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
5
|
-
import { t as DEFAULT_TIMEOUT_MS } from "./transport-
|
|
4
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
5
|
+
import { t as DEFAULT_TIMEOUT_MS } from "./transport-C23PjC9C.mjs";
|
|
6
6
|
import { i as TransformTestRunResult } from "./transform-test-D6QIyu8C.mjs";
|
|
7
7
|
import { t as transformTestRunResultView } from "./transform-test-D-e9oi6r.mjs";
|
|
8
8
|
//#region src/commands/transform-test/run.ts
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { s as FailedResultError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
3
3
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
4
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
4
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
5
5
|
import { c as TransformRunResult, p as isTransformRunFailed } from "./transform-B62craFM.mjs";
|
|
6
|
-
import { i as waitFlags, n as parseWaitFlags } from "./wait-flags-
|
|
6
|
+
import { i as waitFlags, n as parseWaitFlags } from "./wait-flags-C4CH6rTJ.mjs";
|
|
7
7
|
//#region src/commands/transform/run.ts
|
|
8
8
|
const transformRunResultView = {
|
|
9
9
|
compactPick: TransformRunResult,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ct as connectionFlags, f as renderSummary, mt as profileFlag, pt as outputFlags } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { a as TransformJobRunResult } from "./transform-job-CDIb3B9o.mjs";
|
|
5
5
|
//#region src/commands/transform-job/run.ts
|
|
6
6
|
const transformJobRunResultView = {
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { c as InternalError, f as ResponseShapeError, h as ValidationError, i as AbortError, o as ConfigError, p as TimeoutError, r as isPlainObject, s as FailedResultError, u as NetworkError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { R as CapabilityError, Y as HttpError, Z as isHttpNotFound, a as exitCodeFor, c as lineWriter, ct as connectionFlags, lt as formatFlags, m as serializeJson, mt as profileFlag, s as jsonLineWriter, t as interruptSignal, vt as parseInteger } from "./cli.mjs";
|
|
3
|
-
import { i as NotAuthenticatedError, t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { i as NotAuthenticatedError, t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { i as TransformTestRunResult, o as isTransformTestCode } from "./transform-test-D6QIyu8C.mjs";
|
|
5
5
|
import { a as runProcess, n as ProcessNotFoundError, o as runProcessBinary, r as ProcessTimeoutError, t as ProcessInterruptedError } from "./process-ByKCTa6A.mjs";
|
|
6
6
|
import { t as parseMetabaseYaml } from "./yaml-BtI8iDba.mjs";
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import { rename, rm, writeFile } from "node:fs/promises";
|
|
8
|
+
import { mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
9
|
+
import { appendFileSync } from "node:fs";
|
|
9
10
|
import { basename, dirname, join } from "node:path";
|
|
10
11
|
import { randomUUID } from "node:crypto";
|
|
11
12
|
import { isDeepStrictEqual } from "node:util";
|
|
@@ -419,6 +420,167 @@ function cellText(value) {
|
|
|
419
420
|
return value === null ? "null" : String(value);
|
|
420
421
|
}
|
|
421
422
|
//#endregion
|
|
423
|
+
//#region src/runtime/git.ts
|
|
424
|
+
const GIT = "git";
|
|
425
|
+
const NO_MATCH_EXIT_CODE = 1;
|
|
426
|
+
const NO_MERGE_BASE_EXIT_CODE = 1;
|
|
427
|
+
const UNKNOWN_REF_EXIT_CODE = 1;
|
|
428
|
+
const GIT_TIMEOUT_MS = 12e4;
|
|
429
|
+
async function withGit(repo, args, spawn) {
|
|
430
|
+
try {
|
|
431
|
+
return await spawn();
|
|
432
|
+
} catch (error) {
|
|
433
|
+
if (error instanceof ProcessNotFoundError) throw new ConfigError("git is not installed or not on PATH");
|
|
434
|
+
if (error instanceof ProcessInterruptedError) throw new AbortError(`interrupted while git ${args.join(" ")} ran in ${repo}`);
|
|
435
|
+
if (error instanceof ProcessTimeoutError) throw new ConfigError(`git ${args.join(" ")} did not finish within ${GIT_TIMEOUT_MS / 1e3} s in ${repo}`);
|
|
436
|
+
throw error;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
function runGit(repo, args, signal) {
|
|
440
|
+
return withGit(repo, args, () => runProcess(GIT, [
|
|
441
|
+
"-C",
|
|
442
|
+
repo,
|
|
443
|
+
...args
|
|
444
|
+
], {
|
|
445
|
+
signal,
|
|
446
|
+
timeoutMs: GIT_TIMEOUT_MS
|
|
447
|
+
}));
|
|
448
|
+
}
|
|
449
|
+
async function git(repo, args, signal) {
|
|
450
|
+
const result = await runGit(repo, args, signal);
|
|
451
|
+
if (result.exitCode !== 0) throw new ConfigError(`git ${args.join(" ")} failed in ${repo}: ${result.stderr.trim()}`);
|
|
452
|
+
return result.stdout;
|
|
453
|
+
}
|
|
454
|
+
async function repositoryRoot(repo, signal) {
|
|
455
|
+
const result = await runGit(repo, ["rev-parse", "--show-toplevel"], signal);
|
|
456
|
+
if (result.exitCode !== 0) throw new ConfigError(`--repo ${repo} is not inside a git work tree: ${result.stderr.trim()}`);
|
|
457
|
+
return result.stdout.trim();
|
|
458
|
+
}
|
|
459
|
+
async function resolveCommit(repo, ref, flag, signal) {
|
|
460
|
+
const result = await runGit(repo, [
|
|
461
|
+
"rev-parse",
|
|
462
|
+
"--verify",
|
|
463
|
+
"--quiet",
|
|
464
|
+
"--end-of-options",
|
|
465
|
+
`${ref}^{commit}`
|
|
466
|
+
], signal);
|
|
467
|
+
if (result.exitCode === UNKNOWN_REF_EXIT_CODE) throw new ConfigError(`${flag} ${ref} is not a commit in ${repo}`);
|
|
468
|
+
if (result.exitCode !== 0) throw new ConfigError(`git rev-parse failed in ${repo}: ${result.stderr.trim()}`);
|
|
469
|
+
return result.stdout.trim();
|
|
470
|
+
}
|
|
471
|
+
async function checkedOutCommit(repo, signal) {
|
|
472
|
+
const result = await runGit(repo, [
|
|
473
|
+
"rev-parse",
|
|
474
|
+
"--verify",
|
|
475
|
+
"--quiet",
|
|
476
|
+
"HEAD"
|
|
477
|
+
], signal);
|
|
478
|
+
if (result.exitCode === UNKNOWN_REF_EXIT_CODE) return null;
|
|
479
|
+
if (result.exitCode !== 0) throw new ConfigError(`git rev-parse HEAD failed in ${repo}: ${result.stderr.trim()}`);
|
|
480
|
+
return result.stdout.trim();
|
|
481
|
+
}
|
|
482
|
+
async function mergeBase(repo, base, head, signal) {
|
|
483
|
+
const result = await runGit(repo, [
|
|
484
|
+
"merge-base",
|
|
485
|
+
base,
|
|
486
|
+
head
|
|
487
|
+
], signal);
|
|
488
|
+
if (result.exitCode === NO_MERGE_BASE_EXIT_CODE) throw new ConfigError(`--base and --head share no history in ${repo}: the clone may be shallow (fetch the full history, e.g. actions/checkout with fetch-depth: 0), or the histories are unrelated`);
|
|
489
|
+
if (result.exitCode !== 0) throw new ConfigError(`git merge-base failed in ${repo}: ${result.stderr.trim()}`);
|
|
490
|
+
return result.stdout.trim();
|
|
491
|
+
}
|
|
492
|
+
function diffNameStatus(repo, from, to, signal) {
|
|
493
|
+
return git(repo, [
|
|
494
|
+
"diff",
|
|
495
|
+
"--name-status",
|
|
496
|
+
"-z",
|
|
497
|
+
"-M",
|
|
498
|
+
from,
|
|
499
|
+
to
|
|
500
|
+
], signal);
|
|
501
|
+
}
|
|
502
|
+
function statusPorcelain(repo, signal) {
|
|
503
|
+
return git(repo, [
|
|
504
|
+
"status",
|
|
505
|
+
"--porcelain",
|
|
506
|
+
"-z",
|
|
507
|
+
"--untracked-files=all"
|
|
508
|
+
], signal);
|
|
509
|
+
}
|
|
510
|
+
async function fileModesAt(repo, commit, signal) {
|
|
511
|
+
const output = await git(repo, [
|
|
512
|
+
"ls-tree",
|
|
513
|
+
"-r",
|
|
514
|
+
"-z",
|
|
515
|
+
"--full-tree",
|
|
516
|
+
commit
|
|
517
|
+
], signal);
|
|
518
|
+
const modes = /* @__PURE__ */ new Map();
|
|
519
|
+
for (const record of output.split("\0")) {
|
|
520
|
+
if (record === "") continue;
|
|
521
|
+
const space = record.indexOf(" ");
|
|
522
|
+
const tab = record.indexOf(" ");
|
|
523
|
+
if (space === -1 || tab < space) throw new InternalError(`git ls-tree -z: malformed entry "${record}"`);
|
|
524
|
+
modes.set(record.slice(tab + 1), record.slice(0, space));
|
|
525
|
+
}
|
|
526
|
+
return modes;
|
|
527
|
+
}
|
|
528
|
+
async function filesMatching(repo, commit, pattern, pathspecs, signal) {
|
|
529
|
+
const result = await runGit(repo, [
|
|
530
|
+
"grep",
|
|
531
|
+
"--no-color",
|
|
532
|
+
"-z",
|
|
533
|
+
"-l",
|
|
534
|
+
"-E",
|
|
535
|
+
"-e",
|
|
536
|
+
pattern,
|
|
537
|
+
commit,
|
|
538
|
+
"--",
|
|
539
|
+
...pathspecs
|
|
540
|
+
], signal);
|
|
541
|
+
if (result.exitCode === NO_MATCH_EXIT_CODE) return [];
|
|
542
|
+
if (result.exitCode !== 0) throw new ConfigError(`git grep failed in ${repo}: ${result.stderr.trim()}`);
|
|
543
|
+
const prefix = `${commit}:`;
|
|
544
|
+
return result.stdout.split("\0").filter((entry) => entry !== "").map((entry) => {
|
|
545
|
+
if (!entry.startsWith(prefix)) throw new InternalError(`git grep printed "${entry}", which does not start with ${prefix}`);
|
|
546
|
+
return entry.slice(prefix.length);
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
const NEWLINE = 10;
|
|
550
|
+
const utf8 = new TextDecoder("utf-8");
|
|
551
|
+
async function readFilesAt(repo, commit, paths, signal) {
|
|
552
|
+
const files = /* @__PURE__ */ new Map();
|
|
553
|
+
if (paths.length === 0) return files;
|
|
554
|
+
const multiline = paths.find((path) => path.includes("\n"));
|
|
555
|
+
if (multiline !== void 0) throw new ConfigError(`cannot read ${JSON.stringify(multiline)}: a path with a newline cannot be batched`);
|
|
556
|
+
const args = ["cat-file", "--batch"];
|
|
557
|
+
const result = await withGit(repo, args, () => runProcessBinary(GIT, [
|
|
558
|
+
"-C",
|
|
559
|
+
repo,
|
|
560
|
+
...args
|
|
561
|
+
], {
|
|
562
|
+
stdin: paths.map((path) => `${commit}:${path}\n`).join(""),
|
|
563
|
+
signal,
|
|
564
|
+
timeoutMs: GIT_TIMEOUT_MS
|
|
565
|
+
}));
|
|
566
|
+
if (result.exitCode !== 0) throw new ConfigError(`git cat-file --batch failed in ${repo}: ${result.stderr.trim()}`);
|
|
567
|
+
const output = result.stdout;
|
|
568
|
+
let offset = 0;
|
|
569
|
+
for (const path of paths) {
|
|
570
|
+
const headerEnd = output.indexOf(NEWLINE, offset);
|
|
571
|
+
if (headerEnd === -1) throw new InternalError(`git cat-file --batch stopped before ${path}`);
|
|
572
|
+
const header = utf8.decode(output.subarray(offset, headerEnd)).split(" ");
|
|
573
|
+
const size = Number(header[2]);
|
|
574
|
+
if (header[1] !== "blob" || !Number.isInteger(size)) throw new InternalError(`${path} is not a file at ${commit}, though git listed it there`);
|
|
575
|
+
const start = headerEnd + 1;
|
|
576
|
+
if (output[start + size] !== NEWLINE) throw new InternalError(`git cat-file --batch framed ${path} with ${size} bytes, but no newline follows them`);
|
|
577
|
+
files.set(path, utf8.decode(output.subarray(start, start + size)));
|
|
578
|
+
offset = start + size + 1;
|
|
579
|
+
}
|
|
580
|
+
if (offset !== output.length) throw new InternalError("git cat-file --batch printed more than the paths it was asked for");
|
|
581
|
+
return files;
|
|
582
|
+
}
|
|
583
|
+
//#endregion
|
|
422
584
|
//#region src/core/ci-affected.ts
|
|
423
585
|
const SINGLE_PATH_STATUSES = /* @__PURE__ */ new Map([
|
|
424
586
|
["A", "added"],
|
|
@@ -657,167 +819,6 @@ function unreadContentWarning(reasons) {
|
|
|
657
819
|
};
|
|
658
820
|
}
|
|
659
821
|
//#endregion
|
|
660
|
-
//#region src/runtime/git.ts
|
|
661
|
-
const GIT = "git";
|
|
662
|
-
const NO_MATCH_EXIT_CODE = 1;
|
|
663
|
-
const NO_MERGE_BASE_EXIT_CODE = 1;
|
|
664
|
-
const UNKNOWN_REF_EXIT_CODE = 1;
|
|
665
|
-
const GIT_TIMEOUT_MS = 12e4;
|
|
666
|
-
async function withGit(repo, args, spawn) {
|
|
667
|
-
try {
|
|
668
|
-
return await spawn();
|
|
669
|
-
} catch (error) {
|
|
670
|
-
if (error instanceof ProcessNotFoundError) throw new ConfigError("git is not installed or not on PATH");
|
|
671
|
-
if (error instanceof ProcessInterruptedError) throw new AbortError(`interrupted while git ${args.join(" ")} ran in ${repo}`);
|
|
672
|
-
if (error instanceof ProcessTimeoutError) throw new ConfigError(`git ${args.join(" ")} did not finish within ${GIT_TIMEOUT_MS / 1e3} s in ${repo}`);
|
|
673
|
-
throw error;
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
function runGit(repo, args, signal) {
|
|
677
|
-
return withGit(repo, args, () => runProcess(GIT, [
|
|
678
|
-
"-C",
|
|
679
|
-
repo,
|
|
680
|
-
...args
|
|
681
|
-
], {
|
|
682
|
-
signal,
|
|
683
|
-
timeoutMs: GIT_TIMEOUT_MS
|
|
684
|
-
}));
|
|
685
|
-
}
|
|
686
|
-
async function git(repo, args, signal) {
|
|
687
|
-
const result = await runGit(repo, args, signal);
|
|
688
|
-
if (result.exitCode !== 0) throw new ConfigError(`git ${args.join(" ")} failed in ${repo}: ${result.stderr.trim()}`);
|
|
689
|
-
return result.stdout;
|
|
690
|
-
}
|
|
691
|
-
async function repositoryRoot(repo, signal) {
|
|
692
|
-
const result = await runGit(repo, ["rev-parse", "--show-toplevel"], signal);
|
|
693
|
-
if (result.exitCode !== 0) throw new ConfigError(`--repo ${repo} is not inside a git work tree: ${result.stderr.trim()}`);
|
|
694
|
-
return result.stdout.trim();
|
|
695
|
-
}
|
|
696
|
-
async function resolveCommit(repo, ref, flag, signal) {
|
|
697
|
-
const result = await runGit(repo, [
|
|
698
|
-
"rev-parse",
|
|
699
|
-
"--verify",
|
|
700
|
-
"--quiet",
|
|
701
|
-
"--end-of-options",
|
|
702
|
-
`${ref}^{commit}`
|
|
703
|
-
], signal);
|
|
704
|
-
if (result.exitCode === UNKNOWN_REF_EXIT_CODE) throw new ConfigError(`${flag} ${ref} is not a commit in ${repo}`);
|
|
705
|
-
if (result.exitCode !== 0) throw new ConfigError(`git rev-parse failed in ${repo}: ${result.stderr.trim()}`);
|
|
706
|
-
return result.stdout.trim();
|
|
707
|
-
}
|
|
708
|
-
async function checkedOutCommit(repo, signal) {
|
|
709
|
-
const result = await runGit(repo, [
|
|
710
|
-
"rev-parse",
|
|
711
|
-
"--verify",
|
|
712
|
-
"--quiet",
|
|
713
|
-
"HEAD"
|
|
714
|
-
], signal);
|
|
715
|
-
if (result.exitCode === UNKNOWN_REF_EXIT_CODE) return null;
|
|
716
|
-
if (result.exitCode !== 0) throw new ConfigError(`git rev-parse HEAD failed in ${repo}: ${result.stderr.trim()}`);
|
|
717
|
-
return result.stdout.trim();
|
|
718
|
-
}
|
|
719
|
-
async function mergeBase(repo, base, head, signal) {
|
|
720
|
-
const result = await runGit(repo, [
|
|
721
|
-
"merge-base",
|
|
722
|
-
base,
|
|
723
|
-
head
|
|
724
|
-
], signal);
|
|
725
|
-
if (result.exitCode === NO_MERGE_BASE_EXIT_CODE) throw new ConfigError(`--base and --head share no history in ${repo}: the clone may be shallow (fetch the full history, e.g. actions/checkout with fetch-depth: 0), or the histories are unrelated`);
|
|
726
|
-
if (result.exitCode !== 0) throw new ConfigError(`git merge-base failed in ${repo}: ${result.stderr.trim()}`);
|
|
727
|
-
return result.stdout.trim();
|
|
728
|
-
}
|
|
729
|
-
function diffNameStatus(repo, from, to, signal) {
|
|
730
|
-
return git(repo, [
|
|
731
|
-
"diff",
|
|
732
|
-
"--name-status",
|
|
733
|
-
"-z",
|
|
734
|
-
"-M",
|
|
735
|
-
from,
|
|
736
|
-
to
|
|
737
|
-
], signal);
|
|
738
|
-
}
|
|
739
|
-
function statusPorcelain(repo, signal) {
|
|
740
|
-
return git(repo, [
|
|
741
|
-
"status",
|
|
742
|
-
"--porcelain",
|
|
743
|
-
"-z",
|
|
744
|
-
"--untracked-files=all"
|
|
745
|
-
], signal);
|
|
746
|
-
}
|
|
747
|
-
async function fileModesAt(repo, commit, signal) {
|
|
748
|
-
const output = await git(repo, [
|
|
749
|
-
"ls-tree",
|
|
750
|
-
"-r",
|
|
751
|
-
"-z",
|
|
752
|
-
"--full-tree",
|
|
753
|
-
commit
|
|
754
|
-
], signal);
|
|
755
|
-
const modes = /* @__PURE__ */ new Map();
|
|
756
|
-
for (const record of output.split("\0")) {
|
|
757
|
-
if (record === "") continue;
|
|
758
|
-
const space = record.indexOf(" ");
|
|
759
|
-
const tab = record.indexOf(" ");
|
|
760
|
-
if (space === -1 || tab < space) throw new InternalError(`git ls-tree -z: malformed entry "${record}"`);
|
|
761
|
-
modes.set(record.slice(tab + 1), record.slice(0, space));
|
|
762
|
-
}
|
|
763
|
-
return modes;
|
|
764
|
-
}
|
|
765
|
-
async function filesMatching(repo, commit, pattern, pathspecs, signal) {
|
|
766
|
-
const result = await runGit(repo, [
|
|
767
|
-
"grep",
|
|
768
|
-
"--no-color",
|
|
769
|
-
"-z",
|
|
770
|
-
"-l",
|
|
771
|
-
"-E",
|
|
772
|
-
"-e",
|
|
773
|
-
pattern,
|
|
774
|
-
commit,
|
|
775
|
-
"--",
|
|
776
|
-
...pathspecs
|
|
777
|
-
], signal);
|
|
778
|
-
if (result.exitCode === NO_MATCH_EXIT_CODE) return [];
|
|
779
|
-
if (result.exitCode !== 0) throw new ConfigError(`git grep failed in ${repo}: ${result.stderr.trim()}`);
|
|
780
|
-
const prefix = `${commit}:`;
|
|
781
|
-
return result.stdout.split("\0").filter((entry) => entry !== "").map((entry) => {
|
|
782
|
-
if (!entry.startsWith(prefix)) throw new InternalError(`git grep printed "${entry}", which does not start with ${prefix}`);
|
|
783
|
-
return entry.slice(prefix.length);
|
|
784
|
-
});
|
|
785
|
-
}
|
|
786
|
-
const NEWLINE = 10;
|
|
787
|
-
const utf8 = new TextDecoder("utf-8");
|
|
788
|
-
async function readFilesAt(repo, commit, paths, signal) {
|
|
789
|
-
const files = /* @__PURE__ */ new Map();
|
|
790
|
-
if (paths.length === 0) return files;
|
|
791
|
-
const multiline = paths.find((path) => path.includes("\n"));
|
|
792
|
-
if (multiline !== void 0) throw new ConfigError(`cannot read ${JSON.stringify(multiline)}: a path with a newline cannot be batched`);
|
|
793
|
-
const args = ["cat-file", "--batch"];
|
|
794
|
-
const result = await withGit(repo, args, () => runProcessBinary(GIT, [
|
|
795
|
-
"-C",
|
|
796
|
-
repo,
|
|
797
|
-
...args
|
|
798
|
-
], {
|
|
799
|
-
stdin: paths.map((path) => `${commit}:${path}\n`).join(""),
|
|
800
|
-
signal,
|
|
801
|
-
timeoutMs: GIT_TIMEOUT_MS
|
|
802
|
-
}));
|
|
803
|
-
if (result.exitCode !== 0) throw new ConfigError(`git cat-file --batch failed in ${repo}: ${result.stderr.trim()}`);
|
|
804
|
-
const output = result.stdout;
|
|
805
|
-
let offset = 0;
|
|
806
|
-
for (const path of paths) {
|
|
807
|
-
const headerEnd = output.indexOf(NEWLINE, offset);
|
|
808
|
-
if (headerEnd === -1) throw new InternalError(`git cat-file --batch stopped before ${path}`);
|
|
809
|
-
const header = utf8.decode(output.subarray(offset, headerEnd)).split(" ");
|
|
810
|
-
const size = Number(header[2]);
|
|
811
|
-
if (header[1] !== "blob" || !Number.isInteger(size)) throw new InternalError(`${path} is not a file at ${commit}, though git listed it there`);
|
|
812
|
-
const start = headerEnd + 1;
|
|
813
|
-
if (output[start + size] !== NEWLINE) throw new InternalError(`git cat-file --batch framed ${path} with ${size} bytes, but no newline follows them`);
|
|
814
|
-
files.set(path, utf8.decode(output.subarray(start, start + size)));
|
|
815
|
-
offset = start + size + 1;
|
|
816
|
-
}
|
|
817
|
-
if (offset !== output.length) throw new InternalError("git cat-file --batch printed more than the paths it was asked for");
|
|
818
|
-
return files;
|
|
819
|
-
}
|
|
820
|
-
//#endregion
|
|
821
822
|
//#region src/commands/ci/job-plan.ts
|
|
822
823
|
const CONTENT_PATHSPECS = CONTENT_TOP_LEVEL_FOLDERS.map((folder) => `${folder}/*.yaml`);
|
|
823
824
|
const FILE_MODES = /* @__PURE__ */ new Set(["100644", "100755"]);
|
|
@@ -971,18 +972,30 @@ async function writeResults(path, events) {
|
|
|
971
972
|
throw error;
|
|
972
973
|
}
|
|
973
974
|
}
|
|
975
|
+
const RUN_LOG_DIR = join(".scratch", "ci-runs");
|
|
976
|
+
async function openRunLog(root, job, startedAt) {
|
|
977
|
+
const dir = join(root, RUN_LOG_DIR);
|
|
978
|
+
await mkdir(dir, { recursive: true });
|
|
979
|
+
await writeFile(join(dir, ".gitignore"), "*\n", "utf8");
|
|
980
|
+
const path = join(dir, `${startedAt.toISOString().replaceAll(":", "-")}-${job}.jsonl`);
|
|
981
|
+
return (event) => appendFileSync(path, serializeJson(event, false) + "\n", "utf8");
|
|
982
|
+
}
|
|
974
983
|
async function runJob(options) {
|
|
975
984
|
if (options.resultsPath !== null) await rm(options.resultsPath, { force: true });
|
|
985
|
+
const plan = await planJob(options.repo, options.base, options.head, options.signal);
|
|
986
|
+
const log = options.runLog ? await openRunLog(await repositoryRoot(options.repo, options.signal), options.job, options.now()) : () => {};
|
|
976
987
|
const events = [];
|
|
977
988
|
const emit = createEmitter({
|
|
978
989
|
job: options.job,
|
|
979
990
|
now: options.now,
|
|
980
991
|
write: (event) => {
|
|
981
992
|
events.push(event);
|
|
982
|
-
if (event.type !== "job.end")
|
|
993
|
+
if (event.type !== "job.end") {
|
|
994
|
+
log(event);
|
|
995
|
+
options.write(event);
|
|
996
|
+
}
|
|
983
997
|
}
|
|
984
998
|
});
|
|
985
|
-
const plan = await planJob(options.repo, options.base, options.head, options.signal);
|
|
986
999
|
emit({
|
|
987
1000
|
type: "job.start",
|
|
988
1001
|
v: 1,
|
|
@@ -1000,6 +1013,7 @@ async function runJob(options) {
|
|
|
1000
1013
|
}
|
|
1001
1014
|
});
|
|
1002
1015
|
if (options.resultsPath !== null) await writeResults(options.resultsPath, events);
|
|
1016
|
+
log(end);
|
|
1003
1017
|
options.write(end);
|
|
1004
1018
|
return outcome.state;
|
|
1005
1019
|
}
|
|
@@ -1297,7 +1311,7 @@ var run_default = defineMetabaseCommand({
|
|
|
1297
1311
|
},
|
|
1298
1312
|
details: [
|
|
1299
1313
|
"Compares --head with its merge base with --base and finds the transforms whose files or tests changed. Two stages check them: `lint` fails each transform the branch adds or whose logic (source or target) it edits that has no transform test, fails each transform the branch leaves at head without the last of its transform tests, and warns about untested transforms whose logic the branch did not change. A transform whose source type is not `query`, such as a Python transform, cannot have transform tests, so `lint` does not fail it: an `untestable-transform` warning lists each such transform the branch adds, edits or strips of its tests. A change to the transform's query text, whitespace included, is an edit; a change to the YAML layout alone is not. A transform test is a TransformTest file at --head whose `transform_id` names the transform and whose `expectations` list is not empty; a test without expectations checks nothing, so it does not count. `unit` runs the instance's tests of the transforms in `job.start.checked`, on the Metabase instance that --url, MB_URL or --profile names, in that order, which must already hold the branch's content; it is absent when `checked` is empty, so a job with nothing to test never connects to Metabase, and it runs even when `lint` fails, so one job reports both stages' findings. A checked transform the branch tests but the instance lists no test for is `refused` with `detail.error_code` `ci.no-tests-on-instance`. Content files are the `.yaml` files Metabase's import reads: not dotfiles, under a top-level serialization folder such as `transforms/` or `collections/`. Only committed content is checked: when --head is the checked-out commit, a content file with uncommitted changes is listed in an `uncommitted-content` warning, and its committed version is checked.",
|
|
1300
|
-
"With --format json, the default when stdout is not a terminal, writes one JSON event per line (`job.start`, then each stage and check, then `job.end`); `job.start.checked` lists the transforms the job covered, and a `no-content-changes` warning says when the change touches no content file, so no transform test ran; an `unread-content` warning lists the content files at --head that the change did not touch and this check cannot read, which coverage skips; each transform test's result is passed through as the check's `detail`, with every row the server sent. With --format text, the default on a terminal, writes the same events as lines for a person: each failed expectation with up to --max-rows lines of its missing and extra rows, keyed by the first column, then a count of the rest. The --results file is JSON whatever the format, and holds every row the server sent.",
|
|
1314
|
+
"With --format json, the default when stdout is not a terminal, writes one JSON event per line (`job.start`, then each stage and check, then `job.end`); `job.start.checked` lists the transforms the job covered, and a `no-content-changes` warning says when the change touches no content file, so no transform test ran; an `unread-content` warning lists the content files at --head that the change did not touch and this check cannot read, which coverage skips; each transform test's result is passed through as the check's `detail`, with every row the server sent. With --format text, the default on a terminal, writes the same events as lines for a person: each failed expectation with up to --max-rows lines of its missing and extra rows, keyed by the first column, then a count of the rest. The --results file is JSON whatever the format, and holds every row the server sent. Unless --no-run-log is set, every run also appends each event, as one JSON line, to `.scratch/ci-runs/<started-at>-<job>.jsonl` under the repository root as it happens, whatever the format and whether or not --results is set, so a UI can show every run; the folder holds a `.gitignore` that ignores it, and a run that crashes or is interrupted keeps its log, which stops before `job.end`. A usage or config error found before `job.start`, such as a --base git cannot resolve, leaves no log.",
|
|
1301
1315
|
"Exits 0 when the job passes. Exits 1 after `job.end` when it does not: `state` is `failed` when a check failed (fix the transform), and `errored` when no check failed but one could not judge the change (fix the test or the setup); a failure outranks errors, since it is a finding about the change. Exits 2 on a usage or config error: a bad flag, a --repo, --base or --head that git cannot resolve or relate, or, found after `job.start` when the unit stage connects, a configuration it cannot use, such as a browser-login profile bound to another URL; a missing credential is not one, since it ends the unit stage instead.",
|
|
1302
1316
|
"A test run that times out, loses its connection or gets an HTTP error is an `error` check whose `detail.error_code` starts with `ci.`, and the next test runs. A failure every later request would repeat ends the unit stage early, `errored` unless a check failed, with the reason in `stage.end.stopped`: no Metabase credential is configured (`ci.no-credential`, before any request), Metabase rejects the credential, the server has no transform testing, the entity-id lookup fails, or Metabase cannot be reached before a test runs. Exits 1 on a crash, such as a content file the change touched that does not parse at --head, and 130 on an interrupt: the stream stops before `job.end`, the error is on stderr, and no --results file is left, not even an earlier run's. When the reader closes stdout early, the job still runs to the end, writes --results and exits by its state."
|
|
1303
1317
|
].join("\n\n"),
|
|
@@ -1330,6 +1344,11 @@ var run_default = defineMetabaseCommand({
|
|
|
1330
1344
|
type: "string",
|
|
1331
1345
|
description: "Also write every event to this file, as one JSON array, with every row the server sent"
|
|
1332
1346
|
},
|
|
1347
|
+
"run-log": {
|
|
1348
|
+
type: "boolean",
|
|
1349
|
+
description: "Append every event to a log under .scratch/ci-runs, so a UI can show the run (default: true; pass --no-run-log to skip it)",
|
|
1350
|
+
default: true
|
|
1351
|
+
},
|
|
1333
1352
|
"max-rows": {
|
|
1334
1353
|
type: "string",
|
|
1335
1354
|
description: "Row lines each failed expectation shows under --format text; 0 shows only counts. JSON output and the --results file keep every row",
|
|
@@ -1357,6 +1376,7 @@ var run_default = defineMetabaseCommand({
|
|
|
1357
1376
|
now: () => /* @__PURE__ */ new Date(),
|
|
1358
1377
|
write: ctx.format === "json" ? jsonLineWriter(process.stdout) : textEventWriter(maxRows),
|
|
1359
1378
|
resultsPath: args.results ?? null,
|
|
1379
|
+
runLog: args["run-log"],
|
|
1360
1380
|
signal: interruptSignal
|
|
1361
1381
|
});
|
|
1362
1382
|
if (state !== "passed") throw new FailedResultError(`ci job ${state}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { bt as listEnvelopeSchema, ct as connectionFlags, dt as listFlags, mt as profileFlag, pt as outputFlags, u as renderList } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-DKKwr4c8.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-DMb47Kan.mjs";
|
|
4
4
|
import { t as collectForOutput } from "./window-CI_QD04s.mjs";
|
|
5
5
|
import { s as TransformRunCompact } from "./transform-B62craFM.mjs";
|
|
6
6
|
import { t as transformRunView } from "./transform-drjCAqQs.mjs";
|