@fnndsc/brasa 0.56.2 → 0.56.4

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 (333) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/berth/berth.d.ts +11 -0
  3. package/dist/builtins/berth/berth.js +53 -22
  4. package/dist/builtins/berth/berth.js.map +1 -1
  5. package/dist/builtins/berth/berthCube.d.ts +17 -2
  6. package/dist/builtins/berth/berthCube.js +22 -10
  7. package/dist/builtins/berth/berthCube.js.map +1 -1
  8. package/dist/builtins/debug.d.ts +24 -3
  9. package/dist/builtins/debug.js +66 -13
  10. package/dist/builtins/debug.js.map +1 -1
  11. package/dist/builtins/fs/acl.args.d.ts +5 -38
  12. package/dist/builtins/fs/acl.args.js +6 -72
  13. package/dist/builtins/fs/acl.args.js.map +1 -1
  14. package/dist/builtins/fs/acl.d.ts +100 -10
  15. package/dist/builtins/fs/acl.js +222 -68
  16. package/dist/builtins/fs/acl.js.map +1 -1
  17. package/dist/builtins/fs/cat.args.d.ts +14 -15
  18. package/dist/builtins/fs/cat.args.js +13 -40
  19. package/dist/builtins/fs/cat.args.js.map +1 -1
  20. package/dist/builtins/fs/cat.d.ts +40 -3
  21. package/dist/builtins/fs/cat.js +89 -10
  22. package/dist/builtins/fs/cat.js.map +1 -1
  23. package/dist/builtins/fs/cd.d.ts +24 -6
  24. package/dist/builtins/fs/cd.js +71 -18
  25. package/dist/builtins/fs/cd.js.map +1 -1
  26. package/dist/builtins/fs/configWrite.d.ts +24 -8
  27. package/dist/builtins/fs/configWrite.js +77 -36
  28. package/dist/builtins/fs/configWrite.js.map +1 -1
  29. package/dist/builtins/fs/cp.d.ts +39 -4
  30. package/dist/builtins/fs/cp.js +120 -55
  31. package/dist/builtins/fs/cp.js.map +1 -1
  32. package/dist/builtins/fs/download.d.ts +12 -1
  33. package/dist/builtins/fs/download.js +24 -4
  34. package/dist/builtins/fs/download.js.map +1 -1
  35. package/dist/builtins/fs/du.d.ts +59 -33
  36. package/dist/builtins/fs/du.js +111 -79
  37. package/dist/builtins/fs/du.js.map +1 -1
  38. package/dist/builtins/fs/edit.d.ts +19 -4
  39. package/dist/builtins/fs/edit.js +77 -16
  40. package/dist/builtins/fs/edit.js.map +1 -1
  41. package/dist/builtins/fs/find.d.ts +25 -0
  42. package/dist/builtins/fs/find.js +76 -5
  43. package/dist/builtins/fs/find.js.map +1 -1
  44. package/dist/builtins/fs/mkdir.d.ts +28 -18
  45. package/dist/builtins/fs/mkdir.js +95 -66
  46. package/dist/builtins/fs/mkdir.js.map +1 -1
  47. package/dist/builtins/fs/mv.d.ts +34 -4
  48. package/dist/builtins/fs/mv.js +129 -64
  49. package/dist/builtins/fs/mv.js.map +1 -1
  50. package/dist/builtins/fs/pull.args.d.ts +56 -17
  51. package/dist/builtins/fs/pull.args.js +16 -66
  52. package/dist/builtins/fs/pull.args.js.map +1 -1
  53. package/dist/builtins/fs/pull.d.ts +62 -0
  54. package/dist/builtins/fs/pull.js +86 -22
  55. package/dist/builtins/fs/pull.js.map +1 -1
  56. package/dist/builtins/fs/pwd.d.ts +19 -5
  57. package/dist/builtins/fs/pwd.js +62 -8
  58. package/dist/builtins/fs/pwd.js.map +1 -1
  59. package/dist/builtins/fs/rm.d.ts +58 -21
  60. package/dist/builtins/fs/rm.js +99 -82
  61. package/dist/builtins/fs/rm.js.map +1 -1
  62. package/dist/builtins/fs/rmdir.d.ts +29 -11
  63. package/dist/builtins/fs/rmdir.js +87 -36
  64. package/dist/builtins/fs/rmdir.js.map +1 -1
  65. package/dist/builtins/fs/touch.d.ts +44 -9
  66. package/dist/builtins/fs/touch.js +91 -27
  67. package/dist/builtins/fs/touch.js.map +1 -1
  68. package/dist/builtins/fs/transferJobs.d.ts +64 -0
  69. package/dist/builtins/fs/transferJobs.js +98 -0
  70. package/dist/builtins/fs/transferJobs.js.map +1 -0
  71. package/dist/builtins/fs/tree.d.ts +36 -9
  72. package/dist/builtins/fs/tree.js +126 -36
  73. package/dist/builtins/fs/tree.js.map +1 -1
  74. package/dist/builtins/fs/upload.d.ts +35 -3
  75. package/dist/builtins/fs/upload.js +99 -14
  76. package/dist/builtins/fs/upload.js.map +1 -1
  77. package/dist/builtins/fs/xattr.args.d.ts +12 -33
  78. package/dist/builtins/fs/xattr.args.js +17 -95
  79. package/dist/builtins/fs/xattr.args.js.map +1 -1
  80. package/dist/builtins/fs/xattr.d.ts +98 -8
  81. package/dist/builtins/fs/xattr.js +163 -24
  82. package/dist/builtins/fs/xattr.js.map +1 -1
  83. package/dist/builtins/games/bytes.d.ts +201 -5
  84. package/dist/builtins/games/bytes.js +255 -54
  85. package/dist/builtins/games/bytes.js.map +1 -1
  86. package/dist/builtins/games/chimes.d.ts +180 -3
  87. package/dist/builtins/games/chimes.js +203 -26
  88. package/dist/builtins/games/chimes.js.map +1 -1
  89. package/dist/builtins/games/chrislab.d.ts +101 -3
  90. package/dist/builtins/games/chrislab.js +117 -17
  91. package/dist/builtins/games/chrislab.js.map +1 -1
  92. package/dist/builtins/games/cowsay.d.ts +93 -2
  93. package/dist/builtins/games/cowsay.js +90 -31
  94. package/dist/builtins/games/cowsay.js.map +1 -1
  95. package/dist/builtins/games/figlet.d.ts +70 -2
  96. package/dist/builtins/games/figlet.js +83 -6
  97. package/dist/builtins/games/figlet.js.map +1 -1
  98. package/dist/builtins/games/lab.d.ts +104 -5
  99. package/dist/builtins/games/lab.js +144 -6
  100. package/dist/builtins/games/lab.js.map +1 -1
  101. package/dist/builtins/games/lolcat.d.ts +61 -1
  102. package/dist/builtins/games/lolcat.js +59 -24
  103. package/dist/builtins/games/lolcat.js.map +1 -1
  104. package/dist/builtins/games/morse.d.ts +36 -1
  105. package/dist/builtins/games/morse.js +50 -2
  106. package/dist/builtins/games/morse.js.map +1 -1
  107. package/dist/builtins/games/numbers.d.ts +241 -5
  108. package/dist/builtins/games/numbers.js +298 -23
  109. package/dist/builtins/games/numbers.js.map +1 -1
  110. package/dist/builtins/games/play.d.ts +96 -6
  111. package/dist/builtins/games/play.js +137 -6
  112. package/dist/builtins/games/play.js.map +1 -1
  113. package/dist/builtins/games/qr.d.ts +40 -1
  114. package/dist/builtins/games/qr.js +51 -2
  115. package/dist/builtins/games/qr.js.map +1 -1
  116. package/dist/builtins/games/show.d.ts +131 -6
  117. package/dist/builtins/games/show.js +208 -20
  118. package/dist/builtins/games/show.js.map +1 -1
  119. package/dist/builtins/games/sky.d.ts +178 -4
  120. package/dist/builtins/games/sky.js +228 -12
  121. package/dist/builtins/games/sky.js.map +1 -1
  122. package/dist/builtins/games/text.d.ts +258 -7
  123. package/dist/builtins/games/text.js +310 -29
  124. package/dist/builtins/games/text.js.map +1 -1
  125. package/dist/builtins/games/trek.d.ts +67 -3
  126. package/dist/builtins/games/trek.js +63 -10
  127. package/dist/builtins/games/trek.js.map +1 -1
  128. package/dist/builtins/games/wtf.d.ts +58 -1
  129. package/dist/builtins/games/wtf.js +67 -6
  130. package/dist/builtins/games/wtf.js.map +1 -1
  131. package/dist/builtins/help.d.ts +38 -2
  132. package/dist/builtins/help.js +76 -769
  133. package/dist/builtins/help.js.map +1 -1
  134. package/dist/builtins/helpSections.js +4 -1
  135. package/dist/builtins/helpSections.js.map +1 -1
  136. package/dist/builtins/net/connect.d.ts +36 -3
  137. package/dist/builtins/net/connect.js +84 -26
  138. package/dist/builtins/net/connect.js.map +1 -1
  139. package/dist/builtins/net/cubepath.d.ts +49 -5
  140. package/dist/builtins/net/cubepath.js +69 -27
  141. package/dist/builtins/net/cubepath.js.map +1 -1
  142. package/dist/builtins/net/logout.d.ts +13 -4
  143. package/dist/builtins/net/logout.js +49 -3
  144. package/dist/builtins/net/logout.js.map +1 -1
  145. package/dist/builtins/net/netstat.d.ts +29 -4
  146. package/dist/builtins/net/netstat.js +64 -23
  147. package/dist/builtins/net/netstat.js.map +1 -1
  148. package/dist/builtins/net/pacs.d.ts +169 -15
  149. package/dist/builtins/net/pacs.js +92 -33
  150. package/dist/builtins/net/pacs.js.map +1 -1
  151. package/dist/builtins/net/query.args.d.ts +95 -0
  152. package/dist/builtins/net/query.args.js +26 -0
  153. package/dist/builtins/net/query.args.js.map +1 -0
  154. package/dist/builtins/net/query.d.ts +98 -5
  155. package/dist/builtins/net/query.js +89 -83
  156. package/dist/builtins/net/query.js.map +1 -1
  157. package/dist/builtins/net/status.d.ts +5 -3
  158. package/dist/builtins/net/status.js +5 -12
  159. package/dist/builtins/net/status.js.map +1 -1
  160. package/dist/builtins/parametersofplugin.d.ts +82 -3
  161. package/dist/builtins/parametersofplugin.js +79 -23
  162. package/dist/builtins/parametersofplugin.js.map +1 -1
  163. package/dist/builtins/proc.d.ts +210 -3
  164. package/dist/builtins/proc.js +210 -119
  165. package/dist/builtins/proc.js.map +1 -1
  166. package/dist/builtins/res/compute.d.ts +67 -3
  167. package/dist/builtins/res/compute.js +121 -35
  168. package/dist/builtins/res/compute.js.map +1 -1
  169. package/dist/builtins/res/dicom.d.ts +52 -3
  170. package/dist/builtins/res/dicom.js +82 -34
  171. package/dist/builtins/res/dicom.js.map +1 -1
  172. package/dist/builtins/res/expect.d.ts +52 -3
  173. package/dist/builtins/res/expect.js +92 -29
  174. package/dist/builtins/res/expect.js.map +1 -1
  175. package/dist/builtins/res/feed.d.ts +475 -3
  176. package/dist/builtins/res/feed.js +253 -158
  177. package/dist/builtins/res/feed.js.map +1 -1
  178. package/dist/builtins/res/files.d.ts +517 -3
  179. package/dist/builtins/res/files.js +124 -44
  180. package/dist/builtins/res/files.js.map +1 -1
  181. package/dist/builtins/res/gather.d.ts +113 -3
  182. package/dist/builtins/res/gather.js +153 -44
  183. package/dist/builtins/res/gather.js.map +1 -1
  184. package/dist/builtins/res/gather.process.d.ts +27 -19
  185. package/dist/builtins/res/gather.process.js +29 -59
  186. package/dist/builtins/res/gather.process.js.map +1 -1
  187. package/dist/builtins/res/group.d.ts +284 -3
  188. package/dist/builtins/res/group.js +147 -76
  189. package/dist/builtins/res/group.js.map +1 -1
  190. package/dist/builtins/res/image.d.ts +30 -2
  191. package/dist/builtins/res/image.js +62 -10
  192. package/dist/builtins/res/image.js.map +1 -1
  193. package/dist/builtins/res/play.d.ts +71 -9
  194. package/dist/builtins/res/play.js +124 -82
  195. package/dist/builtins/res/play.js.map +1 -1
  196. package/dist/builtins/res/plugininstance.d.ts +307 -2
  197. package/dist/builtins/res/plugininstance.js +122 -50
  198. package/dist/builtins/res/plugininstance.js.map +1 -1
  199. package/dist/builtins/res/pluginmeta.d.ts +244 -2
  200. package/dist/builtins/res/pluginmeta.js +98 -40
  201. package/dist/builtins/res/pluginmeta.js.map +1 -1
  202. package/dist/builtins/res/record.d.ts +37 -3
  203. package/dist/builtins/res/record.js +127 -57
  204. package/dist/builtins/res/record.js.map +1 -1
  205. package/dist/builtins/res/resourceList.d.ts +136 -0
  206. package/dist/builtins/res/resourceList.js +51 -0
  207. package/dist/builtins/res/resourceList.js.map +1 -0
  208. package/dist/builtins/res/tag.d.ts +244 -3
  209. package/dist/builtins/res/tag.js +97 -41
  210. package/dist/builtins/res/tag.js.map +1 -1
  211. package/dist/builtins/res/user.d.ts +122 -3
  212. package/dist/builtins/res/user.js +83 -21
  213. package/dist/builtins/res/user.js.map +1 -1
  214. package/dist/builtins/res/workflow.d.ts +244 -2
  215. package/dist/builtins/res/workflow.js +97 -40
  216. package/dist/builtins/res/workflow.js.map +1 -1
  217. package/dist/builtins/store.d.ts +85 -3
  218. package/dist/builtins/store.js +135 -68
  219. package/dist/builtins/store.js.map +1 -1
  220. package/dist/builtins/sys/apropos.d.ts +80 -5
  221. package/dist/builtins/sys/apropos.js +121 -15
  222. package/dist/builtins/sys/apropos.js.map +1 -1
  223. package/dist/builtins/sys/cal.d.ts +44 -5
  224. package/dist/builtins/sys/cal.js +57 -10
  225. package/dist/builtins/sys/cal.js.map +1 -1
  226. package/dist/builtins/sys/command.d.ts +20 -0
  227. package/dist/builtins/sys/command.js +31 -0
  228. package/dist/builtins/sys/command.js.map +1 -1
  229. package/dist/builtins/sys/context.d.ts +13 -3
  230. package/dist/builtins/sys/context.js +51 -4
  231. package/dist/builtins/sys/context.js.map +1 -1
  232. package/dist/builtins/sys/date.d.ts +56 -5
  233. package/dist/builtins/sys/date.js +63 -9
  234. package/dist/builtins/sys/date.js.map +1 -1
  235. package/dist/builtins/sys/echo.d.ts +63 -2
  236. package/dist/builtins/sys/echo.js +87 -8
  237. package/dist/builtins/sys/echo.js.map +1 -1
  238. package/dist/builtins/sys/fortune.d.ts +27 -2
  239. package/dist/builtins/sys/fortune.js +44 -2
  240. package/dist/builtins/sys/fortune.js.map +1 -1
  241. package/dist/builtins/sys/grep.d.ts +245 -11
  242. package/dist/builtins/sys/grep.js +418 -131
  243. package/dist/builtins/sys/grep.js.map +1 -1
  244. package/dist/builtins/sys/joblets.d.ts +66 -7
  245. package/dist/builtins/sys/joblets.js +101 -14
  246. package/dist/builtins/sys/joblets.js.map +1 -1
  247. package/dist/builtins/sys/motd.d.ts +37 -3
  248. package/dist/builtins/sys/motd.js +49 -8
  249. package/dist/builtins/sys/motd.js.map +1 -1
  250. package/dist/builtins/sys/notes.d.ts +75 -3
  251. package/dist/builtins/sys/notes.js +90 -29
  252. package/dist/builtins/sys/notes.js.map +1 -1
  253. package/dist/builtins/sys/physicalmode.d.ts +24 -3
  254. package/dist/builtins/sys/physicalmode.js +68 -14
  255. package/dist/builtins/sys/physicalmode.js.map +1 -1
  256. package/dist/builtins/sys/tasks.d.ts +74 -5
  257. package/dist/builtins/sys/tasks.js +102 -14
  258. package/dist/builtins/sys/tasks.js.map +1 -1
  259. package/dist/builtins/sys/textFilters.d.ts +673 -41
  260. package/dist/builtins/sys/textFilters.js +718 -263
  261. package/dist/builtins/sys/textFilters.js.map +1 -1
  262. package/dist/builtins/sys/timing.d.ts +24 -3
  263. package/dist/builtins/sys/timing.js +67 -14
  264. package/dist/builtins/sys/timing.js.map +1 -1
  265. package/dist/builtins/sys/variables.d.ts +70 -4
  266. package/dist/builtins/sys/variables.js +103 -31
  267. package/dist/builtins/sys/variables.js.map +1 -1
  268. package/dist/builtins/sys/version.d.ts +27 -2
  269. package/dist/builtins/sys/version.js +48 -3
  270. package/dist/builtins/sys/version.js.map +1 -1
  271. package/dist/builtins/sys/weather.d.ts +92 -15
  272. package/dist/builtins/sys/weather.js +71 -45
  273. package/dist/builtins/sys/weather.js.map +1 -1
  274. package/dist/builtins/sys/whoami.d.ts +38 -18
  275. package/dist/builtins/sys/whoami.js +112 -8
  276. package/dist/builtins/sys/whoami.js.map +1 -1
  277. package/dist/builtins/utils.d.ts +0 -37
  278. package/dist/builtins/utils.js +0 -86
  279. package/dist/builtins/utils.js.map +1 -1
  280. package/dist/chris/chrisCommands.js +58 -152
  281. package/dist/chris/chrisCommands.js.map +1 -1
  282. package/dist/chris/commandFallback.d.ts +12 -0
  283. package/dist/chris/commandFallback.js +47 -0
  284. package/dist/chris/commandFallback.js.map +1 -1
  285. package/dist/chris/filesystem.js +7 -5
  286. package/dist/chris/filesystem.js.map +1 -1
  287. package/dist/chris/help.js +0 -1018
  288. package/dist/chris/help.js.map +1 -1
  289. package/dist/chris/kinds.d.ts +21 -0
  290. package/dist/chris/kinds.js +114 -2
  291. package/dist/chris/kinds.js.map +1 -1
  292. package/dist/chris/mounts.d.ts +4 -4
  293. package/dist/chris/mounts.js +9 -16
  294. package/dist/chris/mounts.js.map +1 -1
  295. package/dist/chris/navigation.d.ts +2 -3
  296. package/dist/chris/navigation.js +6 -20
  297. package/dist/chris/navigation.js.map +1 -1
  298. package/dist/chris/pacsResources.d.ts +259 -0
  299. package/dist/chris/pacsResources.js +168 -0
  300. package/dist/chris/pacsResources.js.map +1 -0
  301. package/dist/core/commandDeclaration.d.ts +97 -7
  302. package/dist/core/commandDeclaration.js +21 -0
  303. package/dist/core/commandDeclaration.js.map +1 -1
  304. package/dist/core/commandParse.js +65 -17
  305. package/dist/core/commandParse.js.map +1 -1
  306. package/dist/core/commandRegistry.d.ts +4 -3
  307. package/dist/core/commandRegistry.js +36 -8
  308. package/dist/core/commandRegistry.js.map +1 -1
  309. package/dist/core/commandSchema.js +5 -2
  310. package/dist/core/commandSchema.js.map +1 -1
  311. package/dist/core/commandUsage.d.ts +15 -0
  312. package/dist/core/commandUsage.js +59 -7
  313. package/dist/core/commandUsage.js.map +1 -1
  314. package/dist/core/coreCommands.js +63 -212
  315. package/dist/core/coreCommands.js.map +1 -1
  316. package/dist/core/paths.d.ts +29 -1
  317. package/dist/core/paths.js +15 -2
  318. package/dist/core/paths.js.map +1 -1
  319. package/dist/core/preprocess.d.ts +3 -4
  320. package/dist/core/preprocess.js +4 -5
  321. package/dist/core/preprocess.js.map +1 -1
  322. package/dist/lib/completer/declared.js +7 -4
  323. package/dist/lib/completer/declared.js.map +1 -1
  324. package/dist/lib/completer/index.js +2 -7
  325. package/dist/lib/completer/index.js.map +1 -1
  326. package/dist/lib/parser.d.ts +0 -8
  327. package/dist/lib/parser.js +0 -11
  328. package/dist/lib/parser.js.map +1 -1
  329. package/dist/lib/vfs/vfs.d.ts +2 -1
  330. package/dist/lib/vfs/vfs.js +5 -4
  331. package/dist/lib/vfs/vfs.js.map +1 -1
  332. package/dist/notes.json +1 -1
  333. package/package.json +5 -5
