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.
Files changed (450) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +282 -2
  3. package/dist/cli.js +115 -0
  4. package/dist/client/assets/app.css +1 -0
  5. package/dist/client/assets/chunks/abap-EINPUMCJ.js +1 -0
  6. package/dist/client/assets/chunks/abnfDiagram-S7VZAUFO-W2CM2W6D.js +1 -0
  7. package/dist/client/assets/chunks/actionscript-3-O776AQUO.js +1 -0
  8. package/dist/client/assets/chunks/ada-WLOTXRTV.js +1 -0
  9. package/dist/client/assets/chunks/ahk-EF37A2DY.js +1 -0
  10. package/dist/client/assets/chunks/ahk2-FH4K3CKT.js +1 -0
  11. package/dist/client/assets/chunks/angular-html-ZALQFV2H.js +1 -0
  12. package/dist/client/assets/chunks/angular-ts-4IWMF7QO.js +1 -0
  13. package/dist/client/assets/chunks/apache-44AYOEWM.js +1 -0
  14. package/dist/client/assets/chunks/apex-XRYPID42.js +1 -0
  15. package/dist/client/assets/chunks/apl-5HBALFOI.js +1 -0
  16. package/dist/client/assets/chunks/applescript-2DZEHZEC.js +1 -0
  17. package/dist/client/assets/chunks/ara-ZGZQBLXL.js +1 -0
  18. package/dist/client/assets/chunks/architecture-WOLXFQ4H-EJGENNRL.js +1 -0
  19. package/dist/client/assets/chunks/architectureDiagram-YGSQEFNW-2VHWSKO6.js +36 -0
  20. package/dist/client/assets/chunks/asciidoc-GSQAKCPO.js +1 -0
  21. package/dist/client/assets/chunks/asm-BFURM5BK.js +1 -0
  22. package/dist/client/assets/chunks/astro-VJORWDZJ.js +1 -0
  23. package/dist/client/assets/chunks/awk-BSHTWXXX.js +1 -0
  24. package/dist/client/assets/chunks/ballerina-HAOQJ4B2.js +1 -0
  25. package/dist/client/assets/chunks/bat-OSH45EOF.js +1 -0
  26. package/dist/client/assets/chunks/beancount-RBATIHOV.js +1 -0
  27. package/dist/client/assets/chunks/berry-CZUIOUM4.js +1 -0
  28. package/dist/client/assets/chunks/bibtex-KCL2UWHE.js +1 -0
  29. package/dist/client/assets/chunks/bicep-SZJZB3SG.js +1 -0
  30. package/dist/client/assets/chunks/bird2-XBF5YQQV.js +1 -0
  31. package/dist/client/assets/chunks/blade-Q24LEVFC.js +1 -0
  32. package/dist/client/assets/chunks/blockDiagram-APKKGZFW-53LXSOOT.js +140 -0
  33. package/dist/client/assets/chunks/bpmnIcons-APHXDYXF-FMBRQNTY.js +1 -0
  34. package/dist/client/assets/chunks/bsl-TI44NWFB.js +1 -0
  35. package/dist/client/assets/chunks/c-NLHY4Y4N.js +1 -0
  36. package/dist/client/assets/chunks/c3-BUTEM6PO.js +1 -0
  37. package/dist/client/assets/chunks/c4Diagram-KJ2TOQU5-O53G4GQH.js +38 -0
  38. package/dist/client/assets/chunks/cadence-JIRTEU64.js +1 -0
  39. package/dist/client/assets/chunks/cairo-3W6NVDNW.js +1 -0
  40. package/dist/client/assets/chunks/chapel-BPBJ2E7K.js +1 -0
  41. package/dist/client/assets/chunks/chunk-25KVF5ZE.js +1 -0
  42. package/dist/client/assets/chunks/chunk-2CJKSQOI.js +1 -0
  43. package/dist/client/assets/chunks/chunk-2QIJRTWR.js +1 -0
  44. package/dist/client/assets/chunks/chunk-2ZCRJZGF.js +2 -0
  45. package/dist/client/assets/chunks/chunk-3ILNDZNY.js +213 -0
  46. package/dist/client/assets/chunks/chunk-3M2OOQ7S.js +1 -0
  47. package/dist/client/assets/chunks/chunk-3M57NTNK.js +1 -0
  48. package/dist/client/assets/chunks/chunk-3MR6DCZJ.js +1 -0
  49. package/dist/client/assets/chunks/chunk-3WGHS7F7.js +1 -0
  50. package/dist/client/assets/chunks/chunk-4JK75V33.js +1 -0
  51. package/dist/client/assets/chunks/chunk-4NXNVEWK.js +1 -0
  52. package/dist/client/assets/chunks/chunk-4RNNBDFQ.js +1 -0
  53. package/dist/client/assets/chunks/chunk-4T4NVH7V.js +1 -0
  54. package/dist/client/assets/chunks/chunk-4TFFBC35.js +1 -0
  55. package/dist/client/assets/chunks/chunk-4WYBE67P.js +1 -0
  56. package/dist/client/assets/chunks/chunk-56ITEUFA.js +1 -0
  57. package/dist/client/assets/chunks/chunk-5DXRE7IH.js +1 -0
  58. package/dist/client/assets/chunks/chunk-5IMADCNU.js +1 -0
  59. package/dist/client/assets/chunks/chunk-5XZPGKN4.js +1 -0
  60. package/dist/client/assets/chunks/chunk-6O32UKSP.js +1 -0
  61. package/dist/client/assets/chunks/chunk-7BAEB64Q.js +1 -0
  62. package/dist/client/assets/chunks/chunk-7FMWBHZO.js +1 -0
  63. package/dist/client/assets/chunks/chunk-7GFDITUT.js +1 -0
  64. package/dist/client/assets/chunks/chunk-7H4MLBHI.js +1 -0
  65. package/dist/client/assets/chunks/chunk-7OJ4MEEB.js +1 -0
  66. package/dist/client/assets/chunks/chunk-7RSEISFE.js +1 -0
  67. package/dist/client/assets/chunks/chunk-7YNZZQVT.js +1 -0
  68. package/dist/client/assets/chunks/chunk-AB7TIL2G.js +1 -0
  69. package/dist/client/assets/chunks/chunk-ADDF76FL.js +1 -0
  70. package/dist/client/assets/chunks/chunk-AF6UTCD4.js +321 -0
  71. package/dist/client/assets/chunks/chunk-AJ2K6ASU.js +1 -0
  72. package/dist/client/assets/chunks/chunk-AUBAENQZ.js +1 -0
  73. package/dist/client/assets/chunks/chunk-BJEYVZ65.js +1 -0
  74. package/dist/client/assets/chunks/chunk-BLRM6LXA.js +1 -0
  75. package/dist/client/assets/chunks/chunk-BOCTYCDZ.js +1 -0
  76. package/dist/client/assets/chunks/chunk-BU4VRYN7.js +1 -0
  77. package/dist/client/assets/chunks/chunk-CALYHV7D.js +1 -0
  78. package/dist/client/assets/chunks/chunk-CF4W3RZ4.js +1 -0
  79. package/dist/client/assets/chunks/chunk-DCZ2OBSL.js +1 -0
  80. package/dist/client/assets/chunks/chunk-DUFPBTHD.js +1 -0
  81. package/dist/client/assets/chunks/chunk-DUICIQBC.js +88 -0
  82. package/dist/client/assets/chunks/chunk-EH2N475V.js +1 -0
  83. package/dist/client/assets/chunks/chunk-EHLLNPZT.js +1 -0
  84. package/dist/client/assets/chunks/chunk-EIBFAW37.js +1 -0
  85. package/dist/client/assets/chunks/chunk-EO3ER3GN.js +1 -0
  86. package/dist/client/assets/chunks/chunk-FH24BIIA.js +1 -0
  87. package/dist/client/assets/chunks/chunk-FNOXGAL5.js +2 -0
  88. package/dist/client/assets/chunks/chunk-FTY6WLQF.js +3 -0
  89. package/dist/client/assets/chunks/chunk-FZFME6UK.js +1 -0
  90. package/dist/client/assets/chunks/chunk-FZJZZYYO.js +1 -0
  91. package/dist/client/assets/chunks/chunk-G4Z6L7OO.js +1 -0
  92. package/dist/client/assets/chunks/chunk-GNCEAN2B.js +1 -0
  93. package/dist/client/assets/chunks/chunk-GQJIKV3T.js +1 -0
  94. package/dist/client/assets/chunks/chunk-GUMNOKT2.js +1 -0
  95. package/dist/client/assets/chunks/chunk-GXRORAF3.js +1 -0
  96. package/dist/client/assets/chunks/chunk-H36ABDKY.js +1 -0
  97. package/dist/client/assets/chunks/chunk-HAR5NYVW.js +1 -0
  98. package/dist/client/assets/chunks/chunk-HIGPS4L2.js +1 -0
  99. package/dist/client/assets/chunks/chunk-HMOBGTME.js +1 -0
  100. package/dist/client/assets/chunks/chunk-HNO6SQ7M.js +1 -0
  101. package/dist/client/assets/chunks/chunk-HYVZ3GYN.js +1 -0
  102. package/dist/client/assets/chunks/chunk-I6TGFOQS.js +1 -0
  103. package/dist/client/assets/chunks/chunk-IHIOJK7I.js +1 -0
  104. package/dist/client/assets/chunks/chunk-IHJNUMSC.js +1 -0
  105. package/dist/client/assets/chunks/chunk-IP7PB2OC.js +1 -0
  106. package/dist/client/assets/chunks/chunk-ISDTMH2Y.js +1 -0
  107. package/dist/client/assets/chunks/chunk-J65M2LNT.js +1 -0
  108. package/dist/client/assets/chunks/chunk-JCWYZ7X2.js +62 -0
  109. package/dist/client/assets/chunks/chunk-JENWYTLI.js +1 -0
  110. package/dist/client/assets/chunks/chunk-JJ6YWJQS.js +1 -0
  111. package/dist/client/assets/chunks/chunk-JMUVGGX7.js +32 -0
  112. package/dist/client/assets/chunks/chunk-JNQUFMM4.js +1 -0
  113. package/dist/client/assets/chunks/chunk-JPTECOAL.js +1 -0
  114. package/dist/client/assets/chunks/chunk-JZNK4LKS.js +1 -0
  115. package/dist/client/assets/chunks/chunk-KPNXJBIW.js +1 -0
  116. package/dist/client/assets/chunks/chunk-KZO2GZL7.js +1 -0
  117. package/dist/client/assets/chunks/chunk-L2REESOQ.js +1 -0
  118. package/dist/client/assets/chunks/chunk-LJPJXR7R.js +1 -0
  119. package/dist/client/assets/chunks/chunk-LOEZMLCI.js +1 -0
  120. package/dist/client/assets/chunks/chunk-MLYC6FSE.js +1 -0
  121. package/dist/client/assets/chunks/chunk-MMDGEZYU.js +1 -0
  122. package/dist/client/assets/chunks/chunk-MYXE7CGE.js +1 -0
  123. package/dist/client/assets/chunks/chunk-NBH7YOBD.js +15 -0
  124. package/dist/client/assets/chunks/chunk-NCOVM3YF.js +1 -0
  125. package/dist/client/assets/chunks/chunk-NCWOBVU7.js +1 -0
  126. package/dist/client/assets/chunks/chunk-NLRIHHEH.js +1 -0
  127. package/dist/client/assets/chunks/chunk-NUPEOYK6.js +1 -0
  128. package/dist/client/assets/chunks/chunk-O4MVOA7X.js +1 -0
  129. package/dist/client/assets/chunks/chunk-OBHQQZ4H.js +1 -0
  130. package/dist/client/assets/chunks/chunk-OKPNJIIR.js +1 -0
  131. package/dist/client/assets/chunks/chunk-OLMPB57R.js +1 -0
  132. package/dist/client/assets/chunks/chunk-P2FYOAEV.js +1 -0
  133. package/dist/client/assets/chunks/chunk-PI3SNP4C.js +1 -0
  134. package/dist/client/assets/chunks/chunk-PRDTEROB.js +1 -0
  135. package/dist/client/assets/chunks/chunk-PZELHD2H.js +136 -0
  136. package/dist/client/assets/chunks/chunk-QR2Q34LM.js +1 -0
  137. package/dist/client/assets/chunks/chunk-R4GIXL6S.js +1 -0
  138. package/dist/client/assets/chunks/chunk-RORF4F5V.js +1 -0
  139. package/dist/client/assets/chunks/chunk-S73BYTLL.js +1 -0
  140. package/dist/client/assets/chunks/chunk-SFC5MRYR.js +1 -0
  141. package/dist/client/assets/chunks/chunk-SVM2H22K.js +2 -0
  142. package/dist/client/assets/chunks/chunk-SZ6UCGVD.js +1 -0
  143. package/dist/client/assets/chunks/chunk-SZYM6GIJ.js +127 -0
  144. package/dist/client/assets/chunks/chunk-TT5KJZKM.js +1 -0
  145. package/dist/client/assets/chunks/chunk-UFBKUYNH.js +1 -0
  146. package/dist/client/assets/chunks/chunk-UL57AD4T.js +1 -0
  147. package/dist/client/assets/chunks/chunk-UNEI7LMM.js +1 -0
  148. package/dist/client/assets/chunks/chunk-VNQBBFIY.js +1 -0
  149. package/dist/client/assets/chunks/chunk-WGVITPII.js +1 -0
  150. package/dist/client/assets/chunks/chunk-WRA6KJHX.js +10 -0
  151. package/dist/client/assets/chunks/chunk-WS5EHW43.js +1 -0
  152. package/dist/client/assets/chunks/chunk-XE6SLBBE.js +3 -0
  153. package/dist/client/assets/chunks/chunk-XF5T2P7U.js +72 -0
  154. package/dist/client/assets/chunks/chunk-XFRY5WKO.js +1 -0
  155. package/dist/client/assets/chunks/chunk-XWYV4OPA.js +1 -0
  156. package/dist/client/assets/chunks/chunk-YCE5ECKY.js +1 -0
  157. package/dist/client/assets/chunks/chunk-YIN5CSIF.js +1 -0
  158. package/dist/client/assets/chunks/chunk-YLFUX6XH.js +1 -0
  159. package/dist/client/assets/chunks/chunk-YNXJICZM.js +1 -0
  160. package/dist/client/assets/chunks/chunk-YOHF7NGD.js +1 -0
  161. package/dist/client/assets/chunks/chunk-YORIST7Z.js +1 -0
  162. package/dist/client/assets/chunks/chunk-YUL7CG4R.js +1 -0
  163. package/dist/client/assets/chunks/chunk-YUN7JSFJ.js +2 -0
  164. package/dist/client/assets/chunks/chunk-YZ7D2IT7.js +1 -0
  165. package/dist/client/assets/chunks/chunk-Z7LAPMFJ.js +1 -0
  166. package/dist/client/assets/chunks/chunk-ZE325LPC.js +1 -0
  167. package/dist/client/assets/chunks/chunk-ZN7TN6PO.js +1 -0
  168. package/dist/client/assets/chunks/chunk-ZST3EVPO.js +1 -0
  169. package/dist/client/assets/chunks/chunk-ZZHMDDZN.js +1 -0
  170. package/dist/client/assets/chunks/clarity-RKRYQ7WF.js +1 -0
  171. package/dist/client/assets/chunks/classDiagram-v2-L25IHNXF-Y67HVDZV.js +217 -0
  172. package/dist/client/assets/chunks/clojure-2X2DQECJ.js +1 -0
  173. package/dist/client/assets/chunks/cmake-LH5524XE.js +1 -0
  174. package/dist/client/assets/chunks/cobol-7DALQF3W.js +1 -0
  175. package/dist/client/assets/chunks/codeowners-52SZU5P5.js +1 -0
  176. package/dist/client/assets/chunks/codeql-EISH3KUP.js +1 -0
  177. package/dist/client/assets/chunks/coffee-VAWSGA7Y.js +1 -0
  178. package/dist/client/assets/chunks/common-lisp-4MVK2AN6.js +1 -0
  179. package/dist/client/assets/chunks/coq-4VRYZRZV.js +1 -0
  180. package/dist/client/assets/chunks/core-BRBMZSD2.js +12 -0
  181. package/dist/client/assets/chunks/cose-bilkent-JH36ORCC-BIOOHSAA.js +1 -0
  182. package/dist/client/assets/chunks/cpp-RFECMSKD.js +1 -0
  183. package/dist/client/assets/chunks/crystal-ZBGGFAOI.js +1 -0
  184. package/dist/client/assets/chunks/csharp-BZDPMKKW.js +1 -0
  185. package/dist/client/assets/chunks/css-3WWGM6UD.js +1 -0
  186. package/dist/client/assets/chunks/csv-AB4GNWSB.js +1 -0
  187. package/dist/client/assets/chunks/cue-2E46MZP2.js +1 -0
  188. package/dist/client/assets/chunks/cynefin-EF2NZ3EQ-TLFQLWUN.js +1 -0
  189. package/dist/client/assets/chunks/cynefinDiagram-L36ESFBY-FLPXCSSG.js +62 -0
  190. package/dist/client/assets/chunks/cypher-HR3ILFOL.js +1 -0
  191. package/dist/client/assets/chunks/d-TARSZPOL.js +1 -0
  192. package/dist/client/assets/chunks/dagre-SPEB5RXH-7EGEINJ2.js +4 -0
  193. package/dist/client/assets/chunks/dart-SALLJHVI.js +1 -0
  194. package/dist/client/assets/chunks/dax-WYMRGMXC.js +1 -0
  195. package/dist/client/assets/chunks/desktop-ND5CGLLJ.js +1 -0
  196. package/dist/client/assets/chunks/diagram-3B7GL73J-6USY4HZX.js +200 -0
  197. package/dist/client/assets/chunks/diagram-DNEMPZML-BNSOC4VW.js +24 -0
  198. package/dist/client/assets/chunks/diagram-L3MUGCDN-5V5FZYIG.js +41 -0
  199. package/dist/client/assets/chunks/diagram-LA4NIPWU-25VLY2CO.js +24 -0
  200. package/dist/client/assets/chunks/diagram-MHCOC4E2-G2LFP3JU.js +3 -0
  201. package/dist/client/assets/chunks/diagram-XPFHEONP-E6HBBIBV.js +30 -0
  202. package/dist/client/assets/chunks/diff-PWYGPM7B.js +1 -0
  203. package/dist/client/assets/chunks/docker-A4D7DT7W.js +1 -0
  204. package/dist/client/assets/chunks/dotenv-VWQWV2DY.js +1 -0
  205. package/dist/client/assets/chunks/dream-maker-M5YDQS35.js +1 -0
  206. package/dist/client/assets/chunks/ebnfDiagram-UZSYDL2S-BMXXZZPI.js +1 -0
  207. package/dist/client/assets/chunks/edge-3QXIDJHI.js +1 -0
  208. package/dist/client/assets/chunks/elixir-3OX2UHIZ.js +1 -0
  209. package/dist/client/assets/chunks/elk-XV6XMXQE-IPR65FON.js +27 -0
  210. package/dist/client/assets/chunks/elm-CTS65NCT.js +1 -0
  211. package/dist/client/assets/chunks/emacs-lisp-HHS2IDO7.js +1 -0
  212. package/dist/client/assets/chunks/engine-javascript-DNHSF67B.js +141 -0
  213. package/dist/client/assets/chunks/erDiagram-EYBAPDEH-3GEHFWHG.js +99 -0
  214. package/dist/client/assets/chunks/erb-ICYWK6HS.js +1 -0
  215. package/dist/client/assets/chunks/erlang-BDQPNCKX.js +1 -0
  216. package/dist/client/assets/chunks/eventmodeling-K75KTNOO-B27BJTZL.js +1 -0
  217. package/dist/client/assets/chunks/fennel-4ONBA2PH.js +1 -0
  218. package/dist/client/assets/chunks/fish-ATLPBZSD.js +1 -0
  219. package/dist/client/assets/chunks/flowDiagram-MALGAFMO-5PCLR4AE.js +1 -0
  220. package/dist/client/assets/chunks/fluent-GGMONBVW.js +1 -0
  221. package/dist/client/assets/chunks/fortran-fixed-form-5MSBDRWQ.js +1 -0
  222. package/dist/client/assets/chunks/fortran-free-form-TT3RBL75.js +1 -0
  223. package/dist/client/assets/chunks/fsharp-PAGHNW4O.js +1 -0
  224. package/dist/client/assets/chunks/ganttDiagram-23REXITY-VE5MVBTO.js +292 -0
  225. package/dist/client/assets/chunks/gdresource-5OTP326D.js +1 -0
  226. package/dist/client/assets/chunks/gdscript-VPWHSCLF.js +1 -0
  227. package/dist/client/assets/chunks/gdshader-FYLPXFE5.js +1 -0
  228. package/dist/client/assets/chunks/genie-UYMEEMA2.js +1 -0
  229. package/dist/client/assets/chunks/gherkin-SU7D5DMY.js +1 -0
  230. package/dist/client/assets/chunks/git-commit-5CF5QAG7.js +1 -0
  231. package/dist/client/assets/chunks/git-rebase-X72BAUZI.js +1 -0
  232. package/dist/client/assets/chunks/gitGraph-VSP46ZUC-J6CJ5YZF.js +1 -0
  233. package/dist/client/assets/chunks/gitGraphDiagram-STJD7YCW-7YJGT6ZP.js +106 -0
  234. package/dist/client/assets/chunks/gleam-LR42YRKO.js +1 -0
  235. package/dist/client/assets/chunks/glimmer-js-JPF67FJU.js +1 -0
  236. package/dist/client/assets/chunks/glimmer-ts-BYPAVIZT.js +1 -0
  237. package/dist/client/assets/chunks/glsl-GTGUULBN.js +1 -0
  238. package/dist/client/assets/chunks/gn-NMDQA4K3.js +1 -0
  239. package/dist/client/assets/chunks/gnuplot-UUAMYBCZ.js +1 -0
  240. package/dist/client/assets/chunks/go-4RERSTNP.js +1 -0
  241. package/dist/client/assets/chunks/graphql-5A6RK6YF.js +1 -0
  242. package/dist/client/assets/chunks/groovy-O7BJONCU.js +1 -0
  243. package/dist/client/assets/chunks/hack-7QGTNPDP.js +1 -0
  244. package/dist/client/assets/chunks/haml-ON5GAWN4.js +1 -0
  245. package/dist/client/assets/chunks/handlebars-6UOQSUBP.js +1 -0
  246. package/dist/client/assets/chunks/haskell-OIZXZ26Y.js +1 -0
  247. package/dist/client/assets/chunks/haxe-7FFVS4FO.js +1 -0
  248. package/dist/client/assets/chunks/hcl-XFUFQJHV.js +1 -0
  249. package/dist/client/assets/chunks/hjson-QDBHMTD5.js +1 -0
  250. package/dist/client/assets/chunks/hlsl-4LP25FFN.js +1 -0
  251. package/dist/client/assets/chunks/html-7RNQXAAV.js +1 -0
  252. package/dist/client/assets/chunks/html-derivative-ESOY72Q2.js +1 -0
  253. package/dist/client/assets/chunks/http-SAD4PMBD.js +1 -0
  254. package/dist/client/assets/chunks/hurl-ZSJJXPQH.js +1 -0
  255. package/dist/client/assets/chunks/hxml-HJCC37RK.js +1 -0
  256. package/dist/client/assets/chunks/hy-CLDE3P4K.js +1 -0
  257. package/dist/client/assets/chunks/imba-REB34U5V.js +1 -0
  258. package/dist/client/assets/chunks/info-OHQRW6UA-EQQKXR77.js +1 -0
  259. package/dist/client/assets/chunks/infoDiagram-KBXO4MBG-F6KGZCGS.js +2 -0
  260. package/dist/client/assets/chunks/ini-PDFEMGRA.js +1 -0
  261. package/dist/client/assets/chunks/ishikawaDiagram-M35NCXHK-5D6ZOZ34.js +70 -0
  262. package/dist/client/assets/chunks/java-KB6XENAD.js +1 -0
  263. package/dist/client/assets/chunks/javascript-3JX5T423.js +1 -0
  264. package/dist/client/assets/chunks/jinja-V4UNU6K4.js +1 -0
  265. package/dist/client/assets/chunks/jison-KH5XNLJP.js +1 -0
  266. package/dist/client/assets/chunks/journeyDiagram-OPLOXDXO-ANDOJZKW.js +139 -0
  267. package/dist/client/assets/chunks/json-HPXFRRPY.js +1 -0
  268. package/dist/client/assets/chunks/json5-LJM6TXWM.js +1 -0
  269. package/dist/client/assets/chunks/jsonc-UZWRU3JV.js +1 -0
  270. package/dist/client/assets/chunks/jsonl-RFZD5UN4.js +1 -0
  271. package/dist/client/assets/chunks/jsonnet-GFZABBL6.js +1 -0
  272. package/dist/client/assets/chunks/jssm-2YIGBISJ.js +1 -0
  273. package/dist/client/assets/chunks/jsx-KLV2ZWUT.js +1 -0
  274. package/dist/client/assets/chunks/julia-3TZDIPPO.js +1 -0
  275. package/dist/client/assets/chunks/just-UHCONBQS.js +1 -0
  276. package/dist/client/assets/chunks/kanban-definition-BZKZHSQY-GF5I5NVD.js +89 -0
  277. package/dist/client/assets/chunks/katex-PIN72PQZ.js +257 -0
  278. package/dist/client/assets/chunks/kdl-DARTFOCL.js +1 -0
  279. package/dist/client/assets/chunks/kotlin-7KT5DW6Y.js +1 -0
  280. package/dist/client/assets/chunks/kusto-EKYXZTC5.js +1 -0
  281. package/dist/client/assets/chunks/langs-GO3UQR4H.js +1 -0
  282. package/dist/client/assets/chunks/latex-T57MIHR5.js +1 -0
  283. package/dist/client/assets/chunks/lean-5QVPRMV6.js +1 -0
  284. package/dist/client/assets/chunks/less-K6QEH5TN.js +1 -0
  285. package/dist/client/assets/chunks/liquid-3LCNNEIV.js +1 -0
  286. package/dist/client/assets/chunks/llvm-O32ZIVRF.js +1 -0
  287. package/dist/client/assets/chunks/log-C4YPJ5BB.js +1 -0
  288. package/dist/client/assets/chunks/logo-JPMO43A6.js +1 -0
  289. package/dist/client/assets/chunks/lua-YKVSOG7K.js +1 -0
  290. package/dist/client/assets/chunks/luau-K4EECYSO.js +1 -0
  291. package/dist/client/assets/chunks/make-VHSYMHHW.js +1 -0
  292. package/dist/client/assets/chunks/markdown-GC5J46H4.js +1 -0
  293. package/dist/client/assets/chunks/marko-U45YFADC.js +1 -0
  294. package/dist/client/assets/chunks/matlab-AMOKC4LU.js +1 -0
  295. package/dist/client/assets/chunks/mdc-DIGA2UXP.js +1 -0
  296. package/dist/client/assets/chunks/mdx-BZUGCKQA.js +1 -0
  297. package/dist/client/assets/chunks/mermaid-WHDP6ZPA.js +1 -0
  298. package/dist/client/assets/chunks/mermaid.core-SQMPMUDN.js +10 -0
  299. package/dist/client/assets/chunks/mindmap-definition-I2QAS2VK-4NH5S56C.js +98 -0
  300. package/dist/client/assets/chunks/mipsasm-2S4CUGQV.js +1 -0
  301. package/dist/client/assets/chunks/mojo-ZOL2PNKT.js +1 -0
  302. package/dist/client/assets/chunks/moonbit-U3BDAIFE.js +1 -0
  303. package/dist/client/assets/chunks/move-YSXALBWA.js +1 -0
  304. package/dist/client/assets/chunks/narrat-DHFIAUJH.js +1 -0
  305. package/dist/client/assets/chunks/nextflow-ESAKNTI3.js +1 -0
  306. package/dist/client/assets/chunks/nextflow-groovy-FKDSPJUI.js +1 -0
  307. package/dist/client/assets/chunks/nginx-XYAYERLO.js +1 -0
  308. package/dist/client/assets/chunks/nim-XOWBVFDH.js +1 -0
  309. package/dist/client/assets/chunks/nix-RVSTQSHC.js +1 -0
  310. package/dist/client/assets/chunks/nsis-KMDUKQRL.js +1 -0
  311. package/dist/client/assets/chunks/nushell-SKJHHZ7U.js +1 -0
  312. package/dist/client/assets/chunks/objective-c-3B3KXQ7Q.js +1 -0
  313. package/dist/client/assets/chunks/objective-cpp-6JDULPJS.js +1 -0
  314. package/dist/client/assets/chunks/ocaml-TMRFXBVO.js +1 -0
  315. package/dist/client/assets/chunks/odin-IN3PLCK7.js +1 -0
  316. package/dist/client/assets/chunks/openscad-P52IKPNH.js +1 -0
  317. package/dist/client/assets/chunks/org-N3SJ2PIA.js +1 -0
  318. package/dist/client/assets/chunks/packet-JDAUHWVQ-4SWIKSKP.js +1 -0
  319. package/dist/client/assets/chunks/pascal-T7CUWCQ4.js +1 -0
  320. package/dist/client/assets/chunks/pegDiagram-FD4XPPHP-WDKZSEGN.js +1 -0
  321. package/dist/client/assets/chunks/perl-LCZ4KODH.js +1 -0
  322. package/dist/client/assets/chunks/php-4XHMBVR5.js +1 -0
  323. package/dist/client/assets/chunks/pie-XZMESJXO-PSSWOWGV.js +1 -0
  324. package/dist/client/assets/chunks/pieDiagram-J4AKIIQI-BDW5I5ON.js +39 -0
  325. package/dist/client/assets/chunks/pkl-OACG5B67.js +1 -0
  326. package/dist/client/assets/chunks/plsql-7E5C7CJX.js +1 -0
  327. package/dist/client/assets/chunks/po-ZSREFRRP.js +1 -0
  328. package/dist/client/assets/chunks/polar-4GBINVA7.js +1 -0
  329. package/dist/client/assets/chunks/postcss-B7RPVGFW.js +1 -0
  330. package/dist/client/assets/chunks/powerquery-6UFMTY4G.js +1 -0
  331. package/dist/client/assets/chunks/powershell-3STRPCNT.js +1 -0
  332. package/dist/client/assets/chunks/prisma-4TPSPIZ5.js +1 -0
  333. package/dist/client/assets/chunks/prolog-HEAYPKQW.js +1 -0
  334. package/dist/client/assets/chunks/proto-Y3Y3VKXM.js +1 -0
  335. package/dist/client/assets/chunks/pug-7PBPMG3M.js +1 -0
  336. package/dist/client/assets/chunks/puppet-FR35R4OI.js +1 -0
  337. package/dist/client/assets/chunks/purescript-OUHXQAOW.js +1 -0
  338. package/dist/client/assets/chunks/python-SNDG7FNU.js +1 -0
  339. package/dist/client/assets/chunks/qml-UVIOSWP4.js +1 -0
  340. package/dist/client/assets/chunks/qmldir-6JGUNYL5.js +1 -0
  341. package/dist/client/assets/chunks/qss-ZCC466IZ.js +1 -0
  342. package/dist/client/assets/chunks/quadrantDiagram-XTYBLID2-5VKXWVJ6.js +7 -0
  343. package/dist/client/assets/chunks/r-4XW4O3ZF.js +1 -0
  344. package/dist/client/assets/chunks/racket-YJAYXOOG.js +1 -0
  345. package/dist/client/assets/chunks/radar-ABXABTNO-3AXZCEY2.js +1 -0
  346. package/dist/client/assets/chunks/railroad-I3PHUGI6-2PLXYPOT.js +1 -0
  347. package/dist/client/assets/chunks/railroad-abnf-LNEFI6M7-M4DGICQX.js +1 -0
  348. package/dist/client/assets/chunks/railroad-ebnf-DWYD2UWJ-UEIHQMSZ.js +1 -0
  349. package/dist/client/assets/chunks/railroad-peg-JR7BVNR7-I7VLIBXM.js +1 -0
  350. package/dist/client/assets/chunks/railroadDiagram-MRQ6NCDL-Y6IYWEFL.js +1 -0
  351. package/dist/client/assets/chunks/raku-63NEL5JK.js +1 -0
  352. package/dist/client/assets/chunks/razor-J3CJP523.js +1 -0
  353. package/dist/client/assets/chunks/rbs-6GQLT7NW.js +1 -0
  354. package/dist/client/assets/chunks/reg-6Q3OEC2C.js +1 -0
  355. package/dist/client/assets/chunks/regexp-LPIMILT3.js +1 -0
  356. package/dist/client/assets/chunks/rel-TOQGUTHB.js +1 -0
  357. package/dist/client/assets/chunks/requirementDiagram-Y7LWUY3S-CIWXVVWJ.js +84 -0
  358. package/dist/client/assets/chunks/riscv-UELGBOXE.js +1 -0
  359. package/dist/client/assets/chunks/ron-FW7LCJJH.js +1 -0
  360. package/dist/client/assets/chunks/rosmsg-O63VHE3L.js +1 -0
  361. package/dist/client/assets/chunks/rst-3WJXGLA7.js +1 -0
  362. package/dist/client/assets/chunks/ruby-7S7L6JTH.js +1 -0
  363. package/dist/client/assets/chunks/rust-LIK4HRRI.js +1 -0
  364. package/dist/client/assets/chunks/sankeyDiagram-WGJFYUXA-OGNQPX5V.js +40 -0
  365. package/dist/client/assets/chunks/sas-FHDPZ2JH.js +1 -0
  366. package/dist/client/assets/chunks/sass-UI4HW2FN.js +1 -0
  367. package/dist/client/assets/chunks/scala-KN7RQSUJ.js +1 -0
  368. package/dist/client/assets/chunks/scheme-5R527YZ5.js +1 -0
  369. package/dist/client/assets/chunks/scss-KZ6DRE4A.js +1 -0
  370. package/dist/client/assets/chunks/sdbl-FHOCL5SL.js +1 -0
  371. package/dist/client/assets/chunks/sequenceDiagram-5NDRBG5M-QX2V24ZU.js +169 -0
  372. package/dist/client/assets/chunks/shaderlab-2TLHUS2H.js +1 -0
  373. package/dist/client/assets/chunks/shellscript-PIB6ZBDM.js +1 -0
  374. package/dist/client/assets/chunks/shellsession-5KL7NFNN.js +1 -0
  375. package/dist/client/assets/chunks/sizeCapture-INFHLROL-LCS2PIHM.js +1 -0
  376. package/dist/client/assets/chunks/smalltalk-JFLFU247.js +1 -0
  377. package/dist/client/assets/chunks/smithy-HONEXZAM.js +1 -0
  378. package/dist/client/assets/chunks/solidity-SJ3INJFZ.js +1 -0
  379. package/dist/client/assets/chunks/soy-ND4SWTM2.js +1 -0
  380. package/dist/client/assets/chunks/sparql-YB2JQBZD.js +1 -0
  381. package/dist/client/assets/chunks/splunk-UXIDDAWL.js +1 -0
  382. package/dist/client/assets/chunks/sql-K6OMG7SQ.js +1 -0
  383. package/dist/client/assets/chunks/ssh-config-I7KJY3KQ.js +1 -0
  384. package/dist/client/assets/chunks/stata-DNZ3DTFJ.js +1 -0
  385. package/dist/client/assets/chunks/stateDiagram-v2-FJ4FJNEA-LVAUWF3A.js +291 -0
  386. package/dist/client/assets/chunks/stylus-GWPR6IQY.js +1 -0
  387. package/dist/client/assets/chunks/surrealql-KQNHBWLC.js +1 -0
  388. package/dist/client/assets/chunks/svelte-YQKF25S4.js +1 -0
  389. package/dist/client/assets/chunks/swift-ZCIZUJXA.js +1 -0
  390. package/dist/client/assets/chunks/swimlanes-UMQ2AFYF-B3RQOARQ.js +1 -0
  391. package/dist/client/assets/chunks/swimlanesDiagram-OMPLPG4O-JOE33EOV.js +8 -0
  392. package/dist/client/assets/chunks/system-verilog-Y7E6FIO3.js +1 -0
  393. package/dist/client/assets/chunks/systemd-WHC7NBZP.js +1 -0
  394. package/dist/client/assets/chunks/talonscript-WC7SODAH.js +1 -0
  395. package/dist/client/assets/chunks/tasl-QHY2GTCB.js +1 -0
  396. package/dist/client/assets/chunks/tcl-VAMIL5PJ.js +1 -0
  397. package/dist/client/assets/chunks/temml-ISNSX3VV.js +96 -0
  398. package/dist/client/assets/chunks/templ-B3BHKWV4.js +1 -0
  399. package/dist/client/assets/chunks/terraform-Q4UEK6FK.js +1 -0
  400. package/dist/client/assets/chunks/tex-63OWCYAB.js +1 -0
  401. package/dist/client/assets/chunks/timeline-definition-SEUHKTQE-FDFTVAJG.js +120 -0
  402. package/dist/client/assets/chunks/toml-7Z4IPGES.js +1 -0
  403. package/dist/client/assets/chunks/treeView-D4JQ5SDB-ABSGRAGI.js +1 -0
  404. package/dist/client/assets/chunks/treemap-SAJKECNS-MYX2CBJN.js +1 -0
  405. package/dist/client/assets/chunks/ts-tags-DT62HE52.js +1 -0
  406. package/dist/client/assets/chunks/tsv-RTXHWADP.js +1 -0
  407. package/dist/client/assets/chunks/tsx-UANUBOC7.js +1 -0
  408. package/dist/client/assets/chunks/turtle-QVOUNUUL.js +1 -0
  409. package/dist/client/assets/chunks/twig-ZPC4BPDA.js +1 -0
  410. package/dist/client/assets/chunks/typescript-WGWKIMMW.js +1 -0
  411. package/dist/client/assets/chunks/typespec-TYCVR32J.js +1 -0
  412. package/dist/client/assets/chunks/typst-PIBFYUO6.js +1 -0
  413. package/dist/client/assets/chunks/usecaseDiagram-AFA6YXN4-KW7ADINR.js +370 -0
  414. package/dist/client/assets/chunks/v-3ERNWBSP.js +1 -0
  415. package/dist/client/assets/chunks/vala-UCBCT2GS.js +1 -0
  416. package/dist/client/assets/chunks/vb-DGI3VTPA.js +1 -0
  417. package/dist/client/assets/chunks/vennDiagram-NNMJR3RB-RDGLGOGM.js +34 -0
  418. package/dist/client/assets/chunks/verilog-G72NZROS.js +1 -0
  419. package/dist/client/assets/chunks/vhdl-PYGA77XE.js +1 -0
  420. package/dist/client/assets/chunks/viml-OOC5B5UU.js +1 -0
  421. package/dist/client/assets/chunks/vue-GTNHIOPG.js +1 -0
  422. package/dist/client/assets/chunks/vue-html-DKAMJV55.js +1 -0
  423. package/dist/client/assets/chunks/vue-vine-WTM5HREV.js +1 -0
  424. package/dist/client/assets/chunks/vyper-RHYEHOJM.js +1 -0
  425. package/dist/client/assets/chunks/wardley-7MLQ67FV-QJL2HSBT.js +1 -0
  426. package/dist/client/assets/chunks/wardleyDiagram-S7YFUSEH-A4XX3UJR.js +78 -0
  427. package/dist/client/assets/chunks/wasm-ZMM2Z5XV.js +1 -0
  428. package/dist/client/assets/chunks/wenyan-HF5UTKSJ.js +1 -0
  429. package/dist/client/assets/chunks/wgsl-O7D7OPO7.js +1 -0
  430. package/dist/client/assets/chunks/wikitext-T7BSWSKQ.js +1 -0
  431. package/dist/client/assets/chunks/wit-TKCHPPT6.js +1 -0
  432. package/dist/client/assets/chunks/wolfram-7MN66A7N.js +1 -0
  433. package/dist/client/assets/chunks/xml-NLTLAWOD.js +1 -0
  434. package/dist/client/assets/chunks/xsl-NZ4ECK3P.js +1 -0
  435. package/dist/client/assets/chunks/xychartDiagram-GGNKY7IX-OXJILWHR.js +7 -0
  436. package/dist/client/assets/chunks/yaml-HRJLEV3V.js +1 -0
  437. package/dist/client/assets/chunks/zenscript-4LLRSLPI.js +1 -0
  438. package/dist/client/assets/chunks/zig-Y7MUQFUO.js +1 -0
  439. package/dist/client/assets/main.js +186 -0
  440. package/dist/client/index.html +48 -0
  441. package/dist/config.js +322 -0
  442. package/dist/files.js +178 -0
  443. package/dist/git.js +365 -0
  444. package/dist/glob.js +89 -0
  445. package/dist/review.js +290 -0
  446. package/dist/search.js +136 -0
  447. package/dist/server.js +482 -0
  448. package/dist/watch.js +69 -0
  449. package/dist/zip.js +100 -0
  450. package/package.json +61 -4
