jj-plus 0.10.10
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/CHANGELOG.md +30 -0
- package/README.md +102 -0
- package/assets/jj-plus-icon.png +0 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/bin.cjs +112 -0
- package/dist/bin.cjs.map +1 -0
- package/dist/cli/options.cjs +376 -0
- package/dist/cli/options.cjs.map +1 -0
- package/dist/cli/timeline-json.cjs +29 -0
- package/dist/cli/timeline-json.cjs.map +1 -0
- package/dist/extension/blame-codelens.cjs +228 -0
- package/dist/extension/blame-codelens.cjs.map +1 -0
- package/dist/extension/command-runner.cjs +99 -0
- package/dist/extension/command-runner.cjs.map +1 -0
- package/dist/extension/constants.cjs +56 -0
- package/dist/extension/constants.cjs.map +1 -0
- package/dist/extension/editor-extra-features.cjs +464 -0
- package/dist/extension/editor-extra-features.cjs.map +1 -0
- package/dist/extension/history-adapters.cjs +702 -0
- package/dist/extension/history-adapters.cjs.map +1 -0
- package/dist/extension/index.cjs +657 -0
- package/dist/extension/index.cjs.map +1 -0
- package/dist/extension/repo-timeline-panel.cjs +402 -0
- package/dist/extension/repo-timeline-panel.cjs.map +1 -0
- package/dist/extension/resolve-file-path.cjs +16 -0
- package/dist/extension/resolve-file-path.cjs.map +1 -0
- package/dist/extension/revision-diff-nav.cjs +169 -0
- package/dist/extension/revision-diff-nav.cjs.map +1 -0
- package/dist/extension/settings.cjs +41 -0
- package/dist/extension/settings.cjs.map +1 -0
- package/dist/extension/timeline-at-line.cjs +72 -0
- package/dist/extension/timeline-at-line.cjs.map +1 -0
- package/dist/extension/timeline-panel.cjs +1113 -0
- package/dist/extension/timeline-panel.cjs.map +1 -0
- package/dist/extension/timeline-service.cjs +1154 -0
- package/dist/extension/timeline-service.cjs.map +1 -0
- package/dist/extension/uri-utils.cjs +75 -0
- package/dist/extension/uri-utils.cjs.map +1 -0
- package/dist/package.cjs +11 -0
- package/dist/package.cjs.map +1 -0
- package/dist/shared/blame.cjs +211 -0
- package/dist/shared/blame.cjs.map +1 -0
- package/dist/shared/diff-content-search.cjs +23 -0
- package/dist/shared/diff-content-search.cjs.map +1 -0
- package/dist/shared/diff-helpers.cjs +12 -0
- package/dist/shared/diff-helpers.cjs.map +1 -0
- package/dist/shared/diff-stats.cjs +129 -0
- package/dist/shared/diff-stats.cjs.map +1 -0
- package/dist/shared/file-oplog.cjs +82 -0
- package/dist/shared/file-oplog.cjs.map +1 -0
- package/dist/shared/history-helpers.cjs +257 -0
- package/dist/shared/history-helpers.cjs.map +1 -0
- package/dist/shared/history-search.cjs +85 -0
- package/dist/shared/history-search.cjs.map +1 -0
- package/dist/shared/jj-revset-suggestions.cjs +41 -0
- package/dist/shared/jj-revset-suggestions.cjs.map +1 -0
- package/dist/shared/line-history.cjs +181 -0
- package/dist/shared/line-history.cjs.map +1 -0
- package/dist/shared/list-file-revisions.cjs +36 -0
- package/dist/shared/list-file-revisions.cjs.map +1 -0
- package/dist/shared/non-textual-details.cjs +43 -0
- package/dist/shared/non-textual-details.cjs.map +1 -0
- package/dist/shared/resolve-file-path.cjs +14 -0
- package/dist/shared/resolve-file-path.cjs.map +1 -0
- package/dist/shared/revision-diff-availability.cjs +18 -0
- package/dist/shared/revision-diff-availability.cjs.map +1 -0
- package/dist/shared/revision-diff-pair.cjs +42 -0
- package/dist/shared/revision-diff-pair.cjs.map +1 -0
- package/dist/shared/revset.cjs +16 -0
- package/dist/shared/revset.cjs.map +1 -0
- package/dist/shared/timeline-model.cjs +29 -0
- package/dist/shared/timeline-model.cjs.map +1 -0
- package/dist/standalone/server.cjs +1733 -0
- package/dist/standalone/server.cjs.map +1 -0
- package/dist/webview/timeline-template.cjs +214 -0
- package/dist/webview/timeline-template.cjs.map +1 -0
- package/package.json +320 -0
- package/webview-dist/assets/worker-DuV13XDT.js +161 -0
- package/webview-dist/chunks/abap-CLvhMVsD.js +1 -0
- package/webview-dist/chunks/actionscript-3-Cs6JJXT5.js +1 -0
- package/webview-dist/chunks/ada-C5qYipkI.js +1 -0
- package/webview-dist/chunks/ahk-CA9gdOdF.js +1 -0
- package/webview-dist/chunks/ahk2-_6rzW9BS.js +1 -0
- package/webview-dist/chunks/andromeeda-vGVdxbeo.js +1 -0
- package/webview-dist/chunks/angular-html-DTpR04n4.js +1 -0
- package/webview-dist/chunks/angular-ts-BCtbMvbl.js +1 -0
- package/webview-dist/chunks/apache-U0d_L8uA.js +1 -0
- package/webview-dist/chunks/apex-KFGFyKwG.js +1 -0
- package/webview-dist/chunks/apl-BMZuN1Ql.js +1 -0
- package/webview-dist/chunks/applescript-CCn79oCD.js +1 -0
- package/webview-dist/chunks/ara-4CJ0cIlV.js +1 -0
- package/webview-dist/chunks/asciidoc-SCjQUq34.js +1 -0
- package/webview-dist/chunks/asm-Cmm7eHzH.js +1 -0
- package/webview-dist/chunks/astro-DrbV4Z7r.js +1 -0
- package/webview-dist/chunks/aurora-x-CDeNXAV0.js +1 -0
- package/webview-dist/chunks/awk-BWXHIvNe.js +1 -0
- package/webview-dist/chunks/ayu-dark-DluEY0Gj.js +1 -0
- package/webview-dist/chunks/ayu-light-C3h-C4tm.js +1 -0
- package/webview-dist/chunks/ayu-mirage-Bqwy1Gya.js +1 -0
- package/webview-dist/chunks/ballerina-B7ZEbQpA.js +1 -0
- package/webview-dist/chunks/bat-qdxAdBWQ.js +1 -0
- package/webview-dist/chunks/beancount-D-usSTwE.js +1 -0
- package/webview-dist/chunks/berry-DKpUyyne.js +1 -0
- package/webview-dist/chunks/bibtex-Ci_nEsc7.js +1 -0
- package/webview-dist/chunks/bicep-CUHmPFLl.js +1 -0
- package/webview-dist/chunks/bird2-CYIUgYqB.js +1 -0
- package/webview-dist/chunks/blade-oPV8S6rR.js +1 -0
- package/webview-dist/chunks/bsl-_VjlB9mv.js +1 -0
- package/webview-dist/chunks/c-DYf-3tob.js +1 -0
- package/webview-dist/chunks/c3-D0apG41V.js +1 -0
- package/webview-dist/chunks/cadence-CQ2zXKGN.js +1 -0
- package/webview-dist/chunks/cairo-DLTphjLi.js +1 -0
- package/webview-dist/chunks/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/webview-dist/chunks/catppuccin-latte-CtsyrtPq.js +1 -0
- package/webview-dist/chunks/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/webview-dist/chunks/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/webview-dist/chunks/chapel-DY-WYB1D.js +1 -0
- package/webview-dist/chunks/clarity-CtfBBspg.js +1 -0
- package/webview-dist/chunks/clojure-DqKBuwfJ.js +1 -0
- package/webview-dist/chunks/cmake-Bj61d0ZC.js +1 -0
- package/webview-dist/chunks/cobol-DvdX_6CO.js +1 -0
- package/webview-dist/chunks/codeowners-C8r90Shi.js +1 -0
- package/webview-dist/chunks/codeql-oeQT6MSM.js +1 -0
- package/webview-dist/chunks/coffee-C1kO7jr_.js +1 -0
- package/webview-dist/chunks/common-lisp-Cv5bFMCO.js +1 -0
- package/webview-dist/chunks/coq-DuBRPxYg.js +1 -0
- package/webview-dist/chunks/cpp-CoSarUrI.js +1 -0
- package/webview-dist/chunks/crystal-SLJeZ5EP.js +1 -0
- package/webview-dist/chunks/csharp-oqKa8noW.js +1 -0
- package/webview-dist/chunks/css-cfScyrSP.js +1 -0
- package/webview-dist/chunks/csv-Dx-8-gkx.js +1 -0
- package/webview-dist/chunks/cue-CE9AQfxI.js +1 -0
- package/webview-dist/chunks/cypher-ClKdZ_lG.js +1 -0
- package/webview-dist/chunks/d-qD-0Kul2.js +1 -0
- package/webview-dist/chunks/dark-plus-Cs2F2srj.js +1 -0
- package/webview-dist/chunks/dart-CnvKMtbv.js +1 -0
- package/webview-dist/chunks/dax-BkyTk9wS.js +1 -0
- package/webview-dist/chunks/desktop-Dlh5hvp9.js +1 -0
- package/webview-dist/chunks/diff-woXpYk--.js +1 -0
- package/webview-dist/chunks/docker-IyjqRm3v.js +1 -0
- package/webview-dist/chunks/dotenv-_5a1GRtc.js +1 -0
- package/webview-dist/chunks/dracula-BHWKrbxM.js +1 -0
- package/webview-dist/chunks/dracula-soft-5eyTD99u.js +1 -0
- package/webview-dist/chunks/dream-maker-DW3nJb8Q.js +1 -0
- package/webview-dist/chunks/edge-lvBr3t3s.js +1 -0
- package/webview-dist/chunks/elixir-BLoPe0KG.js +1 -0
- package/webview-dist/chunks/elm-BveBINBn.js +1 -0
- package/webview-dist/chunks/emacs-lisp-c_oH4hRZ.js +1 -0
- package/webview-dist/chunks/erb-Bmf8z4ph.js +1 -0
- package/webview-dist/chunks/erlang-Cphh6RMH.js +1 -0
- package/webview-dist/chunks/everforest-dark-sB-x3p7T.js +1 -0
- package/webview-dist/chunks/everforest-light-Df2xbC6M.js +1 -0
- package/webview-dist/chunks/fennel-DQxkIbk2.js +1 -0
- package/webview-dist/chunks/fish-BJitypiv.js +1 -0
- package/webview-dist/chunks/fluent-C03EYrpw.js +1 -0
- package/webview-dist/chunks/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/webview-dist/chunks/fortran-free-form-CYNrtFtB.js +1 -0
- package/webview-dist/chunks/fsharp-D13ZGOAj.js +1 -0
- package/webview-dist/chunks/gdresource-xMC7jr7x.js +1 -0
- package/webview-dist/chunks/gdscript-DYvRD3hg.js +1 -0
- package/webview-dist/chunks/gdshader-CBce3t8t.js +1 -0
- package/webview-dist/chunks/genie-CV2tkWYe.js +1 -0
- package/webview-dist/chunks/gherkin-DExj1W_8.js +1 -0
- package/webview-dist/chunks/git-commit-BSykSTBG.js +1 -0
- package/webview-dist/chunks/git-rebase-BBii7GBM.js +1 -0
- package/webview-dist/chunks/github-dark-C-LZuMrd.js +1 -0
- package/webview-dist/chunks/github-dark-default-DXG-b-1a.js +1 -0
- package/webview-dist/chunks/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/webview-dist/chunks/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/webview-dist/chunks/github-light-EUqPIrTm.js +1 -0
- package/webview-dist/chunks/github-light-default-BXViO-2h.js +1 -0
- package/webview-dist/chunks/github-light-high-contrast-B68TUdTA.js +1 -0
- package/webview-dist/chunks/gleam-CSRkHgEL.js +1 -0
- package/webview-dist/chunks/glimmer-js-CuCPna-X.js +1 -0
- package/webview-dist/chunks/glimmer-ts-DNAjZNDK.js +1 -0
- package/webview-dist/chunks/glsl-COQvRxdz.js +1 -0
- package/webview-dist/chunks/gn-ilITqXS6.js +1 -0
- package/webview-dist/chunks/gnuplot-7GGW24-e.js +1 -0
- package/webview-dist/chunks/go-rLFTqkRN.js +1 -0
- package/webview-dist/chunks/graphql-1cKCVreZ.js +1 -0
- package/webview-dist/chunks/groovy-CacY0gHj.js +1 -0
- package/webview-dist/chunks/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/webview-dist/chunks/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/webview-dist/chunks/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/webview-dist/chunks/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/webview-dist/chunks/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/webview-dist/chunks/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/webview-dist/chunks/hack-7CXYxWGO.js +1 -0
- package/webview-dist/chunks/haml-CeE16iG9.js +1 -0
- package/webview-dist/chunks/handlebars-CLm7Miue.js +1 -0
- package/webview-dist/chunks/haskell-D8IpX4py.js +1 -0
- package/webview-dist/chunks/haxe-C8oCnwJJ.js +1 -0
- package/webview-dist/chunks/hcl-Dh228itO.js +1 -0
- package/webview-dist/chunks/hjson-CxZEssPk.js +1 -0
- package/webview-dist/chunks/hlsl-Cvrh5tZx.js +1 -0
- package/webview-dist/chunks/horizon-CE9ld1lL.js +1 -0
- package/webview-dist/chunks/horizon-bright-DSNQnXHK.js +1 -0
- package/webview-dist/chunks/houston-CsvMBhTu.js +1 -0
- package/webview-dist/chunks/html-EbCri-_j.js +1 -0
- package/webview-dist/chunks/html-derivative-DGcE2kQi.js +1 -0
- package/webview-dist/chunks/http-DpnqgCg2.js +1 -0
- package/webview-dist/chunks/hurl-B6NGpamo.js +1 -0
- package/webview-dist/chunks/hxml-Dcm88srW.js +1 -0
- package/webview-dist/chunks/hy-CZbG8q4J.js +1 -0
- package/webview-dist/chunks/imba-DsUTQ-LC.js +1 -0
- package/webview-dist/chunks/ini-B5eOa1yu.js +1 -0
- package/webview-dist/chunks/java-ZkUoUSJy.js +1 -0
- package/webview-dist/chunks/javascript-DLd0EIw7.js +1 -0
- package/webview-dist/chunks/jinja-WhIqNp3q.js +1 -0
- package/webview-dist/chunks/jison-CIn1t7S8.js +1 -0
- package/webview-dist/chunks/json-AHG_JuKN.js +1 -0
- package/webview-dist/chunks/json5-BR5RXkoi.js +1 -0
- package/webview-dist/chunks/jsonc-CYpm1nAK.js +1 -0
- package/webview-dist/chunks/jsonl-CmCQp5Yx.js +1 -0
- package/webview-dist/chunks/jsonnet-CJTPZ8u_.js +1 -0
- package/webview-dist/chunks/jssm-DXw9l8Rf.js +1 -0
- package/webview-dist/chunks/jsx-BLy2KGb2.js +1 -0
- package/webview-dist/chunks/julia-XrhdGMY0.js +1 -0
- package/webview-dist/chunks/just-CiO9rOBq.js +1 -0
- package/webview-dist/chunks/kanagawa-dragon-Bozd7klA.js +1 -0
- package/webview-dist/chunks/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/webview-dist/chunks/kanagawa-wave-BML5mF2J.js +1 -0
- package/webview-dist/chunks/kdl-CsD5j6eV.js +1 -0
- package/webview-dist/chunks/kotlin-DhhofPvG.js +1 -0
- package/webview-dist/chunks/kusto-C7mF5XQf.js +1 -0
- package/webview-dist/chunks/laserwave-C_8bwKvT.js +1 -0
- package/webview-dist/chunks/latex-4tqdYtbu.js +1 -0
- package/webview-dist/chunks/lean-CewbzKMR.js +1 -0
- package/webview-dist/chunks/less-DVTAwKKz.js +1 -0
- package/webview-dist/chunks/light-plus-DVQuIRkW.js +1 -0
- package/webview-dist/chunks/liquid-BiiWRCLG.js +1 -0
- package/webview-dist/chunks/llvm-DqHOMS-s.js +1 -0
- package/webview-dist/chunks/log-BNLmms1o.js +1 -0
- package/webview-dist/chunks/logo-Cluzi2Zq.js +1 -0
- package/webview-dist/chunks/lua-BPFdS2Mc.js +1 -0
- package/webview-dist/chunks/luau-C2pBCSgt.js +1 -0
- package/webview-dist/chunks/make-Dixweg8N.js +1 -0
- package/webview-dist/chunks/markdown-BYOwaDjH.js +1 -0
- package/webview-dist/chunks/marko-BLi1Yy1V.js +1 -0
- package/webview-dist/chunks/material-theme-Bm3Qr25_.js +1 -0
- package/webview-dist/chunks/material-theme-darker-2IIEA8gg.js +1 -0
- package/webview-dist/chunks/material-theme-lighter-uhdI0v04.js +1 -0
- package/webview-dist/chunks/material-theme-ocean-CHQ94UKr.js +1 -0
- package/webview-dist/chunks/material-theme-palenight-B5W6OYN7.js +1 -0
- package/webview-dist/chunks/matlab-D7qyCx1q.js +1 -0
- package/webview-dist/chunks/mdc-Dx-qyM1x.js +1 -0
- package/webview-dist/chunks/mdx-DQZ5AkYe.js +1 -0
- package/webview-dist/chunks/mermaid-BxpfTIzt.js +1 -0
- package/webview-dist/chunks/min-dark-BSWPekZh.js +1 -0
- package/webview-dist/chunks/min-light-DDpmG2fV.js +1 -0
- package/webview-dist/chunks/mipsasm-BMqwQI7S.js +1 -0
- package/webview-dist/chunks/mojo-fg40_ntQ.js +1 -0
- package/webview-dist/chunks/monokai-B_bV9PQ9.js +1 -0
- package/webview-dist/chunks/moonbit-DgjMoLWr.js +1 -0
- package/webview-dist/chunks/move-BYnGhZoM.js +1 -0
- package/webview-dist/chunks/narrat-_X_XdTYD.js +1 -0
- package/webview-dist/chunks/nextflow-BJtWHP5T.js +1 -0
- package/webview-dist/chunks/nextflow-groovy-DJMQeKeT.js +1 -0
- package/webview-dist/chunks/nginx-rnpjAIVq.js +1 -0
- package/webview-dist/chunks/night-owl-DhmEMT88.js +1 -0
- package/webview-dist/chunks/night-owl-light-eJ-hLW7d.js +1 -0
- package/webview-dist/chunks/nim-kKTJ2fIs.js +1 -0
- package/webview-dist/chunks/nix-IvuFDN5E.js +1 -0
- package/webview-dist/chunks/nord-Cb4Vim4T.js +1 -0
- package/webview-dist/chunks/nsis-CjNLYCLg.js +1 -0
- package/webview-dist/chunks/nushell-DHYfO66s.js +1 -0
- package/webview-dist/chunks/objective-c-D1A_Heim.js +1 -0
- package/webview-dist/chunks/objective-cpp-BsSzOQcm.js +1 -0
- package/webview-dist/chunks/ocaml-O90oeIOV.js +1 -0
- package/webview-dist/chunks/odin-B1RWQWA5.js +1 -0
- package/webview-dist/chunks/one-dark-pro-CLwyXe_n.js +1 -0
- package/webview-dist/chunks/one-light-D7Lr4KcI.js +1 -0
- package/webview-dist/chunks/openscad-BUDT5pXO.js +1 -0
- package/webview-dist/chunks/org-BGWCjkJX.js +1 -0
- package/webview-dist/chunks/pascal-4ZHwLPI5.js +1 -0
- package/webview-dist/chunks/perl-DEimDILQ.js +1 -0
- package/webview-dist/chunks/php-QnaNN--1.js +1 -0
- package/webview-dist/chunks/pierre-dark-CpLgRqie.js +1 -0
- package/webview-dist/chunks/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
- package/webview-dist/chunks/pierre-dark-soft-kZQmAZld.js +1 -0
- package/webview-dist/chunks/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
- package/webview-dist/chunks/pierre-dark-vibrant-CpQYzh95.js +1 -0
- package/webview-dist/chunks/pierre-light-CoaEpmwp.js +1 -0
- package/webview-dist/chunks/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
- package/webview-dist/chunks/pierre-light-soft-lWLdNTOI.js +1 -0
- package/webview-dist/chunks/pierre-light-tritanopia-CEbqgOJL.js +1 -0
- package/webview-dist/chunks/pierre-light-vibrant-D80Fkn33.js +1 -0
- package/webview-dist/chunks/pkl-ot-7Btpt.js +1 -0
- package/webview-dist/chunks/plastic-DQwYfKfQ.js +1 -0
- package/webview-dist/chunks/plsql-DGHpHOYJ.js +1 -0
- package/webview-dist/chunks/po-BiJDBrnU.js +1 -0
- package/webview-dist/chunks/poimandres-DRFjx7u4.js +1 -0
- package/webview-dist/chunks/polar-C7UOKdEL.js +1 -0
- package/webview-dist/chunks/postcss-BXeXVLqQ.js +1 -0
- package/webview-dist/chunks/powerquery-DNMTfnFr.js +1 -0
- package/webview-dist/chunks/powershell-CCSX75yM.js +1 -0
- package/webview-dist/chunks/prisma-DMgNhnYS.js +1 -0
- package/webview-dist/chunks/prolog-iXnhIJG7.js +1 -0
- package/webview-dist/chunks/proto-DB4EqR-F.js +1 -0
- package/webview-dist/chunks/pug-D5rsKmMX.js +1 -0
- package/webview-dist/chunks/puppet-CDv2pdJW.js +1 -0
- package/webview-dist/chunks/purescript-9MfHhQsQ.js +1 -0
- package/webview-dist/chunks/python-gzcpVVnB.js +1 -0
- package/webview-dist/chunks/qml-wvbZb8UE.js +1 -0
- package/webview-dist/chunks/qmldir-DCQb3MpD.js +1 -0
- package/webview-dist/chunks/qss-Fe1Jh2GI.js +1 -0
- package/webview-dist/chunks/r-BNyBFaU1.js +1 -0
- package/webview-dist/chunks/racket-DcIDlBhZ.js +1 -0
- package/webview-dist/chunks/raku-B3gFvitq.js +1 -0
- package/webview-dist/chunks/razor-bKaHS6Kz.js +1 -0
- package/webview-dist/chunks/rbs-C0MpOrj4.js +1 -0
- package/webview-dist/chunks/red-DX1BQOs8.js +1 -0
- package/webview-dist/chunks/reg-CRGYupPL.js +1 -0
- package/webview-dist/chunks/regexp-B-mZuWUh.js +1 -0
- package/webview-dist/chunks/rel-BtDbiS_P.js +1 -0
- package/webview-dist/chunks/riscv-Ckw8ddFX.js +1 -0
- package/webview-dist/chunks/ron-VUp2lXgN.js +1 -0
- package/webview-dist/chunks/rose-pine-aMsaMD1D.js +1 -0
- package/webview-dist/chunks/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/webview-dist/chunks/rose-pine-moon-DO-qXg-I.js +1 -0
- package/webview-dist/chunks/rosmsg-CAekHB0j.js +1 -0
- package/webview-dist/chunks/rst-Qq8ybXHe.js +1 -0
- package/webview-dist/chunks/ruby-U659LEwU.js +1 -0
- package/webview-dist/chunks/rust-Cfkwpbl8.js +1 -0
- package/webview-dist/chunks/sas-C4NtLApe.js +1 -0
- package/webview-dist/chunks/sass-DXrisJhu.js +1 -0
- package/webview-dist/chunks/scala-BiFt_7mu.js +1 -0
- package/webview-dist/chunks/scheme-DQCgrYNe.js +1 -0
- package/webview-dist/chunks/scss-KAaA4sHk.js +1 -0
- package/webview-dist/chunks/sdbl-bTVj8UrX.js +1 -0
- package/webview-dist/chunks/shaderlab-TOUzSsQk.js +1 -0
- package/webview-dist/chunks/shellscript-_7bOVsRC.js +1 -0
- package/webview-dist/chunks/shellsession-Bs_5k0qk.js +1 -0
- package/webview-dist/chunks/slack-dark-DnToyrRv.js +1 -0
- package/webview-dist/chunks/slack-ochin-B2OO5cIa.js +1 -0
- package/webview-dist/chunks/smalltalk-BHpQb5nM.js +1 -0
- package/webview-dist/chunks/smithy-Dgaz7aur.js +1 -0
- package/webview-dist/chunks/snazzy-light-4G7pJPwS.js +1 -0
- package/webview-dist/chunks/solarized-dark-UdsmMDCL.js +1 -0
- package/webview-dist/chunks/solarized-light-C1IUL_tW.js +1 -0
- package/webview-dist/chunks/solidity-Bj7E1mRn.js +1 -0
- package/webview-dist/chunks/soy-C5iuoFCh.js +1 -0
- package/webview-dist/chunks/sparql-D_iOobhT.js +1 -0
- package/webview-dist/chunks/splunk-BC2Px7Mm.js +1 -0
- package/webview-dist/chunks/sql-JX305rZh.js +1 -0
- package/webview-dist/chunks/ssh-config-BgfXC-Er.js +1 -0
- package/webview-dist/chunks/stata-2Rtik3TV.js +1 -0
- package/webview-dist/chunks/stylus-B6D30XZt.js +1 -0
- package/webview-dist/chunks/surrealql-IvpiLAIH.js +1 -0
- package/webview-dist/chunks/svelte-DeZcV_1u.js +1 -0
- package/webview-dist/chunks/swift-CyEgAFGc.js +1 -0
- package/webview-dist/chunks/synthwave-84-nFMaYfgc.js +1 -0
- package/webview-dist/chunks/system-verilog-Dh5ihWbf.js +1 -0
- package/webview-dist/chunks/systemd-BxMlprV5.js +1 -0
- package/webview-dist/chunks/talonscript-CohzipZa.js +1 -0
- package/webview-dist/chunks/tasl-DMoTqEGO.js +1 -0
- package/webview-dist/chunks/tcl-CZd0xW_V.js +1 -0
- package/webview-dist/chunks/templ-CcwjPXJr.js +1 -0
- package/webview-dist/chunks/terraform-DswuEJGm.js +1 -0
- package/webview-dist/chunks/tex-CZYHgHl8.js +1 -0
- package/webview-dist/chunks/tokyo-night-oM2G3aXe.js +1 -0
- package/webview-dist/chunks/toml-CcmNWLt0.js +1 -0
- package/webview-dist/chunks/ts-tags-DPINfEO_.js +1 -0
- package/webview-dist/chunks/tsv-sltzmVWM.js +1 -0
- package/webview-dist/chunks/tsx-Dq7pSIyE.js +1 -0
- package/webview-dist/chunks/turtle-ByJddavk.js +1 -0
- package/webview-dist/chunks/twig-DFpC8yDL.js +1 -0
- package/webview-dist/chunks/typescript-CN-guYmK.js +1 -0
- package/webview-dist/chunks/typespec-BRdr0IET.js +1 -0
- package/webview-dist/chunks/typst-hgW4q6mN.js +1 -0
- package/webview-dist/chunks/v-DBj4K9d_.js +1 -0
- package/webview-dist/chunks/vala-zf12oZj6.js +1 -0
- package/webview-dist/chunks/vb-DOwzaHZ0.js +1 -0
- package/webview-dist/chunks/verilog-B2gwz-sJ.js +1 -0
- package/webview-dist/chunks/vesper-DdrHHSXu.js +1 -0
- package/webview-dist/chunks/vhdl-BroJfC0k.js +1 -0
- package/webview-dist/chunks/viml-DvXPmvsu.js +1 -0
- package/webview-dist/chunks/vitesse-black-fwtXNY1n.js +1 -0
- package/webview-dist/chunks/vitesse-dark-BZCL-v6S.js +1 -0
- package/webview-dist/chunks/vitesse-light-VbXTXTou.js +1 -0
- package/webview-dist/chunks/vue-Dkz9ntel.js +1 -0
- package/webview-dist/chunks/vue-html-Dg8LQ5v3.js +1 -0
- package/webview-dist/chunks/vue-vine-CIEXICEN.js +1 -0
- package/webview-dist/chunks/vyper-CgoNMtux.js +1 -0
- package/webview-dist/chunks/wasm-BnjxR4X6.js +1 -0
- package/webview-dist/chunks/wasm-ByWQv1Qj.js +1 -0
- package/webview-dist/chunks/wenyan-C8pVoKbM.js +1 -0
- package/webview-dist/chunks/wgsl-BsKzXJz4.js +1 -0
- package/webview-dist/chunks/wikitext-ClFFjSW2.js +1 -0
- package/webview-dist/chunks/wit-DdvCle-K.js +1 -0
- package/webview-dist/chunks/wolfram-DLL8P-h_.js +1 -0
- package/webview-dist/chunks/worker-D52zl71O.js +1 -0
- package/webview-dist/chunks/worker-pool-lOjh8Q2A.js +1543 -0
- package/webview-dist/chunks/xml-X7YOen_c.js +1 -0
- package/webview-dist/chunks/xsl-h4d_Px-X.js +1 -0
- package/webview-dist/chunks/yaml-BRDpsfaj.js +1 -0
- package/webview-dist/chunks/zenscript-BnlCZFoB.js +1 -0
- package/webview-dist/chunks/zig-CMLA9XwU.js +1 -0
- package/webview-dist/index.html +18 -0
- package/webview-dist/pierre-worker-portable.js +13633 -0
- package/webview-dist/repo-timeline-app.js +7 -0
- package/webview-dist/repo-timeline.html +14 -0
- package/webview-dist/timeline-app.css +2 -0
- package/webview-dist/timeline-app.js +85 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_resolve_file_path = require("./resolve-file-path.cjs");
|
|
3
|
+
const require_revision_diff_availability = require("../shared/revision-diff-availability.cjs");
|
|
4
|
+
const require_revision_diff_pair = require("../shared/revision-diff-pair.cjs");
|
|
5
|
+
const require_list_file_revisions = require("../shared/list-file-revisions.cjs");
|
|
6
|
+
let node_path = require("node:path");
|
|
7
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
8
|
+
let vscode = require("vscode");
|
|
9
|
+
vscode = require_runtime.__toESM(vscode, 1);
|
|
10
|
+
//#region src/extension/revision-diff-nav.ts
|
|
11
|
+
const CONTEXT_ACTIVE = "jjplus.revisionDiffActive";
|
|
12
|
+
const CONTEXT_HAS_PREVIOUS = "jjplus.revisionDiffHasPrevious";
|
|
13
|
+
const CONTEXT_HAS_NEXT = "jjplus.revisionDiffHasNext";
|
|
14
|
+
function createRevisionDiffNavigator(args) {
|
|
15
|
+
let session;
|
|
16
|
+
let activeRevisionDiffUris = /* @__PURE__ */ new Set();
|
|
17
|
+
const syncContext = async () => {
|
|
18
|
+
const activeSession = activeRevisionDiffUris.has(vscode.window.activeTextEditor?.document.uri.toString() || "") ? session : void 0;
|
|
19
|
+
const availability = require_revision_diff_availability.getRevisionDiffNavAvailability(activeSession);
|
|
20
|
+
await Promise.all([
|
|
21
|
+
vscode.commands.executeCommand("setContext", CONTEXT_ACTIVE, availability.active),
|
|
22
|
+
vscode.commands.executeCommand("setContext", CONTEXT_HAS_PREVIOUS, availability.hasPrevious),
|
|
23
|
+
vscode.commands.executeCommand("setContext", CONTEXT_HAS_NEXT, availability.hasNext)
|
|
24
|
+
]);
|
|
25
|
+
};
|
|
26
|
+
const openPair = async (next, direction = "backward") => {
|
|
27
|
+
const resolvePair = direction === "forward" ? require_revision_diff_pair.resolveNextNonEmptyRevisionPair : require_revision_diff_pair.resolveNonEmptyRevisionPair;
|
|
28
|
+
const showFile = (revset) => args.showFile({
|
|
29
|
+
workspacePath: next.workspacePath,
|
|
30
|
+
revset,
|
|
31
|
+
filePath: next.relativePath
|
|
32
|
+
});
|
|
33
|
+
const pair = await resolvePair({
|
|
34
|
+
revisions: next.revisions,
|
|
35
|
+
tipIndex: next.tipIndex,
|
|
36
|
+
showFile
|
|
37
|
+
});
|
|
38
|
+
if (!pair) throw new Error("No non-empty revision pair available for this file");
|
|
39
|
+
const originalUri = args.createUri({
|
|
40
|
+
workspacePath: next.workspacePath,
|
|
41
|
+
revset: pair.base,
|
|
42
|
+
relativePath: next.relativePath,
|
|
43
|
+
content: pair.originalContent
|
|
44
|
+
});
|
|
45
|
+
const modifiedUri = args.createUri({
|
|
46
|
+
workspacePath: next.workspacePath,
|
|
47
|
+
revset: pair.tip,
|
|
48
|
+
relativePath: next.relativePath,
|
|
49
|
+
content: pair.modifiedContent
|
|
50
|
+
});
|
|
51
|
+
const nextRevisionDiffUris = /* @__PURE__ */ new Set([originalUri.toString(), modifiedUri.toString()]);
|
|
52
|
+
const [previousPair, nextPair] = await Promise.all([require_revision_diff_pair.resolveNonEmptyRevisionPair({
|
|
53
|
+
revisions: next.revisions,
|
|
54
|
+
tipIndex: pair.tipIndex - 1,
|
|
55
|
+
showFile
|
|
56
|
+
}), require_revision_diff_pair.resolveNextNonEmptyRevisionPair({
|
|
57
|
+
revisions: next.revisions,
|
|
58
|
+
tipIndex: pair.tipIndex + 1,
|
|
59
|
+
showFile
|
|
60
|
+
})]);
|
|
61
|
+
session = {
|
|
62
|
+
...next,
|
|
63
|
+
tipIndex: pair.tipIndex,
|
|
64
|
+
previousTipIndex: previousPair?.tipIndex ?? null,
|
|
65
|
+
nextTipIndex: nextPair?.tipIndex ?? null
|
|
66
|
+
};
|
|
67
|
+
await syncContext();
|
|
68
|
+
await vscode.commands.executeCommand("vscode.diff", originalUri, modifiedUri, `${next.fileName}: ${short(pair.base)} → ${short(pair.tip)}`, { preview: true });
|
|
69
|
+
activeRevisionDiffUris = nextRevisionDiffUris;
|
|
70
|
+
await syncContext();
|
|
71
|
+
};
|
|
72
|
+
const openWithPrevious = async (arg) => {
|
|
73
|
+
const absolutePath = require_resolve_file_path.resolveCommandFilePath(arg);
|
|
74
|
+
if (!absolutePath) {
|
|
75
|
+
vscode.window.showErrorMessage("Open a workspace file to diff against the previous revision");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const preferredWorkspacePath = node_path.dirname(absolutePath);
|
|
80
|
+
const historyWorkspacePath = await args.resolveHistoryWorkspacePath({ workspacePath: preferredWorkspacePath });
|
|
81
|
+
const relativePath = args.toRelativePath({
|
|
82
|
+
historyWorkspacePath,
|
|
83
|
+
absolutePath
|
|
84
|
+
});
|
|
85
|
+
if (!relativePath) throw new Error("The selected file is outside the resolved repository root");
|
|
86
|
+
const { backend } = await args.resolveBackend({ workspacePath: historyWorkspacePath });
|
|
87
|
+
const revisions = await args.listRevisions({
|
|
88
|
+
workspacePath: historyWorkspacePath,
|
|
89
|
+
relativePath,
|
|
90
|
+
backend
|
|
91
|
+
});
|
|
92
|
+
if (revisions.length < 2) throw new Error("Need at least two revisions touching this file");
|
|
93
|
+
await openPair({
|
|
94
|
+
workspacePath: historyWorkspacePath,
|
|
95
|
+
relativePath,
|
|
96
|
+
fileName: node_path.basename(absolutePath),
|
|
97
|
+
backend,
|
|
98
|
+
revisions,
|
|
99
|
+
tipIndex: revisions.length - 1
|
|
100
|
+
}, "backward");
|
|
101
|
+
} catch (error) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
vscode.window.showErrorMessage(`Failed to open changes with previous revision: ${message}`);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const openPrevious = async () => {
|
|
107
|
+
const availability = require_revision_diff_availability.getRevisionDiffNavAvailability(session);
|
|
108
|
+
if (!session || !availability.hasPrevious) return;
|
|
109
|
+
try {
|
|
110
|
+
const previousTipIndex = session.previousTipIndex === void 0 ? session.tipIndex - 1 : session.previousTipIndex;
|
|
111
|
+
if (previousTipIndex === null) return;
|
|
112
|
+
await openPair({
|
|
113
|
+
...session,
|
|
114
|
+
tipIndex: previousTipIndex
|
|
115
|
+
}, "backward");
|
|
116
|
+
} catch (error) {
|
|
117
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
118
|
+
vscode.window.showErrorMessage(`Failed to open previous revision: ${message}`);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const openNext = async () => {
|
|
122
|
+
const availability = require_revision_diff_availability.getRevisionDiffNavAvailability(session);
|
|
123
|
+
if (!session || !availability.hasNext) return;
|
|
124
|
+
try {
|
|
125
|
+
const nextTipIndex = session.nextTipIndex === void 0 ? session.tipIndex + 1 : session.nextTipIndex;
|
|
126
|
+
if (nextTipIndex === null) return;
|
|
127
|
+
await openPair({
|
|
128
|
+
...session,
|
|
129
|
+
tipIndex: nextTipIndex
|
|
130
|
+
}, "forward");
|
|
131
|
+
} catch (error) {
|
|
132
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
133
|
+
vscode.window.showErrorMessage(`Failed to open next revision: ${message}`);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const openTimelineHere = async () => {
|
|
137
|
+
if (!session) {
|
|
138
|
+
vscode.window.showErrorMessage("Open a revision diff first");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const absolutePath = node_path.join(session.workspacePath, session.relativePath);
|
|
142
|
+
await vscode.commands.executeCommand("jj-plus.openFileRevisionTimeline", absolutePath);
|
|
143
|
+
};
|
|
144
|
+
const disposable = vscode.window.onDidChangeActiveTextEditor(() => {
|
|
145
|
+
syncContext();
|
|
146
|
+
});
|
|
147
|
+
syncContext();
|
|
148
|
+
return {
|
|
149
|
+
openWithPrevious,
|
|
150
|
+
openPrevious,
|
|
151
|
+
openNext,
|
|
152
|
+
openTimelineHere,
|
|
153
|
+
getSession: () => session,
|
|
154
|
+
dispose: () => {
|
|
155
|
+
disposable.dispose();
|
|
156
|
+
session = void 0;
|
|
157
|
+
activeRevisionDiffUris.clear();
|
|
158
|
+
syncContext();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function short(revision) {
|
|
163
|
+
return revision.length > 12 ? revision.slice(0, 12) : revision;
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
exports.createRevisionDiffNavigator = createRevisionDiffNavigator;
|
|
167
|
+
exports.listFileRevisionIds = require_list_file_revisions.listFileRevisionIds;
|
|
168
|
+
|
|
169
|
+
//# sourceMappingURL=revision-diff-nav.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-diff-nav.cjs","names":["getRevisionDiffNavAvailability","resolveNextNonEmptyRevisionPair","resolveNonEmptyRevisionPair","resolveCommandFilePath","path"],"sources":["../../src/extension/revision-diff-nav.ts"],"sourcesContent":["import * as path from 'node:path';\nimport * as vscode from 'vscode';\nimport { getRevisionDiffNavAvailability } from '../shared/revision-diff-availability.ts';\nimport { resolveNextNonEmptyRevisionPair, resolveNonEmptyRevisionPair } from '../shared/revision-diff-pair.ts';\nimport { resolveCommandFilePath } from './resolve-file-path.ts';\n\nexport type RevisionDiffSession = {\n\tworkspacePath: string;\n\trelativePath: string;\n\tfileName: string;\n\tbackend: 'git' | 'jj';\n\t/** Oldest → newest revision ids for this file (tip last). */\n\trevisions: string[];\n\t/** Index of the \"after\" / tip side currently shown. */\n\ttipIndex: number;\n\t/** Nearest non-empty pair before the current one; null means the edge is known. */\n\tpreviousTipIndex?: number | null;\n\t/** Nearest non-empty pair after the current one; null means the edge is known. */\n\tnextTipIndex?: number | null;\n};\n\nexport { getRevisionDiffNavAvailability } from '../shared/revision-diff-availability.ts';\n\ntype ShowFile = (args: { workspacePath: string; revset: string; filePath: string }) => Promise<string>;\n\ntype CreateUri = (args: { workspacePath: string; revset: string; relativePath: string; content: string }) => vscode.Uri;\n\ntype ListRevisions = (args: {\n\tworkspacePath: string;\n\trelativePath: string;\n\tbackend: 'git' | 'jj';\n}) => Promise<string[]>;\n\ntype ResolveBackend = (args: { workspacePath: string }) => Promise<{ backend: 'git' | 'jj' }>;\n\nconst CONTEXT_ACTIVE = 'jjplus.revisionDiffActive';\nconst CONTEXT_HAS_PREVIOUS = 'jjplus.revisionDiffHasPrevious';\nconst CONTEXT_HAS_NEXT = 'jjplus.revisionDiffHasNext';\n\nexport function createRevisionDiffNavigator(args: {\n\tshowFile: ShowFile;\n\tcreateUri: CreateUri;\n\tlistRevisions: ListRevisions;\n\tresolveBackend: ResolveBackend;\n\tresolveHistoryWorkspacePath: (args: { workspacePath: string }) => Promise<string>;\n\ttoRelativePath: (args: { historyWorkspacePath: string; absolutePath: string }) => string | undefined;\n}): {\n\topenWithPrevious: (arg?: unknown) => Promise<void>;\n\topenPrevious: () => Promise<void>;\n\topenNext: () => Promise<void>;\n\topenTimelineHere: () => Promise<void>;\n\tgetSession: () => RevisionDiffSession | undefined;\n\tdispose: () => void;\n} {\n\tlet session: RevisionDiffSession | undefined;\n\tlet activeRevisionDiffUris = new Set<string>();\n\n\tconst syncContext = async () => {\n\t\tconst activeSession = activeRevisionDiffUris.has(vscode.window.activeTextEditor?.document.uri.toString() || '')\n\t\t\t? session\n\t\t\t: undefined;\n\t\tconst availability = getRevisionDiffNavAvailability(activeSession);\n\t\tawait Promise.all([\n\t\t\tvscode.commands.executeCommand('setContext', CONTEXT_ACTIVE, availability.active),\n\t\t\tvscode.commands.executeCommand('setContext', CONTEXT_HAS_PREVIOUS, availability.hasPrevious),\n\t\t\tvscode.commands.executeCommand('setContext', CONTEXT_HAS_NEXT, availability.hasNext),\n\t\t]);\n\t};\n\n\tconst openPair = async (next: RevisionDiffSession, direction: 'backward' | 'forward' = 'backward') => {\n\t\tconst resolvePair = direction === 'forward' ? resolveNextNonEmptyRevisionPair : resolveNonEmptyRevisionPair;\n\t\tconst showFile = (revset: string) =>\n\t\t\targs.showFile({\n\t\t\t\tworkspacePath: next.workspacePath,\n\t\t\t\trevset,\n\t\t\t\tfilePath: next.relativePath,\n\t\t\t});\n\t\tconst pair = await resolvePair({\n\t\t\trevisions: next.revisions,\n\t\t\ttipIndex: next.tipIndex,\n\t\t\tshowFile,\n\t\t});\n\t\tif (!pair) {\n\t\t\tthrow new Error('No non-empty revision pair available for this file');\n\t\t}\n\t\tconst originalUri = args.createUri({\n\t\t\tworkspacePath: next.workspacePath,\n\t\t\trevset: pair.base,\n\t\t\trelativePath: next.relativePath,\n\t\t\tcontent: pair.originalContent,\n\t\t});\n\t\tconst modifiedUri = args.createUri({\n\t\t\tworkspacePath: next.workspacePath,\n\t\t\trevset: pair.tip,\n\t\t\trelativePath: next.relativePath,\n\t\t\tcontent: pair.modifiedContent,\n\t\t});\n\t\tconst nextRevisionDiffUris = new Set([originalUri.toString(), modifiedUri.toString()]);\n\t\tconst [previousPair, nextPair] = await Promise.all([\n\t\t\tresolveNonEmptyRevisionPair({\n\t\t\t\trevisions: next.revisions,\n\t\t\t\ttipIndex: pair.tipIndex - 1,\n\t\t\t\tshowFile,\n\t\t\t}),\n\t\t\tresolveNextNonEmptyRevisionPair({\n\t\t\t\trevisions: next.revisions,\n\t\t\t\ttipIndex: pair.tipIndex + 1,\n\t\t\t\tshowFile,\n\t\t\t}),\n\t\t]);\n\t\tsession = {\n\t\t\t...next,\n\t\t\ttipIndex: pair.tipIndex,\n\t\t\tpreviousTipIndex: previousPair?.tipIndex ?? null,\n\t\t\tnextTipIndex: nextPair?.tipIndex ?? null,\n\t\t};\n\t\tawait syncContext();\n\t\tawait vscode.commands.executeCommand(\n\t\t\t'vscode.diff',\n\t\t\toriginalUri,\n\t\t\tmodifiedUri,\n\t\t\t`${next.fileName}: ${short(pair.base)} → ${short(pair.tip)}`,\n\t\t\t{ preview: true },\n\t\t);\n\t\tactiveRevisionDiffUris = nextRevisionDiffUris;\n\t\tawait syncContext();\n\t};\n\n\tconst openWithPrevious = async (arg?: unknown) => {\n\t\tconst absolutePath = resolveCommandFilePath(arg);\n\t\tif (!absolutePath) {\n\t\t\tvoid vscode.window.showErrorMessage('Open a workspace file to diff against the previous revision');\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst preferredWorkspacePath = path.dirname(absolutePath);\n\t\t\tconst historyWorkspacePath = await args.resolveHistoryWorkspacePath({\n\t\t\t\tworkspacePath: preferredWorkspacePath,\n\t\t\t});\n\t\t\tconst relativePath = args.toRelativePath({ historyWorkspacePath, absolutePath });\n\t\t\tif (!relativePath) {\n\t\t\t\tthrow new Error('The selected file is outside the resolved repository root');\n\t\t\t}\n\t\t\tconst { backend } = await args.resolveBackend({ workspacePath: historyWorkspacePath });\n\t\t\tconst revisions = await args.listRevisions({\n\t\t\t\tworkspacePath: historyWorkspacePath,\n\t\t\t\trelativePath,\n\t\t\t\tbackend,\n\t\t\t});\n\t\t\tif (revisions.length < 2) {\n\t\t\t\tthrow new Error('Need at least two revisions touching this file');\n\t\t\t}\n\t\t\tawait openPair(\n\t\t\t\t{\n\t\t\t\t\tworkspacePath: historyWorkspacePath,\n\t\t\t\t\trelativePath,\n\t\t\t\t\tfileName: path.basename(absolutePath),\n\t\t\t\t\tbackend,\n\t\t\t\t\trevisions,\n\t\t\t\t\ttipIndex: revisions.length - 1,\n\t\t\t\t},\n\t\t\t\t'backward',\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tvoid vscode.window.showErrorMessage(`Failed to open changes with previous revision: ${message}`);\n\t\t}\n\t};\n\n\tconst openPrevious = async () => {\n\t\tconst availability = getRevisionDiffNavAvailability(session);\n\t\tif (!session || !availability.hasPrevious) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst previousTipIndex = session.previousTipIndex === undefined ? session.tipIndex - 1 : session.previousTipIndex;\n\t\t\tif (previousTipIndex === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait openPair({ ...session, tipIndex: previousTipIndex }, 'backward');\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tvoid vscode.window.showErrorMessage(`Failed to open previous revision: ${message}`);\n\t\t}\n\t};\n\n\tconst openNext = async () => {\n\t\tconst availability = getRevisionDiffNavAvailability(session);\n\t\tif (!session || !availability.hasNext) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst nextTipIndex = session.nextTipIndex === undefined ? session.tipIndex + 1 : session.nextTipIndex;\n\t\t\tif (nextTipIndex === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait openPair({ ...session, tipIndex: nextTipIndex }, 'forward');\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tvoid vscode.window.showErrorMessage(`Failed to open next revision: ${message}`);\n\t\t}\n\t};\n\n\tconst openTimelineHere = async () => {\n\t\tif (!session) {\n\t\t\tvoid vscode.window.showErrorMessage('Open a revision diff first');\n\t\t\treturn;\n\t\t}\n\t\tconst absolutePath = path.join(session.workspacePath, session.relativePath);\n\t\tawait vscode.commands.executeCommand('jj-plus.openFileRevisionTimeline', absolutePath);\n\t};\n\n\tconst disposable = vscode.window.onDidChangeActiveTextEditor(() => {\n\t\tvoid syncContext();\n\t});\n\n\tvoid syncContext();\n\n\treturn {\n\t\topenWithPrevious,\n\t\topenPrevious,\n\t\topenNext,\n\t\topenTimelineHere,\n\t\tgetSession: () => session,\n\t\tdispose: () => {\n\t\t\tdisposable.dispose();\n\t\t\tsession = undefined;\n\t\t\tactiveRevisionDiffUris.clear();\n\t\t\tvoid syncContext();\n\t\t},\n\t};\n}\n\nfunction short(revision: string): string {\n\treturn revision.length > 12 ? revision.slice(0, 12) : revision;\n}\n\nexport { listFileRevisionIds } from '../shared/list-file-revisions.ts';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let vscode = require("vscode");
|
|
3
|
+
vscode = require_runtime.__toESM(vscode, 1);
|
|
4
|
+
//#region src/extension/settings.ts
|
|
5
|
+
const SETTINGS_SECTION = "jjplus";
|
|
6
|
+
function readJjplusSettings() {
|
|
7
|
+
const config = vscode.workspace.getConfiguration(SETTINGS_SECTION);
|
|
8
|
+
const inspectedMode = config.inspect("blameHoverMode");
|
|
9
|
+
const hasExplicitMode = [
|
|
10
|
+
inspectedMode?.workspaceFolderLanguageValue,
|
|
11
|
+
inspectedMode?.workspaceFolderValue,
|
|
12
|
+
inspectedMode?.workspaceLanguageValue,
|
|
13
|
+
inspectedMode?.workspaceValue,
|
|
14
|
+
inspectedMode?.globalLanguageValue,
|
|
15
|
+
inspectedMode?.globalValue
|
|
16
|
+
].some((value) => value !== void 0);
|
|
17
|
+
const configuredMode = config.get("blameHoverMode", "blame");
|
|
18
|
+
const legacyHoverEnabled = config.get("hoverTimelineLink", true);
|
|
19
|
+
return {
|
|
20
|
+
currentLineBlame: config.get("currentLineBlame", true),
|
|
21
|
+
inlineBlameGutter: config.get("inlineBlameGutter", false),
|
|
22
|
+
inlineBlameSparse: config.get("inlineBlameSparse", true),
|
|
23
|
+
blameHoverMode: hasExplicitMode ? configuredMode : legacyHoverEnabled ? "blame" : "never",
|
|
24
|
+
statusBarChangeChip: config.get("statusBarChangeChip", true),
|
|
25
|
+
scmChangedLines: config.get("scmChangedLines", false),
|
|
26
|
+
opLogWatch: config.get("opLogWatch", false),
|
|
27
|
+
conflictHelper: config.get("conflictHelper", true),
|
|
28
|
+
codeActions: config.get("codeActions", false)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function onJjplusSettingsChange(listener) {
|
|
32
|
+
return vscode.workspace.onDidChangeConfiguration((event) => {
|
|
33
|
+
if (event.affectsConfiguration("jjplus")) listener();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.SETTINGS_SECTION = SETTINGS_SECTION;
|
|
38
|
+
exports.onJjplusSettingsChange = onJjplusSettingsChange;
|
|
39
|
+
exports.readJjplusSettings = readJjplusSettings;
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=settings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.cjs","names":[],"sources":["../../src/extension/settings.ts"],"sourcesContent":["import * as vscode from 'vscode';\n\nexport const SETTINGS_SECTION = 'jjplus';\n\nexport type BlameHoverMode = 'blame' | 'any' | 'never';\n\nexport type JjplusSettings = {\n\tcurrentLineBlame: boolean;\n\tinlineBlameGutter: boolean;\n\tinlineBlameSparse: boolean;\n\tblameHoverMode: BlameHoverMode;\n\tstatusBarChangeChip: boolean;\n\tscmChangedLines: boolean;\n\topLogWatch: boolean;\n\tconflictHelper: boolean;\n\tcodeActions: boolean;\n};\n\nexport function readJjplusSettings(): JjplusSettings {\n\tconst config = vscode.workspace.getConfiguration(SETTINGS_SECTION);\n\tconst inspectedMode = config.inspect<BlameHoverMode>('blameHoverMode');\n\tconst hasExplicitMode = [\n\t\tinspectedMode?.workspaceFolderLanguageValue,\n\t\tinspectedMode?.workspaceFolderValue,\n\t\tinspectedMode?.workspaceLanguageValue,\n\t\tinspectedMode?.workspaceValue,\n\t\tinspectedMode?.globalLanguageValue,\n\t\tinspectedMode?.globalValue,\n\t].some((value) => value !== undefined);\n\tconst configuredMode = config.get<BlameHoverMode>('blameHoverMode', 'blame');\n\tconst legacyHoverEnabled = config.get<boolean>('hoverTimelineLink', true);\n\treturn {\n\t\tcurrentLineBlame: config.get<boolean>('currentLineBlame', true),\n\t\tinlineBlameGutter: config.get<boolean>('inlineBlameGutter', false),\n\t\tinlineBlameSparse: config.get<boolean>('inlineBlameSparse', true),\n\t\tblameHoverMode: hasExplicitMode ? configuredMode : legacyHoverEnabled ? 'blame' : 'never',\n\t\tstatusBarChangeChip: config.get<boolean>('statusBarChangeChip', true),\n\t\tscmChangedLines: config.get<boolean>('scmChangedLines', false),\n\t\topLogWatch: config.get<boolean>('opLogWatch', false),\n\t\tconflictHelper: config.get<boolean>('conflictHelper', true),\n\t\tcodeActions: config.get<boolean>('codeActions', false),\n\t};\n}\n\nexport function onJjplusSettingsChange(listener: () => void): vscode.Disposable {\n\treturn vscode.workspace.onDidChangeConfiguration((event) => {\n\t\tif (event.affectsConfiguration(SETTINGS_SECTION)) {\n\t\t\tlistener();\n\t\t}\n\t});\n}\n"],"mappings":";;;;AAEA,MAAa,mBAAmB;AAgBhC,SAAgB,qBAAqC;CACpD,MAAM,SAAS,OAAO,UAAU,iBAAiB,gBAAgB;CACjE,MAAM,gBAAgB,OAAO,QAAwB,gBAAgB;CACrE,MAAM,kBAAkB;EACvB,eAAe;EACf,eAAe;EACf,eAAe;EACf,eAAe;EACf,eAAe;EACf,eAAe;CAChB,CAAC,CAAC,MAAM,UAAU,UAAU,KAAA,CAAS;CACrC,MAAM,iBAAiB,OAAO,IAAoB,kBAAkB,OAAO;CAC3E,MAAM,qBAAqB,OAAO,IAAa,qBAAqB,IAAI;CACxE,OAAO;EACN,kBAAkB,OAAO,IAAa,oBAAoB,IAAI;EAC9D,mBAAmB,OAAO,IAAa,qBAAqB,KAAK;EACjE,mBAAmB,OAAO,IAAa,qBAAqB,IAAI;EAChE,gBAAgB,kBAAkB,iBAAiB,qBAAqB,UAAU;EAClF,qBAAqB,OAAO,IAAa,uBAAuB,IAAI;EACpE,iBAAiB,OAAO,IAAa,mBAAmB,KAAK;EAC7D,YAAY,OAAO,IAAa,cAAc,KAAK;EACnD,gBAAgB,OAAO,IAAa,kBAAkB,IAAI;EAC1D,aAAa,OAAO,IAAa,eAAe,KAAK;CACtD;AACD;AAEA,SAAgB,uBAAuB,UAAyC;CAC/E,OAAO,OAAO,UAAU,0BAA0B,UAAU;EAC3D,IAAI,MAAM,qBAAA,QAAqC,GAC9C,SAAS;CAEX,CAAC;AACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const require_constants = require("./constants.cjs");
|
|
2
|
+
const require_blame = require("../shared/blame.cjs");
|
|
3
|
+
//#region src/extension/timeline-at-line.ts
|
|
4
|
+
function formatTimelineAtLineHoverTitle(args) {
|
|
5
|
+
const bits = [
|
|
6
|
+
args.author?.trim().split(/\s+/u)[0],
|
|
7
|
+
args.when?.trim(),
|
|
8
|
+
args.summary ? truncateBlameSummary(args.summary, 40) : void 0
|
|
9
|
+
].filter(Boolean);
|
|
10
|
+
const detail = bits.length ? ` — ${bits.join(" · ")}` : "";
|
|
11
|
+
return `JJ Plus: Open revision timeline · line ${args.line}${detail}`;
|
|
12
|
+
}
|
|
13
|
+
/** End-of-line decoration text — GitLens-style, no layout shift. */
|
|
14
|
+
function formatCurrentLineBlameDecoration(entry) {
|
|
15
|
+
return ` ${require_blame.formatBlameGutterLabel(entry)}`;
|
|
16
|
+
}
|
|
17
|
+
function truncateBlameSummary(value, maxLength) {
|
|
18
|
+
return require_blame.truncateBlameSummaryForDecoration(value, maxLength);
|
|
19
|
+
}
|
|
20
|
+
function shouldShowBlameHoverAtPosition(args) {
|
|
21
|
+
if (args.mode === "never") return false;
|
|
22
|
+
if (args.mode === "any") return true;
|
|
23
|
+
return args.positionCharacter >= args.lineLength && args.annotatedLines.has(args.line);
|
|
24
|
+
}
|
|
25
|
+
function buildCurrentLineBlameHoverMarkdown(args) {
|
|
26
|
+
const openArgs = encodeURIComponent(JSON.stringify({
|
|
27
|
+
absolutePath: args.absolutePath,
|
|
28
|
+
line: args.line
|
|
29
|
+
}));
|
|
30
|
+
const openLink = `command:${require_constants.OPEN_TIMELINE_AT_LINE_COMMAND}?${openArgs}`;
|
|
31
|
+
const actionArgs = encodeURIComponent(JSON.stringify({
|
|
32
|
+
absolutePath: args.absolutePath,
|
|
33
|
+
line: args.line,
|
|
34
|
+
revision: args.entry.revision
|
|
35
|
+
}));
|
|
36
|
+
const copyRevisionLink = `command:jj-plus.copyBlameRevision?${encodeURIComponent(JSON.stringify({ revision: args.entry.revision }))}`;
|
|
37
|
+
const snapshotLink = `command:jj-plus.openBlameSnapshot?${actionArgs}`;
|
|
38
|
+
const remoteLink = `command:jj-plus.openBlameRemote?${actionArgs}`;
|
|
39
|
+
const revisionDiffLink = `command:jj-plus.openBlameRevisionDiff?${actionArgs}`;
|
|
40
|
+
const author = args.entry.author?.trim() || "Unknown author";
|
|
41
|
+
const when = args.entry.authorDate || "";
|
|
42
|
+
const shortDesc = args.entry.summary?.trim() || "";
|
|
43
|
+
const longDesc = args.fullDescription?.trim() || "";
|
|
44
|
+
const body = longDesc && longDesc !== shortDesc ? `${shortDesc}\n\n${longDesc}` : shortDesc;
|
|
45
|
+
const rev = require_blame.shortBlameRevision(args.entry.revision, 12);
|
|
46
|
+
return [
|
|
47
|
+
`**${escapeMarkdown(author)}**${when ? ` · ${escapeMarkdown(when)}` : ""}`,
|
|
48
|
+
`Line ${args.line} · Revision \`${escapeMarkdownCode(rev)}\``,
|
|
49
|
+
"",
|
|
50
|
+
body ? escapeMarkdownBlock(body) : "_No commit description_",
|
|
51
|
+
"",
|
|
52
|
+
`[Open revision timeline at line ${args.line}](${openLink})`,
|
|
53
|
+
`[Open revision diff](${revisionDiffLink}) · [Open file snapshot](${snapshotLink}) · [Copy revision](${copyRevisionLink}) · [Open remote](${remoteLink})`
|
|
54
|
+
].join("\n");
|
|
55
|
+
}
|
|
56
|
+
function escapeMarkdown(value) {
|
|
57
|
+
return value.replaceAll("\\", "\\\\").replaceAll("`", "\\`").replaceAll("*", "\\*").replaceAll("_", "\\_").replaceAll("[", "\\[").replaceAll("]", "\\]").replaceAll(">", "\\>");
|
|
58
|
+
}
|
|
59
|
+
function escapeMarkdownCode(value) {
|
|
60
|
+
return value.replace(/[\\`]/gu, "\\$&");
|
|
61
|
+
}
|
|
62
|
+
function escapeMarkdownBlock(value) {
|
|
63
|
+
return value.split(/\r?\n/u).map((line) => escapeMarkdown(line)).join("\n");
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.buildCurrentLineBlameHoverMarkdown = buildCurrentLineBlameHoverMarkdown;
|
|
67
|
+
exports.formatCurrentLineBlameDecoration = formatCurrentLineBlameDecoration;
|
|
68
|
+
exports.formatTimelineAtLineHoverTitle = formatTimelineAtLineHoverTitle;
|
|
69
|
+
exports.shouldShowBlameHoverAtPosition = shouldShowBlameHoverAtPosition;
|
|
70
|
+
exports.truncateBlameSummary = truncateBlameSummary;
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=timeline-at-line.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-at-line.cjs","names":["formatBlameGutterLabel","truncateBlameSummaryForDecoration","OPEN_TIMELINE_AT_LINE_COMMAND","shortBlameRevision"],"sources":["../../src/extension/timeline-at-line.ts"],"sourcesContent":["import { OPEN_TIMELINE_AT_LINE_COMMAND } from './constants.ts';\nimport type { BlameLine } from '../shared/blame.ts';\nimport { formatBlameGutterLabel, shortBlameRevision, truncateBlameSummaryForDecoration } from '../shared/blame.ts';\n\nexport function formatTimelineAtLineCodeLensTitle(line: number): string {\n\treturn `JJ Plus: Open revision timeline · line ${line}`;\n}\n\nexport function formatTimelineAtLineHoverTitle(args: {\n\tline: number;\n\tauthor?: string;\n\twhen?: string;\n\tsummary?: string;\n}): string {\n\tconst bits = [\n\t\targs.author?.trim().split(/\\s+/u)[0],\n\t\targs.when?.trim(),\n\t\targs.summary ? truncateBlameSummary(args.summary, 40) : undefined,\n\t].filter(Boolean);\n\tconst detail = bits.length ? ` — ${bits.join(' · ')}` : '';\n\treturn `JJ Plus: Open revision timeline · line ${args.line}${detail}`;\n}\n\nexport function buildTimelineAtLineCodeLens(args: { absolutePath: string; line: number }): {\n\ttitle: string;\n\tcommand: string;\n\targuments: Array<{ absolutePath: string; line: number }>;\n} {\n\treturn {\n\t\ttitle: formatTimelineAtLineCodeLensTitle(args.line),\n\t\tcommand: OPEN_TIMELINE_AT_LINE_COMMAND,\n\t\targuments: [{ absolutePath: args.absolutePath, line: args.line }],\n\t};\n}\n\n/** End-of-line decoration text — GitLens-style, no layout shift. */\nexport function formatCurrentLineBlameDecoration(entry: BlameLine): string {\n\treturn ` ${formatBlameGutterLabel(entry)}`;\n}\n\nexport function truncateBlameSummary(value: string, maxLength: number): string {\n\treturn truncateBlameSummaryForDecoration(value, maxLength);\n}\n\nexport function shouldShowBlameHoverAtPosition(args: {\n\tmode: 'blame' | 'any' | 'never';\n\tpositionCharacter: number;\n\tlineLength: number;\n\tline: number;\n\tannotatedLines: ReadonlySet<number>;\n}): boolean {\n\tif (args.mode === 'never') {\n\t\treturn false;\n\t}\n\tif (args.mode === 'any') {\n\t\treturn true;\n\t}\n\treturn args.positionCharacter >= args.lineLength && args.annotatedLines.has(args.line);\n}\n\nexport function buildCurrentLineBlameHoverMarkdown(args: {\n\tentry: BlameLine;\n\tabsolutePath: string;\n\tline: number;\n\tfullDescription?: string;\n}): string {\n\tconst openArgs = encodeURIComponent(JSON.stringify({ absolutePath: args.absolutePath, line: args.line }));\n\tconst openLink = `command:${OPEN_TIMELINE_AT_LINE_COMMAND}?${openArgs}`;\n\tconst actionArgs = encodeURIComponent(\n\t\tJSON.stringify({ absolutePath: args.absolutePath, line: args.line, revision: args.entry.revision }),\n\t);\n\tconst copyRevisionLink = `command:jj-plus.copyBlameRevision?${encodeURIComponent(JSON.stringify({ revision: args.entry.revision }))}`;\n\tconst snapshotLink = `command:jj-plus.openBlameSnapshot?${actionArgs}`;\n\tconst remoteLink = `command:jj-plus.openBlameRemote?${actionArgs}`;\n\tconst revisionDiffLink = `command:jj-plus.openBlameRevisionDiff?${actionArgs}`;\n\tconst author = args.entry.author?.trim() || 'Unknown author';\n\tconst when = args.entry.authorDate || '';\n\tconst shortDesc = args.entry.summary?.trim() || '';\n\tconst longDesc = args.fullDescription?.trim() || '';\n\tconst body = longDesc && longDesc !== shortDesc ? `${shortDesc}\\n\\n${longDesc}` : shortDesc;\n\tconst rev = shortBlameRevision(args.entry.revision, 12);\n\treturn [\n\t\t`**${escapeMarkdown(author)}**${when ? ` · ${escapeMarkdown(when)}` : ''}`,\n\t\t`Line ${args.line} · Revision \\`${escapeMarkdownCode(rev)}\\``,\n\t\t'',\n\t\tbody ? escapeMarkdownBlock(body) : '_No commit description_',\n\t\t'',\n\t\t`[Open revision timeline at line ${args.line}](${openLink})`,\n\t\t`[Open revision diff](${revisionDiffLink}) · [Open file snapshot](${snapshotLink}) · [Copy revision](${copyRevisionLink}) · [Open remote](${remoteLink})`,\n\t].join('\\n');\n}\n\nfunction escapeMarkdown(value: string): string {\n\treturn value\n\t\t.replaceAll('\\\\', '\\\\\\\\')\n\t\t.replaceAll('`', '\\\\`')\n\t\t.replaceAll('*', '\\\\*')\n\t\t.replaceAll('_', '\\\\_')\n\t\t.replaceAll('[', '\\\\[')\n\t\t.replaceAll(']', '\\\\]')\n\t\t.replaceAll('>', '\\\\>');\n}\n\nfunction escapeMarkdownCode(value: string): string {\n\treturn value.replace(/[\\\\`]/gu, '\\\\$&');\n}\n\nfunction escapeMarkdownBlock(value: string): string {\n\treturn value\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => escapeMarkdown(line))\n\t\t.join('\\n');\n}\n"],"mappings":";;;AAQA,SAAgB,+BAA+B,MAKpC;CACV,MAAM,OAAO;EACZ,KAAK,QAAQ,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC;EAClC,KAAK,MAAM,KAAK;EAChB,KAAK,UAAU,qBAAqB,KAAK,SAAS,EAAE,IAAI,KAAA;CACzD,CAAC,CAAC,OAAO,OAAO;CAChB,MAAM,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,MAAM;CACxD,OAAO,0CAA0C,KAAK,OAAO;AAC9D;;AAeA,SAAgB,iCAAiC,OAA0B;CAC1E,OAAO,KAAKA,cAAAA,uBAAuB,KAAK;AACzC;AAEA,SAAgB,qBAAqB,OAAe,WAA2B;CAC9E,OAAOC,cAAAA,kCAAkC,OAAO,SAAS;AAC1D;AAEA,SAAgB,+BAA+B,MAMnC;CACX,IAAI,KAAK,SAAS,SACjB,OAAO;CAER,IAAI,KAAK,SAAS,OACjB,OAAO;CAER,OAAO,KAAK,qBAAqB,KAAK,cAAc,KAAK,eAAe,IAAI,KAAK,IAAI;AACtF;AAEA,SAAgB,mCAAmC,MAKxC;CACV,MAAM,WAAW,mBAAmB,KAAK,UAAU;EAAE,cAAc,KAAK;EAAc,MAAM,KAAK;CAAK,CAAC,CAAC;CACxG,MAAM,WAAW,WAAWC,kBAAAA,8BAA8B,GAAG;CAC7D,MAAM,aAAa,mBAClB,KAAK,UAAU;EAAE,cAAc,KAAK;EAAc,MAAM,KAAK;EAAM,UAAU,KAAK,MAAM;CAAS,CAAC,CACnG;CACA,MAAM,mBAAmB,qCAAqC,mBAAmB,KAAK,UAAU,EAAE,UAAU,KAAK,MAAM,SAAS,CAAC,CAAC;CAClI,MAAM,eAAe,qCAAqC;CAC1D,MAAM,aAAa,mCAAmC;CACtD,MAAM,mBAAmB,yCAAyC;CAClE,MAAM,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK;CAC5C,MAAM,OAAO,KAAK,MAAM,cAAc;CACtC,MAAM,YAAY,KAAK,MAAM,SAAS,KAAK,KAAK;CAChD,MAAM,WAAW,KAAK,iBAAiB,KAAK,KAAK;CACjD,MAAM,OAAO,YAAY,aAAa,YAAY,GAAG,UAAU,MAAM,aAAa;CAClF,MAAM,MAAMC,cAAAA,mBAAmB,KAAK,MAAM,UAAU,EAAE;CACtD,OAAO;EACN,KAAK,eAAe,MAAM,EAAE,IAAI,OAAO,MAAM,eAAe,IAAI,MAAM;EACtE,QAAQ,KAAK,KAAK,gBAAgB,mBAAmB,GAAG,EAAE;EAC1D;EACA,OAAO,oBAAoB,IAAI,IAAI;EACnC;EACA,mCAAmC,KAAK,KAAK,IAAI,SAAS;EAC1D,wBAAwB,iBAAiB,2BAA2B,aAAa,sBAAsB,iBAAiB,oBAAoB,WAAW;CACxJ,CAAC,CAAC,KAAK,IAAI;AACZ;AAEA,SAAS,eAAe,OAAuB;CAC9C,OAAO,MACL,WAAW,MAAM,MAAM,CAAC,CACxB,WAAW,KAAK,KAAK,CAAC,CACtB,WAAW,KAAK,KAAK,CAAC,CACtB,WAAW,KAAK,KAAK,CAAC,CACtB,WAAW,KAAK,KAAK,CAAC,CACtB,WAAW,KAAK,KAAK,CAAC,CACtB,WAAW,KAAK,KAAK;AACxB;AAEA,SAAS,mBAAmB,OAAuB;CAClD,OAAO,MAAM,QAAQ,WAAW,MAAM;AACvC;AAEA,SAAS,oBAAoB,OAAuB;CACnD,OAAO,MACL,MAAM,QAAQ,CAAC,CACf,KAAK,SAAS,eAAe,IAAI,CAAC,CAAC,CACnC,KAAK,IAAI;AACZ"}
|