@@ -1,15 +1,37 @@
1
1
  /**
2
- * @file Builtin touch command.
3
- * Creates files, reported as a command envelope.
2
+ * @file `touch`: makes files in ChRIS's filesystem (CFS), empty or with text.
3
+ *
4
+ * Declared in one record (`touchCommand`): files, which glob, and the text
5
+ * to write, given inline (`--withContents`) or from a file on this machine
6
+ * (`--withContentsFromFile`). A path through a link is written where the
7
+ * link points.
8
+ *
9
+ * Key components:
10
+ * - touchCommand: the declaration.
11
+ * - builtin_touch: the declaration run over words already split.
12
+ * - touch_run: the typed core behind both, and the typed API.
13
+ *
14
+ * Typical usage:
15
+ * ```ts
16
+ * await builtin_touch(['--withContents', 'Hello!', 'greeting.txt']);
17
+ * await touch_run({ paths: ['greeting.txt'], contents: 'Hello!' });
18
+ * ```
19
+ *
20
+ * Dependencies: the session's filesystem and listing cache, the store-path
21
+ * resolver, and this machine's disk (for `--withContentsFromFile`).
22
+ *
23
+ * @module
4
24
  */
5
25
  import chalk from 'chalk';
6
26
  import fs from 'fs';
7
27
  import path from 'path';
