@marimo-team/islands 0.16.5 → 0.17.0
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-D96i9G-X.js → ConnectedDataExplorerComponent-DJEUH6Bb.js} +78 -100
- package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-CN4oFUZ4.js} +20 -20
- package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-CzSvE_-f.js} +3 -3
- package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-DbbUiyUD.js} +5 -5
- package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-DwoC-LVO.js} +4 -4
- package/dist/any-language-editor-CEXn1vFs.js +156 -0
- package/dist/apl-DuVfHsPc.js +4 -0
- package/dist/architecture-O4VJ6CD3-lp-opOaL.js +21 -0
- package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CoBORy6u.js} +34 -34
- package/dist/asciiarmor-qIVWsi4F.js +4 -0
- package/dist/asn1-BjPqARr7.js +4 -0
- package/dist/assets/__vite-browser-external-lX-sn9m2.js +1 -0
- package/dist/assets/worker-vPn7gxWj.js +54 -0
- package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-0yzoLIar.js} +75 -86
- package/dist/brainfuck-DPGTVfkE.js +4 -0
- package/dist/{button-CEcjneWG.js → button-DcnBVpVa.js} +11 -14
- package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-CKsIA_DD.js} +27 -51
- package/dist/{channel-Uh0KpgGW.js → channel-3LVvQZcD.js} +1 -1
- package/dist/{check-BK9zDfQk.js → check-D7ifz5op.js} +1 -1
- package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-B2C-aVc3.js} +35 -35
- package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-DEd4VI9L.js} +1 -1
- package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-DnvP3O4K.js} +216 -325
- package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-BcCzwOOl.js} +1 -1
- package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-eNAAfJ3Q.js} +7 -7
- package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CSAeQvLz.js} +1 -1
- package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-CZcb_1iM.js} +16 -20
- package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-pBc5O5Rh.js} +1 -1
- package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-CivHZg9P.js} +3 -3
- package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Dd0E6qb0.js} +46 -54
- package/dist/chunk-EXTU4WIE-GQ2ZWfJo.js +10 -0
- package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-C6YcisV6.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DYeQaT57.js} +21 -25
- package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-B-EZMP4V.js} +1 -1
- package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-DENzlS-M.js} +7 -7
- package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-SckhHdEh.js} +1 -1
- package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-Cjq5b604.js} +2 -2
- package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-CNUuivie.js} +3 -4
- package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-DugEU_bA.js} +1 -1
- package/dist/chunk-S3R3BYOJ-itCT6Vif.js +380 -0
- package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BLdfTX8J.js} +1 -1
- package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-BOnwF9d8.js} +7 -8
- package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-DGs66AlL.js} +4 -5
- package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-CPsipkmJ.js} +1 -1
- package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-Cmed18Pk.js} +1 -1
- package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-DH5GDaY8.js} +1 -1
- package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DPDwaqZm.js} +22 -22
- package/dist/classDiagram-KNZD7YFC-azuS_99k.js +39 -0
- package/dist/classDiagram-v2-RKCZMP56-CQpyQQOR.js +39 -0
- package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-CL_FkgGY.js} +7 -12
- package/dist/{clike-CxAz4p9E.js → clike-DYfRWWXk.js} +1 -1
- package/dist/{clike-Cg_DBrJ0.js → clike-bzZTreP4.js} +1 -1
- package/dist/clojure-ATksAecl.js +4 -0
- package/dist/{clone-Dk4FkKH0.js → clone-Msbhmn2a.js} +1 -1
- package/dist/cmake-CWylaz2C.js +4 -0
- package/dist/cobol-BiLLCZIQ.js +4 -0
- package/dist/coffeescript-Ca4jipi8.js +4 -0
- package/dist/commonlisp-BwFjyEC7.js +4 -0
- package/dist/{constants-Cjd_3kwd.js → constants-BCOEQoEQ.js} +3 -3
- package/dist/{copy-C5RFg7ok.js → copy-BkZ8PkBM.js} +6 -2
- package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BZnbwyVD.js} +20 -20
- package/dist/crystal-BhUsQHbh.js +4 -0
- package/dist/css-Cf4wlIyV.js +5 -0
- package/dist/cypher-Dj8Hzgxa.js +4 -0
- package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BTpRoPd2.js} +586 -661
- package/dist/d-DZI7tbTy.js +4 -0
- package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-BGaiSZZO.js} +32 -37
- package/dist/{dagre-B0u1urxE.js → dagre-pyfDIOWJ.js} +57 -76
- package/dist/data-grid-overlay-editor-867aBz0Y.js +133 -0
- package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-CzLE0jZB.js} +35 -51
- package/dist/diagram-QEK2KX5R-AGS60xEZ.js +245 -0
- package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-BxRoG6yW.js} +28 -28
- package/dist/diff-WQISUHG5.js +4 -0
- package/dist/{dist-CdE2C2In.js → dist-2Ne-33Xy.js} +15 -20
- package/dist/{dist-DKFaZRVk.js → dist-B0YD1aXi.js} +2 -2
- package/dist/{dist-DBhzmFyH.js → dist-B1Dv8Sdk.js} +3 -3
- package/dist/{dist-CGIZPq3J.js → dist-BFkr6kAQ.js} +2 -2
- package/dist/{dist-DL_ci7Yc.js → dist-BL2DSY0P.js} +1 -1
- package/dist/dist-BawZu0ix.js +10 -0
- package/dist/{dist-Bar1QnNM.js → dist-BhVFggab.js} +3 -3
- package/dist/{textile-Cy55fYGC.js → dist-BiOF7987.js} +4 -2
- package/dist/{dist-BQmQQqFH.js → dist-BpzZrRd6.js} +1 -1
- package/dist/{dist-CxD5E6Sh.js → dist-C7zhQ7K0.js} +24 -22
- package/dist/{dist-BqgkUnEN.js → dist-CBhnQKQ4.js} +3 -3
- package/dist/{dist-Dzk1C8l5.js → dist-CId4IPXu.js} +10 -13
- package/dist/{dist-CUnh_3Ii.js → dist-CYhQCVru.js} +2 -2
- package/dist/{dist-BBlFk9ki.js → dist-CZq5-ZyD.js} +1 -1
- package/dist/{dist-elblfNXO.js → dist-Cacac5HV.js} +2 -2
- package/dist/{dist-CChOkSUg.js → dist-CfQHSIQC.js} +3 -3
- package/dist/{dist-JCAky9ND.js → dist-CkvGMBAS.js} +17 -22
- package/dist/dist-Cs3McXEj.js +6 -0
- package/dist/{dist-o7fhJC7U.js → dist-CvyfRaIr.js} +3 -3
- package/dist/{dist-CZfRM7pE.js → dist-D-3fICwh.js} +2 -2
- package/dist/dist-D3aaithT.js +6 -0
- package/dist/{dist-CutXTm8t.js → dist-DBhEu3-F.js} +1 -1
- package/dist/dist-DELcMSpJ.js +6 -0
- package/dist/{dist-C7ASiFxI.js → dist-DMxl6Qbu.js} +273 -263
- package/dist/{dist-CLvpViod.js → dist-DS6nuHYK.js} +2 -3
- package/dist/dist-Dgts3WXd.js +6 -0
- package/dist/{dist--I6Htnlv.js → dist-DlHkZUnY.js} +5 -5
- package/dist/dist-Doiq_KIP.js +15 -0
- package/dist/dist-DtpUiDG_.js +6 -0
- package/dist/{dist-DzOpMdwb.js → dist-NUdHX0XE.js} +4 -4
- package/dist/{dist-C3WYsf4K.js → dist-PGgOcwbF.js} +4 -10
- package/dist/{dist-DNnYAdRE.js → dist-RdxOJbBw.js} +2 -2
- package/dist/{dist-BEvIw5Nh.js → dist-RwqAqkpG.js} +1 -1
- package/dist/dist-ZjnJq_jD.js +10 -0
- package/dist/{dist-CbRkrKrP.js → dist-biZ846D9.js} +5 -5
- package/dist/{dist-DW9er3Zq.js → dist-d5NxvX2s.js} +44 -23
- package/dist/{dist-C3QUag__.js → dist-ivwkJchV.js} +3 -3
- package/dist/dist-mof3iuBu.js +12 -0
- package/dist/{dist-Cib4sGDA.js → dist-reo2kYlN.js} +2 -2
- package/dist/{dist-BZBitvuL.js → dist-wHVprCkn.js} +1 -1
- package/dist/{dist-C5zMs_n5.js → dist-y8uoXYaE.js} +3 -3
- package/dist/{dist-DPF5TTUg.js → dist-z_iuDES7.js} +126 -115
- package/dist/{dockerfile-Dum_1b-5.js → dockerfile-sZMPcXVY.js} +1 -1
- package/dist/dtd-B2M8dhfC.js +4 -0
- package/dist/dylan-CU3Vt8SC.js +4 -0
- package/dist/ecl-B8ESAVq4.js +4 -0
- package/dist/eiffel-DDfMIKeA.js +4 -0
- package/dist/elm-Bj6rj8jf.js +4 -0
- package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-CTxzb-U8.js} +20 -20
- package/dist/erlang-BxyshZUq.js +4 -0
- package/dist/{error-banner-OQIGTqFR.js → error-banner-npbEfanI.js} +13 -13
- package/dist/{esm-DxFkg7a6.js → esm-BdiY4QsX.js} +1528 -1492
- package/dist/{esm-d0g2RsOH.js → esm-CAWW9sum.js} +6 -8
- package/dist/{esm-1_Mp6VD2.js → esm-YY5zh7KV.js} +324 -395
- package/dist/{esm-BO9n_s6u.js → esm-svAVli9f.js} +5 -5
- package/dist/{factor-CdgiDGiu.js → factor-CRFTmP_a.js} +1 -1
- package/dist/factor-CYk6XT8r.js +5 -0
- package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-Dck2hiJe.js} +22 -22
- package/dist/{formats-ChrNdVdJ.js → formats-BnqXUb1V.js} +13 -17
- package/dist/forth-fcoJkd-f.js +4 -0
- package/dist/fortran-IxZHu4wc.js +4 -0
- package/dist/{fullscreen-D1yTiBlu.js → fullscreen-blsKUrtN.js} +741 -744
- package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-AWzfzpup.js} +9 -9
- package/dist/gas-B8rmKcim.js +4 -0
- package/dist/gherkin-BTm-jIdJ.js +4 -0
- package/dist/gitGraph-ZV4HHKMB-DFg_OLQb.js +21 -0
- package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-GyNboWSV.js} +31 -34
- package/dist/{glide-data-editor-D_kEsT07.js → glide-data-editor-DHuN8kQ8.js} +1650 -1720
- package/dist/{graphlib-BGmr7CYF.js → graphlib-hb3zmtVD.js} +5 -5
- package/dist/groovy-01kRHFMD.js +4 -0
- package/dist/haskell-B3PhE05w.js +4 -0
- package/dist/haxe-DEoAm8oA.js +5 -0
- package/dist/{hotkeys-yFrUwyJK.js → hotkeys-Ct2T3e9O.js} +4 -7
- package/dist/idl-DsDJU9cV.js +4 -0
- package/dist/info-63CPKGFF-D3DZmDBa.js +21 -0
- package/dist/infoDiagram-STP46IZ2-ec08vi_U.js +44 -0
- package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-BlvK28do.js} +3 -5
- package/dist/{isEmpty-BBG-u1GM.js → isEmpty--odfYjh1.js} +2 -2
- package/dist/{isSymbol-BxF-_8BA.js → isSymbol-Cb1f2HgO.js} +1 -1
- package/dist/{javascript-Dfq1qI35.js → javascript-BfCTmOnk.js} +2 -2
- package/dist/javascript-gwczVhuU.js +5 -0
- package/dist/jinja2-AkZRdFk3.js +4 -0
- package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-TmXYCUbT.js} +23 -24
- package/dist/julia-_s6qe3bf.js +4 -0
- package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-B6ozleHo.js} +15 -15
- package/dist/{katex-dN__NFdn.js → katex-mPzRsXEy.js} +1 -1
- package/dist/{katex-BE4xflfm.js → katex-mkWmhPUh.js} +149 -173
- package/dist/{label-BinTsX-u.js → label-VVRKZmrP.js} +21 -24
- package/dist/{linear-DyTdUIqX.js → linear-iebAbJVD.js} +1 -1
- package/dist/livescript-CwPHQdv5.js +4 -0
- package/dist/{loader-Dijti3y4.js → loader-CM0VALo9.js} +19 -26
- package/dist/lua-s7nRxkCP.js +4 -0
- package/dist/main.js +8161 -8431
- package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DJM8la36.js} +5 -5
- package/dist/mathematica-Ci36yd1q.js +4 -0
- package/dist/mbox-DbOYMNCO.js +4 -0
- package/dist/{memoize-Dq87l1O_.js → memoize-DYoRBSLn.js} +1 -1
- package/dist/{merge-BPDCIm8P.js → merge-BjuR6j_w.js} +1 -1
- package/dist/{mermaid-MWiyXDcI.js → mermaid-YPPMBmhk.js} +58 -76
- package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-BLkyTSZj.js} +8 -8
- package/dist/{mhchem-DZ68WS0G.js → mhchem-Dw7wvXtr.js} +1 -1
- package/dist/{min-BzhKOmZo.js → min-B_i2ahn4.js} +7 -7
- package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-F6-JnXwq.js} +17 -17
- package/dist/mirc-VmNe8AwF.js +4 -0
- package/dist/mllike-BdD7SJEa.js +6 -0
- package/dist/modelica-BA4VqzC3.js +4 -0
- package/dist/mscgen-DF-5WHJm.js +6 -0
- package/dist/mumps-c_Uia_QN.js +4 -0
- package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-BqKV-TpL.js} +14343 -14351
- package/dist/{now-DVBcRCoE.js → now-CwRqw0nS.js} +1 -1
- package/dist/nsis-BAANGODV.js +5 -0
- package/dist/{nsis-BW6_XagK.js → nsis-BWJEeUyS.js} +1 -1
- package/dist/ntriples-Bslqh2Ki.js +4 -0
- package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-CeyruAX4.js} +17 -23
- package/dist/octave-DYn5ltia.js +4 -0
- package/dist/oz-B_N-StZq.js +4 -0
- package/dist/packet-HUATNLJX-CkqjFdAv.js +21 -0
- package/dist/pascal-DU4CtAUu.js +4 -0
- package/dist/perl-Bae6k32u.js +4 -0
- package/dist/pie-WTHONI2E-D0rWwX5P.js +21 -0
- package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C5dSQVCn.js} +28 -28
- package/dist/pig-DSIxUEgX.js +4 -0
- package/dist/powershell-31lcPgIF.js +4 -0
- package/dist/powershell-BZx53Ujw.js +236 -0
- package/dist/properties-lmYbntDG.js +4 -0
- package/dist/protobuf-BTYoCEpV.js +4 -0
- package/dist/pug-DMFM7zzO.js +5 -0
- package/dist/{pug-Bmups_z0.js → pug-PJh82u1M.js} +1 -1
- package/dist/puppet-B0ub07d-.js +4 -0
- package/dist/python-C4jT87Nt.js +5 -0
- package/dist/{q-BzWcnVri.js → q-CMoUHJ5Q.js} +3 -2
- package/dist/q-YbPYlqRI.js +4 -0
- package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DlahxNiy.js} +7 -7
- package/dist/r-OfNu6HAI.js +4 -0
- package/dist/radar-NJJJXTRR-Bxqv4O5a.js +21 -0
- package/dist/{range-CgK0-PEw.js → range-DxfkexCE.js} +3 -3
- package/dist/{react-plotly-BZakcxdv.js → react-plotly-D_IAfR8f.js} +4364 -4705
- package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-DTkinyvU.js} +17 -17
- package/dist/rpm-D_3b5peD.js +5 -0
- package/dist/ruby-CehsJy_T.js +4 -0
- package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-CsLnEnnq.js} +3 -3
- package/dist/sas-DwQHzPoF.js +4 -0
- package/dist/scheme-B6ArxiQu.js +4 -0
- package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-BdEOR6SC.js} +20 -30
- package/dist/shell-AHmQgDfc.js +4 -0
- package/dist/sieve-CgodKOcx.js +4 -0
- package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BP3Jd4vf.js} +1 -1
- package/dist/{slides-component-BEyG25AH.js → slides-component-2bbal1YJ.js} +24 -46
- package/dist/smalltalk-BeFzDkbo.js +4 -0
- package/dist/sparql-BWxq-Lnx.js +4 -0
- package/dist/{src-BNNJRxz3.js → src-DZkaBUmt.js} +6 -6
- package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-DQLH2jhP.js} +39 -41
- package/dist/stateDiagram-v2-UMBNRL4Z-D9v8fKjF.js +38 -0
- package/dist/stex-Dvaq0qsm.js +5 -0
- package/dist/style.css +1 -1
- package/dist/stylus-Ge0ofWlZ.js +4 -0
- package/dist/swift-CjQfbVxV.js +4 -0
- package/dist/tcl-CAGDF11K.js +4 -0
- package/dist/textile-CrXreJtf.js +4 -0
- package/dist/{time-D3tzCqJ6.js → time-CFkXkVrt.js} +1 -1
- package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-bToVq14i.js} +4 -5
- package/dist/{timer-D3Zlu9ow.js → timer-CzOhIJuk.js} +2 -2
- package/dist/{toNumber-efKT08hh.js → toNumber-EFF1Z9T1.js} +2 -2
- package/dist/{toString-BvCd3yJc.js → toString-C2mCkasT.js} +2 -2
- package/dist/toml-AdLXKwEi.js +4 -0
- package/dist/{toml-CIUkU1CP.js → toml-eSl4PUAH.js} +6 -2
- package/dist/treemap-75Q7IDZK-Da9Jv6a_.js +21 -0
- package/dist/troff-C-LaM2ex.js +4 -0
- package/dist/ttcn-DTclUi6T.js +4 -0
- package/dist/ttcn-cfg-BtBPbmLX.js +4 -0
- package/dist/turtle-BODDDg5O.js +4 -0
- package/dist/{types-1X1uZB4y.js → types-CRXV0KD5.js} +84 -95
- package/dist/{useAsyncData-C4IqQK0g.js → useAsyncData-uMVTsDI9.js} +1 -1
- package/dist/{useDateFormatter-BCsBqetx.js → useDateFormatter-Dcz7jstn.js} +6 -6
- package/dist/{useTheme-C2pgJzDH.js → useTheme-NbEx-ZNV.js} +13 -10
- package/dist/vb-Cb1HQHii.js +4 -0
- package/dist/vbscript-CpXOP4wZ.js +4 -0
- package/dist/{vega-component-Cv4J8CHz.js → vega-component-hegVmfuS.js} +21 -21
- package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-DcW8jnKp.js} +1 -2
- package/dist/velocity-Dz0rBQIk.js +4 -0
- package/dist/verilog-6Di9aLKw.js +4 -0
- package/dist/vhdl-BRNesXYc.js +4 -0
- package/dist/webidl-BpRNYIYn.js +4 -0
- package/dist/xquery-DXWcJ7b6.js +4 -0
- package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-C7Bhm_yt.js} +12 -13
- package/dist/yacas-DbSARPz4.js +4 -0
- package/dist/z80-DzslPj_l.js +4 -0
- package/dist/{zod-UPQf9SGn.js → zod-ChY6miG5.js} +71 -81
- package/package.json +12 -12
- package/src/__mocks__/requests.ts +2 -0
- package/src/components/app-config/user-config-form.tsx +29 -25
- package/src/components/chat/chat-utils.ts +11 -4
- package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/columns.tsx +2 -1
- package/src/components/data-table/data-table.tsx +7 -2
- package/src/components/data-table/header-items.tsx +63 -10
- package/src/components/dependency-graph/custom-node.tsx +11 -11
- package/src/components/dependency-graph/elements.ts +9 -4
- package/src/components/dependency-graph/panels.tsx +6 -4
- package/src/components/editor/Output.tsx +6 -1
- package/src/components/editor/ai/ai-completion-editor.tsx +135 -5
- package/src/components/editor/ai/completion-handlers.tsx +106 -22
- package/src/components/editor/cell/code/cell-editor.tsx +5 -0
- package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
- package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
- package/src/components/editor/chrome/types.ts +66 -22
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +2 -0
- package/src/components/editor/errors/auto-fix.tsx +138 -32
- package/src/components/editor/errors/fix-mode.ts +15 -0
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
- package/src/components/editor/navigation/clipboard.ts +2 -1
- package/src/components/editor/notebook-cell.tsx +20 -7
- package/src/components/editor/output/ConsoleOutput.tsx +27 -33
- package/src/components/editor/output/JsonOutput.tsx +9 -0
- package/src/components/editor/output/MarimoTracebackOutput.tsx +10 -7
- package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
- package/src/components/editor/package-alert.tsx +3 -0
- package/src/components/forms/__tests__/form-utils.test.ts +4 -2
- package/src/components/icons/copy-icon.tsx +11 -5
- package/src/components/shortcuts/renderShortcut.tsx +3 -1
- package/src/components/ui/button.tsx +2 -0
- package/src/components/ui/confirmation-button.tsx +85 -0
- package/src/components/ui/switch.tsx +2 -0
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +9 -1
- package/src/core/ai/context/providers/datasource.ts +25 -1
- package/src/core/ai/state.ts +6 -3
- package/src/core/ai/tools/__tests__/registry.test.ts +33 -8
- package/src/core/ai/tools/base.ts +81 -1
- package/src/core/ai/tools/registry.ts +36 -10
- package/src/core/ai/tools/sample-tool.ts +44 -8
- package/src/core/cache/requests.ts +5 -0
- package/src/core/cells/cells.ts +1 -1
- package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
- package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
- package/src/core/codemirror/find-replace/navigate.ts +2 -2
- package/src/core/codemirror/format.ts +2 -9
- package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
- package/src/core/codemirror/language/languages/python.ts +1 -3
- package/src/core/codemirror/language/languages/sql/sql.ts +23 -13
- package/src/core/codemirror/language/panel/panel.tsx +1 -6
- package/src/core/codemirror/language/utils.ts +3 -8
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
- package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
- package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
- package/src/core/codemirror/lsp/types.ts +0 -13
- package/src/core/codemirror/replace-editor-content.ts +87 -0
- package/src/core/config/__tests__/config-schema.test.ts +3 -0
- package/src/core/config/config-schema.ts +8 -0
- package/src/core/config/feature-flag.tsx +2 -4
- package/src/core/errors/__tests__/errors.test.ts +1 -0
- package/src/core/errors/errors.ts +20 -6
- package/src/core/islands/bridge.ts +2 -0
- package/src/core/islands/main.ts +4 -0
- package/src/core/kernel/messages.ts +1 -0
- package/src/core/network/requests-network.ts +14 -0
- package/src/core/network/requests-static.ts +2 -0
- package/src/core/network/requests-toasting.ts +2 -0
- package/src/core/network/types.ts +5 -0
- package/src/core/saving/save-component.tsx +43 -36
- package/src/core/wasm/bridge.ts +2 -0
- package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
- package/src/css/app/codemirror-completions.css +1 -1
- package/src/custom.d.ts +2 -0
- package/src/plugins/core/registerReactComponent.tsx +5 -1
- package/src/plugins/impl/DataTablePlugin.tsx +19 -19
- package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +32 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +17 -2
- package/src/plugins/impl/chat/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
- package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
- package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
- package/src/utils/__tests__/formatting.test.ts +107 -0
- package/src/utils/__tests__/json-parser.test.ts +13 -0
- package/src/utils/copy.ts +6 -0
- package/src/utils/formatting.ts +51 -0
- package/src/utils/json/json-parser.ts +28 -3
- package/dist/any-language-editor-CVFQlioK.js +0 -156
- package/dist/apl-ChlaBfxB.js +0 -4
- package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
- package/dist/asciiarmor-CcJmm3l_.js +0 -4
- package/dist/asn1-ThRYxoBE.js +0 -4
- package/dist/assets/__vite-browser-external-Dv_SHu1h.js +0 -1
- package/dist/assets/worker-DVOR9oZG.js +0 -54
- package/dist/brainfuck-CEM0JgDn.js +0 -4
- package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
- package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
- package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
- package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
- package/dist/clojure-B7RHyE9t.js +0 -4
- package/dist/cmake-TeTMP4I5.js +0 -4
- package/dist/cobol-DI-mxUER.js +0 -4
- package/dist/coffeescript-DHUFLqWp.js +0 -4
- package/dist/commonlisp-SLiUrh1m.js +0 -4
- package/dist/crystal-B4fY1ZfJ.js +0 -4
- package/dist/css-Bdoq3TzK.js +0 -5
- package/dist/cypher-CBU182fp.js +0 -4
- package/dist/d-D8myDZeH.js +0 -4
- package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
- package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
- package/dist/diff-DJF_UB7H.js +0 -4
- package/dist/dist-52-_pKoy.js +0 -6
- package/dist/dist-6DOMStFn.js +0 -6
- package/dist/dist-B334aW7p.js +0 -10
- package/dist/dist-BOI9lUz-.js +0 -12
- package/dist/dist-C06uhBzF.js +0 -6
- package/dist/dist-CGkpguCB.js +0 -6
- package/dist/dist-CrApzUED.js +0 -6
- package/dist/dist-Dp2GLdCl.js +0 -14
- package/dist/dist-WHFsbMDr.js +0 -6
- package/dist/dist-hyKcTPG9.js +0 -10
- package/dist/dtd-DY8q65lC.js +0 -4
- package/dist/dylan-CBLcjWCi.js +0 -4
- package/dist/ecl-BSXPNfOw.js +0 -4
- package/dist/eiffel-BJf0PQX-.js +0 -4
- package/dist/elm-DWQwPCZS.js +0 -4
- package/dist/erlang-BWBaGZ5e.js +0 -4
- package/dist/factor-DT1-MBPl.js +0 -5
- package/dist/forth-D9GDt3FB.js +0 -4
- package/dist/fortran-DHkRhDWw.js +0 -4
- package/dist/gas-7lQEOM0H.js +0 -4
- package/dist/gherkin-BLLyroYi.js +0 -4
- package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
- package/dist/groovy-C-wabwj0.js +0 -4
- package/dist/haskell-DaxVQ_d1.js +0 -4
- package/dist/haxe-C2yLoC7h.js +0 -5
- package/dist/idl-DQBP8i7k.js +0 -4
- package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
- package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
- package/dist/javascript-DRwFV9r5.js +0 -5
- package/dist/jinja2-CNoIpVmN.js +0 -4
- package/dist/julia-DXDf-GhP.js +0 -4
- package/dist/livescript-S2uhJQx7.js +0 -4
- package/dist/lua-Bvgs0y2G.js +0 -4
- package/dist/mathematica-D2zqfwIg.js +0 -4
- package/dist/mbox-SBcPaDuZ.js +0 -4
- package/dist/mirc-hkQc7sVF.js +0 -4
- package/dist/mllike-DRWPBlr9.js +0 -6
- package/dist/modelica-CO2ROGlP.js +0 -4
- package/dist/mscgen-BpX61bO6.js +0 -6
- package/dist/mumps-BCnFeIn6.js +0 -4
- package/dist/nsis-BaTOxlD1.js +0 -5
- package/dist/ntriples-zEo5BWjr.js +0 -4
- package/dist/octave-BE0RnCM9.js +0 -4
- package/dist/oz-C4_2Ttul.js +0 -4
- package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
- package/dist/pascal-Q3jJucpw.js +0 -4
- package/dist/perl-DkXZIWHF.js +0 -4
- package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
- package/dist/pig-DCgEHdsu.js +0 -4
- package/dist/powershell-3rK_nRRJ.js +0 -236
- package/dist/powershell-Eo2-7MoM.js +0 -4
- package/dist/properties-C0IOX8WR.js +0 -4
- package/dist/protobuf--lGQUSRO.js +0 -4
- package/dist/pug-Cf8AQHMJ.js +0 -5
- package/dist/puppet-D7Z3dTJn.js +0 -4
- package/dist/python-FHIx_i8Y.js +0 -5
- package/dist/q-B7UA1feM.js +0 -4
- package/dist/r-Cc9R2A7N.js +0 -4
- package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
- package/dist/rpm-vhJNlrQ6.js +0 -5
- package/dist/ruby-CVluPY0M.js +0 -4
- package/dist/sas-A8DL8oy3.js +0 -4
- package/dist/scheme-6xHHcSXC.js +0 -4
- package/dist/shell-DHN-e5rf.js +0 -4
- package/dist/sieve-BuQwLY02.js +0 -4
- package/dist/smalltalk-BA4HPg2H.js +0 -4
- package/dist/sparql-Bf4yCuy3.js +0 -4
- package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
- package/dist/stex-D-I1cYeE.js +0 -5
- package/dist/stylus-BMeped2l.js +0 -4
- package/dist/swift-lwEdlZoC.js +0 -4
- package/dist/tcl-B03ipeqv.js +0 -4
- package/dist/toml-BLgrVtfu.js +0 -4
- package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
- package/dist/troff-g6EjN2O2.js +0 -4
- package/dist/ttcn-Dzvba8jK.js +0 -4
- package/dist/ttcn-cfg-CadG0p1K.js +0 -4
- package/dist/turtle-DkXAMWo9.js +0 -4
- package/dist/vb-C5dCiel8.js +0 -4
- package/dist/vbscript-I4bDEQln.js +0 -4
- package/dist/velocity-mt0fDwFH.js +0 -4
- package/dist/verilog-Dxq3KJkc.js +0 -4
- package/dist/vhdl-Km0QUlV-.js +0 -4
- package/dist/webidl-B3lJ2MRL.js +0 -4
- package/dist/xquery-CcIxNPEe.js +0 -4
- package/dist/yacas-oMa-f-tN.js +0 -4
- package/dist/z80-D03Nvn6l.js +0 -4
- /package/dist/{apl-DZqo8Elt.js → apl-CEHentF4.js} +0 -0
- /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DURYiCS0.js} +0 -0
- /package/dist/{asn1-DrAXKsZH.js → asn1-ETAiEoXY.js} +0 -0
- /package/dist/{asterisk-oF4U3h48.js → asterisk-DTpbbXPb.js} +0 -0
- /package/dist/{brainfuck-BYgLey30.js → brainfuck-BWQep-SA.js} +0 -0
- /package/dist/{clojure-Bs2M3OUY.js → clojure-BzFapDkA.js} +0 -0
- /package/dist/{cmake-DpI8vxJN.js → cmake-DvlbIC8x.js} +0 -0
- /package/dist/{cobol-BQyrWo72.js → cobol-BrEI4cPR.js} +0 -0
- /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-B6cvu8mO.js} +0 -0
- /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-WqQm7W8t.js} +0 -0
- /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BIT8PQqi.js} +0 -0
- /package/dist/{crystal-DEf_SInh.js → crystal-B_UcPArT.js} +0 -0
- /package/dist/{css-BzTU9lNO.js → css-dHbnt_zl.js} +0 -0
- /package/dist/{cypher-a2v0c11S.js → cypher-Dh3FOpL7.js} +0 -0
- /package/dist/{d-SAswny-M.js → d-CQD1IHee.js} +0 -0
- /package/dist/{diff-OJ-xLXcG.js → diff-CpF_IDx0.js} +0 -0
- /package/dist/{dtd-BsUf-rer.js → dtd-DYoNpy6c.js} +0 -0
- /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-CdIsl9L0.js} +0 -0
- /package/dist/{dylan-C0ZYngjn.js → dylan-Bc_2G1E-.js} +0 -0
- /package/dist/{ebnf-DF1xx0b_.js → ebnf-jGVT_YpN.js} +0 -0
- /package/dist/{ecl-Bsuvoouq.js → ecl-UIU-P-Ar.js} +0 -0
- /package/dist/{eiffel-DgfSpLi-.js → eiffel-C90Oyuix.js} +0 -0
- /package/dist/{elm-GNxDj-5E.js → elm-B9fWSySj.js} +0 -0
- /package/dist/{erlang-Ds3uY1kL.js → erlang-Ccff0UAn.js} +0 -0
- /package/dist/{fcl-CqBgSioc.js → fcl-CGR8NxAg.js} +0 -0
- /package/dist/{forth-JCaLysGk.js → forth-U1ROGcBY.js} +0 -0
- /package/dist/{fortran-Dc2AoKAl.js → fortran-3nOkjDmc.js} +0 -0
- /package/dist/{gas-Q4Uz82YW.js → gas-B_4H5FzV.js} +0 -0
- /package/dist/{gherkin-Dpxe49sQ.js → gherkin-B0eru5Uz.js} +0 -0
- /package/dist/{groovy-D8mTRCu6.js → groovy-dqjtZUVf.js} +0 -0
- /package/dist/{haskell-2_8cC4wY.js → haskell-DFzCCQzo.js} +0 -0
- /package/dist/{haxe-Bl9zkZlz.js → haxe-Da8Pj5RT.js} +0 -0
- /package/dist/{http-DKCqY6yS.js → http-1HACL_9s.js} +0 -0
- /package/dist/{idl-Dn-HNfGW.js → idl-D3NXs5iM.js} +0 -0
- /package/dist/{jinja2-JjFiAGKk.js → jinja2-gBHAxUdF.js} +0 -0
- /package/dist/{julia-R5wne8eu.js → julia-bG-6nJ-_.js} +0 -0
- /package/dist/{livescript-DSwokrYj.js → livescript-BlsRC8UJ.js} +0 -0
- /package/dist/{lua-CgXfrp2-.js → lua-BbDC0_5w.js} +0 -0
- /package/dist/{mathematica-BVli92MR.js → mathematica-YZTe3-PF.js} +0 -0
- /package/dist/{mbox-CMFlocdS.js → mbox-CY5idp08.js} +0 -0
- /package/dist/{mirc-BkW04Zpc.js → mirc-CbQuFZKk.js} +0 -0
- /package/dist/{mllike-DEjvHvNV.js → mllike-DsbHMX-5.js} +0 -0
- /package/dist/{modelica-CxDn-oje.js → modelica-CQuvsOQk.js} +0 -0
- /package/dist/{mscgen-D78wmE-w.js → mscgen-LIpBP9VR.js} +0 -0
- /package/dist/{mumps-Bi0IvPOV.js → mumps-Ct5NXoaG.js} +0 -0
- /package/dist/{nginx-DErPZFhX.js → nginx-Dvc62C8z.js} +0 -0
- /package/dist/{ntriples-Btyp6wRL.js → ntriples-jVkxWUuv.js} +0 -0
- /package/dist/{octave-CZA6-2F8.js → octave-jGOImUB0.js} +0 -0
- /package/dist/{oz-Bm6LSNfE.js → oz-Y0FKDMS2.js} +0 -0
- /package/dist/{pascal-B4J6a9BH.js → pascal-BaLtPWWB.js} +0 -0
- /package/dist/{perl-CzVqxS08.js → perl-CjfE0JLo.js} +0 -0
- /package/dist/{pig-Clh03cnn.js → pig-DE4epV99.js} +0 -0
- /package/dist/{properties-D7ch1Wyb.js → properties-CLyCG5C-.js} +0 -0
- /package/dist/{protobuf-DrkdrMPK.js → protobuf-BjBBs_V4.js} +0 -0
- /package/dist/{puppet-BtZG8zdO.js → puppet-ZImLuomA.js} +0 -0
- /package/dist/{python-B6FKOVIv.js → python-C9YN71pR.js} +0 -0
- /package/dist/{r-Dnvo5-96.js → r-DILmKWWW.js} +0 -0
- /package/dist/{rpm-B1DrgfnX.js → rpm-fpIsm1Kr.js} +0 -0
- /package/dist/{ruby-CelfUg17.js → ruby-BuiQI41h.js} +0 -0
- /package/dist/{sas-DfSQFMWG.js → sas-C76sJ1zF.js} +0 -0
- /package/dist/{scheme-BplhaWuO.js → scheme-DHjM-txv.js} +0 -0
- /package/dist/{shell-DqU5OS2c.js → shell--7NmGJ9p.js} +0 -0
- /package/dist/{sieve-BE4_IyGa.js → sieve-DaPvBv1M.js} +0 -0
- /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-KPvwrjCs.js} +0 -0
- /package/dist/{solr-DlJFg7H5.js → solr-PvZUtEDb.js} +0 -0
- /package/dist/{sparql-7XIlcOgW.js → sparql-CXSUIQer.js} +0 -0
- /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-DPJdGPkx.js} +0 -0
- /package/dist/{sql-CCrq7lfJ.js → sql-Dp4ZLSIa.js} +0 -0
- /package/dist/{stex-BiFc8QAu.js → stex-CeXW4zzk.js} +0 -0
- /package/dist/{stylus-DlSH9xpH.js → stylus-BXcmrg9w.js} +0 -0
- /package/dist/{swift-e3tMTZgJ.js → swift-DD8I7hKP.js} +0 -0
- /package/dist/{tcl-DfZMC20G.js → tcl-B9Lp4GtA.js} +0 -0
- /package/dist/{textile-DaSeca5U.js → textile-qdiY0teq.js} +0 -0
- /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-t32lkubq.js} +0 -0
- /package/dist/{tiki-yJbQzhma.js → tiki-B0qKrSMl.js} +0 -0
- /package/dist/{troff-FN_FrCXR.js → troff-105XJOEu.js} +0 -0
- /package/dist/{ttcn-7_i4HlyB.js → ttcn-1_BxDcM8.js} +0 -0
- /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-Cn_XgXiw.js} +0 -0
- /package/dist/{turtle-QQfeFveR.js → turtle-BI6LyfEu.js} +0 -0
- /package/dist/{vb-DToPVnLa.js → vb-BecoBfmr.js} +0 -0
- /package/dist/{vbscript-CtsNaTz4.js → vbscript-De-zpA4i.js} +0 -0
- /package/dist/{velocity-CAoNe6ns.js → velocity-DhlYJTrD.js} +0 -0
- /package/dist/{verilog-DrDOMiJq.js → verilog-BDZgxDOW.js} +0 -0
- /package/dist/{vhdl-DnO0OEPh.js → vhdl-CV0OKTbp.js} +0 -0
- /package/dist/{webidl-Or6d1ZfA.js → webidl-BOM1Fs0O.js} +0 -0
- /package/dist/{xquery-CEp_Mcpr.js → xquery-CltP_CGh.js} +0 -0
- /package/dist/{yacas-DgnYrSlp.js → yacas-Dch4E2Dg.js} +0 -0
- /package/dist/{z80-DlG_kyeB.js → z80-B5Yly27o.js} +0 -0
package/src/core/cells/cells.ts
CHANGED
|
@@ -1615,7 +1615,7 @@ export const columnIdsAtom = atom((get) =>
|
|
|
1615
1615
|
get(notebookAtom).cellIds.getColumnIds(),
|
|
1616
1616
|
);
|
|
1617
1617
|
|
|
1618
|
-
const cellDataAtom = atomFamily((cellId: CellId) =>
|
|
1618
|
+
export const cellDataAtom = atomFamily((cellId: CellId) =>
|
|
1619
1619
|
atom((get) => get(notebookAtom).cellData[cellId]),
|
|
1620
1620
|
);
|
|
1621
1621
|
const cellRuntimeAtom = atomFamily((cellId: CellId) =>
|
|
@@ -45,6 +45,7 @@ exports[`snapshot all duplicate keymaps > default keymaps 2`] = `
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
"key": "Backspace",
|
|
48
|
+
"preventDefault": true,
|
|
48
49
|
"run": "deleteCharBackward",
|
|
49
50
|
"shift": "deleteCharBackward",
|
|
50
51
|
},
|
|
@@ -153,6 +154,7 @@ exports[`snapshot all duplicate keymaps > vim keymaps 2`] = `
|
|
|
153
154
|
},
|
|
154
155
|
{
|
|
155
156
|
"key": "Backspace",
|
|
157
|
+
"preventDefault": true,
|
|
156
158
|
"run": "deleteCharBackward",
|
|
157
159
|
"shift": "deleteCharBackward",
|
|
158
160
|
},
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { EditorState } from "@codemirror/state";
|
|
4
|
+
import { EditorView } from "@codemirror/view";
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { replaceEditorContent } from "../replace-editor-content";
|
|
7
|
+
|
|
8
|
+
describe("replaceEditorContent", () => {
|
|
9
|
+
it("should replace content when editor doesn't have focus", () => {
|
|
10
|
+
const view = new EditorView({
|
|
11
|
+
state: EditorState.create({
|
|
12
|
+
doc: "original content",
|
|
13
|
+
}),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// Editor doesn't have focus by default
|
|
17
|
+
expect(view.hasFocus).toBe(false);
|
|
18
|
+
|
|
19
|
+
replaceEditorContent(view, "new content");
|
|
20
|
+
|
|
21
|
+
expect(view.state.doc.toString()).toBe("new content");
|
|
22
|
+
// Cursor position is not preserved when not focused
|
|
23
|
+
expect(view.state.selection.main.head).toBe(0);
|
|
24
|
+
|
|
25
|
+
view.destroy();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should preserve cursor position when editor has focus (same line)", () => {
|
|
29
|
+
const view = new EditorView({
|
|
30
|
+
state: EditorState.create({
|
|
31
|
+
doc: "Hello World",
|
|
32
|
+
selection: { anchor: 6 }, // Position after "Hello "
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Mock hasFocus to return true
|
|
37
|
+
Object.defineProperty(view, "hasFocus", {
|
|
38
|
+
get: () => true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
expect(view.hasFocus).toBe(true);
|
|
43
|
+
|
|
44
|
+
// Replace with similar length content on same line
|
|
45
|
+
replaceEditorContent(view, "Goodbye Everyone");
|
|
46
|
+
|
|
47
|
+
expect(view.state.doc.toString()).toBe("Goodbye Everyone");
|
|
48
|
+
|
|
49
|
+
// Cursor should stay at the same column (6) since it's still within the line
|
|
50
|
+
const newCursorPos = view.state.selection.main.head;
|
|
51
|
+
expect(newCursorPos).toBe(6);
|
|
52
|
+
|
|
53
|
+
view.destroy();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should preserve cursor at beginning when focused", () => {
|
|
57
|
+
const view = new EditorView({
|
|
58
|
+
state: EditorState.create({
|
|
59
|
+
doc: "Hello World",
|
|
60
|
+
selection: { anchor: 0 }, // At beginning
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
Object.defineProperty(view, "hasFocus", {
|
|
65
|
+
get: () => true,
|
|
66
|
+
configurable: true,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
replaceEditorContent(view, "Goodbye Everyone");
|
|
70
|
+
|
|
71
|
+
expect(view.state.doc.toString()).toBe("Goodbye Everyone");
|
|
72
|
+
// Cursor should stay at beginning
|
|
73
|
+
expect(view.state.selection.main.head).toBe(0);
|
|
74
|
+
|
|
75
|
+
view.destroy();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("should clamp cursor when line shrinks", () => {
|
|
79
|
+
const view = new EditorView({
|
|
80
|
+
state: EditorState.create({
|
|
81
|
+
doc: "Hello World",
|
|
82
|
+
selection: { anchor: 11 }, // At end (column 11)
|
|
83
|
+
}),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
Object.defineProperty(view, "hasFocus", {
|
|
87
|
+
get: () => true,
|
|
88
|
+
configurable: true,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Replace with shorter content
|
|
92
|
+
replaceEditorContent(view, "Goodbye");
|
|
93
|
+
|
|
94
|
+
expect(view.state.doc.toString()).toBe("Goodbye");
|
|
95
|
+
// Cursor should be clamped to end of line since column 11 > line length (7)
|
|
96
|
+
expect(view.state.selection.main.head).toBe(7);
|
|
97
|
+
|
|
98
|
+
view.destroy();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should handle empty document", () => {
|
|
102
|
+
const view = new EditorView({
|
|
103
|
+
state: EditorState.create({
|
|
104
|
+
doc: "",
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
Object.defineProperty(view, "hasFocus", {
|
|
109
|
+
get: () => true,
|
|
110
|
+
configurable: true,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
replaceEditorContent(view, "new content");
|
|
114
|
+
|
|
115
|
+
expect(view.state.doc.toString()).toBe("new content");
|
|
116
|
+
expect(view.state.selection.main.head).toBe(0);
|
|
117
|
+
|
|
118
|
+
view.destroy();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("should do nothing when content is the same", () => {
|
|
122
|
+
const view = new EditorView({
|
|
123
|
+
state: EditorState.create({
|
|
124
|
+
doc: "same content",
|
|
125
|
+
selection: { anchor: 5 },
|
|
126
|
+
}),
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const dispatchSpy = vi.spyOn(view, "dispatch");
|
|
130
|
+
|
|
131
|
+
replaceEditorContent(view, "same content");
|
|
132
|
+
|
|
133
|
+
// No dispatch should have been called
|
|
134
|
+
expect(dispatchSpy).not.toHaveBeenCalled();
|
|
135
|
+
expect(view.state.doc.toString()).toBe("same content");
|
|
136
|
+
expect(view.state.selection.main.head).toBe(5);
|
|
137
|
+
|
|
138
|
+
view.destroy();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("should handle cursor in middle of focused document", () => {
|
|
142
|
+
const view = new EditorView({
|
|
143
|
+
state: EditorState.create({
|
|
144
|
+
doc: "The quick brown fox jumps",
|
|
145
|
+
selection: { anchor: 10 }, // After "The quick " (column 10)
|
|
146
|
+
}),
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
Object.defineProperty(view, "hasFocus", {
|
|
150
|
+
get: () => true,
|
|
151
|
+
configurable: true,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Replace with longer content
|
|
155
|
+
replaceEditorContent(view, "The extremely quick brown fox jumps over");
|
|
156
|
+
|
|
157
|
+
expect(view.state.doc.toString()).toBe(
|
|
158
|
+
"The extremely quick brown fox jumps over",
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Cursor should stay at same column (10) on same line
|
|
162
|
+
const newCursorPos = view.state.selection.main.head;
|
|
163
|
+
expect(newCursorPos).toBe(10);
|
|
164
|
+
|
|
165
|
+
view.destroy();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("should respect preserveCursor=false when focused", () => {
|
|
169
|
+
const view = new EditorView({
|
|
170
|
+
state: EditorState.create({
|
|
171
|
+
doc: "Hello World",
|
|
172
|
+
selection: { anchor: 6 },
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
Object.defineProperty(view, "hasFocus", {
|
|
177
|
+
get: () => true,
|
|
178
|
+
configurable: true,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
replaceEditorContent(view, "Goodbye Everyone", { preserveCursor: false });
|
|
182
|
+
|
|
183
|
+
expect(view.state.doc.toString()).toBe("Goodbye Everyone");
|
|
184
|
+
// When preserveCursor is false, cursor is not explicitly set
|
|
185
|
+
// so it defaults to 0
|
|
186
|
+
expect(view.state.selection.main.head).toBe(0);
|
|
187
|
+
|
|
188
|
+
view.destroy();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it("should handle newlines and multiline content", () => {
|
|
192
|
+
const view = new EditorView({
|
|
193
|
+
state: EditorState.create({
|
|
194
|
+
doc: "Line 1\nLine 2\nLine 3",
|
|
195
|
+
// Cursor at position 10: "Line 1\nLi|ne 2\nLine 3"
|
|
196
|
+
// Line 2, column 2 (after "Li")
|
|
197
|
+
selection: { anchor: 10 },
|
|
198
|
+
}),
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
Object.defineProperty(view, "hasFocus", {
|
|
202
|
+
get: () => true,
|
|
203
|
+
configurable: true,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
replaceEditorContent(view, "Line 1\nLine 2 updated\nLine 3\nLine 4");
|
|
207
|
+
|
|
208
|
+
expect(view.state.doc.toString()).toBe(
|
|
209
|
+
"Line 1\nLine 2 updated\nLine 3\nLine 4",
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
// Cursor should stay on line 2 at column 2 (after "Li")
|
|
213
|
+
// "Line 1\nLi|ne 2 updated\nLine 3\nLine 4"
|
|
214
|
+
const newCursorPos = view.state.selection.main.head;
|
|
215
|
+
expect(newCursorPos).toBe(10); // Same position, line 2 column 2
|
|
216
|
+
|
|
217
|
+
view.destroy();
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("should move cursor up when line is deleted", () => {
|
|
221
|
+
const view = new EditorView({
|
|
222
|
+
state: EditorState.create({
|
|
223
|
+
doc: "Line 1\nLine 2\nLine 3",
|
|
224
|
+
selection: { anchor: 14 }, // Line 3, start of line
|
|
225
|
+
}),
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
Object.defineProperty(view, "hasFocus", {
|
|
229
|
+
get: () => true,
|
|
230
|
+
configurable: true,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// Replace with only 2 lines (line 3 is deleted)
|
|
234
|
+
replaceEditorContent(view, "Line 1\nLine 2");
|
|
235
|
+
|
|
236
|
+
expect(view.state.doc.toString()).toBe("Line 1\nLine 2");
|
|
237
|
+
|
|
238
|
+
// Cursor should move to end of last available line
|
|
239
|
+
const newCursorPos = view.state.selection.main.head;
|
|
240
|
+
expect(newCursorPos).toBe(13); // End of "Line 1\nLine 2"
|
|
241
|
+
|
|
242
|
+
view.destroy();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("should stay at end of line when new line is added", () => {
|
|
246
|
+
const view = new EditorView({
|
|
247
|
+
state: EditorState.create({
|
|
248
|
+
doc: "Hello World",
|
|
249
|
+
selection: { anchor: 11 }, // At end (column 11)
|
|
250
|
+
}),
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
Object.defineProperty(view, "hasFocus", {
|
|
254
|
+
get: () => true,
|
|
255
|
+
configurable: true,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
replaceEditorContent(view, "Hello World\nSome new line");
|
|
259
|
+
|
|
260
|
+
expect(view.state.doc.toString()).toBe("Hello World\nSome new line");
|
|
261
|
+
const newCursorPos = view.state.selection.main.head;
|
|
262
|
+
expect(newCursorPos).toBe(11);
|
|
263
|
+
|
|
264
|
+
view.destroy();
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it("should preserve cursor on same line with column clamping", () => {
|
|
268
|
+
const view = new EditorView({
|
|
269
|
+
state: EditorState.create({
|
|
270
|
+
doc: "def function_with_long_name():",
|
|
271
|
+
selection: { anchor: 25 }, // Near end of line
|
|
272
|
+
}),
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
Object.defineProperty(view, "hasFocus", {
|
|
276
|
+
get: () => true,
|
|
277
|
+
configurable: true,
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// Replace with shorter line
|
|
281
|
+
replaceEditorContent(view, "def fn():");
|
|
282
|
+
|
|
283
|
+
expect(view.state.doc.toString()).toBe("def fn():");
|
|
284
|
+
|
|
285
|
+
// Cursor should be clamped to end of shorter line
|
|
286
|
+
const newCursorPos = view.state.selection.main.head;
|
|
287
|
+
expect(newCursorPos).toBe(9); // End of "def fn():"
|
|
288
|
+
|
|
289
|
+
view.destroy();
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it("should handle selection range (collapses to head position)", () => {
|
|
293
|
+
const view = new EditorView({
|
|
294
|
+
state: EditorState.create({
|
|
295
|
+
doc: "Hello World",
|
|
296
|
+
selection: { anchor: 0, head: 5 }, // "Hello" selected
|
|
297
|
+
}),
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
Object.defineProperty(view, "hasFocus", {
|
|
301
|
+
get: () => true,
|
|
302
|
+
configurable: true,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
replaceEditorContent(view, "Goodbye Everyone");
|
|
306
|
+
|
|
307
|
+
expect(view.state.doc.toString()).toBe("Goodbye Everyone");
|
|
308
|
+
// Selection head (5) is preserved as cursor position
|
|
309
|
+
expect(view.state.selection.main.head).toBe(5);
|
|
310
|
+
expect(view.state.selection.main.anchor).toBe(5);
|
|
311
|
+
|
|
312
|
+
view.destroy();
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it("should handle replacing with empty string", () => {
|
|
316
|
+
const view = new EditorView({
|
|
317
|
+
state: EditorState.create({
|
|
318
|
+
doc: "Some content to clear",
|
|
319
|
+
selection: { anchor: 10 },
|
|
320
|
+
}),
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
Object.defineProperty(view, "hasFocus", {
|
|
324
|
+
get: () => true,
|
|
325
|
+
configurable: true,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
replaceEditorContent(view, "");
|
|
329
|
+
|
|
330
|
+
expect(view.state.doc.toString()).toBe("");
|
|
331
|
+
// Cursor should be at position 0 (only valid position in empty doc)
|
|
332
|
+
expect(view.state.selection.main.head).toBe(0);
|
|
333
|
+
|
|
334
|
+
view.destroy();
|
|
335
|
+
});
|
|
336
|
+
});
|
|
@@ -4,6 +4,7 @@ import { SearchQuery } from "@codemirror/search";
|
|
|
4
4
|
import { EditorSelection } from "@codemirror/state";
|
|
5
5
|
import { EditorView } from "@codemirror/view";
|
|
6
6
|
import { getAllEditorViews } from "@/core/cells/cells";
|
|
7
|
+
import { replaceEditorContent } from "@/core/codemirror/replace-editor-content";
|
|
7
8
|
import { store } from "@/core/state/jotai";
|
|
8
9
|
import { asQueryCreator, type QueryType } from "./query";
|
|
9
10
|
import { findReplaceAtom } from "./state";
|
|
@@ -127,8 +128,7 @@ export const replaceAll = searchCommand(({ query }) => {
|
|
|
127
128
|
|
|
128
129
|
const prevDoc = view.state.doc.toString();
|
|
129
130
|
undoHandlers.push(() => {
|
|
130
|
-
view
|
|
131
|
-
changes: [{ from: 0, to: view.state.doc.length, insert: prevDoc }],
|
|
131
|
+
replaceEditorContent(view, prevDoc, {
|
|
132
132
|
userEvent: "input.replace.all",
|
|
133
133
|
});
|
|
134
134
|
});
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
getEditorCodeAsPython,
|
|
18
18
|
updateEditorCodeFromPython,
|
|
19
19
|
} from "./language/utils";
|
|
20
|
+
import { replaceEditorContent } from "./replace-editor-content";
|
|
20
21
|
|
|
21
22
|
export const formattingChangeEffect = StateEffect.define<boolean>();
|
|
22
23
|
|
|
@@ -106,15 +107,7 @@ export async function formatSQL(editor: EditorView) {
|
|
|
106
107
|
});
|
|
107
108
|
|
|
108
109
|
// Update editor with formatted SQL
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
// Noop if the code is the same
|
|
112
|
-
if (doc.toString() === formattedSQL) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
editor.dispatch({
|
|
117
|
-
changes: { from: 0, to: doc.length, insert: formattedSQL },
|
|
110
|
+
replaceEditorContent(editor, formattedSQL, {
|
|
118
111
|
effects: [formattingChangeEffect.of(true)],
|
|
119
112
|
});
|
|
120
113
|
}
|
|
@@ -8,6 +8,12 @@ import { PostgreSQL } from "@codemirror/lang-sql";
|
|
|
8
8
|
import { EditorState, type Extension } from "@codemirror/state";
|
|
9
9
|
import { DuckDBDialect } from "@marimo-team/codemirror-sql/dialects";
|
|
10
10
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
11
|
+
import type { CellId } from "@/core/cells/ids";
|
|
12
|
+
import type {
|
|
13
|
+
CompletionConfig,
|
|
14
|
+
DiagnosticsConfig,
|
|
15
|
+
LSPConfig,
|
|
16
|
+
} from "@/core/config/config-schema";
|
|
11
17
|
import type { DataSourceConnection } from "@/core/datasets/data-source-connections";
|
|
12
18
|
import {
|
|
13
19
|
dataSourceConnectionsAtom,
|
|
@@ -16,7 +22,9 @@ import {
|
|
|
16
22
|
import { type ConnectionName, DUCKDB_ENGINE } from "@/core/datasets/engines";
|
|
17
23
|
import { datasetsAtom } from "@/core/datasets/state";
|
|
18
24
|
import type { DatasetsState } from "@/core/datasets/types";
|
|
25
|
+
import type { HotkeyProvider } from "@/core/hotkeys/hotkeys";
|
|
19
26
|
import { store } from "@/core/state/jotai";
|
|
27
|
+
import type { PlaceholderType } from "../../config/types";
|
|
20
28
|
import { TestSQLCompletionStore } from "../languages/sql/completion-store";
|
|
21
29
|
import {
|
|
22
30
|
SQLLanguageAdapter,
|
|
@@ -28,6 +36,16 @@ const adapter = new SQLLanguageAdapter();
|
|
|
28
36
|
|
|
29
37
|
const TEST_ENGINE = "test_engine" as ConnectionName;
|
|
30
38
|
|
|
39
|
+
const TEST_EXTENSION_ARGS = [
|
|
40
|
+
{} as CellId,
|
|
41
|
+
{} as CompletionConfig,
|
|
42
|
+
{} as HotkeyProvider,
|
|
43
|
+
{} as PlaceholderType,
|
|
44
|
+
{} as LSPConfig & {
|
|
45
|
+
diagnostics: DiagnosticsConfig;
|
|
46
|
+
},
|
|
47
|
+
] as const;
|
|
48
|
+
|
|
31
49
|
describe("SQLLanguageAdapter", () => {
|
|
32
50
|
describe("defaultMetadata", () => {
|
|
33
51
|
it("should be set", () => {
|
|
@@ -1716,7 +1734,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1716
1734
|
const ctx = createCompletionContext(state, 14);
|
|
1717
1735
|
|
|
1718
1736
|
const adapter = new SQLLanguageAdapter();
|
|
1719
|
-
const extensions = adapter.getExtension();
|
|
1737
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1720
1738
|
const completion = getCompletion(extensions);
|
|
1721
1739
|
|
|
1722
1740
|
expect(completion).toBeDefined();
|
|
@@ -1779,7 +1797,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1779
1797
|
const ctx = createCompletionContext(state, 15, "u", 14);
|
|
1780
1798
|
|
|
1781
1799
|
const adapter = new SQLLanguageAdapter();
|
|
1782
|
-
const extensions = adapter.getExtension();
|
|
1800
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1783
1801
|
const completion = getCompletion(extensions);
|
|
1784
1802
|
|
|
1785
1803
|
expect(completion).toBeDefined();
|
|
@@ -1810,7 +1828,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1810
1828
|
const ctx = createCompletionContext(state, 15, "d", 14);
|
|
1811
1829
|
|
|
1812
1830
|
const adapter = new SQLLanguageAdapter();
|
|
1813
|
-
const extensions = adapter.getExtension();
|
|
1831
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1814
1832
|
const completion = getCompletion(extensions);
|
|
1815
1833
|
|
|
1816
1834
|
expect(completion).toBeDefined();
|
|
@@ -1843,7 +1861,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1843
1861
|
const ctx = createCompletionContext(state, 3, "SEL", 0);
|
|
1844
1862
|
|
|
1845
1863
|
const adapter = new SQLLanguageAdapter();
|
|
1846
|
-
const extensions = adapter.getExtension();
|
|
1864
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1847
1865
|
const completion = getCompletion(extensions);
|
|
1848
1866
|
|
|
1849
1867
|
expect(completion).toBeDefined();
|
|
@@ -1874,7 +1892,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1874
1892
|
const ctx = createCompletionContext(state, 14, ".n", 12);
|
|
1875
1893
|
|
|
1876
1894
|
const adapter = new SQLLanguageAdapter();
|
|
1877
|
-
const extensions = adapter.getExtension();
|
|
1895
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1878
1896
|
const completion = getCompletion(extensions);
|
|
1879
1897
|
|
|
1880
1898
|
expect(completion).toBeDefined();
|
|
@@ -1906,7 +1924,7 @@ describe("tablesCompletionSource", () => {
|
|
|
1906
1924
|
describe("variableCompletionSource", () => {
|
|
1907
1925
|
it("should be included in extension overrides", () => {
|
|
1908
1926
|
const adapter = new SQLLanguageAdapter();
|
|
1909
|
-
const extensions = adapter.getExtension();
|
|
1927
|
+
const extensions = adapter.getExtension(...TEST_EXTENSION_ARGS);
|
|
1910
1928
|
const completion = getCompletion(extensions);
|
|
1911
1929
|
|
|
1912
1930
|
expect(completion).toBeDefined();
|
|
@@ -128,7 +128,6 @@ const pylspClient = once((lspConfig: LSPConfig) => {
|
|
|
128
128
|
return new NotebookLanguageServerClient(
|
|
129
129
|
new LanguageServerClient({
|
|
130
130
|
...lspClientOpts,
|
|
131
|
-
autoClose: false,
|
|
132
131
|
}),
|
|
133
132
|
settings,
|
|
134
133
|
);
|
|
@@ -146,7 +145,6 @@ const tyLspClient = once((_: LSPConfig) => {
|
|
|
146
145
|
return new NotebookLanguageServerClient(
|
|
147
146
|
new LanguageServerClient({
|
|
148
147
|
...lspClientOpts,
|
|
149
|
-
autoClose: false,
|
|
150
148
|
getWorkspaceConfiguration: (_) => [{ disableLanguageServices: true }],
|
|
151
149
|
}),
|
|
152
150
|
{},
|
|
@@ -165,7 +163,6 @@ const pyrightClient = once((_: LSPConfig) => {
|
|
|
165
163
|
return new NotebookLanguageServerClient(
|
|
166
164
|
new LanguageServerClient({
|
|
167
165
|
...lspClientOpts,
|
|
168
|
-
autoClose: false,
|
|
169
166
|
}),
|
|
170
167
|
{},
|
|
171
168
|
);
|
|
@@ -242,6 +239,7 @@ export class PythonLanguageAdapter implements LanguageAdapter<{}> {
|
|
|
242
239
|
client: client as unknown as LanguageServerClient,
|
|
243
240
|
languageId: "python",
|
|
244
241
|
allowHTMLContent: true,
|
|
242
|
+
useSnippetOnCompletion: false,
|
|
245
243
|
hoverConfig: hoverOptions,
|
|
246
244
|
completionConfig: autocompleteOptions,
|
|
247
245
|
// Default to false
|
|
@@ -18,8 +18,14 @@ import {
|
|
|
18
18
|
} from "@marimo-team/codemirror-sql";
|
|
19
19
|
import { DuckDBDialect } from "@marimo-team/codemirror-sql/dialects";
|
|
20
20
|
import dedent from "string-dedent";
|
|
21
|
+
import type { CellId } from "@/core/cells/ids";
|
|
21
22
|
import { cellIdState } from "@/core/codemirror/cells/state";
|
|
22
|
-
import {
|
|
23
|
+
import type { PlaceholderType } from "@/core/codemirror/config/types";
|
|
24
|
+
import type {
|
|
25
|
+
CompletionConfig,
|
|
26
|
+
DiagnosticsConfig,
|
|
27
|
+
LSPConfig,
|
|
28
|
+
} from "@/core/config/config-schema";
|
|
23
29
|
import {
|
|
24
30
|
dataSourceConnectionsAtom,
|
|
25
31
|
setLatestEngineSelected,
|
|
@@ -30,6 +36,7 @@ import {
|
|
|
30
36
|
INTERNAL_SQL_ENGINES,
|
|
31
37
|
} from "@/core/datasets/engines";
|
|
32
38
|
import { ValidateSQL } from "@/core/datasets/request-registry";
|
|
39
|
+
import type { HotkeyProvider } from "@/core/hotkeys/hotkeys";
|
|
33
40
|
import type { ValidateSQLResult } from "@/core/kernel/messages";
|
|
34
41
|
import { store } from "@/core/state/jotai";
|
|
35
42
|
import { resolvedThemeAtom } from "@/theme/useTheme";
|
|
@@ -77,17 +84,10 @@ export class SQLLanguageAdapter
|
|
|
77
84
|
implements LanguageAdapter<SQLLanguageAdapterMetadata>
|
|
78
85
|
{
|
|
79
86
|
readonly type = "sql";
|
|
80
|
-
sqlLinterEnabled: boolean;
|
|
81
87
|
sqlModeEnabled: boolean;
|
|
82
88
|
|
|
83
89
|
constructor() {
|
|
84
|
-
|
|
85
|
-
this.sqlLinterEnabled = getFeatureFlag("sql_linter");
|
|
86
|
-
this.sqlModeEnabled = getFeatureFlag("sql_mode");
|
|
87
|
-
} catch {
|
|
88
|
-
this.sqlLinterEnabled = false;
|
|
89
|
-
this.sqlModeEnabled = false;
|
|
90
|
-
}
|
|
90
|
+
this.sqlModeEnabled = true;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
get defaultMetadata(): SQLLanguageAdapterMetadata {
|
|
@@ -215,7 +215,13 @@ export class SQLLanguageAdapter
|
|
|
215
215
|
return commentLines;
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
getExtension(
|
|
218
|
+
getExtension(
|
|
219
|
+
_cellId: CellId,
|
|
220
|
+
_completionConfig: CompletionConfig,
|
|
221
|
+
_hotkeys: HotkeyProvider,
|
|
222
|
+
_placeholderType: PlaceholderType,
|
|
223
|
+
lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig },
|
|
224
|
+
): Extension[] {
|
|
219
225
|
const extensions = [
|
|
220
226
|
// This can be updated with a dispatch effect
|
|
221
227
|
sqlConfigCompartment.of(sql({ dialect: DEFAULT_DIALECT })),
|
|
@@ -245,7 +251,9 @@ export class SQLLanguageAdapter
|
|
|
245
251
|
}),
|
|
246
252
|
];
|
|
247
253
|
|
|
248
|
-
|
|
254
|
+
const sqlLinterEnabled = lspConfig?.diagnostics?.sql_linter ?? false;
|
|
255
|
+
|
|
256
|
+
if (sqlLinterEnabled) {
|
|
249
257
|
const theme = store.get(resolvedThemeAtom);
|
|
250
258
|
const parser = new CustomSqlParser({
|
|
251
259
|
getParserOptions: (state: EditorState) => {
|
|
@@ -666,8 +674,10 @@ function sqlValidationExtension(): Extension {
|
|
|
666
674
|
let lastValidationRequest: string | null = null;
|
|
667
675
|
|
|
668
676
|
return EditorView.updateListener.of((update) => {
|
|
669
|
-
// Only run validation if the document has changed
|
|
670
|
-
|
|
677
|
+
// Only run validation if the document has changed
|
|
678
|
+
// The extension only runs on keypress, so we don't need to check for focus
|
|
679
|
+
// This lets AI completions / external calls trigger validation
|
|
680
|
+
if (!update.docChanged) {
|
|
671
681
|
return;
|
|
672
682
|
}
|
|
673
683
|
|
|
@@ -5,7 +5,6 @@ import { Button } from "@/components/ui/button";
|
|
|
5
5
|
import { Checkbox } from "@/components/ui/checkbox";
|
|
6
6
|
import { Tooltip, TooltipProvider } from "@/components/ui/tooltip";
|
|
7
7
|
import { normalizeName } from "@/core/cells/names";
|
|
8
|
-
import { getFeatureFlag } from "@/core/config/feature-flag";
|
|
9
8
|
import { type ConnectionName, DUCKDB_ENGINE } from "@/core/datasets/engines";
|
|
10
9
|
import { useAutoGrowInputProps } from "@/hooks/useAutoGrowInputProps";
|
|
11
10
|
import { formatSQL } from "../../format";
|
|
@@ -71,8 +70,6 @@ export const LanguagePanelComponent: React.FC<{
|
|
|
71
70
|
updateSQLDialectFromConnection(view, engine);
|
|
72
71
|
};
|
|
73
72
|
|
|
74
|
-
const sqlModeEnabled = getFeatureFlag("sql_mode");
|
|
75
|
-
|
|
76
73
|
actions = (
|
|
77
74
|
<div className="flex flex-1 gap-2 items-center">
|
|
78
75
|
<label className="flex gap-2 items-center">
|
|
@@ -98,9 +95,7 @@ export const LanguagePanelComponent: React.FC<{
|
|
|
98
95
|
onChange={switchEngine}
|
|
99
96
|
/>
|
|
100
97
|
<div className="flex items-center gap-2 ml-auto">
|
|
101
|
-
{
|
|
102
|
-
<SQLModeSelect />
|
|
103
|
-
)}
|
|
98
|
+
{metadata.engine === DUCKDB_ENGINE && <SQLModeSelect />}
|
|
104
99
|
<Tooltip content="Format SQL">
|
|
105
100
|
<Button
|
|
106
101
|
variant="text"
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { EditorState } from "@codemirror/state";
|
|
4
4
|
import type { EditorView } from "@codemirror/view";
|
|
5
|
+
import { replaceEditorContent } from "../replace-editor-content";
|
|
5
6
|
import { languageAdapterState } from "./extension";
|
|
6
7
|
import { languageMetadataField } from "./metadata";
|
|
7
8
|
|
|
@@ -36,14 +37,8 @@ export function updateEditorCodeFromPython(
|
|
|
36
37
|
): string {
|
|
37
38
|
const languageAdapter = editor.state.field(languageAdapterState);
|
|
38
39
|
const [code] = languageAdapter.transformIn(pythonCode);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (doc.toString() === code) {
|
|
42
|
-
return code;
|
|
43
|
-
}
|
|
44
|
-
editor.dispatch({
|
|
45
|
-
changes: { from: 0, to: doc.length, insert: code },
|
|
46
|
-
});
|
|
40
|
+
// Use replaceEditorContent which preserves cursor position when focused
|
|
41
|
+
replaceEditorContent(editor, code);
|
|
47
42
|
return code;
|
|
48
43
|
}
|
|
49
44
|
|