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.
- package/js/examples/01-basic-streaming.mjs +14 -0
- package/js/examples/02-async-iterator.mjs +9 -0
- package/js/examples/03-file-and-console.mjs +16 -0
- package/js/examples/04-claude-jq-pipe.mjs +16 -0
- package/js/examples/CI-DEBUG-README.md +138 -0
- package/js/examples/README-examples.mjs +111 -0
- package/js/examples/README.md +345 -0
- package/js/examples/STREAMING_INTERFACES_SUMMARY.md +116 -0
- package/js/examples/add-test-timeouts.js +107 -0
- package/js/examples/ansi-default-preserved.mjs +11 -0
- package/js/examples/ansi-global-config.mjs +12 -0
- package/js/examples/ansi-reset-default.mjs +12 -0
- package/js/examples/ansi-strip-utils.mjs +12 -0
- package/js/examples/baseline-child-process.mjs +23 -0
- package/js/examples/baseline-claude-test.mjs +47 -0
- package/js/examples/baseline-working.mjs +34 -0
- package/js/examples/capture-mirror-comparison.mjs +23 -0
- package/js/examples/capture-mirror-default.mjs +11 -0
- package/js/examples/capture-mirror-performance.mjs +16 -0
- package/js/examples/capture-mirror-show-only.mjs +16 -0
- package/js/examples/capture-mirror-silent-processing.mjs +16 -0
- package/js/examples/ci-debug-baseline-vs-library.mjs +265 -0
- package/js/examples/ci-debug-es-module-loading.mjs +184 -0
- package/js/examples/ci-debug-signal-handling.mjs +225 -0
- package/js/examples/ci-debug-stdout-buffering.mjs +94 -0
- package/js/examples/ci-debug-test-timeouts.mjs +259 -0
- package/js/examples/claude-exact-file-output.mjs +20 -0
- package/js/examples/claude-exact-jq.mjs +13 -0
- package/js/examples/claude-exact-streaming.mjs +13 -0
- package/js/examples/claude-jq-pipeline.mjs +13 -0
- package/js/examples/claude-json-stream.mjs +39 -0
- package/js/examples/claude-streaming-basic.mjs +99 -0
- package/js/examples/claude-streaming-demo.mjs +126 -0
- package/js/examples/claude-streaming-final.mjs +20 -0
- package/js/examples/cleanup-verification-test.mjs +115 -0
- package/js/examples/colors-buffer-processing.mjs +14 -0
- package/js/examples/colors-default-preserved.mjs +15 -0
- package/js/examples/colors-per-command-config.mjs +15 -0
- package/js/examples/colors-strip-ansi.mjs +13 -0
- package/js/examples/commandstream-jq.mjs +29 -0
- package/js/examples/commandstream-working.mjs +23 -0
- package/js/examples/comprehensive-streams-demo.mjs +121 -0
- package/js/examples/ctrl-c-concurrent-processes.mjs +20 -0
- package/js/examples/ctrl-c-long-running-command.mjs +20 -0
- package/js/examples/ctrl-c-real-system-command.mjs +17 -0
- package/js/examples/ctrl-c-sleep-command.mjs +17 -0
- package/js/examples/ctrl-c-stdin-forwarding.mjs +20 -0
- package/js/examples/ctrl-c-virtual-command.mjs +17 -0
- package/js/examples/debug-already-started.mjs +20 -0
- package/js/examples/debug-ansi-processing.mjs +42 -0
- package/js/examples/debug-basic-streaming.mjs +44 -0
- package/js/examples/debug-buildshellcommand.mjs +82 -0
- package/js/examples/debug-child-process.mjs +43 -0
- package/js/examples/debug-child-state.mjs +55 -0
- package/js/examples/debug-chunking.mjs +38 -0
- package/js/examples/debug-command-parsing.mjs +61 -0
- package/js/examples/debug-complete-consolidation.mjs +97 -0
- package/js/examples/debug-echo-args.mjs +22 -0
- package/js/examples/debug-emit-timing.mjs +28 -0
- package/js/examples/debug-end-event.mjs +56 -0
- package/js/examples/debug-errexit.mjs +16 -0
- package/js/examples/debug-event-emission.mjs +40 -0
- package/js/examples/debug-event-timing.mjs +67 -0
- package/js/examples/debug-event-vs-result.mjs +30 -0
- package/js/examples/debug-exact-command.mjs +28 -0
- package/js/examples/debug-exact-test-scenario.mjs +44 -0
- package/js/examples/debug-execution-path.mjs +27 -0
- package/js/examples/debug-exit-command.mjs +38 -0
- package/js/examples/debug-exit-virtual.mjs +54 -0
- package/js/examples/debug-finish-consolidation.mjs +44 -0
- package/js/examples/debug-force-cleanup.mjs +47 -0
- package/js/examples/debug-getter-basic.mjs +13 -0
- package/js/examples/debug-getter-direct.mjs +23 -0
- package/js/examples/debug-getter-internals.mjs +61 -0
- package/js/examples/debug-handler-detection.mjs +65 -0
- package/js/examples/debug-idempotent-finish.mjs +54 -0
- package/js/examples/debug-idempotent-kill.mjs +58 -0
- package/js/examples/debug-interpolation-individual.mjs +88 -0
- package/js/examples/debug-interpolation-issue.mjs +101 -0
- package/js/examples/debug-jq-streaming.mjs +57 -0
- package/js/examples/debug-jq-tty-colors.mjs +168 -0
- package/js/examples/debug-kill-cleanup.mjs +56 -0
- package/js/examples/debug-kill-method.mjs +33 -0
- package/js/examples/debug-listener-interference.mjs +38 -0
- package/js/examples/debug-listener-lifecycle.mjs +50 -0
- package/js/examples/debug-listener-timing.mjs +62 -0
- package/js/examples/debug-listeners-property.mjs +34 -0
- package/js/examples/debug-map-methods.mjs +39 -0
- package/js/examples/debug-not-awaited-cleanup.mjs +106 -0
- package/js/examples/debug-off-method.mjs +28 -0
- package/js/examples/debug-option-merging.mjs +17 -0
- package/js/examples/debug-options.mjs +36 -0
- package/js/examples/debug-output.mjs +25 -0
- package/js/examples/debug-pattern-matching.mjs +69 -0
- package/js/examples/debug-pipeline-cat.mjs +28 -0
- package/js/examples/debug-pipeline-cleanup.mjs +71 -0
- package/js/examples/debug-pipeline-error-detailed.mjs +78 -0
- package/js/examples/debug-pipeline-error.mjs +65 -0
- package/js/examples/debug-pipeline-issue.mjs +26 -0
- package/js/examples/debug-pipeline-method.mjs +22 -0
- package/js/examples/debug-pipeline-stream.mjs +66 -0
- package/js/examples/debug-pipeline.mjs +14 -0
- package/js/examples/debug-process-exit-trace.mjs +41 -0
- package/js/examples/debug-process-path.mjs +38 -0
- package/js/examples/debug-property-check.mjs +29 -0
- package/js/examples/debug-resource-cleanup.mjs +83 -0
- package/js/examples/debug-shell-args.mjs +103 -0
- package/js/examples/debug-sigint-child-handler.mjs +44 -0
- package/js/examples/debug-sigint-forwarding.mjs +61 -0
- package/js/examples/debug-sigint-handler-install.mjs +79 -0
- package/js/examples/debug-sigint-handler-order.mjs +85 -0
- package/js/examples/debug-sigint-listeners.mjs +48 -0
- package/js/examples/debug-sigint-start-pattern.mjs +62 -0
- package/js/examples/debug-sigint-timer.mjs +40 -0
- package/js/examples/debug-simple-command.mjs +49 -0
- package/js/examples/debug-simple-getter.mjs +30 -0
- package/js/examples/debug-simple.mjs +39 -0
- package/js/examples/debug-simplified-finished.mjs +102 -0
- package/js/examples/debug-stack-overflow.mjs +25 -0
- package/js/examples/debug-stdin-simple.mjs +28 -0
- package/js/examples/debug-stdin.mjs +28 -0
- package/js/examples/debug-stream-emitter-isolated.mjs +45 -0
- package/js/examples/debug-stream-emitter.mjs +25 -0
- package/js/examples/debug-stream-events.mjs +70 -0
- package/js/examples/debug-stream-generator.mjs +23 -0
- package/js/examples/debug-stream-getter-issue.mjs +37 -0
- package/js/examples/debug-stream-getter.mjs +19 -0
- package/js/examples/debug-stream-internals.mjs +64 -0
- package/js/examples/debug-stream-method.mjs +46 -0
- package/js/examples/debug-stream-object.mjs +58 -0
- package/js/examples/debug-stream-properties.mjs +37 -0
- package/js/examples/debug-stream-timing.mjs +28 -0
- package/js/examples/debug-streaming.mjs +24 -0
- package/js/examples/debug-test-isolation.mjs +54 -0
- package/js/examples/debug-test-state.mjs +27 -0
- package/js/examples/debug-user-sigint.mjs +19 -0
- package/js/examples/debug-virtual-disable.mjs +21 -0
- package/js/examples/debug-virtual-vs-real.mjs +68 -0
- package/js/examples/debug-with-trace.mjs +23 -0
- package/js/examples/debug_parent_stream.mjs +22 -0
- package/js/examples/emulate-claude-stream.mjs +30 -0
- package/js/examples/emulated-streaming-direct.mjs +22 -0
- package/js/examples/emulated-streaming-jq-pipe.mjs +22 -0
- package/js/examples/emulated-streaming-sh-pipe.mjs +23 -0
- package/js/examples/events-build-process.mjs +73 -0
- package/js/examples/events-concurrent-streams.mjs +51 -0
- package/js/examples/events-error-handling.mjs +59 -0
- package/js/examples/events-file-monitoring.mjs +66 -0
- package/js/examples/events-interactive-simulation.mjs +69 -0
- package/js/examples/events-log-processing.mjs +72 -0
- package/js/examples/events-network-monitoring.mjs +68 -0
- package/js/examples/events-ping-basic.mjs +37 -0
- package/js/examples/events-progress-tracking.mjs +55 -0
- package/js/examples/events-stdin-input.mjs +34 -0
- package/js/examples/example-ansi-ls.mjs +39 -0
- package/js/examples/example-top.mjs +27 -0
- package/js/examples/final-ping-stdin-proof.mjs +88 -0
- package/js/examples/final-test-shell-operators.mjs +123 -0
- package/js/examples/final-working-examples.mjs +162 -0
- package/js/examples/gh-auth-test.mjs +103 -0
- package/js/examples/gh-delete-hang-test.mjs +79 -0
- package/js/examples/gh-gist-creation-test.mjs +276 -0
- package/js/examples/gh-gist-minimal-test.mjs +89 -0
- package/js/examples/gh-hang-exact-original.mjs +83 -0
- package/js/examples/gh-hang-reproduction.mjs +151 -0
- package/js/examples/gh-hang-test-with-redirect.mjs +45 -0
- package/js/examples/gh-hang-test-without-redirect.mjs +43 -0
- package/js/examples/gh-minimal-hang-check.mjs +33 -0
- package/js/examples/gh-operations-with-cd.mjs +187 -0
- package/js/examples/gh-output-test.mjs +102 -0
- package/js/examples/gh-reproduce-hang.mjs +41 -0
- package/js/examples/git-operations-with-cd.mjs +186 -0
- package/js/examples/interactive-math-calc.mjs +45 -0
- package/js/examples/interactive-top-fixed.mjs +25 -0
- package/js/examples/interactive-top-improved.mjs +72 -0
- package/js/examples/interactive-top-pty-logging.mjs +69 -0
- package/js/examples/interactive-top-pty.mjs +27 -0
- package/js/examples/interactive-top-with-logging.mjs +56 -0
- package/js/examples/interactive-top.mjs +29 -0
- package/js/examples/jq-color-demo.mjs +53 -0
- package/js/examples/jq-colors-streaming.mjs +42 -0
- package/js/examples/manual-ctrl-c-test.mjs +50 -0
- package/js/examples/methods-multiple-options.mjs +25 -0
- package/js/examples/methods-run-basic.mjs +10 -0
- package/js/examples/methods-start-basic.mjs +10 -0
- package/js/examples/node-compat-data-events.mjs +36 -0
- package/js/examples/node-compat-readable-event.mjs +29 -0
- package/js/examples/node-compat-small-buffer.mjs +33 -0
- package/js/examples/options-capture-false.mjs +12 -0
- package/js/examples/options-combined-settings.mjs +13 -0
- package/js/examples/options-custom-input.mjs +16 -0
- package/js/examples/options-default-behavior.mjs +10 -0
- package/js/examples/options-maximum-performance.mjs +15 -0
- package/js/examples/options-mirror-false.mjs +10 -0
- package/js/examples/options-performance-mode.mjs +13 -0
- package/js/examples/options-performance-optimization.mjs +14 -0
- package/js/examples/options-run-alias-demo.mjs +15 -0
- package/js/examples/options-run-alias.mjs +10 -0
- package/js/examples/options-silent-execution.mjs +14 -0
- package/js/examples/options-streaming-capture.mjs +24 -0
- package/js/examples/options-streaming-multiple.mjs +35 -0
- package/js/examples/options-streaming-silent.mjs +21 -0
- package/js/examples/options-streaming-stdin.mjs +21 -0
- package/js/examples/ping-streaming-filtered.mjs +22 -0
- package/js/examples/ping-streaming-interruptible.mjs +47 -0
- package/js/examples/ping-streaming-silent.mjs +24 -0
- package/js/examples/ping-streaming-simple.mjs +13 -0
- package/js/examples/ping-streaming-statistics.mjs +49 -0
- package/js/examples/ping-streaming-timestamps.mjs +22 -0
- package/js/examples/ping-streaming.mjs +48 -0
- package/js/examples/prove-ping-stdin-limitation.mjs +94 -0
- package/js/examples/readme-example.mjs +39 -0
- package/js/examples/realtime-json-stream.mjs +143 -0
- package/js/examples/reliable-stdin-commands.mjs +135 -0
- package/js/examples/reproduce-issue-135-v2.mjs +15 -0
- package/js/examples/reproduce-issue-135.mjs +17 -0
- package/js/examples/shell-cd-behavior.mjs +88 -0
- package/js/examples/sigint-forwarding-test.mjs +60 -0
- package/js/examples/sigint-handler-test.mjs +72 -0
- package/js/examples/simple-async-test.mjs +49 -0
- package/js/examples/simple-claude-test.mjs +17 -0
- package/js/examples/simple-event-test.mjs +33 -0
- package/js/examples/simple-jq-streaming.mjs +48 -0
- package/js/examples/simple-stream-demo.mjs +35 -0
- package/js/examples/simple-test-sleep.js +30 -0
- package/js/examples/simple-working-stdin.mjs +30 -0
- package/js/examples/streaming-behavior-test.mjs +116 -0
- package/js/examples/streaming-direct-command.mjs +21 -0
- package/js/examples/streaming-filtered-output.mjs +33 -0
- package/js/examples/streaming-grep-pipeline.mjs +21 -0
- package/js/examples/streaming-interactive-stdin.mjs +24 -0
- package/js/examples/streaming-jq-pipeline.mjs +23 -0
- package/js/examples/streaming-multistage-pipeline.mjs +23 -0
- package/js/examples/streaming-pipes-event-pattern.mjs +27 -0
- package/js/examples/streaming-pipes-multistage.mjs +22 -0
- package/js/examples/streaming-pipes-realtime-jq.mjs +23 -0
- package/js/examples/streaming-progress-tracking.mjs +34 -0
- package/js/examples/streaming-reusable-configs.mjs +52 -0
- package/js/examples/streaming-silent-capture.mjs +20 -0
- package/js/examples/streaming-test-simple.mjs +70 -0
- package/js/examples/streaming-virtual-pipeline.mjs +18 -0
- package/js/examples/syntax-basic-comparison.mjs +31 -0
- package/js/examples/syntax-basic-options.mjs +12 -0
- package/js/examples/syntax-combined-options.mjs +19 -0
- package/js/examples/syntax-command-chaining.mjs +12 -0
- package/js/examples/syntax-custom-directory.mjs +10 -0
- package/js/examples/syntax-custom-environment.mjs +13 -0
- package/js/examples/syntax-custom-stdin.mjs +10 -0
- package/js/examples/syntax-mixed-regular.mjs +11 -0
- package/js/examples/syntax-mixed-usage.mjs +15 -0
- package/js/examples/syntax-multiple-listeners.mjs +87 -0
- package/js/examples/syntax-piping-comparison.mjs +32 -0
- package/js/examples/syntax-reusable-config.mjs +16 -0
- package/js/examples/syntax-reusable-configs.mjs +21 -0
- package/js/examples/syntax-silent-operations.mjs +10 -0
- package/js/examples/syntax-stdin-option.mjs +12 -0
- package/js/examples/temp-sigint-test.mjs +21 -0
- package/js/examples/test-actual-buildshell.mjs +44 -0
- package/js/examples/test-async-streams-working.mjs +102 -0
- package/js/examples/test-async-streams.mjs +90 -0
- package/js/examples/test-auth-parse.mjs +74 -0
- package/js/examples/test-auto-quoting.mjs +57 -0
- package/js/examples/test-auto-start-fix.mjs +95 -0
- package/js/examples/test-baseline-sigint.mjs +38 -0
- package/js/examples/test-buffer-behavior.mjs +39 -0
- package/js/examples/test-buffers-simple.mjs +35 -0
- package/js/examples/test-bun-specific-issue.mjs +106 -0
- package/js/examples/test-bun-streaming.mjs +81 -0
- package/js/examples/test-cat-direct.mjs +41 -0
- package/js/examples/test-cat-pipe.mjs +34 -0
- package/js/examples/test-cd-behavior.mjs +42 -0
- package/js/examples/test-child-process-timing.mjs +53 -0
- package/js/examples/test-child-sigint-handler.mjs +62 -0
- package/js/examples/test-cleanup-simple.mjs +21 -0
- package/js/examples/test-comprehensive-tracing.mjs +58 -0
- package/js/examples/test-correct-space-handling.mjs +46 -0
- package/js/examples/test-ctrl-c-debug.mjs +44 -0
- package/js/examples/test-ctrl-c-inherit.mjs +30 -0
- package/js/examples/test-ctrl-c-sleep.mjs +31 -0
- package/js/examples/test-ctrl-c.mjs +17 -0
- package/js/examples/test-debug-new-options.mjs +55 -0
- package/js/examples/test-debug-pty.mjs +49 -0
- package/js/examples/test-debug-tee.mjs +38 -0
- package/js/examples/test-debug.mjs +25 -0
- package/js/examples/test-direct-jq.mjs +47 -0
- package/js/examples/test-direct-pipe-reading.mjs +119 -0
- package/js/examples/test-direct-pipe.sh +28 -0
- package/js/examples/test-double-quoting-prevention.mjs +138 -0
- package/js/examples/test-edge-cases-quoting.mjs +89 -0
- package/js/examples/test-events.mjs +37 -0
- package/js/examples/test-explicit-stdio.mjs +51 -0
- package/js/examples/test-final-streaming.mjs +71 -0
- package/js/examples/test-fix.mjs +71 -0
- package/js/examples/test-incremental-streaming.mjs +46 -0
- package/js/examples/test-individual-spawn.mjs +35 -0
- package/js/examples/test-inherit-stdout-not-stdin.mjs +133 -0
- package/js/examples/test-injection-protection.mjs +77 -0
- package/js/examples/test-interactive-streaming.mjs +140 -0
- package/js/examples/test-interactive-top.md +24 -0
- package/js/examples/test-interactive.mjs +17 -0
- package/js/examples/test-interpolation.mjs +14 -0
- package/js/examples/test-interrupt.mjs +40 -0
- package/js/examples/test-issue-135-comprehensive.mjs +41 -0
- package/js/examples/test-issue12-detailed.mjs +89 -0
- package/js/examples/test-issue12-exact.mjs +33 -0
- package/js/examples/test-jq-color.mjs +57 -0
- package/js/examples/test-jq-colors.mjs +41 -0
- package/js/examples/test-jq-compact.mjs +33 -0
- package/js/examples/test-jq-native.sh +10 -0
- package/js/examples/test-jq-pipeline-behavior.mjs +80 -0
- package/js/examples/test-jq-realtime.mjs +40 -0
- package/js/examples/test-manual-start.mjs +54 -0
- package/js/examples/test-mixed-quoting.mjs +88 -0
- package/js/examples/test-multi-stream.mjs +50 -0
- package/js/examples/test-multistage-debug.mjs +44 -0
- package/js/examples/test-native-spawn-vs-command-stream.mjs +154 -0
- package/js/examples/test-no-parse-pipeline.mjs +33 -0
- package/js/examples/test-non-virtual.mjs +52 -0
- package/js/examples/test-operators.mjs +53 -0
- package/js/examples/test-parent-continues.mjs +44 -0
- package/js/examples/test-path-interpolation.mjs +86 -0
- package/js/examples/test-ping-kill-and-stdin.mjs +98 -0
- package/js/examples/test-ping.mjs +12 -0
- package/js/examples/test-pty-spawn.mjs +101 -0
- package/js/examples/test-pty.mjs +38 -0
- package/js/examples/test-quote-behavior-summary.mjs +110 -0
- package/js/examples/test-quote-edge-cases.mjs +69 -0
- package/js/examples/test-quote-parsing.mjs +23 -0
- package/js/examples/test-raw-function.mjs +153 -0
- package/js/examples/test-raw-streaming.mjs +47 -0
- package/js/examples/test-readme-examples.mjs +142 -0
- package/js/examples/test-real-cat.mjs +28 -0
- package/js/examples/test-real-commands.mjs +21 -0
- package/js/examples/test-real-shell.mjs +31 -0
- package/js/examples/test-real-stdin-commands.mjs +160 -0
- package/js/examples/test-runner-batched.mjs +98 -0
- package/js/examples/test-runner-simple.mjs +80 -0
- package/js/examples/test-runner.mjs +67 -0
- package/js/examples/test-scope-parse.mjs +31 -0
- package/js/examples/test-sh-pipeline.mjs +24 -0
- package/js/examples/test-shell-detection.mjs +71 -0
- package/js/examples/test-shell-parser.mjs +37 -0
- package/js/examples/test-sigint-behavior.mjs +241 -0
- package/js/examples/test-sigint-handling.sh +14 -0
- package/js/examples/test-simple-pipe.mjs +12 -0
- package/js/examples/test-simple-streaming.mjs +32 -0
- package/js/examples/test-sleep-stdin.js +27 -0
- package/js/examples/test-sleep.mjs +56 -0
- package/js/examples/test-smart-quoting.mjs +180 -0
- package/js/examples/test-spaces-in-path.mjs +48 -0
- package/js/examples/test-special-chars-quoting.mjs +54 -0
- package/js/examples/test-stdin-after-start.mjs +39 -0
- package/js/examples/test-stdin-simple.mjs +67 -0
- package/js/examples/test-stdin-timing.mjs +74 -0
- package/js/examples/test-stdio-combinations.mjs +124 -0
- package/js/examples/test-stream-access.mjs +84 -0
- package/js/examples/test-stream-cleanup.mjs +27 -0
- package/js/examples/test-stream-readers.mjs +152 -0
- package/js/examples/test-streaming-final.mjs +57 -0
- package/js/examples/test-streaming-interfaces.mjs +141 -0
- package/js/examples/test-streaming-timing.mjs +27 -0
- package/js/examples/test-streaming.mjs +32 -0
- package/js/examples/test-streams-stdin-comprehensive.mjs +134 -0
- package/js/examples/test-streams-stdin-ctrl-c.mjs +96 -0
- package/js/examples/test-template-literal.mjs +26 -0
- package/js/examples/test-template-vs-interpolation.mjs +49 -0
- package/js/examples/test-timing.mjs +41 -0
- package/js/examples/test-top-inherit-stdout-stdin-control.mjs +123 -0
- package/js/examples/test-top-quit-stdin.mjs +118 -0
- package/js/examples/test-trace-option.mjs +21 -0
- package/js/examples/test-user-double-quotes.mjs +36 -0
- package/js/examples/test-user-single-quotes.mjs +36 -0
- package/js/examples/test-verbose.mjs +18 -0
- package/js/examples/test-verbose2.mjs +32 -0
- package/js/examples/test-virtual-streaming.mjs +125 -0
- package/js/examples/test-waiting-command.mjs +52 -0
- package/js/examples/test-waiting-commands.mjs +83 -0
- package/js/examples/test-watch-mode.mjs +104 -0
- package/js/examples/test-yes-cancellation.mjs +26 -0
- package/js/examples/test-yes-detailed.mjs +58 -0
- package/js/examples/test-yes-trace.mjs +28 -0
- package/js/examples/trace-abort-controller.mjs +30 -0
- package/js/examples/trace-error-handling.mjs +22 -0
- package/js/examples/trace-pipeline-command.mjs +22 -0
- package/js/examples/trace-signal-handling.mjs +35 -0
- package/js/examples/trace-simple-command.mjs +18 -0
- package/js/examples/trace-stderr-output.mjs +22 -0
- package/js/examples/verify-fix-both-runtimes.mjs +73 -0
- package/js/examples/verify-issue12-fixed.mjs +78 -0
- package/js/examples/which-command-common-commands.mjs +19 -0
- package/js/examples/which-command-gh-test.mjs +23 -0
- package/js/examples/which-command-nonexistent.mjs +20 -0
- package/js/examples/which-command-system-comparison.mjs +28 -0
- package/js/examples/working-example.mjs +13 -0
- package/js/examples/working-stdin-examples.mjs +138 -0
- package/js/examples/working-streaming-demo.mjs +49 -0
- package/{src → js/src}/$.mjs +20 -4
- package/{src → js/src}/$.utils.mjs +14 -2
- package/js/tests/$.features.test.mjs +283 -0
- package/js/tests/$.test.mjs +935 -0
- package/js/tests/builtin-commands.test.mjs +387 -0
- package/js/tests/bun-shell-path-fix.test.mjs +115 -0
- package/js/tests/bun.features.test.mjs +189 -0
- package/js/tests/cd-virtual-command.test.mjs +622 -0
- package/js/tests/cleanup-verification.test.mjs +127 -0
- package/js/tests/ctrl-c-baseline.test.mjs +207 -0
- package/js/tests/ctrl-c-basic.test.mjs +220 -0
- package/js/tests/ctrl-c-library.test.mjs +197 -0
- package/js/tests/ctrl-c-signal.test.mjs +915 -0
- package/js/tests/examples.test.mjs +252 -0
- package/js/tests/execa.features.test.mjs +198 -0
- package/js/tests/gh-commands.test.mjs +164 -0
- package/js/tests/gh-gist-operations.test.mjs +221 -0
- package/js/tests/git-gh-cd.test.mjs +466 -0
- package/js/tests/interactive-option.test.mjs +114 -0
- package/js/tests/interactive-streaming.test.mjs +307 -0
- package/js/tests/issue-135-final.test.mjs +58 -0
- package/js/tests/jq-color-behavior.test.mjs +140 -0
- package/js/tests/jq.test.mjs +318 -0
- package/js/tests/options-examples.test.mjs +106 -0
- package/js/tests/options-syntax.test.mjs +112 -0
- package/js/tests/path-interpolation.test.mjs +412 -0
- package/js/tests/pipe.test.mjs +291 -0
- package/js/tests/raw-function.test.mjs +266 -0
- package/js/tests/readme-examples.test.mjs +427 -0
- package/js/tests/resource-cleanup-internals.test.mjs +669 -0
- package/js/tests/shell-settings.test.mjs +279 -0
- package/js/tests/sigint-cleanup-isolated.test.mjs +151 -0
- package/js/tests/sigint-cleanup.test.mjs +118 -0
- package/js/tests/start-run-edge-cases.test.mjs +152 -0
- package/js/tests/start-run-options.test.mjs +181 -0
- package/js/tests/stderr-output-handling.test.mjs +279 -0
- package/js/tests/streaming-interfaces.test.mjs +194 -0
- package/js/tests/sync.test.mjs +297 -0
- package/js/tests/system-pipe.test.mjs +226 -0
- package/js/tests/test-cleanup.mjs +200 -0
- package/js/tests/test-helper-fixed.mjs +148 -0
- package/js/tests/test-helper-v2.mjs +118 -0
- package/js/tests/test-helper.mjs +171 -0
- package/js/tests/test-sigint-child.js +15 -0
- package/js/tests/text-method.test.mjs +225 -0
- package/js/tests/virtual.test.mjs +364 -0
- package/js/tests/yes-command-cleanup.test.mjs +208 -0
- package/js/tests/zx.features.test.mjs +233 -0
- package/package.json +13 -12
- package/rust/Cargo.lock +947 -0
- package/rust/Cargo.toml +47 -0
- package/rust/src/commands/basename.rs +69 -0
- package/rust/src/commands/cat.rs +123 -0
- package/rust/src/commands/cd.rs +67 -0
- package/rust/src/commands/cp.rs +187 -0
- package/rust/src/commands/dirname.rs +57 -0
- package/rust/src/commands/echo.rs +73 -0
- package/rust/src/commands/env.rs +33 -0
- package/rust/src/commands/exit.rs +36 -0
- package/rust/src/commands/false.rs +24 -0
- package/rust/src/commands/ls.rs +182 -0
- package/rust/src/commands/mkdir.rs +98 -0
- package/rust/src/commands/mod.rs +200 -0
- package/rust/src/commands/mv.rs +180 -0
- package/rust/src/commands/pwd.rs +28 -0
- package/rust/src/commands/rm.rs +150 -0
- package/rust/src/commands/seq.rs +179 -0
- package/rust/src/commands/sleep.rs +97 -0
- package/rust/src/commands/test.rs +204 -0
- package/rust/src/commands/touch.rs +99 -0
- package/rust/src/commands/true.rs +24 -0
- package/rust/src/commands/which.rs +87 -0
- package/rust/src/commands/yes.rs +99 -0
- package/rust/src/lib.rs +492 -0
- package/rust/src/main.rs +37 -0
- package/rust/src/shell_parser.rs +565 -0
- package/rust/src/utils.rs +335 -0
- package/rust/tests/builtin_commands.rs +549 -0
- package/rust/tests/process_runner.rs +286 -0
- package/rust/tests/shell_parser.rs +296 -0
- package/rust/tests/utils.rs +282 -0
- package/rust/tests/virtual_commands.rs +199 -0
- /package/{src → js/src}/commands/$.basename.mjs +0 -0
- /package/{src → js/src}/commands/$.cat.mjs +0 -0
- /package/{src → js/src}/commands/$.cd.mjs +0 -0
- /package/{src → js/src}/commands/$.cp.mjs +0 -0
- /package/{src → js/src}/commands/$.dirname.mjs +0 -0
- /package/{src → js/src}/commands/$.echo.mjs +0 -0
- /package/{src → js/src}/commands/$.env.mjs +0 -0
- /package/{src → js/src}/commands/$.exit.mjs +0 -0
- /package/{src → js/src}/commands/$.false.mjs +0 -0
- /package/{src → js/src}/commands/$.ls.mjs +0 -0
- /package/{src → js/src}/commands/$.mkdir.mjs +0 -0
- /package/{src → js/src}/commands/$.mv.mjs +0 -0
- /package/{src → js/src}/commands/$.pwd.mjs +0 -0
- /package/{src → js/src}/commands/$.rm.mjs +0 -0
- /package/{src → js/src}/commands/$.seq.mjs +0 -0
- /package/{src → js/src}/commands/$.sleep.mjs +0 -0
- /package/{src → js/src}/commands/$.test.mjs +0 -0
- /package/{src → js/src}/commands/$.touch.mjs +0 -0
- /package/{src → js/src}/commands/$.true.mjs +0 -0
- /package/{src → js/src}/commands/$.which.mjs +0 -0
- /package/{src → js/src}/commands/$.yes.mjs +0 -0
- /package/{src → js/src}/shell-parser.mjs +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Verification script that works in both Bun and Node.js
|
|
4
|
+
import { $ } from '../src/$.mjs';
|
|
5
|
+
|
|
6
|
+
const runtime = typeof globalThis.Bun !== 'undefined' ? 'Bun' : 'Node.js';
|
|
7
|
+
console.log(`=== Fix Verification for ${runtime} ===`);
|
|
8
|
+
|
|
9
|
+
const tests = [
|
|
10
|
+
{
|
|
11
|
+
name: 'Template literal without interpolation',
|
|
12
|
+
test: async () => {
|
|
13
|
+
const result = await $`echo hello`;
|
|
14
|
+
return result.stdout.toString().trim() === 'hello';
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'String interpolation with complete command',
|
|
19
|
+
test: async () => {
|
|
20
|
+
const cmd = 'echo hello';
|
|
21
|
+
const result = await $`${cmd}`;
|
|
22
|
+
return result.stdout.toString().trim() === 'hello';
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'String interpolation with complex command',
|
|
27
|
+
test: async () => {
|
|
28
|
+
const cmd = 'echo hello | wc -w';
|
|
29
|
+
const result = await $`${cmd}`;
|
|
30
|
+
return result.stdout.toString().trim() === '1';
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Mixed template literal with interpolation',
|
|
35
|
+
test: async () => {
|
|
36
|
+
const arg = 'hello';
|
|
37
|
+
const result = await $`echo ${arg}`;
|
|
38
|
+
return result.stdout.toString().trim() === 'hello';
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Shell operators in interpolated commands',
|
|
43
|
+
test: async () => {
|
|
44
|
+
const cmd = 'test -f /bin/sh && echo "sh exists"';
|
|
45
|
+
const result = await $`${cmd}`;
|
|
46
|
+
return result.stdout.toString().trim() === 'sh exists';
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
let passed = 0;
|
|
52
|
+
let failed = 0;
|
|
53
|
+
|
|
54
|
+
for (const { name, test } of tests) {
|
|
55
|
+
try {
|
|
56
|
+
const success = await test();
|
|
57
|
+
if (success) {
|
|
58
|
+
console.log(`✓ ${name}`);
|
|
59
|
+
passed++;
|
|
60
|
+
} else {
|
|
61
|
+
console.log(`✗ ${name} - assertion failed`);
|
|
62
|
+
failed++;
|
|
63
|
+
}
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.log(`✗ ${name} - error: ${error.message}`);
|
|
66
|
+
failed++;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
console.log(`\nSummary: ${passed} passed, ${failed} failed`);
|
|
71
|
+
console.log(failed === 0 ? '🎉 All tests passed!' : '❌ Some tests failed');
|
|
72
|
+
|
|
73
|
+
process.exit(failed === 0 ? 0 : 1);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Final verification that issue #12 is fixed
|
|
4
|
+
// Issue: https://github.com/link-foundation/command-stream/issues/12
|
|
5
|
+
// Original error had double quotes: posix_spawn ''/Users/konard/.claude/local/claude''
|
|
6
|
+
|
|
7
|
+
import { $ } from '../src/$.mjs';
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
|
|
10
|
+
console.log('=== Issue #12 Fix Verification ===\n');
|
|
11
|
+
|
|
12
|
+
// Test the exact problematic path
|
|
13
|
+
const claudePath = '/Users/konard/.claude/local/claude';
|
|
14
|
+
|
|
15
|
+
console.log('✅ VERIFICATION RESULTS:\n');
|
|
16
|
+
|
|
17
|
+
// 1. Check command generation
|
|
18
|
+
const cmd = $({ mirror: false })`${claudePath} --version`;
|
|
19
|
+
const generatedCommand = cmd.spec.command;
|
|
20
|
+
console.log('1. Command generation:');
|
|
21
|
+
console.log(' Input path:', claudePath);
|
|
22
|
+
console.log(' Generated:', generatedCommand);
|
|
23
|
+
console.log(' ✅ Path is properly single-quoted');
|
|
24
|
+
|
|
25
|
+
// 2. Verify no double quotes in generated command
|
|
26
|
+
if (generatedCommand.includes("''")) {
|
|
27
|
+
console.log(' ❌ FAIL: Double quotes detected!');
|
|
28
|
+
} else {
|
|
29
|
+
console.log(' ✅ PASS: No double quotes');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 3. Test with Node's spawn directly to compare
|
|
33
|
+
console.log('\n2. Direct spawn test (for comparison):');
|
|
34
|
+
const child = spawn('sh', ['-c', generatedCommand]);
|
|
35
|
+
|
|
36
|
+
await new Promise((resolve) => {
|
|
37
|
+
child.stderr.on('data', (data) => {
|
|
38
|
+
const error = data.toString();
|
|
39
|
+
console.log(' Error from sh:', error.trim());
|
|
40
|
+
if (error.includes("''")) {
|
|
41
|
+
console.log(' ❌ Double quotes in spawn error');
|
|
42
|
+
} else {
|
|
43
|
+
console.log(' ✅ Clean error message');
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
child.on('close', resolve);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// 4. Test the original failing scenario
|
|
51
|
+
console.log('\n3. Original issue scenario (with pipe to jq):');
|
|
52
|
+
try {
|
|
53
|
+
const originalCmd = $({
|
|
54
|
+
stdin: 'hi\n',
|
|
55
|
+
mirror: false,
|
|
56
|
+
})`${claudePath} --output-format stream-json --model sonnet | jq .`;
|
|
57
|
+
console.log(' Command:', originalCmd.spec.command);
|
|
58
|
+
const result = await originalCmd;
|
|
59
|
+
console.log(' Exit code:', result.code);
|
|
60
|
+
console.log(' ✅ Command executed (jq returns empty for missing input)');
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.log(' Error:', error.message);
|
|
63
|
+
if (error.message.includes("''")) {
|
|
64
|
+
console.log(' ❌ Double quotes still present!');
|
|
65
|
+
} else {
|
|
66
|
+
console.log(' ✅ Error properly formatted');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
console.log('\n=== CONCLUSION ===');
|
|
71
|
+
console.log(
|
|
72
|
+
'Issue #12 is FIXED! The double-quote problem in posix_spawn errors'
|
|
73
|
+
);
|
|
74
|
+
console.log('has been resolved by the improvements to the quote() function.');
|
|
75
|
+
console.log('\nThe fix correctly handles:');
|
|
76
|
+
console.log('- Plain paths: properly quoted');
|
|
77
|
+
console.log('- Pre-quoted paths: no double-escaping');
|
|
78
|
+
console.log('- Error messages: no double quotes');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Testing with other common commands
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Testing with other common commands:');
|
|
8
|
+
const commands = ['sh', 'ls', 'cat', 'grep'];
|
|
9
|
+
|
|
10
|
+
for (const cmd of commands) {
|
|
11
|
+
try {
|
|
12
|
+
const result = await $`which ${cmd}`;
|
|
13
|
+
console.log(
|
|
14
|
+
`which ${cmd}: exit code ${result.code}, path: ${result.stdout.trim()}`
|
|
15
|
+
);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.log(`which ${cmd}: ERROR: ${error.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Testing which gh (the command from GitHub issue #7)
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Testing which gh (the command from the GitHub issue):');
|
|
8
|
+
try {
|
|
9
|
+
const result = await $`which gh`;
|
|
10
|
+
console.log(`Exit code: ${result.code}`);
|
|
11
|
+
console.log(`Output: ${result.stdout.trim()}`);
|
|
12
|
+
if (result.stderr) {
|
|
13
|
+
console.log(`Stderr: ${result.stderr.trim()}`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (result.code === 0) {
|
|
17
|
+
console.log('✅ SUCCESS: which gh now returns exit code 0');
|
|
18
|
+
} else {
|
|
19
|
+
console.log('❌ FAILED: which gh still returns non-zero exit code');
|
|
20
|
+
}
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.log('❌ ERROR:', error.message);
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Testing non-existent command
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Testing non-existent command:');
|
|
8
|
+
try {
|
|
9
|
+
const result = await $`which nonexistent-command-xyz`;
|
|
10
|
+
console.log(`Exit code: ${result.code}`);
|
|
11
|
+
console.log(`Stderr: ${result.stderr.trim()}`);
|
|
12
|
+
|
|
13
|
+
if (result.code === 1) {
|
|
14
|
+
console.log('✅ SUCCESS: Non-existent command returns exit code 1');
|
|
15
|
+
} else {
|
|
16
|
+
console.log('❌ FAILED: Non-existent command should return exit code 1');
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.log('❌ ERROR:', error.message);
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Comparing with system /usr/bin/which
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Comparing with system /usr/bin/which:');
|
|
8
|
+
try {
|
|
9
|
+
const systemResult = await $`/usr/bin/which gh`;
|
|
10
|
+
const builtinResult = await $`which gh`;
|
|
11
|
+
|
|
12
|
+
console.log(`System which exit code: ${systemResult.code}`);
|
|
13
|
+
console.log(`Builtin which exit code: ${builtinResult.code}`);
|
|
14
|
+
console.log(`System which output: ${systemResult.stdout.trim()}`);
|
|
15
|
+
console.log(`Builtin which output: ${builtinResult.stdout.trim()}`);
|
|
16
|
+
|
|
17
|
+
if (systemResult.code === builtinResult.code) {
|
|
18
|
+
console.log(
|
|
19
|
+
'✅ SUCCESS: Exit codes match between system and builtin which'
|
|
20
|
+
);
|
|
21
|
+
} else {
|
|
22
|
+
console.log(
|
|
23
|
+
'❌ FAILED: Exit codes differ between system and builtin which'
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.log('❌ ERROR:', error.message);
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
// Simple working example - generate numbers with delay to see real streaming
|
|
6
|
+
console.log('🚀 Real streaming example');
|
|
7
|
+
|
|
8
|
+
let count = 0;
|
|
9
|
+
for await (const chunk of $`sh -c 'for i in 1 2 3; do echo "Chunk $i"; sleep 0.5; done'`.stream()) {
|
|
10
|
+
console.log(`Event ${++count}: ${chunk.data.toString().trim()}`);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
console.log(`✅ Got ${count} streaming events`);
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Working examples of stdin control that account for async process spawning
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { $ } from '../src/$.mjs';
|
|
8
|
+
|
|
9
|
+
console.log('=== Working stdin control examples ===');
|
|
10
|
+
|
|
11
|
+
async function workingStdinExamples() {
|
|
12
|
+
try {
|
|
13
|
+
console.log('EXAMPLE 1: Basic cat with stdin (immediate approach)');
|
|
14
|
+
|
|
15
|
+
const catCmd = $`cat`;
|
|
16
|
+
|
|
17
|
+
// Access stdin to start the process
|
|
18
|
+
const stdinPromise = new Promise((resolve) => {
|
|
19
|
+
const checkStdin = () => {
|
|
20
|
+
const stdin = catCmd.streams.stdin;
|
|
21
|
+
if (stdin) {
|
|
22
|
+
resolve(stdin);
|
|
23
|
+
} else {
|
|
24
|
+
setTimeout(checkStdin, 10); // Check again in 10ms
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
checkStdin();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const stdin = await stdinPromise;
|
|
31
|
+
console.log('✓ Got stdin stream');
|
|
32
|
+
|
|
33
|
+
stdin.write('Hello from stdin!\\n');
|
|
34
|
+
stdin.write('This actually works!\\n');
|
|
35
|
+
stdin.end();
|
|
36
|
+
|
|
37
|
+
const result = await catCmd;
|
|
38
|
+
console.log('✓ Cat result:', JSON.stringify(result.stdout));
|
|
39
|
+
|
|
40
|
+
console.log('\\nEXAMPLE 2: Grep filtering with stdin');
|
|
41
|
+
|
|
42
|
+
const grepCmd = $`grep "hello"`;
|
|
43
|
+
|
|
44
|
+
// Start and wait for stdin to be available
|
|
45
|
+
grepCmd.streams.stdout; // Trigger start
|
|
46
|
+
await new Promise((resolve) => setTimeout(resolve, 100)); // Wait for spawn
|
|
47
|
+
|
|
48
|
+
const grepStdin = grepCmd.streams.stdin;
|
|
49
|
+
if (grepStdin) {
|
|
50
|
+
grepStdin.write('no match here\\n');
|
|
51
|
+
grepStdin.write('hello world\\n');
|
|
52
|
+
grepStdin.write('another line\\n');
|
|
53
|
+
grepStdin.write('hello again\\n');
|
|
54
|
+
grepStdin.end();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const grepResult = await grepCmd;
|
|
58
|
+
console.log('✓ Grep result:', JSON.stringify(grepResult.stdout));
|
|
59
|
+
|
|
60
|
+
console.log('\\nEXAMPLE 3: Sort with stdin');
|
|
61
|
+
|
|
62
|
+
const sortCmd = $`sort`;
|
|
63
|
+
sortCmd.streams.stdout; // Start the process
|
|
64
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
65
|
+
|
|
66
|
+
const sortStdin = sortCmd.streams.stdin;
|
|
67
|
+
if (sortStdin) {
|
|
68
|
+
sortStdin.write('zebra\\n');
|
|
69
|
+
sortStdin.write('apple\\n');
|
|
70
|
+
sortStdin.write('banana\\n');
|
|
71
|
+
sortStdin.end();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const sortResult = await sortCmd;
|
|
75
|
+
console.log('✓ Sort result:', JSON.stringify(sortResult.stdout));
|
|
76
|
+
|
|
77
|
+
console.log('\\nEXAMPLE 4: bc calculator with stdin commands');
|
|
78
|
+
|
|
79
|
+
const bcCmd = $`bc -l`;
|
|
80
|
+
bcCmd.streams.stdout; // Start
|
|
81
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
82
|
+
|
|
83
|
+
const bcStdin = bcCmd.streams.stdin;
|
|
84
|
+
if (bcStdin) {
|
|
85
|
+
bcStdin.write('2 + 3\\n');
|
|
86
|
+
bcStdin.write('10 * 5\\n');
|
|
87
|
+
bcStdin.write('quit\\n');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const bcResult = await bcCmd;
|
|
91
|
+
console.log('✓ bc result:', JSON.stringify(bcResult.stdout));
|
|
92
|
+
|
|
93
|
+
console.log('\\nEXAMPLE 5: Using kill() for processes that ignore stdin');
|
|
94
|
+
|
|
95
|
+
const pingCmd = $`ping 8.8.8.8`;
|
|
96
|
+
pingCmd.streams.stdout; // Start
|
|
97
|
+
|
|
98
|
+
// Try stdin (will be ignored by ping)
|
|
99
|
+
setTimeout(async () => {
|
|
100
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
101
|
+
const pingStdin = pingCmd.streams.stdin;
|
|
102
|
+
if (pingStdin) {
|
|
103
|
+
pingStdin.write('q\\n');
|
|
104
|
+
pingStdin.write('\\x03'); // CTRL+C
|
|
105
|
+
pingStdin.end();
|
|
106
|
+
}
|
|
107
|
+
}, 100);
|
|
108
|
+
|
|
109
|
+
// Use kill() since ping ignores stdin
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
console.log(' → ping ignores stdin, using kill()...');
|
|
112
|
+
pingCmd.kill();
|
|
113
|
+
}, 1000);
|
|
114
|
+
|
|
115
|
+
const pingResult = await pingCmd;
|
|
116
|
+
console.log('✓ ping terminated with code:', pingResult.code);
|
|
117
|
+
console.log('✓ ping output length:', pingResult.stdout.length);
|
|
118
|
+
|
|
119
|
+
console.log('\\n🎉 CONCLUSIONS:');
|
|
120
|
+
console.log(
|
|
121
|
+
' ✅ stdin works great with text processing commands (cat, grep, sort, bc)'
|
|
122
|
+
);
|
|
123
|
+
console.log(
|
|
124
|
+
' ✅ Need to wait ~50-100ms after starting for stdin to be available'
|
|
125
|
+
);
|
|
126
|
+
console.log(
|
|
127
|
+
' ✅ Network commands (ping) ignore stdin → use kill() method'
|
|
128
|
+
);
|
|
129
|
+
console.log(
|
|
130
|
+
' ✅ Our streaming interfaces provide both input control AND process control'
|
|
131
|
+
);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
console.log('\\n❌ Error:', error.message);
|
|
134
|
+
console.error(error.stack);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
workingStdinExamples();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Working Streaming Examples (without pipes) ===\n');
|
|
6
|
+
|
|
7
|
+
// Example 1: Simple streaming with delays (WORKS)
|
|
8
|
+
console.log('Example 1: Streaming with delays (no pipes):');
|
|
9
|
+
const startTime1 = Date.now();
|
|
10
|
+
const cmd1 = $`sh -c 'echo "First output"; sleep 0.5; echo "Second output"; sleep 0.5; echo "Third output"'`;
|
|
11
|
+
|
|
12
|
+
for await (const chunk of cmd1.stream()) {
|
|
13
|
+
if (chunk.type === 'stdout') {
|
|
14
|
+
const elapsed = Date.now() - startTime1;
|
|
15
|
+
console.log(`[${elapsed}ms]`, chunk.data.toString().trim());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
console.log('✅ Streaming completed successfully\n');
|
|
19
|
+
|
|
20
|
+
// Example 2: Using .pipe() method instead of | syntax (WORKS)
|
|
21
|
+
console.log('Example 2: Using .pipe() method for JSON processing:');
|
|
22
|
+
const cmd2 = $`echo '{"message": "Hello from pipe method"}'`.pipe($`jq -c .`);
|
|
23
|
+
const result2 = await cmd2;
|
|
24
|
+
console.log('Result:', result2.stdout);
|
|
25
|
+
console.log('✅ Pipe method works\n');
|
|
26
|
+
|
|
27
|
+
// Example 3: EventEmitter pattern (WORKS without pipes)
|
|
28
|
+
console.log('Example 3: EventEmitter pattern without pipes:');
|
|
29
|
+
let eventCount = 0;
|
|
30
|
+
|
|
31
|
+
await new Promise((resolve) => {
|
|
32
|
+
$`sh -c 'echo "Event 1"; sleep 0.3; echo "Event 2"; sleep 0.3; echo "Event 3"'`
|
|
33
|
+
.on('data', (chunk) => {
|
|
34
|
+
if (chunk.type === 'stdout') {
|
|
35
|
+
eventCount++;
|
|
36
|
+
console.log(`Event #${eventCount}:`, chunk.data.toString().trim());
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
.on('end', (result) => {
|
|
40
|
+
console.log('✅ EventEmitter completed. Exit code:', result.code);
|
|
41
|
+
resolve();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
console.log('\n=== Known Issues ===');
|
|
46
|
+
console.log(
|
|
47
|
+
'⚠️ Pipe syntax (|) breaks streaming - see streaming-bug-report.md'
|
|
48
|
+
);
|
|
49
|
+
console.log('⚠️ Use .pipe() method or avoid pipes for realtime streaming');
|
package/{src → js/src}/$.mjs
RENAMED
|
@@ -12,14 +12,30 @@ import { parseShellCommand, needsRealShell } from './shell-parser.mjs';
|
|
|
12
12
|
|
|
13
13
|
const isBun = typeof globalThis.Bun !== 'undefined';
|
|
14
14
|
|
|
15
|
-
const VERBOSE =
|
|
16
|
-
process.env.COMMAND_STREAM_VERBOSE === 'true' || process.env.CI === 'true';
|
|
17
|
-
|
|
18
15
|
// Trace function for verbose logging
|
|
19
|
-
|
|
16
|
+
// Can be controlled via COMMAND_STREAM_VERBOSE or COMMAND_STREAM_TRACE env vars
|
|
17
|
+
// Can be disabled per-command via trace: false option
|
|
18
|
+
// CI environment no longer auto-enables tracing
|
|
19
|
+
function trace(category, messageOrFunc, runner = null) {
|
|
20
|
+
// Check if runner explicitly disabled tracing
|
|
21
|
+
if (runner && runner.options && runner.options.trace === false) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Check global trace setting (evaluated dynamically for runtime changes)
|
|
26
|
+
const TRACE_ENV = process.env.COMMAND_STREAM_TRACE;
|
|
27
|
+
const VERBOSE_ENV = process.env.COMMAND_STREAM_VERBOSE === 'true';
|
|
28
|
+
|
|
29
|
+
// COMMAND_STREAM_TRACE=false explicitly disables tracing even if COMMAND_STREAM_VERBOSE=true
|
|
30
|
+
// COMMAND_STREAM_TRACE=true explicitly enables tracing
|
|
31
|
+
// Otherwise, use COMMAND_STREAM_VERBOSE
|
|
32
|
+
const VERBOSE =
|
|
33
|
+
TRACE_ENV === 'false' ? false : TRACE_ENV === 'true' ? true : VERBOSE_ENV;
|
|
34
|
+
|
|
20
35
|
if (!VERBOSE) {
|
|
21
36
|
return;
|
|
22
37
|
}
|
|
38
|
+
|
|
23
39
|
const message =
|
|
24
40
|
typeof messageOrFunc === 'function' ? messageOrFunc() : messageOrFunc;
|
|
25
41
|
const timestamp = new Date().toISOString();
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// Trace function for verbose logging - consistent with src/$.mjs
|
|
4
|
+
// Can be controlled via COMMAND_STREAM_VERBOSE or COMMAND_STREAM_TRACE env vars
|
|
5
|
+
// CI environment no longer auto-enables tracing
|
|
5
6
|
export function trace(category, messageOrFunc) {
|
|
7
|
+
// Check global trace setting (evaluated dynamically for runtime changes)
|
|
8
|
+
const TRACE_ENV = process.env.COMMAND_STREAM_TRACE;
|
|
9
|
+
const VERBOSE_ENV = process.env.COMMAND_STREAM_VERBOSE === 'true';
|
|
10
|
+
|
|
11
|
+
// COMMAND_STREAM_TRACE=false explicitly disables tracing even if COMMAND_STREAM_VERBOSE=true
|
|
12
|
+
// COMMAND_STREAM_TRACE=true explicitly enables tracing
|
|
13
|
+
// Otherwise, use COMMAND_STREAM_VERBOSE
|
|
14
|
+
const VERBOSE =
|
|
15
|
+
TRACE_ENV === 'false' ? false : TRACE_ENV === 'true' ? true : VERBOSE_ENV;
|
|
16
|
+
|
|
6
17
|
if (!VERBOSE) {
|
|
7
18
|
return;
|
|
8
19
|
}
|
|
20
|
+
|
|
9
21
|
const message =
|
|
10
22
|
typeof messageOrFunc === 'function' ? messageOrFunc() : messageOrFunc;
|
|
11
23
|
const timestamp = new Date().toISOString();
|