8
- import { commandArgs_process, optionsUnknown_refusal, path_resolve } from '../utils.js';
28
+ import { path_resolve, storePath_resolve } from '../utils.js';
9
29
  import { listingCache_get, vfsDispatcher_get } from '../../core/filesystem.js';
10
30
  import { pathEntry_find, entry_isFolder } from './entries.js';
11
31
  import { errno_words, touch_render, vfs_fail } from '@fnndsc/fond';
12
32
  import { envelope_ok, envelope_error } from '@fnndsc/menu';
33
+ import { command_declare } from '../../core/commandDeclaration.js';
34
+ import { declaredCommand_run } from '../../core/commandParse.js';
13
35
  /**
14
36
  * Reads the local file whose text a touch writes.
15
37
  *
@@ -53,6 +75,64 @@ async function file_touch(dispatcher, targetPath, content) {
53
75
  const written = await dispatcher.write(targetPath, content ?? '');
54
76
  return written.ok || written.errno !== 'EISDIR' ? written : vfs_fail('EISDIR', `Is a directory: a folder already holds ${targetPath}`);
55
77
  }
78
+ /**
79
+ * Forgets the listing of the folder that holds a touched file, by the
80
+ * session's path and by the store's.
81
+ *
82
+ * @param shown - The file as the session names it.
83
+ * @param targetPath - The file in the store.
84
+ */
85
+ function parentListings_forget(shown, targetPath) {
86
+ for (const at of new Set([shown, targetPath]))
87
+ listingCache_get().cache_invalidate?.(path.posix.dirname(at));
88
+ }
89
+ /** What a `touch` line may hold. */
90
+ const TOUCH_GRAMMAR = {
91
+ operands: [
92
+ { name: 'paths', kind: 'cfsPath', repeat: true, glob: true, summary: 'The files to make; with text, only the first takes it' },
93
+ ],
94
+ options: {
95
+ withContents: { long: 'withContents', summary: 'Create the file with this text inline', value: { name: 'string', kind: 'word' } },
96
+ withContentsFromFile: { long: 'withContentsFromFile', summary: 'Create the file with the text of a file on this machine', value: { name: 'file', kind: 'hostPath' } },
97
+ },
98
+ };
99
+ /**
100
+ * `touch [--withContents <string>] [--withContentsFromFile <file>] <file…>`: the declaration.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * commands_register({ declarations: [touchCommand] });
105
+ * ```
106
+ */
107
+ export const touchCommand = command_declare({
108
+ name: 'touch',
109
+ grammar: TOUCH_GRAMMAR,
110
+ help: {
111
+ summary: 'Create empty files or files with content',
112
+ description: "Makes each file in ChRIS's filesystem: a file already there is left as it is, a missing one is made empty. With --withContents or --withContentsFromFile the first file is written whole with that text. A path through a link is written where the link points. touch makes no folders (mkdir -p does).",
113
+ category: 'Files',
114
+ posix: { group: 'Files', differs: 'makes a CFS file; --withContents writes text into it' },
115
+ examples: [
116
+ 'touch file.txt # Create empty file',
117
+ 'touch --withContents "Hello!" greeting.txt # Create file with string',
118
+ 'touch --withContentsFromFile template.json config.json # Create from local file',
119
+ ],
120
+ },
121
+ handler: async (args) => touch_run({
122
+ paths: args.operands.paths,
123
+ contents: args.options.withContents,
124
+ contentsFromFile: args.options.withContentsFromFile,
125
+ }),
126
+ });
127
+ /**
128
+ * `touch` over words already split: the declaration's parse and handler.
129
+ *
130
+ * @param args - The words after `touch`.
131
+ * @returns The envelope from {@link touch_run}, or the refusal of a bad line.
132
+ */
133
+ export async function builtin_touch(args) {
134
+ return declaredCommand_run(touchCommand, args);
135
+ }
56
136
  /**
57
137
  * Creates empty files or updates timestamps: the shared typed core behind
58
138
  * the parsed builtin and the typed API.
@@ -77,24 +157,25 @@ export async function touch_run(runOptions) {
77
157
  }
78
158
  const wrote = content !== undefined;
79
159
  // Only the first path takes content.
80
- const filesToTouch = wrote ? [pathArgs[0]] : pathArgs;
160
+ const filesToTouch = wrote ? pathArgs.slice(0, 1) : pathArgs;
81
161
  let rendered = '';
82
162
  let renderedErr = '';
83
163
  const outcomes = [];
84
164
  const dispatcher = vfsDispatcher_get();
85
165
  for (const pathArg of filesToTouch) {
86
166
  try {
87
- const targetPath = await path_resolve(pathArg);
167
+ const shown = await path_resolve(pathArg);
168
+ const targetPath = await storePath_resolve(pathArg);
88
169
  const done = await file_touch(dispatcher, targetPath, content);
89
170
  if (done.ok) {
90
- rendered += `${touch_render(targetPath, true, wrote)}\n`;
91
- outcomes.push({ path: targetPath, created: true });
92
- listingCache_get().cache_invalidate?.(path.posix.dirname(targetPath));
171
+ rendered += `${touch_render(shown, true, wrote)}\n`;
172
+ outcomes.push({ path: shown, created: true });
173
+ parentListings_forget(shown, targetPath);
93
174
  }
94
175
  else {
95
- renderedErr += `${chalk.red(`Failed to create file: ${targetPath}`)}\n`;
176
+ renderedErr += `${chalk.red(`Failed to create file: ${shown}`)}\n`;
96
177
  renderedErr += `${chalk.gray(` ${done.reason ?? errno_words(done.errno)}`)}\n`;
97
- outcomes.push({ path: targetPath, created: false });
178
+ outcomes.push({ path: shown, created: false });
98
179
  }
99
180
  }
100
181
  catch (e) {
@@ -112,21 +193,4 @@ export async function touch_run(runOptions) {
112
193
  }
113
194
  return envelope_ok(rendered, model);
114
195
  }
115
- /**
116
- * Creates files from parsed command-line arguments.
117
- *
118
- * @param args - Command line arguments (paths and --withContents flags).
119
- * @returns The envelope from {@link touch_run}.
120
- */
121
- export async function builtin_touch(args) {
122
- const parsed = commandArgs_process(args);
123
- const refusal = optionsUnknown_refusal('touch', parsed, ['withContents', 'withContentsFromFile']);
124
- if (refusal !== null)
125
- return envelope_error('', undefined, `${chalk.red(refusal)}\n`);
126
- return touch_run({
127
- paths: parsed._,
128
- contents: parsed['withContents'] !== undefined ? String(parsed['withContents']) : undefined,
129
- contentsFromFile: parsed['withContentsFromFile'] !== undefined ? String(parsed['withContentsFromFile']) : undefined,
130
- });
131
- }
132
196
  //# sourceMappingURL=touch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","sourceRoot":"","sources":["../../../src/builtins/fs/touch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"touch.js","sourceRoot":"","sources":["../../../src/builtins/fs/touch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /** The session variable that says how many files move at once when a line does not. */
