@metabase/cli 0.5.3 → 0.5.5

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.
Files changed (332) hide show
  1. package/dist/{add-collection-c1dfnavz.mjs → add-collection-lgBkahhW.mjs} +3 -3
  2. package/dist/{alert-BkpPdBQ_.mjs → alert-32mfYFy1.mjs} +7 -7
  3. package/dist/{alerts-TDYiIxjs.mjs → alerts-DWVmtHEJ.mjs} +6 -6
  4. package/dist/api-key-DJfhPe4x.mjs +13 -0
  5. package/dist/{append-CoeZRD6u.mjs → append-CdzKyHhn.mjs} +4 -4
  6. package/dist/{archive-DZDkfhdH.mjs → archive-24zg3Ckb.mjs} +5 -5
  7. package/dist/{archive-DY76wU2k.mjs → archive-B3_fjvid.mjs} +3 -3
  8. package/dist/{archive-N3lp1o-k.mjs → archive-B4G4EE9n.mjs} +5 -5
  9. package/dist/{archive-D-BJwRLc.mjs → archive-BTxrM_x2.mjs} +5 -5
  10. package/dist/{archive-DQRehboT.mjs → archive-BZxa5zJk.mjs} +5 -5
  11. package/dist/{archive-CH1h8jz5.mjs → archive-BmutUzPS.mjs} +5 -5
  12. package/dist/{archive-DxUnaV4x.mjs → archive-CHQOH-nm.mjs} +3 -3
  13. package/dist/{archive-CAJHrKwd.mjs → archive-DEOq8OqU.mjs} +5 -5
  14. package/dist/{archive-NfFWXRx5.mjs → archive-DOXrtANg.mjs} +5 -5
  15. package/dist/{archive-f7wKQ7Uy.mjs → archive-DbaGJh7E.mjs} +3 -3
  16. package/dist/{archive-9uzfWGuq.mjs → archive-NhewLr23.mjs} +5 -5
  17. package/dist/{archive-3fdIvMsf.mjs → archive-Uws1E_p8.mjs} +5 -5
  18. package/dist/{auth-hgkvHPpH.mjs → auth-bVvBp9Tl.mjs} +5 -5
  19. package/dist/{branch-flag-CPTQ4wXp.mjs → branch-flag-BvIdNB5z.mjs} +1 -1
  20. package/dist/{branches-B3gHAanU.mjs → branches-CkOAJk1H.mjs} +3 -3
  21. package/dist/{breaking-DuWIof4T.mjs → breaking-CMpEeieT.mjs} +6 -6
  22. package/dist/{broken-D2ST8sTx.mjs → broken-DFFLXiYc.mjs} +8 -8
  23. package/dist/{bulk-discard-values-77khEfpj.mjs → bulk-discard-values-D4eFBtKc.mjs} +5 -5
  24. package/dist/{bulk-edit-girwcjY6.mjs → bulk-edit-CLJeGY2E.mjs} +7 -7
  25. package/dist/{bulk-rescan-values-Df8KK8um.mjs → bulk-rescan-values-DsaGKIo_.mjs} +5 -5
  26. package/dist/{bulk-sync-schema-DEPUZ6MN.mjs → bulk-sync-schema-CN797vy9.mjs} +5 -5
  27. package/dist/{cancel-Oek5PJnu.mjs → cancel-CRpzqIUu.mjs} +3 -3
  28. package/dist/{cancel-task-rkqY0qLU.mjs → cancel-task-CpZcj7HB.mjs} +2 -2
  29. package/dist/{card-QR3zEu6E.mjs → card-BJRZ5D5Q.mjs} +2 -2
  30. package/dist/{card-3NmUiU5F.mjs → card-VipF12MJ.mjs} +1 -1
  31. package/dist/card-nOX_QJ9u.mjs +25 -0
  32. package/dist/{cards-DWJOtZoN.mjs → cards-DJMTrFQg.mjs} +6 -6
  33. package/dist/cli.mjs +128 -294
  34. package/dist/{client-BFP2Ssqu.mjs → client-D2ycdMRO.mjs} +299 -189
  35. package/dist/{collection-D5vt2IJ_.mjs → collection-Bf3lv-zo.mjs} +1 -1
  36. package/dist/collection-Cs84x7WB.mjs +21 -0
  37. package/dist/{collection-DNmFKALA.mjs → collection-Cz2qLX2m.mjs} +1 -1
  38. package/dist/{collection-namespace-Dl8_7xII.mjs → collection-namespace-C0JcSEwN.mjs} +2 -1
  39. package/dist/{content-translation-B3oARbgD.mjs → content-translation-7qPz-dIU.mjs} +3 -3
  40. package/dist/{copy-C7Rc4qM7.mjs → copy-BeFjqXXc.mjs} +6 -6
  41. package/dist/{copy-BzBp5FaY.mjs → copy-D9-xBYYq.mjs} +6 -6
  42. package/dist/{copy-flags-CTM91pxH.mjs → copy-flags-DZ5Cy-Gk.mjs} +2 -2
  43. package/dist/{create-YBDXZgyP.mjs → create--eZb0G2P.mjs} +4 -5
  44. package/dist/{create-f0bBEfDI.mjs → create-B57Sj0om.mjs} +9 -10
  45. package/dist/{create-Bh3q3eHg.mjs → create-Ba8nYAWL.mjs} +9 -9
  46. package/dist/{create-CjGEkSFz.mjs → create-BfgTvPvI.mjs} +9 -10
  47. package/dist/{create-C-2ivjed.mjs → create-BlYxQv6U.mjs} +4 -5
  48. package/dist/{create-DQJ9h86G.mjs → create-CLQVeQ0w.mjs} +4 -5
  49. package/dist/{create-CGxxztoE.mjs → create-Cc07ouKB.mjs} +6 -7
  50. package/dist/{create-C0gmhNnk.mjs → create-CplN1ey8.mjs} +9 -10
  51. package/dist/{create-myJ8HR4B.mjs → create-D4FT8Xj8.mjs} +6 -7
  52. package/dist/{create-BKRD11i-.mjs → create-DBCOYtqn.mjs} +4 -4
  53. package/dist/{create-CfXKNnkK.mjs → create-DBSpDnaA.mjs} +6 -7
  54. package/dist/{create-ByeGK_BE.mjs → create-DHTl3wVv.mjs} +4 -5
  55. package/dist/{create-DO4ic4Kx.mjs → create-DIZGUCFE.mjs} +7 -8
  56. package/dist/{create-CGE1D0Ay.mjs → create-DJ0Xrpod.mjs} +6 -7
  57. package/dist/{create-Bc4ADRmU.mjs → create-Dj5y7xbA.mjs} +4 -5
  58. package/dist/{create-vgP9K2eH2.mjs → create-Dr-q5oWx2.mjs} +10 -11
  59. package/dist/{create-YIC3Q0a-.mjs → create-Dt6gdbAH.mjs} +7 -7
  60. package/dist/{create-branch-DBCBMDWh.mjs → create-branch-CKQkpU-_.mjs} +3 -2
  61. package/dist/{create-C3H9ljex.mjs → create-cpxnjNMC.mjs} +4 -5
  62. package/dist/{create-_rOCx5b8.mjs → create-n5cH8Tq-.mjs} +5 -6
  63. package/dist/{create-71_DODbc.mjs → create-ypwRxrcj.mjs} +9 -10
  64. package/dist/{csv-Dtgy7sTg.mjs → csv-CxWsxJIB.mjs} +4 -4
  65. package/dist/{current-task-AwQisIT9.mjs → current-task-DB7UTh6J.mjs} +3 -3
  66. package/dist/{dashboard-D5E3fMKh.mjs → dashboard-Bx2sYijR.mjs} +1 -1
  67. package/dist/{dashboard-Chjy5GKR.mjs → dashboard-Cwsf-e9T.mjs} +23 -6
  68. package/dist/dashboard-DeSaOt2Z.mjs +35 -0
  69. package/dist/{data-action-DZxVB_hD.mjs → data-action-CuvI17XF.mjs} +8 -2
  70. package/dist/{data-action-R9qxJDPA.mjs → data-action-DLj9cgpu.mjs} +1 -1
  71. package/dist/data-action-Dpt7pfzd.mjs +24 -0
  72. package/dist/{data-app-BIAvvV2P.mjs → data-app--T695WPM.mjs} +10 -10
  73. package/dist/{data-app-project-BL4xpu_m.mjs → data-app-project-DjDDWgUF.mjs} +2 -1
  74. package/dist/{database-CxykzTAA.mjs → database-C5ucihp3.mjs} +2 -2
  75. package/dist/{database-D8XzgJEz.mjs → database-u_spHEa0.mjs} +1 -1
  76. package/dist/{dataset-DIQLAp2P.mjs → dataset-LJxNN6p5.mjs} +3 -3
  77. package/dist/{db-wsSYKqCB.mjs → db-CpK3QluZ.mjs} +8 -8
  78. package/dist/{delete-E-g5b-HU.mjs → delete-9YIc_L2E.mjs} +4 -4
  79. package/dist/{delete-WrV9I9uw.mjs → delete-AwOJ1x-D.mjs} +4 -4
  80. package/dist/{delete-D9FB7qjX.mjs → delete-B9GABYEJ.mjs} +4 -4
  81. package/dist/{delete-4v4_lDwD.mjs → delete-Bw8CMa_A.mjs} +4 -4
  82. package/dist/{delete-BSgxmR3y.mjs → delete-CE19WUPi.mjs} +4 -4
  83. package/dist/{delete-BegkpIGi.mjs → delete-CUzOTiI8.mjs} +4 -4
  84. package/dist/{delete-BP9-YS-f.mjs → delete-D784J3ur.mjs} +4 -4
  85. package/dist/{delete-BHX_F8Qu.mjs → delete-DbAOgu73.mjs} +4 -4
  86. package/dist/{delete-DmM5L0wO.mjs → delete-TcDfZNz2.mjs} +4 -4
  87. package/dist/{delete-runtime-CJ7gMYA1.mjs → delete-runtime-DOOy3gzH.mjs} +2 -1
  88. package/dist/{delete-table-CJq8JM5J.mjs → delete-table-a8acciQe.mjs} +4 -4
  89. package/dist/{delete-wnHUWWjX.mjs → delete-trx8NIoh.mjs} +4 -4
  90. package/dist/{dependencies-CnW3RSoZ.mjs → dependencies-BcPdAMYB.mjs} +6 -6
  91. package/dist/{dependency-CaC6XuTY.mjs → dependency-C1DExO6k.mjs} +8 -5
  92. package/dist/{dependency-Dxvb2Znu.mjs → dependency-DcM96XJ-.mjs} +4 -3
  93. package/dist/dependency-_SgcW_fL.mjs +15 -0
  94. package/dist/{dependents-DHXqJ3lo.mjs → dependents-CRZaiOzg.mjs} +9 -9
  95. package/dist/{dirty-BRPWPUYH.mjs → dirty-1taTj3G6.mjs} +3 -3
  96. package/dist/{discard-values-DBHfVN8o.mjs → discard-values-DmiWAx4J.mjs} +5 -5
  97. package/dist/{document-UMG6me2P.mjs → document-BHOQq2T_.mjs} +2 -2
  98. package/dist/document-DB6YGtqX.mjs +20 -0
  99. package/dist/{document-DVIu3Vj4.mjs → document-lS1XZEF3.mjs} +1 -1
  100. package/dist/{download-BFu9xYHX.mjs → download-CEvVDGeC.mjs} +2 -2
  101. package/dist/{eid-eKmbXRds.mjs → eid-pO_lMTI9.mjs} +5 -5
  102. package/dist/{entity-DjDkaMkB.mjs → entity-DICgy4Bl.mjs} +2 -2
  103. package/dist/{entry-flags-Cxn09krz.mjs → entry-flags-CswcY8bG.mjs} +5 -6
  104. package/dist/{events-CZL9MU64.mjs → events-cGDPEL5_.mjs} +4 -4
  105. package/dist/{execute-DBJGtHHG.mjs → execute-DHGbJpPr.mjs} +7 -8
  106. package/dist/{export-xn_-NaBd.mjs → export-B0NUSP6q.mjs} +6 -5
  107. package/dist/{export-flags-CpukgETM.mjs → export-flags-iXfEILf7.mjs} +3 -2
  108. package/dist/{export-preflight-SM9zJkBp.mjs → export-preflight-Bbl1bHpI.mjs} +3 -3
  109. package/dist/field-AkNMIQnx.mjs +21 -0
  110. package/dist/{field-DoWQUl7V.mjs → field-C2qOViFZ.mjs} +8 -2
  111. package/dist/{field-BVz4AS3f.mjs → field-CT4r6b92.mjs} +1 -1
  112. package/dist/{fields-CB06GFBW.mjs → fields-M66PaKdV.mjs} +6 -6
  113. package/dist/{filter-flags-DhE4olyf.mjs → filter-flags-ezqqsOQL.mjs} +4 -4
  114. package/dist/{fks-CSoS7xZ6.mjs → fks-BvOGzID5.mjs} +6 -6
  115. package/dist/{get-BZFyqZXa.mjs → get-0T9zeyCh.mjs} +5 -5
  116. package/dist/{get-BSPxmP_W.mjs → get-B3Ceh_7N.mjs} +5 -5
  117. package/dist/{get-BW3jSR3y.mjs → get-BL_9fN-q.mjs} +3 -3
  118. package/dist/{get-Bt4C-oxh.mjs → get-Bt2Q516N.mjs} +5 -5
  119. package/dist/{get--1qTpTIQ.mjs → get-BzIQK_mt.mjs} +5 -5
  120. package/dist/{get-BQ7SAJEz.mjs → get-C3j93ivl.mjs} +3 -3
  121. package/dist/{get-DIfjxTP8.mjs → get-CCLnfOOE.mjs} +3 -3
  122. package/dist/{get-CtDZOoWy.mjs → get-CEreA2oN.mjs} +5 -5
  123. package/dist/{get-jbOgdCQg.mjs → get-CJFg7YM5.mjs} +3 -3
  124. package/dist/{get-Cl-O6dFs.mjs → get-Cfg52y7X.mjs} +4 -4
  125. package/dist/{get-eZEHipwA.mjs → get-D-8G7EoL.mjs} +5 -5
  126. package/dist/{get-BYAzIaGG.mjs → get-D-ElxFlQ.mjs} +5 -5
  127. package/dist/{get-Bq_9VSTa.mjs → get-D7y_z5K7.mjs} +3 -3
  128. package/dist/{get-DePbMmjc.mjs → get-DGlZtzfB.mjs} +5 -5
  129. package/dist/{get-C1rCVUYw.mjs → get-DKZLwN3K.mjs} +6 -5
  130. package/dist/{get-BIf6eFWZ.mjs → get-HtzPLpy2.mjs} +5 -5
  131. package/dist/{get-B8xQXMU6.mjs → get-SOCVdBIU.mjs} +5 -5
  132. package/dist/{get-BZDUOZxI.mjs → get-ZSLfDowg.mjs} +3 -3
  133. package/dist/{get-B8xrmipw.mjs → get-jzChrvn2.mjs} +5 -5
  134. package/dist/{get-run-C-CNDbv3.mjs → get-run-BZP_z57v.mjs} +5 -5
  135. package/dist/{get-CuSwArMS.mjs → get-uB7jROcz.mjs} +5 -5
  136. package/dist/{get-BfFZCiZR.mjs → get-wPkejadn.mjs} +5 -5
  137. package/dist/{get-Cc4-e-Q_.mjs → get-zGreQNnG.mjs} +5 -5
  138. package/dist/git-sync-DaHnqpYi.mjs +29 -0
  139. package/dist/glossary-Br_mSh3i.mjs +14 -0
  140. package/dist/{glossary-BkGmCI4X.mjs → glossary-CQRW3Z4d.mjs} +1 -1
  141. package/dist/{glossary-QN-hHfOT.mjs → glossary-iPIWrEbP.mjs} +1 -1
  142. package/dist/{graph-CqBe2J4N.mjs → graph-CdKi07zZ.mjs} +6 -6
  143. package/dist/{group-81zoQcEP.mjs → group--6adAsqG.mjs} +2 -2
  144. package/dist/{has-remote-changes-CDe1teSb.mjs → has-remote-changes-d_JyzdPX.mjs} +2 -2
  145. package/dist/{import-B64gjryF.mjs → import-1bK-qrjV.mjs} +6 -5
  146. package/dist/input-gate-registry-Dh8QjKgW.mjs +14 -0
  147. package/dist/{is-dirty-DhR3Xqjk.mjs → is-dirty-BXwvuTeD.mjs} +2 -2
  148. package/dist/{items-CLl2QgS8.mjs → items-Dzh_xylQ.mjs} +7 -6
  149. package/dist/{key-BYEv4Wgq.mjs → key-DLrpCgdZ.mjs} +1 -1
  150. package/dist/{library-C3eO2J07.mjs → library-BA1QssFE.mjs} +5 -5
  151. package/dist/{library-wUiD2jbw.mjs → library-BprxuqZl.mjs} +1 -1
  152. package/dist/{library-DKIqzyUk.mjs → library-C4g9pdiS.mjs} +8 -3
  153. package/dist/{list-CdcFNphE.mjs → list-0TtkxraU.mjs} +3 -3
  154. package/dist/{list-YFwmHXGG.mjs → list-2doqGDIF.mjs} +3 -3
  155. package/dist/{list-DLLzMaS3.mjs → list-7qcWFDXR.mjs} +5 -5
  156. package/dist/{list-DyFu5Wx1.mjs → list-B5D3leO9.mjs} +6 -6
  157. package/dist/{list-CjpZCiks.mjs → list-B70w2ibG.mjs} +3 -3
  158. package/dist/{list-B7Yvz5vA.mjs → list-B75rzgSi.mjs} +5 -5
  159. package/dist/{list-BmvitCWZ.mjs → list-BWNw-ppI.mjs} +6 -6
  160. package/dist/{list-DyQNRVAf.mjs → list-BjpGurur.mjs} +3 -3
  161. package/dist/{list-DrIcKxXX.mjs → list-CdpEUPL-.mjs} +5 -5
  162. package/dist/{list-DpfOh8-5.mjs → list-CvQlMhrb.mjs} +4 -4
  163. package/dist/{list-DDPvxfhe.mjs → list-DDV5PylU.mjs} +6 -6
  164. package/dist/{list-BIqqh3A-.mjs → list-DHX7-8Ae.mjs} +5 -5
  165. package/dist/{list-BiSwl56L.mjs → list-DQNbHPNQ.mjs} +5 -5
  166. package/dist/{list-CFaJA317.mjs → list-DR9dswtK.mjs} +6 -6
  167. package/dist/{list-eGlqXJno.mjs → list-DSi8mf_F.mjs} +5 -5
  168. package/dist/{list-D4HNG282.mjs → list-D_SfsO_-.mjs} +5 -5
  169. package/dist/{list-CA939qkn.mjs → list-Dn5_L-85.mjs} +6 -6
  170. package/dist/{list-C7TFreS8.mjs → list-DuaFmOCz.mjs} +5 -5
  171. package/dist/{list-Cu6ET_yD.mjs → list-Dv3s_PIu.mjs} +5 -5
  172. package/dist/{list-s9_LlXCV.mjs → list-Dz2YVD7m.mjs} +3 -3
  173. package/dist/{list-DLwby7YA.mjs → list-TzuL_7GA.mjs} +5 -5
  174. package/dist/{list-C3GBocvB.mjs → list-_jHBfq0E.mjs} +5 -5
  175. package/dist/{list-D_IT8l9B.mjs → list-iFtmAfVv.mjs} +3 -3
  176. package/dist/{login-Bg7Z3jDy.mjs → login-LAFw5Xxu.mjs} +6 -5
  177. package/dist/{logout-CAmp7DcS.mjs → logout-CjYzDvLH.mjs} +3 -2
  178. package/dist/{measure-CtfjqJFP.mjs → measure-BMWrX1ca.mjs} +3 -1
  179. package/dist/{measure-C31HLp1C.mjs → measure-DgtOyIoD.mjs} +6 -6
  180. package/dist/{measure-4P0bOlZ3.mjs → measure-DqZG65of.mjs} +1 -1
  181. package/dist/{notification-DaA4bBHW.mjs → notification-B5yMuPmo.mjs} +6 -1
  182. package/dist/{notification-W2SVssyY.mjs → notification-BEJaEZS2.mjs} +2 -2
  183. package/dist/{parameter-DvRQMKd2.mjs → parameter-Bucz3cLJ.mjs} +1 -1
  184. package/dist/{parameter-values-3eHpqznI.mjs → parameter-values-CRwVLpRD.mjs} +6 -5
  185. package/dist/{parse-enum-DAcTzG1q.mjs → parse-enum-CEXPuN9H.mjs} +1 -1
  186. package/dist/{parse-id-5BZGQ9Vd.mjs → parse-id-EXZan40V.mjs} +1 -1
  187. package/dist/{parse-ref-ByXc-pls.mjs → parse-ref-D28NvwpR.mjs} +1 -1
  188. package/dist/{parse-text-FgX60vIg.mjs → parse-text-C4LYzIFa.mjs} +1 -1
  189. package/dist/{path-XwdHlC23.mjs → path-BA_GGcGN.mjs} +4 -4
  190. package/dist/{poll-CgtcJopL.mjs → poll-vxN__4cz.mjs} +2 -2
  191. package/dist/predicates-0C0TsWcJ.mjs +219 -0
  192. package/dist/{preflight-ChTKhB8Y.mjs → preflight-4iy2qzsh.mjs} +3 -2
  193. package/dist/{process-aqXm5QgC.mjs → process-BQC3mK2k.mjs} +1 -1
  194. package/dist/{publish-C2-pK0cf.mjs → publish--I94MMjp.mjs} +13 -6
  195. package/dist/{pulse-CC81N2_0.mjs → pulse-B2AmIWsO.mjs} +11 -4
  196. package/dist/{pulse-JPrq6NFP.mjs → pulse-CPSpum5U.mjs} +2 -2
  197. package/dist/{query-pmw23KkL.mjs → query-C8w04b4F.mjs} +7 -6
  198. package/dist/{query-DkaUzmMa.mjs → query-O1b4qIr4.mjs} +17 -29
  199. package/dist/{remapping-C3htTzJn.mjs → remapping-BdX4nj-U.mjs} +5 -5
  200. package/dist/{remove-collection-p_t9rUUX.mjs → remove-collection-dltKu8LO.mjs} +3 -3
  201. package/dist/{render-C50k8-jc.mjs → render-DK2j4BwQ.mjs} +3 -2
  202. package/dist/{replace-BQBuFJ1B.mjs → replace-BfO6UFZN.mjs} +4 -4
  203. package/dist/{requirement-check-CpiVuL0H.mjs → requirement-check-1fcffJj6.mjs} +2 -2
  204. package/dist/{rescan-values-DOqXJ3qH.mjs → rescan-values-0-c5Gqtx.mjs} +5 -5
  205. package/dist/{rescan-values-Ctq8wpkI.mjs → rescan-values-7bbNa7WZ.mjs} +5 -5
  206. package/dist/{run-CtMbObQI.mjs → run-5b123gPi.mjs} +5 -4
  207. package/dist/{run-2xgPRuKR.mjs → run-BS_wUAsi.mjs} +6 -5
  208. package/dist/{run-Dn3e8G4x.mjs → run-Cf1nJahe.mjs} +4 -4
  209. package/dist/{runs-CgNoQW6M.mjs → runs-BJ4uy05c.mjs} +6 -6
  210. package/dist/{runtime-Y4VFWmmr.mjs → runtime-D5yfliIq.mjs} +51 -9
  211. package/dist/{scaffold-BuL0_ptz.mjs → scaffold-aUy3Ik4q.mjs} +4 -4
  212. package/dist/schema-Ds_j3N1I.mjs +283 -0
  213. package/dist/{schema-tables-BdXuo_lG.mjs → schema-tables-BuFF9Psy.mjs} +6 -6
  214. package/dist/{schemas-Dap3KFwY.mjs → schemas-DaDsur6B.mjs} +4 -4
  215. package/dist/{search-Dxcejw_v.mjs → search-BcJgmPU3.mjs} +6 -5
  216. package/dist/{search-DUmFK5Sy.mjs → search-CTZzUd_j.mjs} +7 -6
  217. package/dist/{segment-C_gl5ag6.mjs → segment-CWVASaM1.mjs} +1 -1
  218. package/dist/{segment-OsrbUDzw.mjs → segment-Cf-DrdjE.mjs} +3 -1
  219. package/dist/{segment-CebcXn2E.mjs → segment-zy4VVraQ.mjs} +6 -6
  220. package/dist/{send-DYdwcPTb.mjs → send-D0ikejQU.mjs} +3 -3
  221. package/dist/{set-xs8Vyvy2.mjs → set-CjAaw2ZL.mjs} +5 -6
  222. package/dist/{set-active-CVI_DDQi.mjs → set-active-BQjKw1wk.mjs} +4 -4
  223. package/dist/{set-bundle-DX5HqDji.mjs → set-bundle-6Qknum1I.mjs} +6 -6
  224. package/dist/{set-data-actions-DAI1XCQ2.mjs → set-data-actions-LcWEP4RO.mjs} +6 -6
  225. package/dist/{set-enabled-0QI-CHAT.mjs → set-enabled-C8Yww7Yv.mjs} +7 -7
  226. package/dist/{set-sensitivity-DqGkiLSr.mjs → set-sensitivity-OVcL2PbY.mjs} +6 -6
  227. package/dist/{setting-Bmry-y_l.mjs → setting-BsIBFvRP.mjs} +4 -4
  228. package/dist/{setup-CO7QV-ao.mjs → setup-BnczkG96.mjs} +1 -1
  229. package/dist/{setup-UM8N9Vh3.mjs → setup-BxUd_KYl.mjs} +5 -6
  230. package/dist/{signal-D8MH3LMN.mjs → signal-BNUlQjpc.mjs} +1 -1
  231. package/dist/{skill-list-D2FhhYS3.mjs → skill-list-BoJITnw8.mjs} +1 -1
  232. package/dist/{skills-CcLTm3_2.mjs → skills-BQBerRAk.mjs} +3 -2
  233. package/dist/{skills-BiSfuDqA.mjs → skills-CQRgUHI3.mjs} +3 -3
  234. package/dist/{slug-qeARO25o.mjs → slug-COdwq63O.mjs} +1 -1
  235. package/dist/snippet-CRLI3fYI.mjs +19 -0
  236. package/dist/{stash-e5cSvnj3.mjs → stash-BGqpcbSW.mjs} +5 -4
  237. package/dist/{status-BHiO3YBe.mjs → status-CcOJIgfB.mjs} +4 -4
  238. package/dist/{status-CH7BAWGe.mjs → status-_wPMW1wq.mjs} +3 -3
  239. package/dist/{subscription-DWleULhN.mjs → subscription-CqUIrnUJ.mjs} +6 -6
  240. package/dist/{subscriptions-DcCOA2p1.mjs → subscriptions-BP83ctRX.mjs} +6 -6
  241. package/dist/{summary-CipFA6M6.mjs → summary-Byz6Y1v-.mjs} +5 -5
  242. package/dist/{sync-schema-D7p-P8F6.mjs → sync-schema-BJ-AtcCq.mjs} +5 -5
  243. package/dist/{sync-schema-C45WO4db.mjs → sync-schema-DQBHc3bt.mjs} +6 -6
  244. package/dist/{sync-task-DNKG9Bk4.mjs → sync-task-Gf86CU9l.mjs} +1 -1
  245. package/dist/{table-BDsqRU7a.mjs → table-BNA9Or05.mjs} +3 -3
  246. package/dist/{table-CF7zW9cI.mjs → table-hgrX1i-R.mjs} +36 -5
  247. package/dist/table-nIdBLcz7.mjs +26 -0
  248. package/dist/{table-selector-flags-CHfrVpYQ.mjs → table-selector-flags-BpFFoSaT.mjs} +4 -3
  249. package/dist/{text-C2VwKF9D.mjs → text-8nOxfC17.mjs} +1 -1
  250. package/dist/timeline-Cw581KRT.mjs +21 -0
  251. package/dist/{timeline-event-BF1dqSnD.mjs → timeline-event-BHfAXJrB.mjs} +6 -6
  252. package/dist/{transform-DiW7bREn.mjs → transform-B62craFM.mjs} +76 -7
  253. package/dist/{transform-CWGJB8N_.mjs → transform-DKPtUV54.mjs} +2 -2
  254. package/dist/{transform-job-ClX8e5iO.mjs → transform-job-CDIb3B9o.mjs} +6 -1
  255. package/dist/{transform-job-BBZ5L46v.mjs → transform-job-D18XRLBK.mjs} +1 -1
  256. package/dist/transform-job-sCgr8r-t.mjs +22 -0
  257. package/dist/transform-l1oC8oUS.mjs +28 -0
  258. package/dist/{transform-tag-BYoguZfW.mjs → transform-tag-DZEvmwxY.mjs} +5 -5
  259. package/dist/transform-test-hxkx6M8c.mjs +16 -0
  260. package/dist/{transforms-C6MFnT4C.mjs → transforms-D1wwWdCY.mjs} +6 -6
  261. package/dist/{transport-k_fabWdF.mjs → transport-BWixD5Ww.mjs} +5 -4
  262. package/dist/{tree-C4Igf6xs.mjs → tree-IymKTTCK.mjs} +4 -3
  263. package/dist/{typed-schema-Bo0Q6C0S.mjs → typed-schema-gaIKntyu.mjs} +4 -4
  264. package/dist/{unpublish-EStytsEm.mjs → unpublish-BnP0O_S2.mjs} +3 -3
  265. package/dist/{unreferenced-DtUuyBrr.mjs → unreferenced-DDkcn8EQ.mjs} +6 -6
  266. package/dist/{update-DAG8m5f4.mjs → update-BAocDvnS.mjs} +7 -8
  267. package/dist/{update-DECiEVlk.mjs → update-BemK_tZ_.mjs} +10 -11
  268. package/dist/{update-B0Na11v-.mjs → update-Bfws2FN2.mjs} +7 -8
  269. package/dist/{update-FfeHReec.mjs → update-BiBazvzY.mjs} +10 -11
  270. package/dist/{update-DhgfReDD.mjs → update-BsEG1dRm.mjs} +7 -8
  271. package/dist/{update-BogvN2Mb.mjs → update-C0p1E-hs.mjs} +8 -8
  272. package/dist/{update-pk0b6vXU.mjs → update-CFkOEnUu.mjs} +5 -6
  273. package/dist/{update-DT8U29Kk.mjs → update-CKrLtJWZ.mjs} +7 -8
  274. package/dist/{update-Bba_zPSE.mjs → update-C_VV1SP8.mjs} +10 -11
  275. package/dist/{update-DkvIK-eL.mjs → update-CgJwzutJ.mjs} +7 -8
  276. package/dist/{update-BOg1jZ_s.mjs → update-Cga4lrX5.mjs} +11 -12
  277. package/dist/{update-z8ZGCg1r.mjs → update-CsH0lSpQ2.mjs} +7 -8
  278. package/dist/{update-HbggUPuy.mjs → update-CyfLXFKR.mjs} +5 -6
  279. package/dist/{update-CCLpNTPa.mjs → update-D9eA9UOf.mjs} +5 -6
  280. package/dist/{update-B1UXRPN-.mjs → update-D9fs-PSK.mjs} +8 -9
  281. package/dist/{update-DIBaY-fy.mjs → update-DL1Iex_M.mjs} +7 -8
  282. package/dist/{update-BXLY92om.mjs → update-DntKWUl2.mjs} +10 -11
  283. package/dist/{update-CciLWH_s.mjs → update-K8FwdJEV.mjs} +11 -11
  284. package/dist/{update-DT2ViMFr.mjs → update-ReSzm23m.mjs} +5 -6
  285. package/dist/{update-dashcard-m-hkIGUu.mjs → update-dashcard-Bpv45o1_.mjs} +7 -8
  286. package/dist/{update-VGgvQu7W.mjs → update-gAPjldWw.mjs} +5 -6
  287. package/dist/{upgrade-iETJ8fH2.mjs → upgrade-D3aDQZwd.mjs} +5 -4
  288. package/dist/{upload-CoK5LnyA.mjs → upload-B8HbBXb8.mjs} +3 -3
  289. package/dist/{upload-BF5pdKRN.mjs → upload-BAD_9okY.mjs} +2 -2
  290. package/dist/upload-BqJLNCb1.mjs +13 -0
  291. package/dist/{uuid-8Ha-8bDX.mjs → uuid-BIDBDPLI.mjs} +3 -2
  292. package/dist/{validate-BQ7vI8_x.mjs → validate-moGYlHxB.mjs} +8 -18
  293. package/dist/validate-query-Bf5FhhMI.mjs +72 -0
  294. package/dist/{values-BsgA7-6h.mjs → values-BDekphEw.mjs} +5 -5
  295. package/dist/{verify-cjUPMF_B.mjs → verify-BnZqq9Aw.mjs} +3 -3
  296. package/dist/{verify-CzBZbP4W.mjs → verify-CMTrDvAW.mjs} +3 -3
  297. package/dist/{verify-crIrbGZV.mjs → verify-k0WHgc16.mjs} +4 -3
  298. package/dist/{wait-mFUfpSaj.mjs → wait-C69z8PSw.mjs} +5 -5
  299. package/dist/{wait-flags-BnZ-dfE2.mjs → wait-flags-C3cu_O0w.mjs} +2 -2
  300. package/dist/{window-CfK_j6m1.mjs → window-D1w7B0vh.mjs} +1 -1
  301. package/package.json +1 -1
  302. package/skill-data/core/SKILL.md +18 -14
  303. package/skill-data/data-app/SKILL.md +16 -17
  304. package/skill-data/data-app/template/README.md +1 -1
  305. package/skill-data/data-app-actions/SKILL.md +3 -0
  306. package/skill-data/data-app-data/SKILL.md +6 -6
  307. package/skill-data/data-app-filters/SKILL.md +12 -4
  308. package/skill-data/data-app-ui/SKILL.md +11 -11
  309. package/skill-data/data-workflow/references/reusable-definitions.md +2 -2
  310. package/skill-data/git-sync/SKILL.md +13 -11
  311. package/skill-data/mbql/SKILL.md +3 -3
  312. package/skill-data/native-sql/SKILL.md +1 -1
  313. package/skill-data/native-sql/references/template-tags.md +1 -1
  314. package/dist/api-key-wGtJ8kYy.mjs +0 -13
  315. package/dist/body-M5qsJoub.mjs +0 -16
  316. package/dist/card-BWTjCE93.mjs +0 -25
  317. package/dist/collection-9_mj8rVX.mjs +0 -21
  318. package/dist/dashboard-BZV-0Qjp.mjs +0 -35
  319. package/dist/data-action-B7kRpvCH.mjs +0 -24
  320. package/dist/dependency-DDRGBlFL.mjs +0 -15
  321. package/dist/document-BeLf7NqP.mjs +0 -20
  322. package/dist/field-CQDz-6DK.mjs +0 -21
  323. package/dist/git-sync-D_T9oNC6.mjs +0 -29
  324. package/dist/glossary-BVK5DaLV.mjs +0 -14
  325. package/dist/snippet-DKARah-L.mjs +0 -19
  326. package/dist/table-BPYHnzyV.mjs +0 -26
  327. package/dist/timeline-C2m_QHxn.mjs +0 -21
  328. package/dist/transform-N_elgRuh.mjs +0 -28
  329. package/dist/transform-job-CTV6KRP2.mjs +0 -22
  330. package/dist/transform-test-jaBpHOM5.mjs +0 -16
  331. package/dist/upload-CqSGEZQW.mjs +0 -13
  332. package/dist/validate-query-YtH3d5BP.mjs +0 -38
