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,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
async function debugChildProcess() {
|
|
6
|
+
console.log('🐛 Debugging child process creation');
|
|
7
|
+
|
|
8
|
+
const catCmd = $`cat`;
|
|
9
|
+
console.log('1. Created cat command');
|
|
10
|
+
console.log(' started:', catCmd.started);
|
|
11
|
+
console.log(' finished:', catCmd.finished);
|
|
12
|
+
console.log(' child:', !!catCmd.child);
|
|
13
|
+
|
|
14
|
+
console.log('2. Accessing streams.stdin (should trigger auto-start)...');
|
|
15
|
+
const stdinPromise = catCmd.streams.stdin;
|
|
16
|
+
console.log(' stdinPromise:', typeof stdinPromise);
|
|
17
|
+
console.log(' started after access:', catCmd.started);
|
|
18
|
+
console.log(' child after access:', !!catCmd.child);
|
|
19
|
+
|
|
20
|
+
// Wait a bit for the process to start
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
22
|
+
|
|
23
|
+
console.log('3. After 100ms wait:');
|
|
24
|
+
console.log(' started:', catCmd.started);
|
|
25
|
+
console.log(' child:', !!catCmd.child);
|
|
26
|
+
console.log(
|
|
27
|
+
' child.stdin:',
|
|
28
|
+
catCmd.child ? typeof catCmd.child.stdin : 'no child'
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
console.log('4. Awaiting stdin promise...');
|
|
32
|
+
const stdin = await stdinPromise;
|
|
33
|
+
|
|
34
|
+
console.log('5. Stdin resolved:');
|
|
35
|
+
console.log(' stdin type:', typeof stdin);
|
|
36
|
+
console.log(' stdin value:', stdin);
|
|
37
|
+
console.log(' has write method:', !!(stdin && stdin.write));
|
|
38
|
+
|
|
39
|
+
// Clean up
|
|
40
|
+
catCmd.kill();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
debugChildProcess();
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
async function debugChildState() {
|
|
6
|
+
const cmd = $`cat`;
|
|
7
|
+
|
|
8
|
+
console.log('0ms - Initial state:');
|
|
9
|
+
console.log(
|
|
10
|
+
' started:',
|
|
11
|
+
cmd.started,
|
|
12
|
+
'finished:',
|
|
13
|
+
cmd.finished,
|
|
14
|
+
'child:',
|
|
15
|
+
!!cmd.child
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// Trigger start
|
|
19
|
+
cmd.streams.stdout;
|
|
20
|
+
|
|
21
|
+
console.log('0ms - After triggering start:');
|
|
22
|
+
console.log(
|
|
23
|
+
' started:',
|
|
24
|
+
cmd.started,
|
|
25
|
+
'finished:',
|
|
26
|
+
cmd.finished,
|
|
27
|
+
'child:',
|
|
28
|
+
!!cmd.child
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// Check state every 25ms
|
|
32
|
+
for (let i = 1; i <= 10; i++) {
|
|
33
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
34
|
+
console.log(`${i * 25}ms - state:`, {
|
|
35
|
+
started: cmd.started,
|
|
36
|
+
finished: cmd.finished,
|
|
37
|
+
child: !!cmd.child,
|
|
38
|
+
stdin: !!(cmd.child && cmd.child.stdin),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
if (cmd.finished) {
|
|
42
|
+
console.log('Process finished early!');
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Try one final time
|
|
48
|
+
const stdin = cmd.streams.stdin;
|
|
49
|
+
console.log('Final stdin check:', !!stdin);
|
|
50
|
+
|
|
51
|
+
const result = await cmd;
|
|
52
|
+
console.log('Final result:', result.stdout, 'code:', result.code);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
debugChildState().catch(console.error);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
const claude = 'claude';
|
|
6
|
+
console.log('🐛 Debug chunking test');
|
|
7
|
+
|
|
8
|
+
let events = 0;
|
|
9
|
+
let totalData = '';
|
|
10
|
+
|
|
11
|
+
const command = $`${claude} -p "hi" --output-format stream-json --verbose --model sonnet`;
|
|
12
|
+
|
|
13
|
+
command
|
|
14
|
+
.on('data', (chunk) => {
|
|
15
|
+
events++;
|
|
16
|
+
const data = chunk.data.toString();
|
|
17
|
+
console.log(`\n📦 Chunk ${events} (${data.length} bytes):`);
|
|
18
|
+
console.log(`"${data}"`);
|
|
19
|
+
totalData += data;
|
|
20
|
+
})
|
|
21
|
+
.on('end', (result) => {
|
|
22
|
+
console.log(
|
|
23
|
+
`\n✅ Done: ${events} chunks, ${totalData.length} total bytes, exit: ${result.code}`
|
|
24
|
+
);
|
|
25
|
+
process.exit(0);
|
|
26
|
+
})
|
|
27
|
+
.on('error', (error) => {
|
|
28
|
+
console.log('❌ Error:', error);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Timeout after 15 seconds
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
console.log(`\n⏰ Timeout: ${events} chunks received so far`);
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}, 15000);
|
|
37
|
+
|
|
38
|
+
command.start();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Debug command parsing
|
|
4
|
+
import { $ } from '../src/$.mjs';
|
|
5
|
+
|
|
6
|
+
// Enable verbose mode
|
|
7
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
8
|
+
|
|
9
|
+
console.log('=== Command Parsing Debug ===');
|
|
10
|
+
console.log(
|
|
11
|
+
`Runtime: ${typeof globalThis.Bun !== 'undefined' ? 'Bun' : 'Node.js'}`
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
// Test different command formats
|
|
15
|
+
const testCommands = [
|
|
16
|
+
'echo hello',
|
|
17
|
+
'echo "hello world"',
|
|
18
|
+
'ls -la',
|
|
19
|
+
'pwd',
|
|
20
|
+
'cat /etc/passwd | head -5', // This should trigger needsShell=true
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
for (const cmdStr of testCommands) {
|
|
24
|
+
console.log(`\n--- Testing: ${cmdStr} ---`);
|
|
25
|
+
|
|
26
|
+
// Let's manually check what parseShellCommand returns
|
|
27
|
+
const { parseShellCommand, needsRealShell } =
|
|
28
|
+
await import('../src/shell-parser.mjs');
|
|
29
|
+
|
|
30
|
+
const parsed = parseShellCommand(cmdStr);
|
|
31
|
+
const needsRealShellResult = needsRealShell(cmdStr);
|
|
32
|
+
|
|
33
|
+
console.log(`Parsed result:`, JSON.stringify(parsed, null, 2));
|
|
34
|
+
console.log(`needsRealShell:`, needsRealShellResult);
|
|
35
|
+
|
|
36
|
+
// Check needsShell logic from the main code
|
|
37
|
+
const needsShell =
|
|
38
|
+
cmdStr.includes('*') ||
|
|
39
|
+
cmdStr.includes('$') ||
|
|
40
|
+
cmdStr.includes('>') ||
|
|
41
|
+
cmdStr.includes('<') ||
|
|
42
|
+
cmdStr.includes('&&') ||
|
|
43
|
+
cmdStr.includes('||') ||
|
|
44
|
+
cmdStr.includes(';') ||
|
|
45
|
+
cmdStr.includes('`');
|
|
46
|
+
|
|
47
|
+
console.log(`needsShell (from main logic):`, needsShell);
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const result = await $`${cmdStr}`;
|
|
51
|
+
console.log(`✓ Success: ${result.stdout.toString().trim()}`);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.log(`✗ Failed: ${error.message}`);
|
|
54
|
+
if (error.code) {
|
|
55
|
+
console.log(` Code: ${error.code}`);
|
|
56
|
+
}
|
|
57
|
+
if (error.stderr) {
|
|
58
|
+
console.log(` Stderr: ${error.stderr.toString().trim()}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Complete Finish Method Consolidation Test ===');
|
|
6
|
+
|
|
7
|
+
const tests = [
|
|
8
|
+
{
|
|
9
|
+
name: 'Normal completion',
|
|
10
|
+
test: async () => {
|
|
11
|
+
const result = await $`echo "normal"`;
|
|
12
|
+
return { stdout: result.stdout.trim(), code: result.code };
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
{
|
|
17
|
+
name: 'Sync mode',
|
|
18
|
+
test: async () => {
|
|
19
|
+
const result = $`echo "sync"`.sync();
|
|
20
|
+
return { stdout: result.stdout.trim(), code: result.code };
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
{
|
|
25
|
+
name: 'Error handling',
|
|
26
|
+
test: async () => {
|
|
27
|
+
try {
|
|
28
|
+
await $`exit 1`;
|
|
29
|
+
return { error: 'Expected error but got success' };
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return { code: error.code, stdout: error.stdout.trim() };
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
{
|
|
37
|
+
name: 'Pipeline with error',
|
|
38
|
+
test: async () => {
|
|
39
|
+
try {
|
|
40
|
+
await $`echo "test" | exit 1`;
|
|
41
|
+
return { error: 'Expected error but got success' };
|
|
42
|
+
} catch (error) {
|
|
43
|
+
return { code: error.code, stdout: error.stdout.trim() };
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
{
|
|
49
|
+
name: 'Kill scenario',
|
|
50
|
+
test: async () => {
|
|
51
|
+
const runner = $`sleep 0.1`;
|
|
52
|
+
const promise = runner.start();
|
|
53
|
+
|
|
54
|
+
// Let it start
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
56
|
+
|
|
57
|
+
runner.kill('SIGTERM');
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
await promise;
|
|
61
|
+
return { error: 'Expected error but got success' };
|
|
62
|
+
} catch (error) {
|
|
63
|
+
return { code: error.code, stderr: error.stderr.trim() };
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
{
|
|
69
|
+
name: 'Finally handler',
|
|
70
|
+
test: async () => {
|
|
71
|
+
let finallyExecuted = false;
|
|
72
|
+
|
|
73
|
+
const result = await $`echo "finally"`.finally(() => {
|
|
74
|
+
finallyExecuted = true;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
stdout: result.stdout.trim(),
|
|
79
|
+
code: result.code,
|
|
80
|
+
finallyExecuted,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
console.log('\nRunning comprehensive tests...\n');
|
|
87
|
+
|
|
88
|
+
for (const { name, test } of tests) {
|
|
89
|
+
try {
|
|
90
|
+
const result = await test();
|
|
91
|
+
console.log(`✅ ${name}:`, JSON.stringify(result, null, 2));
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.log(`❌ ${name}:`, error.message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
console.log('\n=== All tests completed ===');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
async function debugEchoArgs() {
|
|
4
|
+
console.log('=== Debug Echo Args ===');
|
|
5
|
+
|
|
6
|
+
// Test the exact same interpolation as the failing test
|
|
7
|
+
const name = 'World';
|
|
8
|
+
const $custom = $({ capture: true, mirror: false });
|
|
9
|
+
|
|
10
|
+
console.log('About to run: echo Hello, ${name}!');
|
|
11
|
+
console.log('Where name =', JSON.stringify(name));
|
|
12
|
+
console.log("This should build command: echo Hello, 'World'!");
|
|
13
|
+
|
|
14
|
+
const result = await $custom`echo Hello, ${name}!`;
|
|
15
|
+
|
|
16
|
+
console.log('Result stdout:', JSON.stringify(result.stdout));
|
|
17
|
+
console.log('Result stdout trimmed:', JSON.stringify(result.stdout.trim()));
|
|
18
|
+
console.log('Expected by test:', JSON.stringify('Hello, World!'));
|
|
19
|
+
console.log('Test passes:', result.stdout.trim() === 'Hello, World!');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
debugEchoArgs().catch(console.error);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Emit Timing Debug ===');
|
|
6
|
+
|
|
7
|
+
const cmd = $`echo "test"`;
|
|
8
|
+
|
|
9
|
+
// Track when listeners are called
|
|
10
|
+
cmd.on('data', () => console.log('LISTENER: data event at', Date.now()));
|
|
11
|
+
cmd.on('end', () => console.log('LISTENER: end event at', Date.now()));
|
|
12
|
+
cmd.on('exit', () => console.log('LISTENER: exit event at', Date.now()));
|
|
13
|
+
|
|
14
|
+
// Override emit to see exact timing
|
|
15
|
+
const originalEmit = cmd.emit.bind(cmd);
|
|
16
|
+
cmd.emit = function (event, ...args) {
|
|
17
|
+
console.log(`EMIT: ${event} event at ${Date.now()}`);
|
|
18
|
+
return originalEmit(event, ...args);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
console.log('Starting await at', Date.now());
|
|
22
|
+
const result = await cmd;
|
|
23
|
+
console.log('Await completed at', Date.now(), 'with code', result.code);
|
|
24
|
+
|
|
25
|
+
// Wait a bit to see if events come later
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
console.log('Timeout check at', Date.now());
|
|
28
|
+
}, 100);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== End Event Debug ===');
|
|
6
|
+
|
|
7
|
+
console.log('1. Testing await pattern with events:');
|
|
8
|
+
const cmd1 = $`echo "test1"`;
|
|
9
|
+
let endEventFired = false;
|
|
10
|
+
|
|
11
|
+
cmd1.on('end', (result) => {
|
|
12
|
+
endEventFired = true;
|
|
13
|
+
console.log('END event fired for await pattern');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const result1 = await cmd1;
|
|
17
|
+
console.log('Await completed. End event fired?', endEventFired);
|
|
18
|
+
|
|
19
|
+
console.log('2. Testing stream pattern with events:');
|
|
20
|
+
const cmd2 = $`echo "test2"`;
|
|
21
|
+
let streamEndEventFired = false;
|
|
22
|
+
const streamChunks = [];
|
|
23
|
+
|
|
24
|
+
cmd2.on('end', (result) => {
|
|
25
|
+
streamEndEventFired = true;
|
|
26
|
+
console.log('END event fired for stream pattern');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
console.log('Starting stream iteration...');
|
|
30
|
+
try {
|
|
31
|
+
// Set a timeout to break out of infinite loop
|
|
32
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
33
|
+
setTimeout(() => reject(new Error('Stream timeout')), 2000);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const streamPromise = (async () => {
|
|
37
|
+
for await (const chunk of cmd2.stream()) {
|
|
38
|
+
streamChunks.push(chunk);
|
|
39
|
+
console.log('Stream chunk received:', chunk.type);
|
|
40
|
+
|
|
41
|
+
// Check if end event fired after receiving chunks
|
|
42
|
+
console.log('End event fired yet?', streamEndEventFired);
|
|
43
|
+
}
|
|
44
|
+
})();
|
|
45
|
+
|
|
46
|
+
await Promise.race([streamPromise, timeoutPromise]);
|
|
47
|
+
console.log('Stream completed normally');
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.log('Stream timed out:', error.message);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log('Final state:');
|
|
53
|
+
console.log('- Stream chunks received:', streamChunks.length);
|
|
54
|
+
console.log('- End event fired?', streamEndEventFired);
|
|
55
|
+
|
|
56
|
+
console.log('Debug completed!');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, enableErrExit } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Errexit Test ===');
|
|
6
|
+
|
|
7
|
+
enableErrExit();
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
await $`exit 1`;
|
|
11
|
+
console.log('ERROR: Should have thrown');
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.log('✅ Properly caught error:', error.code);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
console.log('Errexit test completed.');
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Event Emission Debug ===');
|
|
6
|
+
|
|
7
|
+
// Override emit to trace when events are emitted
|
|
8
|
+
function instrumentEmitter(cmd, label) {
|
|
9
|
+
const originalEmit = cmd.emit.bind(cmd);
|
|
10
|
+
cmd.emit = function (event, ...args) {
|
|
11
|
+
console.log(`[${label}] EMIT: ${event}`, args.length > 0 ? args[0] : '');
|
|
12
|
+
return originalEmit(event, ...args);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function testWithInstrumentation() {
|
|
17
|
+
console.log('\n1. Virtual echo with emit tracing:');
|
|
18
|
+
const virtualCmd = $`echo "virtual"`;
|
|
19
|
+
instrumentEmitter(virtualCmd, 'VIRTUAL');
|
|
20
|
+
|
|
21
|
+
virtualCmd.on('data', () => console.log('[VIRTUAL] RECEIVED: data'));
|
|
22
|
+
virtualCmd.on('end', () => console.log('[VIRTUAL] RECEIVED: end'));
|
|
23
|
+
virtualCmd.on('exit', () => console.log('[VIRTUAL] RECEIVED: exit'));
|
|
24
|
+
|
|
25
|
+
await virtualCmd;
|
|
26
|
+
|
|
27
|
+
console.log('\n2. Real echo with emit tracing:');
|
|
28
|
+
disableVirtualCommands();
|
|
29
|
+
const realCmd = $`echo "real"`;
|
|
30
|
+
instrumentEmitter(realCmd, 'REAL');
|
|
31
|
+
|
|
32
|
+
realCmd.on('data', () => console.log('[REAL] RECEIVED: data'));
|
|
33
|
+
realCmd.on('end', () => console.log('[REAL] RECEIVED: end'));
|
|
34
|
+
realCmd.on('exit', () => console.log('[REAL] RECEIVED: exit'));
|
|
35
|
+
|
|
36
|
+
await realCmd;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await testWithInstrumentation();
|
|
40
|
+
console.log('\nDebug completed!');
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Event Timing Debug ===');
|
|
6
|
+
|
|
7
|
+
// Enable verbose tracing to see what's happening inside
|
|
8
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
9
|
+
|
|
10
|
+
async function testVirtualCommand() {
|
|
11
|
+
console.log('\n1. Testing VIRTUAL echo command:');
|
|
12
|
+
const cmd = $`echo "virtual test"`;
|
|
13
|
+
|
|
14
|
+
const events = [];
|
|
15
|
+
cmd.on('data', (chunk) => events.push(`data:${chunk.type}`));
|
|
16
|
+
cmd.on('end', (result) => events.push(`end:${result.code}`));
|
|
17
|
+
cmd.on('exit', (code) => events.push(`exit:${code}`));
|
|
18
|
+
|
|
19
|
+
console.log('Events before await:', events);
|
|
20
|
+
const result = await cmd;
|
|
21
|
+
console.log('Events after await:', events);
|
|
22
|
+
console.log(
|
|
23
|
+
'Result:',
|
|
24
|
+
result.code,
|
|
25
|
+
JSON.stringify(result.stdout?.trim() || '')
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
return events;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function testRealCommand() {
|
|
32
|
+
console.log('\n2. Testing REAL echo command:');
|
|
33
|
+
disableVirtualCommands();
|
|
34
|
+
const cmd = $`echo "real test"`;
|
|
35
|
+
|
|
36
|
+
const events = [];
|
|
37
|
+
cmd.on('data', (chunk) => events.push(`data:${chunk.type}`));
|
|
38
|
+
cmd.on('end', (result) => events.push(`end:${result.code}`));
|
|
39
|
+
cmd.on('exit', (code) => events.push(`exit:${code}`));
|
|
40
|
+
|
|
41
|
+
console.log('Events before await:', events);
|
|
42
|
+
const result = await cmd;
|
|
43
|
+
console.log('Events after await:', events);
|
|
44
|
+
console.log(
|
|
45
|
+
'Result:',
|
|
46
|
+
result.code,
|
|
47
|
+
JSON.stringify(result.stdout?.trim() || '')
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
return events;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const virtualEvents = await testVirtualCommand();
|
|
54
|
+
const realEvents = await testRealCommand();
|
|
55
|
+
|
|
56
|
+
console.log('\n=== COMPARISON ===');
|
|
57
|
+
console.log('Virtual events:', virtualEvents);
|
|
58
|
+
console.log('Real events:', realEvents);
|
|
59
|
+
|
|
60
|
+
const match = JSON.stringify(virtualEvents) === JSON.stringify(realEvents);
|
|
61
|
+
console.log('Events match:', match);
|
|
62
|
+
|
|
63
|
+
if (!match) {
|
|
64
|
+
console.log('❌ Virtual and real commands emit different events!');
|
|
65
|
+
} else {
|
|
66
|
+
console.log('✅ Virtual and real commands emit same events!');
|
|
67
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Event vs Result Comparison ===\n');
|
|
6
|
+
|
|
7
|
+
console.log('1. Using await result (final result):');
|
|
8
|
+
const result1 = await $`echo '{"test": "result"}' | jq --color-output .`;
|
|
9
|
+
console.log('Final result:');
|
|
10
|
+
process.stdout.write(result1.stdout);
|
|
11
|
+
console.log('Result bytes:', Buffer.from(result1.stdout.slice(0, 30)));
|
|
12
|
+
|
|
13
|
+
console.log('\n2. Using stdout events (streaming):');
|
|
14
|
+
const proc2 = $`echo '{"test": "events"}' | jq --color-output .`;
|
|
15
|
+
|
|
16
|
+
console.log('Event output:');
|
|
17
|
+
proc2.on('stdout', (chunk) => {
|
|
18
|
+
console.log('Event chunk type:', typeof chunk, chunk.constructor.name);
|
|
19
|
+
console.log('Event chunk bytes:', Buffer.from(chunk.slice(0, 30)));
|
|
20
|
+
console.log('Event chunk content:');
|
|
21
|
+
process.stdout.write(chunk);
|
|
22
|
+
console.log('---');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const result2 = await proc2;
|
|
26
|
+
|
|
27
|
+
console.log('\n3. Comparison:');
|
|
28
|
+
console.log('Final result from streaming proc:');
|
|
29
|
+
process.stdout.write(result2.stdout);
|
|
30
|
+
console.log('Final result bytes:', Buffer.from(result2.stdout.slice(0, 30)));
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Testing Exact Command from jq-colors-streaming.mjs ===\n');
|
|
6
|
+
|
|
7
|
+
const coloredCmd = $`printf '{"name":"Alice","status":"active","score":95}\n{"name":"Bob","status":"inactive","score":87}\n{"name":"Carol","status":"active","score":92}\n' | jq --color-output .`;
|
|
8
|
+
|
|
9
|
+
console.log('Raw streaming output:');
|
|
10
|
+
coloredCmd.on('stdout', (chunk) => {
|
|
11
|
+
console.log('CHUNK TYPE:', typeof chunk, chunk.constructor.name);
|
|
12
|
+
console.log('CHUNK BYTES (first 50):', Buffer.from(chunk.slice(0, 50)));
|
|
13
|
+
console.log('CHUNK CONTENT:');
|
|
14
|
+
process.stdout.write('>>> ');
|
|
15
|
+
process.stdout.write(chunk);
|
|
16
|
+
console.log('<<<');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const result = await coloredCmd;
|
|
20
|
+
|
|
21
|
+
console.log('\nFinal result:');
|
|
22
|
+
console.log('RESULT TYPE:', typeof result.stdout);
|
|
23
|
+
console.log(
|
|
24
|
+
'RESULT BYTES (first 50):',
|
|
25
|
+
Buffer.from(result.stdout.slice(0, 50))
|
|
26
|
+
);
|
|
27
|
+
console.log('RESULT CONTENT:');
|
|
28
|
+
process.stdout.write(result.stdout);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// Exact replica of the failing test scenario
|
|
3
|
+
|
|
4
|
+
import { $ } from '../src/$.mjs';
|
|
5
|
+
|
|
6
|
+
// Enable verbose mode
|
|
7
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
8
|
+
|
|
9
|
+
let cleanupDone = false;
|
|
10
|
+
|
|
11
|
+
// Exact same handler as in the test
|
|
12
|
+
process.on('SIGINT', async () => {
|
|
13
|
+
console.log('CHILD_CLEANUP_START');
|
|
14
|
+
// Simulate cleanup work
|
|
15
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
16
|
+
cleanupDone = true;
|
|
17
|
+
console.log('CHILD_CLEANUP_DONE');
|
|
18
|
+
process.exit(0); // Exit cleanly after cleanup
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
console.log('CHILD_READY');
|
|
22
|
+
|
|
23
|
+
// Run a command that will receive SIGINT forwarding
|
|
24
|
+
try {
|
|
25
|
+
const sleepPromise = $`sleep 5`.start();
|
|
26
|
+
|
|
27
|
+
// Send SIGINT to ourselves after a short delay (simulating the test)
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
console.log('Sending SIGINT...');
|
|
30
|
+
process.kill(process.pid, 'SIGINT');
|
|
31
|
+
}, 500);
|
|
32
|
+
|
|
33
|
+
await sleepPromise;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.log('SLEEP_INTERRUPTED');
|
|
36
|
+
console.log('Error details:', {
|
|
37
|
+
message: error.message,
|
|
38
|
+
code: error.code,
|
|
39
|
+
constructor: error.constructor.name,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// This should not be reached
|
|
44
|
+
console.log('End of script reached (should not happen)');
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Debug execution path to see exactly what's happening
|
|
4
|
+
import { $ } from '../src/$.mjs';
|
|
5
|
+
|
|
6
|
+
// Enable verbose mode to see detailed tracing
|
|
7
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
8
|
+
|
|
9
|
+
console.log('=== Execution Path Debug ===');
|
|
10
|
+
console.log(
|
|
11
|
+
`Runtime: ${typeof globalThis.Bun !== 'undefined' ? 'Bun' : 'Node.js'}`
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
console.log('\n--- Testing simple command: echo hello ---');
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const result = await $`echo hello`;
|
|
18
|
+
console.log(`✓ Success: "${result.stdout.toString().trim()}"`);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.log(`✗ Failed: ${error.message}`);
|
|
21
|
+
if (error.code) {
|
|
22
|
+
console.log(` Code: ${error.code}`);
|
|
23
|
+
}
|
|
24
|
+
if (error.stderr) {
|
|
25
|
+
console.log(` Stderr: ${error.stderr.toString().trim()}`);
|
|
26
|
+
}
|
|
27
|
+
}
|