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,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
async function testStreamAccess() {
|
|
6
|
+
console.log('Testing event-driven stream access (no setTimeout)...\n');
|
|
7
|
+
|
|
8
|
+
// Test 1: Access streams before process starts
|
|
9
|
+
console.log('Test 1: Accessing streams before process starts');
|
|
10
|
+
const proc1 = $`echo "Hello from stdout" && echo "Error message" >&2`;
|
|
11
|
+
|
|
12
|
+
const streams = proc1.streams;
|
|
13
|
+
const stdinPromise = streams.stdin;
|
|
14
|
+
const stdoutPromise = streams.stdout;
|
|
15
|
+
const stderrPromise = streams.stderr;
|
|
16
|
+
|
|
17
|
+
console.log('Waiting for streams...');
|
|
18
|
+
const [stdin, stdout, stderr] = await Promise.all([
|
|
19
|
+
stdinPromise,
|
|
20
|
+
stdoutPromise,
|
|
21
|
+
stderrPromise,
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
console.log(' stdin:', stdin ? 'available' : 'null');
|
|
25
|
+
console.log(' stdout:', stdout ? 'available' : 'null');
|
|
26
|
+
console.log(' stderr:', stderr ? 'available' : 'null');
|
|
27
|
+
|
|
28
|
+
const result1 = await proc1;
|
|
29
|
+
console.log(' Result stdout:', result1.stdout.trim());
|
|
30
|
+
console.log(' Result stderr:', result1.stderr.trim());
|
|
31
|
+
console.log('✓ Test 1 passed\n');
|
|
32
|
+
|
|
33
|
+
// Test 2: Access streams after process starts
|
|
34
|
+
console.log('Test 2: Accessing streams after process starts');
|
|
35
|
+
const proc2 = $`sleep 0.1 && echo "Delayed output"`;
|
|
36
|
+
|
|
37
|
+
// Start the process
|
|
38
|
+
proc2.start();
|
|
39
|
+
|
|
40
|
+
// Now access streams - should resolve immediately or wait without setTimeout
|
|
41
|
+
const streams2 = proc2.streams;
|
|
42
|
+
const stdout2 = await streams2.stdout;
|
|
43
|
+
console.log(' stdout after start:', stdout2 ? 'available' : 'null');
|
|
44
|
+
|
|
45
|
+
const result2 = await proc2;
|
|
46
|
+
console.log(' Result:', result2.stdout.trim());
|
|
47
|
+
console.log('✓ Test 2 passed\n');
|
|
48
|
+
|
|
49
|
+
// Test 3: Test with finished process
|
|
50
|
+
console.log('Test 3: Accessing streams of finished process');
|
|
51
|
+
const proc3 = await $`echo "Already done"`;
|
|
52
|
+
|
|
53
|
+
const streams3 = proc3.streams;
|
|
54
|
+
const stdout3 = await streams3.stdout;
|
|
55
|
+
console.log(
|
|
56
|
+
' stdout of finished process:',
|
|
57
|
+
stdout3 ? 'available' : 'null (expected)'
|
|
58
|
+
);
|
|
59
|
+
console.log(' Result:', proc3.stdout.trim());
|
|
60
|
+
console.log('✓ Test 3 passed\n');
|
|
61
|
+
|
|
62
|
+
// Test 4: Test parent stream closure handling (uses setImmediate now)
|
|
63
|
+
console.log('Test 4: Parent stream closure handling');
|
|
64
|
+
const proc4 = $`sleep 0.2 && echo "Should be terminated"`;
|
|
65
|
+
|
|
66
|
+
// Simulate parent stream closure scenario
|
|
67
|
+
setTimeout(() => {
|
|
68
|
+
console.log(' Simulating kill...');
|
|
69
|
+
proc4.kill();
|
|
70
|
+
}, 50);
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
await proc4;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
// Expected to fail
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
console.log(' Process killed successfully');
|
|
79
|
+
console.log('✓ Test 4 passed\n');
|
|
80
|
+
|
|
81
|
+
console.log('All tests passed! No setTimeout used for polling.');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
testStreamAccess().catch(console.error);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
console.log('Testing stream cleanup...');
|
|
4
|
+
|
|
5
|
+
// Test that breaking from iteration kills the process
|
|
6
|
+
let count = 0;
|
|
7
|
+
const startTime = Date.now();
|
|
8
|
+
|
|
9
|
+
for await (const chunk of $`yes "test output"`.stream()) {
|
|
10
|
+
console.log(`Chunk ${++count}: ${chunk.data.toString().trim()}`);
|
|
11
|
+
if (count >= 3) {
|
|
12
|
+
console.log('Breaking from iteration...');
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Wait a bit to see if process continues outputting
|
|
18
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
19
|
+
|
|
20
|
+
console.log(`Test completed in ${Date.now() - startTime}ms`);
|
|
21
|
+
console.log('If you see this message quickly without hanging, cleanup worked!');
|
|
22
|
+
|
|
23
|
+
// Test with another command to ensure no interference
|
|
24
|
+
const result = await $`echo "clean test"`;
|
|
25
|
+
console.log('Next command output:', result.stdout.trim());
|
|
26
|
+
|
|
27
|
+
console.log('✅ Stream cleanup test passed!');
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Test different ways to read from process streams in Bun
|
|
4
|
+
|
|
5
|
+
console.log('=== Testing Different Stream Reading Methods ===\n');
|
|
6
|
+
|
|
7
|
+
// Method 1: Using getReader() with ReadableStream API
|
|
8
|
+
console.log('Method 1: ReadableStream getReader():');
|
|
9
|
+
{
|
|
10
|
+
const proc = Bun.spawn(
|
|
11
|
+
['sh', '-c', 'bun run js/examples/emulate-claude-stream.mjs | jq .'],
|
|
12
|
+
{
|
|
13
|
+
stdout: 'pipe',
|
|
14
|
+
stderr: 'pipe',
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const start = Date.now();
|
|
19
|
+
const reader = proc.stdout.getReader();
|
|
20
|
+
let chunkCount = 0;
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
while (true) {
|
|
24
|
+
const { done, value } = await reader.read();
|
|
25
|
+
if (done) {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
chunkCount++;
|
|
29
|
+
const elapsed = Date.now() - start;
|
|
30
|
+
console.log(
|
|
31
|
+
` [${elapsed}ms] Chunk ${chunkCount}: ${value.length} bytes`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
} finally {
|
|
35
|
+
reader.releaseLock();
|
|
36
|
+
}
|
|
37
|
+
await proc.exited;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Method 2: Using readable() if available
|
|
41
|
+
console.log('\nMethod 2: Check if readable() method exists:');
|
|
42
|
+
{
|
|
43
|
+
const proc = Bun.spawn(['sh', '-c', 'echo "test"'], {
|
|
44
|
+
stdout: 'pipe',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
console.log(
|
|
48
|
+
' stdout methods:',
|
|
49
|
+
Object.getOwnPropertyNames(Object.getPrototypeOf(proc.stdout))
|
|
50
|
+
);
|
|
51
|
+
await proc.exited;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Method 3: Try using Bun.file or other APIs
|
|
55
|
+
console.log('\nMethod 3: Using Response API:');
|
|
56
|
+
{
|
|
57
|
+
const proc = Bun.spawn(
|
|
58
|
+
['sh', '-c', 'bun run js/examples/emulate-claude-stream.mjs | jq .'],
|
|
59
|
+
{
|
|
60
|
+
stdout: 'pipe',
|
|
61
|
+
stderr: 'pipe',
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const start = Date.now();
|
|
66
|
+
|
|
67
|
+
// Try to read as a Response stream
|
|
68
|
+
const response = new Response(proc.stdout);
|
|
69
|
+
const reader = response.body.getReader();
|
|
70
|
+
let chunkCount = 0;
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
while (true) {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
chunkCount++;
|
|
79
|
+
const elapsed = Date.now() - start;
|
|
80
|
+
console.log(
|
|
81
|
+
` [${elapsed}ms] Chunk ${chunkCount}: ${value.length} bytes`
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
} finally {
|
|
85
|
+
reader.releaseLock();
|
|
86
|
+
}
|
|
87
|
+
await proc.exited;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Method 4: Try smaller reads with setImmediate/setTimeout
|
|
91
|
+
console.log('\nMethod 4: Polling with small timeout:');
|
|
92
|
+
{
|
|
93
|
+
const proc = Bun.spawn(
|
|
94
|
+
['sh', '-c', 'bun run js/examples/emulate-claude-stream.mjs | jq .'],
|
|
95
|
+
{
|
|
96
|
+
stdout: 'pipe',
|
|
97
|
+
stderr: 'pipe',
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const start = Date.now();
|
|
102
|
+
const reader = proc.stdout.getReader();
|
|
103
|
+
let chunkCount = 0;
|
|
104
|
+
|
|
105
|
+
const readWithTimeout = async () => {
|
|
106
|
+
while (true) {
|
|
107
|
+
try {
|
|
108
|
+
// Try to read with a promise race against a timeout
|
|
109
|
+
const readPromise = reader.read();
|
|
110
|
+
const timeoutPromise = new Promise((resolve) =>
|
|
111
|
+
setTimeout(() => resolve({ done: false, timeout: true }), 10)
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const result = await Promise.race([readPromise, timeoutPromise]);
|
|
115
|
+
|
|
116
|
+
if (result.timeout) {
|
|
117
|
+
// No data yet, continue
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (result.done) {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
chunkCount++;
|
|
126
|
+
const elapsed = Date.now() - start;
|
|
127
|
+
console.log(
|
|
128
|
+
` [${elapsed}ms] Chunk ${chunkCount}: ${result.value.length} bytes`
|
|
129
|
+
);
|
|
130
|
+
} catch (e) {
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
await readWithTimeout();
|
|
137
|
+
reader.releaseLock();
|
|
138
|
+
await proc.exited;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Method 5: Direct file descriptor access (if possible)
|
|
142
|
+
console.log('\nMethod 5: Check proc.stdout properties:');
|
|
143
|
+
{
|
|
144
|
+
const proc = Bun.spawn(['echo', 'test'], {
|
|
145
|
+
stdout: 'pipe',
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
console.log(' stdout type:', proc.stdout.constructor.name);
|
|
149
|
+
console.log(' stdout properties:', Object.keys(proc.stdout));
|
|
150
|
+
|
|
151
|
+
await proc.exited;
|
|
152
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Final Real-Time Streaming Test ===\n');
|
|
6
|
+
|
|
7
|
+
console.log('Test 1: Simple command streaming (baseline):');
|
|
8
|
+
{
|
|
9
|
+
const start = Date.now();
|
|
10
|
+
for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs`.stream()) {
|
|
11
|
+
if (chunk.type === 'stdout') {
|
|
12
|
+
const elapsed = Date.now() - start;
|
|
13
|
+
const lines = chunk.data.toString().trim().split('\n');
|
|
14
|
+
for (const line of lines) {
|
|
15
|
+
if (line) {
|
|
16
|
+
console.log(` [${elapsed}ms] ${line}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
console.log('\nTest 2: With jq pipeline (using PTY for real-time streaming):');
|
|
24
|
+
{
|
|
25
|
+
const start = Date.now();
|
|
26
|
+
let chunkCount = 0;
|
|
27
|
+
|
|
28
|
+
// Use a real command instead of virtual echo
|
|
29
|
+
for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
|
|
30
|
+
if (chunk.type === 'stdout') {
|
|
31
|
+
chunkCount++;
|
|
32
|
+
const elapsed = Date.now() - start;
|
|
33
|
+
const text = chunk.data.toString();
|
|
34
|
+
const lines = text.split('\n').filter((l) => l.trim());
|
|
35
|
+
|
|
36
|
+
console.log(
|
|
37
|
+
` [${elapsed}ms] Chunk ${chunkCount}: ${lines.length} lines`
|
|
38
|
+
);
|
|
39
|
+
if (lines.length > 0 && chunkCount <= 3) {
|
|
40
|
+
console.log(` First line: ${lines[0]}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
console.log(` Total chunks: ${chunkCount}`);
|
|
45
|
+
console.log(
|
|
46
|
+
' ✅ If you see multiple chunks at different times, streaming works!'
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
console.log('\nTest 3: Printf with jq (no virtual commands):');
|
|
51
|
+
{
|
|
52
|
+
const start = Date.now();
|
|
53
|
+
|
|
54
|
+
const result = await $`printf '{"x":1}\\n{"x":2}\\n' | jq .`;
|
|
55
|
+
console.log(` Result received at [${Date.now() - start}ms]`);
|
|
56
|
+
console.log(' Output:', result.stdout.trim());
|
|
57
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test for Issue #33: Support stdin/stdout/stderr in different flavors
|
|
5
|
+
*
|
|
6
|
+
* This example tests the new streaming interfaces:
|
|
7
|
+
* - command.streams.stdin/stdout/stderr (immediate access)
|
|
8
|
+
* - command.buffers.stdin/stdout/stderr (binary data)
|
|
9
|
+
* - command.strings.stdin/stdout/stderr (text data)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* node js/examples/test-streaming-interfaces.mjs
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { $ } from '../src/$.mjs';
|
|
16
|
+
|
|
17
|
+
console.log('='.repeat(60));
|
|
18
|
+
console.log('TESTING NEW STREAMING INTERFACES (Issue #33)');
|
|
19
|
+
console.log('='.repeat(60));
|
|
20
|
+
console.log('');
|
|
21
|
+
|
|
22
|
+
async function testStreamingInterfaces() {
|
|
23
|
+
try {
|
|
24
|
+
console.log('=== TEST 1: Immediate streams access ===');
|
|
25
|
+
|
|
26
|
+
// Create command but don't start it yet
|
|
27
|
+
const command1 = $`echo "Hello streams"`;
|
|
28
|
+
console.log('✓ Command created (not started)');
|
|
29
|
+
|
|
30
|
+
// Access streams - this should auto-start the process
|
|
31
|
+
const streams = command1.streams;
|
|
32
|
+
console.log('✓ Streams accessed - process should auto-start');
|
|
33
|
+
|
|
34
|
+
// The process should now be running, let's wait for completion
|
|
35
|
+
const result1 = await command1;
|
|
36
|
+
console.log('✓ Result:', JSON.stringify(result1.stdout.trim()));
|
|
37
|
+
console.log('');
|
|
38
|
+
|
|
39
|
+
console.log('=== TEST 2: Buffers interface ===');
|
|
40
|
+
|
|
41
|
+
const command2 = $`echo "Hello buffers"`;
|
|
42
|
+
|
|
43
|
+
// Access buffers before completion - should return promises
|
|
44
|
+
const buffers = command2.buffers;
|
|
45
|
+
console.log('✓ Buffers accessed - process should auto-start');
|
|
46
|
+
|
|
47
|
+
// Get stdout buffer (should be promise initially)
|
|
48
|
+
const stdoutBuffer = await buffers.stdout;
|
|
49
|
+
console.log('✓ Buffer result:', stdoutBuffer.toString().trim());
|
|
50
|
+
|
|
51
|
+
// Now that process finished, accessing again should return result immediately
|
|
52
|
+
const immediateBuffer = command2.buffers.stdout;
|
|
53
|
+
if (immediateBuffer instanceof Buffer) {
|
|
54
|
+
console.log(
|
|
55
|
+
'✓ Immediate buffer access works:',
|
|
56
|
+
immediateBuffer.toString().trim()
|
|
57
|
+
);
|
|
58
|
+
} else {
|
|
59
|
+
console.log('✓ Buffer is still promise (expected for new process)');
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
|
|
63
|
+
console.log('=== TEST 3: Strings interface ===');
|
|
64
|
+
|
|
65
|
+
const command3 = $`echo "Hello strings"`;
|
|
66
|
+
|
|
67
|
+
// Access strings before completion - should return promises
|
|
68
|
+
const strings = command3.strings;
|
|
69
|
+
console.log('✓ Strings accessed - process should auto-start');
|
|
70
|
+
|
|
71
|
+
// Get stdout string (should be promise initially)
|
|
72
|
+
const stdoutString = await strings.stdout;
|
|
73
|
+
console.log('✓ String result:', JSON.stringify(stdoutString.trim()));
|
|
74
|
+
console.log('');
|
|
75
|
+
|
|
76
|
+
console.log('=== TEST 4: Mixed usage with stderr ===');
|
|
77
|
+
|
|
78
|
+
const command4 = $`sh -c 'echo "stdout message" && echo "stderr message" >&2'`;
|
|
79
|
+
|
|
80
|
+
// Test both stdout and stderr
|
|
81
|
+
const [stdoutStr, stderrStr] = await Promise.all([
|
|
82
|
+
command4.strings.stdout,
|
|
83
|
+
command4.strings.stderr,
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
console.log('✓ Mixed stdout:', JSON.stringify(stdoutStr.trim()));
|
|
87
|
+
console.log('✓ Mixed stderr:', JSON.stringify(stderrStr.trim()));
|
|
88
|
+
console.log('');
|
|
89
|
+
|
|
90
|
+
console.log('=== TEST 5: Backward compatibility ===');
|
|
91
|
+
|
|
92
|
+
// Ensure old await syntax still works
|
|
93
|
+
const command5 = $`echo "backward compatible"`;
|
|
94
|
+
const oldResult = await command5;
|
|
95
|
+
console.log(
|
|
96
|
+
'✓ Backward compatible result:',
|
|
97
|
+
JSON.stringify(oldResult.stdout.trim())
|
|
98
|
+
);
|
|
99
|
+
console.log('');
|
|
100
|
+
|
|
101
|
+
console.log('=== TEST 6: Stream access after creation ===');
|
|
102
|
+
|
|
103
|
+
const command6 = $`ping -c 3 127.0.0.1`;
|
|
104
|
+
|
|
105
|
+
// Access stdout stream immediately for real-time monitoring
|
|
106
|
+
if (command6.streams.stdout) {
|
|
107
|
+
console.log('✓ Stream available immediately');
|
|
108
|
+
|
|
109
|
+
// Set up real-time monitoring
|
|
110
|
+
let chunks = 0;
|
|
111
|
+
command6.streams.stdout.on('data', (chunk) => {
|
|
112
|
+
chunks++;
|
|
113
|
+
console.log(
|
|
114
|
+
` Chunk ${chunks}:`,
|
|
115
|
+
`${chunk.toString().slice(0, 50)}...`
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
} else {
|
|
119
|
+
console.log(
|
|
120
|
+
'ℹ️ Stream not immediately available (may need process start)'
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Wait for completion
|
|
125
|
+
const result6 = await command6;
|
|
126
|
+
console.log('✓ Ping completed with exit code:', result6.code);
|
|
127
|
+
console.log('');
|
|
128
|
+
|
|
129
|
+
console.log('='.repeat(60));
|
|
130
|
+
console.log('✅ ALL STREAMING INTERFACE TESTS COMPLETED');
|
|
131
|
+
console.log('='.repeat(60));
|
|
132
|
+
} catch (error) {
|
|
133
|
+
console.log('='.repeat(60));
|
|
134
|
+
console.error('❌ STREAMING INTERFACE TEST FAILED:', error.message);
|
|
135
|
+
console.error(error.stack);
|
|
136
|
+
console.log('='.repeat(60));
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
testStreamingInterfaces();
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
async function test() {
|
|
4
|
+
console.log('Starting test...');
|
|
5
|
+
const startTime = Date.now();
|
|
6
|
+
let firstChunkTime = null;
|
|
7
|
+
|
|
8
|
+
const cmd = $`echo "immediate"; sleep 0.1; echo "delayed"`;
|
|
9
|
+
console.log('Command created');
|
|
10
|
+
|
|
11
|
+
for await (const chunk of cmd.stream()) {
|
|
12
|
+
console.log('Got chunk:', chunk.type, `${Date.now() - startTime}ms`);
|
|
13
|
+
if (chunk.type === 'stdout' && firstChunkTime === null) {
|
|
14
|
+
firstChunkTime = Date.now();
|
|
15
|
+
console.log(
|
|
16
|
+
'First chunk received after',
|
|
17
|
+
firstChunkTime - startTime,
|
|
18
|
+
'ms'
|
|
19
|
+
);
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
console.log('Test done');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
test().catch(console.error);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
async function testStreaming() {
|
|
4
|
+
console.log('Testing basic cat with streams.stdin...');
|
|
5
|
+
|
|
6
|
+
try {
|
|
7
|
+
// Test streams.stdin with cat
|
|
8
|
+
const catCmd = $`cat`;
|
|
9
|
+
const stdin = await catCmd.streams.stdin;
|
|
10
|
+
|
|
11
|
+
console.log('stdin available:', !!stdin);
|
|
12
|
+
console.log('stdin writable:', stdin ? stdin.writable : 'N/A');
|
|
13
|
+
|
|
14
|
+
if (stdin) {
|
|
15
|
+
stdin.write('Hello from streams.stdin!\n');
|
|
16
|
+
stdin.write('Multiple lines work\n');
|
|
17
|
+
stdin.end();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const result = await catCmd;
|
|
21
|
+
console.log('Result code:', result.code);
|
|
22
|
+
console.log('Result stdout:', JSON.stringify(result.stdout));
|
|
23
|
+
console.log(
|
|
24
|
+
'Expected content present:',
|
|
25
|
+
result.stdout.includes('Hello from streams.stdin!')
|
|
26
|
+
);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error('Error:', error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
testStreaming().catch(console.error);
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test comprehensive streams.stdin functionality including:
|
|
5
|
+
* - Sending data to stdin
|
|
6
|
+
* - Using kill() method to interrupt processes
|
|
7
|
+
* - Testing with commands that actually read stdin
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { $ } from '../src/$.mjs';
|
|
11
|
+
|
|
12
|
+
console.log('=== Testing streams.stdin comprehensive functionality ===');
|
|
13
|
+
console.log('');
|
|
14
|
+
|
|
15
|
+
async function testStreamsStdinComprehensive() {
|
|
16
|
+
try {
|
|
17
|
+
console.log('TEST 1: Send data via streams.stdin to cat command');
|
|
18
|
+
|
|
19
|
+
const command1 = $`cat`;
|
|
20
|
+
console.log('✓ Cat command created');
|
|
21
|
+
|
|
22
|
+
// Access stdin stream - this should auto-start the command
|
|
23
|
+
const stdin1 = command1.streams.stdin;
|
|
24
|
+
console.log('✓ Accessed streams.stdin - command should be started');
|
|
25
|
+
console.log(' Started?', command1.started);
|
|
26
|
+
|
|
27
|
+
// Send some data and close stdin
|
|
28
|
+
if (stdin1) {
|
|
29
|
+
stdin1.write('Hello from streams.stdin!\n');
|
|
30
|
+
stdin1.write('Line 2 from stdin\n');
|
|
31
|
+
stdin1.write('Final line\n');
|
|
32
|
+
stdin1.end(); // Close stdin to let cat finish
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const result1 = await command1;
|
|
36
|
+
console.log('✓ Cat command completed with exit code:', result1.code);
|
|
37
|
+
console.log('✓ Output:', JSON.stringify(result1.stdout));
|
|
38
|
+
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log('TEST 2: Use kill() method to interrupt ping command');
|
|
41
|
+
|
|
42
|
+
const command2 = $`ping 8.8.8.8`;
|
|
43
|
+
console.log('✓ Ping command created');
|
|
44
|
+
|
|
45
|
+
// Access streams to start the command
|
|
46
|
+
const streams2 = command2.streams;
|
|
47
|
+
console.log('✓ Accessed streams - command should be started');
|
|
48
|
+
console.log(' Started?', command2.started);
|
|
49
|
+
|
|
50
|
+
// Wait for ping to start outputting
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
52
|
+
|
|
53
|
+
// Kill the command
|
|
54
|
+
console.log('✓ Killing ping command...');
|
|
55
|
+
command2.kill();
|
|
56
|
+
|
|
57
|
+
const result2 = await command2;
|
|
58
|
+
console.log('✓ Ping command terminated with exit code:', result2.code);
|
|
59
|
+
console.log('✓ Output length:', result2.stdout.length);
|
|
60
|
+
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log('TEST 3: Send data to grep command via stdin');
|
|
63
|
+
|
|
64
|
+
const command3 = $`grep "hello"`;
|
|
65
|
+
console.log('✓ Grep command created');
|
|
66
|
+
|
|
67
|
+
const stdin3 = command3.streams.stdin;
|
|
68
|
+
console.log('✓ Accessed streams.stdin for grep command');
|
|
69
|
+
|
|
70
|
+
// Send data to grep
|
|
71
|
+
if (stdin3) {
|
|
72
|
+
stdin3.write('this is a test line\\n');
|
|
73
|
+
stdin3.write('hello world\\n');
|
|
74
|
+
stdin3.write('another test line\\n');
|
|
75
|
+
stdin3.write('hello again\\n');
|
|
76
|
+
stdin3.end();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const result3 = await command3;
|
|
80
|
+
console.log('✓ Grep command completed with exit code:', result3.code);
|
|
81
|
+
console.log('✓ Filtered output:', JSON.stringify(result3.stdout));
|
|
82
|
+
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log('TEST 4: Test stdin with wc command');
|
|
85
|
+
|
|
86
|
+
const command4 = $`wc -l`;
|
|
87
|
+
console.log('✓ Word count command created');
|
|
88
|
+
|
|
89
|
+
const stdin4 = command4.streams.stdin;
|
|
90
|
+
if (stdin4) {
|
|
91
|
+
stdin4.write('Line 1\\n');
|
|
92
|
+
stdin4.write('Line 2\\n');
|
|
93
|
+
stdin4.write('Line 3\\n');
|
|
94
|
+
stdin4.write('Line 4\\n');
|
|
95
|
+
stdin4.end();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const result4 = await command4;
|
|
99
|
+
console.log('✓ Word count completed with exit code:', result4.code);
|
|
100
|
+
console.log('✓ Line count result:', JSON.stringify(result4.stdout.trim()));
|
|
101
|
+
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(
|
|
104
|
+
'TEST 5: Test streams.stdin availability immediately after creation'
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const command5 = $`cat`;
|
|
108
|
+
console.log('✓ Command5 created');
|
|
109
|
+
console.log(' Started?', command5.started);
|
|
110
|
+
|
|
111
|
+
// Check if stdin is available before auto-start
|
|
112
|
+
const stdin5 = command5.streams.stdin;
|
|
113
|
+
console.log('✓ Stdin available?', !!stdin5);
|
|
114
|
+
console.log(' Started after accessing stdin?', command5.started);
|
|
115
|
+
|
|
116
|
+
if (stdin5) {
|
|
117
|
+
stdin5.write('Testing immediate availability\\n');
|
|
118
|
+
stdin5.end();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const result5 = await command5;
|
|
122
|
+
console.log('✓ Result:', JSON.stringify(result5.stdout));
|
|
123
|
+
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('✅ ALL STREAMS.STDIN COMPREHENSIVE TESTS COMPLETED!');
|
|
126
|
+
} catch (error) {
|
|
127
|
+
console.log('');
|
|
128
|
+
console.error('❌ STREAMS.STDIN COMPREHENSIVE TEST FAILED:', error.message);
|
|
129
|
+
console.error(error.stack);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
testStreamsStdinComprehensive();
|