spliterator 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +18 -0
  2. package/out/index.d.ts +26 -25
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +26 -25
  5. package/out/index.js.map +1 -1
  6. package/out/lib/{AsyncSpliterator.d.ts → core/AsyncSpliterator.d.ts} +3 -3
  7. package/out/lib/core/AsyncSpliterator.d.ts.map +1 -0
  8. package/out/lib/{AsyncSpliterator.js → core/AsyncSpliterator.js} +30 -2
  9. package/out/lib/core/AsyncSpliterator.js.map +1 -0
  10. package/out/lib/core/BufferController.d.ts.map +1 -0
  11. package/out/lib/core/BufferController.js.map +1 -0
  12. package/out/lib/{CharacterSequence.d.ts → core/CharacterSequence.d.ts} +17 -2
  13. package/out/lib/core/CharacterSequence.d.ts.map +1 -0
  14. package/out/lib/{CharacterSequence.js → core/CharacterSequence.js} +37 -0
  15. package/out/lib/core/CharacterSequence.js.map +1 -0
  16. package/out/lib/{CompositeDataView.d.ts → core/CompositeDataView.d.ts} +1 -1
  17. package/out/lib/core/CompositeDataView.d.ts.map +1 -0
  18. package/out/lib/core/CompositeDataView.js.map +1 -0
  19. package/out/lib/{IndexQueue.d.ts → core/IndexQueue.d.ts} +1 -1
  20. package/out/lib/core/IndexQueue.d.ts.map +1 -0
  21. package/out/lib/core/IndexQueue.js.map +1 -0
  22. package/out/lib/{SlidingWindow.d.ts → core/SlidingWindow.d.ts} +1 -1
  23. package/out/lib/core/SlidingWindow.d.ts.map +1 -0
  24. package/out/lib/core/SlidingWindow.js.map +1 -0
  25. package/out/lib/{Spliterator.d.ts → core/Spliterator.d.ts} +1 -1
  26. package/out/lib/core/Spliterator.d.ts.map +1 -0
  27. package/out/lib/{Spliterator.js → core/Spliterator.js} +1 -1
  28. package/out/lib/core/Spliterator.js.map +1 -0
  29. package/out/lib/{wasm_base64.js → core/wasm_base64.d.ts} +5 -2
  30. package/out/lib/core/wasm_base64.d.ts.map +1 -0
  31. package/out/lib/core/wasm_base64.js +19 -0
  32. package/out/lib/core/wasm_base64.js.map +1 -0
  33. package/out/lib/{wasm_module.d.ts → core/wasm_module.d.ts} +15 -0
  34. package/out/lib/core/wasm_module.d.ts.map +1 -0
  35. package/out/lib/{wasm_module.js → core/wasm_module.js} +2 -1
  36. package/out/lib/core/wasm_module.js.map +1 -0
  37. package/out/lib/{CSVSpliterator.d.ts → formats/CSVSpliterator.d.ts} +4 -4
  38. package/out/lib/formats/CSVSpliterator.d.ts.map +1 -0
  39. package/out/lib/{CSVSpliterator.js → formats/CSVSpliterator.js} +96 -5
  40. package/out/lib/formats/CSVSpliterator.js.map +1 -0
  41. package/out/lib/{JSONSpliterator.d.ts → formats/JSONSpliterator.d.ts} +5 -5
  42. package/out/lib/formats/JSONSpliterator.d.ts.map +1 -0
  43. package/out/lib/{JSONSpliterator.js → formats/JSONSpliterator.js} +3 -3
  44. package/out/lib/formats/JSONSpliterator.js.map +1 -0
  45. package/out/lib/formats/PSVSpliterator.d.ts.map +1 -0
  46. package/out/lib/{PSVSpliterator.js → formats/PSVSpliterator.js} +1 -1
  47. package/out/lib/formats/PSVSpliterator.js.map +1 -0
  48. package/out/lib/formats/TSVSpliterator.d.ts.map +1 -0
  49. package/out/lib/{TSVSpliterator.js → formats/TSVSpliterator.js} +1 -1
  50. package/out/lib/formats/TSVSpliterator.js.map +1 -0
  51. package/out/lib/{TextSpliterator.d.ts → formats/TextSpliterator.d.ts} +5 -5
  52. package/out/lib/formats/TextSpliterator.d.ts.map +1 -0
  53. package/out/lib/{TextSpliterator.js → formats/TextSpliterator.js} +3 -3
  54. package/out/lib/formats/TextSpliterator.js.map +1 -0
  55. package/out/lib/{XLSXSpliterator.d.ts → formats/XLSXSpliterator.d.ts} +2 -2
  56. package/out/lib/formats/XLSXSpliterator.d.ts.map +1 -0
  57. package/out/lib/{XLSXSpliterator.js → formats/XLSXSpliterator.js} +1 -1
  58. package/out/lib/formats/XLSXSpliterator.js.map +1 -0
  59. package/out/lib/formats/casing.d.ts.map +1 -0
  60. package/out/lib/formats/casing.js.map +1 -0
  61. package/out/lib/formats/row-emitters.d.ts.map +1 -0
  62. package/out/lib/{row-emitters.js → formats/row-emitters.js} +1 -1
  63. package/out/lib/formats/row-emitters.js.map +1 -0
  64. package/out/lib/internal/shared.d.ts.map +1 -0
  65. package/out/lib/internal/shared.js.map +1 -0
  66. package/out/lib/internal/utils.d.ts.map +1 -0
  67. package/out/lib/internal/utils.js.map +1 -0
  68. package/out/lib/{adaptive-source.d.ts → io/adaptive-source.d.ts} +2 -2
  69. package/out/lib/io/adaptive-source.d.ts.map +1 -0
  70. package/out/lib/{adaptive-source.js → io/adaptive-source.js} +2 -2
  71. package/out/lib/io/adaptive-source.js.map +1 -0
  72. package/out/lib/io/writer.d.ts.map +1 -0
  73. package/out/lib/io/writer.js.map +1 -0
  74. package/out/lib/{AsyncSequence.d.ts → iterators/AsyncSequence.d.ts} +1 -1
  75. package/out/lib/iterators/AsyncSequence.d.ts.map +1 -0
  76. package/out/lib/{AsyncSequence.js → iterators/AsyncSequence.js} +1 -1
  77. package/out/lib/iterators/AsyncSequence.js.map +1 -0
  78. package/out/lib/iterators/chunks.d.ts.map +1 -0
  79. package/out/lib/iterators/chunks.js.map +1 -0
  80. package/out/lib/iterators/pivot.d.ts.map +1 -0
  81. package/out/lib/iterators/pivot.js.map +1 -0
  82. package/out/lib/iterators/zip.d.ts.map +1 -0
  83. package/out/lib/iterators/zip.js.map +1 -0
  84. package/out/lib/parallel/merge-async-iterators.d.ts.map +1 -0
  85. package/out/lib/parallel/merge-async-iterators.js.map +1 -0
  86. package/out/lib/parallel/parallel-map-runtime.d.ts.map +1 -0
  87. package/out/lib/parallel/parallel-map-runtime.js.map +1 -0
  88. package/out/lib/parallel/parallel-map-worker-entry.d.ts.map +1 -0
  89. package/out/lib/parallel/parallel-map-worker-entry.js.map +1 -0
  90. package/out/lib/parallel/parallel-map-workers.d.ts.map +1 -0
  91. package/out/lib/parallel/parallel-map-workers.js.map +1 -0
  92. package/out/lib/{parallel-map.d.ts → parallel/parallel-map.d.ts} +1 -1
  93. package/out/lib/parallel/parallel-map.d.ts.map +1 -0
  94. package/out/lib/{parallel-map.js → parallel/parallel-map.js} +1 -1
  95. package/out/lib/parallel/parallel-map.js.map +1 -0
  96. package/out/lib/parallel/segment-runtime.d.ts.map +1 -0
  97. package/out/lib/parallel/segment-runtime.js.map +1 -0
  98. package/out/lib/parallel/segment-worker-entry.d.ts.map +1 -0
  99. package/out/lib/{segment-worker-entry.js → parallel/segment-worker-entry.js} +1 -1
  100. package/out/lib/parallel/segment-worker-entry.js.map +1 -0
  101. package/out/lib/{segment-workers.d.ts → parallel/segment-workers.d.ts} +2 -2
  102. package/out/lib/parallel/segment-workers.d.ts.map +1 -0
  103. package/out/lib/parallel/segment-workers.js.map +1 -0
  104. package/out/lib/{segments.d.ts → parallel/segments.d.ts} +2 -2
  105. package/out/lib/parallel/segments.d.ts.map +1 -0
  106. package/out/lib/{segments.js → parallel/segments.js} +1 -1
  107. package/out/lib/parallel/segments.js.map +1 -0
  108. package/out/node/cli/commands/csv.d.ts +113 -0
  109. package/out/node/cli/commands/csv.d.ts.map +1 -1
  110. package/out/node/cli/commands/csv.js +34 -36
  111. package/out/node/cli/commands/csv.js.map +1 -1
  112. package/out/node/cli/commands/iterate.d.ts +92 -0
  113. package/out/node/cli/commands/iterate.d.ts.map +1 -1
  114. package/out/node/cli/commands/iterate.js +26 -28
  115. package/out/node/cli/commands/iterate.js.map +1 -1
  116. package/out/node/cli/commands/parallel.d.ts +102 -0
  117. package/out/node/cli/commands/parallel.d.ts.map +1 -0
  118. package/out/node/cli/commands/parallel.js +426 -0
  119. package/out/node/cli/commands/parallel.js.map +1 -0
  120. package/out/node/cli/index.js +5 -0
  121. package/out/node/cli/index.js.map +1 -1
  122. package/out/node/cli/spec.d.ts +51 -0
  123. package/out/node/cli/spec.d.ts.map +1 -0
  124. package/out/node/cli/spec.js +78 -0
  125. package/out/node/cli/spec.js.map +1 -0
  126. package/out/node/cli/utils.d.ts +36 -18
  127. package/out/node/cli/utils.d.ts.map +1 -1
  128. package/out/node/cli/utils.js +48 -39
  129. package/out/node/cli/utils.js.map +1 -1
  130. package/out/node/fs/index.d.ts +1 -1
  131. package/out/node/fs/index.d.ts.map +1 -1
  132. package/out/node/fs/index.js +1 -1
  133. package/out/node/fs/index.js.map +1 -1
  134. package/package.json +7 -8
  135. package/out/lib/AsyncSequence.d.ts.map +0 -1
  136. package/out/lib/AsyncSequence.js.map +0 -1
  137. package/out/lib/AsyncSpliterator.d.ts.map +0 -1
  138. package/out/lib/AsyncSpliterator.js.map +0 -1
  139. package/out/lib/BufferController.d.ts.map +0 -1
  140. package/out/lib/BufferController.js.map +0 -1
  141. package/out/lib/CSVSpliterator.d.ts.map +0 -1
  142. package/out/lib/CSVSpliterator.js.map +0 -1
  143. package/out/lib/CharacterSequence.d.ts.map +0 -1
  144. package/out/lib/CharacterSequence.js.map +0 -1
  145. package/out/lib/CompositeDataView.d.ts.map +0 -1
  146. package/out/lib/CompositeDataView.js.map +0 -1
  147. package/out/lib/IndexQueue.d.ts.map +0 -1
  148. package/out/lib/IndexQueue.js.map +0 -1
  149. package/out/lib/JSONSpliterator.d.ts.map +0 -1
  150. package/out/lib/JSONSpliterator.js.map +0 -1
  151. package/out/lib/PSVSpliterator.d.ts.map +0 -1
  152. package/out/lib/PSVSpliterator.js.map +0 -1
  153. package/out/lib/SlidingWindow.d.ts.map +0 -1
  154. package/out/lib/SlidingWindow.js.map +0 -1
  155. package/out/lib/Spliterator.d.ts.map +0 -1
  156. package/out/lib/Spliterator.js.map +0 -1
  157. package/out/lib/TSVSpliterator.d.ts.map +0 -1
  158. package/out/lib/TSVSpliterator.js.map +0 -1
  159. package/out/lib/TextSpliterator.d.ts.map +0 -1
  160. package/out/lib/TextSpliterator.js.map +0 -1
  161. package/out/lib/XLSXSpliterator.d.ts.map +0 -1
  162. package/out/lib/XLSXSpliterator.js.map +0 -1
  163. package/out/lib/adaptive-source.d.ts.map +0 -1
  164. package/out/lib/adaptive-source.js.map +0 -1
  165. package/out/lib/casing.d.ts.map +0 -1
  166. package/out/lib/casing.js.map +0 -1
  167. package/out/lib/chunks.d.ts.map +0 -1
  168. package/out/lib/chunks.js.map +0 -1
  169. package/out/lib/merge-async-iterators.d.ts.map +0 -1
  170. package/out/lib/merge-async-iterators.js.map +0 -1
  171. package/out/lib/parallel-map-runtime.d.ts.map +0 -1
  172. package/out/lib/parallel-map-runtime.js.map +0 -1
  173. package/out/lib/parallel-map-worker-entry.d.ts.map +0 -1
  174. package/out/lib/parallel-map-worker-entry.js.map +0 -1
  175. package/out/lib/parallel-map-workers.d.ts.map +0 -1
  176. package/out/lib/parallel-map-workers.js.map +0 -1
  177. package/out/lib/parallel-map.d.ts.map +0 -1
  178. package/out/lib/parallel-map.js.map +0 -1
  179. package/out/lib/pivot.d.ts.map +0 -1
  180. package/out/lib/pivot.js.map +0 -1
  181. package/out/lib/row-emitters.d.ts.map +0 -1
  182. package/out/lib/row-emitters.js.map +0 -1
  183. package/out/lib/segment-runtime.d.ts.map +0 -1
  184. package/out/lib/segment-runtime.js.map +0 -1
  185. package/out/lib/segment-worker-entry.d.ts.map +0 -1
  186. package/out/lib/segment-worker-entry.js.map +0 -1
  187. package/out/lib/segment-workers.d.ts.map +0 -1
  188. package/out/lib/segment-workers.js.map +0 -1
  189. package/out/lib/segments.d.ts.map +0 -1
  190. package/out/lib/segments.js.map +0 -1
  191. package/out/lib/shared.d.ts.map +0 -1
  192. package/out/lib/shared.js.map +0 -1
  193. package/out/lib/take.d.ts +0 -42
  194. package/out/lib/take.d.ts.map +0 -1
  195. package/out/lib/take.js +0 -101
  196. package/out/lib/take.js.map +0 -1
  197. package/out/lib/utils.d.ts.map +0 -1
  198. package/out/lib/utils.js.map +0 -1
  199. package/out/lib/wasm_base64.d.ts +0 -16
  200. package/out/lib/wasm_base64.d.ts.map +0 -1
  201. package/out/lib/wasm_base64.js.map +0 -1
  202. package/out/lib/wasm_module.d.ts.map +0 -1
  203. package/out/lib/wasm_module.js.map +0 -1
  204. package/out/lib/writer.d.ts.map +0 -1
  205. package/out/lib/writer.js.map +0 -1
  206. package/out/lib/zip.d.ts.map +0 -1
  207. package/out/lib/zip.js.map +0 -1
  208. package/out/node/cli/parse-args.d.ts +0 -120
  209. package/out/node/cli/parse-args.d.ts.map +0 -1
  210. package/out/node/cli/parse-args.js +0 -118
  211. package/out/node/cli/parse-args.js.map +0 -1
  212. /package/out/lib/{BufferController.d.ts → core/BufferController.d.ts} +0 -0
  213. /package/out/lib/{BufferController.js → core/BufferController.js} +0 -0
  214. /package/out/lib/{CompositeDataView.js → core/CompositeDataView.js} +0 -0
  215. /package/out/lib/{IndexQueue.js → core/IndexQueue.js} +0 -0
  216. /package/out/lib/{SlidingWindow.js → core/SlidingWindow.js} +0 -0
  217. /package/out/lib/{PSVSpliterator.d.ts → formats/PSVSpliterator.d.ts} +0 -0
  218. /package/out/lib/{TSVSpliterator.d.ts → formats/TSVSpliterator.d.ts} +0 -0
  219. /package/out/lib/{casing.d.ts → formats/casing.d.ts} +0 -0
  220. /package/out/lib/{casing.js → formats/casing.js} +0 -0
  221. /package/out/lib/{row-emitters.d.ts → formats/row-emitters.d.ts} +0 -0
  222. /package/out/lib/{shared.d.ts → internal/shared.d.ts} +0 -0
  223. /package/out/lib/{shared.js → internal/shared.js} +0 -0
  224. /package/out/lib/{utils.d.ts → internal/utils.d.ts} +0 -0
  225. /package/out/lib/{utils.js → internal/utils.js} +0 -0
  226. /package/out/lib/{writer.d.ts → io/writer.d.ts} +0 -0
  227. /package/out/lib/{writer.js → io/writer.js} +0 -0
  228. /package/out/lib/{chunks.d.ts → iterators/chunks.d.ts} +0 -0
  229. /package/out/lib/{chunks.js → iterators/chunks.js} +0 -0
  230. /package/out/lib/{pivot.d.ts → iterators/pivot.d.ts} +0 -0
  231. /package/out/lib/{pivot.js → iterators/pivot.js} +0 -0
  232. /package/out/lib/{zip.d.ts → iterators/zip.d.ts} +0 -0
  233. /package/out/lib/{zip.js → iterators/zip.js} +0 -0
  234. /package/out/lib/{merge-async-iterators.d.ts → parallel/merge-async-iterators.d.ts} +0 -0
  235. /package/out/lib/{merge-async-iterators.js → parallel/merge-async-iterators.js} +0 -0
  236. /package/out/lib/{parallel-map-runtime.d.ts → parallel/parallel-map-runtime.d.ts} +0 -0
  237. /package/out/lib/{parallel-map-runtime.js → parallel/parallel-map-runtime.js} +0 -0
  238. /package/out/lib/{parallel-map-worker-entry.d.ts → parallel/parallel-map-worker-entry.d.ts} +0 -0
  239. /package/out/lib/{parallel-map-worker-entry.js → parallel/parallel-map-worker-entry.js} +0 -0
  240. /package/out/lib/{parallel-map-workers.d.ts → parallel/parallel-map-workers.d.ts} +0 -0
  241. /package/out/lib/{parallel-map-workers.js → parallel/parallel-map-workers.js} +0 -0
  242. /package/out/lib/{segment-runtime.d.ts → parallel/segment-runtime.d.ts} +0 -0
  243. /package/out/lib/{segment-runtime.js → parallel/segment-runtime.js} +0 -0
  244. /package/out/lib/{segment-worker-entry.d.ts → parallel/segment-worker-entry.d.ts} +0 -0
  245. /package/out/lib/{segment-workers.js → parallel/segment-workers.js} +0 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Run commands concurrently over delimited records or record-aligned blocks.