@@ -1,39 +1,41 @@
1
- import { Dt as PartialWriteError, Ft as isNonInterruptFailure, Mt as errorMessage, Nt as formatZodIssue, Ot as ResponseShapeError, P as CapabilityError, Q as parseJsonOrPlain, St as ConfigError, W as HttpError, Y as isPlainObject, kt as TimeoutError, n as isMethodKey, r as methodRequirements, wt as InternalError } from "./cli.mjs";
2
- import { n as Notification, r as NotificationCardPayload, t as CARD_PAYLOAD_TYPE } from "./notification-DaA4bBHW.mjs";
3
- import { V as profileFromProperties, tt as SessionProperties } from "./runtime-Y4VFWmmr.mjs";
1
+ import { _ as formatZodIssue, c as InternalError, d as PartialWriteError, f as ResponseShapeError, g as errorMessage, o as ConfigError, p as TimeoutError, r as isPlainObject, y as isNonInterruptFailure } from "./predicates-0C0TsWcJ.mjs";
2
+ import { F as CapabilityError, K as HttpError, Z as parseJsonOrPlain, i as methodRequirements, r as isMethodKey } from "./cli.mjs";
3
+ import { i as NotificationCardPayload, n as CARD_PAYLOAD_TYPE, r as Notification, t as AnyNotification } from "./notification-B5yMuPmo.mjs";
4
+ import { V as profileFromProperties, tt as SessionProperties } from "./runtime-D5yfliIq.mjs";
4
5
  import { i as CreatedApiKey, t as ApiKey } from "./api-key-DbsqHlN6.mjs";