2
+ export declare const TRANSFER_JOBS_VARIABLE: string;
3
+ /**
4
+ * `-j N` / `--jobs N`: how many files move at once.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const GRAMMAR = { options: { jobs: TRANSFER_JOBS_OPTION } } as const satisfies CommandGrammar;
9
+ * ```
10
+ */
11
+ export declare const TRANSFER_JOBS_OPTION: {
12
+ readonly short: "j";
13
+ readonly long: "jobs";
14
+ readonly summary: `Move N files at once, 1 to ${number} (1 is one at a time); without it $TRANSFER_JOBS, else ${number}`;
15
+ readonly value: {
16
+ readonly name: "N";
17
+ readonly kind: "int";
18
+ readonly min: 1;
19
+ readonly max: number;
20
+ };
21
+ };
22
+ /**
23
+ * How many files a transfer moves at once, or why the session's variable
24
+ * cannot say.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const jobs: TransferJobs = { jobs: 8 };
29
+ * ```
30
+ */
31
+ export type TransferJobs = {
32
+ readonly jobs: number;
33
+ } | {
34
+ readonly refused: string;
35
+ };
36
+ /**
37
+ * The number of files a transfer moves at once: the line's `-j`, else the
38
+ * session's `TRANSFER_JOBS`, else the pool's default.
39
+ *
40
+ * @param given - The line's `-j`, already checked by the parser; undefined when the line gives none.
41
+ * @returns The number, or a plain line refusing the variable's value.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * transferJobs_resolve(4); // { jobs: 4 }
46
+ * transferJobs_resolve(undefined); // { jobs: 8 }, or $TRANSFER_JOBS
47
+ * ```
48
+ */
49
+ export declare function transferJobs_resolve(given: number | undefined): TransferJobs;
50
+ /**
51
+ * The lines under a transfer's summary that name each file that failed
52
+ * after its retry, and say how many a cancel left.
53
+ *
54
+ * @param failedPaths - The files that failed, as the transfer names them.
55
+ * @param cancelledCount - How many files a cancel left unmoved.
56
+ * @param verb - What the transfer does to a file (`downloaded`, `uploaded`).
57
+ * @returns The lines, each ending in a newline; empty when nothing failed or was left.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * transferLeftovers_render(['/home/me/uploads/a.dcm'], 0, 'downloaded'); // ' failed: /home/me/uploads/a.dcm\n'
62
+ * ```
63
+ */
64
+ export declare function transferLeftovers_render(failedPaths: readonly string[], cancelledCount: number, verb: string): string;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @file How many files a transfer moves at once: the `-j N` / `--jobs N`
3
+ * option `download`, `upload` and `berth anchor` share, and the session
4
+ * variable `TRANSFER_JOBS` that stands in when a line gives none.
5
+ *
6
+ * The option's bounds are the transfer pool's (cumin's
7
+ * `TRANSFER_JOBS_MAX`), so the parser refuses `-j 40` before anything moves,
8
+ * and the variable is checked by the same `int` kind, so the two refuse in
9
+ * the same words.
10
+ *
11
+ * Key components:
12
+ * - TRANSFER_JOBS_OPTION: the option, for a command's grammar.
13
+ * - TRANSFER_JOBS_VARIABLE: the session variable's name.
14
+ * - transferJobs_resolve: the line's number, else the variable's, else the default.
15
+ * - transferLeftovers_render: the lines naming what failed and what a cancel left.
16
+ *
17
+ * Typical usage:
18
+ * ```ts
19
+ * const jobs: TransferJobs = transferJobs_resolve(args.options.jobs);
20
+ * if ('refused' in jobs) return refusal(jobs.refused);
21
+ * ```
22
+ *
23
+ * Dependencies: cumin's transfer pool for the bounds; the session's variables.
24
+ *
25
+ * @module
26
+ */
27
+ import chalk from 'chalk';
28
+ import { TRANSFER_JOBS_DEFAULT, TRANSFER_JOBS_MAX } from '@fnndsc/cumin/transfer-pool';
29
+ import { argumentWord_check } from '../../core/argumentKinds.js';
30
+ import { TEXT_KIND, variable_get } from '../../core/variables.js';
31
+ /** The session variable that says how many files move at once when a line does not. */
32
+ export const TRANSFER_JOBS_VARIABLE = 'TRANSFER_JOBS';
33
+ /**
34
+ * `-j N` / `--jobs N`: how many files move at once.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const GRAMMAR = { options: { jobs: TRANSFER_JOBS_OPTION } } as const satisfies CommandGrammar;
39
+ * ```
40
+ */
41
+ export const TRANSFER_JOBS_OPTION = {
42
+ short: 'j',
43
+ long: 'jobs',
44
+ summary: `Move N files at once, 1 to ${TRANSFER_JOBS_MAX} (1 is one at a time); without it $TRANSFER_JOBS, else ${TRANSFER_JOBS_DEFAULT}`,
45
+ value: { name: 'N', kind: 'int', min: 1, max: TRANSFER_JOBS_MAX },
46
+ };
47
+ /**
48
+ * The number of files a transfer moves at once: the line's `-j`, else the
49
+ * session's `TRANSFER_JOBS`, else the pool's default.
50
+ *
51
+ * @param given - The line's `-j`, already checked by the parser; undefined when the line gives none.
52
+ * @returns The number, or a plain line refusing the variable's value.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * transferJobs_resolve(4); // { jobs: 4 }
57
+ * transferJobs_resolve(undefined); // { jobs: 8 }, or $TRANSFER_JOBS
58
+ * ```
59
+ */
60
+ export function transferJobs_resolve(given) {
61
+ if (given !== undefined)
62
+ return { jobs: given };
63
+ const variable = variable_get(TRANSFER_JOBS_VARIABLE);
64
+ if (variable === undefined)
65
+ return { jobs: TRANSFER_JOBS_DEFAULT };
66
+ const range = `it says how many files move at once, a whole number from 1 to ${TRANSFER_JOBS_MAX}`;
67
+ if (variable.answer.kind !== TEXT_KIND || typeof variable.answer.data !== 'string') {
68
+ return { refused: `${TRANSFER_JOBS_VARIABLE} holds a ${variable.answer.kind}; ${range}` };
69
+ }
70
+ const text = variable.answer.data.trim();
71
+ const checked = argumentWord_check(TRANSFER_JOBS_OPTION.value, text);
72
+ if (!checked.ok)
73
+ return { refused: `${TRANSFER_JOBS_VARIABLE} is ${text === '' ? "''" : text}; ${range}` };
74
+ return { jobs: checked.value };
75
+ }
76
+ /**
77
+ * The lines under a transfer's summary that name each file that failed
78
+ * after its retry, and say how many a cancel left.
79
+ *
80
+ * @param failedPaths - The files that failed, as the transfer names them.
81
+ * @param cancelledCount - How many files a cancel left unmoved.
82
+ * @param verb - What the transfer does to a file (`downloaded`, `uploaded`).
83
+ * @returns The lines, each ending in a newline; empty when nothing failed or was left.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * transferLeftovers_render(['/home/me/uploads/a.dcm'], 0, 'downloaded'); // ' failed: /home/me/uploads/a.dcm\n'
88
+ * ```
89
+ */
90
+ export function transferLeftovers_render(failedPaths, cancelledCount, verb) {
91
+ let rendered = '';
92
+ for (const failed of failedPaths)
93
+ rendered += `${chalk.red(` failed: ${failed}`)}\n`;
94
+ if (cancelledCount > 0)
95
+ rendered += `${chalk.yellow(` cancelled: ${cancelledCount} file(s) not ${verb}`)}\n`;
96
+ return rendered;
97
+ }
98
+ //# sourceMappingURL=transferJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferJobs.js","sourceRoot":"","sources":["../../../src/builtins/fs/transferJobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEvF,OAAO,EAAE,kBAAkB,EAAsB,MAAM,6BAA6B,CAAC;AAErF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAiB,MAAM,yBAAyB,CAAC;AAEjF,uFAAuF;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAW,eAAe,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,8BAA8B,iBAAiB,0DAA0D,qBAAqB,EAAE;IACzI,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE;CACjC,CAAC;AAanC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAyB,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAC5E,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IACnE,MAAM,KAAK,GAAW,iEAAiE,iBAAiB,EAAE,CAAC;IAC3G,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,GAAG,sBAAsB,YAAY,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;IAC5F,CAAC;IACD,MAAM,IAAI,GAAW,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,OAAO,GAAkB,kBAAkB,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,sBAAsB,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;IAC3G,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAe,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAA8B,EAAE,cAAsB,EAAE,IAAY;IAC3G,IAAI,QAAQ,GAAW,EAAE,CAAC;IAC1B,KAAK,MAAM,MAAM,IAAI,WAAW;QAAE,QAAQ,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,IAAI,CAAC;IACtF,IAAI,cAAc,GAAG,CAAC;QAAE,QAAQ,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,cAAc,gBAAgB,IAAI,EAAE,CAAC,IAAI,CAAC;IAC9G,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,16 +1,43 @@
1
1
  import { CommandEnvelope } from '@fnndsc/menu';
