command-stream 0.8.2 → 0.9.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 (500) hide show
  1. package/js/examples/01-basic-streaming.mjs +14 -0
  2. package/js/examples/02-async-iterator.mjs +9 -0
  3. package/js/examples/03-file-and-console.mjs +16 -0
  4. package/js/examples/04-claude-jq-pipe.mjs +16 -0
  5. package/js/examples/CI-DEBUG-README.md +138 -0
  6. package/js/examples/README-examples.mjs +111 -0
  7. package/js/examples/README.md +345 -0
  8. package/js/examples/STREAMING_INTERFACES_SUMMARY.md +116 -0
  9. package/js/examples/add-test-timeouts.js +107 -0
  10. package/js/examples/ansi-default-preserved.mjs +11 -0
  11. package/js/examples/ansi-global-config.mjs +12 -0
  12. package/js/examples/ansi-reset-default.mjs +12 -0
  13. package/js/examples/ansi-strip-utils.mjs +12 -0
  14. package/js/examples/baseline-child-process.mjs +23 -0
  15. package/js/examples/baseline-claude-test.mjs +47 -0
  16. package/js/examples/baseline-working.mjs +34 -0
  17. package/js/examples/capture-mirror-comparison.mjs +23 -0
  18. package/js/examples/capture-mirror-default.mjs +11 -0
  19. package/js/examples/capture-mirror-performance.mjs +16 -0
  20. package/js/examples/capture-mirror-show-only.mjs +16 -0
  21. package/js/examples/capture-mirror-silent-processing.mjs +16 -0
  22. package/js/examples/ci-debug-baseline-vs-library.mjs +265 -0
  23. package/js/examples/ci-debug-es-module-loading.mjs +184 -0
  24. package/js/examples/ci-debug-signal-handling.mjs +225 -0
  25. package/js/examples/ci-debug-stdout-buffering.mjs +94 -0
  26. package/js/examples/ci-debug-test-timeouts.mjs +259 -0
  27. package/js/examples/claude-exact-file-output.mjs +20 -0
  28. package/js/examples/claude-exact-jq.mjs +13 -0
  29. package/js/examples/claude-exact-streaming.mjs +13 -0
  30. package/js/examples/claude-jq-pipeline.mjs +13 -0
  31. package/js/examples/claude-json-stream.mjs +39 -0
  32. package/js/examples/claude-streaming-basic.mjs +99 -0
  33. package/js/examples/claude-streaming-demo.mjs +126 -0
  34. package/js/examples/claude-streaming-final.mjs +20 -0
  35. package/js/examples/cleanup-verification-test.mjs +115 -0
  36. package/js/examples/colors-buffer-processing.mjs +14 -0
  37. package/js/examples/colors-default-preserved.mjs +15 -0
  38. package/js/examples/colors-per-command-config.mjs +15 -0
  39. package/js/examples/colors-strip-ansi.mjs +13 -0
  40. package/js/examples/commandstream-jq.mjs +29 -0
  41. package/js/examples/commandstream-working.mjs +23 -0
  42. package/js/examples/comprehensive-streams-demo.mjs +121 -0
  43. package/js/examples/ctrl-c-concurrent-processes.mjs +20 -0
  44. package/js/examples/ctrl-c-long-running-command.mjs +20 -0
  45. package/js/examples/ctrl-c-real-system-command.mjs +17 -0
  46. package/js/examples/ctrl-c-sleep-command.mjs +17 -0
  47. package/js/examples/ctrl-c-stdin-forwarding.mjs +20 -0
  48. package/js/examples/ctrl-c-virtual-command.mjs +17 -0
  49. package/js/examples/debug-already-started.mjs +20 -0
  50. package/js/examples/debug-ansi-processing.mjs +42 -0
  51. package/js/examples/debug-basic-streaming.mjs +44 -0
  52. package/js/examples/debug-buildshellcommand.mjs +82 -0
  53. package/js/examples/debug-child-process.mjs +43 -0
  54. package/js/examples/debug-child-state.mjs +55 -0
  55. package/js/examples/debug-chunking.mjs +38 -0
  56. package/js/examples/debug-command-parsing.mjs +61 -0
  57. package/js/examples/debug-complete-consolidation.mjs +97 -0
  58. package/js/examples/debug-echo-args.mjs +22 -0
  59. package/js/examples/debug-emit-timing.mjs +28 -0
  60. package/js/examples/debug-end-event.mjs +56 -0
  61. package/js/examples/debug-errexit.mjs +16 -0
  62. package/js/examples/debug-event-emission.mjs +40 -0
  63. package/js/examples/debug-event-timing.mjs +67 -0
  64. package/js/examples/debug-event-vs-result.mjs +30 -0
  65. package/js/examples/debug-exact-command.mjs +28 -0
  66. package/js/examples/debug-exact-test-scenario.mjs +44 -0
  67. package/js/examples/debug-execution-path.mjs +27 -0
  68. package/js/examples/debug-exit-command.mjs +38 -0
  69. package/js/examples/debug-exit-virtual.mjs +54 -0
  70. package/js/examples/debug-finish-consolidation.mjs +44 -0
  71. package/js/examples/debug-force-cleanup.mjs +47 -0
  72. package/js/examples/debug-getter-basic.mjs +13 -0
  73. package/js/examples/debug-getter-direct.mjs +23 -0
  74. package/js/examples/debug-getter-internals.mjs +61 -0
  75. package/js/examples/debug-handler-detection.mjs +65 -0
  76. package/js/examples/debug-idempotent-finish.mjs +54 -0
  77. package/js/examples/debug-idempotent-kill.mjs +58 -0
  78. package/js/examples/debug-interpolation-individual.mjs +88 -0
  79. package/js/examples/debug-interpolation-issue.mjs +101 -0
  80. package/js/examples/debug-jq-streaming.mjs +57 -0
  81. package/js/examples/debug-jq-tty-colors.mjs +168 -0
  82. package/js/examples/debug-kill-cleanup.mjs +56 -0
  83. package/js/examples/debug-kill-method.mjs +33 -0
  84. package/js/examples/debug-listener-interference.mjs +38 -0
  85. package/js/examples/debug-listener-lifecycle.mjs +50 -0
  86. package/js/examples/debug-listener-timing.mjs +62 -0
  87. package/js/examples/debug-listeners-property.mjs +34 -0
  88. package/js/examples/debug-map-methods.mjs +39 -0
  89. package/js/examples/debug-not-awaited-cleanup.mjs +106 -0
  90. package/js/examples/debug-off-method.mjs +28 -0
  91. package/js/examples/debug-option-merging.mjs +17 -0
  92. package/js/examples/debug-options.mjs +36 -0
  93. package/js/examples/debug-output.mjs +25 -0
  94. package/js/examples/debug-pattern-matching.mjs +69 -0
  95. package/js/examples/debug-pipeline-cat.mjs +28 -0
  96. package/js/examples/debug-pipeline-cleanup.mjs +71 -0
  97. package/js/examples/debug-pipeline-error-detailed.mjs +78 -0
  98. package/js/examples/debug-pipeline-error.mjs +65 -0
  99. package/js/examples/debug-pipeline-issue.mjs +26 -0
  100. package/js/examples/debug-pipeline-method.mjs +22 -0
  101. package/js/examples/debug-pipeline-stream.mjs +66 -0
  102. package/js/examples/debug-pipeline.mjs +14 -0
  103. package/js/examples/debug-process-exit-trace.mjs +41 -0
  104. package/js/examples/debug-process-path.mjs +38 -0
  105. package/js/examples/debug-property-check.mjs +29 -0
  106. package/js/examples/debug-resource-cleanup.mjs +83 -0
  107. package/js/examples/debug-shell-args.mjs +103 -0
  108. package/js/examples/debug-sigint-child-handler.mjs +44 -0
  109. package/js/examples/debug-sigint-forwarding.mjs +61 -0
  110. package/js/examples/debug-sigint-handler-install.mjs +79 -0
  111. package/js/examples/debug-sigint-handler-order.mjs +85 -0
  112. package/js/examples/debug-sigint-listeners.mjs +48 -0
  113. package/js/examples/debug-sigint-start-pattern.mjs +62 -0
  114. package/js/examples/debug-sigint-timer.mjs +40 -0
  115. package/js/examples/debug-simple-command.mjs +49 -0
  116. package/js/examples/debug-simple-getter.mjs +30 -0
  117. package/js/examples/debug-simple.mjs +39 -0
  118. package/js/examples/debug-simplified-finished.mjs +102 -0
  119. package/js/examples/debug-stack-overflow.mjs +25 -0
  120. package/js/examples/debug-stdin-simple.mjs +28 -0
  121. package/js/examples/debug-stdin.mjs +28 -0
  122. package/js/examples/debug-stream-emitter-isolated.mjs +45 -0
  123. package/js/examples/debug-stream-emitter.mjs +25 -0
  124. package/js/examples/debug-stream-events.mjs +70 -0
  125. package/js/examples/debug-stream-generator.mjs +23 -0
  126. package/js/examples/debug-stream-getter-issue.mjs +37 -0
  127. package/js/examples/debug-stream-getter.mjs +19 -0
  128. package/js/examples/debug-stream-internals.mjs +64 -0
  129. package/js/examples/debug-stream-method.mjs +46 -0
  130. package/js/examples/debug-stream-object.mjs +58 -0
  131. package/js/examples/debug-stream-properties.mjs +37 -0
  132. package/js/examples/debug-stream-timing.mjs +28 -0
  133. package/js/examples/debug-streaming.mjs +24 -0
  134. package/js/examples/debug-test-isolation.mjs +54 -0
  135. package/js/examples/debug-test-state.mjs +27 -0
  136. package/js/examples/debug-user-sigint.mjs +19 -0
  137. package/js/examples/debug-virtual-disable.mjs +21 -0
  138. package/js/examples/debug-virtual-vs-real.mjs +68 -0
  139. package/js/examples/debug-with-trace.mjs +23 -0
  140. package/js/examples/debug_parent_stream.mjs +22 -0
  141. package/js/examples/emulate-claude-stream.mjs +30 -0
  142. package/js/examples/emulated-streaming-direct.mjs +22 -0
  143. package/js/examples/emulated-streaming-jq-pipe.mjs +22 -0
  144. package/js/examples/emulated-streaming-sh-pipe.mjs +23 -0
  145. package/js/examples/events-build-process.mjs +73 -0
  146. package/js/examples/events-concurrent-streams.mjs +51 -0
  147. package/js/examples/events-error-handling.mjs +59 -0
  148. package/js/examples/events-file-monitoring.mjs +66 -0
  149. package/js/examples/events-interactive-simulation.mjs +69 -0
  150. package/js/examples/events-log-processing.mjs +72 -0
  151. package/js/examples/events-network-monitoring.mjs +68 -0
  152. package/js/examples/events-ping-basic.mjs +37 -0
  153. package/js/examples/events-progress-tracking.mjs +55 -0
  154. package/js/examples/events-stdin-input.mjs +34 -0
  155. package/js/examples/example-ansi-ls.mjs +39 -0
  156. package/js/examples/example-top.mjs +27 -0
  157. package/js/examples/final-ping-stdin-proof.mjs +88 -0
  158. package/js/examples/final-test-shell-operators.mjs +123 -0
  159. package/js/examples/final-working-examples.mjs +162 -0
  160. package/js/examples/gh-auth-test.mjs +103 -0
  161. package/js/examples/gh-delete-hang-test.mjs +79 -0
  162. package/js/examples/gh-gist-creation-test.mjs +276 -0
  163. package/js/examples/gh-gist-minimal-test.mjs +89 -0
  164. package/js/examples/gh-hang-exact-original.mjs +83 -0
  165. package/js/examples/gh-hang-reproduction.mjs +151 -0
  166. package/js/examples/gh-hang-test-with-redirect.mjs +45 -0
  167. package/js/examples/gh-hang-test-without-redirect.mjs +43 -0
  168. package/js/examples/gh-minimal-hang-check.mjs +33 -0
  169. package/js/examples/gh-operations-with-cd.mjs +187 -0
  170. package/js/examples/gh-output-test.mjs +102 -0
  171. package/js/examples/gh-reproduce-hang.mjs +41 -0
  172. package/js/examples/git-operations-with-cd.mjs +186 -0
  173. package/js/examples/interactive-math-calc.mjs +45 -0
  174. package/js/examples/interactive-top-fixed.mjs +25 -0
  175. package/js/examples/interactive-top-improved.mjs +72 -0
  176. package/js/examples/interactive-top-pty-logging.mjs +69 -0
  177. package/js/examples/interactive-top-pty.mjs +27 -0
  178. package/js/examples/interactive-top-with-logging.mjs +56 -0
  179. package/js/examples/interactive-top.mjs +29 -0
  180. package/js/examples/jq-color-demo.mjs +53 -0
  181. package/js/examples/jq-colors-streaming.mjs +42 -0
  182. package/js/examples/manual-ctrl-c-test.mjs +50 -0
  183. package/js/examples/methods-multiple-options.mjs +25 -0
  184. package/js/examples/methods-run-basic.mjs +10 -0
  185. package/js/examples/methods-start-basic.mjs +10 -0
  186. package/js/examples/node-compat-data-events.mjs +36 -0
  187. package/js/examples/node-compat-readable-event.mjs +29 -0
  188. package/js/examples/node-compat-small-buffer.mjs +33 -0
  189. package/js/examples/options-capture-false.mjs +12 -0
  190. package/js/examples/options-combined-settings.mjs +13 -0
  191. package/js/examples/options-custom-input.mjs +16 -0
  192. package/js/examples/options-default-behavior.mjs +10 -0
  193. package/js/examples/options-maximum-performance.mjs +15 -0
  194. package/js/examples/options-mirror-false.mjs +10 -0
  195. package/js/examples/options-performance-mode.mjs +13 -0
  196. package/js/examples/options-performance-optimization.mjs +14 -0
  197. package/js/examples/options-run-alias-demo.mjs +15 -0
  198. package/js/examples/options-run-alias.mjs +10 -0
  199. package/js/examples/options-silent-execution.mjs +14 -0
  200. package/js/examples/options-streaming-capture.mjs +24 -0
  201. package/js/examples/options-streaming-multiple.mjs +35 -0
  202. package/js/examples/options-streaming-silent.mjs +21 -0
  203. package/js/examples/options-streaming-stdin.mjs +21 -0
  204. package/js/examples/ping-streaming-filtered.mjs +22 -0
  205. package/js/examples/ping-streaming-interruptible.mjs +47 -0
  206. package/js/examples/ping-streaming-silent.mjs +24 -0
  207. package/js/examples/ping-streaming-simple.mjs +13 -0
  208. package/js/examples/ping-streaming-statistics.mjs +49 -0
  209. package/js/examples/ping-streaming-timestamps.mjs +22 -0
  210. package/js/examples/ping-streaming.mjs +48 -0
  211. package/js/examples/prove-ping-stdin-limitation.mjs +94 -0
  212. package/js/examples/readme-example.mjs +39 -0
  213. package/js/examples/realtime-json-stream.mjs +143 -0
  214. package/js/examples/reliable-stdin-commands.mjs +135 -0
  215. package/js/examples/reproduce-issue-135-v2.mjs +15 -0
  216. package/js/examples/reproduce-issue-135.mjs +17 -0
  217. package/js/examples/shell-cd-behavior.mjs +88 -0
  218. package/js/examples/sigint-forwarding-test.mjs +60 -0
  219. package/js/examples/sigint-handler-test.mjs +72 -0
  220. package/js/examples/simple-async-test.mjs +49 -0
  221. package/js/examples/simple-claude-test.mjs +17 -0
  222. package/js/examples/simple-event-test.mjs +33 -0
  223. package/js/examples/simple-jq-streaming.mjs +48 -0
  224. package/js/examples/simple-stream-demo.mjs +35 -0
  225. package/js/examples/simple-test-sleep.js +30 -0
  226. package/js/examples/simple-working-stdin.mjs +30 -0
  227. package/js/examples/streaming-behavior-test.mjs +116 -0
  228. package/js/examples/streaming-direct-command.mjs +21 -0
  229. package/js/examples/streaming-filtered-output.mjs +33 -0
  230. package/js/examples/streaming-grep-pipeline.mjs +21 -0
  231. package/js/examples/streaming-interactive-stdin.mjs +24 -0
  232. package/js/examples/streaming-jq-pipeline.mjs +23 -0
  233. package/js/examples/streaming-multistage-pipeline.mjs +23 -0
  234. package/js/examples/streaming-pipes-event-pattern.mjs +27 -0
  235. package/js/examples/streaming-pipes-multistage.mjs +22 -0
  236. package/js/examples/streaming-pipes-realtime-jq.mjs +23 -0
  237. package/js/examples/streaming-progress-tracking.mjs +34 -0
  238. package/js/examples/streaming-reusable-configs.mjs +52 -0
  239. package/js/examples/streaming-silent-capture.mjs +20 -0
  240. package/js/examples/streaming-test-simple.mjs +70 -0
  241. package/js/examples/streaming-virtual-pipeline.mjs +18 -0
  242. package/js/examples/syntax-basic-comparison.mjs +31 -0
  243. package/js/examples/syntax-basic-options.mjs +12 -0
  244. package/js/examples/syntax-combined-options.mjs +19 -0
  245. package/js/examples/syntax-command-chaining.mjs +12 -0
  246. package/js/examples/syntax-custom-directory.mjs +10 -0
  247. package/js/examples/syntax-custom-environment.mjs +13 -0
  248. package/js/examples/syntax-custom-stdin.mjs +10 -0
  249. package/js/examples/syntax-mixed-regular.mjs +11 -0
  250. package/js/examples/syntax-mixed-usage.mjs +15 -0
  251. package/js/examples/syntax-multiple-listeners.mjs +87 -0
  252. package/js/examples/syntax-piping-comparison.mjs +32 -0
  253. package/js/examples/syntax-reusable-config.mjs +16 -0
  254. package/js/examples/syntax-reusable-configs.mjs +21 -0
  255. package/js/examples/syntax-silent-operations.mjs +10 -0
  256. package/js/examples/syntax-stdin-option.mjs +12 -0
  257. package/js/examples/temp-sigint-test.mjs +21 -0
  258. package/js/examples/test-actual-buildshell.mjs +44 -0
  259. package/js/examples/test-async-streams-working.mjs +102 -0
  260. package/js/examples/test-async-streams.mjs +90 -0
  261. package/js/examples/test-auth-parse.mjs +74 -0
  262. package/js/examples/test-auto-quoting.mjs +57 -0
  263. package/js/examples/test-auto-start-fix.mjs +95 -0
  264. package/js/examples/test-baseline-sigint.mjs +38 -0
  265. package/js/examples/test-buffer-behavior.mjs +39 -0
  266. package/js/examples/test-buffers-simple.mjs +35 -0
  267. package/js/examples/test-bun-specific-issue.mjs +106 -0
  268. package/js/examples/test-bun-streaming.mjs +81 -0
  269. package/js/examples/test-cat-direct.mjs +41 -0
  270. package/js/examples/test-cat-pipe.mjs +34 -0
  271. package/js/examples/test-cd-behavior.mjs +42 -0
  272. package/js/examples/test-child-process-timing.mjs +53 -0
  273. package/js/examples/test-child-sigint-handler.mjs +62 -0
  274. package/js/examples/test-cleanup-simple.mjs +21 -0
  275. package/js/examples/test-comprehensive-tracing.mjs +58 -0
  276. package/js/examples/test-correct-space-handling.mjs +46 -0
  277. package/js/examples/test-ctrl-c-debug.mjs +44 -0
  278. package/js/examples/test-ctrl-c-inherit.mjs +30 -0
  279. package/js/examples/test-ctrl-c-sleep.mjs +31 -0
  280. package/js/examples/test-ctrl-c.mjs +17 -0
  281. package/js/examples/test-debug-new-options.mjs +55 -0
  282. package/js/examples/test-debug-pty.mjs +49 -0
  283. package/js/examples/test-debug-tee.mjs +38 -0
  284. package/js/examples/test-debug.mjs +25 -0
  285. package/js/examples/test-direct-jq.mjs +47 -0
  286. package/js/examples/test-direct-pipe-reading.mjs +119 -0
  287. package/js/examples/test-direct-pipe.sh +28 -0
  288. package/js/examples/test-double-quoting-prevention.mjs +138 -0
  289. package/js/examples/test-edge-cases-quoting.mjs +89 -0
  290. package/js/examples/test-events.mjs +37 -0
  291. package/js/examples/test-explicit-stdio.mjs +51 -0
  292. package/js/examples/test-final-streaming.mjs +71 -0
  293. package/js/examples/test-fix.mjs +71 -0
  294. package/js/examples/test-incremental-streaming.mjs +46 -0
  295. package/js/examples/test-individual-spawn.mjs +35 -0
  296. package/js/examples/test-inherit-stdout-not-stdin.mjs +133 -0
  297. package/js/examples/test-injection-protection.mjs +77 -0
  298. package/js/examples/test-interactive-streaming.mjs +140 -0
  299. package/js/examples/test-interactive-top.md +24 -0
  300. package/js/examples/test-interactive.mjs +17 -0
  301. package/js/examples/test-interpolation.mjs +14 -0
  302. package/js/examples/test-interrupt.mjs +40 -0
  303. package/js/examples/test-issue-135-comprehensive.mjs +41 -0
  304. package/js/examples/test-issue12-detailed.mjs +89 -0
  305. package/js/examples/test-issue12-exact.mjs +33 -0
  306. package/js/examples/test-jq-color.mjs +57 -0
  307. package/js/examples/test-jq-colors.mjs +41 -0
  308. package/js/examples/test-jq-compact.mjs +33 -0
  309. package/js/examples/test-jq-native.sh +10 -0
  310. package/js/examples/test-jq-pipeline-behavior.mjs +80 -0
  311. package/js/examples/test-jq-realtime.mjs +40 -0
  312. package/js/examples/test-manual-start.mjs +54 -0
  313. package/js/examples/test-mixed-quoting.mjs +88 -0
  314. package/js/examples/test-multi-stream.mjs +50 -0
  315. package/js/examples/test-multistage-debug.mjs +44 -0
  316. package/js/examples/test-native-spawn-vs-command-stream.mjs +154 -0
  317. package/js/examples/test-no-parse-pipeline.mjs +33 -0
  318. package/js/examples/test-non-virtual.mjs +52 -0
  319. package/js/examples/test-operators.mjs +53 -0
  320. package/js/examples/test-parent-continues.mjs +44 -0
  321. package/js/examples/test-path-interpolation.mjs +86 -0
  322. package/js/examples/test-ping-kill-and-stdin.mjs +98 -0
  323. package/js/examples/test-ping.mjs +12 -0
  324. package/js/examples/test-pty-spawn.mjs +101 -0
  325. package/js/examples/test-pty.mjs +38 -0
  326. package/js/examples/test-quote-behavior-summary.mjs +110 -0
  327. package/js/examples/test-quote-edge-cases.mjs +69 -0
  328. package/js/examples/test-quote-parsing.mjs +23 -0
  329. package/js/examples/test-raw-function.mjs +153 -0
  330. package/js/examples/test-raw-streaming.mjs +47 -0
  331. package/js/examples/test-readme-examples.mjs +142 -0
  332. package/js/examples/test-real-cat.mjs +28 -0
  333. package/js/examples/test-real-commands.mjs +21 -0
  334. package/js/examples/test-real-shell.mjs +31 -0
  335. package/js/examples/test-real-stdin-commands.mjs +160 -0
  336. package/js/examples/test-runner-batched.mjs +98 -0
  337. package/js/examples/test-runner-simple.mjs +80 -0
  338. package/js/examples/test-runner.mjs +67 -0
  339. package/js/examples/test-scope-parse.mjs +31 -0
  340. package/js/examples/test-sh-pipeline.mjs +24 -0
  341. package/js/examples/test-shell-detection.mjs +71 -0
  342. package/js/examples/test-shell-parser.mjs +37 -0
  343. package/js/examples/test-sigint-behavior.mjs +241 -0
  344. package/js/examples/test-sigint-handling.sh +14 -0
  345. package/js/examples/test-simple-pipe.mjs +12 -0
  346. package/js/examples/test-simple-streaming.mjs +32 -0
  347. package/js/examples/test-sleep-stdin.js +27 -0
  348. package/js/examples/test-sleep.mjs +56 -0
  349. package/js/examples/test-smart-quoting.mjs +180 -0
  350. package/js/examples/test-spaces-in-path.mjs +48 -0
  351. package/js/examples/test-special-chars-quoting.mjs +54 -0
  352. package/js/examples/test-stdin-after-start.mjs +39 -0
  353. package/js/examples/test-stdin-simple.mjs +67 -0
  354. package/js/examples/test-stdin-timing.mjs +74 -0
  355. package/js/examples/test-stdio-combinations.mjs +124 -0
  356. package/js/examples/test-stream-access.mjs +84 -0
  357. package/js/examples/test-stream-cleanup.mjs +27 -0
  358. package/js/examples/test-stream-readers.mjs +152 -0
  359. package/js/examples/test-streaming-final.mjs +57 -0
  360. package/js/examples/test-streaming-interfaces.mjs +141 -0
  361. package/js/examples/test-streaming-timing.mjs +27 -0
  362. package/js/examples/test-streaming.mjs +32 -0
  363. package/js/examples/test-streams-stdin-comprehensive.mjs +134 -0
  364. package/js/examples/test-streams-stdin-ctrl-c.mjs +96 -0
  365. package/js/examples/test-template-literal.mjs +26 -0
  366. package/js/examples/test-template-vs-interpolation.mjs +49 -0
  367. package/js/examples/test-timing.mjs +41 -0
  368. package/js/examples/test-top-inherit-stdout-stdin-control.mjs +123 -0
  369. package/js/examples/test-top-quit-stdin.mjs +118 -0
  370. package/js/examples/test-trace-option.mjs +21 -0
  371. package/js/examples/test-user-double-quotes.mjs +36 -0
  372. package/js/examples/test-user-single-quotes.mjs +36 -0
  373. package/js/examples/test-verbose.mjs +18 -0
  374. package/js/examples/test-verbose2.mjs +32 -0
  375. package/js/examples/test-virtual-streaming.mjs +125 -0
  376. package/js/examples/test-waiting-command.mjs +52 -0
  377. package/js/examples/test-waiting-commands.mjs +83 -0
  378. package/js/examples/test-watch-mode.mjs +104 -0
  379. package/js/examples/test-yes-cancellation.mjs +26 -0
  380. package/js/examples/test-yes-detailed.mjs +58 -0
  381. package/js/examples/test-yes-trace.mjs +28 -0
  382. package/js/examples/trace-abort-controller.mjs +30 -0
  383. package/js/examples/trace-error-handling.mjs +22 -0
  384. package/js/examples/trace-pipeline-command.mjs +22 -0
  385. package/js/examples/trace-signal-handling.mjs +35 -0
  386. package/js/examples/trace-simple-command.mjs +18 -0
  387. package/js/examples/trace-stderr-output.mjs +22 -0
  388. package/js/examples/verify-fix-both-runtimes.mjs +73 -0
  389. package/js/examples/verify-issue12-fixed.mjs +78 -0
  390. package/js/examples/which-command-common-commands.mjs +19 -0
  391. package/js/examples/which-command-gh-test.mjs +23 -0
  392. package/js/examples/which-command-nonexistent.mjs +20 -0
  393. package/js/examples/which-command-system-comparison.mjs +28 -0
  394. package/js/examples/working-example.mjs +13 -0
  395. package/js/examples/working-stdin-examples.mjs +138 -0
  396. package/js/examples/working-streaming-demo.mjs +49 -0
  397. package/{src → js/src}/$.mjs +20 -4
  398. package/{src → js/src}/$.utils.mjs +14 -2
  399. package/js/tests/$.features.test.mjs +283 -0
  400. package/js/tests/$.test.mjs +935 -0
  401. package/js/tests/builtin-commands.test.mjs +387 -0
  402. package/js/tests/bun-shell-path-fix.test.mjs +115 -0
  403. package/js/tests/bun.features.test.mjs +189 -0
  404. package/js/tests/cd-virtual-command.test.mjs +622 -0
  405. package/js/tests/cleanup-verification.test.mjs +127 -0
  406. package/js/tests/ctrl-c-baseline.test.mjs +207 -0
  407. package/js/tests/ctrl-c-basic.test.mjs +220 -0
  408. package/js/tests/ctrl-c-library.test.mjs +197 -0
  409. package/js/tests/ctrl-c-signal.test.mjs +915 -0
  410. package/js/tests/examples.test.mjs +252 -0
  411. package/js/tests/execa.features.test.mjs +198 -0
  412. package/js/tests/gh-commands.test.mjs +164 -0
  413. package/js/tests/gh-gist-operations.test.mjs +221 -0
  414. package/js/tests/git-gh-cd.test.mjs +466 -0
  415. package/js/tests/interactive-option.test.mjs +114 -0
  416. package/js/tests/interactive-streaming.test.mjs +307 -0
  417. package/js/tests/issue-135-final.test.mjs +58 -0
  418. package/js/tests/jq-color-behavior.test.mjs +140 -0
  419. package/js/tests/jq.test.mjs +318 -0
  420. package/js/tests/options-examples.test.mjs +106 -0
  421. package/js/tests/options-syntax.test.mjs +112 -0
  422. package/js/tests/path-interpolation.test.mjs +412 -0
  423. package/js/tests/pipe.test.mjs +291 -0
  424. package/js/tests/raw-function.test.mjs +266 -0
  425. package/js/tests/readme-examples.test.mjs +427 -0
  426. package/js/tests/resource-cleanup-internals.test.mjs +669 -0
  427. package/js/tests/shell-settings.test.mjs +279 -0
  428. package/js/tests/sigint-cleanup-isolated.test.mjs +151 -0
  429. package/js/tests/sigint-cleanup.test.mjs +118 -0
  430. package/js/tests/start-run-edge-cases.test.mjs +152 -0
  431. package/js/tests/start-run-options.test.mjs +181 -0
  432. package/js/tests/stderr-output-handling.test.mjs +279 -0
  433. package/js/tests/streaming-interfaces.test.mjs +194 -0
  434. package/js/tests/sync.test.mjs +297 -0
  435. package/js/tests/system-pipe.test.mjs +226 -0
  436. package/js/tests/test-cleanup.mjs +200 -0
  437. package/js/tests/test-helper-fixed.mjs +148 -0
  438. package/js/tests/test-helper-v2.mjs +118 -0
  439. package/js/tests/test-helper.mjs +171 -0
  440. package/js/tests/test-sigint-child.js +15 -0
  441. package/js/tests/text-method.test.mjs +225 -0
  442. package/js/tests/virtual.test.mjs +364 -0
  443. package/js/tests/yes-command-cleanup.test.mjs +208 -0
  444. package/js/tests/zx.features.test.mjs +233 -0
  445. package/package.json +13 -12
  446. package/rust/Cargo.lock +947 -0
  447. package/rust/Cargo.toml +47 -0
  448. package/rust/src/commands/basename.rs +69 -0
  449. package/rust/src/commands/cat.rs +123 -0
  450. package/rust/src/commands/cd.rs +67 -0
  451. package/rust/src/commands/cp.rs +187 -0
  452. package/rust/src/commands/dirname.rs +57 -0
  453. package/rust/src/commands/echo.rs +73 -0
  454. package/rust/src/commands/env.rs +33 -0
  455. package/rust/src/commands/exit.rs +36 -0
  456. package/rust/src/commands/false.rs +24 -0
  457. package/rust/src/commands/ls.rs +182 -0
  458. package/rust/src/commands/mkdir.rs +98 -0
  459. package/rust/src/commands/mod.rs +200 -0
  460. package/rust/src/commands/mv.rs +180 -0
  461. package/rust/src/commands/pwd.rs +28 -0
  462. package/rust/src/commands/rm.rs +150 -0
  463. package/rust/src/commands/seq.rs +179 -0
  464. package/rust/src/commands/sleep.rs +97 -0
  465. package/rust/src/commands/test.rs +204 -0
  466. package/rust/src/commands/touch.rs +99 -0
  467. package/rust/src/commands/true.rs +24 -0
  468. package/rust/src/commands/which.rs +87 -0
  469. package/rust/src/commands/yes.rs +99 -0
  470. package/rust/src/lib.rs +492 -0
  471. package/rust/src/main.rs +37 -0
  472. package/rust/src/shell_parser.rs +565 -0
  473. package/rust/src/utils.rs +335 -0
  474. package/rust/tests/builtin_commands.rs +549 -0
  475. package/rust/tests/process_runner.rs +286 -0
  476. package/rust/tests/shell_parser.rs +296 -0
  477. package/rust/tests/utils.rs +282 -0
  478. package/rust/tests/virtual_commands.rs +199 -0
  479. /package/{src → js/src}/commands/$.basename.mjs +0 -0
  480. /package/{src → js/src}/commands/$.cat.mjs +0 -0
  481. /package/{src → js/src}/commands/$.cd.mjs +0 -0
  482. /package/{src → js/src}/commands/$.cp.mjs +0 -0
  483. /package/{src → js/src}/commands/$.dirname.mjs +0 -0
  484. /package/{src → js/src}/commands/$.echo.mjs +0 -0
  485. /package/{src → js/src}/commands/$.env.mjs +0 -0
  486. /package/{src → js/src}/commands/$.exit.mjs +0 -0
  487. /package/{src → js/src}/commands/$.false.mjs +0 -0
  488. /package/{src → js/src}/commands/$.ls.mjs +0 -0
  489. /package/{src → js/src}/commands/$.mkdir.mjs +0 -0
  490. /package/{src → js/src}/commands/$.mv.mjs +0 -0
  491. /package/{src → js/src}/commands/$.pwd.mjs +0 -0
  492. /package/{src → js/src}/commands/$.rm.mjs +0 -0
  493. /package/{src → js/src}/commands/$.seq.mjs +0 -0
  494. /package/{src → js/src}/commands/$.sleep.mjs +0 -0
  495. /package/{src → js/src}/commands/$.test.mjs +0 -0
  496. /package/{src → js/src}/commands/$.touch.mjs +0 -0
  497. /package/{src → js/src}/commands/$.true.mjs +0 -0
  498. /package/{src → js/src}/commands/$.which.mjs +0 -0
  499. /package/{src → js/src}/commands/$.yes.mjs +0 -0
  500. /package/{src → js/src}/shell-parser.mjs +0 -0
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Simple async streams test ===');
6
+
7
+ async function simpleAsyncTest() {
8
+ try {
9
+ console.log('Test 1: bc calculator with await');
10
+
11
+ const bcCmd = $`bc -l`;
12
+ console.log('Awaiting stdin...');
13
+
14
+ const stdin = await bcCmd.streams.stdin;
15
+ console.log('Stdin available:', !!stdin);
16
+
17
+ if (stdin) {
18
+ console.log('Writing to stdin...');
19
+ stdin.write('2 + 3\\n');
20
+ stdin.write('quit\\n');
21
+ } else {
22
+ console.log('No stdin, killing process');
23
+ bcCmd.kill();
24
+ }
25
+
26
+ const result = await bcCmd;
27
+ console.log('Result:', JSON.stringify(result.stdout));
28
+ console.log('Exit code:', result.code);
29
+
30
+ console.log('\\nTest 2: cat with await');
31
+
32
+ const catCmd = $`cat`;
33
+ const catStdin = await catCmd.streams.stdin;
34
+ console.log('Cat stdin available:', !!catStdin);
35
+
36
+ if (catStdin) {
37
+ catStdin.write('Hello cat!\\n');
38
+ catStdin.end();
39
+ }
40
+
41
+ const catResult = await catCmd;
42
+ console.log('Cat result:', JSON.stringify(catResult.stdout));
43
+ } catch (error) {
44
+ console.error('Error:', error.message);
45
+ console.error(error.stack);
46
+ }
47
+ }
48
+
49
+ simpleAsyncTest();
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ // Simple Claude test with command-stream
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Simple Claude test with command-stream ===');
6
+
7
+ let chunkCount = 0;
8
+
9
+ $`claude hi`
10
+ .on('data', (chunk) => {
11
+ chunkCount++;
12
+ console.log(`Stream chunk ${chunkCount}:`, chunk.data.toString());
13
+ })
14
+ .on('end', (result) => {
15
+ console.log(`Command-stream: ${chunkCount} chunks, exit: ${result.code}`);
16
+ })
17
+ .start();
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('🧪 Simple event test');
6
+
7
+ // First test with a command we know works
8
+ $`echo "test"`
9
+ .on('data', (chunk) =>
10
+ console.log('Echo chunk:', chunk.data.toString().trim())
11
+ )
12
+ .on('end', (result) => {
13
+ console.log(`Echo done: ${result.code}`);
14
+
15
+ // Now test Claude
16
+ console.log('\n🤖 Testing Claude...');
17
+ const claude = 'claude';
18
+
19
+ $`${claude} -p "hi" --output-format stream-json --verbose --model sonnet`
20
+ .on('data', (chunk) => {
21
+ console.log('Claude chunk:', chunk.data.toString());
22
+ })
23
+ .on('end', (result) => {
24
+ console.log('Claude done:', result.code);
25
+ process.exit(0);
26
+ })
27
+ .on('error', (error) => {
28
+ console.log('Claude error:', error);
29
+ process.exit(1);
30
+ })
31
+ .start();
32
+ })
33
+ .start();
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Simple jq Streaming Test ===\n');
6
+
7
+ // Test 1: Basic JSON streaming through jq
8
+ console.log('Test 1: Basic JSON streaming with delays:');
9
+ const startTime = Date.now();
10
+
11
+ const cmd = $`sh -c 'echo "{\\"id\\":1}"; sleep 0.5; echo "{\\"id\\":2}"; sleep 0.5; echo "{\\"id\\":3}"' | jq -c .`;
12
+
13
+ let buffer = '';
14
+ for await (const chunk of cmd.stream()) {
15
+ if (chunk.type === 'stdout') {
16
+ const elapsed = Date.now() - startTime;
17
+ buffer += chunk.data.toString();
18
+
19
+ const lines = buffer.split('\n');
20
+ buffer = lines.pop() || '';
21
+
22
+ for (const line of lines) {
23
+ if (line.trim()) {
24
+ console.log(`[${elapsed}ms] Got JSON:`, line.trim());
25
+ }
26
+ }
27
+ }
28
+ }
29
+
30
+ console.log('✅ Streaming completed successfully!\n');
31
+
32
+ // Test 2: Multiple JSON objects at once
33
+ console.log('Test 2: Multiple JSON objects filtered by jq:');
34
+ const filterCmd = $`printf '{"type":"info","msg":"Hello"}\n{"type":"error","msg":"Failed"}\n{"type":"info","msg":"Done"}\n' | jq -c 'select(.type == "error")'`;
35
+
36
+ const result = await filterCmd;
37
+ console.log('Filtered result:', result.stdout.trim());
38
+ console.log('✅ Filtering works!\n');
39
+
40
+ // Test 3: Transform JSON stream
41
+ console.log('Test 3: Transform JSON stream in realtime:');
42
+ const transformCmd = $`printf '{"name":"Alice","age":30}\n{"name":"Bob","age":25}\n' | jq -c '{user: .name, years: .age}'`;
43
+
44
+ const transformResult = await transformCmd;
45
+ console.log('Transformed results:');
46
+ console.log(transformResult.stdout.trim().split('\n').join('\n'));
47
+
48
+ console.log('\n🎉 All tests passed! JSON streaming with jq works!');
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing simple streaming without jq...\n');
6
+
7
+ // First test: direct echo with delays
8
+ const startTime = Date.now();
9
+ const cmd = $`sh -c 'echo "line1"; sleep 0.5; echo "line2"; sleep 0.5; echo "line3"'`;
10
+
11
+ console.log('Starting stream...');
12
+
13
+ for await (const chunk of cmd.stream()) {
14
+ if (chunk.type === 'stdout') {
15
+ const elapsed = Date.now() - startTime;
16
+ console.log(`[${elapsed}ms] Got:`, chunk.data.toString().trim());
17
+ }
18
+ }
19
+
20
+ console.log('\nNow testing with jq...');
21
+
22
+ // Now test with jq
23
+ const startTime2 = Date.now();
24
+ const cmd2 = $`echo '{"id":1}'`.pipe($`jq -c .`);
25
+
26
+ console.log('Starting jq stream...');
27
+
28
+ for await (const chunk of cmd2.stream()) {
29
+ if (chunk.type === 'stdout') {
30
+ const elapsed = Date.now() - startTime2;
31
+ console.log(`[${elapsed}ms] Got from jq:`, chunk.data.toString().trim());
32
+ }
33
+ }
34
+
35
+ console.log('\nTest complete');
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Simple test script for CI without ES module dependencies
4
+ console.log('STARTING_SLEEP');
5
+ console.error('[simple-test-sleep] Process started, PID:', process.pid);
6
+ console.error('[simple-test-sleep] Node version:', process.version);
7
+
8
+ // Force flush stdout in non-TTY environments
9
+ if (process.stdout.isTTY === false) {
10
+ process.stdout.write('', () => {
11
+ console.error('[simple-test-sleep] Stdout flushed');
12
+ });
13
+ }
14
+
15
+ // Set up SIGINT handler
16
+ process.on('SIGINT', () => {
17
+ console.error('[simple-test-sleep] Received SIGINT');
18
+ process.exit(130);
19
+ });
20
+
21
+ // Simple sleep using setTimeout
22
+ console.error('[simple-test-sleep] Starting 30 second sleep');
23
+ setTimeout(() => {
24
+ console.log('SLEEP_COMPLETED');
25
+ console.error('[simple-test-sleep] Sleep completed');
26
+ process.exit(0);
27
+ }, 30000);
28
+
29
+ // Keep process alive
30
+ process.stdin.resume();
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ async function simpleWorkingStdin() {
6
+ console.log('Simple working stdin test');
7
+
8
+ // Example 1: Basic approach with manual timing
9
+ const cmd = $`cat`;
10
+
11
+ // Trigger start
12
+ cmd.streams.stdout;
13
+
14
+ // Wait for process to spawn
15
+ await new Promise((resolve) => setTimeout(resolve, 100));
16
+
17
+ // Now get stdin
18
+ const stdin = cmd.streams.stdin;
19
+ console.log('Stdin available?', !!stdin);
20
+
21
+ if (stdin) {
22
+ stdin.write('Hello!\\n');
23
+ stdin.end();
24
+ }
25
+
26
+ const result = await cmd;
27
+ console.log('Result:', result.stdout);
28
+ }
29
+
30
+ simpleWorkingStdin().catch(console.error);
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $, register } from '../src/$.mjs';
4
+
5
+ console.log('=== Comprehensive Streaming Behavior Test ===\n');
6
+ console.log(
7
+ 'This test demonstrates streaming behavior in different scenarios.\n'
8
+ );
9
+
10
+ // Register a streaming virtual command
11
+ register('delay-echo', async function* (args) {
12
+ const items = args[0] ? args[0].split(',') : ['1', '2', '3'];
13
+ const delay = parseInt(args[1] || '300');
14
+
15
+ for (let i = 0; i < items.length; i++) {
16
+ yield `${items[i]}\n`;
17
+ if (i < items.length - 1) {
18
+ await new Promise((resolve) => setTimeout(resolve, delay));
19
+ }
20
+ }
21
+ });
22
+
23
+ async function runTest(name, command, description) {
24
+ console.log(`\n${name}`);
25
+ console.log(`${description}`);
26
+ console.log('Expected: Output appears incrementally');
27
+ console.log('Actual:');
28
+
29
+ const start = Date.now();
30
+ const chunks = [];
31
+
32
+ for await (const chunk of command.stream()) {
33
+ if (chunk.type === 'stdout') {
34
+ const elapsed = Date.now() - start;
35
+ const lines = chunk.data
36
+ .toString()
37
+ .trim()
38
+ .split('\n')
39
+ .filter((l) => l);
40
+ for (const line of lines) {
41
+ chunks.push({ time: elapsed, data: line });
42
+ console.log(` [${elapsed}ms] ${line}`);
43
+ }
44
+ }
45
+ }
46
+
47
+ // Analyze streaming behavior
48
+ if (chunks.length > 1) {
49
+ const firstTime = chunks[0].time;
50
+ const lastTime = chunks[chunks.length - 1].time;
51
+ const spread = lastTime - firstTime;
52
+
53
+ if (spread < 100) {
54
+ console.log(' ❌ All output arrived at once (buffered)');
55
+ } else {
56
+ console.log(' ✅ Output streamed incrementally');
57
+ }
58
+ }
59
+ }
60
+
61
+ // Test cases
62
+ console.log('='.repeat(60));
63
+
64
+ await runTest(
65
+ 'Test 1: Shell command without pipe',
66
+ $`sh -c 'echo "A"; sleep 0.3; echo "B"; sleep 0.3; echo "C"'`,
67
+ 'Direct shell execution should stream line by line'
68
+ );
69
+
70
+ await runTest(
71
+ 'Test 2: Virtual command without pipe',
72
+ $`delay-echo A,B,C 300`,
73
+ 'Virtual commands should stream incrementally'
74
+ );
75
+
76
+ await runTest(
77
+ 'Test 3: Shell piped to cat',
78
+ $`sh -c 'echo "A"; sleep 0.3; echo "B"; sleep 0.3; echo "C"' | cat`,
79
+ 'Pipe to cat may buffer (depends on system)'
80
+ );
81
+
82
+ await runTest(
83
+ 'Test 4: Virtual piped to cat',
84
+ $`delay-echo X,Y,Z 300 | cat`,
85
+ 'Virtual command through pipe may buffer'
86
+ );
87
+
88
+ await runTest(
89
+ 'Test 5: Shell piped to virtual pass-through',
90
+ $`sh -c 'echo "1"; sleep 0.3; echo "2"; sleep 0.3; echo "3"' | delay-echo`,
91
+ 'Real to virtual pipeline'
92
+ );
93
+
94
+ // Register a pass-through virtual command
95
+ register('passthrough', async function* ({ args, stdin }) {
96
+ if (stdin) {
97
+ yield stdin;
98
+ }
99
+ });
100
+
101
+ await runTest(
102
+ 'Test 6: Virtual to virtual pipeline',
103
+ $`delay-echo P,Q,R 300 | passthrough`,
104
+ 'Virtual to virtual should maintain streaming if properly implemented'
105
+ );
106
+
107
+ console.log(`\n${'='.repeat(60)}`);
108
+ console.log('\nSummary:');
109
+ console.log('- Direct command execution (no pipes) streams properly');
110
+ console.log('- Pipes may introduce buffering depending on the commands');
111
+ console.log('- Virtual commands can stream when used alone');
112
+ console.log('- Mixed pipelines depend on how data flows between stages');
113
+ console.log('\nTo achieve true streaming through pipes, commands need to:');
114
+ console.log('1. Flush output after each line');
115
+ console.log('2. Use line-buffered or unbuffered mode');
116
+ console.log('3. Or be specifically designed for streaming');
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Basic streaming without pipes
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Direct command streaming test:');
8
+
9
+ const start = Date.now();
10
+ let chunkCount = 0;
11
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs`.stream()) {
12
+ if (chunk.type === 'stdout') {
13
+ chunkCount++;
14
+ const elapsed = Date.now() - start;
15
+ if (chunkCount <= 3) {
16
+ console.log(`[${elapsed}ms] Chunk ${chunkCount}`);
17
+ }
18
+ }
19
+ }
20
+ console.log(`Total: ${chunkCount} chunks`);
21
+ console.log(chunkCount >= 5 ? '✅ Streaming works' : '❌ Not streaming');
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Stream processing with filtering (only error-like output)
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Filtered streaming (only error-like output):');
8
+ const $filtered = $({ mirror: false });
9
+
10
+ try {
11
+ const testScript = `
12
+ echo "INFO: Starting process"
13
+ echo "WARNING: This is a warning" >&2
14
+ echo "DEBUG: Processing data"
15
+ echo "ERROR: Something went wrong" >&2
16
+ echo "INFO: Process completed"
17
+ `;
18
+
19
+ for await (const chunk of $filtered`bash -c '${testScript}'`.stream()) {
20
+ const output = chunk.data.toString().trim();
21
+
22
+ if (
23
+ chunk.type === 'stderr' ||
24
+ output.includes('ERROR') ||
25
+ output.includes('WARNING')
26
+ ) {
27
+ const prefix = chunk.type === 'stderr' ? '🚨' : '⚠️';
28
+ console.log(`${prefix} ${output}`);
29
+ }
30
+ }
31
+ } catch (error) {
32
+ console.log(`Error: ${error.message}`);
33
+ }
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // grep pipeline streaming
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('grep pipeline streaming test:');
8
+
9
+ const start = Date.now();
10
+ let chunkCount = 0;
11
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | grep -E '"type"'`.stream()) {
12
+ if (chunk.type === 'stdout') {
13
+ chunkCount++;
14
+ const elapsed = Date.now() - start;
15
+ if (chunkCount <= 3) {
16
+ console.log(`[${elapsed}ms] Chunk ${chunkCount}`);
17
+ }
18
+ }
19
+ }
20
+ console.log(`Total: ${chunkCount} chunks`);
21
+ console.log(chunkCount >= 5 ? '✅ grep streaming works' : '❌ grep buffered');
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Interactive-style streaming with custom stdin
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Interactive streaming with pre-filled input:');
8
+ const commands = 'ls -la\necho "Current directory listing"\nexit\n';
9
+ const $interactive = $({ stdin: commands, mirror: false });
10
+
11
+ try {
12
+ for await (const chunk of $interactive`bash`.stream()) {
13
+ if (chunk.type === 'stdout') {
14
+ const lines = chunk.data.toString().split('\n');
15
+ for (const line of lines) {
16
+ if (line.trim()) {
17
+ console.log(`🖥️ ${line}`);
18
+ }
19
+ }
20
+ }
21
+ }
22
+ } catch (error) {
23
+ console.log(`Error: ${error.message}`);
24
+ }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // jq pipeline streaming (critical test)
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('jq pipeline streaming test:');
8
+
9
+ const start = Date.now();
10
+ let chunkCount = 0;
11
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
12
+ if (chunk.type === 'stdout') {
13
+ chunkCount++;
14
+ const elapsed = Date.now() - start;
15
+ if (chunkCount <= 3) {
16
+ console.log(`[${elapsed}ms] Chunk ${chunkCount}`);
17
+ }
18
+ }
19
+ }
20
+ console.log(`Total: ${chunkCount} chunks`);
21
+ console.log(
22
+ chunkCount >= 5 ? '✅ Streaming works with jq!' : '❌ jq buffered output'
23
+ );
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Multi-stage pipeline streaming (cat | jq)
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Multi-stage pipeline streaming test:');
8
+
9
+ const start = Date.now();
10
+ let chunkCount = 0;
11
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | cat | jq .`.stream()) {
12
+ if (chunk.type === 'stdout') {
13
+ chunkCount++;
14
+ const elapsed = Date.now() - start;
15
+ if (chunkCount <= 3) {
16
+ console.log(`[${elapsed}ms] Chunk ${chunkCount}`);
17
+ }
18
+ }
19
+ }
20
+ console.log(`Total: ${chunkCount} chunks`);
21
+ console.log(
22
+ chunkCount >= 5 ? '✅ Multi-stage streaming works' : '❌ Multi-stage buffered'
23
+ );
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // EventEmitter pattern with pipes
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('EventEmitter pattern with pipes:');
8
+ const start = Date.now();
9
+
10
+ await new Promise((resolve) => {
11
+ $`sh -c 'echo "{\\"event\\":1}"; sleep 0.2; echo "{\\"event\\":2}"; sleep 0.2; echo "{\\"event\\":3}"' | jq -c .`
12
+ .on('data', (chunk) => {
13
+ if (chunk.type === 'stdout') {
14
+ const elapsed = Date.now() - start;
15
+ const data = chunk.data.toString().trim();
16
+ if (data) {
17
+ console.log(`[${elapsed}ms] Event: ${data}`);
18
+ }
19
+ }
20
+ })
21
+ .on('end', (result) => {
22
+ console.log(`Exit code: ${result.code}`);
23
+ resolve();
24
+ });
25
+ });
26
+
27
+ console.log('\n✅ Test complete');
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Multi-stage pipeline with streaming
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Multi-stage pipeline with streaming:');
8
+ const start = Date.now();
9
+
10
+ const cmd = $`sh -c 'for i in 1 2 3; do echo "{\\"value\\":$i}"; sleep 0.3; done' | jq -c '{data: .value}' | jq -c '{result: (.data * 2)}'`;
11
+
12
+ for await (const chunk of cmd.stream()) {
13
+ if (chunk.type === 'stdout') {
14
+ const elapsed = Date.now() - start;
15
+ const data = chunk.data.toString().trim();
16
+ if (data) {
17
+ console.log(`[${elapsed}ms] Pipeline result: ${data}`);
18
+ }
19
+ }
20
+ }
21
+
22
+ console.log('\n✅ Test complete');
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Real-time streaming through jq pipe
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Real-time streaming with delays through jq:');
8
+ console.log('Each line should appear immediately, not all at once\n');
9
+
10
+ const start = Date.now();
11
+ const cmd = $`sh -c 'echo "{\\"n\\":1}"; sleep 0.5; echo "{\\"n\\":2}"; sleep 0.5; echo "{\\"n\\":3}"' | jq -c .`;
12
+
13
+ for await (const chunk of cmd.stream()) {
14
+ if (chunk.type === 'stdout') {
15
+ const elapsed = Date.now() - start;
16
+ const data = chunk.data.toString().trim();
17
+ if (data) {
18
+ console.log(`[${elapsed}ms] Received: ${data}`);
19
+ }
20
+ }
21
+ }
22
+
23
+ console.log('\n✅ Test complete');
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Streaming with progress tracking
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Progress tracking with streaming:');
8
+ const $progress = $({ mirror: false });
9
+
10
+ try {
11
+ let progressCount = 0;
12
+ const progressScript = `
13
+ for i in {1..5}; do
14
+ echo "Progress: $i/5"
15
+ sleep 0.5
16
+ done
17
+ echo "Complete!"
18
+ `;
19
+
20
+ for await (const chunk of $progress`bash -c '${progressScript}'`.stream()) {
21
+ if (chunk.type === 'stdout') {
22
+ const output = chunk.data.toString().trim();
23
+ if (output.includes('Progress:')) {
24
+ progressCount++;
25
+ const percent = ((progressCount / 5) * 100).toFixed(0);
26
+ console.log(`📊 ${output} (${percent}%)`);
27
+ } else if (output.includes('Complete')) {
28
+ console.log(`✅ ${output}`);
29
+ }
30
+ }
31
+ }
32
+ } catch (error) {
33
+ console.log(`Error: ${error.message}`);
34
+ }
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Reusable streaming configurations
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Reusable streaming configurations:');
8
+
9
+ // Create different "profiles" for streaming
10
+ const $json = $({ mirror: false });
11
+ const $quiet = $({ mirror: false, capture: true });
12
+ const $verbose = $({ mirror: true });
13
+
14
+ try {
15
+ // JSON-like structured output
16
+ console.log('JSON-style output:');
17
+ for await (const chunk of $json`echo '{"status":"running","progress":50}'`.stream()) {
18
+ if (chunk.type === 'stdout') {
19
+ try {
20
+ const data = JSON.parse(chunk.data.toString());
21
+ console.log(`📋 Status: ${data.status}, Progress: ${data.progress}%`);
22
+ } catch {
23
+ console.log(`📋 Raw: ${chunk.data.toString().trim()}`);
24
+ }
25
+ }
26
+ }
27
+
28
+ // Quiet mode with post-processing
29
+ console.log('\nQuiet mode with result capture:');
30
+ const runner = $quiet`echo "Result: $(date)"`;
31
+
32
+ let streamOutput = '';
33
+ for await (const chunk of runner.stream()) {
34
+ if (chunk.type === 'stdout') {
35
+ streamOutput += chunk.data.toString();
36
+ }
37
+ }
38
+
39
+ const result = await runner;
40
+ console.log(`🤫 Streamed: "${streamOutput.trim()}"`);
41
+ console.log(`💾 Captured: "${result.stdout.trim()}"`);
42
+
43
+ // Verbose mode (will show in terminal too)
44
+ console.log('\nVerbose mode (also shows in terminal):');
45
+ for await (const chunk of $verbose`echo "This appears both in terminal and here"`.stream()) {
46
+ if (chunk.type === 'stdout') {
47
+ console.log(`📢 Processed: ${chunk.data.toString().trim()}`);
48
+ }
49
+ }
50
+ } catch (error) {
51
+ console.log(`Error: ${error.message}`);
52
+ }