@marimo-team/frontend 0.19.8-dev1 → 0.19.8-dev10
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/assets/{CellStatus-CTtb89yx.js → CellStatus-DbwQRhK0.js} +1 -1
- package/dist/assets/{Combination-C_mRvd_Z.js → Combination-izwufzWe.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-CX7YQX42.js → ConnectedDataExplorerComponent-B098edeX.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-CO2AyNfd.js → DeferredRequestRegistry-tv0PqJZ0.js} +1 -1
- package/dist/assets/{ErrorBoundary-ChCiwl15.js → ErrorBoundary-B9Ifj8Jf.js} +1 -1
- package/dist/assets/{ImageComparisonComponent-BVBGmVcA.js → ImageComparisonComponent-BVXYpigZ.js} +1 -1
- package/dist/assets/{ImperativeModal-CKeCkc1k.js → ImperativeModal-DZr52ffu.js} +1 -1
- package/dist/assets/{Inputs-CBxLLWdV.js → Inputs-CbenuziM.js} +1 -1
- package/dist/assets/{JsonOutput-BTBD86gT.js → JsonOutput-BTXiwFjF.js} +3 -3
- package/dist/assets/{LazyAnyLanguageCodeMirror-Be7SB10I.js → LazyAnyLanguageCodeMirror-CQP8KZWO.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-DuaUr0W-.js → MarimoErrorOutput-lr6vqAph.js} +1 -1
- package/dist/assets/{RenderHTML-IBhB_MjX.js → RenderHTML-hMZtS42w.js} +1 -1
- package/dist/assets/{SSRProvider-DBS9qs3r.js → SSRProvider-DrpctNAg.js} +1 -1
- package/dist/assets/__vite-browser-external-D-ioOGDE.js +1 -0
- package/dist/assets/__vite-browser-external-DBckR0WR.js +1 -0
- package/dist/assets/{add-cell-with-ai-DsiiVErB.js → add-cell-with-ai-DdyvzMmu.js} +2 -2
- package/dist/assets/{add-database-form-B1frIn24.js → add-database-form-CUZKNC1e.js} +1 -1
- package/dist/assets/{agent-panel-B_Ur2utx.js → agent-panel-CCs3ktma.js} +1 -1
- package/dist/assets/{ai-model-dropdown-Dix8JIRc.js → ai-model-dropdown-C_Fhvna-.js} +1 -1
- package/dist/assets/{alert-adkp2Qj8.js → alert-BOoN6gJ1.js} +1 -1
- package/dist/assets/{alert-dialog-CordKci7.js → alert-dialog-Ctz24SMn.js} +1 -1
- package/dist/assets/{any-language-editor-Z9d2XKUM.js → any-language-editor-B1WBkbF4.js} +1 -1
- package/dist/assets/{app-config-button-CYFJH9oz.js → app-config-button-BqV8GA-q.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-B-zQV2Ro.js → architectureDiagram-VXUJARFQ-BsTgqTsh.js} +1 -1
- package/dist/assets/{arrow-left-Cb_73j1f.js → arrow-left-VDC1u5rq.js} +1 -1
- package/dist/assets/{badge-Ce8wRjuQ.js → badge-D4keL3YC.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-B7BRAty8.js → blockDiagram-VD42YOAC-CeZonq9z.js} +1 -1
- package/dist/assets/{bundle.esm-B-jCcPJK.js → bundle.esm-CBAPjfrh.js} +1 -1
- package/dist/assets/{button-YC1gW_kJ.js → button-CZ3Cs4qb.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-C5JyC9v_.js → c4Diagram-YG6GDRKO-CDPGRzUd.js} +1 -1
- package/dist/assets/{cache-panel-BfCxvTOh.js → cache-panel-gTIhwBeU.js} +1 -1
- package/dist/assets/{card-BAxUmnnT.js → card-DdlNjkEA.js} +1 -1
- package/dist/assets/{cell-editor-BQ5bBOiS.js → cell-editor-COnUMHxW.js} +14 -14
- package/dist/assets/{cell-link-DW0zobk9.js → cell-link-OwIbBa8Q.js} +1 -1
- package/dist/assets/{cells-BcMpgRWV.js → cells-DdLMh4kY.js} +2 -2
- package/dist/assets/channel-CUmF6tDU.js +1 -0
- package/dist/assets/{chart-no-axes-column-W42b2ZIs.js → chart-no-axes-column-qvVRjhv1.js} +1 -1
- package/dist/assets/{chat-components-BpIX7pUp.js → chat-components-jnrAy95o.js} +1 -1
- package/dist/assets/{chat-display-CVXM0cmr.js → chat-display-rXqWwmbx.js} +1 -1
- package/dist/assets/{chat-panel-FiDMP_Qr.js → chat-panel-ims98I-K.js} +1 -1
- package/dist/assets/check-Dr3SxUsb.js +1 -0
- package/dist/assets/{chevron-right-DwagBitu.js → chevron-right--18M_6o9.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-Bmb7yu_c.js → chunk-5FQGJX7Z-CwvgJCug.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-Coo5qi7b.js → chunk-ABZYJK2D-CtRGq-db.js} +2 -2
- package/dist/assets/{chunk-ATLVNIR6-C0ULYreM.js → chunk-ATLVNIR6-CXEe2jMF.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-D6Q5lT5Z.js → chunk-B4BG7PRW-BVqt-NSK.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BUUtkB-8.js → chunk-DI55MBZ5-C_mlVJmb.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-DQy5cN5X.js → chunk-EXTU4WIE-CN3BqsR0.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-99Y1UR46.js → chunk-JA3XYJ7Z-B5-JYmoA.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DRGkEV50.js → chunk-JZLCHNYA-UFlatyc1.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-DHFG9ldR.js → chunk-N4CR4FBY-BFF_Z7sG.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-DB8FgLRd.js → chunk-QN33PNHL-DOgXIePg.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-_zxuSm7L.js → chunk-QXUST7PY-CbBaWlhv.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-PVCoxQeQ.js → chunk-S3R3BYOJ-CM-pQ0EF.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-KYGSDxPK.js → chunk-TZMSLE5B-Bs5ERkTF.js} +1 -1
- package/dist/assets/{circle-check-C57eOpl0.js → circle-check-DquVD4wZ.js} +1 -1
- package/dist/assets/{circle-play-BuOtSgid.js → circle-play-EowqxNIC.js} +1 -1
- package/dist/assets/{circle-plus-CnWl9uZo.js → circle-plus-haI9GLDP.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-DLI68D-F.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-yfw4NTdf.js +1 -0
- package/dist/assets/{clear-button-CF0iBcV9.js → clear-button-DI7_bdOB.js} +1 -1
- package/dist/assets/{click-outside-container-B12FHFHm.js → click-outside-container-Npdlddni.js} +1 -1
- package/dist/assets/{clipboard-paste-BiDF-cqm.js → clipboard-paste-CpyPR-HZ.js} +1 -1
- package/dist/assets/{code-block-37QAKDTI-D5PRUB7R.js → code-block-37QAKDTI-CT7W9knZ.js} +1 -1
- package/dist/assets/{code-xml-XLwHyDBr.js → code-xml-CgN_Yig7.js} +1 -1
- package/dist/assets/{column-preview-v3J210SK.js → column-preview-t0CyBVJf.js} +1 -1
- package/dist/assets/{command-DOzj5zu3.js → command-cs3Dd1TU.js} +1 -1
- package/dist/assets/{command-palette-B94wuFEk.js → command-palette-DJg1FMo6.js} +1 -1
- package/dist/assets/{common-DHF6uQdA.js → common-VAE3DrnP.js} +1 -1
- package/dist/assets/compiler-runtime-B3qBwwSJ.js +1 -0
- package/dist/assets/{config-C3-Nti03.js → config-D2-Bw6QC.js} +1 -1
- package/dist/assets/{context-CJp-B2dx.js → context-Ga_vV5mE.js} +1 -1
- package/dist/assets/{copy-CQ15EONK.js → copy-D-8y6iMN.js} +1 -1
- package/dist/assets/{copy-icon-C1fNHY3M.js → copy-icon-B9w72gBC.js} +1 -1
- package/dist/assets/createLucideIcon-BCdY6lG5.js +1 -0
- package/dist/assets/{createReducer-Dnna-AUO.js → createReducer-B3rBsy4P.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-khPiqbzB.js → dagre-6UL2VRFP-UK8bracd.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-Ca1ELXWD.js → data-grid-overlay-editor-2vr_zUfM.js} +1 -1
- package/dist/assets/{database-zap-B9y7063w.js → database-zap-k4ePIFAU.js} +1 -1
- package/dist/assets/{datasource-BZ3O2HG1.js → datasource-BBMMxrje.js} +1 -1
- package/dist/assets/{dates-Cx863TsG.js → dates-CT5PUuFo.js} +1 -1
- package/dist/assets/{dependency-graph-panel-s45LIDec.js → dependency-graph-panel-D16tZkyM.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-C7-DZLOE.js → diagram-PSM6KHXK-7QiPU-26.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-Ct2_XsRV.js → diagram-QEK2KX5R-BbZsWUC4.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-C82IZoPA.js → diagram-S2PKOQOG-SZ-twU4B.js} +1 -1
- package/dist/assets/{dialog-Dstm3Ubn.js → dialog-tQELcltn.js} +1 -1
- package/dist/assets/{dist-oarhZoo6.js → dist-CDXJRSCj.js} +1 -1
- package/dist/assets/{dist-PT7WsOdN.js → dist-DDGMbl6p.js} +1 -1
- package/dist/assets/{dist-BhLw_JdQ.js → dist-DY1C8dgM.js} +1 -1
- package/dist/assets/{documentation-panel-DRqbOPwM.js → documentation-panel-0BCnCatP.js} +1 -1
- package/dist/assets/{download-zuPzhwvm.js → download-BodpSpiQ.js} +1 -1
- package/dist/assets/{download-B9SUL40m.js → download-Dg7clfkc.js} +1 -1
- package/dist/assets/{dropdown-menu-D8v7RjW8.js → dropdown-menu-BUgFWmX1.js} +1 -1
- package/dist/assets/{edit-page-Dlr4v1eI.js → edit-page-1kpZH_Tj.js} +3 -3
- package/dist/assets/{ellipsis-5ip-qDfN.js → ellipsis-DfDsMPvA.js} +1 -1
- package/dist/assets/{ellipsis-vertical-C7jYiLCo.js → ellipsis-vertical-J1F7_WS9.js} +1 -1
- package/dist/assets/{empty-state-BAGXXrn8.js → empty-state-DrmGF88A.js} +1 -1
- package/dist/assets/{en-US-XLBup7bs.js → en-US-DU2jJCpg.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-Ftt2qDiM.js → erDiagram-Q2GNP2WA-BSmVh3Kt.js} +1 -1
- package/dist/assets/{error-banner-JIexM8h5.js → error-banner-Dlrzo_Ay.js} +1 -1
- package/dist/assets/{error-panel-TqjIx6nC.js → error-panel-D7CVHSby.js} +1 -1
- package/dist/assets/{errors-B5AI4nf5.js → errors-CPlNr33a.js} +1 -1
- package/dist/assets/{es-CPSXxuS6.js → es-CerBf9Z6.js} +5 -5
- package/dist/assets/{esm-BbNm2fB0.js → esm-C-53tlK5.js} +1 -1
- package/dist/assets/{eye-off-BhExYOph.js → eye-off-AK_9uodG.js} +1 -1
- package/dist/assets/{field-1uCBX4j4.js → field-D9jE8HEt.js} +1 -1
- package/dist/assets/{file-Cs1JbsV6.js → file-Ch78NKWp.js} +1 -1
- package/dist/assets/{file-explorer-panel-jku_uMQn.js → file-explorer-panel-d9LDZt_k.js} +1 -1
- package/dist/assets/{file-plus-corner-Da9I6dgU.js → file-plus-corner-CvAy4H5W.js} +1 -1
- package/dist/assets/{file-video-camera-DW3v07j2.js → file-video-camera-C3wGzBnE.js} +1 -1
- package/dist/assets/{floating-outline-CZbF47gm.js → floating-outline-C8UBGhNL.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-Ca9aZp-3.js → flowDiagram-NV44I4VS-2nYUYKvI.js} +1 -1
- package/dist/assets/{focus-BxGelf2n.js → focus-Bd_p77qK.js} +1 -1
- package/dist/assets/{form-DQt-Ldr4.js → form-D23zs2fF.js} +1 -1
- package/dist/assets/{gallery-page-D_5X4kKx.js → gallery-page-Yq7Go5FK.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-PYFPdyuJ.js → ganttDiagram-JELNMOA3-B77PnMPw.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NY62KEGX-CfGWoYOo.js → gitGraphDiagram-NY62KEGX-B-3aRelz.js} +1 -1
- package/dist/assets/{glide-data-editor-8ek3zzAO.js → glide-data-editor-B5UMCoFz.js} +4 -4
- package/dist/assets/globals-BgJBhxFI.js +1 -0
- package/dist/assets/{home-page-xDhfcHL1.js → home-page-DXMa3CyZ.js} +1 -1
- package/dist/assets/{hooks-MQa8CSUr.js → hooks-jQB62wos.js} +1 -1
- package/dist/assets/{house-DhFkiXz7.js → house-BI81AWSn.js} +1 -1
- package/dist/assets/{html-to-image-DKqpcM7V.js → html-to-image-Bc6qDa9c.js} +1 -1
- package/dist/assets/{icons-Dw4USSvE.js → icons-DjR3qLG_.js} +1 -1
- package/dist/assets/{index-CikhHYAB.css → index-BTVKRPtt.css} +1 -1
- package/dist/assets/{index-DuqUGjtK.js → index-DODfN3s6.js} +10 -10
- package/dist/assets/{infoDiagram-WHAUD3N6-Csbwq6Ks.js → infoDiagram-WHAUD3N6-_vys04Gc.js} +1 -1
- package/dist/assets/{input-DcAGg_4_.js → input-DHHmNa19.js} +1 -1
- package/dist/assets/{isValid-BLB2jskA.js → isValid-DpSSOU5z.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-DArwMxlY.js → journeyDiagram-XKPGCS4Q-CkD6eopP.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-CPjBJiO_.js → kanban-definition-3W4ZIXB7-kX5aL9Ug.js} +1 -1
- package/dist/assets/{katex-DYp6oq7P.js → katex-CDLTCvjQ.js} +1 -1
- package/dist/assets/katex-DF982Ty5.js +1 -0
- package/dist/assets/{kbd-uRyPZ9w_.js → kbd-Cm6Ba9qg.js} +1 -1
- package/dist/assets/kiosk-mode-BlAqMmYG.js +1 -0
- package/dist/assets/{label-CL9Xfexh.js → label-C9wP7Kp2.js} +1 -1
- package/dist/assets/{layout-D-YPCWvX.js → layout-BztBqV-1.js} +3 -3
- package/dist/assets/{link-BsTPF7B0.js → link-DxicfMbs.js} +1 -1
- package/dist/assets/{links-BhgWpHdU.js → links-7AQBmdyV.js} +1 -1
- package/dist/assets/{logs-panel-DKSJRyF4.js → logs-panel-B3aMPrwV.js} +1 -1
- package/dist/assets/{loro_wasm_bg-BnAHSQ7o.js → loro_wasm_bg-CdafknAX.js} +2 -2
- package/dist/assets/loro_wasm_bg-WKwciKJa.wasm +0 -0
- package/dist/assets/{loro_wasm_bg-CKQGJrH5.js → loro_wasm_bg-aCueZs8k.js} +1 -1
- package/dist/assets/{maps-t9yNKYA8.js → maps-D2_Mq1pZ.js} +1 -1
- package/dist/assets/{markdown-renderer-Bu12gPyJ.js → markdown-renderer-Dy-FX527.js} +1 -1
- package/dist/assets/{menu-items-NblnuU_B.js → menu-items-vwmjPhjW.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-DQz_QvBC.js +1 -0
- package/dist/assets/{mermaid-Bzaf_nA9.js → mermaid-Caj4ROsO.js} +3 -3
- package/dist/assets/{mhchem-DLDYYsJK.js → mhchem-CJmb5HsA.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-DVB4z5Yy.js → mindmap-definition-VGOIOE7T-BJ9zWUqW.js} +1 -1
- package/dist/assets/{mode-CevBiFCd.js → mode-BfhhQnCm.js} +1 -1
- package/dist/assets/{multi-icon-CLzAg610.js → multi-icon-BWLbAXq5.js} +1 -1
- package/dist/assets/{multi-map-W4zci54U.js → multi-map-t2yhdp8D.js} +1 -1
- package/dist/assets/{name-cell-input-DwvdP1Ck.js → name-cell-input-DvFZv__e.js} +1 -1
- package/dist/assets/{number-overlay-editor-CvIcqV0W.js → number-overlay-editor-DIy8e1ST.js} +1 -1
- package/dist/assets/{outline-panel-Bg_CP1WV.js → outline-panel-DH2X9Yaa.js} +1 -1
- package/dist/assets/{packages-panel-DBgrbk-q.js → packages-panel-BWx1vxzx.js} +1 -1
- package/dist/assets/{panel-context-C-UJlFyL.js → panel-context-2mVKaSYm.js} +1 -1
- package/dist/assets/{panels-CaoDGKmF.js → panels-vsOIbBB6.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-vwwb5uL8.js → pieDiagram-ADFJNKIX-Mf2FMnt9.js} +1 -1
- package/dist/assets/{play-BPIh-ZEU.js → play-GLWQQs7F.js} +1 -1
- package/dist/assets/{plus-BD5o34_i.js → plus-B7DF33lD.js} +1 -1
- package/dist/assets/{popover-BZZFx3Q8.js → popover-B-131r4d.js} +1 -1
- package/dist/assets/{process-output-Cl2N-HlT.js → process-output-CHXcfo-X.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Y8bEZ32G.js → quadrantDiagram-AYHSOK5B-B04U71uV.js} +1 -1
- package/dist/assets/{react-BGmjiNul.js → react-Bj1aDYRI.js} +1 -1
- package/dist/assets/{react-dom-C9fstfnp.js → react-dom-CSu739Rf.js} +1 -1
- package/dist/assets/{react-plotly-CZMBCa5P.js → react-plotly-D4UaXGJL.js} +1 -1
- package/dist/assets/{react-resizable-panels.browser.esm-BFvP7Upm.js → react-resizable-panels.browser.esm-Mq45xjWt.js} +1 -1
- package/dist/assets/{react-vega-DkHO4e2L.js → react-vega-CP7NqbRQ.js} +1 -1
- package/dist/assets/{react-vega-BCDifxTe.js → react-vega-CqegDZRQ.js} +1 -1
- package/dist/assets/{readonly-python-code-H1kzT-lB.js → readonly-python-code-Drm-iT2o.js} +1 -1
- package/dist/assets/{refresh-ccw-DLEiQDS3.js → refresh-ccw-DN_xCV6A.js} +1 -1
- package/dist/assets/{refresh-cw-CQd-1kjx.js → refresh-cw-Dx8TEWFP.js} +1 -1
- package/dist/assets/{renderShortcut-zxgoVTeP.js → renderShortcut-B1jzzLJw.js} +1 -1
- package/dist/assets/request-registry-BWqkV683.js +1 -0
- package/dist/assets/{requests-BsVD4CdD.js → requests-B4FYHTZl.js} +1 -1
- package/dist/assets/requests-BQkjRazP.js +1 -0
- package/dist/assets/{requirementDiagram-UZGBJVZJ-ChckaTrX.js → requirementDiagram-UZGBJVZJ-oJlPs172.js} +1 -1
- package/dist/assets/{rotate-ccw-B_yU4f05.js → rotate-ccw-DPbJxVVN.js} +1 -1
- package/dist/assets/run-page-CM1n8muV.js +1 -0
- package/dist/assets/{runs-X54OGDTq.js → runs-DyBOFmAK.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-DtU4O0-i.js → sankeyDiagram-TZEHDZUN-aplEbaHE.js} +1 -1
- package/dist/assets/{save-PMHbdtqc.js → save-DZodxFnE.js} +1 -1
- package/dist/assets/{save-worker-DtF6B3PS.js → save-worker-CtJsIYIM.js} +3 -3
- package/dist/assets/{scratchpad-panel-CIxZIJ-1.js → scratchpad-panel-BFFeceHa.js} +1 -1
- package/dist/assets/{secrets-panel-TwfjwIVv.js → secrets-panel-vKKBtc8G.js} +1 -1
- package/dist/assets/{select-CX1Yi8J8.js → select-B7bfltkI.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-BGXrTemh.js → sequenceDiagram-WL72ISMW-WAUwGkkd.js} +1 -1
- package/dist/assets/{session-panel-CNeWVmTR.js → session-panel-IeLEqwsB.js} +1 -1
- package/dist/assets/{settings-DOXWMfVd.js → settings-OBbrbhij.js} +1 -1
- package/dist/assets/{share-Ba-pHZtq.js → share-rXkgGlhr.js} +1 -1
- package/dist/assets/{slides-component-CGMJm_kL.js → slides-component-CeMnlG8H.js} +1 -1
- package/dist/assets/{snippets-panel-DMN_ZSXA.js → snippets-panel-nld0VX-j.js} +1 -1
- package/dist/assets/{spec-D1kBp3jX.js → spec-Ch0xnJY4.js} +1 -1
- package/dist/assets/{spinner-DaIKav-i.js → spinner-DA8-7wQv.js} +1 -1
- package/dist/assets/{square-C8Tw_XXG.js → square-DPZjfUaq.js} +1 -1
- package/dist/assets/{square-function-CqXXKtIq.js → square-function-B6mgCeFJ.js} +1 -1
- package/dist/assets/{state-n1Xz9vt7.js → state-DAl4qLSi.js} +1 -1
- package/dist/assets/{state-BLsnFVwy.js → state-yRkQ_uSW.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-BwSf7RIr.js → stateDiagram-FKZM4ZOC-DUDhr_Gg.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-yH9Rugj-.js +1 -0
- package/dist/assets/{switch-CfRu5JBF.js → switch-D-TxHKpg.js} +1 -1
- package/dist/assets/{table-DZR6ewbN.js → table-CfDbAm78.js} +1 -1
- package/dist/assets/{table-qbh6Daed.js → table-DScsXgJW.js} +1 -1
- package/dist/assets/{terminal-C0fH4d_0.js → terminal-CF-esPMT.js} +1 -1
- package/dist/assets/{textarea-3ZXdUni1.js → textarea-BFfMAEaQ.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-BZakpQwy.js → timeline-definition-IT6M3QCI-D93LYpWp.js} +1 -1
- package/dist/assets/{toDate-CgbKQM5E.js → toDate-DETS9bBd.js} +1 -1
- package/dist/assets/{toggle-CWS-iCmF.js → toggle-CriARMQK.js} +1 -1
- package/dist/assets/{tooltip-DH6k_bBY.js → tooltip-C_WgOOcZ.js} +1 -1
- package/dist/assets/{tracing-zzjDz6Hy.js → tracing-DB7ckaG0.js} +1 -1
- package/dist/assets/tracing-panel-CxTR1RYC.js +2 -0
- package/dist/assets/{trash-2-CyqGun26.js → trash-2-B8SQYdQq.js} +1 -1
- package/dist/assets/{trash-DMqDgJ5r.js → trash-Cv0yH8fs.js} +1 -1
- package/dist/assets/{tree-DHpFOpHo.js → tree-B8r7cwRm.js} +1 -1
- package/dist/assets/{triangle-alert-B65rDESJ.js → triangle-alert-U93NZYDl.js} +1 -1
- package/dist/assets/{types-CS34eOZi.js → types-C1UhS3qM.js} +1 -1
- package/dist/assets/{types-CW-zyy80.js → types-D-xsoOE8.js} +1 -1
- package/dist/assets/{use-toast-rmUWldD_.js → use-toast-T0_cQDma.js} +1 -1
- package/dist/assets/useAddCell-Bc2_jloT.js +1 -0
- package/dist/assets/{useAsyncData-BAVCkkQP.js → useAsyncData-BMGLSTg8.js} +1 -1
- package/dist/assets/{useBoolean-BjVFTMam.js → useBoolean-IZsSX_XF.js} +1 -1
- package/dist/assets/{useCellActionButton-BZ46_Pdt.js → useCellActionButton-DUpWwYW8.js} +1 -1
- package/dist/assets/{useDateFormatter-D89e9xZY.js → useDateFormatter-CieT0-H-.js} +1 -1
- package/dist/assets/{useDebounce-CU_caGaU.js → useDebounce-B28kFfrM.js} +1 -1
- package/dist/assets/{useDeepCompareMemoize-DiyglPgJ.js → useDeepCompareMemoize-ChxLMT9E.js} +1 -1
- package/dist/assets/{useDeleteCell-B8CxYiji.js → useDeleteCell-6jBNYEDG.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-YtWR0xDK.js → useDependencyPanelTab-Dq7NTXk8.js} +1 -1
- package/dist/assets/useEvent-BhXAndur.js +1 -0
- package/dist/assets/{useEventListener-DIUKKfEy.js → useEventListener-Cb-RVVEn.js} +1 -1
- package/dist/assets/{useIframeCapabilities-DzIlROXe.js → useIframeCapabilities-B_pQb20b.js} +1 -1
- package/dist/assets/{useInstallPackage-C-gjrVjb.js → useInstallPackage-xrG_Tm9T.js} +1 -1
- package/dist/assets/{useInterval-y9MtYlSD.js → useInterval-BNfubus2.js} +1 -1
- package/dist/assets/{useLifecycle-D35CBukS.js → useLifecycle-ClI_npeg.js} +1 -1
- package/dist/assets/{useNonce-_Aax6sXd.js → useNonce-CS26E0hA.js} +1 -1
- package/dist/assets/{useNotebookActions-Dfh_7NPm.js → useNotebookActions-DRVyh52j.js} +1 -1
- package/dist/assets/{useNumberFormatter-CTkflual.js → useNumberFormatter-BX4DTYtT.js} +1 -1
- package/dist/assets/{usePress-CoEeT5jq.js → usePress-3CRs0fQg.js} +1 -1
- package/dist/assets/{useRunCells-rjrIgU8v.js → useRunCells-CmbQTUeO.js} +1 -1
- package/dist/assets/{useSplitCell-fcjSuBNO.js → useSplitCell-DE71CDKv.js} +1 -1
- package/dist/assets/{useTheme-EGf2UOFo.js → useTheme-CTORu22_.js} +1 -1
- package/dist/assets/{utilities.esm-CkqwfzLw.js → utilities.esm-8Diy8be3.js} +3 -3
- package/dist/assets/{utils-DXvhzCGS.js → utils-YqBXNpsM.js} +1 -1
- package/dist/assets/{vega-component-DAJbxD47.js → vega-component-D4ZTpyiq.js} +1 -1
- package/dist/assets/{worker-CUL1lW-N.js → worker-CyCdlLVf.js} +3 -3
- package/dist/assets/{workflow-CMjI9cxl.js → workflow-B12dAR4X.js} +1 -1
- package/dist/assets/{write-secret-modal-CgAvgY9w.js → write-secret-modal-BodBOJkR.js} +1 -1
- package/dist/assets/{x-CoXDX2vQ.js → x-ZP5cObgf.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CAHFvN1H.js → xychartDiagram-PRI3JC2R-C8jV7uCC.js} +1 -1
- package/dist/assets/{youtube-8p26v8EM.js → youtube--tNPNRy6.js} +1 -1
- package/dist/assets/zod-H_cgTO0M.js +40 -0
- package/dist/index.html +126 -126
- package/package.json +17 -17
- package/src/components/data-table/__tests__/data-table.test.tsx +94 -2
- package/src/core/MarimoApp.tsx +12 -8
- package/src/core/islands/__tests__/bridge.test.ts +241 -0
- package/src/core/islands/bridge.ts +22 -6
- package/src/core/run-app.tsx +11 -4
- package/src/plugins/core/registerReactComponent.tsx +9 -1
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +164 -0
- package/src/utils/__tests__/mime-types.test.ts +8 -10
- package/src/utils/mime-types.ts +5 -5
- package/dist/assets/__vite-browser-external-BkzFKOxE.js +0 -1
- package/dist/assets/__vite-browser-external-CPyDqUtZ.js +0 -1
- package/dist/assets/channel-ownMsSXG.js +0 -1
- package/dist/assets/check-DdfN0k2d.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-CSgD2v8F.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-YTETTIT0.js +0 -1
- package/dist/assets/compiler-runtime-DeeZ7FnK.js +0 -1
- package/dist/assets/createLucideIcon-CnW3RofX.js +0 -1
- package/dist/assets/globals-D4t_HyAp.js +0 -1
- package/dist/assets/katex-BZrXWsTs.js +0 -1
- package/dist/assets/kiosk-mode-C9XznhoS.js +0 -1
- package/dist/assets/loro_wasm_bg-DV7Kb4_M.wasm +0 -0
- package/dist/assets/mermaid-4DMBBIKO-RE7Z6-fl.js +0 -1
- package/dist/assets/request-registry-CjZcQuTP.js +0 -1
- package/dist/assets/requests-BSPGoGJL.js +0 -1
- package/dist/assets/run-page-BmTC7uxn.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-SWMI9LKY.js +0 -1
- package/dist/assets/tracing-panel-DogOVTzf.js +0 -2
- package/dist/assets/useAddCell-mkD8zurm.js +0 -1
- package/dist/assets/useEvent-DO6uJBas.js +0 -1
- package/dist/assets/zod-Cg4WLWh2.js +0 -40
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
// Mock browser APIs before any imports
|
|
5
|
+
vi.stubGlobal(
|
|
6
|
+
"Worker",
|
|
7
|
+
vi.fn(() => ({
|
|
8
|
+
addEventListener: vi.fn(),
|
|
9
|
+
postMessage: vi.fn(),
|
|
10
|
+
terminate: vi.fn(),
|
|
11
|
+
})),
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
// Create a mock URL class that works as a constructor
|
|
15
|
+
class MockURL {
|
|
16
|
+
href: string;
|
|
17
|
+
constructor(url: string, base?: string | URL) {
|
|
18
|
+
this.href = base ? `${base}/${url}` : url;
|
|
19
|
+
}
|
|
20
|
+
static createObjectURL = vi.fn(() => "blob:mock-url");
|
|
21
|
+
static revokeObjectURL = vi.fn();
|
|
22
|
+
}
|
|
23
|
+
vi.stubGlobal("URL", MockURL);
|
|
24
|
+
|
|
25
|
+
// Mock the worker RPC before importing the bridge
|
|
26
|
+
const mockBridge = vi.fn();
|
|
27
|
+
const mockLoadPackages = vi.fn();
|
|
28
|
+
|
|
29
|
+
vi.mock("@/core/wasm/rpc", () => ({
|
|
30
|
+
getWorkerRPC: () => ({
|
|
31
|
+
proxy: {
|
|
32
|
+
request: {
|
|
33
|
+
bridge: mockBridge,
|
|
34
|
+
loadPackages: mockLoadPackages,
|
|
35
|
+
startSession: vi.fn(),
|
|
36
|
+
},
|
|
37
|
+
send: {
|
|
38
|
+
consumerReady: vi.fn(),
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
addMessageListener: vi.fn(),
|
|
42
|
+
}),
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
// Mock the parse module to avoid DOM dependencies
|
|
46
|
+
vi.mock("../parse", () => ({
|
|
47
|
+
parseMarimoIslandApps: () => [],
|
|
48
|
+
createMarimoFile: vi.fn(),
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
// Mock uuid to have predictable tokens
|
|
52
|
+
vi.mock("@/utils/uuid", () => ({
|
|
53
|
+
generateUUID: () => "test-uuid-12345",
|
|
54
|
+
}));
|
|
55
|
+
|
|
56
|
+
// Mock getMarimoVersion
|
|
57
|
+
vi.mock("@/core/meta/globals", () => ({
|
|
58
|
+
getMarimoVersion: () => "0.0.0-test",
|
|
59
|
+
}));
|
|
60
|
+
|
|
61
|
+
// Mock the jotai store
|
|
62
|
+
vi.mock("@/core/state/jotai", () => ({
|
|
63
|
+
store: {
|
|
64
|
+
set: vi.fn(),
|
|
65
|
+
},
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
// Now import the bridge class
|
|
69
|
+
import { IslandsPyodideBridge } from "../bridge";
|
|
70
|
+
|
|
71
|
+
describe("IslandsPyodideBridge", () => {
|
|
72
|
+
let bridge: IslandsPyodideBridge;
|
|
73
|
+
|
|
74
|
+
beforeEach(() => {
|
|
75
|
+
vi.clearAllMocks();
|
|
76
|
+
// Reset the singleton by clearing the window property
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
delete (window as any)._marimo_private_IslandsPyodideBridge;
|
|
79
|
+
// Access the singleton - creates a fresh instance
|
|
80
|
+
bridge = IslandsPyodideBridge.INSTANCE;
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
// Clean up singleton
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
delete (window as any)._marimo_private_IslandsPyodideBridge;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe("sendComponentValues", () => {
|
|
90
|
+
it("should include type field and token in control request", async () => {
|
|
91
|
+
const request = {
|
|
92
|
+
objectIds: ["Hbol-0"],
|
|
93
|
+
values: [58],
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
await bridge.sendComponentValues(request);
|
|
97
|
+
|
|
98
|
+
expect(mockBridge).toHaveBeenCalledWith({
|
|
99
|
+
functionName: "put_control_request",
|
|
100
|
+
payload: {
|
|
101
|
+
type: "update-ui-element",
|
|
102
|
+
objectIds: ["Hbol-0"],
|
|
103
|
+
values: [58],
|
|
104
|
+
token: "test-uuid-12345",
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("should preserve all request properties", async () => {
|
|
110
|
+
const request = {
|
|
111
|
+
objectIds: ["slider-1", "slider-2"],
|
|
112
|
+
values: [10, 20],
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
await bridge.sendComponentValues(request);
|
|
116
|
+
|
|
117
|
+
expect(mockBridge).toHaveBeenCalledWith({
|
|
118
|
+
functionName: "put_control_request",
|
|
119
|
+
payload: expect.objectContaining({
|
|
120
|
+
type: "update-ui-element",
|
|
121
|
+
objectIds: ["slider-1", "slider-2"],
|
|
122
|
+
values: [10, 20],
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe("sendFunctionRequest", () => {
|
|
129
|
+
it("should include type field in control request", async () => {
|
|
130
|
+
const request = {
|
|
131
|
+
functionCallId: "call-123",
|
|
132
|
+
namespace: "test_namespace",
|
|
133
|
+
functionName: "my_function",
|
|
134
|
+
args: { x: 1, y: 2 },
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
await bridge.sendFunctionRequest(request);
|
|
138
|
+
|
|
139
|
+
expect(mockBridge).toHaveBeenCalledWith({
|
|
140
|
+
functionName: "put_control_request",
|
|
141
|
+
payload: {
|
|
142
|
+
type: "invoke-function",
|
|
143
|
+
functionCallId: "call-123",
|
|
144
|
+
namespace: "test_namespace",
|
|
145
|
+
functionName: "my_function",
|
|
146
|
+
args: { x: 1, y: 2 },
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe("sendRun", () => {
|
|
153
|
+
it("should include type field in control request", async () => {
|
|
154
|
+
const request = {
|
|
155
|
+
cellIds: ["cell-1", "cell-2"],
|
|
156
|
+
codes: ["print('hello')", "print('world')"],
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
await bridge.sendRun(request);
|
|
160
|
+
|
|
161
|
+
expect(mockBridge).toHaveBeenCalledWith({
|
|
162
|
+
functionName: "put_control_request",
|
|
163
|
+
payload: {
|
|
164
|
+
type: "execute-cells",
|
|
165
|
+
cellIds: ["cell-1", "cell-2"],
|
|
166
|
+
codes: ["print('hello')", "print('world')"],
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("should call loadPackages before putControlRequest", async () => {
|
|
172
|
+
const request = {
|
|
173
|
+
cellIds: ["cell-1"],
|
|
174
|
+
codes: ["import pandas"],
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
await bridge.sendRun(request);
|
|
178
|
+
|
|
179
|
+
// Verify loadPackages was called with joined codes
|
|
180
|
+
expect(mockLoadPackages).toHaveBeenCalledWith("import pandas");
|
|
181
|
+
|
|
182
|
+
// Verify order: loadPackages should be called before bridge
|
|
183
|
+
const loadPackagesCallOrder =
|
|
184
|
+
mockLoadPackages.mock.invocationCallOrder[0];
|
|
185
|
+
const bridgeCallOrder = mockBridge.mock.invocationCallOrder[0];
|
|
186
|
+
expect(loadPackagesCallOrder).toBeLessThan(bridgeCallOrder);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe("sendModelValue", () => {
|
|
191
|
+
it("should include type field in control request", async () => {
|
|
192
|
+
const request = {
|
|
193
|
+
modelId: "widget-1",
|
|
194
|
+
message: {
|
|
195
|
+
state: { value: 42 },
|
|
196
|
+
bufferPaths: [],
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
await bridge.sendModelValue(request);
|
|
201
|
+
|
|
202
|
+
expect(mockBridge).toHaveBeenCalledWith({
|
|
203
|
+
functionName: "put_control_request",
|
|
204
|
+
payload: {
|
|
205
|
+
type: "update-widget-model",
|
|
206
|
+
modelId: "widget-1",
|
|
207
|
+
message: {
|
|
208
|
+
state: { value: 42 },
|
|
209
|
+
bufferPaths: [],
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe("control request message format", () => {
|
|
217
|
+
it("should always include the type field required by msgspec", async () => {
|
|
218
|
+
// Test all methods to ensure they include the type field
|
|
219
|
+
await bridge.sendComponentValues({ objectIds: [], values: [] });
|
|
220
|
+
await bridge.sendFunctionRequest({
|
|
221
|
+
functionCallId: "",
|
|
222
|
+
namespace: "",
|
|
223
|
+
functionName: "",
|
|
224
|
+
args: {},
|
|
225
|
+
});
|
|
226
|
+
await bridge.sendRun({ cellIds: [], codes: [] });
|
|
227
|
+
await bridge.sendModelValue({
|
|
228
|
+
modelId: "",
|
|
229
|
+
message: { state: {}, bufferPaths: [] },
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
// All calls should have the type field
|
|
233
|
+
const allCalls = mockBridge.mock.calls;
|
|
234
|
+
for (const call of allCalls) {
|
|
235
|
+
const payload = call[0].payload;
|
|
236
|
+
expect(payload).toHaveProperty("type");
|
|
237
|
+
expect(typeof payload.type).toBe("string");
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|
|
@@ -6,7 +6,8 @@ import { Deferred } from "@/utils/Deferred";
|
|
|
6
6
|
import { throwNotImplemented } from "@/utils/functions";
|
|
7
7
|
import type { JsonString } from "@/utils/json/base64";
|
|
8
8
|
import { Logger } from "@/utils/Logger";
|
|
9
|
-
import
|
|
9
|
+
import { generateUUID } from "@/utils/uuid";
|
|
10
|
+
import type { CommandMessage, NotificationPayload } from "../kernel/messages";
|
|
10
11
|
import { getMarimoVersion } from "../meta/globals";
|
|
11
12
|
import type { EditRequests, RunRequests } from "../network/types";
|
|
12
13
|
import { store } from "../state/jotai";
|
|
@@ -104,7 +105,11 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
|
|
|
104
105
|
sendComponentValues: RunRequests["sendComponentValues"] = async (
|
|
105
106
|
request,
|
|
106
107
|
): Promise<null> => {
|
|
107
|
-
await this.putControlRequest(
|
|
108
|
+
await this.putControlRequest({
|
|
109
|
+
type: "update-ui-element",
|
|
110
|
+
...request,
|
|
111
|
+
token: generateUUID(),
|
|
112
|
+
});
|
|
108
113
|
return null;
|
|
109
114
|
};
|
|
110
115
|
|
|
@@ -117,18 +122,27 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
|
|
|
117
122
|
sendFunctionRequest: RunRequests["sendFunctionRequest"] = async (
|
|
118
123
|
request,
|
|
119
124
|
): Promise<null> => {
|
|
120
|
-
await this.putControlRequest(
|
|
125
|
+
await this.putControlRequest({
|
|
126
|
+
type: "invoke-function",
|
|
127
|
+
...request,
|
|
128
|
+
});
|
|
121
129
|
return null;
|
|
122
130
|
};
|
|
123
131
|
|
|
124
132
|
sendRun: EditRequests["sendRun"] = async (request): Promise<null> => {
|
|
125
133
|
await this.rpc.proxy.request.loadPackages(request.codes.join("\n"));
|
|
126
|
-
await this.putControlRequest(
|
|
134
|
+
await this.putControlRequest({
|
|
135
|
+
type: "execute-cells",
|
|
136
|
+
...request,
|
|
137
|
+
});
|
|
127
138
|
return null;
|
|
128
139
|
};
|
|
129
140
|
|
|
130
141
|
sendModelValue: RunRequests["sendModelValue"] = async (request) => {
|
|
131
|
-
await this.putControlRequest(
|
|
142
|
+
await this.putControlRequest({
|
|
143
|
+
type: "update-widget-model",
|
|
144
|
+
...request,
|
|
145
|
+
});
|
|
132
146
|
return null;
|
|
133
147
|
};
|
|
134
148
|
|
|
@@ -187,7 +201,9 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
|
|
|
187
201
|
clearCache = throwNotImplemented;
|
|
188
202
|
getCacheInfo = throwNotImplemented;
|
|
189
203
|
|
|
190
|
-
|
|
204
|
+
// The kernel uses msgspec to parse control requests, which requires a 'type'
|
|
205
|
+
// field for discriminated union deserialization.
|
|
206
|
+
private async putControlRequest(operation: CommandMessage) {
|
|
191
207
|
await this.rpc.proxy.request.bridge({
|
|
192
208
|
functionName: "put_control_request",
|
|
193
209
|
payload: operation,
|
package/src/core/run-app.tsx
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { useAtomValue } from "jotai";
|
|
4
|
+
import { ArrowLeftIcon } from "lucide-react";
|
|
4
5
|
import { useEffect } from "react";
|
|
5
6
|
import { AppContainer } from "@/components/editor/app-container";
|
|
6
7
|
import { AppHeader } from "@/components/editor/header/app-header";
|
|
7
8
|
import { Spinner } from "@/components/icons/spinner";
|
|
9
|
+
import { buttonVariants } from "@/components/ui/button";
|
|
8
10
|
import { DelayMount } from "@/components/utils/delay-mount";
|
|
11
|
+
import { cn } from "@/utils/cn";
|
|
9
12
|
import { CellsRenderer } from "../components/editor/renderers/cells-renderer";
|
|
10
13
|
import { notebookIsRunningAtom, useCellActions } from "./cells/cells";
|
|
11
14
|
import type { AppConfig } from "./config/config-schema";
|
|
@@ -75,15 +78,19 @@ export const RunApp: React.FC<AppProps> = ({ appConfig }) => {
|
|
|
75
78
|
isRunning={isRunning}
|
|
76
79
|
width={appConfig.width}
|
|
77
80
|
>
|
|
78
|
-
<AppHeader connection={connection} className=
|
|
81
|
+
<AppHeader connection={connection} className="sm:pt-8">
|
|
79
82
|
{galleryHref && (
|
|
80
|
-
<div className="flex items-center px-6 pt-4">
|
|
83
|
+
<div className="flex items-center px-6 pt-4 sm:-mt-8">
|
|
81
84
|
<a
|
|
82
85
|
href={galleryHref}
|
|
83
86
|
aria-label="Back to gallery"
|
|
84
|
-
className=
|
|
87
|
+
className={cn(
|
|
88
|
+
buttonVariants({ variant: "text", size: "sm" }),
|
|
89
|
+
"gap-2 px-0 text-muted-foreground hover:text-foreground",
|
|
90
|
+
)}
|
|
85
91
|
>
|
|
86
|
-
<
|
|
92
|
+
<ArrowLeftIcon className="size-4" aria-hidden={true} />
|
|
93
|
+
<span>Back</span>
|
|
87
94
|
</a>
|
|
88
95
|
</div>
|
|
89
96
|
)}
|
|
@@ -101,10 +101,17 @@ function PluginSlotInternal<T>(
|
|
|
101
101
|
return plugin.validator.safeParse(parseDataset(hostElement));
|
|
102
102
|
});
|
|
103
103
|
|
|
104
|
+
// Incremented on each reset to invalidate memoized function references.
|
|
105
|
+
// This ensures that plugin functions (e.g., search) are re-created when
|
|
106
|
+
// the underlying UI element instance changes (new object-id), even if
|
|
107
|
+
// the element's data attributes haven't changed.
|
|
108
|
+
const [resetNonce, setResetNonce] = useState(0);
|
|
109
|
+
|
|
104
110
|
useImperativeHandle(ref, () => ({
|
|
105
111
|
reset: () => {
|
|
106
112
|
setValue(getInitialValue());
|
|
107
113
|
setParsedResult(plugin.validator.safeParse(parseDataset(hostElement)));
|
|
114
|
+
setResetNonce((n) => n + 1);
|
|
108
115
|
},
|
|
109
116
|
setChildren: (children) => {
|
|
110
117
|
setChildNodes(children);
|
|
@@ -224,7 +231,8 @@ function PluginSlotInternal<T>(
|
|
|
224
231
|
}
|
|
225
232
|
|
|
226
233
|
return methods;
|
|
227
|
-
|
|
234
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
235
|
+
}, [plugin.functions, hostElement, resetNonce]);
|
|
228
236
|
|
|
229
237
|
// If we failed to parse the initial value, render an error
|
|
230
238
|
if (!parsedResult.success) {
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { TooltipProvider } from "@radix-ui/react-tooltip";
|
|
4
|
+
import { act, render, screen, waitFor } from "@testing-library/react";
|
|
5
|
+
import { Provider } from "jotai";
|
|
6
|
+
import { beforeAll, describe, expect, it, vi } from "vitest";
|
|
7
|
+
import type { DownloadAsArgs } from "@/components/data-table/schemas";
|
|
8
|
+
import type { FieldTypesWithExternalType } from "@/components/data-table/types";
|
|
9
|
+
import { store } from "@/core/state/jotai";
|
|
10
|
+
import {
|
|
11
|
+
type GetDataUrl,
|
|
12
|
+
type GetRowIds,
|
|
13
|
+
LoadingDataTableComponent,
|
|
14
|
+
} from "../DataTablePlugin";
|
|
15
|
+
|
|
16
|
+
beforeAll(() => {
|
|
17
|
+
global.ResizeObserver = class ResizeObserver {
|
|
18
|
+
observe() {
|
|
19
|
+
// do nothing
|
|
20
|
+
}
|
|
21
|
+
unobserve() {
|
|
22
|
+
// do nothing
|
|
23
|
+
}
|
|
24
|
+
disconnect() {
|
|
25
|
+
// do nothing
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe("LoadingDataTableComponent", () => {
|
|
31
|
+
/**
|
|
32
|
+
* Regression test for https://github.com/marimo-team/marimo/issues/8023
|
|
33
|
+
*
|
|
34
|
+
* When a table is replaced via mo.output.replace() with updated data,
|
|
35
|
+
* but the initial page data (unsorted first page) hasn't changed,
|
|
36
|
+
* the useAsyncData hook's deps may all remain the same.
|
|
37
|
+
* Previously, the `search` function reference was memoized on
|
|
38
|
+
* [plugin.functions, hostElement] and wouldn't change on reset(),
|
|
39
|
+
* so the useAsyncData effect wouldn't re-fire.
|
|
40
|
+
*
|
|
41
|
+
* The fix adds a resetNonce to the functionMethods memo deps,
|
|
42
|
+
* so when the plugin is reset (table instance changes), the search
|
|
43
|
+
* function reference changes, triggering useAsyncData to re-fetch.
|
|
44
|
+
*
|
|
45
|
+
* This test verifies that when the search function reference changes
|
|
46
|
+
* (simulating reset()), the component re-fetches data even if
|
|
47
|
+
* props.data hasn't changed.
|
|
48
|
+
*/
|
|
49
|
+
it("should refetch data when search function reference changes", async () => {
|
|
50
|
+
const host = document.createElement("div");
|
|
51
|
+
const setValue = vi.fn();
|
|
52
|
+
|
|
53
|
+
// The initial page data string - identical for both renders.
|
|
54
|
+
// This simulates the case where only a row on page 2 changed,
|
|
55
|
+
// so the first page data is the same.
|
|
56
|
+
const initialPageData = JSON.stringify([
|
|
57
|
+
{ id: 1, status: "pending", value: 10 },
|
|
58
|
+
{ id: 2, status: "pending", value: 20 },
|
|
59
|
+
{ id: 3, status: "pending", value: 30 },
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
const searchResult = {
|
|
63
|
+
data: [
|
|
64
|
+
{ id: 1, status: "pending", value: 10 },
|
|
65
|
+
{ id: 2, status: "pending", value: 20 },
|
|
66
|
+
{ id: 3, status: "pending", value: 30 },
|
|
67
|
+
],
|
|
68
|
+
total_rows: 4,
|
|
69
|
+
cell_styles: null,
|
|
70
|
+
cell_hover_texts: null,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const searchFn1 = vi.fn().mockResolvedValue(searchResult);
|
|
74
|
+
const searchFn2 = vi.fn().mockResolvedValue(searchResult);
|
|
75
|
+
|
|
76
|
+
const fieldTypes: FieldTypesWithExternalType = [
|
|
77
|
+
["id", ["integer", "integer"]],
|
|
78
|
+
["status", ["string", "string"]],
|
|
79
|
+
["value", ["integer", "integer"]],
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
const commonProps = {
|
|
83
|
+
label: null,
|
|
84
|
+
totalRows: 4,
|
|
85
|
+
pagination: true,
|
|
86
|
+
pageSize: 3,
|
|
87
|
+
selection: "single" as const,
|
|
88
|
+
showDownload: false,
|
|
89
|
+
showFilters: false,
|
|
90
|
+
showColumnSummaries: false as const,
|
|
91
|
+
showDataTypes: false,
|
|
92
|
+
showPageSizeSelector: false,
|
|
93
|
+
showColumnExplorer: false,
|
|
94
|
+
showRowExplorer: false,
|
|
95
|
+
showChartBuilder: false,
|
|
96
|
+
rowHeaders: [] as FieldTypesWithExternalType,
|
|
97
|
+
fieldTypes,
|
|
98
|
+
totalColumns: 3,
|
|
99
|
+
maxColumns: "all" as const,
|
|
100
|
+
hasStableRowId: false,
|
|
101
|
+
lazy: false,
|
|
102
|
+
host,
|
|
103
|
+
enableSearch: true,
|
|
104
|
+
value: [] as (number | string | { rowId: string; columnName?: string })[],
|
|
105
|
+
setValue,
|
|
106
|
+
download_as: vi.fn() as DownloadAsArgs,
|
|
107
|
+
get_column_summaries: vi.fn().mockResolvedValue({
|
|
108
|
+
data: null,
|
|
109
|
+
stats: {},
|
|
110
|
+
bin_values: {},
|
|
111
|
+
value_counts: {},
|
|
112
|
+
show_charts: false,
|
|
113
|
+
}),
|
|
114
|
+
get_data_url: vi.fn() as GetDataUrl,
|
|
115
|
+
get_row_ids: vi.fn() as GetRowIds,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
119
|
+
<Provider store={store}>
|
|
120
|
+
<TooltipProvider>{children}</TooltipProvider>
|
|
121
|
+
</Provider>
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// Render with first search function
|
|
125
|
+
const { rerender } = render(
|
|
126
|
+
<Wrapper>
|
|
127
|
+
<LoadingDataTableComponent
|
|
128
|
+
{...commonProps}
|
|
129
|
+
data={initialPageData}
|
|
130
|
+
search={searchFn1}
|
|
131
|
+
/>
|
|
132
|
+
</Wrapper>,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Wait for the table to render with data
|
|
136
|
+
await waitFor(() => {
|
|
137
|
+
expect(screen.getAllByRole("row").length).toBeGreaterThan(1);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// Search was called on initial load (fire-and-forget for canShowInitialPage)
|
|
141
|
+
expect(searchFn1).toHaveBeenCalled();
|
|
142
|
+
|
|
143
|
+
// Now rerender with the same data but a NEW search function reference.
|
|
144
|
+
// This simulates what happens after reset() when resetNonce increments
|
|
145
|
+
// and functionMethods is recreated.
|
|
146
|
+
await act(async () => {
|
|
147
|
+
rerender(
|
|
148
|
+
<Wrapper>
|
|
149
|
+
<LoadingDataTableComponent
|
|
150
|
+
{...commonProps}
|
|
151
|
+
data={initialPageData}
|
|
152
|
+
search={searchFn2}
|
|
153
|
+
/>
|
|
154
|
+
</Wrapper>,
|
|
155
|
+
);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// The new search function should be called because the search
|
|
159
|
+
// dependency changed in useAsyncData.
|
|
160
|
+
await waitFor(() => {
|
|
161
|
+
expect(searchFn2).toHaveBeenCalled();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -132,7 +132,7 @@ describe("mime-types", () => {
|
|
|
132
132
|
|
|
133
133
|
describe("sortByPrecedence", () => {
|
|
134
134
|
it("should sort entries by precedence order", () => {
|
|
135
|
-
const entries:
|
|
135
|
+
const entries: [MimeType, string][] = [
|
|
136
136
|
["text/plain", "plain"],
|
|
137
137
|
["text/html", "html"],
|
|
138
138
|
["image/png", "png"],
|
|
@@ -151,7 +151,7 @@ describe("mime-types", () => {
|
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
it("should place unknown mime types at the end", () => {
|
|
154
|
-
const entries:
|
|
154
|
+
const entries: [MimeType, string][] = [
|
|
155
155
|
["text/plain", "plain"],
|
|
156
156
|
["text/html", "html"],
|
|
157
157
|
["application/json", "json"],
|
|
@@ -173,7 +173,7 @@ describe("mime-types", () => {
|
|
|
173
173
|
});
|
|
174
174
|
|
|
175
175
|
it("should handle empty precedence", () => {
|
|
176
|
-
const entries:
|
|
176
|
+
const entries: [MimeType, string][] = [
|
|
177
177
|
["text/plain", "plain"],
|
|
178
178
|
["text/html", "html"],
|
|
179
179
|
];
|
|
@@ -184,7 +184,7 @@ describe("mime-types", () => {
|
|
|
184
184
|
});
|
|
185
185
|
|
|
186
186
|
it("should not mutate original array", () => {
|
|
187
|
-
const entries:
|
|
187
|
+
const entries: [MimeType, string][] = [
|
|
188
188
|
["text/plain", "plain"],
|
|
189
189
|
["text/html", "html"],
|
|
190
190
|
];
|
|
@@ -198,7 +198,7 @@ describe("mime-types", () => {
|
|
|
198
198
|
|
|
199
199
|
describe("processMimeBundle", () => {
|
|
200
200
|
it("should filter and sort mime entries", () => {
|
|
201
|
-
const entries:
|
|
201
|
+
const entries: [MimeType, string][] = [
|
|
202
202
|
["text/plain", "plain"],
|
|
203
203
|
["text/html", "html"],
|
|
204
204
|
["image/png", "png"],
|
|
@@ -226,7 +226,7 @@ describe("mime-types", () => {
|
|
|
226
226
|
});
|
|
227
227
|
|
|
228
228
|
it("should use default config when not provided", () => {
|
|
229
|
-
const entries:
|
|
229
|
+
const entries: [MimeType, string][] = [
|
|
230
230
|
["text/html", "html"],
|
|
231
231
|
["image/png", "png"],
|
|
232
232
|
["text/markdown", "md"],
|
|
@@ -240,9 +240,7 @@ describe("mime-types", () => {
|
|
|
240
240
|
|
|
241
241
|
it("should preserve data associated with mime types", () => {
|
|
242
242
|
const htmlData = { content: "<h1>Hello</h1>" };
|
|
243
|
-
const entries:
|
|
244
|
-
["text/html", htmlData],
|
|
245
|
-
];
|
|
243
|
+
const entries: [MimeType, typeof htmlData][] = [["text/html", htmlData]];
|
|
246
244
|
|
|
247
245
|
const result = processMimeBundle(entries);
|
|
248
246
|
|
|
@@ -250,7 +248,7 @@ describe("mime-types", () => {
|
|
|
250
248
|
});
|
|
251
249
|
|
|
252
250
|
it("should sort by precedence after filtering", () => {
|
|
253
|
-
const entries:
|
|
251
|
+
const entries: [MimeType, string][] = [
|
|
254
252
|
["text/plain", "plain"],
|
|
255
253
|
["text/markdown", "md"],
|
|
256
254
|
["text/html", "html"],
|
package/src/utils/mime-types.ts
CHANGED
|
@@ -26,7 +26,7 @@ export interface MimeTypeConfig {
|
|
|
26
26
|
*/
|
|
27
27
|
export interface ProcessedMimeTypes<T> {
|
|
28
28
|
/** The filtered and sorted mime entries */
|
|
29
|
-
entries:
|
|
29
|
+
entries: [MimeType, T][];
|
|
30
30
|
/** Mime types that were hidden by rules */
|
|
31
31
|
hidden: MimeType[];
|
|
32
32
|
}
|
|
@@ -146,9 +146,9 @@ export function applyHidingRules(
|
|
|
146
146
|
* Mime types not in the map are placed at the end, preserving their original order.
|
|
147
147
|
*/
|
|
148
148
|
export function sortByPrecedence<T>(
|
|
149
|
-
entries:
|
|
149
|
+
entries: [MimeType, T][],
|
|
150
150
|
precedence: ReadonlyMap<MimeType, number>,
|
|
151
|
-
):
|
|
151
|
+
): [MimeType, T][] {
|
|
152
152
|
const unknownPrecedence = precedence.size;
|
|
153
153
|
|
|
154
154
|
return [...entries].sort((a, b) => {
|
|
@@ -162,7 +162,7 @@ export function sortByPrecedence<T>(
|
|
|
162
162
|
* Main entry point: processes mime entries by applying hiding rules and sorting.
|
|
163
163
|
*/
|
|
164
164
|
export function processMimeBundle<T>(
|
|
165
|
-
entries:
|
|
165
|
+
entries: [MimeType, T][],
|
|
166
166
|
config: MimeTypeConfig = getDefaultMimeConfig(),
|
|
167
167
|
): ProcessedMimeTypes<T> {
|
|
168
168
|
if (entries.length === 0) {
|
|
@@ -176,6 +176,6 @@ export function processMimeBundle<T>(
|
|
|
176
176
|
|
|
177
177
|
return {
|
|
178
178
|
entries: sortedEntries,
|
|
179
|
-
hidden:
|
|
179
|
+
hidden: [...hidden],
|
|
180
180
|
};
|
|
181
181
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./worker-CUL1lW-N.js";var t=e(((e,t)=>{t.exports={}}));export default t();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./save-worker-DtF6B3PS.js";var t=e(((e,t)=>{t.exports={}}));export default t();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{et as r,tt as e}from"./chunk-ABZYJK2D-Coo5qi7b.js";var o=(t,a)=>e.lang.round(r.parse(t)[a]);export{o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t}from"./createLucideIcon-CnW3RofX.js";var e=t("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);export{e as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./purify.es-DZrAQFIu.js";import"./src-DJ8ZKoFs.js";import"./chunk-S3R3BYOJ-PVCoxQeQ.js";import{n as t}from"./src-CmKhyEBC.js";import"./chunk-ABZYJK2D-Coo5qi7b.js";import"./chunk-HN2XXSSU-BBxJMYrA.js";import"./chunk-CVBHYZKI-Brsoob-W.js";import"./chunk-ATLVNIR6-C0ULYreM.js";import"./dist-DxxvVPQH.js";import"./chunk-JA3XYJ7Z-99Y1UR46.js";import"./chunk-JZLCHNYA-DRGkEV50.js";import"./chunk-QXUST7PY-_zxuSm7L.js";import"./chunk-N4CR4FBY-DHFG9ldR.js";import"./chunk-FMBD7UC4-kejklSRQ.js";import"./chunk-55IACEB6-NZRDKuqH.js";import"./chunk-QN33PNHL-DB8FgLRd.js";import{i,n as o,r as m,t as p}from"./chunk-B4BG7PRW-D6Q5lT5Z.js";var a={parser:o,get db(){return new p},renderer:m,styles:i,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{a as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./purify.es-DZrAQFIu.js";import"./src-DJ8ZKoFs.js";import"./chunk-S3R3BYOJ-PVCoxQeQ.js";import{n as t}from"./src-CmKhyEBC.js";import"./chunk-ABZYJK2D-Coo5qi7b.js";import"./chunk-HN2XXSSU-BBxJMYrA.js";import"./chunk-CVBHYZKI-Brsoob-W.js";import"./chunk-ATLVNIR6-C0ULYreM.js";import"./dist-DxxvVPQH.js";import"./chunk-JA3XYJ7Z-99Y1UR46.js";import"./chunk-JZLCHNYA-DRGkEV50.js";import"./chunk-QXUST7PY-_zxuSm7L.js";import"./chunk-N4CR4FBY-DHFG9ldR.js";import"./chunk-FMBD7UC4-kejklSRQ.js";import"./chunk-55IACEB6-NZRDKuqH.js";import"./chunk-QN33PNHL-DB8FgLRd.js";import{i,n as o,r as m,t as p}from"./chunk-B4BG7PRW-D6Q5lT5Z.js";var a={parser:o,get db(){return new p},renderer:m,styles:i,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{a as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t}from"./chunk-LvLJmgfZ.js";import{t as o}from"./react-BGmjiNul.js";var N=t((r=>{var _=o().__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;r.c=function(e){return _.H.useMemoCache(e)}})),E=t(((r,_)=>{_.exports=N()}));export{E as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as f}from"./chunk-LvLJmgfZ.js";import{t as p}from"./react-BGmjiNul.js";var w=r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),N=r=>r.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,o)=>o?o.toUpperCase():t.toLowerCase()),c=r=>{let e=N(r);return e.charAt(0).toUpperCase()+e.slice(1)},n=(...r)=>r.filter((e,t,o)=>!!e&&e.trim()!==""&&o.indexOf(e)===t).join(" ").trim(),k=r=>{for(let e in r)if(e.startsWith("aria-")||e==="role"||e==="title")return!0},g={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},a=f(p()),C=(0,a.forwardRef)(({color:r="currentColor",size:e=24,strokeWidth:t=2,absoluteStrokeWidth:o,className:s="",children:i,iconNode:d,...l},m)=>(0,a.createElement)("svg",{ref:m,...g,width:e,height:e,stroke:r,strokeWidth:o?Number(t)*24/Number(e):t,className:n("lucide",s),...!i&&!k(l)&&{"aria-hidden":"true"},...l},[...d.map(([h,u])=>(0,a.createElement)(h,u)),...Array.isArray(i)?i:[i]])),A=(r,e)=>{let t=(0,a.forwardRef)(({className:o,...s},i)=>(0,a.createElement)(C,{ref:i,iconNode:e,className:n(`lucide-${w(c(r))}`,`lucide-${r}`,o),...s}));return t.displayName=c(r),t};export{A as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as r}from"./useEvent-DO6uJBas.js";import{l as o}from"./switch-CfRu5JBF.js";const m=()=>r.get(o),n=()=>{let e=document.querySelector("marimo-code");if(!e)return;let t=e.innerHTML;return decodeURIComponent(t).trim()};export{m as n,n as t};
|