@marimo-team/frontend 0.21.2-dev5 → 0.21.2-dev52
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-CDSBsjjF.js → CellStatus-DX8MnBMk.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-Buaffg3u.js → ConnectedDataExplorerComponent-7yXYooWG.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-O6RDJKs0.js → DeferredRequestRegistry-B8jPCuU1.js} +1 -1
- package/dist/assets/{ImperativeModal-qEtcJ95s.js → ImperativeModal-C3CD5-Aq.js} +1 -1
- package/dist/assets/JsonOutput-DqjAyzM8.js +46 -0
- package/dist/assets/{LazyAnyLanguageCodeMirror-m8w66E4s.js → LazyAnyLanguageCodeMirror-CcCHIX38.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-az74f3Mp.js → MarimoErrorOutput-Dat_S09q.js} +5 -5
- package/dist/assets/RenderHTML-C7XM39M2.js +1 -0
- package/dist/assets/{add-cell-with-ai-DUn4LN4W.js → add-cell-with-ai-y2xroEGf.js} +9 -9
- package/dist/assets/{add-connection-dialog-CBz0AUVX.js → add-connection-dialog-QDBOmil3.js} +23 -23
- package/dist/assets/{agent-panel-u83dsDsM.js → agent-panel-DziFrEjJ.js} +6 -6
- package/dist/assets/ai-model-dropdown-CiJpv5wN.js +5 -0
- package/dist/assets/{alert-dialog-9WfvUF7e.js → alert-dialog-ebk_-wsU.js} +1 -1
- package/dist/assets/{any-language-editor-DwQMnAM3.js → any-language-editor-DZYnKlJB.js} +1 -1
- package/dist/assets/{app-config-button-rDu-lCIB.js → app-config-button-CpAv9Tiu.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-DfMHHFZ3.js → architectureDiagram-VXUJARFQ-DKmk99ac.js} +1 -1
- package/dist/assets/{azure-BTXHztTw.js → azure-Dw5gKmUz.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-CuEDwbg7.js → blockDiagram-VD42YOAC-TpAhP5OQ.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CD9uz7WG.js → c4Diagram-YG6GDRKO-Dg8hCyKf.js} +1 -1
- package/dist/assets/{cache-panel-qIxnndwr.js → cache-panel-D0OsHk_D.js} +1 -1
- package/dist/assets/cell-editor-RbAVpSFb.js +22 -0
- package/dist/assets/{cell-link-Q_UEP94Z.js → cell-link-CNgO3c-T.js} +1 -1
- package/dist/assets/{cells-fq1RMGX_.js → cells-39RE4UzS.js} +77 -76
- package/dist/assets/channel-D1wPYhc9.js +1 -0
- package/dist/assets/{chat-display-D_Fuuy6r.js → chat-display-BPUVrlA6.js} +1 -1
- package/dist/assets/{chat-panel-BO-JoQSp.js → chat-panel-esz5TfF-.js} +2 -2
- package/dist/assets/{chunk-5FQGJX7Z-CM1a_K7I.js → chunk-5FQGJX7Z-sGWxL7Ey.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-D_Wumzom.js → chunk-ABZYJK2D-DXJ7hnjx.js} +1 -1
- package/dist/assets/{chunk-ATLVNIR6-BZ0lTgIn.js → chunk-ATLVNIR6-CTEqcLEc.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-Dw1S6osV.js → chunk-B4BG7PRW-CkAIqtPf.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-Q63FTCPP.js → chunk-DI55MBZ5-C4F9vu8o.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-CfkJ_R7W.js → chunk-EXTU4WIE-BT0Py-4P.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-B41fGeoj.js → chunk-JA3XYJ7Z-CGd7jja_.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-D43EJxQw.js → chunk-JZLCHNYA-CqY-RYTj.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-DCtw0-ni.js → chunk-N4CR4FBY-aUDjVzN7.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-CLA2rsaS.js → chunk-QN33PNHL-DHnCb5-U.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-De1DpbnL.js → chunk-QXUST7PY-CRO5kYCE.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-qrwvlUdq.js → chunk-S3R3BYOJ-CSHQgcuP.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4KcThb0.js → chunk-TZMSLE5B-CE7o9asH.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BDIQSKYv.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-Cdh4cVOB.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-D4FF4cnN.js → code-block-37QAKDTI-DMpe1jNG.js} +1 -1
- package/dist/assets/{column-preview-WsubyItX.js → column-preview-BUKHsglA.js} +1 -1
- package/dist/assets/{command-rfxSsiHU.js → command-DmzEbs6L.js} +1 -1
- package/dist/assets/{command-palette-Bez4BqJF.js → command-palette-BX5gNpUr.js} +1 -1
- package/dist/assets/{common-BYwO983A.js → common-B4yshY-H.js} +1 -1
- package/dist/assets/{components-Ozq0825a.js → components-DCqJqyys.js} +1 -1
- package/dist/assets/{components-Bpgzv_5_.js → components-oKCjx6cN.js} +1 -1
- package/dist/assets/{config-3Aq84phF.js → config-DqxNMQDN.js} +1 -1
- package/dist/assets/{context-CIAP2NOh.js → context-CRmPPhx9.js} +1 -1
- package/dist/assets/{context-aware-panel-CfsfBlhO.js → context-aware-panel-DC0Te9Hj.js} +2 -2
- package/dist/assets/copy-KjcPgPw9.js +1 -0
- package/dist/assets/{copy-icon-BgmMM9Zg.js → copy-icon-P0kzz1Pr.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BhMnPhuU.js → dagre-6UL2VRFP-XqoNLMQ3.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-kbv73SQ7.js → data-grid-overlay-editor-Cus1-BFN.js} +1 -1
- package/dist/assets/{datasource-F9sJtuof.js → datasource-DKHG39NV.js} +2 -2
- package/dist/assets/{dates-CHaNfieI.js → dates-CTqMeMGY.js} +1 -1
- package/dist/assets/{dependency-graph-panel-AOBcX2tP.js → dependency-graph-panel-7GKT3dyD.js} +4 -4
- package/dist/assets/{diagram-PSM6KHXK-Cr2t4zul.js → diagram-PSM6KHXK-BuzKNNcN.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-DLU_hSO4.js → diagram-QEK2KX5R-A5LBQS11.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-C7EkNAO3.js → diagram-S2PKOQOG-dkJE8SA0.js} +1 -1
- package/dist/assets/{dialog-CVN1lcMF.js → dialog-1_jIyAb_.js} +1 -1
- package/dist/assets/{dist-DJBpXGro.js → dist-6P6vjf93.js} +1 -1
- package/dist/assets/dist-BWGxTsTP.js +1 -0
- package/dist/assets/{dist-CblX3KGI.js → dist-B_buFm3B.js} +1 -1
- package/dist/assets/{dist-CXLJUPFl.js → dist-BatEf-0f.js} +1 -1
- package/dist/assets/dist-C3AnARPE.js +1 -0
- package/dist/assets/{dist-BNC_tnlW.js → dist-C6ohaMKU.js} +1 -1
- package/dist/assets/{dist-BoDHthoc.js → dist-CO9Pg2Rc.js} +1 -1
- package/dist/assets/{dist-By6zhkxZ.js → dist-CSV6H5w_.js} +1 -1
- package/dist/assets/{dist-6FIAeDIu.js → dist-CYs1oP7g.js} +1 -1
- package/dist/assets/{dist-DbK_4_qo.js → dist-DD9ZJMK5.js} +1 -1
- package/dist/assets/{dist-DlTbNRBn.js → dist-DReDpc2z.js} +1 -1
- package/dist/assets/dist-DSlq5ZeQ.js +1 -0
- package/dist/assets/{dist-DrceDAhM.js → dist-DXyIIB32.js} +1 -1
- package/dist/assets/{dist-CcGcwrUD.js → dist-DkaderFA.js} +1 -1
- package/dist/assets/{dist-BiZQlfhr.js → dist-Dq3BlK4R.js} +1 -1
- package/dist/assets/{dist-ClzRAVN-.js → dist-Dxov2ltb.js} +1 -1
- package/dist/assets/{dist-BXXPfIam.js → dist-EtGG9C1A.js} +1 -1
- package/dist/assets/{dist-C3MmXcLA.js → dist-NjId5Gdz.js} +1 -1
- package/dist/assets/dist-ZM59OWYL.js +1 -0
- package/dist/assets/dist-_TwZ4tIe.js +1 -0
- package/dist/assets/dist-f9b2H4q_.js +1 -0
- package/dist/assets/{dist-mxGLXOFm.js → dist-feWVQ4dq.js} +1 -1
- package/dist/assets/{documentation-panel-D28MpqbI.js → documentation-panel-D5d_BbHV.js} +1 -1
- package/dist/assets/{download-B9_ToVd4.js → download-B1vXaivj.js} +4 -4
- package/dist/assets/{dropdown-menu-DdPu5Kfu.js → dropdown-menu-BehqiLFL.js} +1 -1
- package/dist/assets/{edit-page-otS-QvnC.js → edit-page-B5cAZdO7.js} +7 -7
- package/dist/assets/{en-US-BO8E69bZ.js → en-US-f8tajDx1.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-DqlEo_Us.js → erDiagram-Q2GNP2WA-CgH6udOW.js} +1 -1
- package/dist/assets/{error-banner-BRG6IPhC.js → error-banner-J5F3weEj.js} +1 -1
- package/dist/assets/{error-panel-RRoj_iOR.js → error-panel-DnhKJ5Ou.js} +1 -1
- package/dist/assets/{es-CzkousWe.js → es-DYI7U61K.js} +1 -1
- package/dist/assets/{esm-CBkHtTOV.js → esm-BC1J92im.js} +1 -1
- package/dist/assets/{esm-DhTsVMLM.js → esm-DKLLCu3N.js} +1 -1
- package/dist/assets/{field-B1jGbQlH.js → field-B08lvxnl.js} +1 -1
- package/dist/assets/file-explorer-panel-BUk69TND.js +26 -0
- package/dist/assets/{file-icons-CWLHDa1J.js → file-icons-3DTS8ZM7.js} +1 -1
- package/dist/assets/{floating-outline-BvQKiC0F.js → floating-outline-DmugATcB.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-CQlIJ12H.js → flowDiagram-NV44I4VS-D85BL4rA.js} +1 -1
- package/dist/assets/{focus-DYwTiH9-.js → focus-DlJH7sfh.js} +1 -1
- package/dist/assets/{form-CrQYrsUC.js → form-760_EqmF.js} +2 -2
- package/dist/assets/{formats-rhOJovGE.js → formats-wYuh1bqp.js} +1 -1
- package/dist/assets/{formatting-B4ZCH3ol.js → formatting-CraOPe94.js} +1 -1
- package/dist/assets/{gallery-page-eRea0yic.js → gallery-page--paiPvYX.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-B3EGIuZL.js → ganttDiagram-JELNMOA3-DzCOXWlF.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-h5SlguJK.js → gitGraphDiagram-V2S2FVAM-BUHURX6t.js} +1 -1
- package/dist/assets/{glide-data-editor-xt5xNZeV.js → glide-data-editor-DYdoQTO5.js} +4 -4
- package/dist/assets/{globals-BsV5fVR-.js → globals-7M5DRsIb.js} +1 -1
- package/dist/assets/home-page-CxQ1e98h.js +4 -0
- package/dist/assets/{hooks-CHx5dUUq.js → hooks-C3jEff2O.js} +1 -1
- package/dist/assets/html-to-image-DTFXm6_Z.js +2 -0
- package/dist/assets/{index-GjXovVsl.css → index-BmoocKR0.css} +1 -1
- package/dist/assets/index-DNchElHl.js +38 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-pzpClObZ.js → infoDiagram-HS3SLOUP-GG5r0Y5G.js} +1 -1
- package/dist/assets/{input-CUwqpKjd.js → input-CN1ZeRYm.js} +1 -1
- package/dist/assets/{isValid-BGe7pJXT.js → isValid-DY4Mgbr7.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-BrdRi92v.js → journeyDiagram-XKPGCS4Q-B1dvnV4D.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-B6WqgFqh.js → kanban-definition-3W4ZIXB7-CefbrXQv.js} +1 -1
- package/dist/assets/{kiosk-mode-DNjEnIWb.js → kiosk-mode-CyTnrzwK.js} +1 -1
- package/dist/assets/{layout-CwFtCyW8.js → layout-3b3tzmbb.js} +3 -3
- package/dist/assets/{linear-BP9rwmWK.js → linear-BDnrHGYO.js} +1 -1
- package/dist/assets/{links-CIQwYQ48.js → links-CptYD1FP.js} +1 -1
- package/dist/assets/{logs-panel-BU1tNEVc.js → logs-panel-C4k_2IHW.js} +1 -1
- package/dist/assets/{markdown-renderer-MR9df58W.js → markdown-renderer-DSy5IuAx.js} +1 -1
- package/dist/assets/{menu-items-UxKrm8hS.js → menu-items-BpHXKv51.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-g7AL4SLJ.js +1 -0
- package/dist/assets/{mermaid-Djr3jUAB.js → mermaid-C43VbdrM.js} +3 -3
- package/dist/assets/{mermaid-parser.core-DR82IMb2.js → mermaid-parser.core-CdM8D_p_.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-DAmJpbPM.js → mindmap-definition-VGOIOE7T-CcV7D-wF.js} +1 -1
- package/dist/assets/{mode-AcL8c6qH.js → mode-D-iRbN9x.js} +1 -1
- package/dist/assets/{multi-map-Pp1P2DOX.js → multi-map-C8RbwBrw.js} +1 -1
- package/dist/assets/{name-cell-input-DVFEv_aO.js → name-cell-input-Dyb0ZO4X.js} +1 -1
- package/dist/assets/{number-overlay-editor-D__AflXQ.js → number-overlay-editor-BBJO1mf8.js} +1 -1
- package/dist/assets/{outline-panel-CP0oIuiU.js → outline-panel-D7CJwO8u.js} +1 -1
- package/dist/assets/{packages-panel-CzRELimG.js → packages-panel-Bp1SYjgc.js} +1 -1
- package/dist/assets/{panels-wTweRyIv.js → panels-D0aw6jdc.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-DbGIFRoq.js → pieDiagram-ADFJNKIX-C1fBf15W.js} +1 -1
- package/dist/assets/{popover-BPGG2gPG.js → popover-Bvoif-Mg.js} +1 -1
- package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
- package/dist/assets/{process-output-CTVsT--B.js → process-output-BxPWHcIi.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-CLAtyple.js → quadrantDiagram-AYHSOK5B-RVooN-fX.js} +1 -1
- package/dist/assets/{react-vega-BZav_-2n.js → react-vega-BKRQSy0g.js} +1 -1
- package/dist/assets/react-vega-DXESF7qN.js +1 -0
- package/dist/assets/{readonly-python-code-DH-1xZGq.js → readonly-python-code-D95oshJa.js} +1 -1
- package/dist/assets/{renderShortcut-CnD1Dah5.js → renderShortcut-BYvKm38e.js} +1 -1
- package/dist/assets/{request-registry-B-7cIM_I.js → request-registry-XB2EzJHm.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-DDDTB1LD.js → requirementDiagram-UZGBJVZJ-DtqOYJpH.js} +1 -1
- package/dist/assets/{run-page-FCvGnICa.js → run-page-B7CASued.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-DAWPOfBw.js → sankeyDiagram-TZEHDZUN-DmcooLA8.js} +1 -1
- package/dist/assets/{scratchpad-panel-k9lrm-rC.js → scratchpad-panel-BIVRgYOU.js} +1 -1
- package/dist/assets/{secrets-panel-B1Z-6dmz.js → secrets-panel-C24hZEiO.js} +1 -1
- package/dist/assets/{select-CxT2Geqr.js → select-Cnd3vm9n.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-D_qAidD2.js → sequenceDiagram-WL72ISMW-S2qeLb7J.js} +1 -1
- package/dist/assets/{session-panel-WhN0qilM.js → session-panel-CNabBHQm.js} +1 -1
- package/dist/assets/{share-BdH_5I58.js → share-NjpZ54PJ.js} +1 -1
- package/dist/assets/{snippets-panel-BCDHUuku.js → snippets-panel-D1JAeJj1.js} +1 -1
- package/dist/assets/{spec-DbmSqx09.js → spec-DnVBmJUh.js} +1 -1
- package/dist/assets/{state-Ce7CVShi.js → state-BagvlaEz.js} +1 -1
- package/dist/assets/{state-3V5UxC3B.js → state-Cz_wrzCz.js} +1 -1
- package/dist/assets/{state-CBmCYWFH.js → state-DMQXxemS.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-C7qgDrGA.js → stateDiagram-FKZM4ZOC-uuQ60pIl.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-D-GWhQTG.js +1 -0
- package/dist/assets/stex-CruVQx-P.js +1 -0
- package/dist/assets/{switch-CVKxYu_0.js → switch-Bwpd2AFq.js} +1 -1
- package/dist/assets/{terminal-Cr7wbEjz.js → terminal-Gl8Fi44y.js} +1 -1
- package/dist/assets/{time-D2GKc0U6.js → time-Bw8f15NM.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-hd6uJKGs.js → timeline-definition-IT6M3QCI-TKWeDnSQ.js} +1 -1
- package/dist/assets/{toggle-RCwU-rnE.js → toggle-C_gNjXg8.js} +1 -1
- package/dist/assets/{tooltip-D9723Brr.js → tooltip-CR_izE8Q.js} +1 -1
- package/dist/assets/tracing-DwAC7DWN.js +1 -0
- package/dist/assets/tracing-panel-D1iNgclL.js +2 -0
- package/dist/assets/{tree-Ch2-GuhG.js → tree-WVrWjdwv.js} +3 -3
- package/dist/assets/{useAddCell-YC7rpcmD.js → useAddCell-D6Q7JziZ.js} +1 -1
- package/dist/assets/{useBoolean-m1e6E3Ao.js → useBoolean-CrltYVhE.js} +1 -1
- package/dist/assets/{useCellActionButton-GUb2fXU8.js → useCellActionButton-B2G9OaX9.js} +1 -1
- package/dist/assets/{useDateFormatter-CpE7XQLs.js → useDateFormatter-DOoVZUts.js} +1 -1
- package/dist/assets/{useDeleteCell-DRUDRiy0.js → useDeleteCell-d8veThW7.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-nFVMlEx0.js → useDependencyPanelTab-B3iIj3MO.js} +1 -1
- package/dist/assets/{useInstallPackage-C9V-on2J.js → useInstallPackage-CQEr5429.js} +1 -1
- package/dist/assets/{useNotebookActions-ChLHy-0O.js → useNotebookActions-SAEOWcBo.js} +1 -1
- package/dist/assets/{useNumberFormatter-DbDKSvEd.js → useNumberFormatter-BXZcbTzH.js} +1 -1
- package/dist/assets/{usePress-BHGkpw8X.js → usePress-alQ5Crny.js} +1 -1
- package/dist/assets/{useRunCells-5m6jCnyo.js → useRunCells-Dhl8ZTGh.js} +1 -1
- package/dist/assets/{useSplitCell-DGD9smMq.js → useSplitCell-BSnFazbH.js} +1 -1
- package/dist/assets/{utils-CdjCA1J8.js → utils-C24l2A1T.js} +1 -1
- package/dist/assets/{vega-component-CRbeDmeM.js → vega-component-9Pf4pVZL.js} +1 -1
- package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
- package/dist/assets/{write-secret-modal-BCvuRAFb.js → write-secret-modal-BFCsWMoW.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CXlUBSbQ.js → xychartDiagram-PRI3JC2R-CIp-yeSa.js} +1 -1
- package/dist/index.html +125 -125
- package/package.json +1 -1
- package/src/__mocks__/notebook.ts +9 -9
- package/src/__tests__/branded.ts +20 -0
- package/src/components/app-config/user-config-form.tsx +5 -4
- package/src/components/data-table/__tests__/utils.test.ts +138 -1
- package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
- package/src/components/data-table/context-menu.tsx +9 -5
- package/src/components/data-table/data-table.tsx +3 -0
- package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
- package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
- package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
- package/src/components/data-table/range-focus/atoms.ts +2 -2
- package/src/components/data-table/range-focus/utils.ts +50 -12
- package/src/components/data-table/types.ts +7 -0
- package/src/components/data-table/utils.ts +87 -0
- package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
- package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
- package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
- package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
- package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
- package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
- package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
- package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
- package/src/components/storage/storage-file-viewer.tsx +35 -1
- package/src/components/storage/storage-inspector.tsx +9 -4
- package/src/components/storage/storage-snippets.ts +3 -3
- package/src/components/tracing/tracing.tsx +3 -1
- package/src/components/ui/range-slider.tsx +108 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
- package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
- package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
- package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
- package/src/core/cells/__tests__/cells.test.ts +192 -135
- package/src/core/cells/__tests__/focus.test.ts +5 -4
- package/src/core/cells/__tests__/logs.test.ts +13 -12
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
- package/src/core/cells/__tests__/runs.test.ts +22 -21
- package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
- package/src/core/cells/__tests__/session.test.ts +23 -22
- package/src/core/cells/cells.ts +1 -1
- package/src/core/cells/ids.ts +5 -5
- package/src/core/cells/logs.ts +2 -2
- package/src/core/cells/runs.ts +6 -8
- package/src/core/codemirror/__tests__/format.test.ts +34 -36
- package/src/core/codemirror/__tests__/setup.test.ts +2 -2
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
- package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
- package/src/core/codemirror/cells/extensions.ts +66 -23
- package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
- package/src/core/codemirror/completion/keymap.ts +14 -4
- package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
- package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
- package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
- package/src/core/codemirror/language/languages/python.ts +4 -0
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
- package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
- package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
- package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
- package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/datasets/__tests__/data-source.test.ts +5 -6
- package/src/core/datasets/state.ts +1 -1
- package/src/core/errors/__tests__/errors.test.ts +2 -1
- package/src/core/export/__tests__/hooks.test.ts +37 -36
- package/src/core/islands/main.ts +2 -7
- package/src/core/kernel/__tests__/handlers.test.ts +5 -4
- package/src/core/kernel/handlers.ts +7 -4
- package/src/core/network/DeferredRequestRegistry.ts +2 -2
- package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
- package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
- package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
- package/src/core/static/virtual-file-tracker.ts +1 -1
- package/src/core/storage/__tests__/state.test.ts +31 -21
- package/src/core/storage/state.ts +1 -1
- package/src/core/variables/__tests__/state.test.ts +6 -6
- package/src/core/variables/types.ts +2 -2
- package/src/core/wasm/__tests__/state.test.ts +8 -8
- package/src/core/websocket/useMarimoKernelConnection.tsx +12 -15
- package/src/css/md-tooltip.css +4 -39
- package/src/css/md.css +7 -0
- package/src/plugins/core/RenderHTML.tsx +17 -0
- package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
- package/src/plugins/core/sanitize-html.ts +25 -18
- package/src/plugins/impl/DataTablePlugin.tsx +23 -2
- package/src/plugins/impl/SliderPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
- package/src/plugins/impl/anywidget/model.ts +1 -2
- package/src/stories/cell.stories.tsx +8 -8
- package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
- package/src/stories/log-viewer.stories.tsx +8 -8
- package/src/stories/variables.stories.tsx +2 -2
- package/src/utils/__tests__/download.test.tsx +21 -20
- package/src/utils/copy.ts +18 -5
- package/src/utils/download.ts +4 -3
- package/src/utils/html-to-image.ts +6 -0
- package/src/utils/json/base64.ts +3 -3
- package/src/utils/traceback.ts +5 -3
- package/dist/assets/JsonOutput-DKXKGKvX.js +0 -46
- package/dist/assets/RenderHTML-DJ8khuob.js +0 -1
- package/dist/assets/ai-model-dropdown-DPTa_EpU.js +0 -5
- package/dist/assets/cell-editor-DX7IcqNr.js +0 -23
- package/dist/assets/channel-CkT8Qdo2.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-BhMT_rTz.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-D-F4WEyb.js +0 -1
- package/dist/assets/copy-YwM0Pd7v.js +0 -1
- package/dist/assets/dist-BTqMkf4j.js +0 -1
- package/dist/assets/dist-DHw9sXeN.js +0 -1
- package/dist/assets/dist-Du0qZeXz.js +0 -1
- package/dist/assets/dist-a0FfbvMD.js +0 -1
- package/dist/assets/dist-cfkfP0ni.js +0 -1
- package/dist/assets/dist-pzQ9JG-p.js +0 -1
- package/dist/assets/file-explorer-panel-CB8vF5ob.js +0 -26
- package/dist/assets/home-page-itW0tRmv.js +0 -4
- package/dist/assets/html-to-image-BnSc-Wa0.js +0 -2
- package/dist/assets/index-0n92c_W7.js +0 -38
- package/dist/assets/mermaid-4DMBBIKO-PoHnhmy8.js +0 -1
- package/dist/assets/react-vega-Da-Ps9UW.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-CEqeIlM0.js +0 -1
- package/dist/assets/stex-BBWVYm-R.js +0 -1
- package/dist/assets/tracing-DUVd0jtl.js +0 -1
- package/dist/assets/tracing-panel-CuTxPn_x.js +0 -2
- /package/dist/assets/{Combination-Cs9nbinQ.js → Combination-CSPK4t6z.js} +0 -0
- /package/dist/assets/{Deferred-BMfCOLaw.js → Deferred-CfyqLOPG.js} +0 -0
- /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
- /package/dist/assets/{badge-hTpPIsMT.js → badge-DImLVznf.js} +0 -0
- /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
- /package/dist/assets/{bot-message-square-CK6eoGWy.js → bot-message-square-Dw41U6lL.js} +0 -0
- /package/dist/assets/{chart-no-axes-column-DV8gdCvH.js → chart-no-axes-column-a9XtWmzk.js} +0 -0
- /package/dist/assets/{check-BE0hEwVo.js → check-DZA_bRpw.js} +0 -0
- /package/dist/assets/{chevron-right-D0GQBpTb.js → chevron-right-CvVxySQk.js} +0 -0
- /package/dist/assets/{circle-check-gLIOLu8x.js → circle-check-CbaVeozR.js} +0 -0
- /package/dist/assets/{circle-play-DYGULlKZ.js → circle-play-DYn5nR6N.js} +0 -0
- /package/dist/assets/{circle-plus-CGG-gArM.js → circle-plus-nCze0-py.js} +0 -0
- /package/dist/assets/{clipboard-paste-DoYSN8Sv.js → clipboard-paste-EHXeKq9D.js} +0 -0
- /package/dist/assets/{code-xml-DwHPF_nL.js → code-xml-BlrJCgNZ.js} +0 -0
- /package/dist/assets/{copy-CkudG0Ej.js → copy-D6N1-xc1.js} +0 -0
- /package/dist/assets/{database-zap-DTWCDKdn.js → database-zap-BIGMFOfP.js} +0 -0
- /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
- /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
- /package/dist/assets/{dist-8UD0A5sU.js → dist-BF9S272t.js} +0 -0
- /package/dist/assets/{dist-apDpadc4.js → dist-Bk1itfBD.js} +0 -0
- /package/dist/assets/{dist-CQqv2gQL.js → dist-Dm11d0_A.js} +0 -0
- /package/dist/assets/{download-DBW9RXtT.js → download-nLboiTtW.js} +0 -0
- /package/dist/assets/{ellipsis-0_zJdF6H.js → ellipsis-d7eaKIFn.js} +0 -0
- /package/dist/assets/{ellipsis-vertical-CAB7tdza.js → ellipsis-vertical-DBQ5kWTo.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-D1keIaYa.js → emotion-is-prop-valid.esm-D7FeWASw.js} +0 -0
- /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
- /package/dist/assets/{extends-DRbCSry7.js → extends-aq1t6BkR.js} +0 -0
- /package/dist/assets/{eye-off-vwi9L975.js → eye-off-CF3GmvXV.js} +0 -0
- /package/dist/assets/{file-DzHkbIdO.js → file-C-yMeaec.js} +0 -0
- /package/dist/assets/{file-headphone-B5q2Ow55.js → file-headphone-CPAP8asn.js} +0 -0
- /package/dist/assets/{file-plus-corner-lLQw9OnR.js → file-plus-corner-ks__N1mr.js} +0 -0
- /package/dist/assets/{github-BVtI-3F1.js → github-CRD4USKm.js} +0 -0
- /package/dist/assets/{image-DXfkah9d.js → image-CfyJzBP9.js} +0 -0
- /package/dist/assets/{link-Cf10mh3t.js → link-_dbp0XNB.js} +0 -0
- /package/dist/assets/{maps-OKerBHH8.js → maps-DQsjfyTy.js} +0 -0
- /package/dist/assets/{numbers-CYnquDho.js → numbers-Cno6K0UF.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-DP4vAkvg.js → objectWithoutPropertiesLoose-Dxmp_Bd_.js} +0 -0
- /package/dist/assets/{ordinal-BjO5SoTk.js → ordinal-CMAUv8ku.js} +0 -0
- /package/dist/assets/{paths-D2lG83Oh.js → paths-BVwhPRFT.js} +0 -0
- /package/dist/assets/{play-DKSqmedg.js → play-Bu_0ogGD.js} +0 -0
- /package/dist/assets/{plus-dVmh0yTy.js → plus-DJ99CUbx.js} +0 -0
- /package/dist/assets/{preload-helper-BW0IMuFq.js → preload-helper-y72bE5iF.js} +0 -0
- /package/dist/assets/{prop-types-RrUi-pOT.js → prop-types-DRf51_gT.js} +0 -0
- /package/dist/assets/{purify.es-BBn8CPhf.js → purify.es-Cf8RQecB.js} +0 -0
- /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
- /package/dist/assets/{refresh-ccw-DLpfIr8v.js → refresh-ccw-DQ6SJ8UC.js} +0 -0
- /package/dist/assets/{refresh-cw-CHAHPgkx.js → refresh-cw-Dg9tCj4k.js} +0 -0
- /package/dist/assets/{rotate-ccw-hLlF_82X.js → rotate-ccw-BCkZViUZ.js} +0 -0
- /package/dist/assets/{save-8fSvKYJT.js → save-CUdcv5qm.js} +0 -0
- /package/dist/assets/{session-BrEm7qNv.js → session-CByuQ-M-.js} +0 -0
- /package/dist/assets/{settings-CzQUw9rV.js → settings-B7nhfCat.js} +0 -0
- /package/dist/assets/{spinner-C5JoisA7.js → spinner-pCogyRyo.js} +0 -0
- /package/dist/assets/{square-CxAsQQ77.js → square-KVNDGpgy.js} +0 -0
- /package/dist/assets/{square-function-B006EYFX.js → square-function-BMNCw7Qb.js} +0 -0
- /package/dist/assets/{stex-0ac7Aukl.js → stex-C6JeW1YI.js} +0 -0
- /package/dist/assets/{table-BCnp9gKC.js → table-Od8PbuV-.js} +0 -0
- /package/dist/assets/{toDate-BqKH-Jd9.js → toDate-Cfp9W_O9.js} +0 -0
- /package/dist/assets/{trash-2-CAoNMkjq.js → trash-2-Bc_J7TQO.js} +0 -0
- /package/dist/assets/{trash-BZMAQneW.js → trash-Cxd189Vw.js} +0 -0
- /package/dist/assets/{triangle-alert-qZo1ox6x.js → triangle-alert-CzLrbLGN.js} +0 -0
- /package/dist/assets/{types-C1RN112u.js → types-CLOMZuqU.js} +0 -0
- /package/dist/assets/{use-toast-Hc8CXlvz.js → use-toast-BtZldTi5.js} +0 -0
- /package/dist/assets/{useDebounce-B0dx2Gp0.js → useDebounce-DwTO_rGp.js} +0 -0
- /package/dist/assets/{useTheme-BYXBU1of.js → useTheme-KDW4sktg.js} +0 -0
- /package/dist/assets/{uuid-ClFZlR7U.js → uuid-BukULOeS.js} +0 -0
- /package/dist/assets/{workflow-BmeqNuSH.js → workflow-BqHyyStM.js} +0 -0
- /package/dist/assets/{x-BI1M8X_v.js → x-CdLP7-v3.js} +0 -0
- /package/dist/assets/{youtube-DE-Ej6FR.js → youtube-CfU-SnDw.js} +0 -0
|
@@ -6,6 +6,7 @@ import { EditorView } from "@codemirror/view";
|
|
|
6
6
|
import { atom } from "jotai";
|
|
7
7
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
8
|
import { MockRequestClient } from "@/__mocks__/requests";
|
|
9
|
+
import { cellId } from "@/__tests__/branded";
|
|
9
10
|
import type { NotebookState } from "@/core/cells/cells";
|
|
10
11
|
import { getNotebook } from "@/core/cells/cells";
|
|
11
12
|
import type { CellId } from "@/core/cells/ids";
|
|
@@ -99,11 +100,11 @@ afterEach(() => {
|
|
|
99
100
|
describe("format", () => {
|
|
100
101
|
describe("formatEditorViews", () => {
|
|
101
102
|
it("should format code in editor views", async () => {
|
|
102
|
-
const
|
|
103
|
-
const
|
|
103
|
+
const cid1 = cellId("1");
|
|
104
|
+
const cid2 = cellId("2");
|
|
104
105
|
const views = {
|
|
105
|
-
[
|
|
106
|
-
[
|
|
106
|
+
[cid1]: createEditor("import numpy as np", cid1),
|
|
107
|
+
[cid2]: createEditor("import pandas as pd", cid2),
|
|
107
108
|
};
|
|
108
109
|
|
|
109
110
|
const formattedCode1 = "import numpy as np";
|
|
@@ -111,8 +112,8 @@ describe("format", () => {
|
|
|
111
112
|
|
|
112
113
|
mockRequestClient.sendFormat.mockResolvedValueOnce({
|
|
113
114
|
codes: {
|
|
114
|
-
[
|
|
115
|
-
[
|
|
115
|
+
[cid1]: formattedCode1,
|
|
116
|
+
[cid2]: formattedCode2,
|
|
116
117
|
},
|
|
117
118
|
});
|
|
118
119
|
|
|
@@ -122,36 +123,36 @@ describe("format", () => {
|
|
|
122
123
|
|
|
123
124
|
expect(mockRequestClient.sendFormat).toHaveBeenCalledWith({
|
|
124
125
|
codes: {
|
|
125
|
-
[
|
|
126
|
-
[
|
|
126
|
+
[cid1]: "import numpy as np",
|
|
127
|
+
[cid2]: "import pandas as pd",
|
|
127
128
|
},
|
|
128
129
|
lineLength: 88,
|
|
129
130
|
});
|
|
130
131
|
|
|
131
|
-
expect(views[
|
|
132
|
-
expect(views[
|
|
132
|
+
expect(views[cid1].state.doc.toString()).toBe(formattedCode1);
|
|
133
|
+
expect(views[cid2].state.doc.toString()).toBe(formattedCode2);
|
|
133
134
|
expect(updateCellCode).toHaveBeenCalledWith({
|
|
134
|
-
cellId:
|
|
135
|
+
cellId: cid1,
|
|
135
136
|
code: formattedCode1,
|
|
136
137
|
formattingChange: true,
|
|
137
138
|
});
|
|
138
139
|
expect(updateCellCode).toHaveBeenCalledWith({
|
|
139
|
-
cellId:
|
|
140
|
+
cellId: cid2,
|
|
140
141
|
code: formattedCode2,
|
|
141
142
|
formattingChange: true,
|
|
142
143
|
});
|
|
143
144
|
});
|
|
144
145
|
|
|
145
146
|
it("should not update editor if formatted code is same as original", async () => {
|
|
146
|
-
const
|
|
147
|
+
const cid = cellId("1");
|
|
147
148
|
const originalCode = "import numpy as np";
|
|
148
149
|
const views = {
|
|
149
|
-
[
|
|
150
|
+
[cid]: createEditor(originalCode, cid),
|
|
150
151
|
};
|
|
151
152
|
|
|
152
153
|
mockRequestClient.sendFormat.mockResolvedValueOnce({
|
|
153
154
|
codes: {
|
|
154
|
-
[
|
|
155
|
+
[cid]: originalCode,
|
|
155
156
|
},
|
|
156
157
|
});
|
|
157
158
|
|
|
@@ -159,26 +160,26 @@ describe("format", () => {
|
|
|
159
160
|
|
|
160
161
|
await formatEditorViews(views);
|
|
161
162
|
|
|
162
|
-
expect(views[
|
|
163
|
+
expect(views[cid].state.doc.toString()).toBe(originalCode);
|
|
163
164
|
expect(updateCellCode).not.toHaveBeenCalled();
|
|
164
165
|
});
|
|
165
166
|
});
|
|
166
167
|
|
|
167
168
|
describe("formatAll", () => {
|
|
168
169
|
it("should format all cells in notebook", async () => {
|
|
169
|
-
const
|
|
170
|
-
const
|
|
170
|
+
const cid1 = cellId("1");
|
|
171
|
+
const cid2 = cellId("2");
|
|
171
172
|
const views = {
|
|
172
|
-
[
|
|
173
|
-
[
|
|
173
|
+
[cid1]: createEditor("import numpy as np", cid1),
|
|
174
|
+
[cid2]: createEditor("import pandas as pd", cid2),
|
|
174
175
|
};
|
|
175
176
|
|
|
176
177
|
vi.mocked(getNotebook).mockReturnValueOnce({} as NotebookState);
|
|
177
178
|
vi.mocked(notebookCellEditorViews).mockReturnValueOnce(views);
|
|
178
179
|
mockRequestClient.sendFormat.mockResolvedValueOnce({
|
|
179
180
|
codes: {
|
|
180
|
-
[
|
|
181
|
-
[
|
|
181
|
+
[cid1]: "import numpy as np",
|
|
182
|
+
[cid2]: "import pandas as pd",
|
|
182
183
|
},
|
|
183
184
|
});
|
|
184
185
|
|
|
@@ -188,14 +189,14 @@ describe("format", () => {
|
|
|
188
189
|
|
|
189
190
|
expect(mockRequestClient.sendFormat).toHaveBeenCalledWith({
|
|
190
191
|
codes: {
|
|
191
|
-
[
|
|
192
|
-
[
|
|
192
|
+
[cid1]: "import numpy as np",
|
|
193
|
+
[cid2]: "import pandas as pd",
|
|
193
194
|
},
|
|
194
195
|
lineLength: 88,
|
|
195
196
|
});
|
|
196
197
|
|
|
197
198
|
expect(updateCellCode).toHaveBeenCalledWith({
|
|
198
|
-
cellId:
|
|
199
|
+
cellId: cid1,
|
|
199
200
|
code: "import numpy as np",
|
|
200
201
|
formattingChange: true,
|
|
201
202
|
});
|
|
@@ -204,8 +205,8 @@ describe("format", () => {
|
|
|
204
205
|
|
|
205
206
|
describe("formatSQL", () => {
|
|
206
207
|
it("should format SQL code", async () => {
|
|
207
|
-
const
|
|
208
|
-
const editor = createEditor("SELECT * FROM table WHERE id = 1",
|
|
208
|
+
const cid = cellId("1");
|
|
209
|
+
const editor = createEditor("SELECT * FROM table WHERE id = 1", cid);
|
|
209
210
|
switchLanguage(editor, { language: "sql" });
|
|
210
211
|
|
|
211
212
|
await formatSQL(editor, "duckdb" as ConnectionName);
|
|
@@ -220,15 +221,15 @@ describe("format", () => {
|
|
|
220
221
|
id = 1"
|
|
221
222
|
`);
|
|
222
223
|
expect(updateCellCode).toHaveBeenCalledWith({
|
|
223
|
-
cellId:
|
|
224
|
+
cellId: cid,
|
|
224
225
|
code: editor.state.doc.toString(),
|
|
225
226
|
formattingChange: true,
|
|
226
227
|
});
|
|
227
228
|
});
|
|
228
229
|
|
|
229
230
|
it("should not format if language adapter is not SQL", async () => {
|
|
230
|
-
const
|
|
231
|
-
const editor = createEditor("SELECT * FROM table WHERE id = 1",
|
|
231
|
+
const cid = cellId("1");
|
|
232
|
+
const editor = createEditor("SELECT * FROM table WHERE id = 1", cid);
|
|
232
233
|
switchLanguage(editor, { language: "python" });
|
|
233
234
|
|
|
234
235
|
await formatSQL(editor, "duckdb" as ConnectionName);
|
|
@@ -242,11 +243,8 @@ describe("format", () => {
|
|
|
242
243
|
});
|
|
243
244
|
|
|
244
245
|
it("should format SQL code with different dialect", async () => {
|
|
245
|
-
const
|
|
246
|
-
const editor = createEditor(
|
|
247
|
-
"SELECT * FROM `table.dot` WHERE id = 1",
|
|
248
|
-
cellId,
|
|
249
|
-
);
|
|
246
|
+
const cid = cellId("1");
|
|
247
|
+
const editor = createEditor("SELECT * FROM `table.dot` WHERE id = 1", cid);
|
|
250
248
|
switchLanguage(editor, { language: "sql" });
|
|
251
249
|
|
|
252
250
|
await formatSQL(editor, "mysql" as ConnectionName); // mysql uses backticks for identifiers
|
|
@@ -260,7 +258,7 @@ describe("format", () => {
|
|
|
260
258
|
id = 1"
|
|
261
259
|
`);
|
|
262
260
|
expect(updateCellCode).toHaveBeenCalledWith({
|
|
263
|
-
cellId:
|
|
261
|
+
cellId: cid,
|
|
264
262
|
code: editor.state.doc.toString(),
|
|
265
263
|
formattingChange: true,
|
|
266
264
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { EditorState, type Extension } from "@codemirror/state";
|
|
4
4
|
import { keymap } from "@codemirror/view";
|
|
5
5
|
import { describe, expect, test, vi } from "vitest";
|
|
6
|
-
import
|
|
6
|
+
import { cellId } from "@/__tests__/branded";
|
|
7
7
|
import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
|
|
8
8
|
import { Objects } from "@/utils/objects";
|
|
9
9
|
import type { CodemirrorCellActions } from "../cells/state";
|
|
@@ -35,7 +35,7 @@ function namedFunction(name: string) {
|
|
|
35
35
|
|
|
36
36
|
function getOpts() {
|
|
37
37
|
return {
|
|
38
|
-
cellId: "0"
|
|
38
|
+
cellId: cellId("0"),
|
|
39
39
|
showPlaceholder: false,
|
|
40
40
|
enableAI: false,
|
|
41
41
|
cellActions: {
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
// @vitest-environment jsdom
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
EditorState,
|
|
6
|
+
Transaction,
|
|
7
|
+
type TransactionSpec,
|
|
8
|
+
} from "@codemirror/state";
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import { formattingChangeEffect } from "../../format";
|
|
11
|
+
import { loroSyncAnnotation } from "../../rtc/loro/sync";
|
|
12
|
+
import { exportedForTesting } from "../extensions";
|
|
13
|
+
|
|
14
|
+
const { shouldAutorunMarkdownUpdate } = exportedForTesting;
|
|
15
|
+
|
|
16
|
+
function createTransaction(spec: TransactionSpec) {
|
|
17
|
+
return EditorState.create({ doc: "" }).update(spec);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe("shouldAutorunMarkdownUpdate", () => {
|
|
21
|
+
it.each([
|
|
22
|
+
"input.type",
|
|
23
|
+
"delete.backward",
|
|
24
|
+
"undo",
|
|
25
|
+
"redo",
|
|
26
|
+
])("accepts local %s transactions", (userEvent) => {
|
|
27
|
+
const transaction = createTransaction({
|
|
28
|
+
changes: { from: 0, insert: "#" },
|
|
29
|
+
annotations: [Transaction.userEvent.of(userEvent)],
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(
|
|
33
|
+
shouldAutorunMarkdownUpdate({
|
|
34
|
+
docChanged: transaction.docChanged,
|
|
35
|
+
transactions: [transaction],
|
|
36
|
+
}),
|
|
37
|
+
).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("ignores formatting changes", () => {
|
|
41
|
+
const transaction = createTransaction({
|
|
42
|
+
changes: { from: 0, insert: "#" },
|
|
43
|
+
annotations: [Transaction.userEvent.of("input.type")],
|
|
44
|
+
effects: [formattingChangeEffect.of(true)],
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
expect(
|
|
48
|
+
shouldAutorunMarkdownUpdate({
|
|
49
|
+
docChanged: transaction.docChanged,
|
|
50
|
+
transactions: [transaction],
|
|
51
|
+
}),
|
|
52
|
+
).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("ignores RTC sync transactions", () => {
|
|
56
|
+
const transaction = createTransaction({
|
|
57
|
+
changes: { from: 0, insert: "#" },
|
|
58
|
+
annotations: [
|
|
59
|
+
Transaction.userEvent.of("input.type"),
|
|
60
|
+
loroSyncAnnotation.of(true),
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
expect(
|
|
65
|
+
shouldAutorunMarkdownUpdate({
|
|
66
|
+
docChanged: transaction.docChanged,
|
|
67
|
+
transactions: [transaction],
|
|
68
|
+
hasFocus: true,
|
|
69
|
+
}),
|
|
70
|
+
).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("ignores programmatic doc changes without a user event", () => {
|
|
74
|
+
const transaction = createTransaction({
|
|
75
|
+
changes: { from: 0, insert: "#" },
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(
|
|
79
|
+
shouldAutorunMarkdownUpdate({
|
|
80
|
+
docChanged: transaction.docChanged,
|
|
81
|
+
transactions: [transaction],
|
|
82
|
+
}),
|
|
83
|
+
).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("allows focused local doc changes without user event annotations", () => {
|
|
87
|
+
const transaction = createTransaction({
|
|
88
|
+
changes: { from: 0, insert: "#" },
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
expect(
|
|
92
|
+
shouldAutorunMarkdownUpdate({
|
|
93
|
+
docChanged: transaction.docChanged,
|
|
94
|
+
transactions: [transaction],
|
|
95
|
+
hasFocus: true,
|
|
96
|
+
}),
|
|
97
|
+
).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("honors the predicate gate", () => {
|
|
101
|
+
const transaction = createTransaction({
|
|
102
|
+
changes: { from: 0, insert: "#" },
|
|
103
|
+
annotations: [Transaction.userEvent.of("input.type")],
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(
|
|
107
|
+
shouldAutorunMarkdownUpdate({
|
|
108
|
+
docChanged: transaction.docChanged,
|
|
109
|
+
transactions: [transaction],
|
|
110
|
+
predicate: () => false,
|
|
111
|
+
}),
|
|
112
|
+
).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -5,6 +5,7 @@ import { foldCode, foldedRanges, foldGutter } from "@codemirror/language";
|
|
|
5
5
|
import { EditorState } from "@codemirror/state";
|
|
6
6
|
import { EditorView } from "@codemirror/view";
|
|
7
7
|
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
+
import { cellId } from "@/__tests__/branded";
|
|
8
9
|
import type { CellId } from "@/core/cells/ids";
|
|
9
10
|
import { createMockObservable } from "@/core/state/__mocks__/mocks";
|
|
10
11
|
import type { Observable } from "@/core/state/observable";
|
|
@@ -48,7 +49,7 @@ describe("traceback-decorations", () => {
|
|
|
48
49
|
|
|
49
50
|
describe("unfoldErrorLines", () => {
|
|
50
51
|
it("should unfold folded regions containing error lines", () => {
|
|
51
|
-
const
|
|
52
|
+
const cid = cellId("cell1");
|
|
52
53
|
const code = `def my_function():
|
|
53
54
|
x = 1
|
|
54
55
|
y = 2
|
|
@@ -60,7 +61,7 @@ result = my_function()`;
|
|
|
60
61
|
const errorsObservable = createMockObservable<
|
|
61
62
|
TracebackInfo[] | undefined
|
|
62
63
|
>(undefined);
|
|
63
|
-
view = createEditor(code,
|
|
64
|
+
view = createEditor(code, cid, errorsObservable);
|
|
64
65
|
|
|
65
66
|
// Fold the function body (lines 2-5)
|
|
66
67
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -82,7 +83,7 @@ result = my_function()`;
|
|
|
82
83
|
mockObservable.set([
|
|
83
84
|
{
|
|
84
85
|
kind: "cell",
|
|
85
|
-
cellId,
|
|
86
|
+
cellId: cid,
|
|
86
87
|
lineNumber: 3,
|
|
87
88
|
},
|
|
88
89
|
]);
|
|
@@ -100,7 +101,7 @@ result = my_function()`;
|
|
|
100
101
|
});
|
|
101
102
|
|
|
102
103
|
it("should not unfold folded regions when error is outside the region", () => {
|
|
103
|
-
const
|
|
104
|
+
const cid = cellId("cell1");
|
|
104
105
|
const code = `def my_function():
|
|
105
106
|
x = 1
|
|
106
107
|
y = 2
|
|
@@ -111,7 +112,7 @@ result = my_function()`;
|
|
|
111
112
|
const errorsObservable = createMockObservable<
|
|
112
113
|
TracebackInfo[] | undefined
|
|
113
114
|
>(undefined);
|
|
114
|
-
view = createEditor(code,
|
|
115
|
+
view = createEditor(code, cid, errorsObservable);
|
|
115
116
|
|
|
116
117
|
// Fold the function body (lines 2-4)
|
|
117
118
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -133,7 +134,7 @@ result = my_function()`;
|
|
|
133
134
|
mockObservable.set([
|
|
134
135
|
{
|
|
135
136
|
kind: "cell",
|
|
136
|
-
cellId,
|
|
137
|
+
cellId: cid,
|
|
137
138
|
lineNumber: 6,
|
|
138
139
|
},
|
|
139
140
|
]);
|
|
@@ -151,8 +152,8 @@ result = my_function()`;
|
|
|
151
152
|
});
|
|
152
153
|
|
|
153
154
|
it("should not unfold regions for errors in different cells", () => {
|
|
154
|
-
const cellId1 = "cell1"
|
|
155
|
-
const cellId2 = "cell2"
|
|
155
|
+
const cellId1 = cellId("cell1");
|
|
156
|
+
const cellId2 = cellId("cell2");
|
|
156
157
|
const code = `def my_function():
|
|
157
158
|
x = 1
|
|
158
159
|
y = 2
|
|
@@ -201,7 +202,7 @@ result = my_function()`;
|
|
|
201
202
|
});
|
|
202
203
|
|
|
203
204
|
it("should handle multiple errors in the same folded region", () => {
|
|
204
|
-
const
|
|
205
|
+
const cid = cellId("cell1");
|
|
205
206
|
const code = `def my_function():
|
|
206
207
|
x = 1
|
|
207
208
|
y = 2
|
|
@@ -213,7 +214,7 @@ result = my_function()`;
|
|
|
213
214
|
const errorsObservable = createMockObservable<
|
|
214
215
|
TracebackInfo[] | undefined
|
|
215
216
|
>(undefined);
|
|
216
|
-
view = createEditor(code,
|
|
217
|
+
view = createEditor(code, cid, errorsObservable);
|
|
217
218
|
|
|
218
219
|
// Fold the function body
|
|
219
220
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -235,12 +236,12 @@ result = my_function()`;
|
|
|
235
236
|
mockObservable.set([
|
|
236
237
|
{
|
|
237
238
|
kind: "cell",
|
|
238
|
-
cellId,
|
|
239
|
+
cellId: cid,
|
|
239
240
|
lineNumber: 2, // Inside folded region
|
|
240
241
|
},
|
|
241
242
|
{
|
|
242
243
|
kind: "cell",
|
|
243
|
-
cellId,
|
|
244
|
+
cellId: cid,
|
|
244
245
|
lineNumber: 4, // Also inside folded region
|
|
245
246
|
},
|
|
246
247
|
]);
|
|
@@ -258,7 +259,7 @@ result = my_function()`;
|
|
|
258
259
|
});
|
|
259
260
|
|
|
260
261
|
it("should handle invalid line numbers gracefully in unfoldErrorLines", () => {
|
|
261
|
-
const
|
|
262
|
+
const cid = cellId("cell1");
|
|
262
263
|
const code = `def my_function():
|
|
263
264
|
x = 1
|
|
264
265
|
return x`;
|
|
@@ -266,7 +267,7 @@ result = my_function()`;
|
|
|
266
267
|
const errorsObservable = createMockObservable<
|
|
267
268
|
TracebackInfo[] | undefined
|
|
268
269
|
>(undefined);
|
|
269
|
-
view = createEditor(code,
|
|
270
|
+
view = createEditor(code, cid, errorsObservable);
|
|
270
271
|
|
|
271
272
|
// Fold the function
|
|
272
273
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -284,7 +285,7 @@ result = my_function()`;
|
|
|
284
285
|
mockObservable.set([
|
|
285
286
|
{
|
|
286
287
|
kind: "cell",
|
|
287
|
-
cellId,
|
|
288
|
+
cellId: cid,
|
|
288
289
|
lineNumber: 2, // Valid line number inside folded region
|
|
289
290
|
},
|
|
290
291
|
]);
|
|
@@ -310,7 +311,7 @@ result = my_function()`;
|
|
|
310
311
|
});
|
|
311
312
|
|
|
312
313
|
it("should handle file errors (not cell errors)", () => {
|
|
313
|
-
const
|
|
314
|
+
const cid = cellId("cell1");
|
|
314
315
|
const code = `def my_function():
|
|
315
316
|
x = 1
|
|
316
317
|
return x`;
|
|
@@ -318,7 +319,7 @@ result = my_function()`;
|
|
|
318
319
|
const errorsObservable = createMockObservable<
|
|
319
320
|
TracebackInfo[] | undefined
|
|
320
321
|
>(undefined);
|
|
321
|
-
view = createEditor(code,
|
|
322
|
+
view = createEditor(code, cid, errorsObservable);
|
|
322
323
|
|
|
323
324
|
// Fold the function
|
|
324
325
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -350,7 +351,7 @@ result = my_function()`;
|
|
|
350
351
|
});
|
|
351
352
|
|
|
352
353
|
it("should handle empty or undefined errors", () => {
|
|
353
|
-
const
|
|
354
|
+
const cid = cellId("cell1");
|
|
354
355
|
const code = `def my_function():
|
|
355
356
|
x = 1
|
|
356
357
|
return x`;
|
|
@@ -358,7 +359,7 @@ result = my_function()`;
|
|
|
358
359
|
const errorsObservable = createMockObservable<
|
|
359
360
|
TracebackInfo[] | undefined
|
|
360
361
|
>(undefined);
|
|
361
|
-
view = createEditor(code,
|
|
362
|
+
view = createEditor(code, cid, errorsObservable);
|
|
362
363
|
|
|
363
364
|
// Fold the function
|
|
364
365
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -392,7 +393,7 @@ result = my_function()`;
|
|
|
392
393
|
});
|
|
393
394
|
|
|
394
395
|
it("should handle invalid line numbers gracefully", () => {
|
|
395
|
-
const
|
|
396
|
+
const cid = cellId("cell1");
|
|
396
397
|
const code = `def my_function():
|
|
397
398
|
x = 1
|
|
398
399
|
return x`;
|
|
@@ -400,7 +401,7 @@ result = my_function()`;
|
|
|
400
401
|
const errorsObservable = createMockObservable<
|
|
401
402
|
TracebackInfo[] | undefined
|
|
402
403
|
>(undefined);
|
|
403
|
-
view = createEditor(code,
|
|
404
|
+
view = createEditor(code, cid, errorsObservable);
|
|
404
405
|
|
|
405
406
|
// Fold the function
|
|
406
407
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -415,7 +416,7 @@ result = my_function()`;
|
|
|
415
416
|
mockObservable.set([
|
|
416
417
|
{
|
|
417
418
|
kind: "cell",
|
|
418
|
-
cellId,
|
|
419
|
+
cellId: cid,
|
|
419
420
|
lineNumber: maxLine + 100, // Invalid line number
|
|
420
421
|
},
|
|
421
422
|
]);
|
|
@@ -438,7 +439,7 @@ result = my_function()`;
|
|
|
438
439
|
});
|
|
439
440
|
|
|
440
441
|
it("should unfold nested structures when error is inside", () => {
|
|
441
|
-
const
|
|
442
|
+
const cid = cellId("cell1");
|
|
442
443
|
const code = `def outer_function():
|
|
443
444
|
def inner_function():
|
|
444
445
|
x = 1
|
|
@@ -452,7 +453,7 @@ final = outer_function()`;
|
|
|
452
453
|
const errorsObservable = createMockObservable<
|
|
453
454
|
TracebackInfo[] | undefined
|
|
454
455
|
>(undefined);
|
|
455
|
-
view = createEditor(code,
|
|
456
|
+
view = createEditor(code, cid, errorsObservable);
|
|
456
457
|
|
|
457
458
|
// Fold the outer function (which contains the inner function)
|
|
458
459
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -474,7 +475,7 @@ final = outer_function()`;
|
|
|
474
475
|
mockObservable.set([
|
|
475
476
|
{
|
|
476
477
|
kind: "cell",
|
|
477
|
-
cellId,
|
|
478
|
+
cellId: cid,
|
|
478
479
|
lineNumber: 4,
|
|
479
480
|
},
|
|
480
481
|
]);
|
|
@@ -492,7 +493,7 @@ final = outer_function()`;
|
|
|
492
493
|
});
|
|
493
494
|
|
|
494
495
|
it("should handle errors being cleared and then re-added", () => {
|
|
495
|
-
const
|
|
496
|
+
const cid = cellId("cell1");
|
|
496
497
|
const code = `def my_function():
|
|
497
498
|
x = 1
|
|
498
499
|
y = 2
|
|
@@ -503,7 +504,7 @@ result = my_function()`;
|
|
|
503
504
|
const errorsObservable = createMockObservable<
|
|
504
505
|
TracebackInfo[] | undefined
|
|
505
506
|
>(undefined);
|
|
506
|
-
view = createEditor(code,
|
|
507
|
+
view = createEditor(code, cid, errorsObservable);
|
|
507
508
|
|
|
508
509
|
// Fold the function
|
|
509
510
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -517,7 +518,7 @@ result = my_function()`;
|
|
|
517
518
|
mockObservable.set([
|
|
518
519
|
{
|
|
519
520
|
kind: "cell",
|
|
520
|
-
cellId,
|
|
521
|
+
cellId: cid,
|
|
521
522
|
lineNumber: 2,
|
|
522
523
|
},
|
|
523
524
|
]);
|
|
@@ -545,7 +546,7 @@ result = my_function()`;
|
|
|
545
546
|
mockObservable.set([
|
|
546
547
|
{
|
|
547
548
|
kind: "cell",
|
|
548
|
-
cellId,
|
|
549
|
+
cellId: cid,
|
|
549
550
|
lineNumber: 3,
|
|
550
551
|
},
|
|
551
552
|
]);
|
|
@@ -562,7 +563,7 @@ result = my_function()`;
|
|
|
562
563
|
});
|
|
563
564
|
|
|
564
565
|
it("should unfold immediately when errors are set", () => {
|
|
565
|
-
const
|
|
566
|
+
const cid = cellId("cell1");
|
|
566
567
|
const code = `def my_function():
|
|
567
568
|
x = 1
|
|
568
569
|
y = 2
|
|
@@ -573,7 +574,7 @@ result = my_function()`;
|
|
|
573
574
|
const errorsObservable = createMockObservable<
|
|
574
575
|
TracebackInfo[] | undefined
|
|
575
576
|
>(undefined);
|
|
576
|
-
view = createEditor(code,
|
|
577
|
+
view = createEditor(code, cid, errorsObservable);
|
|
577
578
|
|
|
578
579
|
// Fold the function
|
|
579
580
|
// @ts-expect-error - foldCode accepts position as second arg at runtime
|
|
@@ -595,7 +596,7 @@ result = my_function()`;
|
|
|
595
596
|
mockObservable.set([
|
|
596
597
|
{
|
|
597
598
|
kind: "cell",
|
|
598
|
-
cellId,
|
|
599
|
+
cellId: cid,
|
|
599
600
|
lineNumber: 2,
|
|
600
601
|
},
|
|
601
602
|
]);
|