2
2
  /**
3
- * Displays a directory tree of the ChRIS filesystem.
4
- * Uses chili's scan_do machinery for recursive filesystem traversal.
5
- *
6
- * @param args - Command line arguments (optional path and flags).
7
- * @returns A Promise that resolves when the tree is displayed.
3
+ * `tree [--follow] [--path] [--dirs] [--dirpath] [path]`: the declaration.
8
4
  *
9
5
  * @example
6
+ * ```ts
7
+ * commands_register({ declarations: [treeCommand] }, 'backend');
10
8
  * ```
11
- * tree # Tree of current directory
12
- * tree /home/user/data # Tree of specific path
13
- * tree --follow # Follow symbolic links
14
- * ```
9
+ */
10
+ export declare const treeCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
11
+ readonly operands: readonly [{
12
+ readonly name: "path";
13
+ readonly kind: "cfsPath";
14
+ readonly optional: true;
15
+ readonly glob: true;
16
+ readonly summary: "The folder to draw; the working directory when none is given";
17
+ }];
18
+ readonly options: {
19
+ readonly follow: {
20
+ readonly long: "follow";
21
+ readonly summary: "Follow symbolic links when traversing";
22
+ };
23
+ readonly listPaths: {
24
+ readonly long: "path";
25
+ readonly summary: "Emit one full path per entry (grep-friendly, no tree art)";
26
+ };
27
+ readonly dirs: {
28
+ readonly long: "dirs";
29
+ readonly summary: "Show directories only";
30
+ };
31
+ readonly dirpath: {
32
+ readonly long: "dirpath";
33
+ readonly summary: "Emit one full directory path per line";
34
+ };
35
+ };
36
+ }>;
37
+ /**
38
+ * `tree` over words already split: the declaration's parse and handler.
39
+ *
40
+ * @param args - The words after `tree`.
41
+ * @returns The tree, or the refusal of a bad line.
15
42
  */