@@ -0,0 +1,48 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
6
+ <meta name="theme-color" content="#f8f8fb" media="(prefers-color-scheme: light)" />
7
+ <meta name="theme-color" content="#16171c" media="(prefers-color-scheme: dark)" />
8
+ <title>folderview</title>
9
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%235b5fd6'/><path d='M12 10l-6 6 6 6M20 10l6 6-6 6' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/></svg>" />
10
+ <link rel="stylesheet" href="assets/app.css" />
11
+ <script>
12
+ // the saved theme before anything draws, so a dark page never flashes white
13
+ try {
14
+ const t = localStorage.getItem('folderview:theme');
15
+ if (t === 'light' || t === 'dark') document.documentElement.dataset.theme = t;
16
+ } catch {}
17
+ </script>
18
+ </head>
19
+ <body>
20
+ <div class="shell">
21
+ <header class="bar" id="bar">
22
+ <button class="brand" id="home" title="Back to the top folder">
23
+ <span class="logo"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="m8 7-5 5 5 5M16 7l5 5-5 5" /></svg></span><b id="repo">…</b>
24
+ </button>
25
+ <span id="branch"></span>
26
+ <form class="search" id="search-form" role="search">
27
+ <span id="search-icon"></span>
28
+ <input id="q" type="search" placeholder="Search in files" aria-label="Search in files" autocomplete="off" spellcheck="false" enterkeyhint="search" />
29
+ <button type="button" class="chip" id="scope">everywhere</button>
30
+ </form>
31
+ <nav class="bar-acts">
32
+ <button class="icon-btn" id="qo-btn" title="Go to a file (Ctrl+P)" aria-label="Go to a file"></button>
33
+ <button class="icon-btn" data-nav="changes" id="changes-btn" title="What changed since the last commit" aria-label="Changes" hidden><span class="count" id="changes-count" hidden>0</span></button>
34
+ <button class="icon-btn" data-nav="review" id="review-btn" title="Review comments" aria-label="Review"><span class="count warn" id="review-count" hidden>0</span></button>
35
+ <button class="icon-btn" id="settings-btn" title="Settings" aria-label="Settings"></button>
36
+ <span class="live" id="live" title="Live: updates as files change"></span>
37
+ </nav>
38
+ </header>
39
+ <div class="app" id="app">
40
+ <aside class="tree" aria-label="Folders"><ul class="roots" id="tree"></ul></aside>
41
+ <div class="splitter-wrap"><div class="splitter" id="splitter" title="Drag to resize"></div></div>
42
+ <section class="main" id="main" aria-label="Folder"></section>
43
+ <section class="file" id="file" aria-label="File" hidden></section>
44
+ </div>
45
+ </div>
46
+ <script type="module" src="assets/main.js"></script>
47
+ </body>
48
+ </html>
package/dist/config.js ADDED
@@ -0,0 +1,322 @@
1
+ // Settings from, highest first: command-line flags, environment variables, the folder's .folderviewrc.json, the user's
2
+ // config file ($XDG_CONFIG_HOME/folderview/config.json, ~/.config/folderview/config.json), then defaults.
3
+ // Exclude patterns add up from every source, plus the folder's .folderviewignore.
4
+ import fs from 'node:fs';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ export const DEFAULTS = {
8
+ root: '.',
9
+ port: 4190,
10
+ host: '127.0.0.1',
11
+ base: '/',
12
+ open: false,
13
+ exclude: [],
14
+ hide: [],
15
+ showSecrets: false,
16
+ git: true,
17
+ watch: true,
18
+ readOnly: false,
19
+ allowHosts: [],
20
+ token: '',
21
+ reviewDir: '.review',
22
+ title: '',
23
+ author: '',
24
+ maxFileMb: 5,
25
+ };
26
+ /** The environment variable for each setting. */
27
+ export const ENV = {
28
+ FOLDERVIEW_ROOT: 'root',
29
+ FOLDERVIEW_PORT: 'port',
30
+ FOLDERVIEW_HOST: 'host',
31
+ FOLDERVIEW_BASE: 'base',
32
+ FOLDERVIEW_OPEN: 'open',
33
+ FOLDERVIEW_EXCLUDE: 'exclude',
34
+ FOLDERVIEW_HIDE: 'hide',
35
+ FOLDERVIEW_SHOW_SECRETS: 'showSecrets',
36
+ FOLDERVIEW_GIT: 'git',
37
+ FOLDERVIEW_WATCH: 'watch',
38
+ FOLDERVIEW_READ_ONLY: 'readOnly',
39
+ FOLDERVIEW_ALLOW_HOSTS: 'allowHosts',
40
+ FOLDERVIEW_TOKEN: 'token',
41
+ FOLDERVIEW_REVIEW_DIR: 'reviewDir',
42
+ FOLDERVIEW_TITLE: 'title',
43
+ FOLDERVIEW_AUTHOR: 'author',
44
+ FOLDERVIEW_MAX_FILE_MB: 'maxFileMb',
45
+ };
46
+ export const HELP = `folderview: browse, search and review a folder in your browser
47
+
48
+ Usage: folderview [folder] [options]
49
+ folderview review [folder] [--all] [--json] print the review comments (open ones, unless --all)
50
+
51
+ folder the folder to serve (default: the current folder)
52
+ -p, --port <n> port to try first (default 4190; the next free one is used)
53
+ -H, --host <addr> address to listen on (default 127.0.0.1)
54
+ --lan listen on every interface (same as --host 0.0.0.0)
55
+ --base <path> serve under a URL path, e.g. /code/ (behind a proxy)
56
+ -o, --open open it in your browser
57
+ -x, --exclude <globs> never show, serve or search these (comma-separated, repeatable):
58
+ "*.log,dist/,/secrets,**/*.min.js"
59
+ --hide <names> exact names to hide everywhere (.git always is)
60
+ --show-secrets show .env, *.key, *.pem and id_rsa files (hidden by default)
61
+ --token <t> require this token (open ?token=… once; it's kept as a cookie)
62
+ --allow-host <h> accept this host name too, e.g. a tunnel's (repeatable; * for any)
63
+ --review-dir <dir> where review comments are saved (default .review)
64
+ --title <name> the name shown at the top
65
+ --author <name> the default name on comments
66
+ --max-file-mb <n> bigger files aren't previewed as text or searched (default 5)
67
+ --read-only nobody can add comments
68
+ --no-git don't use git
69
+ --no-watch no live updates
70
+ --print-config show the settings and where each came from, then exit
71
+ -v, --version
72
+ -h, --help
73
+
74
+ Every option also reads from an environment variable (FOLDERVIEW_PORT, FOLDERVIEW_HOST,
75
+ FOLDERVIEW_EXCLUDE, FOLDERVIEW_TOKEN, …), from .folderviewrc.json in the folder, and from
76
+ ~/.config/folderview/config.json. Patterns in the folder's .folderviewignore are excluded too.`;
77
+ const LIST_KEYS = new Set(['exclude', 'hide', 'allowHosts']);
78
+ const NUM_KEYS = new Set(['port', 'maxFileMb']);
79
+ function bool(v) {
80
+ return !/^(0|false|no|off)$/i.test(v.trim());
81
+ }
82
+ function list(v) {
83
+ if (Array.isArray(v))
84
+ return v.map(String).flatMap((s) => s.split(',')).map((s) => s.trim()).filter(Boolean);
85
+ if (typeof v === 'string')
86
+ return v
87
+ .split(/[,\n]/)
88
+ .map((s) => s.trim())
89
+ .filter(Boolean);
90
+ return [];
91
+ }
92
+ export class ConfigError extends Error {
93
+ }
94
+ function readJson(file) {
95
+ if (!fs.existsSync(file))
96
+ return undefined;
97
+ try {
98
+ const data = JSON.parse(fs.readFileSync(file, 'utf8'));
99
+ if (!data || typeof data !== 'object' || Array.isArray(data))
100
+ throw new Error('not an object');
101
+ return Object.fromEntries(Object.entries(data).filter(([k]) => k in DEFAULTS));
102
+ }
103
+ catch (e) {
104
+ throw new ConfigError(`${file}: ${e instanceof Error ? e.message : String(e)}`);
105
+ }
106
+ }
107
+ export function globalConfigPath(env = process.env) {
108
+ if (env['FOLDERVIEW_CONFIG'])
109
+ return path.resolve(env['FOLDERVIEW_CONFIG']);
110
+ const base = env['XDG_CONFIG_HOME'] || path.join(os.homedir(), '.config');
111
+ return path.join(base, 'folderview', 'config.json');
112
+ }
113
+ /** Flags → a partial set of settings (no defaults yet). */
114
+ function parseFlags(argv) {
115
+ const raw = {};
116
+ const add = (k, v) => {
117
+ raw[k] = [...list(raw[k]), ...list(v)];
118
+ };
119
+ let help = false, version = false, printConfig = false;
120
+ for (let i = 0; i < argv.length; i++) {
121
+ const a = argv[i] ?? '';
122
+ const eq = a.startsWith('--') ? a.indexOf('=') : -1;
123
+ const flag = eq > 0 ? a.slice(0, eq) : a;
124
+ const inline = eq > 0 ? a.slice(eq + 1) : undefined;
125
+ const value = () => {
126
+ const v = inline ?? argv[++i];
127
+ if (v === undefined)
128
+ throw new ConfigError(`${flag} needs a value`);
129
+ return v;
130
+ };
131
+ switch (flag) {
132
+ case '-h':
133
+ case '--help':
134
+ help = true;
135
+ break;
136
+ case '-v':
137
+ case '--version':
138
+ version = true;
139
+ break;
140
+ case '--print-config':
141
+ printConfig = true;
142
+ break;
143
+ case '-p':
144
+ case '--port':
145
+ raw.port = value();
146
+ break;
147
+ case '-H':
148
+ case '--host':
149
+ raw.host = value();
150
+ break;
151
+ case '--lan':
152
+ raw.host = '0.0.0.0';
153
+ break;
154
+ case '--base':
155
+ raw.base = value();
156
+ break;
157
+ case '-o':
158
+ case '--open':
159
+ raw.open = true;
160
+ break;
161
+ case '-x':
162
+ case '--exclude':
163
+ add('exclude', value());
164
+ break;
165
+ case '--hide':
166
+ add('hide', value());
167
+ break;
168
+ case '--show-secrets':
169
+ raw.showSecrets = true;
170
+ break;
171
+ case '--token':
172
+ raw.token = value();
173
+ break;
174
+ case '--allow-host':
175
+ add('allowHosts', value());
176
+ break;
177
+ case '--review-dir':
178
+ raw.reviewDir = value();
179
+ break;
180
+ case '--title':
181
+ raw.title = value();
182
+ break;
183
+ case '--author':
184
+ raw.author = value();
185
+ break;
186
+ case '--max-file-mb':
187
+ raw.maxFileMb = value();
188
+ break;
189
+ case '--read-only':
190
+ raw.readOnly = true;
191
+ break;
192
+ case '--no-git':
193
+ raw.git = false;
194
+ break;
195
+ case '--no-watch':
196
+ raw.watch = false;
197
+ break;
198
+ default:
199
+ if (a.startsWith('-') && a !== '-')
200
+ throw new ConfigError(`Unknown option ${a} (see --help)`);
201
+ if (raw.root !== undefined)
202
+ throw new ConfigError(`Only one folder, please (got ${String(raw.root)} and ${a})`);
203
+ raw.root = a;
204
+ }
205
+ }
206
+ return { raw, help, version, printConfig };
207
+ }
208
+ function fromEnv(env) {
209
+ const raw = {};
210
+ for (const [name, key] of Object.entries(ENV)) {
211
+ const v = env[name];
212
+ if (v !== undefined && v !== '')
213
+ raw[key] = v;
214
+ }
215
+ return raw;
216
+ }
217
+ export function resolve(argv, env = process.env, cwd = process.cwd()) {
218
+ const flags = parseFlags(argv);
219
+ const envRaw = fromEnv(env);
220
+ const rootArg = flags.raw.root ?? envRaw.root;
221
+ const root = path.resolve(cwd, typeof rootArg === 'string' ? rootArg : '.');
222
+ const globalFile = globalConfigPath(env);
223
+ const projectFile = path.join(root, '.folderviewrc.json');
224
+ const globalRaw = readJson(globalFile);
225
+ const projectRaw = readJson(projectFile);
226
+ const layers = [
227
+ ['default', DEFAULTS],
228
+ [globalFile, globalRaw],
229
+ [projectFile, projectRaw],
230
+ ['environment', envRaw],
231
+ ['command line', flags.raw],
232
+ ];
233
+ const sources = {};
234
+ const merged = {};
235
+ for (const [source, layer] of layers) {
236
+ if (!layer)
237
+ continue;
238
+ for (const [k, v] of Object.entries(layer)) {
239
+ if (v === undefined)
240
+ continue;
241
+ if (LIST_KEYS.has(k)) {
242
+ // lists add up across sources
243
+ const items = list(v);
244
+ if (!items.length && source !== 'default')
245
+ continue;
246
+ merged[k] = [...list(merged[k]), ...items];
247
+ if (items.length)
248
+ sources[k] = sources[k] && sources[k] !== 'default' ? `${sources[k]} + ${source}` : source;
249
+ else
250
+ sources[k] ??= source;
251
+ continue;
252
+ }
253
+ merged[k] = v;
254
+ sources[k] = source;
255
+ }
256
+ }
257
+ const ignoreFile = path.join(root, '.folderviewignore');
258
+ if (fs.existsSync(ignoreFile)) {
259
+ const lines = fs.readFileSync(ignoreFile, 'utf8').split(/\r?\n/);
260
+ const pats = lines.map((l) => l.trim()).filter((l) => l && !l.startsWith('#'));
261
+ if (pats.length) {
262
+ merged['exclude'] = [...list(merged['exclude']), ...pats];
263
+ sources['exclude'] = (sources['exclude'] && sources['exclude'] !== 'default' ? sources['exclude'] + ' + ' : '') + ignoreFile;
264
+ }
265
+ }
266
+ const get = (k) => merged[k];
267
+ const num = (k) => {
268
+ const n = Number(get(k));
269
+ if (!Number.isFinite(n) || n < 0)
270
+ throw new ConfigError(`${k} must be a number (got ${String(get(k))}, from ${sources[k]})`);
271
+ return n;
272
+ };
273
+ const bl = (k) => {
274
+ const v = get(k);
275
+ return typeof v === 'boolean' ? v : bool(String(v));
276
+ };
277
+ for (const k of NUM_KEYS)
278
+ num(k);
279
+ const port = num('port');
280
+ if (!Number.isInteger(port) || port > 65535)
281
+ throw new ConfigError(`port must be 0–65535 (got ${port})`);
282
+ let base = String(get('base') || '/').trim();
283
+ if (!base.startsWith('/'))
284
+ base = '/' + base;
285
+ if (!base.endsWith('/'))
286
+ base += '/';
287
+ if (!fs.existsSync(root) || !fs.statSync(root).isDirectory())
288
+ throw new ConfigError(`No such folder: ${root}`);
289
+ const settings = {
290
+ root,
291
+ port,
292
+ host: String(get('host')),
293
+ base,
294
+ open: bl('open'),
295
+ exclude: list(get('exclude')),
296
+ hide: list(get('hide')),
297
+ showSecrets: bl('showSecrets'),
298
+ git: bl('git'),
299
+ watch: bl('watch'),
300
+ readOnly: bl('readOnly'),
301
+ allowHosts: list(get('allowHosts')),
302
+ token: String(get('token') ?? ''),
303
+ reviewDir: String(get('reviewDir')),
304
+ title: String(get('title') ?? ''),
305
+ author: String(get('author') ?? ''),
306
+ maxFileMb: num('maxFileMb'),
307
+ sources,
308
+ configFiles: [globalRaw ? globalFile : '', projectRaw ? projectFile : '', fs.existsSync(ignoreFile) ? ignoreFile : ''].filter(Boolean),
309
+ };
310
+ return { settings, help: flags.help, version: flags.version, printConfig: flags.printConfig };
311
+ }
312
+ /** The settings as text, with secrets masked and where each came from. */
313
+ export function describe(s) {
314
+ const rows = Object.keys(DEFAULTS).map((k) => {
315
+ let v = s[k];
316
+ if (k === 'token' && v)
317
+ v = '••••••';
318
+ const shown = Array.isArray(v) ? (v.length ? v.join(', ') : '(none)') : v === '' ? '(none)' : String(v);
319
+ return ` ${k.padEnd(12)} ${shown.padEnd(36)} ${s.sources[k] ?? 'default'}`;
320
+ });
321
+ return ['folderview settings:', ...rows].join('\n');
322
+ }
package/dist/files.js ADDED
@@ -0,0 +1,178 @@
1
+ // Paths inside the served folder, what is hidden, folder listings and raw file serving (with ranges).
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ /** Folders a search or a file list skips when git can't say what is ignored. */
5
+ export const NOISE = new Set(['node_modules', '.git', '.hg', '.svn', '.next', '.cache', '.turbo', '__pycache__', '.venv']);
6
+ export function isSecret(name) {
7
+ if (name.startsWith('.env') && name !== '.env.example' && name !== '.env.sample')
8
+ return true;
9
+ if (/^id_(rsa|dsa|ecdsa|ed25519)(\.|$)/.test(name))
10
+ return true;
11
+ return /\.(key|pem|p12|pfx|keystore)$/i.test(name);
12
+ }
13
+ export function isHidden(scope, name) {
14
+ return scope.hidden.has(name) || (scope.hideSecrets && isSecret(name));
15
+ }
16
+ /** A root-relative path with forward slashes, no leading slash. */
17
+ export function toRel(scope, abs) {
18
+ return path.relative(scope.root, abs).split(path.sep).join('/');
19
+ }
20
+ /** The absolute path for a root-relative one, or undefined when it leaves the root or touches something hidden. */
21
+ export function inside(scope, rel) {
22
+ const clean = rel.replace(/\\/g, '/');
23
+ const abs = path.resolve(scope.root, '.' + path.sep + clean);
24
+ if (abs !== scope.root && !abs.startsWith(scope.root + path.sep))
25
+ return undefined;
26
+ const parts = path.relative(scope.root, abs).split(path.sep).filter(Boolean);
27
+ if (parts.some((p) => isHidden(scope, p)))
28
+ return undefined;
29
+ if (parts.length && scope.excluded(parts.join('/')))
30
+ return undefined;
31
+ // a link may point outside the root: follow it and check again
32
+ try {
33
+ const real = fs.realpathSync(abs);
34
+ const realRoot = fs.realpathSync(scope.root);
35
+ if (real !== realRoot && !real.startsWith(realRoot + path.sep))
36
+ return undefined;
37
+ }
38
+ catch {
39
+ // missing files are fine here (a deleted file's diff); the caller checks existence
40
+ }
41
+ return abs;
42
+ }
43
+ export function list(scope, rel) {
44
+ const abs = inside(scope, rel);
45
+ if (abs === undefined)
46
+ return undefined;
47
+ let dirents;
48
+ try {
49
+ dirents = fs.readdirSync(abs, { withFileTypes: true });
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ return dirents
55
+ .filter((e) => {
56
+ if (isHidden(scope, e.name))
57
+ return false;
58
+ const dir = toRel(scope, abs);
59
+ return !scope.excluded(dir ? dir + '/' + e.name : e.name, e.isDirectory());
60
+ })
61
+ .flatMap((e) => {
62
+ try {
63
+ const st = fs.statSync(path.join(abs, e.name));
64
+ const entry = { name: e.name, type: st.isDirectory() ? 'folder' : 'file', size: st.size, mtime: st.mtimeMs };
65
+ if (e.isSymbolicLink())
66
+ entry.link = true;
67
+ return [entry];
68
+ }
69
+ catch {
70
+ return []; // a broken link, or removed while listing
71
+ }
72
+ });
73
+ }
74
+ export const RAW_TYPES = {
75
+ png: 'image/png',
76
+ jpg: 'image/jpeg',
77
+ jpeg: 'image/jpeg',
78
+ gif: 'image/gif',
79
+ webp: 'image/webp',
80
+ avif: 'image/avif',
81
+ svg: 'image/svg+xml',
82
+ ico: 'image/x-icon',
83
+ bmp: 'image/bmp',
84
+ mp3: 'audio/mpeg',
85
+ ogg: 'audio/ogg',
86
+ oga: 'audio/ogg',
87
+ wav: 'audio/wav',
88
+ flac: 'audio/flac',
89
+ m4a: 'audio/mp4',
90
+ aac: 'audio/aac',
91
+ opus: 'audio/ogg',
92
+ mp4: 'video/mp4',
93
+ m4v: 'video/mp4',
94
+ webm: 'video/webm',
95
+ ogv: 'video/ogg',
96
+ mov: 'video/quicktime',
97
+ pdf: 'application/pdf',
98
+ woff: 'font/woff',
99
+ woff2: 'font/woff2',
100
+ ttf: 'font/ttf',
101
+ otf: 'font/otf',
102
+ json: 'application/json; charset=utf-8',
103
+ wasm: 'application/wasm',
104
+ };
105
+ /** Any file the page shows: never run as a page on this origin (except a sandboxed HTML preview). */
106
+ const RAW_CSP = "default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; media-src 'self'; font-src 'self'";
107
+ /** An HTML preview: sandboxed (no scripts, its own origin), may load its own images and styles. */
108
+ const PREVIEW_CSP = "sandbox; default-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'none'";
109
+ export function serveRaw(scope, rel, req, res, asPage) {
110
+ const abs = inside(scope, rel);
111
+ let st;
112
+ try {
113
+ st = abs === undefined ? undefined : fs.statSync(abs);
114
+ }
115
+ catch {
116
+ st = undefined;
117
+ }
118
+ if (abs === undefined || st === undefined || !st.isFile()) {
119
+ res.writeHead(404, { 'content-type': 'text/plain' }).end('not found');
120
+ return;
121
+ }
122
+ const ext = path.extname(abs).slice(1).toLowerCase();
123
+ const type = asPage && /^html?$/.test(ext) ? 'text/html; charset=utf-8' : (RAW_TYPES[ext] ?? 'text/plain; charset=utf-8');
124
+ const headers = {
125
+ 'content-type': type,
126
+ 'cache-control': 'no-store',
127
+ 'accept-ranges': 'bytes',
128
+ 'x-content-type-options': 'nosniff',
129
+ 'content-security-policy': asPage ? PREVIEW_CSP : RAW_CSP,
130
+ };
131
+ const range = /^bytes=(\d*)-(\d*)$/.exec(String(req.headers.range ?? ''));
132
+ if (range && (range[1] || range[2])) {
133
+ let start = range[1] ? Number(range[1]) : Math.max(0, st.size - Number(range[2]));
134
+ let end = range[1] && range[2] ? Number(range[2]) : st.size - 1;
135
+ end = Math.min(end, st.size - 1);
136
+ if (start > end || start >= st.size) {
137
+ res.writeHead(416, { 'content-range': `bytes */${st.size}` }).end();
138
+ return;
139
+ }
140
+ start = Math.max(0, start);
141
+ res.writeHead(206, { ...headers, 'content-range': `bytes ${start}-${end}/${st.size}`, 'content-length': String(end - start + 1) });
142
+ if (req.method === 'HEAD')
143
+ return void res.end();
144
+ fs.createReadStream(abs, { start, end }).pipe(res);
145
+ return;
146
+ }
147
+ res.writeHead(200, { ...headers, 'content-length': String(st.size) });
148
+ if (req.method === 'HEAD')
149
+ return void res.end();
150
+ fs.createReadStream(abs).pipe(res);
151
+ }
152
+ /** Every file under the root (root-relative), skipping hidden names and the usual noise folders. */
153
+ export function walk(scope, limit = 200_000) {
154
+ const out = [];
155
+ const stack = [''];
156
+ while (stack.length && out.length < limit) {
157
+ const rel = stack.pop() ?? '';
158
+ let dirents;
159
+ try {
160
+ dirents = fs.readdirSync(path.join(scope.root, rel), { withFileTypes: true });
161
+ }
162
+ catch {
163
+ continue;
164
+ }
165
+ for (const d of dirents) {
166
+ if (isHidden(scope, d.name) || NOISE.has(d.name))
167
+ continue;
168
+ const p = rel ? rel + '/' + d.name : d.name;
169
+ if (scope.excluded(p, d.isDirectory()))
170
+ continue;
171
+ if (d.isDirectory())
172
+ stack.push(p);
173
+ else if (d.isFile())
174
+ out.push(p);
175
+ }
176
+ }
177
+ return out.sort();
178
+ }