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,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, getAnsiConfig } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Simple ANSI Debug ===\n');
|
|
6
|
+
|
|
7
|
+
console.log('1. Config check:');
|
|
8
|
+
console.log('Global config:', getAnsiConfig());
|
|
9
|
+
|
|
10
|
+
console.log('\n2. Direct terminal write test:');
|
|
11
|
+
const testStr = '\x1b[31mRed text\x1b[0m normal';
|
|
12
|
+
console.log('Writing directly to terminal:');
|
|
13
|
+
process.stdout.write(`${testStr}\n`);
|
|
14
|
+
|
|
15
|
+
console.log('\n3. jq command test:');
|
|
16
|
+
const result = await $`echo '{"name": "test"}' | jq --color-output .`;
|
|
17
|
+
console.log('Result stdout type:', typeof result.stdout);
|
|
18
|
+
console.log('Result stdout raw bytes (first 50):');
|
|
19
|
+
console.log(Buffer.from(result.stdout.slice(0, 50)));
|
|
20
|
+
|
|
21
|
+
console.log('\nDirect write of result.stdout:');
|
|
22
|
+
process.stdout.write(result.stdout);
|
|
23
|
+
|
|
24
|
+
console.log('\n4. Manual event handling test:');
|
|
25
|
+
const proc = $`echo '{"name": "test"}' | jq --color-output .`;
|
|
26
|
+
|
|
27
|
+
proc.on('stdout', (chunk) => {
|
|
28
|
+
console.log('Event chunk type:', typeof chunk);
|
|
29
|
+
console.log('Event chunk constructor:', chunk.constructor.name);
|
|
30
|
+
console.log(
|
|
31
|
+
'Event chunk raw (first 30 bytes):',
|
|
32
|
+
Buffer.from(chunk.slice(0, 30))
|
|
33
|
+
);
|
|
34
|
+
console.log('Writing event chunk directly:');
|
|
35
|
+
process.stdout.write('[EVENT] ');
|
|
36
|
+
process.stdout.write(chunk);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await proc;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Simplified Finished Field Test ===');
|
|
6
|
+
|
|
7
|
+
function getSigintHandlerCount() {
|
|
8
|
+
const sigintListeners = process.listeners('SIGINT');
|
|
9
|
+
const commandStreamListeners = sigintListeners.filter((l) => {
|
|
10
|
+
const str = l.toString();
|
|
11
|
+
return (
|
|
12
|
+
str.includes('activeProcessRunners') ||
|
|
13
|
+
str.includes('ProcessRunner') ||
|
|
14
|
+
str.includes('activeChildren')
|
|
15
|
+
);
|
|
16
|
+
});
|
|
17
|
+
return commandStreamListeners.length;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const tests = [
|
|
21
|
+
{
|
|
22
|
+
name: 'Normal completion with cleanup',
|
|
23
|
+
test: async () => {
|
|
24
|
+
console.log(' Before:', getSigintHandlerCount(), 'handlers');
|
|
25
|
+
const result = await $`echo "test"`;
|
|
26
|
+
console.log(' After:', getSigintHandlerCount(), 'handlers');
|
|
27
|
+
return {
|
|
28
|
+
stdout: result.stdout.trim(),
|
|
29
|
+
finished: result.constructor.name === 'Object', // This means it completed normally
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
name: 'Multiple finish() calls (idempotent)',
|
|
36
|
+
test: async () => {
|
|
37
|
+
const runner = $`echo "idempotent"`;
|
|
38
|
+
await runner;
|
|
39
|
+
|
|
40
|
+
console.log(' finished after normal completion:', runner.finished);
|
|
41
|
+
|
|
42
|
+
// Try to finish again
|
|
43
|
+
const result2 = runner.finish({
|
|
44
|
+
code: 999,
|
|
45
|
+
stdout: 'should not overwrite',
|
|
46
|
+
stderr: '',
|
|
47
|
+
stdin: '',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
finished: runner.finished,
|
|
52
|
+
stdout: runner.result.stdout.trim(),
|
|
53
|
+
returnedStdout: result2.stdout.trim(),
|
|
54
|
+
sameResult: runner.result.stdout === result2.stdout,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
{
|
|
60
|
+
name: 'Kill scenario with cleanup',
|
|
61
|
+
test: async () => {
|
|
62
|
+
console.log(' Before kill:', getSigintHandlerCount(), 'handlers');
|
|
63
|
+
|
|
64
|
+
const runner = $`sleep 0.1`;
|
|
65
|
+
const promise = runner.start();
|
|
66
|
+
|
|
67
|
+
console.log(' During execution:', getSigintHandlerCount(), 'handlers');
|
|
68
|
+
|
|
69
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
70
|
+
runner.kill('SIGTERM');
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
await promise;
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// Expected
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
console.log(' After kill:', getSigintHandlerCount(), 'handlers');
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
finished: runner.finished,
|
|
82
|
+
code: runner.result.code,
|
|
83
|
+
killed: runner.result.stderr.includes('killed'),
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
console.log('\nTesting simplified finished field design...\n');
|
|
90
|
+
|
|
91
|
+
for (const { name, test } of tests) {
|
|
92
|
+
console.log(`🧪 ${name}:`);
|
|
93
|
+
try {
|
|
94
|
+
const result = await test();
|
|
95
|
+
console.log(' ✅ Result:', JSON.stringify(result, null, 4));
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.log(' ❌ Error:', error.message);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log('=== Test completed ===');
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
async function debugStackOverflow() {
|
|
4
|
+
console.log('Testing simple echo command...');
|
|
5
|
+
|
|
6
|
+
try {
|
|
7
|
+
const result = await $`echo "test"`;
|
|
8
|
+
console.log('Success! Result:', JSON.stringify(result.stdout.trim()));
|
|
9
|
+
} catch (error) {
|
|
10
|
+
console.log('Error:', error.message);
|
|
11
|
+
console.log('Stack:', error.stack?.slice(0, 500));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
console.log('\nTesting with strings.stdout access...');
|
|
15
|
+
try {
|
|
16
|
+
const cmd = $`echo "String test"`;
|
|
17
|
+
const str = await cmd.strings.stdout;
|
|
18
|
+
console.log('Success! String result:', JSON.stringify(str.trim()));
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.log('Error:', error.message);
|
|
21
|
+
console.log('Stack:', error.stack?.slice(0, 500));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
debugStackOverflow().catch(console.error);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Debug: Simple stdin test ===');
|
|
6
|
+
|
|
7
|
+
async function debugStdinSimple() {
|
|
8
|
+
console.log('Testing cat with explicit options...');
|
|
9
|
+
|
|
10
|
+
const cmd = $`cat`;
|
|
11
|
+
const stdin = cmd.streams.stdin;
|
|
12
|
+
|
|
13
|
+
console.log('Stdin available?', !!stdin);
|
|
14
|
+
console.log('Command started?', cmd.started);
|
|
15
|
+
|
|
16
|
+
if (stdin) {
|
|
17
|
+
console.log('Writing to stdin...');
|
|
18
|
+
stdin.write('test data\\n');
|
|
19
|
+
console.log('Ending stdin...');
|
|
20
|
+
stdin.end();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
console.log('Waiting for result...');
|
|
24
|
+
const result = await cmd;
|
|
25
|
+
console.log('Result:', result);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
debugStdinSimple().catch(console.error);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
async function debugStdin() {
|
|
6
|
+
console.log('🐛 Debugging stdin streams');
|
|
7
|
+
|
|
8
|
+
const catCmd = $`cat`;
|
|
9
|
+
console.log('Created cat command');
|
|
10
|
+
|
|
11
|
+
console.log('Awaiting stdin...');
|
|
12
|
+
const stdin = await catCmd.streams.stdin;
|
|
13
|
+
|
|
14
|
+
console.log('stdin type:', typeof stdin);
|
|
15
|
+
console.log('stdin constructor:', stdin ? stdin.constructor.name : 'null');
|
|
16
|
+
console.log('has write method:', !!(stdin && stdin.write));
|
|
17
|
+
console.log('is writable:', stdin ? stdin.writable : 'N/A');
|
|
18
|
+
console.log('is destroyed:', stdin ? stdin.destroyed : 'N/A');
|
|
19
|
+
|
|
20
|
+
if (stdin) {
|
|
21
|
+
console.log('stdin keys:', Object.keys(stdin));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Kill the process to clean up
|
|
25
|
+
catCmd.kill();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
debugStdin();
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Isolated StreamEmitter Debug ===');
|
|
6
|
+
|
|
7
|
+
const cmd = $`echo "test"`;
|
|
8
|
+
|
|
9
|
+
// Let's debug the listeners map directly
|
|
10
|
+
console.log('Initial listeners map:', cmd.listeners);
|
|
11
|
+
|
|
12
|
+
cmd.on('data', () => console.log('DATA listener called'));
|
|
13
|
+
console.log('After data listener:', cmd.listeners);
|
|
14
|
+
|
|
15
|
+
cmd.on('end', () => console.log('END listener called'));
|
|
16
|
+
console.log('After end listener:', cmd.listeners);
|
|
17
|
+
|
|
18
|
+
cmd.on('exit', () => console.log('EXIT listener called'));
|
|
19
|
+
console.log('After exit listener:', cmd.listeners);
|
|
20
|
+
|
|
21
|
+
// Override emit to debug the listener lookup
|
|
22
|
+
const originalEmit = cmd.emit.bind(cmd);
|
|
23
|
+
cmd.emit = function (event, ...args) {
|
|
24
|
+
const listeners = this.listeners.get(event);
|
|
25
|
+
console.log(
|
|
26
|
+
`EMIT ${event}: found ${listeners ? listeners.length : 0} listeners`
|
|
27
|
+
);
|
|
28
|
+
if (listeners) {
|
|
29
|
+
console.log(`Listeners array:`, listeners);
|
|
30
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
31
|
+
console.log(`Calling listener ${i} for ${event}`);
|
|
32
|
+
try {
|
|
33
|
+
listeners[i](...args);
|
|
34
|
+
console.log(`Listener ${i} for ${event} completed`);
|
|
35
|
+
} catch (e) {
|
|
36
|
+
console.log(`Listener ${i} for ${event} error:`, e.message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return this;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
console.log('\nStarting command...');
|
|
44
|
+
await cmd;
|
|
45
|
+
console.log('Command completed');
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('=== StreamEmitter Debug ===');
|
|
8
|
+
|
|
9
|
+
const cmd = $`echo "test"`;
|
|
10
|
+
|
|
11
|
+
cmd.on('data', (chunk) => {
|
|
12
|
+
console.log('[LISTENER] data received:', chunk.type);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
cmd.on('end', (result) => {
|
|
16
|
+
console.log('[LISTENER] end received:', result.code);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
cmd.on('exit', (code) => {
|
|
20
|
+
console.log('[LISTENER] exit received:', code);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
console.log('Starting await...');
|
|
24
|
+
await cmd;
|
|
25
|
+
console.log('Await completed');
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Events Debug ===');
|
|
6
|
+
|
|
7
|
+
console.log('Testing with manual event handlers:');
|
|
8
|
+
const cmd = $`echo "hello world"`;
|
|
9
|
+
|
|
10
|
+
cmd.on('data', (chunk) => {
|
|
11
|
+
console.log(
|
|
12
|
+
'Event: data',
|
|
13
|
+
chunk.type,
|
|
14
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
15
|
+
);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
cmd.on('stdout', (chunk) => {
|
|
19
|
+
console.log('Event: stdout', JSON.stringify(chunk.toString().trim()));
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
cmd.on('stderr', (chunk) => {
|
|
23
|
+
console.log('Event: stderr', JSON.stringify(chunk.toString().trim()));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
cmd.on('end', (result) => {
|
|
27
|
+
console.log('Event: end', {
|
|
28
|
+
code: result.code,
|
|
29
|
+
stdout: JSON.stringify(result.stdout.trim()),
|
|
30
|
+
stderr: JSON.stringify(result.stderr.trim()),
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
cmd.on('exit', (code) => {
|
|
35
|
+
console.log('Event: exit', code);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
console.log('Starting command...');
|
|
39
|
+
const result = await cmd;
|
|
40
|
+
console.log('Command completed with code:', result.code);
|
|
41
|
+
|
|
42
|
+
console.log('=== Stream Iterator Debug ===');
|
|
43
|
+
console.log('Now testing stream iterator:');
|
|
44
|
+
|
|
45
|
+
const cmd2 = $`echo "test stream"`;
|
|
46
|
+
let chunkCount = 0;
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
for await (const chunk of cmd2.stream()) {
|
|
51
|
+
chunkCount++;
|
|
52
|
+
const elapsed = Date.now() - startTime;
|
|
53
|
+
console.log(
|
|
54
|
+
`Stream chunk ${chunkCount} at ${elapsed}ms:`,
|
|
55
|
+
chunk.type,
|
|
56
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Safety break to prevent infinite loop
|
|
60
|
+
if (chunkCount >= 5) {
|
|
61
|
+
console.log('Safety break activated');
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.log('Stream iterator completed naturally');
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.log('Stream iterator error:', error.message);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
console.log('Debug completed!');
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Generator Debug ===');
|
|
6
|
+
|
|
7
|
+
const cmd = $`echo "test"`;
|
|
8
|
+
|
|
9
|
+
cmd.on('data', () => console.log('DATA listener called'));
|
|
10
|
+
cmd.on('end', () => console.log('END listener called'));
|
|
11
|
+
cmd.on('exit', () => console.log('EXIT listener called'));
|
|
12
|
+
|
|
13
|
+
console.log('Listeners before getting stream generator:', cmd.listeners.size);
|
|
14
|
+
|
|
15
|
+
// Get the stream generator (this is what might be triggering the issue)
|
|
16
|
+
const streamGenerator = cmd.stream();
|
|
17
|
+
|
|
18
|
+
console.log('Listeners after getting stream generator:', cmd.listeners.size);
|
|
19
|
+
|
|
20
|
+
// Don't iterate the generator, just await the command
|
|
21
|
+
await cmd;
|
|
22
|
+
|
|
23
|
+
console.log('Listeners after await:', cmd.listeners.size);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Getter Issue Debug ===');
|
|
6
|
+
|
|
7
|
+
// Test the exact same scenario as the failing test
|
|
8
|
+
disableVirtualCommands();
|
|
9
|
+
|
|
10
|
+
const process = $`echo "stream test"`;
|
|
11
|
+
process.start();
|
|
12
|
+
|
|
13
|
+
// Wait longer for child process initialization
|
|
14
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
15
|
+
|
|
16
|
+
console.log('process.child:', process.child);
|
|
17
|
+
console.log('process.child === null:', process.child === null);
|
|
18
|
+
console.log('process.child === undefined:', process.child === undefined);
|
|
19
|
+
|
|
20
|
+
console.log('Checking getter logic step by step:');
|
|
21
|
+
console.log('this.child ? this.child.stdout : null');
|
|
22
|
+
|
|
23
|
+
if (process.child) {
|
|
24
|
+
console.log('Branch: this.child is truthy');
|
|
25
|
+
console.log('this.child.stdout:', process.child.stdout);
|
|
26
|
+
console.log('returning this.child.stdout');
|
|
27
|
+
} else {
|
|
28
|
+
console.log('Branch: this.child is falsy');
|
|
29
|
+
console.log('returning null');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
console.log('process.stdout:', process.stdout);
|
|
33
|
+
console.log('process.stdout === null:', process.stdout === null);
|
|
34
|
+
console.log('process.stdout === undefined:', process.stdout === undefined);
|
|
35
|
+
console.log('typeof process.stdout:', typeof process.stdout);
|
|
36
|
+
|
|
37
|
+
await process;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Getter Debug ===');
|
|
6
|
+
|
|
7
|
+
disableVirtualCommands();
|
|
8
|
+
const cmd = $`echo "test"`;
|
|
9
|
+
cmd.start();
|
|
10
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
11
|
+
|
|
12
|
+
console.log('child:', cmd.child);
|
|
13
|
+
console.log('child type:', typeof cmd.child);
|
|
14
|
+
console.log('stdout:', cmd.stdout);
|
|
15
|
+
console.log('stdout type:', typeof cmd.stdout);
|
|
16
|
+
console.log('stdout === null:', cmd.stdout === null);
|
|
17
|
+
console.log('stdout === undefined:', cmd.stdout === undefined);
|
|
18
|
+
|
|
19
|
+
await cmd;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Internals Debug ===');
|
|
6
|
+
|
|
7
|
+
const cmd = $`sh -c 'echo "test"'`;
|
|
8
|
+
|
|
9
|
+
// Instrument the stream method to see internal state
|
|
10
|
+
const originalStream = cmd.stream.bind(cmd);
|
|
11
|
+
cmd.stream = function () {
|
|
12
|
+
console.log('stream() called');
|
|
13
|
+
|
|
14
|
+
const generator = originalStream();
|
|
15
|
+
|
|
16
|
+
// Override the generator's next method to log state changes
|
|
17
|
+
const originalNext = generator.next.bind(generator);
|
|
18
|
+
generator.next = function () {
|
|
19
|
+
console.log('generator.next() called');
|
|
20
|
+
const promise = originalNext();
|
|
21
|
+
|
|
22
|
+
promise
|
|
23
|
+
.then((result) => {
|
|
24
|
+
console.log('generator.next() resolved:', {
|
|
25
|
+
done: result.done,
|
|
26
|
+
hasValue: !!result.value,
|
|
27
|
+
valueType: result.value?.type,
|
|
28
|
+
});
|
|
29
|
+
})
|
|
30
|
+
.catch((err) => {
|
|
31
|
+
console.log('generator.next() error:', err.message);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return promise;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return generator;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
console.log('Starting stream test...');
|
|
41
|
+
|
|
42
|
+
const timeout = setTimeout(() => {
|
|
43
|
+
console.log('TIMEOUT: Stream test took too long');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}, 3000);
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
let count = 0;
|
|
49
|
+
for await (const chunk of cmd.stream()) {
|
|
50
|
+
count++;
|
|
51
|
+
console.log(`Received chunk ${count}:`, chunk.type);
|
|
52
|
+
|
|
53
|
+
if (count >= 2) {
|
|
54
|
+
console.log('Breaking after 2 chunks');
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
clearTimeout(timeout);
|
|
60
|
+
console.log('Stream test completed with', count, 'chunks');
|
|
61
|
+
} catch (error) {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
console.log('Stream test error:', error.message);
|
|
64
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Method Debug ===');
|
|
6
|
+
|
|
7
|
+
const cmd = $`echo "test"`;
|
|
8
|
+
|
|
9
|
+
console.log('Getting stream generator...');
|
|
10
|
+
const stream = cmd.stream();
|
|
11
|
+
|
|
12
|
+
console.log('Starting iteration...');
|
|
13
|
+
let chunkCount = 0;
|
|
14
|
+
|
|
15
|
+
// Set a timeout to prevent infinite hang
|
|
16
|
+
const timeout = setTimeout(() => {
|
|
17
|
+
console.log('TIMEOUT: Stream iteration took too long');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}, 5000);
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
for await (const chunk of stream) {
|
|
23
|
+
chunkCount++;
|
|
24
|
+
console.log(
|
|
25
|
+
`Chunk ${chunkCount}:`,
|
|
26
|
+
chunk.type,
|
|
27
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Safety break
|
|
31
|
+
if (chunkCount >= 3) {
|
|
32
|
+
console.log('Safety break after 3 chunks');
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
console.log(
|
|
39
|
+
'Stream iteration completed naturally with',
|
|
40
|
+
chunkCount,
|
|
41
|
+
'chunks'
|
|
42
|
+
);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
console.log('Stream iteration error:', error.message);
|
|
46
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
async function debugStreamObject() {
|
|
6
|
+
console.log('=== Debug stream object details ===');
|
|
7
|
+
|
|
8
|
+
const cmd = $`cat`;
|
|
9
|
+
|
|
10
|
+
console.log('Before accessing streams:');
|
|
11
|
+
console.log(' started:', cmd.started);
|
|
12
|
+
console.log(' child:', !!cmd.child);
|
|
13
|
+
|
|
14
|
+
const stdin = await cmd.streams.stdin;
|
|
15
|
+
|
|
16
|
+
console.log('\\nAfter accessing streams:');
|
|
17
|
+
console.log(' started:', cmd.started);
|
|
18
|
+
console.log(' child:', !!cmd.child);
|
|
19
|
+
console.log(' stdin type:', typeof stdin);
|
|
20
|
+
console.log(' stdin is null?', stdin === null);
|
|
21
|
+
console.log(' stdin constructor:', stdin ? stdin.constructor.name : 'N/A');
|
|
22
|
+
|
|
23
|
+
if (stdin) {
|
|
24
|
+
console.log(
|
|
25
|
+
' stdin methods:',
|
|
26
|
+
Object.getOwnPropertyNames(stdin)
|
|
27
|
+
.filter((name) => typeof stdin[name] === 'function')
|
|
28
|
+
.slice(0, 10)
|
|
29
|
+
);
|
|
30
|
+
console.log(' writable?', stdin.writable);
|
|
31
|
+
console.log(' destroyed?', stdin.destroyed);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (cmd.child) {
|
|
35
|
+
console.log('\\nChild process details:');
|
|
36
|
+
console.log(' child.stdin type:', typeof cmd.child.stdin);
|
|
37
|
+
console.log(' child.stdin === stdin?', cmd.child.stdin === stdin);
|
|
38
|
+
console.log(
|
|
39
|
+
' child.stdin writable?',
|
|
40
|
+
cmd.child.stdin ? cmd.child.stdin.writable : 'N/A'
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Try to write anyway
|
|
45
|
+
if (stdin && stdin.write) {
|
|
46
|
+
console.log('\\nWriting to stdin...');
|
|
47
|
+
stdin.write('test data\\n');
|
|
48
|
+
stdin.end();
|
|
49
|
+
} else {
|
|
50
|
+
console.log('\\nCannot write to stdin, ending command');
|
|
51
|
+
cmd.kill();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const result = await cmd;
|
|
55
|
+
console.log('\\nResult:', result);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
debugStreamObject().catch(console.error);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Properties Debug ===');
|
|
6
|
+
|
|
7
|
+
console.log('1. Testing with virtual commands (default):');
|
|
8
|
+
const cmd1 = $`echo "test1"`;
|
|
9
|
+
cmd1.start();
|
|
10
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
11
|
+
console.log(
|
|
12
|
+
'Virtual - stdout:',
|
|
13
|
+
!!cmd1.stdout,
|
|
14
|
+
'stderr:',
|
|
15
|
+
!!cmd1.stderr,
|
|
16
|
+
'stdin:',
|
|
17
|
+
!!cmd1.stdin
|
|
18
|
+
);
|
|
19
|
+
console.log('Virtual - child:', !!cmd1.child);
|
|
20
|
+
await cmd1;
|
|
21
|
+
|
|
22
|
+
console.log('\n2. Testing with real commands:');
|
|
23
|
+
disableVirtualCommands();
|
|
24
|
+
const cmd2 = $`echo "test2"`;
|
|
25
|
+
cmd2.start();
|
|
26
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
27
|
+
console.log(
|
|
28
|
+
'Real - stdout:',
|
|
29
|
+
!!cmd2.stdout,
|
|
30
|
+
'stderr:',
|
|
31
|
+
!!cmd2.stderr,
|
|
32
|
+
'stdin:',
|
|
33
|
+
!!cmd2.stdin
|
|
34
|
+
);
|
|
35
|
+
console.log('Real - child:', !!cmd2.child);
|
|
36
|
+
console.log('Real - child.stdout:', !!cmd2.child?.stdout);
|
|
37
|
+
await cmd2;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Stream Timing Debug ===');
|
|
6
|
+
|
|
7
|
+
disableVirtualCommands();
|
|
8
|
+
const cmd = $`echo "test"`;
|
|
9
|
+
cmd.start();
|
|
10
|
+
|
|
11
|
+
console.log('Immediately after start:');
|
|
12
|
+
console.log('child:', cmd.child);
|
|
13
|
+
console.log('stdout:', cmd.stdout);
|
|
14
|
+
|
|
15
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
16
|
+
console.log('After 50ms:');
|
|
17
|
+
console.log('child:', cmd.child);
|
|
18
|
+
console.log('stdout:', cmd.stdout);
|
|
19
|
+
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
21
|
+
console.log('After 150ms total:');
|
|
22
|
+
console.log('child:', cmd.child);
|
|
23
|
+
console.log('stdout:', cmd.stdout);
|
|
24
|
+
|
|
25
|
+
await cmd;
|
|
26
|
+
console.log('After await:');
|
|
27
|
+
console.log('child:', cmd.child);
|
|
28
|
+
console.log('stdout:', cmd.stdout);
|