16
43
  export declare function builtin_tree(args: string[]): Promise<CommandEnvelope>;
@@ -1,9 +1,27 @@
1
1
  /**
2
- * @file Builtin tree command.
3
- * Displays directory structure.
2
+ * @file `tree`: a folder of ChRIS's filesystem (CFS) drawn as a tree, or
3
+ * listed one path per line.
4
+ *
5
+ * Declared in one record (`treeCommand`): one path, and its switches.
6
+ *
7
+ * Key components:
8
+ * - treeCommand: the declaration.
9
+ * - builtin_tree: the declaration run over words already split.
10
+ *
11
+ * Typical usage:
12
+ * ```ts
13
+ * await builtin_tree(['--dirs', '~/feeds']);
14
+ * ```
15
+ *
16
+ * Dependencies: chili's scan for the walk; the listing for whether a path
17
+ * is there.
18
+ *
19
+ * @module
4
20
  */
5
21
  import chalk from 'chalk';
6
- import { commandArgs_process, optionsUnknown_refusal, path_resolve, error_stripDebugPrefix } from '../utils.js';
22
+ import { path_resolve, storePath_resolve, error_stripDebugPrefix } from '../utils.js';
23
+ import { command_declare } from '../../core/commandDeclaration.js';
24
+ import { declaredCommand_run } from '../../core/commandParse.js';
7
25
  import { vfs } from '../../lib/vfs/vfs.js';
