folderview 0.0.0-stage → 0.2.1
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/LICENSE +21 -0
- package/README.md +282 -2
- package/dist/cli.js +115 -0
- package/dist/client/assets/app.css +1 -0
- package/dist/client/assets/chunks/abap-EINPUMCJ.js +1 -0
- package/dist/client/assets/chunks/abnfDiagram-S7VZAUFO-W2CM2W6D.js +1 -0
- package/dist/client/assets/chunks/actionscript-3-O776AQUO.js +1 -0
- package/dist/client/assets/chunks/ada-WLOTXRTV.js +1 -0
- package/dist/client/assets/chunks/ahk-EF37A2DY.js +1 -0
- package/dist/client/assets/chunks/ahk2-FH4K3CKT.js +1 -0
- package/dist/client/assets/chunks/angular-html-ZALQFV2H.js +1 -0
- package/dist/client/assets/chunks/angular-ts-4IWMF7QO.js +1 -0
- package/dist/client/assets/chunks/apache-44AYOEWM.js +1 -0
- package/dist/client/assets/chunks/apex-XRYPID42.js +1 -0
- package/dist/client/assets/chunks/apl-5HBALFOI.js +1 -0
- package/dist/client/assets/chunks/applescript-2DZEHZEC.js +1 -0
- package/dist/client/assets/chunks/ara-ZGZQBLXL.js +1 -0
- package/dist/client/assets/chunks/architecture-WOLXFQ4H-EJGENNRL.js +1 -0
- package/dist/client/assets/chunks/architectureDiagram-YGSQEFNW-2VHWSKO6.js +36 -0
- package/dist/client/assets/chunks/asciidoc-GSQAKCPO.js +1 -0
- package/dist/client/assets/chunks/asm-BFURM5BK.js +1 -0
- package/dist/client/assets/chunks/astro-VJORWDZJ.js +1 -0
- package/dist/client/assets/chunks/awk-BSHTWXXX.js +1 -0
- package/dist/client/assets/chunks/ballerina-HAOQJ4B2.js +1 -0
- package/dist/client/assets/chunks/bat-OSH45EOF.js +1 -0
- package/dist/client/assets/chunks/beancount-RBATIHOV.js +1 -0
- package/dist/client/assets/chunks/berry-CZUIOUM4.js +1 -0
- package/dist/client/assets/chunks/bibtex-KCL2UWHE.js +1 -0
- package/dist/client/assets/chunks/bicep-SZJZB3SG.js +1 -0
- package/dist/client/assets/chunks/bird2-XBF5YQQV.js +1 -0
- package/dist/client/assets/chunks/blade-Q24LEVFC.js +1 -0
- package/dist/client/assets/chunks/blockDiagram-APKKGZFW-53LXSOOT.js +140 -0
- package/dist/client/assets/chunks/bpmnIcons-APHXDYXF-FMBRQNTY.js +1 -0
- package/dist/client/assets/chunks/bsl-TI44NWFB.js +1 -0
- package/dist/client/assets/chunks/c-NLHY4Y4N.js +1 -0
- package/dist/client/assets/chunks/c3-BUTEM6PO.js +1 -0
- package/dist/client/assets/chunks/c4Diagram-KJ2TOQU5-O53G4GQH.js +38 -0
- package/dist/client/assets/chunks/cadence-JIRTEU64.js +1 -0
- package/dist/client/assets/chunks/cairo-3W6NVDNW.js +1 -0
- package/dist/client/assets/chunks/chapel-BPBJ2E7K.js +1 -0
- package/dist/client/assets/chunks/chunk-25KVF5ZE.js +1 -0
- package/dist/client/assets/chunks/chunk-2CJKSQOI.js +1 -0
- package/dist/client/assets/chunks/chunk-2QIJRTWR.js +1 -0
- package/dist/client/assets/chunks/chunk-2ZCRJZGF.js +2 -0
- package/dist/client/assets/chunks/chunk-3ILNDZNY.js +213 -0
- package/dist/client/assets/chunks/chunk-3M2OOQ7S.js +1 -0
- package/dist/client/assets/chunks/chunk-3M57NTNK.js +1 -0
- package/dist/client/assets/chunks/chunk-3MR6DCZJ.js +1 -0
- package/dist/client/assets/chunks/chunk-3WGHS7F7.js +1 -0
- package/dist/client/assets/chunks/chunk-4JK75V33.js +1 -0
- package/dist/client/assets/chunks/chunk-4NXNVEWK.js +1 -0
- package/dist/client/assets/chunks/chunk-4RNNBDFQ.js +1 -0
- package/dist/client/assets/chunks/chunk-4T4NVH7V.js +1 -0
- package/dist/client/assets/chunks/chunk-4TFFBC35.js +1 -0
- package/dist/client/assets/chunks/chunk-4WYBE67P.js +1 -0
- package/dist/client/assets/chunks/chunk-56ITEUFA.js +1 -0
- package/dist/client/assets/chunks/chunk-5DXRE7IH.js +1 -0
- package/dist/client/assets/chunks/chunk-5IMADCNU.js +1 -0
- package/dist/client/assets/chunks/chunk-5XZPGKN4.js +1 -0
- package/dist/client/assets/chunks/chunk-6O32UKSP.js +1 -0
- package/dist/client/assets/chunks/chunk-7BAEB64Q.js +1 -0
- package/dist/client/assets/chunks/chunk-7FMWBHZO.js +1 -0
- package/dist/client/assets/chunks/chunk-7GFDITUT.js +1 -0
- package/dist/client/assets/chunks/chunk-7H4MLBHI.js +1 -0
- package/dist/client/assets/chunks/chunk-7OJ4MEEB.js +1 -0
- package/dist/client/assets/chunks/chunk-7RSEISFE.js +1 -0
- package/dist/client/assets/chunks/chunk-7YNZZQVT.js +1 -0
- package/dist/client/assets/chunks/chunk-AB7TIL2G.js +1 -0
- package/dist/client/assets/chunks/chunk-ADDF76FL.js +1 -0
- package/dist/client/assets/chunks/chunk-AF6UTCD4.js +321 -0
- package/dist/client/assets/chunks/chunk-AJ2K6ASU.js +1 -0
- package/dist/client/assets/chunks/chunk-AUBAENQZ.js +1 -0
- package/dist/client/assets/chunks/chunk-BJEYVZ65.js +1 -0
- package/dist/client/assets/chunks/chunk-BLRM6LXA.js +1 -0
- package/dist/client/assets/chunks/chunk-BOCTYCDZ.js +1 -0
- package/dist/client/assets/chunks/chunk-BU4VRYN7.js +1 -0
- package/dist/client/assets/chunks/chunk-CALYHV7D.js +1 -0
- package/dist/client/assets/chunks/chunk-CF4W3RZ4.js +1 -0
- package/dist/client/assets/chunks/chunk-DCZ2OBSL.js +1 -0
- package/dist/client/assets/chunks/chunk-DUFPBTHD.js +1 -0
- package/dist/client/assets/chunks/chunk-DUICIQBC.js +88 -0
- package/dist/client/assets/chunks/chunk-EH2N475V.js +1 -0
- package/dist/client/assets/chunks/chunk-EHLLNPZT.js +1 -0
- package/dist/client/assets/chunks/chunk-EIBFAW37.js +1 -0
- package/dist/client/assets/chunks/chunk-EO3ER3GN.js +1 -0
- package/dist/client/assets/chunks/chunk-FH24BIIA.js +1 -0
- package/dist/client/assets/chunks/chunk-FNOXGAL5.js +2 -0
- package/dist/client/assets/chunks/chunk-FTY6WLQF.js +3 -0
- package/dist/client/assets/chunks/chunk-FZFME6UK.js +1 -0
- package/dist/client/assets/chunks/chunk-FZJZZYYO.js +1 -0
- package/dist/client/assets/chunks/chunk-G4Z6L7OO.js +1 -0
- package/dist/client/assets/chunks/chunk-GNCEAN2B.js +1 -0
- package/dist/client/assets/chunks/chunk-GQJIKV3T.js +1 -0
- package/dist/client/assets/chunks/chunk-GUMNOKT2.js +1 -0
- package/dist/client/assets/chunks/chunk-GXRORAF3.js +1 -0
- package/dist/client/assets/chunks/chunk-H36ABDKY.js +1 -0
- package/dist/client/assets/chunks/chunk-HAR5NYVW.js +1 -0
- package/dist/client/assets/chunks/chunk-HIGPS4L2.js +1 -0
- package/dist/client/assets/chunks/chunk-HMOBGTME.js +1 -0
- package/dist/client/assets/chunks/chunk-HNO6SQ7M.js +1 -0
- package/dist/client/assets/chunks/chunk-HYVZ3GYN.js +1 -0
- package/dist/client/assets/chunks/chunk-I6TGFOQS.js +1 -0
- package/dist/client/assets/chunks/chunk-IHIOJK7I.js +1 -0
- package/dist/client/assets/chunks/chunk-IHJNUMSC.js +1 -0
- package/dist/client/assets/chunks/chunk-IP7PB2OC.js +1 -0
- package/dist/client/assets/chunks/chunk-ISDTMH2Y.js +1 -0
- package/dist/client/assets/chunks/chunk-J65M2LNT.js +1 -0
- package/dist/client/assets/chunks/chunk-JCWYZ7X2.js +62 -0
- package/dist/client/assets/chunks/chunk-JENWYTLI.js +1 -0
- package/dist/client/assets/chunks/chunk-JJ6YWJQS.js +1 -0
- package/dist/client/assets/chunks/chunk-JMUVGGX7.js +32 -0
- package/dist/client/assets/chunks/chunk-JNQUFMM4.js +1 -0
- package/dist/client/assets/chunks/chunk-JPTECOAL.js +1 -0
- package/dist/client/assets/chunks/chunk-JZNK4LKS.js +1 -0
- package/dist/client/assets/chunks/chunk-KPNXJBIW.js +1 -0
- package/dist/client/assets/chunks/chunk-KZO2GZL7.js +1 -0
- package/dist/client/assets/chunks/chunk-L2REESOQ.js +1 -0
- package/dist/client/assets/chunks/chunk-LJPJXR7R.js +1 -0
- package/dist/client/assets/chunks/chunk-LOEZMLCI.js +1 -0
- package/dist/client/assets/chunks/chunk-MLYC6FSE.js +1 -0
- package/dist/client/assets/chunks/chunk-MMDGEZYU.js +1 -0
- package/dist/client/assets/chunks/chunk-MYXE7CGE.js +1 -0
- package/dist/client/assets/chunks/chunk-NBH7YOBD.js +15 -0
- package/dist/client/assets/chunks/chunk-NCOVM3YF.js +1 -0
- package/dist/client/assets/chunks/chunk-NCWOBVU7.js +1 -0
- package/dist/client/assets/chunks/chunk-NLRIHHEH.js +1 -0
- package/dist/client/assets/chunks/chunk-NUPEOYK6.js +1 -0
- package/dist/client/assets/chunks/chunk-O4MVOA7X.js +1 -0
- package/dist/client/assets/chunks/chunk-OBHQQZ4H.js +1 -0
- package/dist/client/assets/chunks/chunk-OKPNJIIR.js +1 -0
- package/dist/client/assets/chunks/chunk-OLMPB57R.js +1 -0
- package/dist/client/assets/chunks/chunk-P2FYOAEV.js +1 -0
- package/dist/client/assets/chunks/chunk-PI3SNP4C.js +1 -0
- package/dist/client/assets/chunks/chunk-PRDTEROB.js +1 -0
- package/dist/client/assets/chunks/chunk-PZELHD2H.js +136 -0
- package/dist/client/assets/chunks/chunk-QR2Q34LM.js +1 -0
- package/dist/client/assets/chunks/chunk-R4GIXL6S.js +1 -0
- package/dist/client/assets/chunks/chunk-RORF4F5V.js +1 -0
- package/dist/client/assets/chunks/chunk-S73BYTLL.js +1 -0
- package/dist/client/assets/chunks/chunk-SFC5MRYR.js +1 -0
- package/dist/client/assets/chunks/chunk-SVM2H22K.js +2 -0
- package/dist/client/assets/chunks/chunk-SZ6UCGVD.js +1 -0
- package/dist/client/assets/chunks/chunk-SZYM6GIJ.js +127 -0
- package/dist/client/assets/chunks/chunk-TT5KJZKM.js +1 -0
- package/dist/client/assets/chunks/chunk-UFBKUYNH.js +1 -0
- package/dist/client/assets/chunks/chunk-UL57AD4T.js +1 -0
- package/dist/client/assets/chunks/chunk-UNEI7LMM.js +1 -0
- package/dist/client/assets/chunks/chunk-VNQBBFIY.js +1 -0
- package/dist/client/assets/chunks/chunk-WGVITPII.js +1 -0
- package/dist/client/assets/chunks/chunk-WRA6KJHX.js +10 -0
- package/dist/client/assets/chunks/chunk-WS5EHW43.js +1 -0
- package/dist/client/assets/chunks/chunk-XE6SLBBE.js +3 -0
- package/dist/client/assets/chunks/chunk-XF5T2P7U.js +72 -0
- package/dist/client/assets/chunks/chunk-XFRY5WKO.js +1 -0
- package/dist/client/assets/chunks/chunk-XWYV4OPA.js +1 -0
- package/dist/client/assets/chunks/chunk-YCE5ECKY.js +1 -0
- package/dist/client/assets/chunks/chunk-YIN5CSIF.js +1 -0
- package/dist/client/assets/chunks/chunk-YLFUX6XH.js +1 -0
- package/dist/client/assets/chunks/chunk-YNXJICZM.js +1 -0
- package/dist/client/assets/chunks/chunk-YOHF7NGD.js +1 -0
- package/dist/client/assets/chunks/chunk-YORIST7Z.js +1 -0
- package/dist/client/assets/chunks/chunk-YUL7CG4R.js +1 -0
- package/dist/client/assets/chunks/chunk-YUN7JSFJ.js +2 -0
- package/dist/client/assets/chunks/chunk-YZ7D2IT7.js +1 -0
- package/dist/client/assets/chunks/chunk-Z7LAPMFJ.js +1 -0
- package/dist/client/assets/chunks/chunk-ZE325LPC.js +1 -0
- package/dist/client/assets/chunks/chunk-ZN7TN6PO.js +1 -0
- package/dist/client/assets/chunks/chunk-ZST3EVPO.js +1 -0
- package/dist/client/assets/chunks/chunk-ZZHMDDZN.js +1 -0
- package/dist/client/assets/chunks/clarity-RKRYQ7WF.js +1 -0
- package/dist/client/assets/chunks/classDiagram-v2-L25IHNXF-Y67HVDZV.js +217 -0
- package/dist/client/assets/chunks/clojure-2X2DQECJ.js +1 -0
- package/dist/client/assets/chunks/cmake-LH5524XE.js +1 -0
- package/dist/client/assets/chunks/cobol-7DALQF3W.js +1 -0
- package/dist/client/assets/chunks/codeowners-52SZU5P5.js +1 -0
- package/dist/client/assets/chunks/codeql-EISH3KUP.js +1 -0
- package/dist/client/assets/chunks/coffee-VAWSGA7Y.js +1 -0
- package/dist/client/assets/chunks/common-lisp-4MVK2AN6.js +1 -0
- package/dist/client/assets/chunks/coq-4VRYZRZV.js +1 -0
- package/dist/client/assets/chunks/core-BRBMZSD2.js +12 -0
- package/dist/client/assets/chunks/cose-bilkent-JH36ORCC-BIOOHSAA.js +1 -0
- package/dist/client/assets/chunks/cpp-RFECMSKD.js +1 -0
- package/dist/client/assets/chunks/crystal-ZBGGFAOI.js +1 -0
- package/dist/client/assets/chunks/csharp-BZDPMKKW.js +1 -0
- package/dist/client/assets/chunks/css-3WWGM6UD.js +1 -0
- package/dist/client/assets/chunks/csv-AB4GNWSB.js +1 -0
- package/dist/client/assets/chunks/cue-2E46MZP2.js +1 -0
- package/dist/client/assets/chunks/cynefin-EF2NZ3EQ-TLFQLWUN.js +1 -0
- package/dist/client/assets/chunks/cynefinDiagram-L36ESFBY-FLPXCSSG.js +62 -0
- package/dist/client/assets/chunks/cypher-HR3ILFOL.js +1 -0
- package/dist/client/assets/chunks/d-TARSZPOL.js +1 -0
- package/dist/client/assets/chunks/dagre-SPEB5RXH-7EGEINJ2.js +4 -0
- package/dist/client/assets/chunks/dart-SALLJHVI.js +1 -0
- package/dist/client/assets/chunks/dax-WYMRGMXC.js +1 -0
- package/dist/client/assets/chunks/desktop-ND5CGLLJ.js +1 -0
- package/dist/client/assets/chunks/diagram-3B7GL73J-6USY4HZX.js +200 -0
- package/dist/client/assets/chunks/diagram-DNEMPZML-BNSOC4VW.js +24 -0
- package/dist/client/assets/chunks/diagram-L3MUGCDN-5V5FZYIG.js +41 -0
- package/dist/client/assets/chunks/diagram-LA4NIPWU-25VLY2CO.js +24 -0
- package/dist/client/assets/chunks/diagram-MHCOC4E2-G2LFP3JU.js +3 -0
- package/dist/client/assets/chunks/diagram-XPFHEONP-E6HBBIBV.js +30 -0
- package/dist/client/assets/chunks/diff-PWYGPM7B.js +1 -0
- package/dist/client/assets/chunks/docker-A4D7DT7W.js +1 -0
- package/dist/client/assets/chunks/dotenv-VWQWV2DY.js +1 -0
- package/dist/client/assets/chunks/dream-maker-M5YDQS35.js +1 -0
- package/dist/client/assets/chunks/ebnfDiagram-UZSYDL2S-BMXXZZPI.js +1 -0
- package/dist/client/assets/chunks/edge-3QXIDJHI.js +1 -0
- package/dist/client/assets/chunks/elixir-3OX2UHIZ.js +1 -0
- package/dist/client/assets/chunks/elk-XV6XMXQE-IPR65FON.js +27 -0
- package/dist/client/assets/chunks/elm-CTS65NCT.js +1 -0
- package/dist/client/assets/chunks/emacs-lisp-HHS2IDO7.js +1 -0
- package/dist/client/assets/chunks/engine-javascript-DNHSF67B.js +141 -0
- package/dist/client/assets/chunks/erDiagram-EYBAPDEH-3GEHFWHG.js +99 -0
- package/dist/client/assets/chunks/erb-ICYWK6HS.js +1 -0
- package/dist/client/assets/chunks/erlang-BDQPNCKX.js +1 -0
- package/dist/client/assets/chunks/eventmodeling-K75KTNOO-B27BJTZL.js +1 -0
- package/dist/client/assets/chunks/fennel-4ONBA2PH.js +1 -0
- package/dist/client/assets/chunks/fish-ATLPBZSD.js +1 -0
- package/dist/client/assets/chunks/flowDiagram-MALGAFMO-5PCLR4AE.js +1 -0
- package/dist/client/assets/chunks/fluent-GGMONBVW.js +1 -0
- package/dist/client/assets/chunks/fortran-fixed-form-5MSBDRWQ.js +1 -0
- package/dist/client/assets/chunks/fortran-free-form-TT3RBL75.js +1 -0
- package/dist/client/assets/chunks/fsharp-PAGHNW4O.js +1 -0
- package/dist/client/assets/chunks/ganttDiagram-23REXITY-VE5MVBTO.js +292 -0
- package/dist/client/assets/chunks/gdresource-5OTP326D.js +1 -0
- package/dist/client/assets/chunks/gdscript-VPWHSCLF.js +1 -0
- package/dist/client/assets/chunks/gdshader-FYLPXFE5.js +1 -0
- package/dist/client/assets/chunks/genie-UYMEEMA2.js +1 -0
- package/dist/client/assets/chunks/gherkin-SU7D5DMY.js +1 -0
- package/dist/client/assets/chunks/git-commit-5CF5QAG7.js +1 -0
- package/dist/client/assets/chunks/git-rebase-X72BAUZI.js +1 -0
- package/dist/client/assets/chunks/gitGraph-VSP46ZUC-J6CJ5YZF.js +1 -0
- package/dist/client/assets/chunks/gitGraphDiagram-STJD7YCW-7YJGT6ZP.js +106 -0
- package/dist/client/assets/chunks/gleam-LR42YRKO.js +1 -0
- package/dist/client/assets/chunks/glimmer-js-JPF67FJU.js +1 -0
- package/dist/client/assets/chunks/glimmer-ts-BYPAVIZT.js +1 -0
- package/dist/client/assets/chunks/glsl-GTGUULBN.js +1 -0
- package/dist/client/assets/chunks/gn-NMDQA4K3.js +1 -0
- package/dist/client/assets/chunks/gnuplot-UUAMYBCZ.js +1 -0
- package/dist/client/assets/chunks/go-4RERSTNP.js +1 -0
- package/dist/client/assets/chunks/graphql-5A6RK6YF.js +1 -0
- package/dist/client/assets/chunks/groovy-O7BJONCU.js +1 -0
- package/dist/client/assets/chunks/hack-7QGTNPDP.js +1 -0
- package/dist/client/assets/chunks/haml-ON5GAWN4.js +1 -0
- package/dist/client/assets/chunks/handlebars-6UOQSUBP.js +1 -0
- package/dist/client/assets/chunks/haskell-OIZXZ26Y.js +1 -0
- package/dist/client/assets/chunks/haxe-7FFVS4FO.js +1 -0
- package/dist/client/assets/chunks/hcl-XFUFQJHV.js +1 -0
- package/dist/client/assets/chunks/hjson-QDBHMTD5.js +1 -0
- package/dist/client/assets/chunks/hlsl-4LP25FFN.js +1 -0
- package/dist/client/assets/chunks/html-7RNQXAAV.js +1 -0
- package/dist/client/assets/chunks/html-derivative-ESOY72Q2.js +1 -0
- package/dist/client/assets/chunks/http-SAD4PMBD.js +1 -0
- package/dist/client/assets/chunks/hurl-ZSJJXPQH.js +1 -0
- package/dist/client/assets/chunks/hxml-HJCC37RK.js +1 -0
- package/dist/client/assets/chunks/hy-CLDE3P4K.js +1 -0
- package/dist/client/assets/chunks/imba-REB34U5V.js +1 -0
- package/dist/client/assets/chunks/info-OHQRW6UA-EQQKXR77.js +1 -0
- package/dist/client/assets/chunks/infoDiagram-KBXO4MBG-F6KGZCGS.js +2 -0
- package/dist/client/assets/chunks/ini-PDFEMGRA.js +1 -0
- package/dist/client/assets/chunks/ishikawaDiagram-M35NCXHK-5D6ZOZ34.js +70 -0
- package/dist/client/assets/chunks/java-KB6XENAD.js +1 -0
- package/dist/client/assets/chunks/javascript-3JX5T423.js +1 -0
- package/dist/client/assets/chunks/jinja-V4UNU6K4.js +1 -0
- package/dist/client/assets/chunks/jison-KH5XNLJP.js +1 -0
- package/dist/client/assets/chunks/journeyDiagram-OPLOXDXO-ANDOJZKW.js +139 -0
- package/dist/client/assets/chunks/json-HPXFRRPY.js +1 -0
- package/dist/client/assets/chunks/json5-LJM6TXWM.js +1 -0
- package/dist/client/assets/chunks/jsonc-UZWRU3JV.js +1 -0
- package/dist/client/assets/chunks/jsonl-RFZD5UN4.js +1 -0
- package/dist/client/assets/chunks/jsonnet-GFZABBL6.js +1 -0
- package/dist/client/assets/chunks/jssm-2YIGBISJ.js +1 -0
- package/dist/client/assets/chunks/jsx-KLV2ZWUT.js +1 -0
- package/dist/client/assets/chunks/julia-3TZDIPPO.js +1 -0
- package/dist/client/assets/chunks/just-UHCONBQS.js +1 -0
- package/dist/client/assets/chunks/kanban-definition-BZKZHSQY-GF5I5NVD.js +89 -0
- package/dist/client/assets/chunks/katex-PIN72PQZ.js +257 -0
- package/dist/client/assets/chunks/kdl-DARTFOCL.js +1 -0
- package/dist/client/assets/chunks/kotlin-7KT5DW6Y.js +1 -0
- package/dist/client/assets/chunks/kusto-EKYXZTC5.js +1 -0
- package/dist/client/assets/chunks/langs-GO3UQR4H.js +1 -0
- package/dist/client/assets/chunks/latex-T57MIHR5.js +1 -0
- package/dist/client/assets/chunks/lean-5QVPRMV6.js +1 -0
- package/dist/client/assets/chunks/less-K6QEH5TN.js +1 -0
- package/dist/client/assets/chunks/liquid-3LCNNEIV.js +1 -0
- package/dist/client/assets/chunks/llvm-O32ZIVRF.js +1 -0
- package/dist/client/assets/chunks/log-C4YPJ5BB.js +1 -0
- package/dist/client/assets/chunks/logo-JPMO43A6.js +1 -0
- package/dist/client/assets/chunks/lua-YKVSOG7K.js +1 -0
- package/dist/client/assets/chunks/luau-K4EECYSO.js +1 -0
- package/dist/client/assets/chunks/make-VHSYMHHW.js +1 -0
- package/dist/client/assets/chunks/markdown-GC5J46H4.js +1 -0
- package/dist/client/assets/chunks/marko-U45YFADC.js +1 -0
- package/dist/client/assets/chunks/matlab-AMOKC4LU.js +1 -0
- package/dist/client/assets/chunks/mdc-DIGA2UXP.js +1 -0
- package/dist/client/assets/chunks/mdx-BZUGCKQA.js +1 -0
- package/dist/client/assets/chunks/mermaid-WHDP6ZPA.js +1 -0
- package/dist/client/assets/chunks/mermaid.core-SQMPMUDN.js +10 -0
- package/dist/client/assets/chunks/mindmap-definition-I2QAS2VK-4NH5S56C.js +98 -0
- package/dist/client/assets/chunks/mipsasm-2S4CUGQV.js +1 -0
- package/dist/client/assets/chunks/mojo-ZOL2PNKT.js +1 -0
- package/dist/client/assets/chunks/moonbit-U3BDAIFE.js +1 -0
- package/dist/client/assets/chunks/move-YSXALBWA.js +1 -0
- package/dist/client/assets/chunks/narrat-DHFIAUJH.js +1 -0
- package/dist/client/assets/chunks/nextflow-ESAKNTI3.js +1 -0
- package/dist/client/assets/chunks/nextflow-groovy-FKDSPJUI.js +1 -0
- package/dist/client/assets/chunks/nginx-XYAYERLO.js +1 -0
- package/dist/client/assets/chunks/nim-XOWBVFDH.js +1 -0
- package/dist/client/assets/chunks/nix-RVSTQSHC.js +1 -0
- package/dist/client/assets/chunks/nsis-KMDUKQRL.js +1 -0
- package/dist/client/assets/chunks/nushell-SKJHHZ7U.js +1 -0
- package/dist/client/assets/chunks/objective-c-3B3KXQ7Q.js +1 -0
- package/dist/client/assets/chunks/objective-cpp-6JDULPJS.js +1 -0
- package/dist/client/assets/chunks/ocaml-TMRFXBVO.js +1 -0
- package/dist/client/assets/chunks/odin-IN3PLCK7.js +1 -0
- package/dist/client/assets/chunks/openscad-P52IKPNH.js +1 -0
- package/dist/client/assets/chunks/org-N3SJ2PIA.js +1 -0
- package/dist/client/assets/chunks/packet-JDAUHWVQ-4SWIKSKP.js +1 -0
- package/dist/client/assets/chunks/pascal-T7CUWCQ4.js +1 -0
- package/dist/client/assets/chunks/pegDiagram-FD4XPPHP-WDKZSEGN.js +1 -0
- package/dist/client/assets/chunks/perl-LCZ4KODH.js +1 -0
- package/dist/client/assets/chunks/php-4XHMBVR5.js +1 -0
- package/dist/client/assets/chunks/pie-XZMESJXO-PSSWOWGV.js +1 -0
- package/dist/client/assets/chunks/pieDiagram-J4AKIIQI-BDW5I5ON.js +39 -0
- package/dist/client/assets/chunks/pkl-OACG5B67.js +1 -0
- package/dist/client/assets/chunks/plsql-7E5C7CJX.js +1 -0
- package/dist/client/assets/chunks/po-ZSREFRRP.js +1 -0
- package/dist/client/assets/chunks/polar-4GBINVA7.js +1 -0
- package/dist/client/assets/chunks/postcss-B7RPVGFW.js +1 -0
- package/dist/client/assets/chunks/powerquery-6UFMTY4G.js +1 -0
- package/dist/client/assets/chunks/powershell-3STRPCNT.js +1 -0
- package/dist/client/assets/chunks/prisma-4TPSPIZ5.js +1 -0
- package/dist/client/assets/chunks/prolog-HEAYPKQW.js +1 -0
- package/dist/client/assets/chunks/proto-Y3Y3VKXM.js +1 -0
- package/dist/client/assets/chunks/pug-7PBPMG3M.js +1 -0
- package/dist/client/assets/chunks/puppet-FR35R4OI.js +1 -0
- package/dist/client/assets/chunks/purescript-OUHXQAOW.js +1 -0
- package/dist/client/assets/chunks/python-SNDG7FNU.js +1 -0
- package/dist/client/assets/chunks/qml-UVIOSWP4.js +1 -0
- package/dist/client/assets/chunks/qmldir-6JGUNYL5.js +1 -0
- package/dist/client/assets/chunks/qss-ZCC466IZ.js +1 -0
- package/dist/client/assets/chunks/quadrantDiagram-XTYBLID2-5VKXWVJ6.js +7 -0
- package/dist/client/assets/chunks/r-4XW4O3ZF.js +1 -0
- package/dist/client/assets/chunks/racket-YJAYXOOG.js +1 -0
- package/dist/client/assets/chunks/radar-ABXABTNO-3AXZCEY2.js +1 -0
- package/dist/client/assets/chunks/railroad-I3PHUGI6-2PLXYPOT.js +1 -0
- package/dist/client/assets/chunks/railroad-abnf-LNEFI6M7-M4DGICQX.js +1 -0
- package/dist/client/assets/chunks/railroad-ebnf-DWYD2UWJ-UEIHQMSZ.js +1 -0
- package/dist/client/assets/chunks/railroad-peg-JR7BVNR7-I7VLIBXM.js +1 -0
- package/dist/client/assets/chunks/railroadDiagram-MRQ6NCDL-Y6IYWEFL.js +1 -0
- package/dist/client/assets/chunks/raku-63NEL5JK.js +1 -0
- package/dist/client/assets/chunks/razor-J3CJP523.js +1 -0
- package/dist/client/assets/chunks/rbs-6GQLT7NW.js +1 -0
- package/dist/client/assets/chunks/reg-6Q3OEC2C.js +1 -0
- package/dist/client/assets/chunks/regexp-LPIMILT3.js +1 -0
- package/dist/client/assets/chunks/rel-TOQGUTHB.js +1 -0
- package/dist/client/assets/chunks/requirementDiagram-Y7LWUY3S-CIWXVVWJ.js +84 -0
- package/dist/client/assets/chunks/riscv-UELGBOXE.js +1 -0
- package/dist/client/assets/chunks/ron-FW7LCJJH.js +1 -0
- package/dist/client/assets/chunks/rosmsg-O63VHE3L.js +1 -0
- package/dist/client/assets/chunks/rst-3WJXGLA7.js +1 -0
- package/dist/client/assets/chunks/ruby-7S7L6JTH.js +1 -0
- package/dist/client/assets/chunks/rust-LIK4HRRI.js +1 -0
- package/dist/client/assets/chunks/sankeyDiagram-WGJFYUXA-OGNQPX5V.js +40 -0
- package/dist/client/assets/chunks/sas-FHDPZ2JH.js +1 -0
- package/dist/client/assets/chunks/sass-UI4HW2FN.js +1 -0
- package/dist/client/assets/chunks/scala-KN7RQSUJ.js +1 -0
- package/dist/client/assets/chunks/scheme-5R527YZ5.js +1 -0
- package/dist/client/assets/chunks/scss-KZ6DRE4A.js +1 -0
- package/dist/client/assets/chunks/sdbl-FHOCL5SL.js +1 -0
- package/dist/client/assets/chunks/sequenceDiagram-5NDRBG5M-QX2V24ZU.js +169 -0
- package/dist/client/assets/chunks/shaderlab-2TLHUS2H.js +1 -0
- package/dist/client/assets/chunks/shellscript-PIB6ZBDM.js +1 -0
- package/dist/client/assets/chunks/shellsession-5KL7NFNN.js +1 -0
- package/dist/client/assets/chunks/sizeCapture-INFHLROL-LCS2PIHM.js +1 -0
- package/dist/client/assets/chunks/smalltalk-JFLFU247.js +1 -0
- package/dist/client/assets/chunks/smithy-HONEXZAM.js +1 -0
- package/dist/client/assets/chunks/solidity-SJ3INJFZ.js +1 -0
- package/dist/client/assets/chunks/soy-ND4SWTM2.js +1 -0
- package/dist/client/assets/chunks/sparql-YB2JQBZD.js +1 -0
- package/dist/client/assets/chunks/splunk-UXIDDAWL.js +1 -0
- package/dist/client/assets/chunks/sql-K6OMG7SQ.js +1 -0
- package/dist/client/assets/chunks/ssh-config-I7KJY3KQ.js +1 -0
- package/dist/client/assets/chunks/stata-DNZ3DTFJ.js +1 -0
- package/dist/client/assets/chunks/stateDiagram-v2-FJ4FJNEA-LVAUWF3A.js +291 -0
- package/dist/client/assets/chunks/stylus-GWPR6IQY.js +1 -0
- package/dist/client/assets/chunks/surrealql-KQNHBWLC.js +1 -0
- package/dist/client/assets/chunks/svelte-YQKF25S4.js +1 -0
- package/dist/client/assets/chunks/swift-ZCIZUJXA.js +1 -0
- package/dist/client/assets/chunks/swimlanes-UMQ2AFYF-B3RQOARQ.js +1 -0
- package/dist/client/assets/chunks/swimlanesDiagram-OMPLPG4O-JOE33EOV.js +8 -0
- package/dist/client/assets/chunks/system-verilog-Y7E6FIO3.js +1 -0
- package/dist/client/assets/chunks/systemd-WHC7NBZP.js +1 -0
- package/dist/client/assets/chunks/talonscript-WC7SODAH.js +1 -0
- package/dist/client/assets/chunks/tasl-QHY2GTCB.js +1 -0
- package/dist/client/assets/chunks/tcl-VAMIL5PJ.js +1 -0
- package/dist/client/assets/chunks/temml-ISNSX3VV.js +96 -0
- package/dist/client/assets/chunks/templ-B3BHKWV4.js +1 -0
- package/dist/client/assets/chunks/terraform-Q4UEK6FK.js +1 -0
- package/dist/client/assets/chunks/tex-63OWCYAB.js +1 -0
- package/dist/client/assets/chunks/timeline-definition-SEUHKTQE-FDFTVAJG.js +120 -0
- package/dist/client/assets/chunks/toml-7Z4IPGES.js +1 -0
- package/dist/client/assets/chunks/treeView-D4JQ5SDB-ABSGRAGI.js +1 -0
- package/dist/client/assets/chunks/treemap-SAJKECNS-MYX2CBJN.js +1 -0
- package/dist/client/assets/chunks/ts-tags-DT62HE52.js +1 -0
- package/dist/client/assets/chunks/tsv-RTXHWADP.js +1 -0
- package/dist/client/assets/chunks/tsx-UANUBOC7.js +1 -0
- package/dist/client/assets/chunks/turtle-QVOUNUUL.js +1 -0
- package/dist/client/assets/chunks/twig-ZPC4BPDA.js +1 -0
- package/dist/client/assets/chunks/typescript-WGWKIMMW.js +1 -0
- package/dist/client/assets/chunks/typespec-TYCVR32J.js +1 -0
- package/dist/client/assets/chunks/typst-PIBFYUO6.js +1 -0
- package/dist/client/assets/chunks/usecaseDiagram-AFA6YXN4-KW7ADINR.js +370 -0
- package/dist/client/assets/chunks/v-3ERNWBSP.js +1 -0
- package/dist/client/assets/chunks/vala-UCBCT2GS.js +1 -0
- package/dist/client/assets/chunks/vb-DGI3VTPA.js +1 -0
- package/dist/client/assets/chunks/vennDiagram-NNMJR3RB-RDGLGOGM.js +34 -0
- package/dist/client/assets/chunks/verilog-G72NZROS.js +1 -0
- package/dist/client/assets/chunks/vhdl-PYGA77XE.js +1 -0
- package/dist/client/assets/chunks/viml-OOC5B5UU.js +1 -0
- package/dist/client/assets/chunks/vue-GTNHIOPG.js +1 -0
- package/dist/client/assets/chunks/vue-html-DKAMJV55.js +1 -0
- package/dist/client/assets/chunks/vue-vine-WTM5HREV.js +1 -0
- package/dist/client/assets/chunks/vyper-RHYEHOJM.js +1 -0
- package/dist/client/assets/chunks/wardley-7MLQ67FV-QJL2HSBT.js +1 -0
- package/dist/client/assets/chunks/wardleyDiagram-S7YFUSEH-A4XX3UJR.js +78 -0
- package/dist/client/assets/chunks/wasm-ZMM2Z5XV.js +1 -0
- package/dist/client/assets/chunks/wenyan-HF5UTKSJ.js +1 -0
- package/dist/client/assets/chunks/wgsl-O7D7OPO7.js +1 -0
- package/dist/client/assets/chunks/wikitext-T7BSWSKQ.js +1 -0
- package/dist/client/assets/chunks/wit-TKCHPPT6.js +1 -0
- package/dist/client/assets/chunks/wolfram-7MN66A7N.js +1 -0
- package/dist/client/assets/chunks/xml-NLTLAWOD.js +1 -0
- package/dist/client/assets/chunks/xsl-NZ4ECK3P.js +1 -0
- package/dist/client/assets/chunks/xychartDiagram-GGNKY7IX-OXJILWHR.js +7 -0
- package/dist/client/assets/chunks/yaml-HRJLEV3V.js +1 -0
- package/dist/client/assets/chunks/zenscript-4LLRSLPI.js +1 -0
- package/dist/client/assets/chunks/zig-Y7MUQFUO.js +1 -0
- package/dist/client/assets/main.js +186 -0
- package/dist/client/index.html +48 -0
- package/dist/config.js +322 -0
- package/dist/files.js +178 -0
- package/dist/git.js +365 -0
- package/dist/glob.js +89 -0
- package/dist/review.js +290 -0
- package/dist/search.js +136 -0
- package/dist/server.js +482 -0
- package/dist/watch.js +69 -0
- package/dist/zip.js +100 -0
- package/package.json +61 -4
package/dist/git.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
// Git, when the folder is in a repository: each file's state, the branch, diffs, a file's history, and old versions.
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
export class Git {
|
|
6
|
+
top;
|
|
7
|
+
prefix;
|
|
8
|
+
root;
|
|
9
|
+
/** the repository's top folder, and the served root's path inside it ('' at the top) */
|
|
10
|
+
constructor(top, prefix, root) {
|
|
11
|
+
this.top = top;
|
|
12
|
+
this.prefix = prefix;
|
|
13
|
+
this.root = root;
|
|
14
|
+
}
|
|
15
|
+
static async open(root) {
|
|
16
|
+
try {
|
|
17
|
+
const top = (await run(root, ['rev-parse', '--show-toplevel'])).trim();
|
|
18
|
+
if (!top)
|
|
19
|
+
return undefined;
|
|
20
|
+
const realTop = fs.realpathSync(top);
|
|
21
|
+
const realRoot = fs.realpathSync(root);
|
|
22
|
+
const prefix = path.relative(realTop, realRoot).split(path.sep).join('/');
|
|
23
|
+
return new Git(realTop, prefix, root);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** a repo-relative path → root-relative, or undefined when it is outside the served folder */
|
|
30
|
+
fromRepo(p) {
|
|
31
|
+
if (!this.prefix)
|
|
32
|
+
return p;
|
|
33
|
+
return p === this.prefix ? '' : p.startsWith(this.prefix + '/') ? p.slice(this.prefix.length + 1) : undefined;
|
|
34
|
+
}
|
|
35
|
+
git(args) {
|
|
36
|
+
return run(this.top, ['-c', 'core.quotepath=off', ...args]);
|
|
37
|
+
}
|
|
38
|
+
async hasHead() {
|
|
39
|
+
try {
|
|
40
|
+
await this.git(['rev-parse', '--verify', '-q', 'HEAD']);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async status() {
|
|
48
|
+
const scope = this.prefix ? ['--', this.prefix] : [];
|
|
49
|
+
const [raw, ignoredRaw, head] = await Promise.all([
|
|
50
|
+
this.git(['status', '--porcelain=v1', '-b', '-z', '--untracked-files=all', ...scope]),
|
|
51
|
+
this.git(['ls-files', '-o', '-i', '--exclude-standard', '--directory', '-z', ...scope]).catch(() => ''),
|
|
52
|
+
this.git(['rev-parse', '--short', 'HEAD']).catch(() => ''),
|
|
53
|
+
]);
|
|
54
|
+
const recs = raw.split('\0');
|
|
55
|
+
const status = { repo: true, branch: '', ahead: 0, behind: 0, changes: [], ignored: [] };
|
|
56
|
+
if (head.trim())
|
|
57
|
+
status.head = head.trim();
|
|
58
|
+
for (let i = 0; i < recs.length; i++) {
|
|
59
|
+
const r = recs[i];
|
|
60
|
+
if (!r)
|
|
61
|
+
continue;
|
|
62
|
+
if (r.startsWith('## ')) {
|
|
63
|
+
// "## main...origin/main [ahead 1, behind 2]", "## No commits yet on main", "## HEAD (no branch)"
|
|
64
|
+
const body = r.slice(3).replace(/^No commits yet on /, '');
|
|
65
|
+
const at = body.indexOf(' [');
|
|
66
|
+
const names = at < 0 ? body : body.slice(0, at);
|
|
67
|
+
const track = at < 0 ? '' : body.slice(at);
|
|
68
|
+
const [branch = '', upstream] = names.split('...');
|
|
69
|
+
status.branch = branch;
|
|
70
|
+
if (upstream)
|
|
71
|
+
status.upstream = upstream;
|
|
72
|
+
const a = /ahead (\d+)/.exec(track), b = /behind (\d+)/.exec(track);
|
|
73
|
+
status.ahead = a ? Number(a[1]) : 0;
|
|
74
|
+
status.behind = b ? Number(b[1]) : 0;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const x = r[0] ?? ' ', y = r[1] ?? ' ';
|
|
78
|
+
const file = r.slice(3);
|
|
79
|
+
let from;
|
|
80
|
+
if (x === 'R' || x === 'C')
|
|
81
|
+
from = recs[++i];
|
|
82
|
+
const rel = this.fromRepo(file);
|
|
83
|
+
if (rel === undefined)
|
|
84
|
+
continue;
|
|
85
|
+
const change = { path: rel, state: stateOf(x, y), staged: x !== ' ' && x !== '?', unstaged: y !== ' ' };
|
|
86
|
+
if (from)
|
|
87
|
+
change.from = this.fromRepo(from) ?? from;
|
|
88
|
+
status.changes.push(change);
|
|
89
|
+
}
|
|
90
|
+
for (const p of ignoredRaw.split('\0')) {
|
|
91
|
+
const rel = p && this.fromRepo(p.replace(/\/$/, ''));
|
|
92
|
+
if (rel)
|
|
93
|
+
status.ignored.push(p.endsWith('/') ? rel + '/' : rel);
|
|
94
|
+
}
|
|
95
|
+
await this.counts(status.changes);
|
|
96
|
+
return status;
|
|
97
|
+
}
|
|
98
|
+
/** lines added and removed per changed file, against HEAD (whole file for new ones) */
|
|
99
|
+
async counts(changes) {
|
|
100
|
+
if (!changes.length)
|
|
101
|
+
return;
|
|
102
|
+
const byPath = new Map(changes.map((c) => [c.path, c]));
|
|
103
|
+
const scope = this.prefix ? ['--', this.prefix] : [];
|
|
104
|
+
const base = (await this.hasHead()) ? ['diff', 'HEAD'] : ['diff', '--cached'];
|
|
105
|
+
const out = await this.git([...base, '--numstat', '-z', ...scope]).catch(() => '');
|
|
106
|
+
const recs = out.split('\0');
|
|
107
|
+
for (let i = 0; i < recs.length; i++) {
|
|
108
|
+
const m = /^(\d+|-)\t(\d+|-)\t(.*)$/.exec(recs[i] ?? '');
|
|
109
|
+
if (!m)
|
|
110
|
+
continue;
|
|
111
|
+
let file = m[3] ?? '';
|
|
112
|
+
if (!file) {
|
|
113
|
+
i++; // a rename: "old\0new"
|
|
114
|
+
file = recs[++i] ?? '';
|
|
115
|
+
}
|
|
116
|
+
const c = byPath.get(this.fromRepo(file) ?? '');
|
|
117
|
+
if (c && m[1] !== '-') {
|
|
118
|
+
c.add = Number(m[1]);
|
|
119
|
+
c.del = Number(m[2]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const c of changes) {
|
|
123
|
+
if (c.state !== 'new' || c.add !== undefined)
|
|
124
|
+
continue;
|
|
125
|
+
try {
|
|
126
|
+
const abs = path.join(this.root, c.path);
|
|
127
|
+
if (fs.statSync(abs).size > 2_000_000)
|
|
128
|
+
continue;
|
|
129
|
+
const t = fs.readFileSync(abs, 'utf8');
|
|
130
|
+
if (!t.includes('\0'))
|
|
131
|
+
c.add = t ? t.split('\n').length - (t.endsWith('\n') ? 1 : 0) : 0;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// gone again
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
repoPath(rel) {
|
|
139
|
+
return this.prefix ? (rel ? this.prefix + '/' + rel : this.prefix) : rel;
|
|
140
|
+
}
|
|
141
|
+
/** a unified diff of one file against HEAD (staged and unstaged together); a new file diffs against nothing */
|
|
142
|
+
async diff(rel) {
|
|
143
|
+
const p = this.repoPath(rel);
|
|
144
|
+
const tracked = await this.git(['ls-files', '--error-unmatch', '--', p]).then(() => true, () => false);
|
|
145
|
+
if (!tracked) {
|
|
146
|
+
// untracked: --no-index exits 1 when the files differ, which is the point
|
|
147
|
+
return run(this.top, ['diff', '--no-index', '--no-color', '--', nullDevice(), p], [0, 1]);
|
|
148
|
+
}
|
|
149
|
+
const base = (await this.hasHead()) ? ['diff', 'HEAD'] : ['diff', '--cached'];
|
|
150
|
+
return this.git([...base, '--no-color', '-M', '--', p]);
|
|
151
|
+
}
|
|
152
|
+
/** the file as of a commit (HEAD by default) */
|
|
153
|
+
show(rel, rev = 'HEAD') {
|
|
154
|
+
return this.git(['show', `${rev}:${this.repoPath(rel)}`]);
|
|
155
|
+
}
|
|
156
|
+
/** the file's bytes as of a commit (for binary files: images to compare) */
|
|
157
|
+
showRaw(rel, rev = 'HEAD') {
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
execFile('git', ['show', `${rev}:${this.repoPath(rel)}`], { cwd: this.top, encoding: 'buffer', maxBuffer: 256 * 1024 * 1024, windowsHide: true }, (err, stdout) => err ? reject(err) : resolve(stdout));
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async log(rel, limit = 30, skip = 0) {
|
|
163
|
+
const out = await this.git(['log', '--follow', `-n${limit}`, `--skip=${skip}`, '--format=%h%x1f%an%x1f%at%x1f%s%x1e', '--', this.repoPath(rel)]).catch(() => '');
|
|
164
|
+
return out
|
|
165
|
+
.split('\x1e')
|
|
166
|
+
.map((r) => r.trim())
|
|
167
|
+
.filter(Boolean)
|
|
168
|
+
.map((r) => {
|
|
169
|
+
const [hash = '', author = '', time = '0', subject = ''] = r.split('\x1f');
|
|
170
|
+
return { hash, author, time: Number(time) * 1000, subject };
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** the diff a commit made to one file */
|
|
174
|
+
commitDiff(rel, hash) {
|
|
175
|
+
return this.git(['show', '--no-color', '--format=%H%n%an <%ae>%n%ad%n%n%B', '-M', hash, '--', this.repoPath(rel)]);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The repository's commits (those touching the served folder), newest first, each marked pushed or local, plus
|
|
179
|
+
* the upstream's commits not pulled yet (on the first page).
|
|
180
|
+
*/
|
|
181
|
+
async history(skip = 0, limit = 50, q = '') {
|
|
182
|
+
const scope = this.prefix ? ['--', this.prefix] : [];
|
|
183
|
+
const none = () => '';
|
|
184
|
+
// a search: words in the message (any case), or the start of a hash
|
|
185
|
+
const find = q ? ['-i', '-F', `--grep=${q}`] : [];
|
|
186
|
+
const first = !skip && !q;
|
|
187
|
+
// every question at once (each git call costs a process start, slow on Windows); the ones that can't apply
|
|
188
|
+
// (no upstream, no remote, no commits yet) just fail to ''
|
|
189
|
+
const [remoteList, up, out, hashOut, inRaw, inCount, localRaw, localScoped] = await Promise.all([
|
|
190
|
+
this.git(['remote']).catch(none),
|
|
191
|
+
this.git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']).catch(none),
|
|
192
|
+
this.git(['log', `-n${limit + 1}`, `--skip=${skip}`, `--format=${LOG_FORMAT}`, ...find, 'HEAD', ...scope]).catch(none),
|
|
193
|
+
/^[0-9a-f]{4,40}$/i.test(q) && !skip ? this.git(['log', '-n1', `--format=${LOG_FORMAT}`, q, '--']).catch(none) : '',
|
|
194
|
+
first ? this.git(['log', '-n50', `--format=${LOG_FORMAT}`, 'HEAD..@{u}', ...scope]).catch(none) : '',
|
|
195
|
+
first ? this.git(['rev-list', '--count', 'HEAD..@{u}', ...scope]).catch(none) : '',
|
|
196
|
+
// the commits only here (up to a limit, so a never-pushed giant history stays quick)
|
|
197
|
+
this.git(['rev-list', `--max-count=${LOCAL_CAP + 1}`, 'HEAD', '--not', '--remotes']).catch(none),
|
|
198
|
+
first && this.prefix ? this.git(['rev-list', '--count', `--max-count=${LOCAL_CAP + 1}`, 'HEAD', '--not', '--remotes', ...scope]).catch(none) : '',
|
|
199
|
+
]);
|
|
200
|
+
const remotes = remoteList.trim() !== '';
|
|
201
|
+
const upstream = up.trim() || undefined;
|
|
202
|
+
const h = { commits: [], incoming: [], incomingTotal: 0, more: false, remotes, ...(upstream ? { upstream } : {}) };
|
|
203
|
+
let all = parseLog(out);
|
|
204
|
+
h.more = all.length > limit;
|
|
205
|
+
all = all.slice(0, limit);
|
|
206
|
+
const hit = parseLog(hashOut)[0];
|
|
207
|
+
if (hit && !all.some((c) => c.full === hit.full))
|
|
208
|
+
all.unshift(hit);
|
|
209
|
+
h.commits = all.map((c) => ({ ...c, state: remotes ? 'pushed' : 'unknown' }));
|
|
210
|
+
const localList = localRaw.split('\n').filter(Boolean);
|
|
211
|
+
if (remotes && all.length) {
|
|
212
|
+
let local = new Set(localList);
|
|
213
|
+
if (localList.length > LOCAL_CAP) {
|
|
214
|
+
// more unpushed commits than the list holds: ask again for just this page's stretch of time (the unpushed
|
|
215
|
+
// ones no older than its oldest commit, a day's slack for clock skew)
|
|
216
|
+
const oldest = Math.floor(Math.min(...all.map((c) => c.time)) / 1000 - 86400);
|
|
217
|
+
local = new Set((await this.git(['rev-list', `--since=${oldest}`, 'HEAD', '--not', '--remotes']).catch(none)).split('\n').filter(Boolean));
|
|
218
|
+
}
|
|
219
|
+
for (const c of h.commits)
|
|
220
|
+
if (local.has(c.full))
|
|
221
|
+
c.state = 'local';
|
|
222
|
+
}
|
|
223
|
+
if (upstream) {
|
|
224
|
+
h.incoming = parseLog(inRaw).map((c) => ({ ...c, state: 'incoming' }));
|
|
225
|
+
h.incomingTotal = Number(inCount.trim()) || h.incoming.length;
|
|
226
|
+
}
|
|
227
|
+
if (remotes && first) {
|
|
228
|
+
const n = this.prefix ? Number(localScoped.trim()) || 0 : localList.length;
|
|
229
|
+
h.localTotal = n > LOCAL_CAP ? `${LOCAL_CAP}+` : String(n);
|
|
230
|
+
}
|
|
231
|
+
return h;
|
|
232
|
+
}
|
|
233
|
+
/** what a commit was, and which files (in the served folder) it changed, against its first parent */
|
|
234
|
+
async commitInfo(rev) {
|
|
235
|
+
const raw = await this.git(['show', '-s', '--format=%H%x1f%h%x1f%an%x1f%ae%x1f%at%x1f%P%x1f%s%x1f%b', rev]);
|
|
236
|
+
const [full = '', hash = '', author = '', email = '', time = '0', parents = '', subject = '', ...rest] = raw.replace(/\n$/, '').split('\x1f');
|
|
237
|
+
const base = await this.parentOf(full);
|
|
238
|
+
const scope = this.prefix ? ['--', this.prefix] : [];
|
|
239
|
+
const [names, nums] = await Promise.all([
|
|
240
|
+
this.git(['diff', '--name-status', '-z', '-M', base, full, ...scope]),
|
|
241
|
+
this.git(['diff', '--numstat', '-z', '-M', base, full, ...scope]),
|
|
242
|
+
]);
|
|
243
|
+
const files = [];
|
|
244
|
+
const recs = names.split('\0');
|
|
245
|
+
for (let i = 0; i < recs.length; i++) {
|
|
246
|
+
const s = recs[i];
|
|
247
|
+
if (!s)
|
|
248
|
+
continue;
|
|
249
|
+
let from;
|
|
250
|
+
let file = recs[++i] ?? '';
|
|
251
|
+
if (s[0] === 'R' || s[0] === 'C') {
|
|
252
|
+
from = file;
|
|
253
|
+
file = recs[++i] ?? '';
|
|
254
|
+
}
|
|
255
|
+
const rel = this.fromRepo(file);
|
|
256
|
+
if (rel === undefined)
|
|
257
|
+
continue;
|
|
258
|
+
const state = s[0] === 'A' || s[0] === 'C' ? 'added' : s[0] === 'D' ? 'deleted' : s[0] === 'R' ? 'renamed' : 'modified';
|
|
259
|
+
const f = { path: rel, state };
|
|
260
|
+
if (from)
|
|
261
|
+
f.from = this.fromRepo(from) ?? from;
|
|
262
|
+
files.push(f);
|
|
263
|
+
}
|
|
264
|
+
const byPath = new Map(files.map((f) => [f.path, f]));
|
|
265
|
+
const nr = nums.split('\0');
|
|
266
|
+
for (let i = 0; i < nr.length; i++) {
|
|
267
|
+
const m = /^(\d+|-)\t(\d+|-)\t(.*)$/.exec(nr[i] ?? '');
|
|
268
|
+
if (!m)
|
|
269
|
+
continue;
|
|
270
|
+
let file = m[3] ?? '';
|
|
271
|
+
if (!file) {
|
|
272
|
+
i++;
|
|
273
|
+
file = nr[++i] ?? '';
|
|
274
|
+
}
|
|
275
|
+
const f = byPath.get(this.fromRepo(file) ?? '');
|
|
276
|
+
if (f && m[1] !== '-') {
|
|
277
|
+
f.add = Number(m[1]);
|
|
278
|
+
f.del = Number(m[2]);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
commit: { full, hash, author, email, time: Number(time) * 1000, parents: parents.split(' ').filter(Boolean), subject, body: rest.join('\x1f').trim() },
|
|
283
|
+
files,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/** one file's diff in a commit, against the commit's first parent (a rename needs its old path too) */
|
|
287
|
+
async commitFileDiff(rev, rel, fromRel) {
|
|
288
|
+
const full = (await this.git(['rev-parse', '--verify', rev + '^{commit}'])).trim();
|
|
289
|
+
const base = await this.parentOf(full);
|
|
290
|
+
const paths = [this.repoPath(rel), ...(fromRel ? [this.repoPath(fromRel)] : [])];
|
|
291
|
+
return this.git(['diff', '--no-color', '-M', base, full, '--', ...paths]);
|
|
292
|
+
}
|
|
293
|
+
async parentOf(full) {
|
|
294
|
+
return (await this.git(['rev-parse', '--verify', '-q', full + '^1']).catch(() => '')).trim() || EMPTY_TREE;
|
|
295
|
+
}
|
|
296
|
+
async userName() {
|
|
297
|
+
return (await this.git(['config', 'user.name']).catch(() => '')).trim();
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* The files (root-relative) that may match a search: git grep reads the tree far faster than one file at a time.
|
|
301
|
+
* A regular expression goes to git as PCRE (close to JavaScript's); undefined when git can't run it, and the caller
|
|
302
|
+
* reads every file instead.
|
|
303
|
+
*/
|
|
304
|
+
async grepFiles(q, o) {
|
|
305
|
+
const args = ['-c', 'core.quotepath=off', 'grep', '-l', '-I', '--null', '--untracked', o.regex ? '-P' : '-F'];
|
|
306
|
+
if (!o.caseSensitive)
|
|
307
|
+
args.push('-i');
|
|
308
|
+
if (o.word)
|
|
309
|
+
args.push('-w');
|
|
310
|
+
args.push('-e', q);
|
|
311
|
+
try {
|
|
312
|
+
const out = await run(this.root, args, [0, 1]);
|
|
313
|
+
return new Set(out.split('').filter(Boolean));
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return undefined;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** files tracked or untracked-but-not-ignored, root-relative */
|
|
320
|
+
async files() {
|
|
321
|
+
const out = await run(this.root, ['-c', 'core.quotepath=off', 'ls-files', '-co', '--exclude-standard', '-z']);
|
|
322
|
+
return out.split('\0').filter(Boolean);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function stateOf(x, y) {
|
|
326
|
+
if (x === '?' && y === '?')
|
|
327
|
+
return 'new';
|
|
328
|
+
if (x === '!')
|
|
329
|
+
return 'ignored';
|
|
330
|
+
if (x === 'U' || y === 'U' || (x === 'A' && y === 'A') || (x === 'D' && y === 'D'))
|
|
331
|
+
return 'conflict';
|
|
332
|
+
if (x === 'R' || x === 'C')
|
|
333
|
+
return 'renamed';
|
|
334
|
+
if (x === 'D' || y === 'D')
|
|
335
|
+
return 'deleted';
|
|
336
|
+
if (x === 'A')
|
|
337
|
+
return 'added';
|
|
338
|
+
return 'modified';
|
|
339
|
+
}
|
|
340
|
+
const LOCAL_CAP = 1000;
|
|
341
|
+
const LOG_FORMAT = '%H%x1f%h%x1f%an%x1f%at%x1f%P%x1f%s%x1e';
|
|
342
|
+
/** git's empty tree: what a first commit is compared with */
|
|
343
|
+
const EMPTY_TREE = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
|
|
344
|
+
function parseLog(out) {
|
|
345
|
+
return out
|
|
346
|
+
.split('\x1e')
|
|
347
|
+
.map((r) => r.trim())
|
|
348
|
+
.filter(Boolean)
|
|
349
|
+
.map((r) => {
|
|
350
|
+
const [full = '', hash = '', author = '', time = '0', parents = '', subject = ''] = r.split('\x1f');
|
|
351
|
+
return { full, hash, author, time: Number(time) * 1000, parents: parents.split(' ').filter(Boolean), subject };
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
const nullDevice = () => (process.platform === 'win32' ? 'NUL' : '/dev/null');
|
|
355
|
+
function run(cwd, args, ok = [0]) {
|
|
356
|
+
return new Promise((resolve, reject) => {
|
|
357
|
+
execFile('git', args, { cwd, maxBuffer: 64 * 1024 * 1024, windowsHide: true }, (err, stdout, stderr) => {
|
|
358
|
+
const code = err && typeof err.code === 'number' ? Number(err.code) : 0;
|
|
359
|
+
if (err && !ok.includes(code))
|
|
360
|
+
reject(new Error(stderr || err.message));
|
|
361
|
+
else
|
|
362
|
+
resolve(stdout);
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
}
|
package/dist/glob.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Glob patterns in the .gitignore style, used for excludes (--exclude, FOLDERVIEW_EXCLUDE, .folderviewignore, config)
|
|
2
|
+
// and for search's "files to include".
|
|
3
|
+
//
|
|
4
|
+
// *.log a name anywhere
|
|
5
|
+
// dist/ a folder anywhere (and everything in it)
|
|
6
|
+
// /build only at the top
|
|
7
|
+
// docs/**/*.md a path pattern (anchored at the top)
|
|
8
|
+
// !keep.log an exception to an earlier pattern
|
|
9
|
+
export function toRegex(glob) {
|
|
10
|
+
let g = glob;
|
|
11
|
+
const anchored = g.startsWith('/') || g.replace(/\/$/, '').includes('/');
|
|
12
|
+
g = g.replace(/^\//, '').replace(/\/$/, '');
|
|
13
|
+
let src = '';
|
|
14
|
+
for (let i = 0; i < g.length; i++) {
|
|
15
|
+
const c = g[i] ?? '';
|
|
16
|
+
if (c === '*' && g[i + 1] === '*') {
|
|
17
|
+
i++;
|
|
18
|
+
if (g[i + 1] === '/') {
|
|
19
|
+
i++;
|
|
20
|
+
src += '(?:.*/)?';
|
|
21
|
+
}
|
|
22
|
+
else
|
|
23
|
+
src += '.*';
|
|
24
|
+
}
|
|
25
|
+
else if (c === '*')
|
|
26
|
+
src += '[^/]*';
|
|
27
|
+
else if (c === '?')
|
|
28
|
+
src += '[^/]';
|
|
29
|
+
else if (c === '[') {
|
|
30
|
+
const end = g.indexOf(']', i);
|
|
31
|
+
if (end < 0)
|
|
32
|
+
src += '\\[';
|
|
33
|
+
else {
|
|
34
|
+
src += '[' + g.slice(i + 1, end).replace(/^!/, '^').replace(/\\/g, '\\\\') + ']';
|
|
35
|
+
i = end;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else
|
|
39
|
+
src += c.replace(/[.+^${}()|\\]/g, '\\$&');
|
|
40
|
+
}
|
|
41
|
+
return new RegExp((anchored ? '^' : '(?:^|/)') + src + '$', process.platform === 'win32' || process.platform === 'darwin' ? 'i' : '');
|
|
42
|
+
}
|
|
43
|
+
export function parseRules(lines) {
|
|
44
|
+
return lines
|
|
45
|
+
.map((l) => l.trim())
|
|
46
|
+
.filter((l) => l && !l.startsWith('#'))
|
|
47
|
+
.map((l) => {
|
|
48
|
+
const negate = l.startsWith('!');
|
|
49
|
+
const body = negate ? l.slice(1) : l;
|
|
50
|
+
return { re: toRegex(body), negate, dirOnly: body.endsWith('/') };
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** A test for root-relative paths: true when the path, or a folder above it, is excluded. */
|
|
54
|
+
export function excluder(rules) {
|
|
55
|
+
if (!rules.length)
|
|
56
|
+
return () => false;
|
|
57
|
+
const one = (p, isDir) => {
|
|
58
|
+
let out = false;
|
|
59
|
+
for (const r of rules)
|
|
60
|
+
if ((!r.dirOnly || isDir) && r.re.test(p))
|
|
61
|
+
out = !r.negate;
|
|
62
|
+
return out;
|
|
63
|
+
};
|
|
64
|
+
const cache = new Map();
|
|
65
|
+
return (rel, isDir = false) => {
|
|
66
|
+
const key = rel + (isDir ? '/' : '');
|
|
67
|
+
const hit = cache.get(key);
|
|
68
|
+
if (hit !== undefined)
|
|
69
|
+
return hit;
|
|
70
|
+
const parts = rel.split('/').filter(Boolean);
|
|
71
|
+
let out = false;
|
|
72
|
+
for (let i = 1; i <= parts.length && !out; i++)
|
|
73
|
+
out = one(parts.slice(0, i).join('/'), i < parts.length || isDir);
|
|
74
|
+
if (cache.size > 50_000)
|
|
75
|
+
cache.clear();
|
|
76
|
+
cache.set(key, out);
|
|
77
|
+
return out;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Search's include box: "*.ts, src/**, !*.test.ts" (comma-separated; ! excludes). */
|
|
81
|
+
export function pathFilter(spec) {
|
|
82
|
+
const parts = spec
|
|
83
|
+
.split(',')
|
|
84
|
+
.map((s) => s.trim())
|
|
85
|
+
.filter(Boolean);
|
|
86
|
+
const inc = parts.filter((p) => !p.startsWith('!')).map((p) => excluder(parseRules([p])));
|
|
87
|
+
const exc = excluder(parseRules(parts.filter((p) => p.startsWith('!')).map((p) => p.slice(1))));
|
|
88
|
+
return (p) => (!inc.length || inc.some((t) => t(p))) && !exc(p);
|
|
89
|
+
}
|