5
- import { n as featureFailures, r as supersedingFeature, t as checkFeatures } from "./requirement-check-CpiVuL0H.mjs";
6
- import { n as createTransport } from "./transport-k_fabWdF.mjs";
7
- import { i as CardDetail, o as CardQueryResult, t as Card } from "./card-QR3zEu6E.mjs";
8
- import { f as FieldWithDataSensitivity, g as fieldRemappedValueSchema, h as fieldDetailSchema, n as FieldBaseType, o as FieldSearchMatches, s as FieldSemanticType, u as FieldValues } from "./field-DoWQUl7V.mjs";
6
+ import { n as featureFailures, r as supersedingFeature, t as checkFeatures } from "./requirement-check-1fcffJj6.mjs";
7
+ import { n as createTransport } from "./transport-BWixD5Ww.mjs";
8
+ import { i as CardDetail, o as CardQueryResult, t as Card } from "./card-BJRZ5D5Q.mjs";
9
+ import { t as gateInput } from "./input-gate-registry-Dh8QjKgW.mjs";
10
+ import { _ as fieldRemappedValueSchema, c as FieldSemanticType, d as FieldValues, g as fieldDetailSchema, p as FieldWithDataSensitivity, r as FieldBaseType, s as FieldSearchMatches, t as DATA_SENSITIVITY_GATE } from "./field-C2qOViFZ.mjs";
9
11
  import { r as ModerationReviewCreateInput, t as ModerationReview } from "./moderation-review-Bf9bPNQI.mjs";
