@marimo-team/islands 0.23.2-dev7 → 0.23.2-dev70
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/{ConnectedDataExplorerComponent-P92i6wYx.js → ConnectedDataExplorerComponent-BS9U2zaC.js} +68 -66
- package/dist/ErrorBoundary-Da4UeYxT.js +167 -0
- package/dist/{ImageComparisonComponent-HF4AY8_n.js → ImageComparisonComponent-DaocPIse.js} +1 -1
- package/dist/{Plot-CK0oVgQL.js → Plot-PIeIvFnD.js} +1 -1
- package/dist/{isArrayLikeObject-LXbTYiBa.js → _baseFor-BGiY-cm1.js} +43 -215
- package/dist/_baseUniq-CxZRxRRo.js +380 -0
- package/dist/{any-language-editor-BCvLfvzI.js → any-language-editor-BVR0l12r.js} +23 -22
- package/dist/apl-BKoVld9y.js +4 -0
- package/dist/{arc-DLJpPF9M.js → arc-CHF8PiiF.js} +2 -2
- package/dist/architecture-7HQA4BMR-D0JB_3hE.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-B3YQo9At.js → architectureDiagram-VXUJARFQ-BXQEUDtK.js} +19 -19
- package/dist/{arrays-beUWo8RF.js → arrays-CldYf7p7.js} +1 -1
- package/dist/asciiarmor-DQrKIjoo.js +4 -0
- package/dist/asn1-BZvnj0dq.js +4 -0
- package/dist/{blockDiagram-VD42YOAC-CpQ3TKEN.js → blockDiagram-VD42YOAC-DhJe-Y9i.js} +53 -53
- package/dist/brainfuck-D558nlUv.js +4 -0
- package/dist/{button-D1C3g5GI.js → button-CA5pI2YF.js} +2 -2
- package/dist/{c4Diagram-YG6GDRKO-CZSU4uqU.js → c4Diagram-YG6GDRKO-9dSfzOFR.js} +6 -6
- package/dist/{capabilities-BwpUgo4S.js → capabilities-6laDasij.js} +2 -2
- package/dist/{channel-X3JKk8gE.js → channel-MqYIiKgS.js} +1 -1
- package/dist/{chat-ui-Bi0ioKDx.js → chat-ui-CTt4WX0V.js} +2803 -2800
- package/dist/{check-BgrdTLuv.js → check-CFM2mVDr.js} +1 -1
- package/dist/{chunk-4BX2VUAB-C2skOn1Z.js → chunk-4BX2VUAB-BwfrWBqN.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-D5mClyDv.js → chunk-4F5CHEZ2-C6tO9vjs.js} +1 -1
- package/dist/{chunk-55IACEB6-DRsSqxbU.js → chunk-55IACEB6-D8THf2mi.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-VIref9gx.js → chunk-5FQGJX7Z-CO1e63h_.js} +5 -5
- package/dist/{chunk-ABZYJK2D-CZYCCtLy.js → chunk-ABZYJK2D-BrBb_0yY.js} +3 -3
- package/dist/{chunk-ATLVNIR6-DaOzLLgN.js → chunk-ATLVNIR6-D-0XqNah.js} +2 -2
- package/dist/{chunk-B2363JML-Br0eA2T3.js → chunk-B2363JML-Ds8wZXyP.js} +1 -1
- package/dist/{chunk-B4BG7PRW-4BjV11Br.js → chunk-B4BG7PRW-8iRKvugR.js} +7 -7
- package/dist/{chunk-CVBHYZKI-BXHgce-x.js → chunk-CVBHYZKI-B6xhgaBd.js} +1 -1
- package/dist/{chunk-DI55MBZ5-DITY3EyP.js → chunk-DI55MBZ5-C0_2D4m4.js} +6 -6
- package/dist/{chunk-EXTU4WIE-jUPSAk3i.js → chunk-EXTU4WIE-Jiw9ca1u.js} +2 -2
- package/dist/{chunk-FMBD7UC4-BjIaI-XO.js → chunk-FMBD7UC4-CHdus51S.js} +1 -1
- package/dist/{chunk-FRFDVMJY-DnEvEFRR.js → chunk-FRFDVMJY-BgQv1HBE.js} +1 -1
- package/dist/{chunk-HN2XXSSU-DAhNp1ig.js → chunk-HN2XXSSU-2Vfbq-kU.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-BcPEfxk_.js → chunk-JA3XYJ7Z-6wbaigKe.js} +3 -3
- package/dist/{chunk-JZLCHNYA-2bnLL3xL.js → chunk-JZLCHNYA-_rfptlUP.js} +6 -6
- package/dist/{chunk-MI3HLSF2-AKwFNP3m.js → chunk-MI3HLSF2-Do0-KRc0.js} +1 -1
- package/dist/{chunk-N4CR4FBY-CpZSuGSU.js → chunk-N4CR4FBY-DIZG9dVD.js} +7 -7
- package/dist/{chunk-PL6DKKU2-DnId6G-x.js → chunk-PL6DKKU2-DHfTUHy8.js} +1 -1
- package/dist/{chunk-QN33PNHL-B9p5ojHB.js → chunk-QN33PNHL-Cc64y40m.js} +2 -2
- package/dist/{chunk-QXUST7PY-Ch6F5Obl.js → chunk-QXUST7PY-BDG0-0Or.js} +10 -10
- package/dist/{chunk-QZHKN3VN-BK9tlbfw.js → chunk-QZHKN3VN-B_Mdb8GC.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-B0UOFJwq.js → chunk-S3R3BYOJ-DphMP0FA.js} +8 -8
- package/dist/{chunk-SJTYNZTY-BsBZnJUj.js → chunk-SJTYNZTY-Diciw4sx.js} +1 -1
- package/dist/{chunk-TCCFYFTB-Clbl-fTg.js → chunk-TCCFYFTB-d3HOqL2I.js} +1552 -345
- package/dist/{chunk-TQ3KTPDO-CFkSQ30e.js → chunk-TQ3KTPDO-CQfP9npd.js} +1 -1
- package/dist/{chunk-TZMSLE5B-D45397J2.js → chunk-TZMSLE5B-C9LUoYkc.js} +3 -3
- package/dist/{chunk-UMXZTB3W-D-A834Bq.js → chunk-UMXZTB3W-MSKeGL7W.js} +1 -1
- package/dist/classDiagram-2ON5EDUG-CBHMR6ZU.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-BsUtUGM_.js +30 -0
- package/dist/{clike-B90WKs4D.js → clike-sBZrGeF8.js} +1 -1
- package/dist/clojure-Cq8mTSrE.js +4 -0
- package/dist/{clone-DZFQCtFJ.js → clone-BuIIsfA8.js} +1 -1
- package/dist/cmake-D8HCovWK.js +4 -0
- package/dist/cobol-UolN-9iU.js +4 -0
- package/dist/{code-block-37QAKDTI-FQEoMOU1.js → code-block-37QAKDTI-0JNwiPGv.js} +2 -2
- package/dist/coffeescript-VdNuWrt5.js +4 -0
- package/dist/commonlisp-ALX7fpDc.js +4 -0
- package/dist/{constants-CvyfaCvs.js → constants-D0gkYoE2.js} +4 -4
- package/dist/{copy-Bp6CK_Fg.js → copy-TGGAUEWp.js} +2 -2
- package/dist/{cose-bilkent-S5V4N54A-DvCk1aXi.js → cose-bilkent-S5V4N54A-DXHZkJKX.js} +2 -2
- package/dist/crystal-PbyO9Q_s.js +4 -0
- package/dist/css-DFklJkr_.js +4 -0
- package/dist/cypher-BifNeYlv.js +4 -0
- package/dist/d-BA-JP4PJ.js +4 -0
- package/dist/{dagre-6UL2VRFP-OMItEBnY.js → dagre-6UL2VRFP-tH87fkPA.js} +102 -103
- package/dist/{dagre-QVd-lCXU.js → dagre-VYEPqXIV.js} +105 -39
- package/dist/{data-grid-overlay-editor-C_sKPpLu.js → data-grid-overlay-editor-CWUN78-s.js} +3 -3
- package/dist/{diagram-PSM6KHXK-CkKbohWI.js → diagram-PSM6KHXK-2VjPSCDn.js} +22 -22
- package/dist/{diagram-QEK2KX5R-DjUMpVcx.js → diagram-QEK2KX5R-CiLmNyta.js} +17 -17
- package/dist/{diagram-S2PKOQOG-b-c0d-wZ.js → diagram-S2PKOQOG-Zha_1CLx.js} +17 -17
- package/dist/diff-CtkDpav4.js +4 -0
- package/dist/dist-B--tLnAP.js +5 -0
- package/dist/{dist-tGk0aZ--.js → dist-B52GXZbd.js} +2 -2
- package/dist/{dist-Bfp1XXWt.js → dist-B8BjrFUE.js} +5 -5
- package/dist/dist-BEOU2g1b.js +8 -0
- package/dist/dist-BHnX0ia_.js +8 -0
- package/dist/{dist-DJKubHDd.js → dist-BK-3fF4P.js} +1 -1
- package/dist/{dist-Ci0CXEFt.js → dist-BTyJtnNg.js} +1 -1
- package/dist/{dist-CFKdzOIu.js → dist-BetEKbPG.js} +2 -2
- package/dist/{dist-DpkJHKB8.js → dist-BrBucRXs.js} +2 -2
- package/dist/{dist-CTwGwcQ8.js → dist-Brkazupz.js} +2 -2
- package/dist/dist-BuBwsFva.js +5 -0
- package/dist/dist-BzmEQ9u7.js +5 -0
- package/dist/{dist-ej6AQKaS.js → dist-C-J0pt5p.js} +1 -1
- package/dist/dist-C1Ap5CYU.js +5 -0
- package/dist/{dist-LhQNUe5A.js → dist-C474qFoq.js} +3 -3
- package/dist/{dist-DlSUOIm9.js → dist-C9fmTOin.js} +1 -1
- package/dist/{dist-CxZvoNao.js → dist-CCADb07R.js} +44 -31
- package/dist/{dist-BjDuO5JW.js → dist-CGLzXdrt.js} +1 -1
- package/dist/dist-CMjD5MQb.js +6 -0
- package/dist/{dist-BvhGByxL.js → dist-CNtV21T_.js} +4 -4
- package/dist/dist-ChC1BhqM.js +6 -0
- package/dist/dist-Cih01ssx.js +5 -0
- package/dist/{dist-CNF0QBLR.js → dist-CinA9Enb.js} +1 -1
- package/dist/dist-CqfONiY9.js +5 -0
- package/dist/{dist-DFK94vuS.js → dist-CtCY55Jf.js} +2 -2
- package/dist/{dist-VqF3W_ue.js → dist-CxdUraQr.js} +2 -2
- package/dist/{dist-DUFd1bhm.js → dist-CyFFzJTb.js} +1 -1
- package/dist/{dist-C4bq5Ioy.js → dist-D029TiHd.js} +2 -2
- package/dist/dist-D0iD0Fi9.js +5 -0
- package/dist/{dist-m9tsXsFf.js → dist-D9r7Cmw7.js} +2 -2
- package/dist/{dist-DD_cYHOl.js → dist-DBLeRrPp.js} +2 -2
- package/dist/{dist-DJ9F1eHs.js → dist-DGAfI2rB.js} +2 -2
- package/dist/{dist-BrxqmS9Q.js → dist-DZjQ_MBo.js} +4 -4
- package/dist/{dist-DLafRu9s.js → dist-DadjmS-4.js} +2 -2
- package/dist/{dist-Doy0mQDg.js → dist-DkC6YEo0.js} +2 -2
- package/dist/{dist-CIB8w0Fl.js → dist-DquyVv5H.js} +2 -2
- package/dist/dist-DtNLXm8d.js +5 -0
- package/dist/{dist-CTtLBPLZ.js → dist-ESg7xyoD.js} +4 -4
- package/dist/dist-FN0ZA_8F.js +8 -0
- package/dist/{dist-CcMfr7jD.js → dist-HVuryI1a.js} +1 -1
- package/dist/{dist-DGNtjMZu.js → dist-JEhxD_cn.js} +1 -1
- package/dist/{dist-B43sbpd0.js → dist-UcOPnRMa.js} +3 -3
- package/dist/dist-YP-G7W0f.js +8 -0
- package/dist/{dist-DbnBiLNH.js → dist-Yrfc6L0I.js} +3 -3
- package/dist/{dist--6TSlp8H.js → dist-Zn0KNbo9.js} +1 -1
- package/dist/{dist-DAfcmt-d.js → dist-nuW5EDYT.js} +2 -2
- package/dist/{dockerfile-DfXhjEUG.js → dockerfile-COvlVLcE.js} +1 -1
- package/dist/dtd-DW3_UFEG.js +4 -0
- package/dist/dylan-pDhodO2N.js +4 -0
- package/dist/ecl-BJT8-YD7.js +4 -0
- package/dist/eiffel-Dmns-9vS.js +4 -0
- package/dist/elm-Da4sO4Bz.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-CDhLaOZ1.js → erDiagram-Q2GNP2WA-biHZS05w.js} +15 -15
- package/dist/erlang-C-zBsDi7.js +4 -0
- package/dist/{error-banner-B_ioHva3.js → error-banner-DnBPzEWg.js} +3 -3
- package/dist/{esm-CD1iby2n.js → esm-CYEyrE3Y.js} +105 -105
- package/dist/esm-Dd1z1auZ.js +1171 -0
- package/dist/extends-CzJgxo2J.js +1645 -0
- package/dist/factor-4xPWlWB5.js +4 -0
- package/dist/{factor--4HHM8Rw.js → factor-C2GT7jfQ.js} +1 -1
- package/dist/flatten-CzBvFdvC.js +8 -0
- package/dist/{flowDiagram-NV44I4VS-BDi4O4CL.js → flowDiagram-NV44I4VS-CWWlUpBR.js} +17 -17
- package/dist/formats-Dh5M1ZRs.js +79 -0
- package/dist/forth-l-c75zSd.js +4 -0
- package/dist/fortran-DIujSODW.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-BpZE6kVp.js → ganttDiagram-JELNMOA3-D7B2c4Z9.js} +10 -10
- package/dist/gas-CXnG5g_b.js +4 -0
- package/dist/gherkin-VPeqd4-X.js +4 -0
- package/dist/{gitGraph-G5XIXVHT-B_c6xFJv.js → gitGraph-G5XIXVHT-BdepdFa_.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-iQnXzbPM.js → gitGraphDiagram-V2S2FVAM-CtLvNR1S.js} +17 -17
- package/dist/{glide-data-editor-BFqEJGJW.js → glide-data-editor-DXti2axL.js} +591 -583
- package/dist/graphlib-CVPKjKCS.js +359 -0
- package/dist/groovy-CphhZQgg.js +4 -0
- package/dist/{hasIn-DnfJcYpY.js → hasIn-COs6vImh.js} +3 -3
- package/dist/haskell-CCvlS5Iq.js +4 -0
- package/dist/haxe-C_bi66fP.js +5 -0
- package/dist/{process-output-H_7QTreh.js → html-to-image-BdsDysfl.js} +2521 -2639
- package/dist/idl-1DcP4Dm8.js +4 -0
- package/dist/{info-VBDWY6EO-BTyzxmhr.js → info-VBDWY6EO--JNA2rNu.js} +3 -3
- package/dist/infoDiagram-HS3SLOUP-BbZyOxsP.js +30 -0
- package/dist/{input-CSVEkmaZ.js → input-Drx1pguW.js} +70 -70
- package/dist/{isEmpty-B7FX9wKt.js → isEmpty-Dd8mx_WL.js} +9 -9
- package/dist/{isSymbol-DCbjQG_U.js → isSymbol-BvIfMnn6.js} +1 -1
- package/dist/javascript-DUIGhBvO.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-ClPC94aN.js → journeyDiagram-XKPGCS4Q-BU2mjjzl.js} +7 -7
- package/dist/julia-Cs2G4PQi.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7-DHEAKdZt.js → kanban-definition-3W4ZIXB7-BlmczUuw.js} +12 -12
- package/dist/{katex-CkLtKXwv.js → katex-qPqrBHZ8.js} +1 -1
- package/dist/label-BCWi-Oqu.js +31 -0
- package/dist/{line-PAEmCpyD.js → line-BWRi3U3S.js} +3 -3
- package/dist/{linear-v57w-fIs.js → linear-DnHwODZa.js} +4 -4
- package/dist/livescript-DMtVFaAN.js +4 -0
- package/dist/{loader-ZFbGsMN1.js → loader-BvW0-YWZ.js} +2 -2
- package/dist/lua-BAoLtdJg.js +4 -0
- package/dist/main.js +16437 -39681
- package/dist/mathematica-C_NoFtbo.js +4 -0
- package/dist/mbox-DcFJFYrH.js +4 -0
- package/dist/{memoize-CSTI9eOX.js → memoize-C9ltv0Cw.js} +1 -1
- package/dist/merge-CHn7Yx0N.js +222 -0
- package/dist/mermaid-4DMBBIKO-CG1ECj5W.js +6 -0
- package/dist/{mermaid-BbhZNQeB.js → mermaid-BagLPXm9.js} +50 -50
- package/dist/{mermaid-parser.core-ntCgyx0x.js → mermaid-parser.core-CleJseNW.js} +8 -8
- package/dist/{mhchem-BuY5LDSq.js → mhchem-BwoRNwg_.js} +1 -1
- package/dist/min-BNz2lZfk.js +38 -0
- package/dist/{mindmap-definition-VGOIOE7T-CxEUZZvY.js → mindmap-definition-VGOIOE7T-CcSYqYP9.js} +14 -14
- package/dist/mirc-71dccf_u.js +4 -0
- package/dist/mllike-CWcOFVDq.js +6 -0
- package/dist/modelica-Ape2VXxx.js +4 -0
- package/dist/mscgen-Cc6TwbSN.js +6 -0
- package/dist/mumps-h-ZbdkJ9.js +4 -0
- package/dist/now-Sgq5m3D-.js +31 -0
- package/dist/{nsis-B6EN9LWI.js → nsis-B5K1qoyo.js} +1 -1
- package/dist/nsis-C0p3m7JW.js +4 -0
- package/dist/ntriples-c9lEeT5w.js +4 -0
- package/dist/{number-overlay-editor-B02-t7Ar.js → number-overlay-editor-_GnlYFHC.js} +1 -1
- package/dist/octave-DzEgB_74.js +4 -0
- package/dist/{once-C_TIu-kR.js → once-rJImu7SE.js} +1 -1
- package/dist/{ordinal-D7fa8Sey.js → ordinal-2jIulmcR.js} +1 -1
- package/dist/oz-CAxvHkyQ.js +4 -0
- package/dist/{packet-DYOGHKS2-BhvnpoGi.js → packet-DYOGHKS2-CBxXGWNr.js} +3 -3
- package/dist/pascal-BJzu1sgP.js +4 -0
- package/dist/perl--IrOzZ2Z.js +4 -0
- package/dist/pick-CRAXxDYn.js +43 -0
- package/dist/{pie-VRWISCQL-dILuA3iG.js → pie-VRWISCQL-Bmdnqjip.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-U3LrUqAS.js → pieDiagram-ADFJNKIX-DNyLF5H2.js} +22 -22
- package/dist/pig-CiBKKNhC.js +4 -0
- package/dist/powershell-KY0j6Qop.js +4 -0
- package/dist/{precisionRound-CGLoV26P.js → precisionRound-CnHPY_5v.js} +1 -1
- package/dist/process-output-COL2Pf5I.js +109 -0
- package/dist/properties-BW8q3ziV.js +4 -0
- package/dist/protobuf-BGaeuTGV.js +4 -0
- package/dist/pug-DjOKK-4J.js +4 -0
- package/dist/{pug-xrm7jQ2R.js → pug-tjbzJCFk.js} +1 -1
- package/dist/puppet-DWm2o6zX.js +4 -0
- package/dist/{purify.es-hTCfRGdl.js → purify.es-DT70lfR0.js} +85 -81
- package/dist/python-Bp2gezZy.js +4 -0
- package/dist/q-DljPshos.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-BVWuq-3R.js → quadrantDiagram-AYHSOK5B-rXwjifrj.js} +5 -5
- package/dist/r-BajPMnEu.js +4 -0
- package/dist/{radar-ZZBFDIW7-DwFrOJDj.js → radar-ZZBFDIW7-BmCWDffL.js} +3 -3
- package/dist/{react-vega-DBwal82H.js → react-vega-C2Rtgjb4.js} +19 -19
- package/dist/react-vega-jy3CfYys.js +9 -0
- package/dist/{requirementDiagram-UZGBJVZJ-D0zpQnKC.js → requirementDiagram-UZGBJVZJ-DBdrMVbs.js} +14 -14
- package/dist/reveal-component-Cd5Y35Ny.js +4549 -0
- package/dist/rpm-BKx-ZZ62.js +5 -0
- package/dist/ruby-DJq_HNKc.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-CExy1joT.js → sankeyDiagram-TZEHDZUN-CxmzalGv.js} +5 -5
- package/dist/sas-WANvpcOU.js +4 -0
- package/dist/scheme-CliBbhGF.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-D1BJxLjH.js → sequenceDiagram-WL72ISMW-CVCDsJ9h.js} +8 -8
- package/dist/shell-BwhrNUvM.js +4 -0
- package/dist/sieve-BIVePvMp.js +4 -0
- package/dist/slide-BEerfanN.js +23928 -0
- package/dist/smalltalk-D6G48JmY.js +4 -0
- package/dist/sparql-jjc3BmEP.js +4 -0
- package/dist/{spec-3EPbPQZH.js → spec-BKWq0wn2.js} +8 -152
- package/dist/{src-DbP20yFZ.js → src-BY0BGg6V.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-B1S8jGMn.js → stateDiagram-FKZM4ZOC-D_2djEhW.js} +19 -19
- package/dist/stateDiagram-v2-4FDKWEC3-Cv9Av10H.js +29 -0
- package/dist/{step-qd10PbTJ.js → step-DGAGWg3y.js} +1 -1
- package/dist/stex-ChDHQs3R.js +4 -0
- package/dist/{label-BebYlsDV.js → strings-B_FOH6eV.js} +57 -81
- package/dist/style.css +1 -1
- package/dist/stylus-WPBPQ4PE.js +4 -0
- package/dist/swift-O1Qy6iCm.js +4 -0
- package/dist/{slides-component-DLxprlqo.js → swiper-component-KkEVUDd3.js} +5 -5
- package/dist/tcl-BAFdhvsi.js +4 -0
- package/dist/textile-DFuzhNLG.js +4 -0
- package/dist/{time-Bdnxi22U.js → time-CMdrp3hw.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-BDT9JAmn.js → timeline-definition-IT6M3QCI-E4NzxCs3.js} +4 -4
- package/dist/{toDate-B1AzlBoW.js → toDate-yqOcZ_tY.js} +4 -4
- package/dist/toml-DRSTeely.js +4 -0
- package/dist/{tooltip-DwNnFsxZ.js → tooltip-B0mtKTXm.js} +4 -4
- package/dist/{treemap-GDKQZRPO-bx2ngsgN.js → treemap-GDKQZRPO-CoKHPxa7.js} +3 -3
- package/dist/troff-B_ZjwBW0.js +4 -0
- package/dist/ttcn-CAyiB3ic.js +4 -0
- package/dist/ttcn-cfg-BS5_BGBJ.js +4 -0
- package/dist/turtle-CUBEDy3E.js +4 -0
- package/dist/types-DBtDeUKD.js +38 -0
- package/dist/{useAsyncData-BL98MPIy.js → useAsyncData-CKYzhCis.js} +2 -2
- package/dist/useDateFormatter-B3mCQMP3.js +150 -0
- package/dist/useDeepCompareMemoize-je76AJS_.js +11 -0
- package/dist/{useIframeCapabilities-CsTUYYj7.js → useIframeCapabilities-DbdLoEDm.js} +1 -1
- package/dist/{useLifecycle-DrGGIsgp.js → useLifecycle-smVfjLNI.js} +4 -4
- package/dist/{useTheme-CzwDokKe.js → useTheme-CX9pPLUH.js} +3 -3
- package/dist/vb-DY9S6-U2.js +4 -0
- package/dist/vbscript-gaHC39Jq.js +4 -0
- package/dist/{vega-component-KBJXEDZz.js → vega-component-CjMUUeEZ.js} +18 -17
- package/dist/{vega-loader.browser-DqEcFOPD.js → vega-loader.browser-3_z8GoFC.js} +3 -3
- package/dist/velocity-TfCOtJZ_.js +4 -0
- package/dist/verilog-c2JOX8mv.js +4 -0
- package/dist/vhdl-dHBirRiO.js +4 -0
- package/dist/webidl-Bauj-i07.js +4 -0
- package/dist/xquery-CtaEAOt8.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-CuAZiqHS.js → xychartDiagram-PRI3JC2R-CuxTvjw5.js} +13 -13
- package/dist/yacas-BZ85agQP.js +4 -0
- package/dist/z80-hCgR-L4U.js +4 -0
- package/dist/{zod-W5ZEjzaE.js → zod-BxdsqRPd.js} +3 -3
- package/package.json +4 -2
- package/src/__mocks__/requests.ts +1 -0
- package/src/components/data-table/TableBottomBar.tsx +5 -1
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +14 -14
- package/src/components/data-table/__tests__/columns.test.tsx +104 -0
- package/src/components/data-table/__tests__/filters.test.ts +304 -0
- package/src/components/data-table/__tests__/pagination.test.tsx +46 -132
- package/src/components/data-table/__tests__/sentinel-cell.test.tsx +171 -0
- package/src/components/data-table/__tests__/types.test.ts +34 -1
- package/src/components/data-table/__tests__/utils.test.ts +227 -0
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-header.tsx +11 -2
- package/src/components/data-table/column-summary/chart-spec-model.tsx +6 -3
- package/src/components/data-table/column-summary/column-summary.tsx +1 -1
- package/src/components/data-table/columns.tsx +48 -5
- package/src/components/data-table/export-actions.tsx +62 -23
- package/src/components/data-table/filters.ts +87 -33
- package/src/components/data-table/pagination.tsx +189 -76
- package/src/components/data-table/schemas.ts +8 -1
- package/src/components/data-table/sentinel-cell.tsx +118 -0
- package/src/components/data-table/types.ts +32 -11
- package/src/components/data-table/utils.ts +119 -1
- package/src/components/datasources/__tests__/missing-package-prompt.test.tsx +103 -0
- package/src/components/datasources/missing-package-prompt.tsx +49 -0
- package/src/components/editor/actions/useNotebookActions.tsx +12 -0
- package/src/components/editor/cell/code/cell-editor.tsx +1 -0
- package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +33 -0
- package/src/components/editor/file-tree/file-explorer.tsx +8 -33
- package/src/components/editor/file-tree/requesting-tree.tsx +41 -0
- package/src/components/editor/file-tree/state.tsx +1 -0
- package/src/components/editor/renderers/slides-layout/slides-layout.tsx +9 -17
- package/src/components/home/components.tsx +7 -0
- package/src/components/slides/reveal-component.tsx +109 -0
- package/src/components/slides/reveal-slides.css +42 -0
- package/src/components/slides/slides.css +0 -65
- package/src/components/slides/{slides-component.tsx → swiper-component.tsx} +1 -0
- package/src/components/slides/swiper-slides.css +64 -0
- package/src/components/static-html/static-banner.tsx +23 -14
- package/src/components/ui/toast.tsx +16 -7
- package/src/core/cells/__tests__/apply-transaction.test.ts +483 -0
- package/src/core/cells/__tests__/cells.test.ts +110 -0
- package/src/core/cells/__tests__/logs.test.ts +101 -0
- package/src/core/cells/cells.ts +18 -0
- package/src/core/cells/document-changes.ts +34 -1
- package/src/core/cells/logs.ts +9 -1
- package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +4 -14
- package/src/core/codemirror/cells/extensions.ts +0 -4
- package/src/core/codemirror/keymaps/keymaps.ts +69 -2
- package/src/core/constants.ts +1 -0
- package/src/core/islands/bridge.ts +1 -0
- package/src/core/mode.ts +10 -1
- package/src/core/network/requests-lazy.ts +1 -0
- package/src/core/network/requests-network.ts +8 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.tsx +1 -0
- package/src/core/network/types.ts +3 -0
- package/src/core/wasm/__tests__/bridge.test.ts +113 -0
- package/src/core/wasm/bridge.ts +13 -2
- package/src/core/wasm/worker/types.ts +3 -0
- package/src/core/wasm/worker/worker.ts +1 -0
- package/src/plugins/core/__test__/trusted-url.test.ts +45 -1
- package/src/plugins/core/trusted-url.ts +27 -2
- package/src/plugins/impl/DataEditorPlugin.tsx +7 -3
- package/src/plugins/impl/DataTablePlugin.tsx +7 -20
- package/src/plugins/impl/FileBrowserPlugin.tsx +81 -81
- package/src/plugins/impl/TabsPlugin.tsx +18 -12
- package/src/plugins/impl/data-editor/__tests__/data-utils.test.ts +147 -149
- package/src/plugins/impl/data-editor/data-utils.ts +12 -11
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +4 -4
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +4 -4
- package/src/plugins/impl/data-frames/schema.ts +41 -9
- package/src/plugins/impl/data-frames/utils/operators.ts +2 -0
- package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +16 -0
- package/src/plugins/layout/carousel/CarouselPlugin.tsx +3 -1
- package/dist/_basePickBy-Sow3pJjS.js +0 -41
- package/dist/_baseUniq-C87CckHL.js +0 -518
- package/dist/apl-C1bki_dE.js +0 -4
- package/dist/architecture-7HQA4BMR-BHdkAMvZ.js +0 -6
- package/dist/asciiarmor-BdlkCCRr.js +0 -4
- package/dist/asn1-CvE30hox.js +0 -4
- package/dist/brainfuck-BalwWy1a.js +0 -4
- package/dist/classDiagram-2ON5EDUG-C8-zE3Zv.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-DrmbGANl.js +0 -30
- package/dist/clojure-CUC2I1hM.js +0 -4
- package/dist/cmake-8PcMxXnB.js +0 -4
- package/dist/cobol-DkkkDz5v.js +0 -4
- package/dist/coffeescript-CCupxOZf.js +0 -4
- package/dist/commonlisp-DhUfGX6b.js +0 -4
- package/dist/crystal-DSaw6rFQ.js +0 -4
- package/dist/css-D4QDewkG.js +0 -4
- package/dist/cypher-CrYVqw_F.js +0 -4
- package/dist/d-Cr3H3pPx.js +0 -4
- package/dist/diff-ODiZJGls.js +0 -4
- package/dist/dist-7K5doRvB.js +0 -6
- package/dist/dist-B6I_A2-E.js +0 -8
- package/dist/dist-BEQsmaZY.js +0 -5
- package/dist/dist-BasY2RHp.js +0 -8
- package/dist/dist-Bosc00dY.js +0 -5
- package/dist/dist-CQMZOn-_.js +0 -8
- package/dist/dist-CViQhWZ8.js +0 -5
- package/dist/dist-Cz6rLfwY.js +0 -5
- package/dist/dist-D8eq8st3.js +0 -6
- package/dist/dist-DM1UDXdl.js +0 -5
- package/dist/dist-DNrtWPgS.js +0 -5
- package/dist/dist-V7q2qnpA.js +0 -5
- package/dist/dist-a5_hPgu2.js +0 -8
- package/dist/dist-uVyZcV1-.js +0 -5
- package/dist/dtd-C-t2Rk7F.js +0 -4
- package/dist/dylan-B4ctBLGp.js +0 -4
- package/dist/ecl-DqWfymni.js +0 -4
- package/dist/eiffel-DjBKKAr7.js +0 -4
- package/dist/elm--fxeC0FV.js +0 -4
- package/dist/erlang-CaKXCX6H.js +0 -4
- package/dist/esm-CDHI9cuO.js +0 -2805
- package/dist/factor-DlLO5EFS.js +0 -4
- package/dist/forth-rOO6LVj_.js +0 -4
- package/dist/fortran-CUg15VGR.js +0 -4
- package/dist/gas-BMRJspiW.js +0 -4
- package/dist/gherkin-DRxzijZU.js +0 -4
- package/dist/graphlib-BV1_gi0C.js +0 -226
- package/dist/groovy-BmrQ8pUP.js +0 -4
- package/dist/haskell-BuaYfKOz.js +0 -4
- package/dist/haxe-DcH9eA0a.js +0 -5
- package/dist/idl-DGlcm4Ls.js +0 -4
- package/dist/infoDiagram-HS3SLOUP-OYrX6uO3.js +0 -30
- package/dist/javascript-CeTk7rzr.js +0 -4
- package/dist/julia-BoP_q1gm.js +0 -4
- package/dist/livescript-B7IMN-ba.js +0 -4
- package/dist/lua-q1InavKb.js +0 -4
- package/dist/mathematica-DvR8-_EI.js +0 -4
- package/dist/mbox-7h5MNBS_.js +0 -4
- package/dist/merge-CVhG7q_o.js +0 -51
- package/dist/mermaid-4DMBBIKO-BjtqcdX4.js +0 -6
- package/dist/min-Ds3gG0Ff.js +0 -96
- package/dist/mirc-D-XM8A5c.js +0 -4
- package/dist/mllike-BQGkkbmf.js +0 -6
- package/dist/modelica-D_yRj_WU.js +0 -4
- package/dist/mscgen-B-rltAjp.js +0 -6
- package/dist/mumps-2kh8TU2b.js +0 -4
- package/dist/now-nrrrOr01.js +0 -7
- package/dist/nsis-CtusEqwb.js +0 -4
- package/dist/ntriples-BdAXw6zV.js +0 -4
- package/dist/octave-CsNFmVp5.js +0 -4
- package/dist/oz-odIXCrKd.js +0 -4
- package/dist/pascal-B9Mfk3Fo.js +0 -4
- package/dist/perl-C48inLcz.js +0 -4
- package/dist/pig-uwRtAssU.js +0 -4
- package/dist/powershell-CXqlca-i.js +0 -4
- package/dist/properties-D6Zu1rpK.js +0 -4
- package/dist/protobuf-BlNNWZaR.js +0 -4
- package/dist/pug-DytcK7bv.js +0 -4
- package/dist/puppet-lJ8Ok3iY.js +0 -4
- package/dist/python-cMaF7kUp.js +0 -4
- package/dist/q-Dgt2HYQh.js +0 -4
- package/dist/r-Bm4S4awf.js +0 -4
- package/dist/range-fJeId9Ri.js +0 -30
- package/dist/react-vega-BkjdpVsR.js +0 -9
- package/dist/rpm-_8LbzMVc.js +0 -5
- package/dist/ruby-Cr8IJ5VZ.js +0 -4
- package/dist/sas-CFcSfo2_.js +0 -4
- package/dist/scheme-N4XRoKgc.js +0 -4
- package/dist/shell-B4L7f_ds.js +0 -4
- package/dist/sieve-UI6J3Gm0.js +0 -4
- package/dist/smalltalk-BuaPZAZU.js +0 -4
- package/dist/sparql-1rKrq463.js +0 -4
- package/dist/stateDiagram-v2-4FDKWEC3-BH5ozUbc.js +0 -29
- package/dist/stex-CQDv3aS8.js +0 -4
- package/dist/stylus-DvSovJEP.js +0 -4
- package/dist/swift-D-_E7Yyb.js +0 -4
- package/dist/tcl-Di5sAVHN.js +0 -4
- package/dist/textile-Benwt66z.js +0 -4
- package/dist/toNumber-55tjPCWr.js +0 -28
- package/dist/toml-CeOvPOkY.js +0 -4
- package/dist/troff-DJN9hfgu.js +0 -4
- package/dist/ttcn-DQW2Psjf.js +0 -4
- package/dist/ttcn-cfg-zFG_MNpg.js +0 -4
- package/dist/turtle-DHRyNlSc.js +0 -4
- package/dist/types-pwjdK009.js +0 -202
- package/dist/useDeepCompareMemoize-CsyOnnjc.js +0 -85
- package/dist/vb-CXWH9DD-.js +0 -4
- package/dist/vbscript-qr8qVck5.js +0 -4
- package/dist/velocity-C_9pUJRx.js +0 -4
- package/dist/verilog-DxBstgBa.js +0 -4
- package/dist/vhdl-odUxAbE6.js +0 -4
- package/dist/webidl-Dfn5Rku4.js +0 -4
- package/dist/xquery-CrJs6SXr.js +0 -4
- package/dist/yacas-B-uDDLZe.js +0 -4
- package/dist/z80-51gxgAXE.js +0 -4
- /package/dist/{apl-Oc3bL26_.js → apl-Dt8GMXYg.js} +0 -0
- /package/dist/{array-ByIS7m3B.js → array-B-MVxRIF.js} +0 -0
- /package/dist/{asciiarmor-DTbPh2VI.js → asciiarmor-CitDQ85h.js} +0 -0
- /package/dist/{asn1-CGhwu1Ri.js → asn1-abrf9SMK.js} +0 -0
- /package/dist/{asterisk-BApaB_8m.js → asterisk-BUZwqih-.js} +0 -0
- /package/dist/{brainfuck-CA0L8lRq.js → brainfuck-BL-Boof0.js} +0 -0
- /package/dist/{chunk-DR5Q36YT-C40cYcy5.js → chunk-DR5Q36YT-CP69aZS_.js} +0 -0
- /package/dist/{click-outside-container-D3t6KDni.js → click-outside-container-BZgN7xS_.js} +0 -0
- /package/dist/{clike-CEtUBPHD.js → clike-RWg7anhx.js} +0 -0
- /package/dist/{clojure-BszjvdGo.js → clojure-DaojKHow.js} +0 -0
- /package/dist/{clsx-CwTY0BxM.js → clsx-CyyyQ8Ue.js} +0 -0
- /package/dist/{cmake-B2Gvps8b.js → cmake-DN-_v0XE.js} +0 -0
- /package/dist/{cobol-DuMch8nn.js → cobol-C3VpMyux.js} +0 -0
- /package/dist/{coffeescript-L9aKXVsJ.js → coffeescript-DIkz3Tbt.js} +0 -0
- /package/dist/{colors-IJ-2cn2o.js → colors-Cn2p_FA3.js} +0 -0
- /package/dist/{common-keywords-CsU75Ked.js → common-keywords-hbLeU7VU.js} +0 -0
- /package/dist/{commonlisp-CrtdssxB.js → commonlisp-CB1boOiP.js} +0 -0
- /package/dist/{crystal-vvNY0LpY.js → crystal-DI2oCml6.js} +0 -0
- /package/dist/{css-B1GdzqT1.js → css-BdEVwQDV.js} +0 -0
- /package/dist/{cypher-BtZvV7bW.js → cypher-BNHToqxU.js} +0 -0
- /package/dist/{cytoscape.esm-CRfNlsPy.js → cytoscape.esm-WbbDoCfu.js} +0 -0
- /package/dist/{d-B0UN3V-Z.js → d-D7we7I1b.js} +0 -0
- /package/dist/{defaultLocale-qS7DaAmi.js → defaultLocale-BpsHxBd7.js} +0 -0
- /package/dist/{defaultLocale-Bxoo2-30.js → defaultLocale-DoeErsX2.js} +0 -0
- /package/dist/{diff-DOpgjj1W.js → diff-Cia6fzjN.js} +0 -0
- /package/dist/{dist-BjWd_Ei9.js → dist-C89sHDXk.js} +0 -0
- /package/dist/{dtd-Ctnjxrle.js → dtd-H4Hubdwp.js} +0 -0
- /package/dist/{duckdb-keywords-DjrZdCO2.js → duckdb-keywords-CZ_ZTscu.js} +0 -0
- /package/dist/{dylan-DFXkoaZy.js → dylan-fVO6rnq3.js} +0 -0
- /package/dist/{ebnf-XJCIl_em.js → ebnf-WEXPLEWb.js} +0 -0
- /package/dist/{ecl-C1NExZip.js → ecl-B94VPjNR.js} +0 -0
- /package/dist/{eiffel-uXVGgleg.js → eiffel-C_R6TusS.js} +0 -0
- /package/dist/{elm-CBOFnnib.js → elm-DzCHbO2g.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-CJVjyntJ.js → emotion-is-prop-valid.esm-DtW2o230.js} +0 -0
- /package/dist/{erlang-DMnrT8XK.js → erlang-BGNkx6JU.js} +0 -0
- /package/dist/{esm-D4gzqVRq.js → esm-Bb_hbWan.js} +0 -0
- /package/dist/{fcl-fh4Mj0bc.js → fcl-B_Gv5Jfx.js} +0 -0
- /package/dist/{forth-DDpxS4nw.js → forth-Bybw0cJ7.js} +0 -0
- /package/dist/{fortran-B6uYqQMz.js → fortran-C6PoCLkI.js} +0 -0
- /package/dist/{gas-BKnWzuFz.js → gas-BBlhenj4.js} +0 -0
- /package/dist/{gherkin-pBt0wT4X.js → gherkin-NXtNG85X.js} +0 -0
- /package/dist/{groovy-DKsn4ppB.js → groovy-BoFYK9xM.js} +0 -0
- /package/dist/{haskell-BJVBJQcy.js → haskell-BtBdvQ1n.js} +0 -0
- /package/dist/{haxe-rLN5UZU5.js → haxe-D--o6dr0.js} +0 -0
- /package/dist/{http-CbJFDV7c.js → http-Dc2fv19V.js} +0 -0
- /package/dist/{idl-B4mwMAo-.js → idl-AqTq5l7e.js} +0 -0
- /package/dist/{init-Cge3yl4r.js → init-D-g0ONX1.js} +0 -0
- /package/dist/{invariant-e8eBgdux.js → invariant-UcGKQEhF.js} +0 -0
- /package/dist/{javascript-Hf2NLNC0.js → javascript-DvwNVye9.js} +0 -0
- /package/dist/{jsx-runtime-9hcJiI23.js → jsx-runtime-COBk7ree.js} +0 -0
- /package/dist/{julia-GGpx21YN.js → julia-DoKiagZC.js} +0 -0
- /package/dist/{katex-CQ_cP8Uu.js → katex-B7pMJpE0.js} +0 -0
- /package/dist/{livescript-CSvXMspZ.js → livescript-DxBZMiWB.js} +0 -0
- /package/dist/{lua-CVMR5LMW.js → lua-DmS_0NTu.js} +0 -0
- /package/dist/{main-XimWhSi_.js → main-CThhXnXU.js} +0 -0
- /package/dist/{math-CEWMqgbD.js → math-BYK36kWZ.js} +0 -0
- /package/dist/{mathematica-JENNt-p4.js → mathematica-ChlDFeIC.js} +0 -0
- /package/dist/{mbox-mzifoc8E.js → mbox-CguZuODr.js} +0 -0
- /package/dist/{micromark-factory-space-BHslBP9f.js → micromark-factory-space-CwHmg6iz.js} +0 -0
- /package/dist/{mirc-BXoiItvN.js → mirc-CFtY8dqz.js} +0 -0
- /package/dist/{mllike-H-KR9OuH.js → mllike-C0EJrEOk.js} +0 -0
- /package/dist/{modelica-B6Hm3mMl.js → modelica-C1kO1nfS.js} +0 -0
- /package/dist/{mscgen-D8TF_Hei.js → mscgen-DEYdr7AY.js} +0 -0
- /package/dist/{mumps-CD-kNPt4.js → mumps-B3NVJs2V.js} +0 -0
- /package/dist/{nginx-9EZQIKsh.js → nginx-ComVAAGN.js} +0 -0
- /package/dist/{node-sql-parser-DIe6Cq_-.js → node-sql-parser-DNGGJ-Rw.js} +0 -0
- /package/dist/{ntriples-DgnpxU40.js → ntriples-DHol9X9H.js} +0 -0
- /package/dist/{octave-CkobqyVm.js → octave-CYGz0bfo.js} +0 -0
- /package/dist/{oz-ChDLd9tS.js → oz-kPxb2ni5.js} +0 -0
- /package/dist/{pascal-CvlkwK7E.js → pascal-bZ0yrJKy.js} +0 -0
- /package/dist/{path-B-82hpi8.js → path-Du6n3sOU.js} +0 -0
- /package/dist/{perl-BNEFTNbM.js → perl-z4hvqyqz.js} +0 -0
- /package/dist/{pig-Cd1DMS7P.js → pig-DZO8QDF9.js} +0 -0
- /package/dist/{powershell-CPxA0zpc.js → powershell-BSuaDQEC.js} +0 -0
- /package/dist/{properties-BaFBm-Xa.js → properties-BXhGLlIx.js} +0 -0
- /package/dist/{protobuf-BQV_-X0H.js → protobuf-DM6iybWV.js} +0 -0
- /package/dist/{puppet-LXLST0mx.js → puppet-Bn05sQT8.js} +0 -0
- /package/dist/{python-DLjLzX4k.js → python-Cvnhm0g7.js} +0 -0
- /package/dist/{q-DswTX1Y9.js → q-B9V8hzex.js} +0 -0
- /package/dist/{r-CO7NpMwE.js → r-Cf0gFqmq.js} +0 -0
- /package/dist/{range-BYuZFTbA.js → range-BOiA8qqU.js} +0 -0
- /package/dist/{react-dom-D5FDLRUB.js → react-dom-BWRJ_g_k.js} +0 -0
- /package/dist/{rpm-BlmEDT6r.js → rpm-D-LMkTV1.js} +0 -0
- /package/dist/{ruby-BTPKgeZZ.js → ruby-DeuPikpK.js} +0 -0
- /package/dist/{sas-DTDTiNO8.js → sas-C9tjgAo9.js} +0 -0
- /package/dist/{scheme-UzAAg4GJ.js → scheme-D1_bUF0G.js} +0 -0
- /package/dist/{shell-DQ0hQCsB.js → shell-CJBmnks3.js} +0 -0
- /package/dist/{sieve-BVyYIx9u.js → sieve-1fSV75CF.js} +0 -0
- /package/dist/{simple-mode-Dryu-fC9.js → simple-mode-B90Wdavj.js} +0 -0
- /package/dist/{smalltalk-DAdMAHTu.js → smalltalk-sZNPD0HO.js} +0 -0
- /package/dist/{solr-Bn6k51kO.js → solr-DTkyqJ-Z.js} +0 -0
- /package/dist/{sparql-Bi7quYgw.js → sparql-oHc1nm77.js} +0 -0
- /package/dist/{spreadsheet-UpVklYg7.js → spreadsheet-CER0raqY.js} +0 -0
- /package/dist/{sql-qyORs189.js → sql-ByOoEONQ.js} +0 -0
- /package/dist/{stex-D887Ylhf.js → stex-DrxP7bb3.js} +0 -0
- /package/dist/{stylus-jhpzcQ6Y.js → stylus-KzkX6zRB.js} +0 -0
- /package/dist/{swift-BrO8qThZ.js → swift-DqVxZvKo.js} +0 -0
- /package/dist/{tcl-s5QI5gv3.js → tcl-BtWSwXfA.js} +0 -0
- /package/dist/{textile-ClhvJrxM.js → textile-CWDbn9Ql.js} +0 -0
- /package/dist/{tiddlywiki-CmAAqw9M.js → tiddlywiki-Cr9xyOY1.js} +0 -0
- /package/dist/{tiki-DzCRe_s0.js → tiki-D5JONyfZ.js} +0 -0
- /package/dist/{timer-BPKOAfmx.js → timer-D7JVdX9U.js} +0 -0
- /package/dist/{toml-TFa3EJQE.js → toml-BfehlgmL.js} +0 -0
- /package/dist/{treemap-CmLtUuWe.js → treemap-qFGzn7xk.js} +0 -0
- /package/dist/{troff-SqLg0heF.js → troff-BZBk6AAu.js} +0 -0
- /package/dist/{ttcn-Cfrap7HJ.js → ttcn-DVwvXg0_.js} +0 -0
- /package/dist/{ttcn-cfg-Dopc-iwE.js → ttcn-cfg-gjbVLf1L.js} +0 -0
- /package/dist/{turtle-Dt52DvVH.js → turtle-CgxKXorV.js} +0 -0
- /package/dist/{vb-D1pAvfDe.js → vb-B9kSwTdM.js} +0 -0
- /package/dist/{vbscript-DZ7RBxn5.js → vbscript-DrUKSCdb.js} +0 -0
- /package/dist/{velocity-Csau7eZy.js → velocity-AlMYTnMy.js} +0 -0
- /package/dist/{verilog-gXlZACs5.js → verilog-DLUaM05j.js} +0 -0
- /package/dist/{vhdl-NaUWbI1B.js → vhdl-DUJOtSmO.js} +0 -0
- /package/dist/{webidl-BJmPjW01.js → webidl-CQp4aHk_.js} +0 -0
- /package/dist/{xquery-CJIPsC0g.js → xquery-IxkjlwOD.js} +0 -0
- /package/dist/{yacas-8f2Vjiiz.js → yacas-Bnctn5w8.js} +0 -0
- /package/dist/{z80-s5Xk2hCP.js → z80-DrFwhx53.js} +0 -0
|
@@ -5,6 +5,11 @@ import { cellId } from "@/__tests__/branded";
|
|
|
5
5
|
import type { CellMessage } from "../../kernel/messages";
|
|
6
6
|
import { formatLogTimestamp, getCellLogsForMessage } from "../logs";
|
|
7
7
|
|
|
8
|
+
// Stable mock reference so every (re)import of use-toast sees the same spy,
|
|
9
|
+
// even after vi.resetModules() clears the module cache between tests.
|
|
10
|
+
const { toastMock } = vi.hoisted(() => ({ toastMock: vi.fn() }));
|
|
11
|
+
vi.mock("@/components/ui/use-toast", () => ({ toast: toastMock }));
|
|
12
|
+
|
|
8
13
|
describe("getCellLogsForMessage", () => {
|
|
9
14
|
beforeEach(() => {
|
|
10
15
|
// Mock console.log to avoid cluttering test output
|
|
@@ -324,6 +329,102 @@ describe("getCellLogsForMessage", () => {
|
|
|
324
329
|
});
|
|
325
330
|
});
|
|
326
331
|
|
|
332
|
+
describe("getCellLogsForMessage - internal error toast", () => {
|
|
333
|
+
// Re-imported per test after vi.resetModules() so the module-level
|
|
334
|
+
// `didAlreadyToastError` flag starts fresh and all jotai atom references
|
|
335
|
+
// (initialModeAtom, etc.) match the versions used by the reset logs.ts.
|
|
336
|
+
let getLogs: typeof import("../logs").getCellLogsForMessage;
|
|
337
|
+
let store: typeof import("@/core/state/jotai").store;
|
|
338
|
+
let initialModeAtom: typeof import("@/core/mode").initialModeAtom;
|
|
339
|
+
|
|
340
|
+
beforeEach(async () => {
|
|
341
|
+
vi.spyOn(console, "log").mockImplementation(() => {
|
|
342
|
+
// no-op
|
|
343
|
+
});
|
|
344
|
+
vi.resetModules();
|
|
345
|
+
({ getCellLogsForMessage: getLogs } = await import("../logs"));
|
|
346
|
+
({ store } = await import("@/core/state/jotai"));
|
|
347
|
+
({ initialModeAtom } = await import("@/core/mode"));
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
afterEach(() => {
|
|
351
|
+
vi.restoreAllMocks();
|
|
352
|
+
vi.clearAllMocks();
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
const makeErrorCellMessage = (id: CellMessage["cell_id"]): CellMessage => ({
|
|
356
|
+
cell_id: id,
|
|
357
|
+
console: [],
|
|
358
|
+
output: {
|
|
359
|
+
mimetype: "application/vnd.marimo+error",
|
|
360
|
+
data: [
|
|
361
|
+
{
|
|
362
|
+
type: "exception",
|
|
363
|
+
exception_type: "ValueError",
|
|
364
|
+
msg: "something exploded",
|
|
365
|
+
traceback: ["File foo.py, line 1", "ValueError: something exploded"],
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
channel: "marimo-error",
|
|
369
|
+
timestamp: 0,
|
|
370
|
+
} as unknown as CellMessage["output"],
|
|
371
|
+
status: "idle",
|
|
372
|
+
stale_inputs: null,
|
|
373
|
+
timestamp: 0,
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
test("shows toast for internal errors in app (read) mode", () => {
|
|
377
|
+
store.set(initialModeAtom, "read");
|
|
378
|
+
|
|
379
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-1")));
|
|
380
|
+
|
|
381
|
+
expect(toastMock).toHaveBeenCalledTimes(1);
|
|
382
|
+
expect(toastMock).toHaveBeenCalledWith(
|
|
383
|
+
expect.objectContaining({
|
|
384
|
+
title: "An internal error occurred",
|
|
385
|
+
variant: "danger",
|
|
386
|
+
}),
|
|
387
|
+
);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
test("does not show toast for internal errors in edit mode", () => {
|
|
391
|
+
store.set(initialModeAtom, "edit");
|
|
392
|
+
|
|
393
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-2")));
|
|
394
|
+
|
|
395
|
+
expect(toastMock).not.toHaveBeenCalled();
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
test("edit-mode errors do not consume the once-per-session toast slot", () => {
|
|
399
|
+
// Errors received while in edit mode should be silently skipped...
|
|
400
|
+
store.set(initialModeAtom, "edit");
|
|
401
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-3")));
|
|
402
|
+
expect(toastMock).not.toHaveBeenCalled();
|
|
403
|
+
|
|
404
|
+
// ...and a subsequent error in app mode should still toast.
|
|
405
|
+
store.set(initialModeAtom, "read");
|
|
406
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-4")));
|
|
407
|
+
expect(toastMock).toHaveBeenCalledTimes(1);
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
test("toast only fires once across multiple app-mode errors", () => {
|
|
411
|
+
store.set(initialModeAtom, "read");
|
|
412
|
+
|
|
413
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-5")));
|
|
414
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-6")));
|
|
415
|
+
|
|
416
|
+
expect(toastMock).toHaveBeenCalledTimes(1);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test("suppresses toast when initial mode has not been set", () => {
|
|
420
|
+
// Leave initialModeAtom at its default (undefined); getInitialAppMode
|
|
421
|
+
// will throw and the logic should swallow it without toasting.
|
|
422
|
+
getLogs(makeErrorCellMessage(cellId("cell-err-7")));
|
|
423
|
+
|
|
424
|
+
expect(toastMock).not.toHaveBeenCalled();
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
327
428
|
describe("formatLogTimestamp", () => {
|
|
328
429
|
test("formats unix timestamp correctly", () => {
|
|
329
430
|
// January 1, 2024, 12:00:00 PM UTC
|
package/src/core/cells/cells.ts
CHANGED
|
@@ -874,6 +874,24 @@ const {
|
|
|
874
874
|
cellHandles: nextCellHandles,
|
|
875
875
|
};
|
|
876
876
|
},
|
|
877
|
+
/**
|
|
878
|
+
* Rebuild the MultiColumn tree using each cell's `config.column` value.
|
|
879
|
+
*
|
|
880
|
+
* Used after a transaction whose `set-config` changes updated cells'
|
|
881
|
+
* column metadata without physically moving them in the tree. Cells with
|
|
882
|
+
* `config.column == null` inherit the column of the previous cell in the
|
|
883
|
+
* given order (see `MultiColumn.fromIdsAndColumns`), which lets the server
|
|
884
|
+
* send column changes only at column boundaries.
|
|
885
|
+
*/
|
|
886
|
+
rebuildCellColumns: (state, action: { cellIds: CellId[] }) => {
|
|
887
|
+
const newCellIds = MultiColumn.fromIdsAndColumns(
|
|
888
|
+
action.cellIds.map((id) => [
|
|
889
|
+
id,
|
|
890
|
+
state.cellData[id]?.config.column ?? null,
|
|
891
|
+
]),
|
|
892
|
+
);
|
|
893
|
+
return { ...state, cellIds: newCellIds };
|
|
894
|
+
},
|
|
877
895
|
setCellCodes: (
|
|
878
896
|
state,
|
|
879
897
|
action: {
|
|
@@ -349,6 +349,7 @@ export function toDocumentChanges(
|
|
|
349
349
|
case "prepareForRun":
|
|
350
350
|
case "handleCellMessage":
|
|
351
351
|
case "setCellIds":
|
|
352
|
+
case "rebuildCellColumns":
|
|
352
353
|
case "setCellCodes":
|
|
353
354
|
case "setCells":
|
|
354
355
|
case "setStdinResponse":
|
|
@@ -624,7 +625,24 @@ export function applyTransactionChanges(
|
|
|
624
625
|
): void {
|
|
625
626
|
const cancelled = cancelledCellIds(changes);
|
|
626
627
|
|
|
627
|
-
|
|
628
|
+
// Process set-config changes after everything else. The tree must be fully
|
|
629
|
+
// restructured (create-cell, delete-cell, reorder-cells, move-cell) before
|
|
630
|
+
// we start applying column metadata, since the follow-up rebuildCellColumns
|
|
631
|
+
// step interprets each cell's config.column against the *final* flat order.
|
|
632
|
+
// Sorting is stable within each group.
|
|
633
|
+
const sortedChanges: TransactionChange[] = [
|
|
634
|
+
...changes.filter((c) => c.type !== "set-config"),
|
|
635
|
+
...changes.filter((c) => c.type === "set-config"),
|
|
636
|
+
];
|
|
637
|
+
|
|
638
|
+
// Track whether any change updated a cell's column, and remember the final
|
|
639
|
+
// flat order produced by a reorder-cells change (if any). After all changes
|
|
640
|
+
// are applied, these are used to rebuild the MultiColumn tree so that cells
|
|
641
|
+
// physically move to the column their metadata says they belong in.
|
|
642
|
+
let hasColumnChange = false;
|
|
643
|
+
let reorderOrder: CellId[] | null = null;
|
|
644
|
+
|
|
645
|
+
for (const change of sortedChanges) {
|
|
628
646
|
if (
|
|
629
647
|
cancelled.size > 0 &&
|
|
630
648
|
"cellId" in change &&
|
|
@@ -632,11 +650,26 @@ export function applyTransactionChanges(
|
|
|
632
650
|
) {
|
|
633
651
|
continue;
|
|
634
652
|
}
|
|
653
|
+
if (change.type === "set-config" && change.column != null) {
|
|
654
|
+
hasColumnChange = true;
|
|
655
|
+
}
|
|
656
|
+
if (change.type === "create-cell" && change.config?.column != null) {
|
|
657
|
+
hasColumnChange = true;
|
|
658
|
+
}
|
|
659
|
+
if (change.type === "reorder-cells") {
|
|
660
|
+
reorderOrder = change.cellIds as CellId[];
|
|
661
|
+
}
|
|
635
662
|
for (const action of fromDocumentChanges([change], getCurrentCellIds)) {
|
|
636
663
|
// @ts-expect-error - TypeScript is not smart enough to know we have correctly mapped type -> payload
|
|
637
664
|
actions[action.type](action.payload);
|
|
638
665
|
}
|
|
639
666
|
}
|
|
667
|
+
|
|
668
|
+
if (hasColumnChange) {
|
|
669
|
+
actions.rebuildCellColumns({
|
|
670
|
+
cellIds: reorderOrder ?? getCurrentCellIds(),
|
|
671
|
+
});
|
|
672
|
+
}
|
|
640
673
|
}
|
|
641
674
|
|
|
642
675
|
// ---------------------------------------------------------------------------
|
package/src/core/cells/logs.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { Strings } from "@/utils/strings";
|
|
|
7
7
|
import type { CellMessage, OutputMessage } from "../kernel/messages";
|
|
8
8
|
import { isErrorMime } from "../mime";
|
|
9
9
|
import type { CellId } from "./ids";
|
|
10
|
+
import { initialModeAtom } from "../mode";
|
|
10
11
|
import { store } from "../state/jotai";
|
|
11
12
|
import { tracebackModalAtom } from "../errors/traceback-atom";
|
|
12
13
|
import React from "react";
|
|
@@ -83,7 +84,14 @@ export function getCellLogsForMessage(cell: CellMessage): CellLog[] {
|
|
|
83
84
|
error.type === "internal",
|
|
84
85
|
);
|
|
85
86
|
|
|
86
|
-
|
|
87
|
+
// Only show the toast in app mode: edit mode already surfaces errors in
|
|
88
|
+
// the cell UI, so toasting there would be noisy and duplicative. Read the
|
|
89
|
+
// atom directly so an unset initial mode (e.g. in tests/islands) simply
|
|
90
|
+
// returns undefined instead of throwing and masking real errors.
|
|
91
|
+
const isAppMode = store.get(initialModeAtom) === "read";
|
|
92
|
+
|
|
93
|
+
// Only show toast once, and only in app mode
|
|
94
|
+
if (exceptionErrors.length > 0 && !didAlreadyToastError && isAppMode) {
|
|
87
95
|
didAlreadyToastError = true;
|
|
88
96
|
|
|
89
97
|
// Find first error with a traceback
|
|
@@ -9,9 +9,7 @@ exports[`snapshot all duplicate keymaps > default keymaps 2`] = `
|
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"key": "ArrowDown",
|
|
12
|
-
"preventDefault": true,
|
|
13
12
|
"run": "run",
|
|
14
|
-
"stopPropagation": true,
|
|
15
13
|
},
|
|
16
14
|
{
|
|
17
15
|
"key": "ArrowDown",
|
|
@@ -27,9 +25,7 @@ exports[`snapshot all duplicate keymaps > default keymaps 2`] = `
|
|
|
27
25
|
},
|
|
28
26
|
{
|
|
29
27
|
"key": "ArrowUp",
|
|
30
|
-
"preventDefault": true,
|
|
31
28
|
"run": "run",
|
|
32
|
-
"stopPropagation": true,
|
|
33
29
|
},
|
|
34
30
|
{
|
|
35
31
|
"key": "ArrowUp",
|
|
@@ -118,15 +114,12 @@ exports[`snapshot all duplicate keymaps > vim keymaps 2`] = `
|
|
|
118
114
|
},
|
|
119
115
|
{
|
|
120
116
|
"key": "ArrowDown",
|
|
121
|
-
"preventDefault": true,
|
|
122
117
|
"run": "run",
|
|
123
|
-
"stopPropagation": true,
|
|
124
118
|
},
|
|
125
119
|
{
|
|
126
120
|
"key": "ArrowDown",
|
|
127
|
-
"
|
|
128
|
-
"
|
|
129
|
-
"shift": "selectLineDown",
|
|
121
|
+
"run": "<no name>",
|
|
122
|
+
"shift": "<no name>",
|
|
130
123
|
},
|
|
131
124
|
],
|
|
132
125
|
"ArrowUp": [
|
|
@@ -136,15 +129,12 @@ exports[`snapshot all duplicate keymaps > vim keymaps 2`] = `
|
|
|
136
129
|
},
|
|
137
130
|
{
|
|
138
131
|
"key": "ArrowUp",
|
|
139
|
-
"preventDefault": true,
|
|
140
132
|
"run": "run",
|
|
141
|
-
"stopPropagation": true,
|
|
142
133
|
},
|
|
143
134
|
{
|
|
144
135
|
"key": "ArrowUp",
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"shift": "selectLineUp",
|
|
136
|
+
"run": "<no name>",
|
|
137
|
+
"shift": "<no name>",
|
|
148
138
|
},
|
|
149
139
|
],
|
|
150
140
|
"Backspace": [
|
|
@@ -169,8 +169,6 @@ function cellKeymaps({
|
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
key: "ArrowUp",
|
|
172
|
-
preventDefault: true,
|
|
173
|
-
stopPropagation: true,
|
|
174
172
|
run: (ev) => {
|
|
175
173
|
// Skip if we are in the middle of an autocompletion
|
|
176
174
|
const hasAutocomplete = completionStatus(ev.state);
|
|
@@ -188,8 +186,6 @@ function cellKeymaps({
|
|
|
188
186
|
},
|
|
189
187
|
{
|
|
190
188
|
key: "ArrowDown",
|
|
191
|
-
preventDefault: true,
|
|
192
|
-
stopPropagation: true,
|
|
193
189
|
run: (ev) => {
|
|
194
190
|
// Skip if we are in the middle of an autocompletion
|
|
195
191
|
const hasAutocomplete = completionStatus(ev.state);
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
cursorCharLeft,
|
|
5
|
+
cursorCharRight,
|
|
6
|
+
cursorLineDown,
|
|
7
|
+
cursorLineUp,
|
|
4
8
|
insertNewlineAndIndent,
|
|
5
9
|
defaultKeymap as originalDefaultKeymap,
|
|
10
|
+
selectCharLeft,
|
|
11
|
+
selectCharRight,
|
|
12
|
+
selectLineDown,
|
|
13
|
+
selectLineUp,
|
|
6
14
|
toggleBlockComment,
|
|
7
15
|
toggleComment,
|
|
8
16
|
} from "@codemirror/commands";
|
|
@@ -13,7 +21,7 @@ import {
|
|
|
13
21
|
type KeyBinding,
|
|
14
22
|
keymap,
|
|
15
23
|
} from "@codemirror/view";
|
|
16
|
-
import { getCM, vim } from "@replit/codemirror-vim";
|
|
24
|
+
import { type CodeMirror, getCM, vim } from "@replit/codemirror-vim";
|
|
17
25
|
import type { KeymapConfig } from "@/core/config/config-schema";
|
|
18
26
|
import type { HotkeyProvider } from "@/core/hotkeys/hotkeys";
|
|
19
27
|
import { logNever } from "@/utils/assertNever";
|
|
@@ -62,6 +70,12 @@ export function keymapBundle(
|
|
|
62
70
|
},
|
|
63
71
|
),
|
|
64
72
|
),
|
|
73
|
+
// Arrow keys: use CodeMirror's cursor movement except in vim visual
|
|
74
|
+
// mode, where vim must handle them to maintain selection.
|
|
75
|
+
// The original cursorLineUp/Down bindings from the default keymap are
|
|
76
|
+
// filtered out (see defaultVimKeymap) because their preventDefault
|
|
77
|
+
// flag blocks vim's handler even when their run function returns false.
|
|
78
|
+
keymap.of(vimVisualModeArrowKeyBindings()),
|
|
65
79
|
// Base vim mode
|
|
66
80
|
vim({ status: false }),
|
|
67
81
|
// Custom vim keymaps for cell navigation
|
|
@@ -101,12 +115,22 @@ const overrideKeymap = (keymap: HotkeyProvider): readonly KeyBinding[] => {
|
|
|
101
115
|
};
|
|
102
116
|
|
|
103
117
|
const defaultVimKeymap = once(() => {
|
|
104
|
-
const toRemove = new Set([
|
|
118
|
+
const toRemove = new Set([
|
|
119
|
+
"Enter",
|
|
120
|
+
"Ctrl-v",
|
|
121
|
+
"ArrowUp",
|
|
122
|
+
"ArrowDown",
|
|
123
|
+
"ArrowLeft",
|
|
124
|
+
"ArrowRight",
|
|
125
|
+
]);
|
|
105
126
|
// Remove conflicting keys from the keymap
|
|
106
127
|
// Enter (<CR>) adds a new line
|
|
107
128
|
// - it should just go to the next line
|
|
108
129
|
// Ctrl-v goes to the bottom of the cell
|
|
109
130
|
// - should enter blockwise visual mode
|
|
131
|
+
// ArrowUp/ArrowDown (cursorLineUp/Down) always handle the event and have
|
|
132
|
+
// preventDefault, which blocks vim's handler from processing arrow keys.
|
|
133
|
+
// Replaced with visual-mode-aware wrappers in keymapBundle.
|
|
110
134
|
return defaultKeymap().filter(
|
|
111
135
|
(k) => !toRemove.has(k.key || k.mac || k.linux || k.win || ""),
|
|
112
136
|
);
|
|
@@ -155,6 +179,49 @@ function doubleCharacterListener(
|
|
|
155
179
|
]);
|
|
156
180
|
}
|
|
157
181
|
|
|
182
|
+
function isInVimVisualMode(cm: CodeMirror | undefined | null): boolean {
|
|
183
|
+
return cm?.state.vim?.visualMode === true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* In vim visual mode, arrow keys must be handled by vim to maintain selection.
|
|
188
|
+
* Wrap each arrow key's run and shift so they defer to vim in visual mode,
|
|
189
|
+
* but use CodeMirror's cursor commands in all other modes.
|
|
190
|
+
*/
|
|
191
|
+
function vimVisualModeArrowKeyBindings(): KeyBinding[] {
|
|
192
|
+
const wrap =
|
|
193
|
+
(cmd: Command): Command =>
|
|
194
|
+
(view) => {
|
|
195
|
+
if (isInVimVisualMode(getCM(view))) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
return cmd(view);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
return [
|
|
202
|
+
{
|
|
203
|
+
key: "ArrowDown",
|
|
204
|
+
run: wrap(cursorLineDown),
|
|
205
|
+
shift: wrap(selectLineDown),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
key: "ArrowUp",
|
|
209
|
+
run: wrap(cursorLineUp),
|
|
210
|
+
shift: wrap(selectLineUp),
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
key: "ArrowLeft",
|
|
214
|
+
run: wrap(cursorCharLeft),
|
|
215
|
+
shift: wrap(selectCharLeft),
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
key: "ArrowRight",
|
|
219
|
+
run: wrap(cursorCharRight),
|
|
220
|
+
shift: wrap(selectCharRight),
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
|
|
158
225
|
export const visibleForTesting = {
|
|
159
226
|
defaultKeymap,
|
|
160
227
|
defaultVimKeymap,
|
package/src/core/constants.ts
CHANGED
|
@@ -237,6 +237,7 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
|
|
|
237
237
|
sendPdb = throwNotImplemented;
|
|
238
238
|
sendCreateFileOrFolder = throwNotImplemented;
|
|
239
239
|
sendDeleteFileOrFolder = throwNotImplemented;
|
|
240
|
+
sendCopyFileOrFolder = throwNotImplemented;
|
|
240
241
|
sendRenameFileOrFolder = throwNotImplemented;
|
|
241
242
|
sendUpdateFile = throwNotImplemented;
|
|
242
243
|
sendFileDetails = throwNotImplemented;
|
package/src/core/mode.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import { atom } from "jotai";
|
|
3
|
+
import { atom, useAtomValue } from "jotai";
|
|
4
4
|
import { isIslands } from "@/core/islands/utils";
|
|
5
5
|
import { assertExists } from "@/utils/assertExists";
|
|
6
6
|
import { invariant } from "@/utils/invariant";
|
|
@@ -79,3 +79,12 @@ export const viewStateAtom = atom<ViewState>({
|
|
|
79
79
|
export const initialModeAtom = atom<AppMode | undefined>(undefined);
|
|
80
80
|
|
|
81
81
|
export const kioskModeAtom = atom<boolean>(false);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Whether installing packages is allowed in the current view. False in read
|
|
85
|
+
* mode, since end-users of a deployed notebook cannot mutate its environment.
|
|
86
|
+
*/
|
|
87
|
+
export function useInstallAllowed(): boolean {
|
|
88
|
+
const { mode } = useAtomValue(viewStateAtom);
|
|
89
|
+
return mode !== "read";
|
|
90
|
+
}
|
|
@@ -90,6 +90,7 @@ const ACTIONS: Record<keyof AllRequests, Action> = {
|
|
|
90
90
|
sendSearchFiles: "startConnection",
|
|
91
91
|
sendCreateFileOrFolder: "throwError",
|
|
92
92
|
sendDeleteFileOrFolder: "throwError",
|
|
93
|
+
sendCopyFileOrFolder: "throwError",
|
|
93
94
|
sendRenameFileOrFolder: "throwError",
|
|
94
95
|
sendUpdateFile: "throwError",
|
|
95
96
|
sendFileDetails: "throwError",
|
|
@@ -312,6 +312,14 @@ export function createNetworkRequests(): EditRequests & RunRequests {
|
|
|
312
312
|
})
|
|
313
313
|
.then(handleResponse);
|
|
314
314
|
},
|
|
315
|
+
sendCopyFileOrFolder: async (request) => {
|
|
316
|
+
await waitForConnectionOpen();
|
|
317
|
+
return getClient()
|
|
318
|
+
.POST("/api/files/copy", {
|
|
319
|
+
body: request,
|
|
320
|
+
})
|
|
321
|
+
.then(handleResponse);
|
|
322
|
+
},
|
|
315
323
|
sendRenameFileOrFolder: async (request) => {
|
|
316
324
|
await waitForConnectionOpen();
|
|
317
325
|
return getClient()
|
|
@@ -66,6 +66,7 @@ export function createStaticRequests(): EditRequests & RunRequests {
|
|
|
66
66
|
sendPdb: throwNotInEditMode,
|
|
67
67
|
sendCreateFileOrFolder: throwNotInEditMode,
|
|
68
68
|
sendDeleteFileOrFolder: throwNotInEditMode,
|
|
69
|
+
sendCopyFileOrFolder: throwNotInEditMode,
|
|
69
70
|
sendRenameFileOrFolder: throwNotInEditMode,
|
|
70
71
|
sendUpdateFile: throwNotInEditMode,
|
|
71
72
|
sendFileDetails: throwNotInEditMode,
|
|
@@ -51,6 +51,7 @@ export function createErrorToastingRequests(
|
|
|
51
51
|
sendPdb: "Failed to start debug session",
|
|
52
52
|
sendCreateFileOrFolder: "Failed to create file or folder",
|
|
53
53
|
sendDeleteFileOrFolder: "Failed to delete file or folder",
|
|
54
|
+
sendCopyFileOrFolder: "Failed to duplicate file or folder",
|
|
54
55
|
sendRenameFileOrFolder: "Failed to rename file or folder",
|
|
55
56
|
sendUpdateFile: "Failed to update file",
|
|
56
57
|
sendFileDetails: "Failed to get file details",
|
|
@@ -23,6 +23,8 @@ export type ExportAsIPYNBRequest = schemas["ExportAsIPYNBRequest"];
|
|
|
23
23
|
export type ExportAsScriptRequest = schemas["ExportAsScriptRequest"];
|
|
24
24
|
export type ExportAsPDFRequest = schemas["ExportAsPDFRequest"];
|
|
25
25
|
export type UpdateCellOutputsRequest = schemas["UpdateCellOutputsRequest"];
|
|
26
|
+
export type FileCopyRequest = schemas["FileCopyRequest"];
|
|
27
|
+
export type FileCopyResponse = schemas["FileCopyResponse"];
|
|
26
28
|
export type FileCreateRequest = schemas["FileCreateRequest"];
|
|
27
29
|
export type FileCreateResponse = schemas["FileCreateResponse"];
|
|
28
30
|
export type FileDeleteRequest = schemas["FileDeleteRequest"];
|
|
@@ -168,6 +170,7 @@ export interface EditRequests {
|
|
|
168
170
|
sendDeleteFileOrFolder: (
|
|
169
171
|
request: FileDeleteRequest,
|
|
170
172
|
) => Promise<FileDeleteResponse>;
|
|
173
|
+
sendCopyFileOrFolder: (request: FileCopyRequest) => Promise<FileCopyResponse>;
|
|
171
174
|
sendRenameFileOrFolder: (
|
|
172
175
|
request: FileMoveRequest,
|
|
173
176
|
) => Promise<FileMoveResponse>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
|
|
5
|
+
const { mockNotebookReadFile, rpcListeners } = vi.hoisted(() => ({
|
|
6
|
+
mockNotebookReadFile: vi.fn(),
|
|
7
|
+
rpcListeners: {} as Record<string, () => void>,
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
// Mock browser globals before any imports
|
|
11
|
+
vi.stubGlobal("crossOriginIsolated", false);
|
|
12
|
+
vi.stubGlobal(
|
|
13
|
+
"Worker",
|
|
14
|
+
vi.fn(() => ({
|
|
15
|
+
addEventListener: vi.fn(),
|
|
16
|
+
postMessage: vi.fn(),
|
|
17
|
+
terminate: vi.fn(),
|
|
18
|
+
})),
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
class MockURL extends URL {
|
|
22
|
+
static override createObjectURL = vi.fn(() => "blob:mock-url");
|
|
23
|
+
static override revokeObjectURL = vi.fn();
|
|
24
|
+
}
|
|
25
|
+
vi.stubGlobal("URL", MockURL);
|
|
26
|
+
|
|
27
|
+
vi.mock("@/core/wasm/rpc", () => ({
|
|
28
|
+
getWorkerRPC: () => ({
|
|
29
|
+
proxy: {
|
|
30
|
+
request: {
|
|
31
|
+
bridge: vi.fn(),
|
|
32
|
+
startSession: vi.fn(),
|
|
33
|
+
readFile: vi.fn(),
|
|
34
|
+
readNotebook: vi.fn(),
|
|
35
|
+
saveNotebook: vi.fn(),
|
|
36
|
+
},
|
|
37
|
+
send: { consumerReady: vi.fn() },
|
|
38
|
+
},
|
|
39
|
+
addMessageListener: (event: string, cb: () => void) => {
|
|
40
|
+
rpcListeners[event] = cb;
|
|
41
|
+
},
|
|
42
|
+
}),
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
vi.mock("@/core/meta/globals", () => ({
|
|
46
|
+
getMarimoVersion: () => "0.0.0-test",
|
|
47
|
+
}));
|
|
48
|
+
|
|
49
|
+
vi.mock("@/core/wasm/utils", () => ({
|
|
50
|
+
isWasm: () => true,
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
vi.mock("@/core/wasm/store", () => ({
|
|
54
|
+
fallbackFileStore: { readFile: vi.fn(), saveFile: vi.fn() },
|
|
55
|
+
notebookFileStore: { readFile: mockNotebookReadFile, saveFile: vi.fn() },
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
// Import after all mocks are set up
|
|
59
|
+
import { store } from "@/core/state/jotai";
|
|
60
|
+
import { initialModeAtom } from "@/core/mode";
|
|
61
|
+
import { PyodideBridge } from "../bridge";
|
|
62
|
+
|
|
63
|
+
// Access INSTANCE once at module level so the constructor runs (and
|
|
64
|
+
// addMessageListener populates rpcListeners) before any test executes.
|
|
65
|
+
void PyodideBridge.INSTANCE;
|
|
66
|
+
|
|
67
|
+
describe("PyodideBridge.readCode", () => {
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
vi.clearAllMocks();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
afterEach(() => {
|
|
73
|
+
store.set(initialModeAtom, undefined);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("reads from notebookFileStore in read mode", async () => {
|
|
77
|
+
store.set(initialModeAtom, "read");
|
|
78
|
+
// Trigger getSaveWorker — it reads the current mode and returns a stub
|
|
79
|
+
// whose readNotebook delegates to notebookFileStore.
|
|
80
|
+
rpcListeners.initialized();
|
|
81
|
+
mockNotebookReadFile.mockResolvedValue(
|
|
82
|
+
"import numpy as np\nprint(np.__version__)",
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const result = await PyodideBridge.INSTANCE.readCode();
|
|
86
|
+
|
|
87
|
+
expect(result).toEqual({
|
|
88
|
+
contents: "import numpy as np\nprint(np.__version__)",
|
|
89
|
+
});
|
|
90
|
+
expect(mockNotebookReadFile).toHaveBeenCalledTimes(1);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("returns empty string when notebookFileStore has no code in read mode", async () => {
|
|
94
|
+
store.set(initialModeAtom, "read");
|
|
95
|
+
rpcListeners.initialized();
|
|
96
|
+
mockNotebookReadFile.mockResolvedValue(null);
|
|
97
|
+
|
|
98
|
+
const result = await PyodideBridge.INSTANCE.readCode();
|
|
99
|
+
|
|
100
|
+
expect(result).toEqual({ contents: "" });
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("does not call notebookFileStore in edit mode", async () => {
|
|
104
|
+
store.set(initialModeAtom, "edit");
|
|
105
|
+
// getSaveWorker in edit mode creates a real worker (mocked); readNotebook
|
|
106
|
+
// goes to the RPC proxy, not notebookFileStore.
|
|
107
|
+
rpcListeners.initialized();
|
|
108
|
+
|
|
109
|
+
await PyodideBridge.INSTANCE.readCode();
|
|
110
|
+
|
|
111
|
+
expect(mockNotebookReadFile).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
});
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
EditRequests,
|
|
18
18
|
ExportAsHTMLRequest,
|
|
19
19
|
ExportAsMarkdownRequest,
|
|
20
|
+
FileCopyResponse,
|
|
20
21
|
FileCreateResponse,
|
|
21
22
|
FileDeleteResponse,
|
|
22
23
|
FileDetailsResponse,
|
|
@@ -66,10 +67,10 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
66
67
|
|
|
67
68
|
private getSaveWorker(): SaveWorker {
|
|
68
69
|
if (getInitialAppMode() === "read") {
|
|
69
|
-
Logger.debug("
|
|
70
|
+
Logger.debug("Using partially disabled SaveWorker in read-mode");
|
|
70
71
|
return {
|
|
71
72
|
readFile: throwNotImplemented,
|
|
72
|
-
readNotebook:
|
|
73
|
+
readNotebook: async () => (await notebookFileStore.readFile()) ?? "",
|
|
73
74
|
saveNotebook: throwNotImplemented,
|
|
74
75
|
};
|
|
75
76
|
}
|
|
@@ -443,6 +444,16 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
443
444
|
return response as FileDeleteResponse;
|
|
444
445
|
};
|
|
445
446
|
|
|
447
|
+
sendCopyFileOrFolder: EditRequests["sendCopyFileOrFolder"] = async (
|
|
448
|
+
request,
|
|
449
|
+
) => {
|
|
450
|
+
const response = await this.rpc.proxy.request.bridge({
|
|
451
|
+
functionName: "copy_file_or_directory",
|
|
452
|
+
payload: request,
|
|
453
|
+
});
|
|
454
|
+
return response as FileCopyResponse;
|
|
455
|
+
};
|
|
456
|
+
|
|
446
457
|
sendRenameFileOrFolder: EditRequests["sendRenameFileOrFolder"] = async (
|
|
447
458
|
request,
|
|
448
459
|
) => {
|
|
@@ -11,6 +11,8 @@ import type {
|
|
|
11
11
|
CopyNotebookRequest,
|
|
12
12
|
ExportAsHTMLRequest,
|
|
13
13
|
ExportAsMarkdownRequest,
|
|
14
|
+
FileCopyRequest,
|
|
15
|
+
FileCopyResponse,
|
|
14
16
|
FileCreateRequest,
|
|
15
17
|
FileCreateResponse,
|
|
16
18
|
FileDeleteRequest,
|
|
@@ -86,6 +88,7 @@ export interface RawBridge {
|
|
|
86
88
|
delete_file_or_directory(
|
|
87
89
|
request: FileDeleteRequest,
|
|
88
90
|
): Promise<FileDeleteResponse>;
|
|
91
|
+
copy_file_or_directory(request: FileCopyRequest): Promise<FileCopyResponse>;
|
|
89
92
|
move_file_or_directory(request: FileMoveRequest): Promise<FileMoveResponse>;
|
|
90
93
|
update_file(request: FileUpdateRequest): Promise<FileUpdateResponse>;
|
|
91
94
|
load_packages(request: string): Promise<string>;
|