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,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Long-running command with silent capture
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Long-running with silent capture:');
|
|
8
|
+
const $longSilent = $({ mirror: false, capture: true });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
for await (const chunk of $longSilent`sleep 2 && echo "Task completed"`.stream()) {
|
|
13
|
+
if (chunk.type === 'stdout') {
|
|
14
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
15
|
+
console.log(`⏱️ [${elapsed}s] ${chunk.data.toString().trim()}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.log(`Error: ${error.message}`);
|
|
20
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Simple streaming test to verify command-stream functionality
|
|
5
|
+
* Uses 'echo' and 'seq' commands that are guaranteed to exist
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { $ } from '../src/$.mjs';
|
|
9
|
+
import { writeFileSync, appendFileSync, existsSync } from 'fs';
|
|
10
|
+
|
|
11
|
+
console.log('🧪 Testing streaming with simple commands...\n');
|
|
12
|
+
|
|
13
|
+
// Test 1: Basic echo with streaming
|
|
14
|
+
console.log('Test 1: Basic echo streaming');
|
|
15
|
+
let chunkCount = 0;
|
|
16
|
+
|
|
17
|
+
const echoTest = $`echo "Hello from streaming test!"`;
|
|
18
|
+
echoTest
|
|
19
|
+
.on('data', (chunk) => {
|
|
20
|
+
chunkCount++;
|
|
21
|
+
console.log(`📦 Chunk ${chunkCount}: "${chunk.data.toString().trim()}"`);
|
|
22
|
+
})
|
|
23
|
+
.on('end', (result) => {
|
|
24
|
+
console.log(
|
|
25
|
+
`✅ Echo test complete. Chunks: ${chunkCount}, Exit code: ${result.code}\n`
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// Test 2: seq command for multiple chunks
|
|
29
|
+
runSeqTest();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
await echoTest.start();
|
|
33
|
+
|
|
34
|
+
function runSeqTest() {
|
|
35
|
+
console.log('Test 2: Sequence streaming (multiple chunks)');
|
|
36
|
+
let seqChunks = 0;
|
|
37
|
+
|
|
38
|
+
const seqTest = $`seq 1 5`;
|
|
39
|
+
seqTest
|
|
40
|
+
.on('data', (chunk) => {
|
|
41
|
+
seqChunks++;
|
|
42
|
+
const data = chunk.data.toString().trim();
|
|
43
|
+
console.log(`📦 Seq chunk ${seqChunks}: "${data}"`);
|
|
44
|
+
})
|
|
45
|
+
.on('end', (result) => {
|
|
46
|
+
console.log(
|
|
47
|
+
`✅ Seq test complete. Chunks: ${seqChunks}, Exit code: ${result.code}\n`
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// Test 3: For-await streaming pattern
|
|
51
|
+
runAsyncIteratorTest();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
seqTest.start();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function runAsyncIteratorTest() {
|
|
58
|
+
console.log('Test 3: Async iterator streaming pattern');
|
|
59
|
+
let iteratorChunks = 0;
|
|
60
|
+
|
|
61
|
+
for await (const chunk of $`seq 10 13`.stream()) {
|
|
62
|
+
iteratorChunks++;
|
|
63
|
+
console.log(
|
|
64
|
+
`🔄 Iterator chunk ${iteratorChunks}: "${chunk.data.toString().trim()}" (${chunk.type})`
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
console.log(`✅ Async iterator test complete. Chunks: ${iteratorChunks}\n`);
|
|
69
|
+
console.log('🎉 All streaming tests completed!');
|
|
70
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Virtual command with pipeline
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Virtual command with jq pipeline:');
|
|
8
|
+
|
|
9
|
+
const start = Date.now();
|
|
10
|
+
let chunkCount = 0;
|
|
11
|
+
for await (const chunk of $`echo '{"test":1}' | jq .`.stream()) {
|
|
12
|
+
if (chunk.type === 'stdout') {
|
|
13
|
+
chunkCount++;
|
|
14
|
+
const elapsed = Date.now() - start;
|
|
15
|
+
console.log(`[${elapsed}ms] Chunk ${chunkCount}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
console.log(`Total: ${chunkCount} chunks`);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Basic streaming comparison: regular $ vs $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Basic streaming comparison:');
|
|
8
|
+
|
|
9
|
+
console.log('Regular $ syntax:');
|
|
10
|
+
try {
|
|
11
|
+
for await (const chunk of $`echo "Hello from regular $"`.stream()) {
|
|
12
|
+
if (chunk.type === 'stdout') {
|
|
13
|
+
console.log(`📝 Regular: ${chunk.data.toString().trim()}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.log(`Error: ${error.message}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
console.log('\n$({ options }) syntax with mirror: false:');
|
|
21
|
+
const $configured = $({ mirror: false });
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
for await (const chunk of $configured`echo "Hello from configured $"`.stream()) {
|
|
25
|
+
if (chunk.type === 'stdout') {
|
|
26
|
+
console.log(`⚙️ Configured: ${chunk.data.toString().trim()}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.log(`Error: ${error.message}`);
|
|
31
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Basic options verification
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Verifying basic options...');
|
|
8
|
+
|
|
9
|
+
const $quiet = $({ mirror: false });
|
|
10
|
+
const result = await $quiet`echo "test"`;
|
|
11
|
+
console.assert(result.stdout === 'test\n', 'Basic options failed');
|
|
12
|
+
console.log('✓ Basic options work');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Combined multiple options using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Combined options:');
|
|
8
|
+
const $combined = $({
|
|
9
|
+
stdin: 'test data for file',
|
|
10
|
+
cwd: '/tmp',
|
|
11
|
+
mirror: false,
|
|
12
|
+
capture: true,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const filename = `test-${Date.now()}.txt`;
|
|
16
|
+
await $combined`cat > ${filename}`;
|
|
17
|
+
const verify = await $({ cwd: '/tmp', mirror: false })`cat ${filename}`;
|
|
18
|
+
console.log('Created file with content:', verify.stdout);
|
|
19
|
+
await $({ cwd: '/tmp', mirror: false })`rm ${filename}`;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Command chaining verification
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Verifying command chaining...');
|
|
8
|
+
|
|
9
|
+
const $chain = $({ mirror: false });
|
|
10
|
+
const result = await $chain`echo "abc" | tr 'a-z' 'A-Z'`;
|
|
11
|
+
console.assert(result.stdout === 'ABC\n', 'Chaining failed');
|
|
12
|
+
console.log('✓ Command chaining works');
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Custom working directory using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Custom working directory:');
|
|
8
|
+
const $inTmp = $({ cwd: '/tmp', mirror: false });
|
|
9
|
+
const result = await $inTmp`pwd`;
|
|
10
|
+
console.log('Current directory:', result.stdout.trim());
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Custom environment using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Custom environment:');
|
|
8
|
+
const $withEnv = $({
|
|
9
|
+
env: { ...process.env, DEMO_VAR: 'custom_value' },
|
|
10
|
+
mirror: false,
|
|
11
|
+
});
|
|
12
|
+
const result = await $withEnv`printenv DEMO_VAR`;
|
|
13
|
+
console.log('DEMO_VAR =', result.stdout.trim());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Custom stdin using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Custom stdin:');
|
|
8
|
+
const $withInput = $({ stdin: 'Hello from stdin!\n' });
|
|
9
|
+
const result = await $withInput`cat`;
|
|
10
|
+
console.log('Output:', result.stdout.trim());
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Mixed with regular $ verification
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Verifying mixed with regular $...');
|
|
8
|
+
|
|
9
|
+
const result = await $`echo "normal"`;
|
|
10
|
+
console.assert(result.stdout === 'normal\n', 'Regular $ failed');
|
|
11
|
+
console.log('✓ Regular $ still works');
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Mix with regular $ usage
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Mixed usage:');
|
|
8
|
+
console.log('Regular $ (with mirror):');
|
|
9
|
+
await $`echo "This appears in terminal"`;
|
|
10
|
+
|
|
11
|
+
console.log('With options (no mirror):');
|
|
12
|
+
await $({ mirror: false })`echo "This doesn't appear"`;
|
|
13
|
+
|
|
14
|
+
console.log('Regular $ again:');
|
|
15
|
+
await $`echo "Back to normal"`;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Multiple event listeners comparison
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Multiple event listeners comparison:');
|
|
8
|
+
|
|
9
|
+
console.log('Regular $ with multiple listeners:');
|
|
10
|
+
try {
|
|
11
|
+
const multiRunner1 = $`echo -e "Event 1\\nEvent 2\\nEvent 3"`;
|
|
12
|
+
|
|
13
|
+
// First listener - counts events
|
|
14
|
+
let eventCount1 = 0;
|
|
15
|
+
multiRunner1.on('stdout', (data) => {
|
|
16
|
+
const lines = data
|
|
17
|
+
.toString()
|
|
18
|
+
.split('\n')
|
|
19
|
+
.filter((line) => line.trim());
|
|
20
|
+
eventCount1 += lines.length;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Second listener - processes events
|
|
24
|
+
multiRunner1.on('stdout', (data) => {
|
|
25
|
+
const lines = data
|
|
26
|
+
.toString()
|
|
27
|
+
.split('\n')
|
|
28
|
+
.filter((line) => line.trim());
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
console.log(`📨 Regular listener: ${line}`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Third listener - logs timing
|
|
35
|
+
const start1 = Date.now();
|
|
36
|
+
multiRunner1.on('close', () => {
|
|
37
|
+
const duration = Date.now() - start1;
|
|
38
|
+
console.log(
|
|
39
|
+
`⏰ Regular $ processed ${eventCount1} events in ${duration}ms`
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await multiRunner1;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.log(`Error: ${error.message}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log('\nConfigured $ with multiple listeners:');
|
|
49
|
+
const $multiConfig = $({ mirror: false });
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
const multiRunner2 = $multiConfig`echo -e "Config Event 1\\nConfig Event 2\\nConfig Event 3"`;
|
|
53
|
+
|
|
54
|
+
// First listener - counts events
|
|
55
|
+
let eventCount2 = 0;
|
|
56
|
+
multiRunner2.on('stdout', (data) => {
|
|
57
|
+
const lines = data
|
|
58
|
+
.toString()
|
|
59
|
+
.split('\n')
|
|
60
|
+
.filter((line) => line.trim());
|
|
61
|
+
eventCount2 += lines.length;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Second listener - processes events
|
|
65
|
+
multiRunner2.on('stdout', (data) => {
|
|
66
|
+
const lines = data
|
|
67
|
+
.toString()
|
|
68
|
+
.split('\n')
|
|
69
|
+
.filter((line) => line.trim());
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
console.log(`📨 Configured listener: ${line}`);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Third listener - logs timing
|
|
76
|
+
const start2 = Date.now();
|
|
77
|
+
multiRunner2.on('close', () => {
|
|
78
|
+
const duration = Date.now() - start2;
|
|
79
|
+
console.log(
|
|
80
|
+
`⏰ Configured $ processed ${eventCount2} events in ${duration}ms`
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await multiRunner2;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.log(`Error: ${error.message}`);
|
|
87
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Command chaining with different options comparison
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Command chaining with different options:');
|
|
8
|
+
|
|
9
|
+
console.log('Regular $ with pipes:');
|
|
10
|
+
try {
|
|
11
|
+
for await (const chunk of $`echo "apple,banana,cherry" | tr ',' '\\n' | sort`.stream()) {
|
|
12
|
+
if (chunk.type === 'stdout') {
|
|
13
|
+
const lines = chunk.data.toString().trim().split('\n');
|
|
14
|
+
lines.forEach((line) => console.log(`🔗 Piped: ${line}`));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log(`Error: ${error.message}`);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
console.log('\nConfigured $ with pipes:');
|
|
22
|
+
const $pipe = $({ mirror: false });
|
|
23
|
+
try {
|
|
24
|
+
for await (const chunk of $pipe`echo "zebra,yak,xerus" | tr ',' '\\n' | sort -r`.stream()) {
|
|
25
|
+
if (chunk.type === 'stdout') {
|
|
26
|
+
const lines = chunk.data.toString().trim().split('\n');
|
|
27
|
+
lines.forEach((line) => console.log(`⚙️ Configured: ${line}`));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.log(`Error: ${error.message}`);
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Multiple uses of same configured $ verification
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Verifying reusable configurations...');
|
|
8
|
+
|
|
9
|
+
const $multi = $({ capture: true, mirror: false });
|
|
10
|
+
const result1 = await $multi`echo "1"`;
|
|
11
|
+
const result2 = await $multi`echo "2"`;
|
|
12
|
+
console.assert(
|
|
13
|
+
result1.stdout === '1\n' && result2.stdout === '2\n',
|
|
14
|
+
'Reuse failed'
|
|
15
|
+
);
|
|
16
|
+
console.log('✓ Reusable configurations work');
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Reusable configurations using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Reusable configurations:');
|
|
8
|
+
const $debug = $({
|
|
9
|
+
env: { ...process.env, DEBUG: 'true' },
|
|
10
|
+
mirror: false,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
// Run multiple commands with same configuration
|
|
14
|
+
const result1 = await $debug`echo "Command 1"`;
|
|
15
|
+
console.log('DEBUG mode result:', result1.stdout.trim());
|
|
16
|
+
|
|
17
|
+
const result2 = await $debug`echo "Command 2"`;
|
|
18
|
+
console.log('DEBUG mode result:', result2.stdout.trim());
|
|
19
|
+
|
|
20
|
+
const result3 = await $debug`echo "Command 3"`;
|
|
21
|
+
console.log('DEBUG mode result:', result3.stdout.trim());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Silent operations (no mirror to stdout) using $({ options })
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Silent operation:');
|
|
8
|
+
const $silent = $({ mirror: false });
|
|
9
|
+
const result = await $silent`echo "This won't appear in terminal"`;
|
|
10
|
+
console.log('Captured output:', result.stdout.trim());
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// stdin option verification
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Verifying stdin option...');
|
|
8
|
+
|
|
9
|
+
const $stdin = $({ stdin: 'input\n' });
|
|
10
|
+
const result = await $stdin`cat`;
|
|
11
|
+
console.assert(result.stdout === 'input\n', 'stdin option failed');
|
|
12
|
+
console.log('✓ stdin option works');
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Temporary test file for SIGINT handling - can be used for debugging user signal handlers
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
let sigintReceived = false;
|
|
8
|
+
|
|
9
|
+
process.on('SIGINT', () => {
|
|
10
|
+
sigintReceived = true;
|
|
11
|
+
console.log('USER_SIGINT_HANDLER_CALLED');
|
|
12
|
+
process.exit(42); // Custom exit code to verify user handler was called
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
console.log('Process started, waiting for SIGINT...');
|
|
16
|
+
|
|
17
|
+
// Wait for SIGINT (simulate doing some work without child processes)
|
|
18
|
+
setTimeout(() => {
|
|
19
|
+
console.log('TIMEOUT_REACHED');
|
|
20
|
+
process.exit(1); // Should not reach here in test
|
|
21
|
+
}, 10000);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Test the actual buildShellCommand from command-stream
|
|
4
|
+
import { $ } from '../src/$.mjs';
|
|
5
|
+
|
|
6
|
+
// Enable verbose to see buildShellCommand traces
|
|
7
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
8
|
+
|
|
9
|
+
console.log('=== Testing Actual buildShellCommand ===');
|
|
10
|
+
|
|
11
|
+
console.log('\n--- Case 1: $`echo hello` ---');
|
|
12
|
+
try {
|
|
13
|
+
const result1 = await $`echo hello`;
|
|
14
|
+
console.log(`✓ Result: "${result1.stdout.toString().trim()}"`);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
console.log(`✗ Error: ${error.message}`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
console.log('\n--- Case 2: $`${cmd}` where cmd="echo hello" ---');
|
|
20
|
+
const cmd = 'echo hello';
|
|
21
|
+
try {
|
|
22
|
+
const result2 = await $`${cmd}`;
|
|
23
|
+
console.log(`✓ Result: "${result2.stdout.toString().trim()}"`);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.log(`✗ Error: ${error.message}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
console.log('\n--- Case 3: $`echo ${arg}` where arg="hello" ---');
|
|
29
|
+
const arg = 'hello';
|
|
30
|
+
try {
|
|
31
|
+
const result3 = await $`echo ${arg}`;
|
|
32
|
+
console.log(`✓ Result: "${result3.stdout.toString().trim()}"`);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.log(`✗ Error: ${error.message}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
console.log('\n--- Case 4: Pipeline $`${pipeline}` ---');
|
|
38
|
+
const pipeline = 'echo hello | wc -w';
|
|
39
|
+
try {
|
|
40
|
+
const result4 = await $`${pipeline}`;
|
|
41
|
+
console.log(`✓ Result: "${result4.stdout.toString().trim()}"`);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.log(`✗ Error: ${error.message}`);
|
|
44
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Test async streams with commands that wait ===');
|
|
6
|
+
|
|
7
|
+
async function testAsyncStreamsWorking() {
|
|
8
|
+
try {
|
|
9
|
+
console.log('TEST 1: Node.js script that waits for input');
|
|
10
|
+
|
|
11
|
+
const nodeCmd = $`node -e "process.stdin.setEncoding('utf8'); let input = ''; process.stdin.on('data', chunk => input += chunk); process.stdin.on('end', () => process.stdout.write('Got: ' + input.trim()));"`;
|
|
12
|
+
|
|
13
|
+
console.log('Awaiting stdin for Node.js script...');
|
|
14
|
+
const nodeStdin = await nodeCmd.streams.stdin;
|
|
15
|
+
console.log('✓ Node stdin available:', !!nodeStdin);
|
|
16
|
+
|
|
17
|
+
if (nodeStdin) {
|
|
18
|
+
nodeStdin.write('Node.js input test');
|
|
19
|
+
nodeStdin.end();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const nodeResult = await nodeCmd;
|
|
23
|
+
console.log('✓ Node result:', JSON.stringify(nodeResult.stdout));
|
|
24
|
+
|
|
25
|
+
console.log('\\nTEST 2: Python script that waits for input');
|
|
26
|
+
|
|
27
|
+
const pythonCmd = $`python3 -c "import sys; data = sys.stdin.read(); print('Python got:', data.strip())"`;
|
|
28
|
+
|
|
29
|
+
const pythonStdin = await pythonCmd.streams.stdin;
|
|
30
|
+
console.log('✓ Python stdin available:', !!pythonStdin);
|
|
31
|
+
|
|
32
|
+
if (pythonStdin) {
|
|
33
|
+
pythonStdin.write('Python input test\\n');
|
|
34
|
+
pythonStdin.end();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const pythonResult = await pythonCmd;
|
|
38
|
+
console.log('✓ Python result:', JSON.stringify(pythonResult.stdout));
|
|
39
|
+
|
|
40
|
+
console.log('\\nTEST 3: bc calculator (interactive)');
|
|
41
|
+
|
|
42
|
+
const bcCmd = $`bc -l`;
|
|
43
|
+
const bcStdin = await bcCmd.streams.stdin;
|
|
44
|
+
console.log('✓ bc stdin available:', !!bcStdin);
|
|
45
|
+
|
|
46
|
+
if (bcStdin) {
|
|
47
|
+
bcStdin.write('2 + 3\\n');
|
|
48
|
+
bcStdin.write('10 * 5\\n');
|
|
49
|
+
bcStdin.write('quit\\n');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const bcResult = await bcCmd;
|
|
53
|
+
console.log('✓ bc result:', JSON.stringify(bcResult.stdout));
|
|
54
|
+
|
|
55
|
+
console.log('\\nTEST 4: Demonstrate immediate vs promise behavior');
|
|
56
|
+
|
|
57
|
+
const immediateCmd = $`cat`;
|
|
58
|
+
// Start the process manually first
|
|
59
|
+
immediateCmd.start({
|
|
60
|
+
mode: 'async',
|
|
61
|
+
stdin: 'pipe',
|
|
62
|
+
stdout: 'pipe',
|
|
63
|
+
stderr: 'pipe',
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Wait for it to spawn
|
|
67
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
68
|
+
|
|
69
|
+
// Now access should be immediate (not a promise)
|
|
70
|
+
const immediateStdin = immediateCmd.streams.stdin;
|
|
71
|
+
const isPromise = immediateStdin instanceof Promise;
|
|
72
|
+
console.log('✓ Immediate access is promise?', isPromise);
|
|
73
|
+
|
|
74
|
+
if (!isPromise && immediateStdin) {
|
|
75
|
+
immediateStdin.write('Immediate access test\\n');
|
|
76
|
+
immediateStdin.end();
|
|
77
|
+
} else if (isPromise) {
|
|
78
|
+
const stdin = await immediateStdin;
|
|
79
|
+
if (stdin) {
|
|
80
|
+
stdin.write('Promise-based access\\n');
|
|
81
|
+
stdin.end();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const immediateResult = await immediateCmd;
|
|
86
|
+
console.log(
|
|
87
|
+
'✓ Immediate test result:',
|
|
88
|
+
JSON.stringify(immediateResult.stdout)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
console.log('\\n🎉 CONCLUSIONS:');
|
|
92
|
+
console.log(' ✅ await cmd.streams.stdin works for interactive commands');
|
|
93
|
+
console.log(' ✅ Returns immediate stream if process already spawned');
|
|
94
|
+
console.log(' ✅ Returns promise if process not yet spawned');
|
|
95
|
+
console.log(' ✅ Much cleaner API than manual timing');
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.log('\\n❌ Error:', error.message);
|
|
98
|
+
console.error(error.stack);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
testAsyncStreamsWorking();
|