10
- import { a as TemporalUnit, r as ParameterValues } from "./parameter-DvRQMKd2.mjs";
12
+ import { i as ParameterValues, o as TemporalUnit } from "./parameter-Bucz3cLJ.mjs";
11
13
  import { r as PivotExportFormat, t as DatasetQuery } from "./query-BKtMP5eH.mjs";
12
- import { b as TableVisibilityType, p as TableQueryMetadata, s as TableDataLayerTier, t as Table, u as TableForeignKey, v as TableSelectors } from "./table-CF7zW9cI.mjs";
13
- import { c as DatabaseWithSettings, t as Database } from "./database-CxykzTAA.mjs";
14
+ import { S as TableSelectors, _ as TableQueryMetadata, a as Table, d as TableDataLayerTier, m as TableForeignKey, n as DATA_LAYER_MEDALLION_GATE, r as DATA_LAYER_TIER_GATE, t as DATA_AUTHORITY_WITHDRAWAL_GATE, w as TableVisibilityType } from "./table-hgrX1i-R.mjs";
15
+ import { c as DatabaseWithSettings, t as Database } from "./database-C5ucihp3.mjs";
14
16
  import { t as Snippet } from "./snippet-CyKAgIZl.mjs";
15
- import { r as QueryMetadata, t as CompiledQuery } from "./dataset-DIQLAp2P.mjs";
16
- import { c as CollectionItem, m as CollectionTreeNode, r as Collection } from "./collection-DNmFKALA.mjs";
17
+ import { r as QueryMetadata, t as CompiledQuery } from "./dataset-LJxNN6p5.mjs";
18
+ import { c as CollectionItem, m as CollectionTreeNode, r as Collection } from "./collection-Cz2qLX2m.mjs";
17
19
  import { t as ContentTranslationUploadResult } from "./content-translation-BrHOrmj9.mjs";
