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,115 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Test comprehensive resource cleanup
|
|
3
|
+
// This runs in a subprocess for isolation
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
8
|
+
|
|
9
|
+
console.log('TEST: Starting cleanup verification');
|
|
10
|
+
|
|
11
|
+
// Test 1: Virtual command cleanup
|
|
12
|
+
console.log('TEST: Virtual command cleanup');
|
|
13
|
+
const v1 = $`echo "test1"`;
|
|
14
|
+
await v1;
|
|
15
|
+
console.log(`RESULT: virtual_finished=${v1.finished}`);
|
|
16
|
+
|
|
17
|
+
// Test 2: Real process cleanup
|
|
18
|
+
console.log('TEST: Real process cleanup');
|
|
19
|
+
const r1 = $`/bin/echo "test2"`;
|
|
20
|
+
await r1;
|
|
21
|
+
console.log(`RESULT: real_finished=${r1.finished}`);
|
|
22
|
+
|
|
23
|
+
// Test 3: Error cleanup
|
|
24
|
+
console.log('TEST: Error cleanup');
|
|
25
|
+
const e1 = $`exit 1`;
|
|
26
|
+
try {
|
|
27
|
+
await e1;
|
|
28
|
+
} catch (e) {
|
|
29
|
+
// Expected
|
|
30
|
+
}
|
|
31
|
+
console.log(`RESULT: error_finished=${e1.finished}`);
|
|
32
|
+
|
|
33
|
+
// Test 4: Kill cleanup
|
|
34
|
+
console.log('TEST: Kill cleanup');
|
|
35
|
+
const k1 = $`sleep 10`;
|
|
36
|
+
const kp = k1.start();
|
|
37
|
+
setTimeout(() => k1.kill(), 10);
|
|
38
|
+
try {
|
|
39
|
+
await kp;
|
|
40
|
+
} catch (e) {
|
|
41
|
+
// Expected
|
|
42
|
+
}
|
|
43
|
+
console.log(`RESULT: kill_finished=${k1.finished}`);
|
|
44
|
+
|
|
45
|
+
// Test 5: Pipeline cleanup
|
|
46
|
+
console.log('TEST: Pipeline cleanup');
|
|
47
|
+
const p1 = await $`echo "test" | /bin/cat | /bin/cat`;
|
|
48
|
+
console.log(
|
|
49
|
+
`RESULT: pipeline_output=${p1.stdout ? p1.stdout.trim() : 'no_output'}`
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
// Test 6: Event listener cleanup
|
|
53
|
+
console.log('TEST: Event listener cleanup');
|
|
54
|
+
const ev1 = $`echo "test"`;
|
|
55
|
+
ev1.on('data', () => {});
|
|
56
|
+
ev1.on('end', () => {});
|
|
57
|
+
await ev1;
|
|
58
|
+
console.log(`RESULT: event_listeners_size=${ev1.listeners.size}`);
|
|
59
|
+
|
|
60
|
+
// Test 7: Concurrent command cleanup
|
|
61
|
+
console.log('TEST: Concurrent command cleanup');
|
|
62
|
+
const concurrent = [$`echo "c1"`, $`echo "c2"`, $`echo "c3"`];
|
|
63
|
+
await Promise.all(concurrent);
|
|
64
|
+
console.log(
|
|
65
|
+
`RESULT: concurrent_finished=${concurrent.every((c) => c.finished)}`
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// Test 8: Not awaited cleanup
|
|
69
|
+
console.log('TEST: Not awaited cleanup');
|
|
70
|
+
const na1 = $`echo "not awaited"`;
|
|
71
|
+
na1.start(); // Start but don't await
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
73
|
+
console.log(`RESULT: not_awaited_finished=${na1.finished}`);
|
|
74
|
+
|
|
75
|
+
// Test 9: Stream iterator break cleanup
|
|
76
|
+
console.log('TEST: Stream iterator break cleanup');
|
|
77
|
+
const si1 = $`for i in 1 2 3; do echo $i; sleep 0.01; done`;
|
|
78
|
+
let iterations = 0;
|
|
79
|
+
for await (const chunk of si1.stream()) {
|
|
80
|
+
iterations++;
|
|
81
|
+
if (iterations >= 2) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
console.log(`RESULT: stream_iterator_finished=${si1.finished}`);
|
|
86
|
+
|
|
87
|
+
// Test 10: AbortController cleanup
|
|
88
|
+
console.log('TEST: AbortController cleanup');
|
|
89
|
+
const ac1 = $`sleep 10`;
|
|
90
|
+
const acp = ac1.start();
|
|
91
|
+
const hadController = ac1._abortController !== null;
|
|
92
|
+
ac1.kill();
|
|
93
|
+
try {
|
|
94
|
+
await acp;
|
|
95
|
+
} catch (e) {
|
|
96
|
+
// Expected
|
|
97
|
+
}
|
|
98
|
+
console.log(`RESULT: had_abort_controller=${hadController}`);
|
|
99
|
+
console.log(
|
|
100
|
+
`RESULT: abort_controller_cleaned=${ac1._abortController === null}`
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// Final check: No lingering SIGINT handlers
|
|
104
|
+
const finalListeners = process.listeners('SIGINT').filter((l) => {
|
|
105
|
+
const str = l.toString();
|
|
106
|
+
return (
|
|
107
|
+
str.includes('activeProcessRunners') ||
|
|
108
|
+
str.includes('ProcessRunner') ||
|
|
109
|
+
str.includes('activeChildren')
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
console.log(`RESULT: final_sigint_handlers=${finalListeners.length}`);
|
|
113
|
+
|
|
114
|
+
console.log('TEST: Complete');
|
|
115
|
+
process.exit(0);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Using AnsiUtils.cleanForProcessing() for Buffer data
|
|
4
|
+
|
|
5
|
+
import { $, AnsiUtils } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Using AnsiUtils.cleanForProcessing() for Buffer data:');
|
|
8
|
+
const colorCommand =
|
|
9
|
+
'printf "\\033[31mRed text\\033[0m \\033[32mGreen text\\033[0m \\033[34mBlue text\\033[0m\\n"';
|
|
10
|
+
|
|
11
|
+
const result = await $`sh -c ${colorCommand}`;
|
|
12
|
+
const buffer = Buffer.from(result.stdout);
|
|
13
|
+
const cleanBuffer = AnsiUtils.cleanForProcessing(buffer);
|
|
14
|
+
console.log(`Clean buffer: "${cleanBuffer.toString().trim()}"`);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Default behavior (ANSI colors preserved)
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Default behavior (ANSI colors preserved):');
|
|
8
|
+
const colorCommand =
|
|
9
|
+
'printf "\\033[31mRed text\\033[0m \\033[32mGreen text\\033[0m \\033[34mBlue text\\033[0m\\n"';
|
|
10
|
+
|
|
11
|
+
const result = await $`sh -c ${colorCommand}`;
|
|
12
|
+
console.log('Visual output:');
|
|
13
|
+
process.stdout.write(result.stdout); // Show actual colors
|
|
14
|
+
console.log('Raw string representation:');
|
|
15
|
+
console.log(`"${result.stdout.replace(/\x1b/g, '\\x1b')}"`);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Per-command ANSI configuration
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Per-command ANSI configuration:');
|
|
8
|
+
const colorCommand =
|
|
9
|
+
'printf "\\033[31mRed text\\033[0m \\033[32mGreen text\\033[0m \\033[34mBlue text\\033[0m\\n"';
|
|
10
|
+
|
|
11
|
+
// Test with the process runner's ansi option
|
|
12
|
+
const proc = $`sh -c ${colorCommand}`;
|
|
13
|
+
proc.options.ansi = { preserveAnsi: false };
|
|
14
|
+
const result = await proc;
|
|
15
|
+
console.log(`Output with ANSI disabled: "${result.stdout.trim()}"`);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Using AnsiUtils.stripAnsi() for clean data processing
|
|
4
|
+
|
|
5
|
+
import { $, AnsiUtils } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Using AnsiUtils.stripAnsi() for clean data processing:');
|
|
8
|
+
const colorCommand =
|
|
9
|
+
'printf "\\033[31mRed text\\033[0m \\033[32mGreen text\\033[0m \\033[34mBlue text\\033[0m\\n"';
|
|
10
|
+
|
|
11
|
+
const result = await $`sh -c ${colorCommand}`;
|
|
12
|
+
const stripped = AnsiUtils.stripAnsi(result.stdout);
|
|
13
|
+
console.log(`Stripped: "${stripped.trim()}"`);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
import { appendFileSync } from 'fs';
|
|
5
|
+
|
|
6
|
+
console.log('🤖 Command-stream: Claude → jq pipeline');
|
|
7
|
+
|
|
8
|
+
let chunkCount = 0;
|
|
9
|
+
const logFile = 'claude-jq-output.log';
|
|
10
|
+
|
|
11
|
+
const command = $({
|
|
12
|
+
stdin: 'hi\n',
|
|
13
|
+
})`claude --output-format stream-json --verbose --model sonnet | jq -r '.type'`;
|
|
14
|
+
|
|
15
|
+
command
|
|
16
|
+
.on('data', (chunk) => {
|
|
17
|
+
chunkCount++;
|
|
18
|
+
const data = chunk.data.toString();
|
|
19
|
+
console.log(`📦 CHUNK ${chunkCount}: ${data.trim()}`);
|
|
20
|
+
|
|
21
|
+
// Write to file simultaneously
|
|
22
|
+
appendFileSync(logFile, `Chunk ${chunkCount}: ${data}`);
|
|
23
|
+
})
|
|
24
|
+
.on('end', (result) => {
|
|
25
|
+
console.log(
|
|
26
|
+
`✅ Got ${chunkCount} chunks, saved to ${logFile}, exit: ${result.code}`
|
|
27
|
+
);
|
|
28
|
+
})
|
|
29
|
+
.start();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('🤖 Command-stream: Claude with stdin');
|
|
6
|
+
|
|
7
|
+
let chunkCount = 0;
|
|
8
|
+
|
|
9
|
+
const command = $({
|
|
10
|
+
stdin: 'hi\n',
|
|
11
|
+
})`claude --output-format stream-json --verbose --model sonnet`;
|
|
12
|
+
|
|
13
|
+
command
|
|
14
|
+
.on('data', (chunk) => {
|
|
15
|
+
chunkCount++;
|
|
16
|
+
console.log(`📦 CHUNK ${chunkCount}:`);
|
|
17
|
+
console.log(chunk.data.toString());
|
|
18
|
+
console.log('---');
|
|
19
|
+
})
|
|
20
|
+
.on('end', (result) => {
|
|
21
|
+
console.log(`✅ Got ${chunkCount} chunks, exit: ${result.code}`);
|
|
22
|
+
})
|
|
23
|
+
.start();
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Comprehensive demonstration of command-stream streaming interfaces (Issue #33)
|
|
5
|
+
* Shows: streams.stdin, streams.stdout, streams.stderr, buffers, strings, kill()
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { $ } from '../src/$.mjs';
|
|
9
|
+
|
|
10
|
+
console.log('🚀 command-stream: Comprehensive Streaming Demo');
|
|
11
|
+
console.log('='.repeat(50));
|
|
12
|
+
|
|
13
|
+
async function comprehensiveDemo() {
|
|
14
|
+
console.log('\\n1️⃣ STREAMS.STDIN: Send data to commands that read stdin');
|
|
15
|
+
|
|
16
|
+
const echoCmd = $`cat`; // cat reads from stdin and outputs to stdout
|
|
17
|
+
const stdin = echoCmd.streams.stdin;
|
|
18
|
+
console.log(` Auto-started? ${echoCmd.started}`);
|
|
19
|
+
|
|
20
|
+
if (stdin) {
|
|
21
|
+
stdin.write('Hello from streams.stdin!\\n');
|
|
22
|
+
stdin.write('Multiple lines work perfectly\\n');
|
|
23
|
+
stdin.end();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const echoResult = await echoCmd;
|
|
27
|
+
console.log(` ✅ Output: ${JSON.stringify(echoResult.stdout)}`);
|
|
28
|
+
|
|
29
|
+
console.log('\\n2️⃣ KILL() METHOD: Interrupt processes that ignore stdin');
|
|
30
|
+
|
|
31
|
+
const pingCmd = $`ping -c 100 8.8.8.8`; // Long ping, will be interrupted
|
|
32
|
+
|
|
33
|
+
// Access stdout to start and monitor
|
|
34
|
+
const pingOut = pingCmd.streams.stdout;
|
|
35
|
+
let pingData = '';
|
|
36
|
+
if (pingOut) {
|
|
37
|
+
pingOut.on('data', (chunk) => {
|
|
38
|
+
pingData += chunk.toString();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Kill after 1.5 seconds
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
console.log(' 🔪 Killing ping with kill() method...');
|
|
45
|
+
pingCmd.kill();
|
|
46
|
+
}, 1500);
|
|
47
|
+
|
|
48
|
+
const pingResult = await pingCmd;
|
|
49
|
+
console.log(` ✅ Ping terminated, exit code: ${pingResult.code}`);
|
|
50
|
+
console.log(` 📊 Captured ${pingResult.stdout.length} bytes of output`);
|
|
51
|
+
|
|
52
|
+
console.log('\\n3️⃣ BUFFERS INTERFACE: Get binary data');
|
|
53
|
+
|
|
54
|
+
const bufferCmd = $`echo -n "Binary data test"`;
|
|
55
|
+
const stdoutBuffer = await bufferCmd.buffers.stdout;
|
|
56
|
+
console.log(` ✅ Buffer length: ${stdoutBuffer.length} bytes`);
|
|
57
|
+
console.log(
|
|
58
|
+
` ✅ Buffer content: ${JSON.stringify(stdoutBuffer.toString())}`
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
console.log('\\n4️⃣ STRINGS INTERFACE: Get text data');
|
|
62
|
+
|
|
63
|
+
const stringCmd = $`echo "String data test"`;
|
|
64
|
+
const stdoutString = await stringCmd.strings.stdout;
|
|
65
|
+
console.log(` ✅ String result: ${JSON.stringify(stdoutString.trim())}`);
|
|
66
|
+
|
|
67
|
+
console.log('\\n5️⃣ MIXED STDOUT/STDERR CAPTURE');
|
|
68
|
+
|
|
69
|
+
const mixedCmd = $`sh -c 'echo "stdout line" && echo "stderr line" >&2'`;
|
|
70
|
+
const [stdout, stderr] = await Promise.all([
|
|
71
|
+
mixedCmd.strings.stdout,
|
|
72
|
+
mixedCmd.strings.stderr,
|
|
73
|
+
]);
|
|
74
|
+
console.log(` ✅ stdout: ${JSON.stringify(stdout.trim())}`);
|
|
75
|
+
console.log(` ✅ stderr: ${JSON.stringify(stderr.trim())}`);
|
|
76
|
+
|
|
77
|
+
console.log('\\n6️⃣ NO AUTO-START UNTIL PROPERTY ACCESS');
|
|
78
|
+
|
|
79
|
+
const lazyCmd = $`echo "lazy loading test"`;
|
|
80
|
+
console.log(` Created command, started? ${lazyCmd.started}`);
|
|
81
|
+
|
|
82
|
+
const lazyStreams = lazyCmd.streams;
|
|
83
|
+
console.log(` Accessed .streams, started? ${lazyCmd.started}`);
|
|
84
|
+
|
|
85
|
+
const lazyStdout = lazyStreams.stdout; // This triggers auto-start
|
|
86
|
+
console.log(` Accessed .streams.stdout, started? ${lazyCmd.started}`);
|
|
87
|
+
|
|
88
|
+
const lazyResult = await lazyCmd;
|
|
89
|
+
console.log(` ✅ Result: ${JSON.stringify(lazyResult.stdout.trim())}`);
|
|
90
|
+
|
|
91
|
+
console.log('\\n7️⃣ BACKWARD COMPATIBILITY');
|
|
92
|
+
|
|
93
|
+
const oldStyleCmd = $`echo "backward compatible"`;
|
|
94
|
+
const oldResult = await oldStyleCmd; // Traditional await syntax
|
|
95
|
+
console.log(
|
|
96
|
+
` ✅ Old style works: ${JSON.stringify(oldResult.stdout.trim())}`
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
console.log(`\\n${'='.repeat(50)}`);
|
|
100
|
+
console.log('🎉 SUMMARY: Issue #33 Implementation Complete!');
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(
|
|
103
|
+
'✅ command.streams.stdin/stdout/stderr - immediate stream access'
|
|
104
|
+
);
|
|
105
|
+
console.log('✅ command.buffers.stdin/stdout/stderr - binary data interface');
|
|
106
|
+
console.log('✅ command.strings.stdin/stdout/stderr - text data interface');
|
|
107
|
+
console.log(
|
|
108
|
+
'✅ Auto-start only on actual property access, not parent object'
|
|
109
|
+
);
|
|
110
|
+
console.log('✅ kill() method for interrupting processes');
|
|
111
|
+
console.log('✅ Full backward compatibility with await command');
|
|
112
|
+
console.log('✅ All 484 tests passing');
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log('📖 Use cases:');
|
|
115
|
+
console.log(' • streams.stdin → Send data to interactive commands');
|
|
116
|
+
console.log(' • kill() → Interrupt network/long-running commands');
|
|
117
|
+
console.log(' • buffers → Binary data processing');
|
|
118
|
+
console.log(' • strings → Text processing and filtering');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
comprehensiveDemo().catch(console.error);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Multiple concurrent processes CTRL+C handling
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Multiple concurrent processes');
|
|
8
|
+
console.log('Starting 3 processes - press CTRL+C to interrupt all...\n');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
await Promise.all([
|
|
12
|
+
$`/bin/sleep 20`,
|
|
13
|
+
$`/sbin/ping -c 50 google.com`,
|
|
14
|
+
$`/usr/bin/yes > /dev/null`,
|
|
15
|
+
]);
|
|
16
|
+
console.log('All processes completed');
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log('\n✓ All processes were interrupted');
|
|
19
|
+
console.log(`Exit code: ${error.code}`);
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Long-running command that can be interrupted with CTRL+C
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Long-running command (ping)');
|
|
8
|
+
console.log('Press CTRL+C to interrupt...\n');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// This will inherit stdin and properly handle CTRL+C
|
|
12
|
+
await $`ping -c 100 8.8.8.8`;
|
|
13
|
+
console.log('Ping completed successfully');
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.log('\n✓ Command interrupted by CTRL+C');
|
|
16
|
+
console.log(`Exit code: ${error.code}`);
|
|
17
|
+
if (error.code === 130 || error.code === -2) {
|
|
18
|
+
console.log('(This is the expected exit code for SIGINT)');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Real system command CTRL+C handling
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Real system command (ping)');
|
|
8
|
+
console.log('Starting ping command - press CTRL+C to interrupt...\n');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Use a real system command that runs indefinitely
|
|
12
|
+
await $`/sbin/ping -c 100 8.8.8.8`;
|
|
13
|
+
console.log('Ping completed successfully');
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.log('\n✓ Ping was interrupted');
|
|
16
|
+
console.log(`Exit code: ${error.code}`);
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Sleep command with signal handling
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Sleep command');
|
|
8
|
+
console.log('Press CTRL+C to interrupt the 10-second sleep...\n');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
console.log('Sleeping for 10 seconds...');
|
|
12
|
+
await $`sleep 10`;
|
|
13
|
+
console.log('Sleep completed successfully');
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.log('\n✓ Sleep interrupted by CTRL+C');
|
|
16
|
+
console.log(`Exit code: ${error.code}`);
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Command with stdin forwarding and CTRL+C handling
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Command with stdin forwarding');
|
|
8
|
+
console.log(
|
|
9
|
+
'This example shows that stdin is properly forwarded while still handling CTRL+C\n'
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
// Create a simple script that reads input
|
|
14
|
+
await $`echo "Type some text and press Enter, or press CTRL+C to exit:"`;
|
|
15
|
+
await $`head -n 3`; // Read up to 3 lines
|
|
16
|
+
console.log('Input reading completed');
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log('\n✓ Command interrupted by CTRL+C');
|
|
19
|
+
console.log(`Exit code: ${error.code}`);
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Virtual sleep command CTRL+C handling
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Virtual sleep command');
|
|
8
|
+
console.log('Sleeping for 30 seconds - press CTRL+C to interrupt...\n');
|
|
9
|
+
|
|
10
|
+
const result = await $`sleep 30`;
|
|
11
|
+
|
|
12
|
+
if (result.code === 0) {
|
|
13
|
+
console.log('Sleep completed successfully');
|
|
14
|
+
} else {
|
|
15
|
+
console.log('✓ Sleep was interrupted');
|
|
16
|
+
console.log(`Exit code: ${result.code}`);
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Testing already started behavior
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Testing already started behavior:');
|
|
8
|
+
const runner = $`echo "already started"`;
|
|
9
|
+
|
|
10
|
+
// First start
|
|
11
|
+
const firstResult = await runner.start({ capture: true });
|
|
12
|
+
console.log('First start result:', JSON.stringify(firstResult.stdout));
|
|
13
|
+
|
|
14
|
+
// Try to start again with different options
|
|
15
|
+
const secondResult = await runner.start({ capture: false });
|
|
16
|
+
console.log(
|
|
17
|
+
'Second start result (should ignore new options):',
|
|
18
|
+
JSON.stringify(secondResult.stdout)
|
|
19
|
+
);
|
|
20
|
+
console.log('Same result reference?', firstResult === secondResult);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, processOutput, getAnsiConfig } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Debug ANSI Processing ===\n');
|
|
6
|
+
|
|
7
|
+
console.log('1. Current global ANSI config:');
|
|
8
|
+
console.log(getAnsiConfig());
|
|
9
|
+
|
|
10
|
+
console.log('\n2. Testing processOutput function directly:');
|
|
11
|
+
const testData = '\x1b[31mRed text\x1b[0m normal text';
|
|
12
|
+
console.log('Input:', JSON.stringify(testData));
|
|
13
|
+
const processed = processOutput(testData);
|
|
14
|
+
console.log('Processed:', JSON.stringify(processed));
|
|
15
|
+
console.log('Are they equal?', testData === processed);
|
|
16
|
+
|
|
17
|
+
console.log('\n3. Testing with jq command and manual event handling:');
|
|
18
|
+
const proc = $`echo '{"test": "value"}' | jq --color-output .`;
|
|
19
|
+
|
|
20
|
+
const rawChunks = [];
|
|
21
|
+
const processedChunks = [];
|
|
22
|
+
|
|
23
|
+
// Capture raw stdout before processing
|
|
24
|
+
proc.child.stdout.on('data', (chunk) => {
|
|
25
|
+
rawChunks.push(chunk);
|
|
26
|
+
console.log('RAW CHUNK:', JSON.stringify(chunk.toString()));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Capture processed output from events
|
|
30
|
+
proc.on('stdout', (chunk) => {
|
|
31
|
+
processedChunks.push(chunk);
|
|
32
|
+
console.log('PROCESSED CHUNK:', JSON.stringify(chunk.toString()));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await proc;
|
|
36
|
+
|
|
37
|
+
console.log('\n4. Final comparison:');
|
|
38
|
+
const rawResult = Buffer.concat(rawChunks).toString();
|
|
39
|
+
const processedResult = Buffer.concat(processedChunks).toString();
|
|
40
|
+
console.log('Raw result:', JSON.stringify(rawResult));
|
|
41
|
+
console.log('Processed result:', JSON.stringify(processedResult));
|
|
42
|
+
console.log('Results identical?', rawResult === processedResult);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Basic Streaming Debug ===');
|
|
6
|
+
|
|
7
|
+
console.log('1. Testing await pattern:');
|
|
8
|
+
const result1 = await $`echo "test1"`;
|
|
9
|
+
console.log('Await result:', result1.stdout.trim());
|
|
10
|
+
|
|
11
|
+
console.log('2. Testing stream pattern:');
|
|
12
|
+
const chunks = [];
|
|
13
|
+
const cmd = $`echo "test2"`;
|
|
14
|
+
try {
|
|
15
|
+
for await (const chunk of cmd.stream()) {
|
|
16
|
+
chunks.push(chunk);
|
|
17
|
+
console.log(
|
|
18
|
+
'Stream chunk:',
|
|
19
|
+
chunk.type,
|
|
20
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
console.log('Stream completed, chunks:', chunks.length);
|
|
24
|
+
} catch (e) {
|
|
25
|
+
console.log('Stream error:', e.message);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
console.log('3. Testing stream with command that produces multiple lines:');
|
|
29
|
+
const cmd2 = $`sh -c 'echo "line1"; echo "line2"'`;
|
|
30
|
+
let count = 0;
|
|
31
|
+
for await (const chunk of cmd2.stream()) {
|
|
32
|
+
count++;
|
|
33
|
+
console.log(
|
|
34
|
+
`Chunk ${count}:`,
|
|
35
|
+
chunk.type,
|
|
36
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
37
|
+
);
|
|
38
|
+
if (count >= 10) {
|
|
39
|
+
console.log('Breaking after 10 chunks to prevent infinite loop');
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.log('Debug script completed successfully!');
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Debug buildShellCommand function to see exactly what it produces
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
|
|
6
|
+
// Recreate buildShellCommand logic
|
|
7
|
+
function quote(value) {
|
|
8
|
+
if (value === null || value === undefined) {
|
|
9
|
+
return '""';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const str = String(value);
|
|
13
|
+
if (str === '') {
|
|
14
|
+
return '""';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Check if value needs quoting (contains spaces or special characters)
|
|
18
|
+
if (/^[a-zA-Z0-9._/:-]+$/.test(str)) {
|
|
19
|
+
return str; // Safe to use unquoted
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function buildShellCommand(strings, values) {
|
|
26
|
+
console.log('buildShellCommand input:', { strings, values });
|
|
27
|
+
|
|
28
|
+
let out = '';
|
|
29
|
+
for (let i = 0; i < strings.length; i++) {
|
|
30
|
+
out += strings[i];
|
|
31
|
+
if (i < values.length) {
|
|
32
|
+
const v = values[i];
|
|
33
|
+
if (
|
|
34
|
+
v &&
|
|
35
|
+
typeof v === 'object' &&
|
|
36
|
+
Object.prototype.hasOwnProperty.call(v, 'raw')
|
|
37
|
+
) {
|
|
38
|
+
console.log(`Using raw value: ${String(v.raw)}`);
|
|
39
|
+
out += String(v.raw);
|
|
40
|
+
} else {
|
|
41
|
+
const quoted = quote(v);
|
|
42
|
+
console.log(`Quoting value: "${v}" -> "${quoted}"`);
|
|
43
|
+
out += quoted;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log('buildShellCommand output:', out);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log('=== buildShellCommand Debug ===');
|
|
53
|
+
|
|
54
|
+
console.log('\n--- Case 1: Template literal $`echo hello` ---');
|
|
55
|
+
const strings1 = ['echo hello'];
|
|
56
|
+
const values1 = [];
|
|
57
|
+
const result1 = buildShellCommand(strings1, values1);
|
|
58
|
+
|
|
59
|
+
console.log(
|
|
60
|
+
'\n--- Case 2: String interpolation $`${cmd}` where cmd="echo hello" ---'
|
|
61
|
+
);
|
|
62
|
+
const strings2 = ['', ''];
|
|
63
|
+
const values2 = ['echo hello'];
|
|
64
|
+
const result2 = buildShellCommand(strings2, values2);
|
|
65
|
+
|
|
66
|
+
console.log(
|
|
67
|
+
'\n--- Case 3: String interpolation $`echo ${arg}` where arg="hello" ---'
|
|
68
|
+
);
|
|
69
|
+
const strings3 = ['echo ', ''];
|
|
70
|
+
const values3 = ['hello'];
|
|
71
|
+
const result3 = buildShellCommand(strings3, values3);
|
|
72
|
+
|
|
73
|
+
console.log('\n--- Case 4: Multiple args $`echo ${arg1} ${arg2}` ---');
|
|
74
|
+
const strings4 = ['echo ', ' ', ''];
|
|
75
|
+
const values4 = ['hello', 'world'];
|
|
76
|
+
const result4 = buildShellCommand(strings4, values4);
|
|
77
|
+
|
|
78
|
+
console.log('\n=== Summary ===');
|
|
79
|
+
console.log(`Case 1 (template): "${result1}"`);
|
|
80
|
+
console.log(`Case 2 (interpolation): "${result2}"`);
|
|
81
|
+
console.log(`Case 3 (mixed): "${result3}"`);
|
|
82
|
+
console.log(`Case 4 (multiple): "${result4}"`);
|