6
+ */
7
+ export declare const spec: {
8
+ readonly name: "parallel";
9
+ readonly usage: "parallel [options] -- <command> [arguments...]";
10
+ readonly description: "Run a command concurrently over delimited input. Record mode substitutes {} in arguments, or appends the record when {} is absent. Pipe mode sends record-aligned blocks to each command's standard input.";
11
+ readonly options: {
12
+ readonly jobs: {
13
+ readonly type: "number";
14
+ readonly short: "j";
15
+ readonly hint: "count";
16
+ readonly default: number;
17
+ readonly description: "Maximum concurrent jobs.";
18
+ readonly validate: (value: number) => boolean;
19
+ readonly validationMessage: "Option --jobs must be a positive integer.";
20
+ };
21
+ readonly split: {
22
+ readonly type: "string";
23
+ readonly short: "s";
24
+ readonly hint: "delimiter";
25
+ readonly default: "\n";
26
+ readonly description: "Delimiter to split records on.";
27
+ };
28
+ readonly null: {
29
+ readonly type: "boolean";
30
+ readonly short: "0";
31
+ readonly default: false;
32
+ readonly description: "Use NUL-delimited input.";
33
+ };
34
+ readonly pipe: {
35
+ readonly type: "boolean";
36
+ readonly default: false;
37
+ readonly description: "Send record-aligned blocks to child stdin.";
38
+ };
39
+ readonly block: {
40
+ readonly type: "string";
41
+ readonly hint: "size";
42
+ readonly default: "1MiB";
43
+ readonly description: "Target pipe block size.";
44
+ };
45
+ readonly "keep-order": {
46
+ readonly type: "boolean";
47
+ readonly short: "k";
48
+ readonly default: false;
49
+ readonly description: "Emit output in input order.";
50
+ };
51
+ readonly group: {
52
+ readonly type: "boolean";
53
+ readonly default: true;
54
+ readonly description: "Keep each job's output together.";
55
+ };
56
+ readonly "line-buffer": {
57
+ readonly type: "boolean";
58
+ readonly default: false;
59
+ readonly description: "Emit complete lines without mixing partial lines.";
60
+ };
61
+ readonly halt: {
62
+ readonly type: "string";
63
+ readonly hint: "mode";
64
+ readonly choices: readonly ["never", "soon", "now"];
65
+ readonly default: "never";
66
+ readonly description: "Failure policy.";
67
+ };
68
+ readonly tag: {
69
+ readonly type: "boolean";
70
+ readonly default: false;
71
+ readonly description: "Prefix output lines with the input sequence number.";
72
+ };
73
+ readonly "dry-run": {
74
+ readonly type: "boolean";
75
+ readonly default: false;
76
+ readonly description: "Print commands without executing them.";
77
+ };
78
+ readonly source: {
79
+ readonly type: "string";
80
+ readonly short: "i";
81
+ readonly hint: "path";
82
+ readonly description: "Read input from a file instead of stdin.";
83
+ };
84
+ readonly "skip-empty": {
85
+ readonly type: "boolean";
86
+ readonly short: "e";
87
+ readonly description: "Skip empty records (the record-mode default).";
88
+ };
89
+ readonly "reader-high-water-mark": {
90
+ readonly type: "number";
91
+ readonly short: "w";
92
+ readonly hint: "bytes";
93
+ readonly default: number;
94
+ readonly description: "Input stream buffer size.";
95
+ readonly validate: (value: number) => boolean;
96
+ readonly validationMessage: "Option --reader-high-water-mark must be a positive integer.";
97
+ };
98
+ };
99
+ };
100
+ export declare const help: string;
101
+ export declare function run(args: string[]): Promise<void>;
102
+ //# sourceMappingURL=parallel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/parallel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2CH,eAAO,MAAM,IAAI;mBACV,UAAU;oBACT,gDAAgD;0BAEtD,4MAA4M;;;2BAGrM,QAAQ;4BACP,GAAG;2BACJ,OAAO;;kCAEA,0BAA0B;;wCAEpB,2CAA2C;;;qBAG9D,IAAI,EAAE,QAAQ;qBACd,KAAK,EAAE,GAAG;qBACV,IAAI,EAAE,WAAW;qBACjB,OAAO,EAAE,IAAI;qBACb,WAAW,EAAE,gCAAgC;;;qBAEtC,IAAI,EAAE,SAAS;qBAAE,KAAK,EAAE,GAAG;qBAAE,OAAO;qBAAS,WAAW,EAAE,0BAA0B;;;qBACpF,IAAI,EAAE,SAAS;qBAAE,OAAO;qBAAS,WAAW,EAAE,4CAA4C;;;qBACzF,IAAI,EAAE,QAAQ;qBAAE,IAAI,EAAE,MAAM;qBAAE,OAAO,EAAE,MAAM;qBAAE,WAAW,EAAE,yBAAyB;;;qBAC9E,IAAI,EAAE,SAAS;qBAAE,KAAK,EAAE,GAAG;qBAAE,OAAO;qBAAS,WAAW,EAAE,6BAA6B;;;qBAC9F,IAAI,EAAE,SAAS;qBAAE,OAAO;qBAAQ,WAAW,EAAE,kCAAkC;;;qBAEvF,IAAI,EAAE,SAAS;qBACf,OAAO;qBACP,WAAW,EAAE,mDAAmD;;;qBAEzD,IAAI,EAAE,QAAQ;qBAAE,IAAI,EAAE,MAAM;qBAAE,OAAO;qBAAa,OAAO,EAAE,OAAO;qBAAE,WAAW,EAAE,iBAAiB;;;qBACnG,IAAI,EAAE,SAAS;qBAAE,OAAO;qBAAS,WAAW,EAAE,qDAAqD;;;qBAC7F,IAAI,EAAE,SAAS;qBAAE,OAAO;qBAAS,WAAW,EAAE,wCAAwC;;;qBACzF,IAAI,EAAE,QAAQ;qBAAE,KAAK,EAAE,GAAG;qBAAE,IAAI,EAAE,MAAM;qBAAE,WAAW,EAAE,0CAA0C;;;qBAC3F,IAAI,EAAE,SAAS;qBAAE,KAAK,EAAE,GAAG;qBAAE,WAAW,EAAE,+CAA+C;;;2BAElG,QAAQ;4BACP,GAAG;2BACJ,OAAO;;kCAEA,2BAA2B;;wCAErB,6DAA6D;;;CAGnD,CAAA;AAEhC,eAAO,MAAM,IAAI,QAA0B,CAAA;AA+b3C,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CvD"}
@@ -0,0 +1,426 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Run commands concurrently over delimited records or record-aligned blocks.
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { createReadStream as createNodeReadStream, createWriteStream } from "node:fs";
9
+ import { mkdtemp, rm } from "node:fs/promises";
10
+ import { availableParallelism, tmpdir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { pipeline } from "node:stream/promises";
13
+ import { CharacterSequence, Spliterator } from "spliterator";
14
+ import { createReadStream } from "spliterator/node/fs";
15
+ import { parseCommand, renderCommandHelp } from "../spec.js";
16
+ import { usageError } from "../utils.js";
17
+ const haltModes = ["never", "soon", "now"];
18
+ export const spec = {
19
+ name: "parallel",
20
+ usage: "parallel [options] -- <command> [arguments...]",
21
+ description: "Run a command concurrently over delimited input. Record mode substitutes {} in arguments, or appends the record when {} is absent. Pipe mode sends record-aligned blocks to each command's standard input.",
22
+ options: {
23
+ jobs: {
24
+ type: "number",
25
+ short: "j",
26
+ hint: "count",
27
+ default: availableParallelism(),
28
+ description: "Maximum concurrent jobs.",
29
+ validate: (value) => Number.isInteger(value) && value >= 1,
30
+ validationMessage: "Option --jobs must be a positive integer.",
31
+ },
32
+ split: {
33
+ type: "string",
34
+ short: "s",
35
+ hint: "delimiter",
36
+ default: "\n",
37
+ description: "Delimiter to split records on.",
38
+ },
39
+ null: { type: "boolean", short: "0", default: false, description: "Use NUL-delimited input." },
40
+ pipe: { type: "boolean", default: false, description: "Send record-aligned blocks to child stdin." },
41
+ block: { type: "string", hint: "size", default: "1MiB", description: "Target pipe block size." },
42
+ "keep-order": { type: "boolean", short: "k", default: false, description: "Emit output in input order." },
43
+ group: { type: "boolean", default: true, description: "Keep each job's output together." },
44
+ "line-buffer": {
45
+ type: "boolean",
46
+ default: false,
47
+ description: "Emit complete lines without mixing partial lines.",
48
+ },
49
+ halt: { type: "string", hint: "mode", choices: haltModes, default: "never", description: "Failure policy." },
50
+ tag: { type: "boolean", default: false, description: "Prefix output lines with the input sequence number." },
51
+ "dry-run": { type: "boolean", default: false, description: "Print commands without executing them." },
52
+ source: { type: "string", short: "i", hint: "path", description: "Read input from a file instead of stdin." },
53
+ "skip-empty": { type: "boolean", short: "e", description: "Skip empty records (the record-mode default)." },
54
+ "reader-high-water-mark": {
55
+ type: "number",
56
+ short: "w",
57
+ hint: "bytes",
58
+ default: 64 * 1024,
59
+ description: "Input stream buffer size.",
60
+ validate: (value) => Number.isInteger(value) && value >= 1,
61
+ validationMessage: "Option --reader-high-water-mark must be a positive integer.",
62
+ },
63
+ },
64
+ };
65
+ export const help = renderCommandHelp(spec);
66
+ function parseByteSize(input) {
67
+ const match = /^(\d+(?:\.\d+)?)\s*(B|K|KB|KIB|M|MB|MIB|G|GB|GIB)?$/i.exec(input);
68
+ if (!match) {
69
+ usageError(`Option --block expects a byte size, received "${input}".`);
70
+ }
71
+ const value = Number(match[1]);
72
+ const unit = match[2]?.toUpperCase() ?? "B";
73
+ const multiplier = unit === "K" || unit === "KB" || unit === "KIB"
74
+ ? 1024
75
+ : unit === "M" || unit === "MB" || unit === "MIB"
76
+ ? 1024 ** 2
77
+ : unit === "G" || unit === "GB" || unit === "GIB"
78
+ ? 1024 ** 3
79
+ : 1;
80
+ const bytes = Math.floor(value * multiplier);
81
+ if (!Number.isSafeInteger(bytes) || bytes < 1) {
82
+ usageError(`Option --block must be at least one byte.`);
83
+ }
84
+ return bytes;
85
+ }
86
+ function shellQuote(value) {
87
+ if (/^[\w@%+=:,./-]+$/.test(value))
88
+ return value;
89
+ return `'${value.replaceAll("'", `'\\''`)}'`;
90
+ }
91
+ async function writeOutput(stream, chunk) {
92
+ if (stream.write(chunk))
93
+ return;
94
+ await new Promise((resolve, reject) => {
95
+ const cleanup = () => {
96
+ stream.off("drain", onDrain);
97
+ stream.off("error", onError);
98
+ };
99
+ const onDrain = () => {
100
+ cleanup();
101
+ resolve();
102
+ };
103
+ const onError = (error) => {
104
+ cleanup();
105
+ reject(error);
106
+ };
107
+ stream.once("drain", onDrain);
108
+ stream.once("error", onError);
109
+ });
110
+ }
111
+ function taggedChunk(index, chunk) {
112
+ const prefix = Buffer.from(`${index}\t`);
113
+ const output = Buffer.allocUnsafe(prefix.length + chunk.length);
114
+ output.set(prefix);
115
+ output.set(chunk, prefix.length);
116
+ return output;
117
+ }
118
+ async function pumpLines(stream, destination, index, tag) {
119
+ let pending = new Uint8Array();
120
+ for await (const input of stream) {
121
+ const chunk = Buffer.isBuffer(input) ? input : Buffer.from(input);
122
+ const bytes = pending.length ? Buffer.concat([pending, chunk]) : chunk;
123
+ let start = 0;
124
+ for (let cursor = bytes.indexOf(10); cursor !== -1; cursor = bytes.indexOf(10, start)) {
125
+ const line = bytes.subarray(start, cursor + 1);
126
+ await writeOutput(destination, tag ? taggedChunk(index, line) : line);
127
+ start = cursor + 1;
128
+ }
129
+ pending = start < bytes.length ? bytes.subarray(start) : new Uint8Array();
130
+ }
131
+ if (pending.length) {
132
+ await writeOutput(destination, tag ? taggedChunk(index, pending) : pending);
133
+ }
134
+ }
135
+ async function pumpRaw(stream, destination) {
136
+ for await (const chunk of stream) {
137
+ await writeOutput(destination, chunk);
138
+ }
139
+ }
140
+ async function publishFile(path, destination, index, tag) {
141
+ await (tag
142
+ ? pumpLines(createNodeReadStream(path), destination, index, true)
143
+ : pumpRaw(createNodeReadStream(path), destination));
144
+ }
145
+ async function waitForChild(child) {
146
+ return new Promise((resolve, reject) => {
147
+ child.once("error", reject);
148
+ child.once("close", (code, signal) => resolve({ code, signal }));
149
+ });
150
+ }
151
+ async function writeChildInput(child, input) {
152
+ await new Promise((resolve, reject) => {
153
+ const cleanup = () => child.stdin.off("error", onError);
154
+ const onError = (error) => {
155
+ cleanup();
156
+ reject(error);
157
+ };
158
+ const end = () => {
159
+ child.stdin.end(() => {
160
+ cleanup();
161
+ resolve();
162
+ });
163
+ };
164
+ child.stdin.once("error", onError);
165
+ if (!input?.length || child.stdin.write(input)) {
166
+ end();
167
+ }
168
+ else {
169
+ child.stdin.once("drain", end);
170
+ }
171
+ });
172
+ }
173
+ async function captureToFile(stream, path) {
174
+ await pipeline(stream, createWriteStream(path));
175
+ }
176
+ async function* recordJobs(source, command, commandArgs, delimiter, skipEmpty, readerHighWaterMark) {
177
+ const input = await createReadStream(source, readerHighWaterMark);
178
+ const records = Spliterator.from(input, { delimiter, skipEmpty });
179
+ const decoder = new TextDecoder();
180
+ let index = 1;
181
+ for await (const recordBytes of records) {
182
+ const record = decoder.decode(recordBytes);
183
+ if (record.includes("\0"))
184
+ throw new TypeError("A command-line argument cannot contain a NUL byte.");
185
+ const hasPlaceholder = commandArgs.some((argument) => argument.includes("{}"));
186
+ const args = hasPlaceholder
187
+ ? commandArgs.map((argument) => argument.replaceAll("{}", record))
188
+ : [...commandArgs, record];
189
+ yield { index: index++, command, args };
190
+ }
191
+ }
192
+ async function* pipeJobs(source, command, commandArgs, delimiter, skipEmpty, blockSize, readerHighWaterMark) {
193
+ const input = await createReadStream(source, readerHighWaterMark);
194
+ if (!skipEmpty) {
195
+ let buffer = new Uint8Array(Math.max(blockSize + readerHighWaterMark, 1024));
196
+ let bytesWritten = 0;
197
+ let index = 1;
198
+ const encoder = new TextEncoder();
199
+ for await (const chunkValue of input) {
200
+ const chunk = typeof chunkValue === "string" ? encoder.encode(chunkValue) : chunkValue;
201
+ const required = bytesWritten + chunk.length;
202
+ if (required > buffer.length) {
203
+ const grown = new Uint8Array(Math.max(required, buffer.length * 2));
204
+ grown.set(buffer.subarray(0, bytesWritten));
205
+ buffer = grown;
206
+ }
207
+ buffer.set(chunk, bytesWritten);
208
+ bytesWritten = required;
209
+ while (bytesWritten >= blockSize) {
210
+ // Include a delimiter that starts just before the target but ends at/after it.
211
+ const searchStart = Math.max(0, blockSize - delimiter.length);
212
+ const delimiterOffset = delimiter.search(buffer, searchStart, bytesWritten);
213
+ if (delimiterOffset === -1)
214
+ break;
215
+ const blockEnd = delimiterOffset + delimiter.length;
216
+ const stdin = buffer.slice(0, blockEnd);
217
+ const remaining = bytesWritten - blockEnd;
218
+ buffer.copyWithin(0, blockEnd, bytesWritten);
219
+ bytesWritten = remaining;
220
+ yield { index: index++, command, args: [...commandArgs], stdin };
221
+ }
222
+ }
223
+ if (bytesWritten) {
224
+ yield { index, command, args: [...commandArgs], stdin: buffer.slice(0, bytesWritten) };
225
+ }
226
+ return;
227
+ }
228
+ const records = Spliterator.from(input, { delimiter, skipEmpty });
229
+ let chunks = [];
230
+ let byteLength = 0;
231
+ let index = 1;
232
+ let pendingRecord;
233
+ const flush = () => {
234
+ if (!chunks.length)
235
+ return;
236
+ const stdin = new Uint8Array(byteLength);
237
+ let offset = 0;
238
+ for (const chunk of chunks) {
239
+ stdin.set(chunk, offset);
240
+ offset += chunk.length;
241
+ }
242
+ chunks = [];
243
+ byteLength = 0;
244
+ return { index: index++, command, args: [...commandArgs], stdin };
245
+ };
246
+ for await (const recordView of records) {
247
+ const currentRecord = recordView.slice();
248
+ if (!pendingRecord) {
249
+ pendingRecord = currentRecord;
250
+ continue;
251
+ }
252
+ const record = new Uint8Array(pendingRecord.length + delimiter.length);
253
+ record.set(pendingRecord);
254
+ record.set(delimiter, pendingRecord.length);
255
+ if (byteLength && byteLength + record.length > blockSize) {
256
+ yield flush();
257
+ }
258
+ chunks.push(record);
259
+ byteLength += record.length;
260
+ pendingRecord = currentRecord;
261
+ }
262
+ if (pendingRecord?.length) {
263
+ if (byteLength && byteLength + pendingRecord.length > blockSize) {
264
+ yield flush();
265
+ }
266
+ chunks.push(pendingRecord);
267
+ byteLength += pendingRecord.length;
268
+ }
269
+ const finalJob = flush();
270
+ if (finalJob) {
271
+ yield finalJob;
272
+ }
273
+ }
274
+ async function runScheduler(jobs, options) {
275
+ const temporaryDirectory = (options.group && !options.lineBuffer) || options.keepOrder
276
+ ? await mkdtemp(join(tmpdir(), "spliterator-"))
277
+ : undefined;
278
+ const active = new Set();
279
+ const children = new Set();
280
+ const ordered = new Map();
281
+ let nextOutput = 1;
282
+ let publishQueue = Promise.resolve();
283
+ let failed = false;
284
+ let stopping = false;
285
+ const publish = async (result) => {
286
+ if (result.stdoutPath) {
287
+ await publishFile(result.stdoutPath, process.stdout, result.job.index, options.tag);
288
+ }
289
+ if (result.stderrPath) {
290
+ await publishFile(result.stderrPath, process.stderr, result.job.index, options.tag);
291
+ }
292
+ };
293
+ const accept = (result) => {
294
+ if (!options.keepOrder) {
295
+ publishQueue = publishQueue.then(() => publish(result));
296
+ return;
297
+ }
298
+ ordered.set(result.job.index, result);
299
+ publishQueue = publishQueue.then(async () => {
300
+ while (ordered.has(nextOutput)) {
301
+ const ready = ordered.get(nextOutput);
302
+ ordered.delete(nextOutput++);
303
+ await publish(ready);
304
+ }
305
+ return undefined;
306
+ });
307
+ };
308
+ const stopChildren = (signal) => {
309
+ for (const child of children) {
310
+ child.kill(signal);
311
+ }
312
+ };
313
+ const onSignal = (signal) => {
314
+ stopping = true;
315
+ failed = true;
316
+ stopChildren(signal);
317
+ };
318
+ const onSigint = () => onSignal("SIGINT");
319
+ const onSigterm = () => onSignal("SIGTERM");
320
+ process.once("SIGINT", onSigint);
321
+ process.once("SIGTERM", onSigterm);
322
+ const launch = async (job) => {
323
+ if (options.dryRun) {
324
+ await writeOutput(process.stdout, `${[job.command, ...job.args].map(shellQuote).join(" ")}\n`);
325
+ return;
326
+ }
327
+ const child = spawn(job.command, job.args, { stdio: ["pipe", "pipe", "pipe"] });
328
+ children.add(child);
329
+ const stdoutPath = temporaryDirectory ? join(temporaryDirectory, `${job.index}.stdout`) : undefined;
330
+ const stderrPath = temporaryDirectory ? join(temporaryDirectory, `${job.index}.stderr`) : undefined;
331
+ const outputTasks = stdoutPath
332
+ ? [captureToFile(child.stdout, stdoutPath), captureToFile(child.stderr, stderrPath)]
333
+ : options.lineBuffer || options.tag
334
+ ? [
335
+ pumpLines(child.stdout, process.stdout, job.index, options.tag),
336
+ pumpLines(child.stderr, process.stderr, job.index, options.tag),
337
+ ]
338
+ : [pumpRaw(child.stdout, process.stdout), pumpRaw(child.stderr, process.stderr)];
339
+ try {
340
+ const [{ code, signal }] = await Promise.all([
341
+ waitForChild(child),
342
+ writeChildInput(child, job.stdin),
343
+ ...outputTasks,
344
+ ]);
345
+ const result = { job, code, signal, stdoutPath, stderrPath };
346
+ if (code !== 0 || signal) {
347
+ failed = true;
348
+ if (options.halt !== "never") {
349
+ stopping = true;
350
+ }
351
+ if (options.halt === "now") {
352
+ stopChildren("SIGTERM");
353
+ }
354
+ }
355
+ if (stdoutPath) {
356
+ accept(result);
357
+ }
358
+ }
359
+ catch (error) {
360
+ failed = true;
361
+ stopping = options.halt !== "never";
362
+ await writeOutput(process.stderr, `spliterator: job ${job.index} failed: ${String(error)}\n`);
363
+ if (options.halt === "now") {
364
+ stopChildren("SIGTERM");
365
+ }
366
+ }
367
+ finally {
368
+ children.delete(child);
369
+ }
370
+ };
371
+ try {
372
+ for await (const job of jobs) {
373
+ if (stopping)
374
+ break;
375
+ while (active.size >= options.concurrency) {
376
+ await Promise.race(active);
377
+ }
378
+ if (stopping)
379
+ break;
380
+ const task = launch(job).finally(() => active.delete(task));
381
+ active.add(task);
382
+ }
383
+ await Promise.all(active);
384
+ await publishQueue;
385
+ }
386
+ finally {
387
+ process.off("SIGINT", onSigint);
388
+ process.off("SIGTERM", onSigterm);
389
+ if (temporaryDirectory) {
390
+ await rm(temporaryDirectory, { recursive: true, force: true });
391
+ }
392
+ }
393
+ return failed ? 1 : 0;
394
+ }
395
+ export async function run(args) {
396
+ const separator = args.indexOf("--");
397
+ const { values, positionals: commandArgs } = parseCommand(spec, args);
398
+ if (values.help) {
399
+ console.log(help);
400
+ return;
401
+ }
402
+ if (separator === -1 || !commandArgs.length) {
403
+ usageError("Missing command after `--`.");
404
+ }
405
+ const concurrency = values.jobs;
406
+ const delimiter = new CharacterSequence(values.null ? 0 : values.split);
407
+ const [command, ...childArgs] = commandArgs;
408
+ const skipEmpty = values["skip-empty"] ?? !values.pipe;
409
+ const readerHighWaterMark = values["reader-high-water-mark"];
410
+ const jobs = values.pipe
411
+ ? pipeJobs(values.source, command, childArgs, delimiter, Boolean(skipEmpty), parseByteSize(values.block), readerHighWaterMark)
412
+ : recordJobs(values.source, command, childArgs, delimiter, Boolean(skipEmpty), readerHighWaterMark);
413
+ const exitCode = await runScheduler(jobs, {
414
+ concurrency,
415
+ group: Boolean(values.group),
416
+ keepOrder: Boolean(values["keep-order"]),
417
+ lineBuffer: Boolean(values["line-buffer"]),
418
+ halt: values.halt,
419
+ tag: Boolean(values.tag),
420
+ dryRun: Boolean(values["dry-run"]),
421
+ });
422
+ if (exitCode) {
423
+ process.exitCode = exitCode;
424
+ }
425
+ }
426
+ //# sourceMappingURL=parallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../../node/cli/commands/parallel.ts"],"names":[],"mappings":"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"}
@@ -8,12 +8,14 @@
8
8
  import { createRequire } from "node:module";
9
9
  import * as csv from "./commands/csv.js";
10
10
  import * as iterate from "./commands/iterate.js";
11
+ import * as parallel from "./commands/parallel.js";
11
12
  import { usageError } from "./utils.js";
12
13
  const rootHelp = [
13
14
  iterate.help,
14
15
  "",
15
16
  "Commands:",
16
17
  " csv Split a CSV file into JSONL format.",
18
+ " parallel Run commands concurrently over delimited input.",
17
19
  "",
18
20
  "Sister Software, AGPL-3.0",
19
21
  "https://sister.software",
@@ -25,6 +27,9 @@ try {
25
27
  case "csv":
26
28
  await csv.run(rest);
27
29
  break;
30
+ case "parallel":
31
+ await parallel.run(rest);
32
+ break;
28
33
  case "--version":
29
34
  console.log(createRequire(import.meta.url)("../../../package.json").version);
30
35
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,QAAQ,GAAG;IAChB,OAAO,CAAC,IAAI;IACZ,EAAE;IACF,WAAW;IACX,qEAAqE;IACrE,EAAE;IACF,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AAE7B,IAAI,CAAC;IACJ,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YACT,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,MAAK;QAEN,KAAK,WAAW;YACf,OAAO,CAAC,GAAG,CAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAC,CAAA;YACrG,MAAK;QAEN,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACrB,MAAK;QAEN;YACC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;AACF,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,8FAA8F;IAC9F,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,QAAQ,GAAG;IAChB,OAAO,CAAC,IAAI;IACZ,EAAE;IACF,WAAW;IACX,qEAAqE;IACrE,iFAAiF;IACjF,EAAE;IACF,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AAE7B,IAAI,CAAC;IACJ,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YACT,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,MAAK;QAEN,KAAK,UAAU;YACd,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxB,MAAK;QAEN,KAAK,WAAW;YACf,OAAO,CAAC,GAAG,CAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAC,CAAA;YACrG,MAAK;QAEN,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACrB,MAAK;QAEN;YACC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;AACF,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,8FAA8F;IAC9F,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,CAAA;AACZ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Declarative command metadata, parsing, validation, and help rendering.
6
+ */
7
+ type OptionValue = boolean | number | string;
8
+ interface OptionSpecBase {
9
+ description: string;
10
+ short?: string;
11
+ default?: OptionValue;
12
+ hint?: string;
13
+ }
14
+ interface BooleanOptionSpec extends OptionSpecBase {
15
+ type: "boolean";
16
+ default?: boolean;
17
+ }
18
+ interface NumberOptionSpec extends OptionSpecBase {
19
+ type: "number";
20
+ default?: number;
21
+ validate?: (value: number) => boolean;
22
+ validationMessage?: string;
23
+ }
24
+ interface StringOptionSpec extends OptionSpecBase {
25
+ type: "string";
26
+ default?: string;
27
+ choices?: readonly string[];
28
+ validate?: (value: string) => boolean;
29
+ validationMessage?: string;
30
+ }
31
+ export type OptionSpec = BooleanOptionSpec | NumberOptionSpec | StringOptionSpec;
32
+ export interface CommandSpec {
33
+ name: string;
34
+ description: string;
35
+ usage?: string;
36
+ options?: Readonly<Record<string, OptionSpec>>;
37
+ }
38
+ export interface ParsedCommand {
39
+ positionals: string[];
40
+ values: Record<string, OptionValue | undefined>;
41
+ }
42
+ /**
43
+ * Parse and validate a command from the same metadata used to render its help.
44
+ */
45
+ export declare function parseCommand(spec: CommandSpec, args: readonly string[]): ParsedCommand;
46
+ /**
47
+ * Render command help without loading a UI framework.
48
+ */
49
+ export declare function renderCommandHelp(spec: CommandSpec): string;
50
+ export {};
51
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../node/cli/spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,KAAK,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5C,UAAU,cAAc;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED,UAAU,iBAAkB,SAAQ,cAAc;IACjD,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,UAAU,gBAAiB,SAAQ,cAAc;IAChD,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,UAAU,gBAAiB,SAAQ,cAAc;IAChD,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAEhF,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAA;CAC/C;AAgBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAmCtF;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAiB3D"}