18
- import { o as DashboardDetail, r as DashboardCopy, t as Dashboard, u as Dashcard } from "./dashboard-Chjy5GKR.mjs";
19
- import { a as DataActionExecuteResult, s as dataActionSchema } from "./data-action-DZxVB_hD.mjs";
20
+ import { a as DashboardCreateInput, f as Dashcard, g as dashboardDetailSchema, r as DashboardCopy, t as Dashboard } from "./dashboard-Cwsf-e9T.mjs";
21
+ import { c as dataActionSchema, o as DataActionExecuteResult, t as DATA_ACTION_COLLECTION_GATE } from "./data-action-CuvI17XF.mjs";
20
22
  import { i as DataAppEntry, t as DataApp } from "./data-app-BUW-HlUo.mjs";
21
- import { r as pollUntil } from "./poll-CgtcJopL.mjs";
22
- import { i as DependencyEntity, s as DependencyGraph, t as BreakingSource, u as DependencyNode } from "./dependency-CaC6XuTY.mjs";
23
- import { t as Document } from "./document-UMG6me2P.mjs";
23
+ import { r as pollUntil } from "./poll-vxN__4cz.mjs";
24
+ import { i as DependencyEntity, s as DependencyGraph, t as BreakingSource, u as DependencyNode } from "./dependency-C1DExO6k.mjs";
25
+ import { t as Document } from "./document-BHOQq2T_.mjs";
24
26
  import { i as EidTranslateResult } from "./eid-translation-Ba92VOHe.mjs";
25
27
  import { a as SyncExportPreflight, f as SyncTask, g as isSyncTaskTerminal, l as SyncRemoteChanges, n as SyncBranchCreated, r as SyncDirtyItem, t as RemoteSyncState, u as SyncSettingsUpdateResult } from "./git-sync-DP4wQFzm.mjs";
26
- import { t as Glossary } from "./glossary-QN-hHfOT.mjs";
27
- import { a as libraryWireSchema, i as LibraryPublishTablesInput, n as LibraryCollectionInfo, o as toLibrary } from "./library-DKIqzyUk.mjs";
28
- import { t as Measure } from "./measure-CtfjqJFP.mjs";
29
- import { t as Pulse } from "./pulse-CC81N2_0.mjs";
30
- import { a as TransformDagTransform, d as TransformTarget, g as transformRowSchema, h as transformDetailSchema, i as TransformDagRunResult, l as TransformRunSummary, m as isTransformRunTerminal, o as TransformRun, p as isTransformRunFailed, u as TransformSourceTableEntry } from "./transform-DiW7bREn.mjs";
28
+ import { t as Glossary } from "./glossary-iPIWrEbP.mjs";
29
+ import { a as libraryWireSchema, i as LibraryPublishTablesInput, n as LibraryCollectionInfo, o as toLibrary } from "./library-C4g9pdiS.mjs";
30
+ import { t as Measure } from "./measure-BMWrX1ca.mjs";
31
+ import { o as SUBSCRIPTION_FILTERS_GATE, t as Pulse } from "./pulse-B2AmIWsO.mjs";
32
+ import { _ as transformRowSchema, a as TransformDagTransform, d as TransformTarget, g as transformDetailSchema, h as keyedByAlias, i as TransformDagRunResult, l as TransformRunSummary, m as isTransformRunTerminal, o as TransformRun, p as isTransformRunFailed, u as TransformSourceTableEntryInput, v as transformSourceBody } from "./transform-B62craFM.mjs";
31
33
  import { r as SearchResult } from "./search-1et9tv_s.mjs";
32
- import { t as Segment } from "./segment-OsrbUDzw.mjs";
34
+ import { t as Segment } from "./segment-Cf-DrdjE.mjs";
33
35
  import { t as Setting } from "./setting-DTiLCW8g.mjs";
34
- import { n as SetupResult } from "./setup-CO7QV-ao.mjs";
36
+ import { n as SetupResult } from "./setup-BnczkG96.mjs";
35
37
  import { i as TimelineEvent, t as Timeline } from "./timeline-DcsCXNUt.mjs";
36
- import { c as transformJobSchema, n as TransformJobActiveResult, s as transformJobRunResultSchema } from "./transform-job-ClX8e5iO.mjs";
38
+ import { c as transformJobSchema, n as TransformJobActiveResult, s as transformJobRunResultSchema } from "./transform-job-CDIb3B9o.mjs";
37
39
  import { t as TransformTag } from "./transform-tag-CcElGp3C.mjs";
38
40
  import { i as TransformTestRunResult, t as TransformTest } from "./transform-test-Bexa_K89.mjs";
39
41
  import { t as UploadResult } from "./upload-DAtxBBms.mjs";
@@ -234,112 +236,6 @@ function paginatedEnvelopeSchema(itemSchema) {
234
236
  }).loose();
235
237
  }
236
238
  //#endregion
237
- //#region ../client/src/resources/collection.ts
238
- const CollectionApiList = z.array(Collection);
239
- const CollectionTreeApiList = z.array(CollectionTreeNode);
240
- const COLLECTION_LIST_QUERY = {
241
- all: {},
242
- archived: { archived: true },
243
- personal: { "personal-only": true }
244
- };
245
- const DEFAULT_LIST_FILTER = "all";
246
- function refPath(ref) {
247
- return encodeURIComponent(ref);
248
- }
249
- /**
250
- * List every collection the caller can read, the Library and its children among them, parsing each
251
- * through the caller's own projection. `Collection` pins `type`, `namespace` and `authority_level`
252
- * to closed enums, so a consumer reading a few fields off every collection on the instance narrows
253
- * here: one collection carrying a server value outside those sets then costs nothing to a caller
254
- * that never reads the field.
255
- */
256
- async function listCollectionsAs(transport, schema, options = {}) {
257
- return transport.requestParsed(z.array(schema), "/api/collection", { ...options });
258
- }
259
- function collectionResource(transport) {
260
- /**
261
- * List collections. `filter` picks a server-side preset: everything, archived, or personal. Every
262
- * preset includes the Library collections that match it. `namespace` lists that namespace's
263
- * collections, with its root, instead of the default namespace's.
264
- */
265
- async function list(params = {}, options = {}) {
266
- return {
267
- data: await transport.requestParsed(CollectionApiList, "/api/collection", {
268
- ...options,
269
- query: {
270
- ...COLLECTION_LIST_QUERY[params.filter ?? DEFAULT_LIST_FILTER],
271
- namespace: params.namespace
272
- }
273
- }),
274
- total: null
275
- };
276
- }
277
- /** Get one collection by id, entity id, or the `root`/`trash` alias. */
278
- async function get(ref, options = {}) {
279
- return transport.requestParsed(Collection, `/api/collection/${refPath(ref)}`, { ...options });
280
- }
281
- /** Create a new collection. */
282
- async function create(params, options = {}) {
283
- return transport.requestParsed(Collection, "/api/collection", {
284
- ...options,
285
- method: "POST",
286
- body: params
287
- });
288
- }
289
- /**
290
- * Update a collection, patching the fields the body carries. The server reads an absent
291
- * `archived` as `false`, so a patch without it restores an archived collection, and a patch that
292
- * moves a collection into the trash ignores `parent_id`.
293
- */
294
- async function update(ref, params, options = {}) {
295
- return transport.requestParsed(Collection, `/api/collection/${refPath(ref)}`, {
296
- ...options,
297
- method: "PUT",
298
- body: params
299
- });
300
- }
301
- /** Archive (soft-delete) a collection. Metabase models this as an update, not its own endpoint. */
302
- async function archive(ref, options = {}) {
303
- return update(ref, { archived: true }, options);
304
- }
305
- /**
306
- * Walk the items inside a collection one page at a time. This endpoint pages on the server, so
307
- * the caller consumes pages rather than a single list and decides how far to pull.
308
- */
309
- async function* itemPages(ref, params = {}, options = {}) {
310
- yield* paginatePages(transport, `/api/collection/${refPath(ref)}/items`, CollectionItem, {
311
- query: {
312
- models: params.models,
313
- archived: params.archived,
314
- pinned_state: params.pinned_state
315
- },
316
- ...options.offset !== void 0 && { offset: options.offset },
317
- ...options.max !== void 0 && { max: options.max },
318
- ...options.pageSize !== void 0 && { pageSize: options.pageSize },
319
- ...options.signal !== void 0 && { signal: options.signal }
320
- });
321
- }
322
- /** Fetch the collection hierarchy as a forest of nested nodes. */
323
- async function tree(params = {}, options = {}) {
324
- return {
325
- data: await transport.requestParsed(CollectionTreeApiList, "/api/collection/tree", {
326
- ...options,
327
- query: { "include-library": params["include-library"] }
328
- }),
329
- total: null
330
- };
331
- }
332
- return {
333
- list,
334
- get,
335
- create,
336
- update,
337
- archive,
338
- itemPages,
339
- tree
340
- };
341
- }
342
- //#endregion
343
239
  //#region ../client/src/version/refusal.ts
