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,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Real-time log processing with events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Real-time log processing:');
|
|
8
|
+
const $logProcessor = $({ mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const logScript = `
|
|
12
|
+
echo "INFO: Application starting"
|
|
13
|
+
sleep 0.2
|
|
14
|
+
echo "DEBUG: Loading configuration"
|
|
15
|
+
sleep 0.2
|
|
16
|
+
echo "WARN: Deprecated API usage detected" >&2
|
|
17
|
+
sleep 0.2
|
|
18
|
+
echo "INFO: Server listening on port 3000"
|
|
19
|
+
sleep 0.2
|
|
20
|
+
echo "ERROR: Database connection failed" >&2
|
|
21
|
+
sleep 0.2
|
|
22
|
+
echo "INFO: Retrying database connection"
|
|
23
|
+
sleep 0.2
|
|
24
|
+
echo "INFO: Application ready"
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
const runner = $logProcessor`bash -c '${logScript}'`;
|
|
28
|
+
|
|
29
|
+
const logStats = { info: 0, debug: 0, warn: 0, error: 0 };
|
|
30
|
+
|
|
31
|
+
runner.on('stdout', (data) => {
|
|
32
|
+
const lines = data
|
|
33
|
+
.toString()
|
|
34
|
+
.split('\n')
|
|
35
|
+
.filter((line) => line.trim());
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
if (line.includes('INFO:')) {
|
|
38
|
+
logStats.info++;
|
|
39
|
+
console.log(`ℹ️ ${line}`);
|
|
40
|
+
} else if (line.includes('DEBUG:')) {
|
|
41
|
+
logStats.debug++;
|
|
42
|
+
console.log(`🐛 ${line}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
runner.on('stderr', (data) => {
|
|
48
|
+
const lines = data
|
|
49
|
+
.toString()
|
|
50
|
+
.split('\n')
|
|
51
|
+
.filter((line) => line.trim());
|
|
52
|
+
for (const line of lines) {
|
|
53
|
+
if (line.includes('WARN:')) {
|
|
54
|
+
logStats.warn++;
|
|
55
|
+
console.log(`⚠️ ${line}`);
|
|
56
|
+
} else if (line.includes('ERROR:')) {
|
|
57
|
+
logStats.error++;
|
|
58
|
+
console.log(`❌ ${line}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
runner.on('close', (code) => {
|
|
64
|
+
console.log(
|
|
65
|
+
`📊 Log summary: ${logStats.info} info, ${logStats.debug} debug, ${logStats.warn} warnings, ${logStats.error} errors`
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await runner;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.log(`Error: ${error.message}`);
|
|
72
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Network monitoring with multiple hosts using events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Network monitoring with multiple hosts:');
|
|
8
|
+
|
|
9
|
+
const hosts = ['google.com', 'github.com', 'stackoverflow.com'];
|
|
10
|
+
const $networkMonitors = hosts.map(() => $({ mirror: false }));
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
console.log('Starting network monitoring...');
|
|
14
|
+
|
|
15
|
+
const hostResults = new Map();
|
|
16
|
+
const promises = [];
|
|
17
|
+
|
|
18
|
+
for (let i = 0; i < hosts.length; i++) {
|
|
19
|
+
const host = hosts[i];
|
|
20
|
+
const monitor = $networkMonitors[i];
|
|
21
|
+
const runner = monitor`ping -c 3 ${host}`;
|
|
22
|
+
|
|
23
|
+
hostResults.set(host, { packets: 0, avgTime: 0, times: [] });
|
|
24
|
+
|
|
25
|
+
runner.on('stdout', (data) => {
|
|
26
|
+
const lines = data
|
|
27
|
+
.toString()
|
|
28
|
+
.split('\n')
|
|
29
|
+
.filter((line) => line.trim());
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
if (line.includes('bytes from')) {
|
|
32
|
+
const timeMatch = line.match(/time=([0-9.]+)/);
|
|
33
|
+
if (timeMatch) {
|
|
34
|
+
const time = parseFloat(timeMatch[1]);
|
|
35
|
+
const result = hostResults.get(host);
|
|
36
|
+
result.packets++;
|
|
37
|
+
result.times.push(time);
|
|
38
|
+
console.log(`🌐 ${host}: packet #${result.packets} (${time}ms)`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
runner.on('close', (code) => {
|
|
45
|
+
const result = hostResults.get(host);
|
|
46
|
+
if (result.times.length > 0) {
|
|
47
|
+
result.avgTime = (
|
|
48
|
+
result.times.reduce((a, b) => a + b, 0) / result.times.length
|
|
49
|
+
).toFixed(2);
|
|
50
|
+
}
|
|
51
|
+
console.log(`✅ ${host}: monitoring complete (avg: ${result.avgTime}ms)`);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
promises.push(runner);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
await Promise.all(promises);
|
|
58
|
+
|
|
59
|
+
console.log('\n📊 Network monitoring summary:');
|
|
60
|
+
for (const [host, result] of hostResults) {
|
|
61
|
+
const status = result.packets > 0 ? '🟢' : '🔴';
|
|
62
|
+
console.log(
|
|
63
|
+
`${status} ${host}: ${result.packets} packets, avg ${result.avgTime}ms`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.log(`Error: ${error.message}`);
|
|
68
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Basic event-based ping with options
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Basic event-based ping (silent mode):');
|
|
8
|
+
const $silent = $({ mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const runner = $silent`ping -c 5 8.8.8.8`;
|
|
12
|
+
|
|
13
|
+
let packetCount = 0;
|
|
14
|
+
|
|
15
|
+
runner.on('stdout', (data) => {
|
|
16
|
+
const output = data.toString().trim();
|
|
17
|
+
if (output.includes('bytes from')) {
|
|
18
|
+
packetCount++;
|
|
19
|
+
const timeMatch = output.match(/time=([0-9.]+)/);
|
|
20
|
+
const responseTime = timeMatch ? timeMatch[1] : 'unknown';
|
|
21
|
+
console.log(`📡 Packet #${packetCount}: ${responseTime}ms`);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
runner.on('stderr', (data) => {
|
|
26
|
+
console.log(`⚠️ Error: ${data.toString().trim()}`);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
runner.on('close', (code) => {
|
|
30
|
+
console.log(`✅ Ping completed with exit code: ${code}`);
|
|
31
|
+
console.log(`📊 Total packets received: ${packetCount}`);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
await runner;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.log(`❌ Error: ${error.message}`);
|
|
37
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Long-running process with progress events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Long-running process with progress tracking:');
|
|
8
|
+
const $progress = $({ mirror: false, capture: true });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const progressScript = `
|
|
12
|
+
for i in {1..10}; do
|
|
13
|
+
echo "Progress: $i/10"
|
|
14
|
+
echo "Status: Processing item $i" >&2
|
|
15
|
+
sleep 0.3
|
|
16
|
+
done
|
|
17
|
+
echo "Complete!"
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
const runner = $progress`bash -c '${progressScript}'`;
|
|
21
|
+
|
|
22
|
+
let progressCount = 0;
|
|
23
|
+
let statusCount = 0;
|
|
24
|
+
|
|
25
|
+
runner.on('stdout', (data) => {
|
|
26
|
+
const output = data.toString().trim();
|
|
27
|
+
if (output.includes('Progress:')) {
|
|
28
|
+
progressCount++;
|
|
29
|
+
const percent = ((progressCount / 10) * 100).toFixed(0);
|
|
30
|
+
console.log(`📊 ${output} (${percent}%)`);
|
|
31
|
+
} else if (output.includes('Complete')) {
|
|
32
|
+
console.log(`✅ ${output}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
runner.on('stderr', (data) => {
|
|
37
|
+
const output = data.toString().trim();
|
|
38
|
+
if (output.includes('Status:')) {
|
|
39
|
+
statusCount++;
|
|
40
|
+
console.log(`🔄 ${output}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
runner.on('close', (code) => {
|
|
45
|
+
console.log(`🏁 Process completed with code: ${code}`);
|
|
46
|
+
console.log(
|
|
47
|
+
`📈 Progress events: ${progressCount}, Status events: ${statusCount}`
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const result = await runner;
|
|
52
|
+
console.log(`💾 Captured output length: ${result.stdout.length} chars`);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.log(`❌ Error: ${error.message}`);
|
|
55
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Event-based with custom stdin
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Event-based with custom stdin:');
|
|
8
|
+
const $withInput = $({ stdin: 'Hello\nWorld\nTest\n', mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const runner = $withInput`cat -n`;
|
|
12
|
+
|
|
13
|
+
let lineCount = 0;
|
|
14
|
+
|
|
15
|
+
runner.on('stdout', (data) => {
|
|
16
|
+
const lines = data
|
|
17
|
+
.toString()
|
|
18
|
+
.split('\n')
|
|
19
|
+
.filter((line) => line.trim());
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
lineCount++;
|
|
22
|
+
console.log(`📝 Line processed: ${line}`);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
runner.on('close', (code) => {
|
|
27
|
+
console.log(`✅ Input processing completed`);
|
|
28
|
+
console.log(`📊 Total lines processed: ${lineCount}`);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
await runner;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.log(`❌ Error: ${error.message}`);
|
|
34
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, AnsiUtils } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== ANSI Color Example with ls command ===\n');
|
|
6
|
+
|
|
7
|
+
// Use ls with color output
|
|
8
|
+
console.log('1. Running ls --color=always (preserves ANSI colors by default):');
|
|
9
|
+
try {
|
|
10
|
+
const result = await $`ls --color=always -la`;
|
|
11
|
+
console.log('Raw output with ANSI codes:');
|
|
12
|
+
console.log(result.stdout);
|
|
13
|
+
|
|
14
|
+
console.log('\n2. Same output with ANSI codes stripped:');
|
|
15
|
+
const cleanOutput = AnsiUtils.stripAnsi(result.stdout);
|
|
16
|
+
console.log(cleanOutput);
|
|
17
|
+
|
|
18
|
+
console.log('\n3. Raw bytes showing ANSI escape sequences:');
|
|
19
|
+
console.log(
|
|
20
|
+
'First 200 chars as bytes:',
|
|
21
|
+
Buffer.from(result.stdout.slice(0, 200))
|
|
22
|
+
);
|
|
23
|
+
} catch (error) {
|
|
24
|
+
console.log(
|
|
25
|
+
'Note: ls --color might not be available on macOS, trying alternative...'
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// Try with a different colored command
|
|
29
|
+
const result =
|
|
30
|
+
await $`printf "\033[31mRed\033[0m \033[32mGreen\033[0m \033[34mBlue\033[0m\n"`;
|
|
31
|
+
console.log('Raw output with ANSI codes:');
|
|
32
|
+
process.stdout.write(result.stdout); // Write directly to see colors
|
|
33
|
+
|
|
34
|
+
console.log('\nSame output with ANSI codes stripped:');
|
|
35
|
+
console.log(AnsiUtils.stripAnsi(result.stdout));
|
|
36
|
+
|
|
37
|
+
console.log('\nRaw bytes showing escape sequences:');
|
|
38
|
+
console.log(Buffer.from(result.stdout));
|
|
39
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log(
|
|
6
|
+
'=== Running top command with ANSI colors preserved (default behavior) ==='
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
// Run top for 3 seconds then kill it
|
|
10
|
+
const proc = $`top -l 1`;
|
|
11
|
+
|
|
12
|
+
// Show the output as it streams
|
|
13
|
+
proc.on('stdout', (chunk) => {
|
|
14
|
+
process.stdout.write(chunk);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
proc.on('stderr', (chunk) => {
|
|
18
|
+
process.stderr.write(chunk);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
proc.on('end', (result) => {
|
|
22
|
+
console.log('\n=== Command completed ===');
|
|
23
|
+
console.log(`Exit code: ${result.code}`);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Execute the command
|
|
27
|
+
await proc;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Final proof: ping cannot be controlled via stdin - needs kill() method
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { $ } from '../src/$.mjs';
|
|
9
|
+
|
|
10
|
+
console.log('=== FINAL PROOF: ping stdin vs kill() ===');
|
|
11
|
+
|
|
12
|
+
async function finalProof() {
|
|
13
|
+
console.log('\\n1️⃣ NATIVE SPAWN: ping ignores stdin CTRL+C');
|
|
14
|
+
|
|
15
|
+
const nativePing = spawn('ping', ['-c', '10', '8.8.8.8']); // Limit to 10 pings
|
|
16
|
+
|
|
17
|
+
nativePing.stdout.on('data', (data) => {
|
|
18
|
+
process.stdout.write(`[native] ${data}`);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Try stdin after 1 second
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
console.log('\\n → Sending CTRL+C via stdin...');
|
|
24
|
+
nativePing.stdin.write('\\x03');
|
|
25
|
+
nativePing.stdin.end();
|
|
26
|
+
}, 1000);
|
|
27
|
+
|
|
28
|
+
// Force kill if still running after 3 seconds
|
|
29
|
+
setTimeout(() => {
|
|
30
|
+
if (!nativePing.killed) {
|
|
31
|
+
console.log('\\n → stdin FAILED, using SIGTERM...');
|
|
32
|
+
nativePing.kill('SIGTERM');
|
|
33
|
+
}
|
|
34
|
+
}, 3000);
|
|
35
|
+
|
|
36
|
+
const nativeResult = await new Promise((resolve) => {
|
|
37
|
+
nativePing.on('close', (code, signal) => resolve({ code, signal }));
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
console.log(
|
|
41
|
+
`\\n ✓ Result: code=${nativeResult.code}, signal=${nativeResult.signal}`
|
|
42
|
+
);
|
|
43
|
+
console.log(' ✓ Proof: ping ignores stdin, needed kill signal\\n');
|
|
44
|
+
|
|
45
|
+
console.log('2️⃣ COMMAND-STREAM: kill() method works perfectly');
|
|
46
|
+
|
|
47
|
+
const streamPing = $`ping 8.8.8.8`;
|
|
48
|
+
|
|
49
|
+
// Start ping by accessing stdout stream
|
|
50
|
+
const stdout = streamPing.streams.stdout;
|
|
51
|
+
if (stdout) {
|
|
52
|
+
stdout.on('data', (data) => {
|
|
53
|
+
process.stdout.write(`[stream] ${data}`);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Kill cleanly after 2 seconds
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
console.log('\\n → Using command-stream kill()...');
|
|
60
|
+
streamPing.kill();
|
|
61
|
+
}, 2000);
|
|
62
|
+
|
|
63
|
+
const streamResult = await streamPing;
|
|
64
|
+
console.log(`\\n ✓ Result: code=${streamResult.code}`);
|
|
65
|
+
console.log(' ✓ Success: kill() method worked perfectly\\n');
|
|
66
|
+
|
|
67
|
+
console.log('3️⃣ STDIN WORKS: for commands that actually read it');
|
|
68
|
+
|
|
69
|
+
const catCmd = $`cat`;
|
|
70
|
+
const stdin = catCmd.streams.stdin;
|
|
71
|
+
|
|
72
|
+
console.log(' → Sending data to cat via stdin...');
|
|
73
|
+
if (stdin) {
|
|
74
|
+
stdin.write('Hello via stdin!\\n');
|
|
75
|
+
stdin.write('This works because cat reads stdin\\n');
|
|
76
|
+
stdin.end();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const catResult = await catCmd;
|
|
80
|
+
console.log(` ✓ cat output: ${JSON.stringify(catResult.stdout)}`);
|
|
81
|
+
|
|
82
|
+
console.log('\\n📋 CONCLUSION:');
|
|
83
|
+
console.log('✓ ping ignores stdin → use kill() method');
|
|
84
|
+
console.log('✓ cat/grep/etc read stdin → use streams.stdin');
|
|
85
|
+
console.log('✓ command-stream provides both capabilities');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
finalProof().catch(console.error);
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, shell, enableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
import { mkdtempSync, rmSync } from 'fs';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
|
|
8
|
+
enableVirtualCommands();
|
|
9
|
+
shell.verbose(false);
|
|
10
|
+
|
|
11
|
+
console.log('=== Final Shell Operators Test ===\n');
|
|
12
|
+
|
|
13
|
+
const testResults = [];
|
|
14
|
+
|
|
15
|
+
async function test(name, fn) {
|
|
16
|
+
try {
|
|
17
|
+
await fn();
|
|
18
|
+
testResults.push({ name, status: '✓' });
|
|
19
|
+
console.log(`✓ ${name}`);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
testResults.push({ name, status: '✗', error: error.message });
|
|
22
|
+
console.log(`✗ ${name}: ${error.message}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const originalCwd = process.cwd();
|
|
27
|
+
|
|
28
|
+
// Test 1: && operator
|
|
29
|
+
await test('&& operator works', async () => {
|
|
30
|
+
const result = await $`cd /tmp && pwd`;
|
|
31
|
+
if (result.stdout.trim() !== '/tmp') {
|
|
32
|
+
throw new Error(`Expected /tmp, got ${result.stdout.trim()}`);
|
|
33
|
+
}
|
|
34
|
+
process.chdir(originalCwd);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Test 2: || operator
|
|
38
|
+
await test('|| operator works', async () => {
|
|
39
|
+
const result = await $`cd /nonexistent 2>/dev/null || echo "failed"`;
|
|
40
|
+
if (!result.stdout.includes('failed')) {
|
|
41
|
+
throw new Error('Expected "failed" in output');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Test 3: ; operator
|
|
46
|
+
await test('; operator works', async () => {
|
|
47
|
+
const result = await $`cd /tmp ; pwd ; cd /usr ; pwd`;
|
|
48
|
+
const lines = result.stdout.trim().split('\n');
|
|
49
|
+
if (lines[0] !== '/tmp' || lines[1] !== '/usr') {
|
|
50
|
+
throw new Error(`Expected /tmp and /usr, got ${lines.join(', ')}`);
|
|
51
|
+
}
|
|
52
|
+
process.chdir(originalCwd);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Test 4: Subshell ()
|
|
56
|
+
await test('Subshell isolation works', async () => {
|
|
57
|
+
await $`cd /tmp`;
|
|
58
|
+
const result = await $`(cd /usr && pwd) ; pwd`;
|
|
59
|
+
const lines = result.stdout.trim().split('\n');
|
|
60
|
+
if (lines[0] !== '/usr' || lines[1] !== '/tmp') {
|
|
61
|
+
throw new Error(`Expected /usr then /tmp, got ${lines.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
process.chdir(originalCwd);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Test 5: Complex chain
|
|
67
|
+
await test('Complex chain works', async () => {
|
|
68
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'test-'));
|
|
69
|
+
try {
|
|
70
|
+
const result =
|
|
71
|
+
await $`cd ${tempDir} && echo "file1" > a.txt && echo "file2" > b.txt && ls | wc -l`;
|
|
72
|
+
const fileCount = parseInt(result.stdout.trim());
|
|
73
|
+
if (fileCount !== 2) {
|
|
74
|
+
throw new Error(`Expected 2 files, got ${fileCount}`);
|
|
75
|
+
}
|
|
76
|
+
} finally {
|
|
77
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
78
|
+
process.chdir(originalCwd);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Test 6: cd persists across commands
|
|
83
|
+
await test('cd persists in session', async () => {
|
|
84
|
+
await $`cd /var`;
|
|
85
|
+
const pwd = await $`pwd`;
|
|
86
|
+
if (pwd.stdout.trim() !== '/var') {
|
|
87
|
+
throw new Error(`Expected /var, got ${pwd.stdout.trim()}`);
|
|
88
|
+
}
|
|
89
|
+
process.chdir(originalCwd);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Test 7: Nested subshells
|
|
93
|
+
await test('Nested subshells work', async () => {
|
|
94
|
+
const result = await $`(cd /tmp && (cd /usr && pwd) && pwd)`;
|
|
95
|
+
const lines = result.stdout.trim().split('\n');
|
|
96
|
+
if (lines[0] !== '/usr' || lines[1] !== '/tmp') {
|
|
97
|
+
throw new Error(`Expected /usr then /tmp, got ${lines.join(', ')}`);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Test 8: Virtual commands in chains
|
|
102
|
+
await test('Virtual commands work in chains', async () => {
|
|
103
|
+
const result = await $`echo "hello" && pwd && echo "world"`;
|
|
104
|
+
if (!result.stdout.includes('hello') || !result.stdout.includes('world')) {
|
|
105
|
+
throw new Error('Expected both hello and world in output');
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Summary
|
|
110
|
+
console.log('\n=== Test Summary ===');
|
|
111
|
+
const passed = testResults.filter((r) => r.status === '✓').length;
|
|
112
|
+
const failed = testResults.filter((r) => r.status === '✗').length;
|
|
113
|
+
console.log(`Passed: ${passed}/${testResults.length}`);
|
|
114
|
+
if (failed > 0) {
|
|
115
|
+
console.log('\nFailed tests:');
|
|
116
|
+
testResults
|
|
117
|
+
.filter((r) => r.status === '✗')
|
|
118
|
+
.forEach((r) => {
|
|
119
|
+
console.log(` - ${r.name}: ${r.error}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
process.exit(failed > 0 ? 1 : 0);
|