8
26
  import { session } from '../../session/index.js';
9
27
  import { spinner } from '../../lib/spinner.js';
@@ -12,55 +30,92 @@ import { bytes_format } from '@fnndsc/chili/commands/fs/upload.js';
12
30
  import { errorStack } from '@fnndsc/fond';
13
31
  import { envelope_ok, envelope_error } from '@fnndsc/menu';
14
32
  import { exitCode_set } from '../../core/handlerRun.js';
15
- /** The options tree reads; any other is refused by name. */
16
- const TREE_OPTIONS = ['follow', 'path', 'dirs', 'dirpath'];
17
33
  /**
18
- * Displays a directory tree of the ChRIS filesystem.
19
- * Uses chili's scan_do machinery for recursive filesystem traversal.
20
- *
21
- * @param args - Command line arguments (optional path and flags).
22
- * @returns A Promise that resolves when the tree is displayed.
34
+ * What a `tree` line may hold. An option it does not have is refused, not
35
+ * skipped: `tree -L 1 x` once scanned a folder named `1`, and
36
+ * `tree --bogus x` the whole home.
37
+ */
38
+ const TREE_GRAMMAR = {
39
+ operands: [
40
+ { name: 'path', kind: 'cfsPath', optional: true, glob: true, summary: 'The folder to draw; the working directory when none is given' },
41
+ ],
42
+ options: {
43
+ follow: { long: 'follow', summary: 'Follow symbolic links when traversing' },
44
+ listPaths: { long: 'path', summary: 'Emit one full path per entry (grep-friendly, no tree art)' },
45
+ dirs: { long: 'dirs', summary: 'Show directories only' },
46
+ dirpath: { long: 'dirpath', summary: 'Emit one full directory path per line' },
47
+ },
48
+ };
49
+ /**
50
+ * `tree [--follow] [--path] [--dirs] [--dirpath] [path]`: the declaration.
23
51
  *
24
52
  * @example
25
- * ```
26
- * tree # Tree of current directory
27
- * tree /home/user/data # Tree of specific path
28
- * tree --follow # Follow symbolic links
53
+ * ```ts
54
+ * commands_register({ declarations: [treeCommand] }, 'backend');
29
55
  * ```
30
56
  */