344
240
  const REFUSAL_STATUSES = /* @__PURE__ */ new Set([
345
241
  400,
@@ -462,6 +358,140 @@ function topLevelField(path) {
462
358
  return end === -1 ? path : path.slice(0, end);
463
359
  }
464
360
  //#endregion
361
+ //#region ../client/src/resources/collection.ts
362
+ const CollectionApiList = z.array(Collection);
363
+ const CollectionTreeApiList = z.array(CollectionTreeNode);
364
+ const COLLECTION_LIST_QUERY = {
365
+ all: {},
366
+ archived: { archived: true },
367
+ personal: { "personal-only": true }
368
+ };
369
+ const DEFAULT_LIST_FILTER = "all";
370
+ const INCLUDE_LIBRARY = { "include-library": true };
371
+ const TRASH_ALIAS = "trash";
372
+ const MODELS_FIELDS$1 = ["models"];
373
+ const ITEM_MODEL_FEATURES = {
374
+ transform: "transforms",
375
+ measure: "collectionItemMeasures",
376
+ exploration: "explorations"
377
+ };
378
+ function itemModelFeatures(_ref, params = {}) {
379
+ if (params.models === void 0) return [];
380
+ return params.models.flatMap((model) => {
381
+ const feature = ITEM_MODEL_FEATURES[model];
382
+ return feature === void 0 ? [] : [{
383
+ feature,
384
+ fields: MODELS_FIELDS$1
385
+ }];
386
+ });
387
+ }
388
+ function refPath(ref) {
389
+ return encodeURIComponent(ref);
390
+ }
391
+ /**
392
+ * List every collection the caller can read, the Library and its children among them, parsing each
393
+ * through the caller's own projection. `Collection` pins `type`, `namespace` and `authority_level`
394
+ * to closed enums, so a consumer reading a few fields off every collection on the instance narrows
395
+ * here: one collection carrying a server value outside those sets then costs nothing to a caller
396
+ * that never reads the field.
397
+ */
398
+ async function listCollectionsAs(transport, schema, options = {}) {
399
+ return transport.requestParsed(z.array(schema), "/api/collection", {
400
+ ...options,
401
+ query: INCLUDE_LIBRARY
402
+ });
403
+ }
404
+ function collectionResource(transport) {
405
+ const { explainWalk } = explainer(transport, "collection");
406
+ /**
407
+ * List collections. `filter` picks a server-side preset: everything, archived, or personal. Every
408
+ * preset includes the Library collections that match it. `namespace` lists that namespace's
409
+ * collections, with its root, instead of the default namespace's.
410
+ */
411
+ async function list(params = {}, options = {}) {
412
+ return {
413
+ data: await transport.requestParsed(CollectionApiList, "/api/collection", {
414
+ ...options,
415
+ query: {
416
+ ...COLLECTION_LIST_QUERY[params.filter ?? DEFAULT_LIST_FILTER],
417
+ ...INCLUDE_LIBRARY,
418
+ namespace: params.namespace
419
+ }
420
+ }),
421
+ total: null
422
+ };
423
+ }
424
+ /** Get one collection by id, entity id, or the `root`/`trash` alias. */
425
+ async function get(ref, options = {}) {
426
+ return transport.requestParsed(Collection, `/api/collection/${refPath(ref)}`, { ...options });
427
+ }
428
+ /** Create a new collection. */
429
+ async function create(params, options = {}) {
430
+ return transport.requestParsed(Collection, "/api/collection", {
431
+ ...options,
432
+ method: "POST",
433
+ body: params
434
+ });
435
+ }
436
+ /**
437
+ * Update a collection, patching the fields the body carries. The server reads an absent
438
+ * `archived` as `false`, so a patch without it restores an archived collection, and a patch that
439
+ * moves a collection into the trash ignores `parent_id`.
440
+ */
441
+ async function update(ref, params, options = {}) {
442
+ return transport.requestParsed(Collection, `/api/collection/${refPath(ref)}`, {
443
+ ...options,
444
+ method: "PUT",
445
+ body: params
446
+ });
447
+ }
448
+ /** Archive (soft-delete) a collection. Metabase models this as an update, not its own endpoint. */
449
+ async function archive(ref, options = {}) {
450
+ return update(ref, { archived: true }, options);
451
+ }
452
+ /**
453
+ * Walk the items inside a collection one page at a time. This endpoint pages on the server, so
454
+ * the caller consumes pages rather than a single list and decides how far to pull. The `trash`
455
+ * alias costs one more request, which reads the trash collection's id. A `models` filter takes
456
+ * `transform` only with `transforms`, `measure` only with `collectionItemMeasures`, and
457
+ * `exploration` only with `explorations`.
458
+ */
459
+ async function* itemPages(ref, params = {}, options = {}) {
460
+ const withSignal = options.signal !== void 0 && { signal: options.signal };
461
+ yield* paginatePages(transport, `/api/collection/${refPath(ref === TRASH_ALIAS ? (await get(TRASH_ALIAS, { ...withSignal })).id : ref)}/items`, CollectionItem, {
462
+ query: {
463
+ models: params.models,
464
+ archived: params.archived,
465
+ pinned_state: params.pinned_state,
466
+ "pinned-state": params.pinned_state
467
+ },
468
+ ...options.offset !== void 0 && { offset: options.offset },
469
+ ...options.max !== void 0 && { max: options.max },
470
+ ...options.pageSize !== void 0 && { pageSize: options.pageSize },
471
+ ...withSignal
472
+ });
473
+ }
474
+ /** Fetch the collection hierarchy as a forest of nested nodes. */
475
+ async function tree(params = {}, options = {}) {
476
+ return {
477
+ data: await transport.requestParsed(CollectionTreeApiList, "/api/collection/tree", {
478
+ ...options,
479
+ query: { "include-library": params["include-library"] }
480
+ }),
481
+ total: null
482
+ };
483
+ }
484
+ return {
485
+ list,
486
+ get,
487
+ create,
488
+ update,
489
+ archive,
490
+ itemPages: explainWalk("itemPages", itemPages, itemModelFeatures),
491
+ tree
492
+ };
493
+ }
494
+ //#endregion
465
495
  //#region ../client/src/resources/csv-upload.ts
466
496
  const CSV_CONTENT_TYPE = "text/csv";
467
497
  function buildCsvFormData(file) {
@@ -493,6 +523,17 @@ function contentTranslationResource(transport) {
493
523
  };
494
524
  }
495
525
  //#endregion
526
+ //#region ../client/src/resources/request-body.ts
527
+ /**
528
+ * Parse the body a caller hands a method, refusing one that does not match `schema` before any
529
+ * request. `what` names the body in the refusal.
530
+ */
531
+ function parseRequestBody(schema, value, what) {
532
+ const parsed = schema.safeParse(value);
533
+ if (!parsed.success) throw new ConfigError(`invalid ${what}: ${parsed.error.issues.map(formatZodIssue).join("; ")}`);
534
+ return parsed.data;
535
+ }
536
+ //#endregion
496
537
  //#region ../client/src/resources/dashboard.ts
497
538
  const DashboardApiList = z.array(Dashboard);
498
539
  const PreflightDashcard = z.looseObject({ card_id: z.number().int().nullable().optional() });
@@ -510,17 +551,19 @@ function dashboardResource(transport) {
510
551
  }
511
552
  /** Get one dashboard by id, with its dashcards, tabs and parameters. */
512
553
  async function get(id, options = {}) {
513
- return transport.requestParsed(DashboardDetail, `/api/dashboard/${id}`, { ...options });
554
+ return transport.requestParsed(dashboardDetailSchema, `/api/dashboard/${id}`, { ...options });
514
555
  }
515
556
  /**
516
557
  * Create a dashboard. The endpoint accepts no dashcards or tabs — a follow-up `update` is what
517
- * puts content on a fresh dashboard.
558
+ * puts content on a fresh dashboard. A key `DashboardCreateInput` does not declare is dropped
559
+ * before the request, as the server drops it.
518
560
  */
519
561
  async function create(params, options = {}) {
562
+ const body = parseRequestBody(DashboardCreateInput, params, "dashboard");
520
563
  return transport.requestParsed(Dashboard, "/api/dashboard", {
521
564
  ...options,
522
565
  method: "POST",
523
- body: params
566
+ body
524
567
  });
525
568
  }
526
569
  /**
@@ -531,7 +574,7 @@ function dashboardResource(transport) {
531
574
  */
532
575
  async function update(id, params, options = {}) {
533
576
  const body = await withCurrentTabs(id, params, options);
534
- return transport.requestParsed(DashboardDetail, `/api/dashboard/${id}`, {
577
+ return transport.requestParsed(dashboardDetailSchema, `/api/dashboard/${id}`, {
535
578
  ...options,
536
579
  method: "PUT",
537
580
  body
@@ -704,13 +747,18 @@ function stripEntityId(dashcard) {
704
747
  };
705
748
  }
706
749
  //#endregion
707
- //#region ../client/src/resources/data-action.ts
708
- function collectionFeatures(params) {
709
- return params.collection_id === void 0 ? [] : [{
710
- feature: "dataActionCollections",
711
- fields: ["collection_id"]
712
- }];
750
+ //#region ../client/src/version/input-gates.ts
751
+ /** Whether `value`, as a caller passes it for the gated field, is one the gate applies to. */
752
+ function gateTriggered(gate, value) {
753
+ const { when } = gate;
754
+ switch (when.kind) {
755
+ case "present": return value !== void 0;
756
+ case "values": return when.values.some((gated) => gated === value);
757
+ case "nonEmpty": return Array.isArray(value) && value.length > 0;
758
+ }
713
759
  }
760
+ //#endregion
761
+ //#region ../client/src/resources/data-action.ts
714
762
  function dataActionResource(transport) {
715
763
  const { explain } = explainer(transport, "dataAction");
716
764
  async function readSchema(options) {
@@ -739,8 +787,13 @@ function dataActionResource(transport) {
739
787
  body: params
740
788
  });
741
789
  }
742
- /** Update a data action by id, patching only the fields the body carries. */
790
+ /**
791
+ * Update a data action by id, patching only the fields the body carries. A server whose data
792
+ * actions have no collection never moves the action, and from 58.31 it strips the undeclared key and
793
+ * answers as if it had. So the field is refused there before the wire.
794
+ */
743
795
  async function update(id, params, options = {}) {
796
+ await transport.requireFeatures(gateTriggered(DATA_ACTION_COLLECTION_GATE, params.collection_id) ? [DATA_ACTION_COLLECTION_GATE.feature] : [], options);
744
797
  const schema = await readSchema(options);
745
798
  return transport.requestParsed(schema, `/api/action/${id}`, {
746
799
  ...options,
@@ -772,7 +825,7 @@ function dataActionResource(transport) {
772
825
  list,
773
826
  get,
774
827
  create: explain("create", create),
775
- update: explain("update", update, (_id, params) => collectionFeatures(params)),
828
+ update,
776
829
  archive,
777
830
  delete: remove,
778
831
  execute
@@ -1028,18 +1081,24 @@ function datasetResource(transport) {
1028
1081
  //#region ../client/src/resources/dependency.ts
1029
1082
  const DependencyNodeApiList = z.array(DependencyNode);
1030
1083
  const DependencyEntityApiList = z.array(DependencyEntity);
1031
- function graphTypeFeatures(type) {
1032
- return type === "measure" ? [{
1084
+ function entityTypeFeatures(type) {
1085
+ if (type === "measure") return [{
1033
1086
  feature: "measureDependencyGraph",
1034
1087
  fields: ["type"]
1035
- }] : [];
1088
+ }];
1089
+ if (type === "action") return [{
1090
+ feature: "actionDependencyGraph",
1091
+ fields: ["type"]
1092
+ }];
1093
+ return [];
1036
1094
  }
1037
1095
  function dependencyResource(transport) {
1038
1096
  const { explain, explainWalk } = explainer(transport, "dependency");
1039
1097
  /**
1040
1098
  * The upstream dependency graph of one entity. `nodes` holds the starting entity plus every
1041
1099
  * entity it depends on, directly or transitively; each edge runs from the dependent to what it
1042
- * depends on. A measure starts a graph only on a server with `measureDependencyGraph`.
1100
+ * depends on. A measure starts a graph only on a server with `measureDependencyGraph`, and an
1101
+ * action only on one with `actionDependencyGraph`.
1043
1102
  */
1044
1103
  async function graph(type, id, options = {}) {
1045
1104
  return transport.requestParsed(DependencyGraph, "/api/ee/dependencies/graph", {
@@ -1147,9 +1206,9 @@ function dependencyResource(transport) {
1147
1206
  });
1148
1207
  }
1149
1208
  return {
1150
- graph: explain("graph", graph, graphTypeFeatures),
1151
- dependents: explain("dependents", dependents),
1152
- broken: explain("broken", broken),
1209
+ graph: explain("graph", graph, entityTypeFeatures),
1210
+ dependents: explain("dependents", dependents, entityTypeFeatures),
1211
+ broken: explain("broken", broken, entityTypeFeatures),
1153
1212
  unreferencedPages: explainWalk("unreferencedPages", unreferencedPages),
1154
1213
  breakingPages: explainWalk("breakingPages", breakingPages)
1155
1214
  };
@@ -1338,7 +1397,7 @@ function fieldResource(transport) {
1338
1397
  * the label is refused there before the wire. Answers the field the way `get` does.
1339
1398
  */
1340
1399
  async function update(id, params, options = {}) {
1341
- await transport.requireFeatures(params.data_sensitivity === void 0 ? [] : ["fieldDataSensitivity"], options);
1400
+ await transport.requireFeatures(gateTriggered(DATA_SENSITIVITY_GATE, params.data_sensitivity) ? [DATA_SENSITIVITY_GATE.feature] : [], options);
1342
1401
  const { features } = await transport.server(options);
1343
1402
  return transport.requestParsed(fieldDetailSchema(features), `/api/field/${id}`, {
1344
1403
  ...options,
@@ -1810,17 +1869,6 @@ function glossaryResource(transport) {
1810
1869
  };
1811
1870
  }
1812
1871
  //#endregion
1813
- //#region ../client/src/resources/request-body.ts
1814
- /**
1815
- * Parse the body a caller hands a method, refusing one that does not match `schema` before any
1816
- * request. `what` names the body in the refusal.
1817
- */
1818
- function parseRequestBody(schema, value, what) {
1819
- const parsed = schema.safeParse(value);
1820
- if (!parsed.success) throw new ConfigError(`invalid ${what}: ${parsed.error.issues.map(formatZodIssue).join("; ")}`);
1821
- return parsed.data;
1822
- }
1823
- //#endregion
1824
1872
  //#region ../client/src/resources/library.ts
1825
1873
  const LIBRARY_ROOT_PATH = "/api/ee/library/";
1826
1874
  const PUBLISH_TABLES_PATH = "/api/ee/data-studio/table/publish-tables";
@@ -2201,7 +2249,7 @@ function notificationResource(transport) {
2201
2249
  }
2202
2250
  /** Get one question alert by id, refusing an id that names a system-event notification. */
2203
2251
  async function get(id, options = {}) {
2204
- return assertCardAlert(await transport.requestParsed(Notification, `/api/notification/${id}`, { ...options }));
2252
+ return assertCardAlert(await transport.requestParsed(AnyNotification, `/api/notification/${id}`, { ...options }));
2205
2253
  }
2206
2254
  /** Create a question alert — its card payload, schedules and handlers — from a full body. */
2207
2255
  async function create(params, options = {}) {
@@ -2370,7 +2418,7 @@ function pulseResource(transport) {
2370
2418
  return update(id, { archived: true }, options);
2371
2419
  }
2372
2420
  async function requireSubscriptionFilters(parameters, options) {
2373
- if (parameters !== void 0 && parameters.length > 0) await transport.requireFeatures(["dashboardSubscriptionFilters"], options);
2421
+ if (gateTriggered(SUBSCRIPTION_FILTERS_GATE, parameters)) await transport.requireFeatures([SUBSCRIPTION_FILTERS_GATE.feature], options);
2374
2422
  }
2375
2423
  return {
2376
2424
  list,
@@ -2594,8 +2642,34 @@ const RevisionRow = z.object({
2594
2642
  is_reversion: z.boolean(),
2595
2643
  most_recent: z.boolean()
2596
2644
  }).loose();
2645
+ const REVISION_ENTITY_GATES = [
2646
+ {
2647
+ feature: "measures",
2648
+ effect: "needs",
2649
+ when: {
2650
+ kind: "values",
2651
+ values: ["measure"]
2652
+ }
2653
+ },
2654
+ {
2655
+ feature: "transforms",
2656
+ effect: "needs",
2657
+ when: {
2658
+ kind: "values",
2659
+ values: ["transform"]
2660
+ }
2661
+ },
2662
+ {
2663
+ feature: "transformTests",
2664
+ effect: "needs",
2665
+ when: {
2666
+ kind: "values",
2667
+ values: ["transform-test"]
2668
+ }
2669
+ }
2670
+ ];
2597
2671
  z.object({
2598
- entity: RevisionEntity,
2672
+ entity: gateInput(z.enum(RevisionEntity.options), ...REVISION_ENTITY_GATES),
2599
2673
  id: z.number().int().positive(),
2600
2674
  revision_id: z.number().int().positive()
2601
2675
  }).strict();
@@ -2618,17 +2692,11 @@ const RevisionApiRevert = z.union([Revision.transform((revision) => ({
2618
2692
  outcome: "unchanged",
2619
2693
  revision
2620
2694
  }))]);
2621
- const ENTITY_FEATURES = {
2622
- measure: "measures",
2623
- transform: "transforms",
2624
- "transform-test": "transformTests"
2625
- };
2626
2695
  function entityFeatures(entity) {
2627
- const feature = ENTITY_FEATURES[entity];
2628
- return feature === void 0 ? [] : [{
2629
- feature,
2696
+ return REVISION_ENTITY_GATES.filter((gate) => gateTriggered(gate, entity)).map((gate) => ({
2697
+ feature: gate.feature,
2630
2698
  fields: ["entity"]
2631
- }];
2699
+ }));
2632
2700
  }
2633
2701
  function revisionResource(transport) {
2634
2702
  const { explain } = explainer(transport, "revision");
@@ -2667,6 +2735,25 @@ function verifiedFeatures(params = {}) {
2667
2735
  fields: ["verified"]
2668
2736
  }] : [];
2669
2737
  }
2738
+ const MODELS_FIELDS = ["models"];
2739
+ const SEARCH_MODEL_FEATURES = {
2740
+ measure: "measures",
2741
+ transform: "transforms",
2742
+ exploration: "explorations"
2743
+ };
2744
+ function modelFeatures(params) {
2745
+ if (params.models === void 0) return [];
2746
+ return params.models.flatMap((model) => {
2747
+ const feature = SEARCH_MODEL_FEATURES[model];
2748
+ return feature === void 0 ? [] : [{
2749
+ feature,
2750
+ fields: MODELS_FIELDS
2751
+ }];
2752
+ });
2753
+ }
2754
+ function queryFeatures(params = {}) {
2755
+ return [...verifiedFeatures(params), ...modelFeatures(params)];
2756
+ }
2670
2757
  function searchResource(transport) {
2671
2758
  const { explain } = explainer(transport, "search");
2672
2759
  /**
@@ -2680,7 +2767,9 @@ function searchResource(transport) {
2680
2767
  * default), and `limit`/`offset` are the window the server applies before ranking hydration.
2681
2768
  * `verified` needs the `content_verification` premium feature, and is refused before the wire
2682
2769
  * without it: a server granting neither it nor `official_collections` refuses the filter, and one
2683
- * granting `official_collections` alone takes it without applying it.
2770
+ * granting `official_collections` alone takes it without applying it. `models` takes `measure`
2771
+ * only with `measures`, `transform` with `transforms` or on a Metabase 58 enterprise build, and
2772
+ * `exploration` only with `explorations`.
2684
2773
  */
2685
2774
  async function query(params = {}, options = {}) {
2686
2775
  await transport.requireFeatures(verifiedFeatures(params).map((requirement) => requirement.feature), options);
@@ -2706,7 +2795,7 @@ function searchResource(transport) {
2706
2795
  total: response.total
2707
2796
  };
2708
2797
  }
2709
- return { query: explain("query", query, verifiedFeatures) };
2798
+ return { query: explain("query", query, queryFeatures) };
2710
2799
  }
2711
2800
  //#endregion
2712
2801
  //#region ../client/src/resources/segment.ts
@@ -2885,14 +2974,11 @@ function listParamFeatures(params) {
2885
2974
  return LIST_PARAM_FEATURES.filter(([param]) => params[param] === true).map(([, feature]) => feature);
2886
2975
  }
2887
2976
  function dataLayerFeatures(value, field) {
2888
- return isTierName(value) ? [{
2889
- feature: "tableDataLayerTiers",
2977
+ return gateTriggered(DATA_LAYER_TIER_GATE, value) ? [{
2978
+ feature: DATA_LAYER_TIER_GATE.feature,
2890
2979
  fields: [field]
2891
2980
  }] : [];
2892
2981
  }
2893
- function isTierName(value) {
2894
- return value !== null && value !== void 0 && TableDataLayerTier.safeParse(value).success;
2895
- }
2896
2982
  const UPLOAD_UPDATE_PATHS = {
2897
2983
  append: "append-csv",
2898
2984
  replace: "replace-csv"
@@ -2946,10 +3032,11 @@ function tableResource(transport) {
2946
3032
  return updated;
2947
3033
  }
2948
3034
  async function refuseRewrittenDataLayer(value, options) {
2949
- if (value === null || value === void 0 || isTierName(value)) return;
3035
+ if (!gateTriggered(DATA_LAYER_MEDALLION_GATE, value)) return;
2950
3036
  const profile = await transport.preflightServer(options);
2951
3037
  if (profile === null) return;
2952
- const failure = supersedingFeature("tableDataLayerTiers", profile, `data_layer "${value}" is a medallion name; this server names a table's layer ${TableDataLayerTier.options.join(", ")} and would map it onto one of those without a word`);
3038
+ const detail = `data_layer "${value}" is a medallion name; this server names a table's layer ${TableDataLayerTier.options.join(", ")} and would map it onto one of those without a word`;
3039
+ const failure = supersedingFeature(DATA_LAYER_MEDALLION_GATE.feature, profile, detail);
2953
3040
  if (failure !== null) transport.refuseBeforeSending(new CapabilityError(failure));
2954
3041
  }
2955
3042
  /** Get a table by id with its fields hydrated — the metadata the query builder runs on. */
@@ -3025,7 +3112,7 @@ function tableResource(transport) {
3025
3112
  };
3026
3113
  }
3027
3114
  async function requireDataAuthorityNull(value, options) {
3028
- if (value === null) await transport.requireFeatures(["tableUserValueWithdrawal"], options);
3115
+ if (gateTriggered(DATA_AUTHORITY_WITHDRAWAL_GATE, value)) await transport.requireFeatures([DATA_AUTHORITY_WITHDRAWAL_GATE.feature], options);
3029
3116
  }
3030
3117
  async function postSelection(path, selectors, options) {
3031
3118
  const body = parseRequestBody(TableSelectors, selectors, "table selectors");
@@ -3583,10 +3670,22 @@ const TEST_RUN_ROW_LIMIT = {
3583
3670
  const TestRunRowLimit = z.number().int().min(TEST_RUN_ROW_LIMIT.min).max(TEST_RUN_ROW_LIMIT.max);
3584
3671
  z.object({
3585
3672
  code: z.string(),
3586
- source_tables: z.array(TransformSourceTableEntry).min(1),
3673
+ source_tables: z.array(TransformSourceTableEntryInput).min(1),
3587
3674
  output_row_limit: TestRunRowLimit.optional(),
3588
3675
  per_input_row_limit: TestRunRowLimit.optional()
3589
3676
  }).strict();
3677
+ function toTestRunTableValue(entry) {
3678
+ const { alias: _alias, ...reference } = entry;
3679
+ return typeof entry.table_id === "number" ? entry.table_id : reference;
3680
+ }
3681
+ /** A test run body as a server with `features` reads it. */
3682
+ function pythonTestRunBody(params, features) {
3683
+ if (features.transformSourceTablesAsList) return params;
3684
+ return {
3685
+ ...params,
3686
+ source_tables: keyedByAlias(params.source_tables, toTestRunTableValue)
3687
+ };
3688
+ }
3590
3689
  const PythonTestRunOutput = z.object({
3591
3690
  cols: z.array(z.object({ name: z.string() }).loose()),
3592
3691
  rows: z.array(z.unknown())
@@ -3643,10 +3742,11 @@ function transformPythonResource(transport) {
3643
3742
  * sizes are capped at 100 rows.
3644
3743
  */
3645
3744
  async function testRun(params, options = {}) {
3745
+ const { features } = await transport.server(options);
3646
3746
  return transport.requestParsed(PythonApiTestRun, "/api/ee/transforms-python/test-run", {
3647
3747
  ...options,
3648
3748
  method: "POST",
3649
- body: params
3749
+ body: pythonTestRunBody(params, features)
3650
3750
  });
3651
3751
  }
3652
3752
  return {
@@ -3687,20 +3787,30 @@ function transformResource(transport) {
3687
3787
  const { features } = await transport.server(options);
3688
3788
  return transport.requestParsed(transformDetailSchema(features), `/api/transform/${id}`, { ...options });
3689
3789
  }
3790
+ async function writeBody(params, options) {
3791
+ if (params.source === void 0) return params;
3792
+ const { features } = await transport.server(options);
3793
+ return {
3794
+ ...params,
3795
+ source: transformSourceBody(params.source, features)
3796
+ };
3797
+ }
3690
3798
  /** Create a transform — a query plus the warehouse table it writes — from a full body. */
3691
3799
  async function create(params, options = {}) {
3800
+ const body = await writeBody(params, options);
3692
3801
  return requestTransform("/api/transform", {
3693
3802
  ...options,
3694
3803
  method: "POST",
3695
- body: params
3804
+ body
3696
3805
  });
3697
3806
  }
3698
3807
  /** Update a transform by id, patching only the fields the body carries. */
3699
3808
  async function update(id, params, options = {}) {
3809
+ const body = await writeBody(params, options);
3700
3810
  return requestTransform(`/api/transform/${id}`, {
3701
3811
  ...options,
3702
3812
  method: "PUT",
3703
- body: params
3813
+ body
3704
3814
  });
3705
3815
  }
3706
3816
  /** Delete a transform by id, leaving any table it already materialized in place. */
@@ -4027,7 +4137,7 @@ function parseResponseInteger(value, source) {
4027
4137
  //#region ../client/src/domain/user.ts
4028
4138
  const CurrentUser = z.object({
4029
4139
  id: z.number().int(),
4030
- email: z.email(),
4140
+ email: z.string(),
4031
4141
  common_name: z.string(),
4032
4142
  is_superuser: z.boolean()
4033
4143
  }).loose();