57
+ export const treeCommand = command_declare({
58
+ name: 'tree',
59
+ grammar: TREE_GRAMMAR,
60
+ help: {
61
+ summary: 'Display directory tree structure',
62
+ description: "Draws a folder of ChRIS's filesystem and everything under it as a tree, with the total size and the number of items; or, with --path or --dirpath, lists one full path per line. The working directory when no path is given.",
63
+ category: 'Navigation',
64
+ posix: { group: 'Files', differs: 'a CFS tree' },
65
+ examples: [
66
+ 'tree # Tree of current directory',
67
+ 'tree /home/user/data # Tree of specific path',
68
+ 'tree --follow # Follow symbolic links',
69
+ 'tree --path # One path per line, no decoration',
70
+ 'tree --dirs # Directory hierarchy only',
71
+ 'tree --dirpath # One directory path per line',
72
+ ],
73
+ },
74
+ holds: [],
75
+ handler: tree_run,
76
+ });
77
+ /**
78
+ * `tree` over words already split: the declaration's parse and handler.
79
+ *
80
+ * @param args - The words after `tree`.
81
+ * @returns The tree, or the refusal of a bad line.
82
+ */
31
83
  export async function builtin_tree(args) {
32
- const parsed = commandArgs_process(args, {
33
- booleanLongOptions: TREE_OPTIONS,
34
- });
35
- // An option tree does not have is refused, not skipped: `tree -L 1 x`
36
- // once scanned a folder named `1`, and `tree --bogus x` the whole home.
37
- const unknown = optionsUnknown_refusal('tree', parsed, TREE_OPTIONS);
38
- if (unknown !== null) {
39
- exitCode_set(1);
40
- return envelope_error('', undefined, `${chalk.red(unknown)}\n`);
41
- }
42
- const pathArgs = parsed._;
43
- const dirpathMode = !!parsed['dirpath'];
44
- const pathMode = !!parsed['path'] || dirpathMode;
45
- const dirsOnly = !!parsed['dirs'] || dirpathMode;
46
- // Determine target path
84
+ return declaredCommand_run(treeCommand, args);
85
+ }
86
+ /**
87
+ * Displays a directory tree of the ChRIS filesystem.
88
+ * Uses chili's scan_do machinery for recursive filesystem traversal.
89
+ *
90
+ * @param args - The line, parsed.
91
+ * @returns The tree and its summary, or why it could not be drawn.
92
+ */
93
+ async function tree_run(args) {
94
+ const pathArg = args.operands.path;
95
+ const dirpathMode = args.options.dirpath;
96
+ const pathMode = args.options.listPaths || dirpathMode;
97
+ const dirsOnly = args.options.dirs || dirpathMode;
98
+ // Read where the store keeps it (a run's data path, a link on the line),
99
+ // and shown as it was asked: the tree's root is the path as typed.
47
100
  let targetPath;
48
- if (pathArgs.length > 0) {
49
- targetPath = await path_resolve(pathArgs[0]);
101
+ let logicalRoot;
102
+ if (pathArg !== undefined) {
103
+ logicalRoot = await path_resolve(pathArg);
104
+ targetPath = await storePath_resolve(pathArg);
50
105
  // A path that is not there is said to be not there, as tree says it,
51
106
  // rather than scanned into an empty tree.
52
107
  const entry = await vfs.data_get(targetPath, { directory: true });
53
108
  if (!entry.ok) {
54
109
  errorStack.stack_pop();
55
110
  exitCode_set(1);
56
- return envelope_error('', undefined, `${chalk.red(`tree: ${pathArgs[0]}: No such file or directory`)}\n`);
111
+ return envelope_error('', undefined, `${chalk.red(`tree: ${pathArg}: No such file or directory`)}\n`);
57
112
  }
58
113
  }
59
114
  // Build scan options
60
115
  const scanOptions = {
61
116
  silent: true,
62
117
  tree: false, // We'll format it ourselves
63
- follow: !!parsed['follow'],
118
+ follow: args.options.follow,
64
119
  dirsOnly,
65
120
  // A named folder is scanned where it stands: the shared directory stays put.
66
121
  ...(targetPath ? { folder: targetPath } : {}),
@@ -78,14 +133,18 @@ export async function builtin_tree(args) {
78
133
  spinner.stop();
79
134
  let rendered = '';
80
135
  if (pathMode) {
81
- // --path: emit one full chrisPath per entry — grep-friendly
136
+ // --path: emit one full path per entry — grep-friendly, under the path asked
82
137
  for (const item of scanResult.fileInfo) {
83
- rendered += `${item.chrisPath}\n`;
138
+ rendered += `${shownPath_derive(item.chrisPath, targetPath, logicalRoot)}\n`;
84
139
  }
85
140
  }
86
141
  else if (scanResult.fileInfo.length === 0) {
87
142
  // An empty folder is its own tree: its name, and nothing under it.
88
- rendered += `${targetPath ?? originalFolder}\n`;
143
+ rendered += `${pathArg ?? originalFolder}\n`;
144
+ }
145
+ else if (targetPath !== undefined && pathArg !== undefined) {
146
+ // The tree hangs from the path as typed, its entries below it.
147
+ rendered += `${treeUnder_render(scanResult.fileInfo, targetPath, pathArg)}\n`;
89
148
  }
90
149
  else {
91
150
  // Default: ASCII tree
@@ -96,4 +155,35 @@ export async function builtin_tree(args) {
96
155
  rendered += `${chalk.gray(`${scanResult.fileInfo.length} items`)}\n`;
97
156
  return envelope_ok(rendered);
98
157
  }
158
+ /**
159
+ * A scanned path as the person asked for it: under the logical root in
160
+ * place of the store folder it was read from.
161
+ *
162
+ * @param chrisPath - The path the scan gave (a store path).
163
+ * @param storeRoot - The store folder scanned, when one was named.
164
+ * @param logicalRoot - The same folder as the session names it.
165
+ * @returns The path to show.
166
+ */
167
+ function shownPath_derive(chrisPath, storeRoot, logicalRoot) {
168
+ if (storeRoot === undefined || logicalRoot === undefined)
169
+ return chrisPath;
170
+ if (chrisPath === storeRoot)
171
+ return logicalRoot;
172
+ return chrisPath.startsWith(`${storeRoot}/`) ? `${logicalRoot}${chrisPath.slice(storeRoot.length)}` : chrisPath;
173
+ }
174
+ /**
175
+ * Draws a scanned folder's tree hanging from the path as typed: its entries
176
+ * relative to the store folder they were read from.
177
+ *
178
+ * @param files - What the scan found.
179
+ * @param storeRoot - The store folder scanned.
180
+ * @param shown - The root's label: the path as typed.
181
+ * @returns The tree.
182
+ */
183
+ function treeUnder_render(files, storeRoot, shown) {
184
+ const under = files.map((file) => (file.chrisPath.startsWith(`${storeRoot}/`) ? { ...file, chrisPath: file.chrisPath.slice(storeRoot.length + 1) } : file));
185
+ // archy draws the root's own label first: an empty line, which the path takes.
186
+ const lines = archyTree_create(under).split('\n');
187
+ return [shown, ...lines.slice(1)].join('\n').replace(/\n+$/, '');
188
+ }
99
189
  //# sourceMappingURL=tree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/builtins/fs/tree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/builtins/fs/tree.ts"],"names":[],"mappings":"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"}