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,24 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Debug Streaming Test ===\n');
|
|
6
|
+
|
|
7
|
+
// Test without pipe first
|
|
8
|
+
console.log('Test 1: No pipe (should work):');
|
|
9
|
+
try {
|
|
10
|
+
const result = await $`echo "hello"`;
|
|
11
|
+
console.log('Result:', result.stdout);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error('Error:', e.message);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Test with simple pipe
|
|
17
|
+
console.log('\nTest 2: Simple pipe:');
|
|
18
|
+
try {
|
|
19
|
+
const result = await $`echo "hello" | cat`;
|
|
20
|
+
console.log('Result:', result.stdout);
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.error('Error:', e.message);
|
|
23
|
+
console.error('Stack:', e.stack);
|
|
24
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { readdirSync } from 'fs';
|
|
5
|
+
|
|
6
|
+
// Get all test files
|
|
7
|
+
const testFiles = readdirSync('tests').filter((f) => f.endsWith('.test.mjs'));
|
|
8
|
+
|
|
9
|
+
function getSigintHandlerCount() {
|
|
10
|
+
const sigintListeners = process.listeners('SIGINT');
|
|
11
|
+
const commandStreamListeners = sigintListeners.filter((l) => {
|
|
12
|
+
const str = l.toString();
|
|
13
|
+
return (
|
|
14
|
+
str.includes('activeProcessRunners') ||
|
|
15
|
+
str.includes('ProcessRunner') ||
|
|
16
|
+
str.includes('activeChildren')
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
return commandStreamListeners.length;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
console.log('=== Test Isolation Debug ===');
|
|
23
|
+
console.log(`Initial SIGINT handlers: ${getSigintHandlerCount()}`);
|
|
24
|
+
|
|
25
|
+
// Run a few key tests individually and check handler count
|
|
26
|
+
const keyTests = [
|
|
27
|
+
'resource-cleanup-internals.test.mjs',
|
|
28
|
+
'cleanup-verification.test.mjs',
|
|
29
|
+
'sigint-cleanup.test.mjs',
|
|
30
|
+
'sigint-cleanup-isolated.test.mjs',
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
for (const testFile of keyTests) {
|
|
34
|
+
console.log(`\n--- Running ${testFile} ---`);
|
|
35
|
+
console.log(`Before: ${getSigintHandlerCount()} handlers`);
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const result = spawn('bun', ['test', `tests/${testFile}`, '--verbose'], {
|
|
39
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
40
|
+
timeout: 30000,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await new Promise((resolve, reject) => {
|
|
44
|
+
result.on('close', resolve);
|
|
45
|
+
result.on('error', reject);
|
|
46
|
+
setTimeout(() => reject(new Error('timeout')), 30000);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
console.log(`After: ${getSigintHandlerCount()} handlers`);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.log(`Error running ${testFile}:`, error.message);
|
|
52
|
+
console.log(`After (with error): ${getSigintHandlerCount()} handlers`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Debug test to understand why virtual commands get bypassed in full test suite
|
|
2
|
+
import { $ } from '../src/$.mjs';
|
|
3
|
+
|
|
4
|
+
async function debugTestState() {
|
|
5
|
+
console.log('=== Debug Test State ===');
|
|
6
|
+
|
|
7
|
+
// Test 1: Simple echo
|
|
8
|
+
console.log('\nTest 1: Simple echo');
|
|
9
|
+
const result1 = await $`echo simple`;
|
|
10
|
+
console.log('Result1:', JSON.stringify(result1.stdout.trim()));
|
|
11
|
+
|
|
12
|
+
// Test 2: Echo with interpolation (like the failing test)
|
|
13
|
+
console.log('\nTest 2: Echo with interpolation');
|
|
14
|
+
const name = 'World';
|
|
15
|
+
const $custom = $({ capture: true, mirror: false });
|
|
16
|
+
const result2 = await $custom`echo Hello, ${name}!`;
|
|
17
|
+
console.log('Result2:', JSON.stringify(result2.stdout.trim()));
|
|
18
|
+
console.log('Expected:', JSON.stringify("Hello, 'World'!"));
|
|
19
|
+
console.log('Test passes:', result2.stdout.trim() === "Hello, 'World'!");
|
|
20
|
+
|
|
21
|
+
// Test 3: Another echo to see if state persists
|
|
22
|
+
console.log('\nTest 3: Another echo');
|
|
23
|
+
const result3 = await $`echo test`;
|
|
24
|
+
console.log('Result3:', JSON.stringify(result3.stdout.trim()));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
debugTestState().catch(console.error);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
let sigintReceived = false;
|
|
6
|
+
|
|
7
|
+
process.on('SIGINT', () => {
|
|
8
|
+
sigintReceived = true;
|
|
9
|
+
console.log('USER_SIGINT_HANDLER_CALLED');
|
|
10
|
+
process.exit(42); // Custom exit code to verify user handler was called
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
console.log('Process started, waiting for SIGINT...');
|
|
14
|
+
|
|
15
|
+
// Wait for SIGINT (simulate doing some work without child processes)
|
|
16
|
+
setTimeout(() => {
|
|
17
|
+
console.log('TIMEOUT_REACHED - no SIGINT received');
|
|
18
|
+
process.exit(1); // Should not reach here in test
|
|
19
|
+
}, 5000);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Enable verbose tracing
|
|
4
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
5
|
+
|
|
6
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
7
|
+
|
|
8
|
+
console.log('=== Virtual Disable Debug ===');
|
|
9
|
+
|
|
10
|
+
console.log('1. Before disabling virtual commands:');
|
|
11
|
+
const cmd1 = $`echo "test1"`;
|
|
12
|
+
cmd1.start();
|
|
13
|
+
console.log('Immediate child1:', !!cmd1.child);
|
|
14
|
+
await cmd1;
|
|
15
|
+
|
|
16
|
+
console.log('2. After disabling virtual commands:');
|
|
17
|
+
disableVirtualCommands();
|
|
18
|
+
const cmd2 = $`echo "test2"`;
|
|
19
|
+
cmd2.start();
|
|
20
|
+
console.log('Immediate child2:', !!cmd2.child);
|
|
21
|
+
await cmd2;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $, disableVirtualCommands } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('=== Virtual vs Real Commands Debug ===');
|
|
6
|
+
|
|
7
|
+
console.log('1. Testing with virtual commands enabled:');
|
|
8
|
+
const cmd1 = $`echo "virtual test"`;
|
|
9
|
+
|
|
10
|
+
cmd1.on('end', (result) => {
|
|
11
|
+
console.log('[VIRTUAL] end event:', result.code);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const result1 = await cmd1;
|
|
15
|
+
console.log(
|
|
16
|
+
'[VIRTUAL] await result:',
|
|
17
|
+
result1.code,
|
|
18
|
+
JSON.stringify(result1.stdout.trim())
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
console.log('2. Testing with virtual commands disabled:');
|
|
22
|
+
disableVirtualCommands();
|
|
23
|
+
|
|
24
|
+
const cmd2 = $`echo "real test"`;
|
|
25
|
+
|
|
26
|
+
cmd2.on('end', (result) => {
|
|
27
|
+
console.log('[REAL] end event:', result.code);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const result2 = await cmd2;
|
|
31
|
+
console.log(
|
|
32
|
+
'[REAL] await result:',
|
|
33
|
+
result2.code,
|
|
34
|
+
JSON.stringify(result2.stdout.trim())
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
console.log('3. Testing stream with virtual commands disabled:');
|
|
38
|
+
const cmd3 = $`echo "real stream test"`;
|
|
39
|
+
let streamEndFired = false;
|
|
40
|
+
|
|
41
|
+
cmd3.on('end', (result) => {
|
|
42
|
+
streamEndFired = true;
|
|
43
|
+
console.log('[REAL STREAM] end event:', result.code);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
console.log('Starting stream...');
|
|
47
|
+
try {
|
|
48
|
+
const chunks = [];
|
|
49
|
+
for await (const chunk of cmd3.stream()) {
|
|
50
|
+
chunks.push(chunk);
|
|
51
|
+
console.log(
|
|
52
|
+
'[REAL STREAM] chunk:',
|
|
53
|
+
chunk.type,
|
|
54
|
+
JSON.stringify(chunk.data.toString().trim())
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Break after receiving data to see if end event fires
|
|
58
|
+
if (chunks.length >= 1) {
|
|
59
|
+
console.log('[REAL STREAM] Breaking after first chunk');
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
console.log('[REAL STREAM] Stream completed, end fired?', streamEndFired);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.log('[REAL STREAM] Error:', error.message);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
console.log('Debug completed!');
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Set trace before importing
|
|
4
|
+
process.env.COMMAND_STREAM_TRACE = 'all';
|
|
5
|
+
process.env.COMMAND_STREAM_VERBOSE = 'true';
|
|
6
|
+
|
|
7
|
+
import { $ } from '../src/$.mjs';
|
|
8
|
+
|
|
9
|
+
async function debugWithTrace() {
|
|
10
|
+
console.log('🐛 Testing with full tracing enabled');
|
|
11
|
+
|
|
12
|
+
const sortCmd = $`echo "test" | sort`;
|
|
13
|
+
console.log('Created command');
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const result = await sortCmd;
|
|
17
|
+
console.log('Result:', result);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.log('Error:', error.message);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
debugWithTrace();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { $ } from '../src/$.mjs';
|
|
2
|
+
|
|
3
|
+
console.log('=== PARENT STREAM CLOSURE TEST ===');
|
|
4
|
+
|
|
5
|
+
// Start a long-running command
|
|
6
|
+
const runner = $`sleep 5`;
|
|
7
|
+
const promise = runner.start();
|
|
8
|
+
|
|
9
|
+
// Simulate parent stream closure after a delay
|
|
10
|
+
setTimeout(() => {
|
|
11
|
+
console.log('SIMULATING_PARENT_STREAM_CLOSURE');
|
|
12
|
+
process.stdout.destroy(); // This should trigger cleanup
|
|
13
|
+
}, 1000);
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await promise;
|
|
17
|
+
console.log('COMMAND_COMPLETED');
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.log('COMMAND_INTERRUPTED:', error.message);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
console.log('=== TEST DONE ===');
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Emulate claude's streaming JSON output
|
|
4
|
+
// This simulates how claude outputs JSON objects incrementally
|
|
5
|
+
|
|
6
|
+
const events = [
|
|
7
|
+
{ type: 'start', message: 'Starting analysis...' },
|
|
8
|
+
{ type: 'progress', step: 1, message: 'Reading files...' },
|
|
9
|
+
{ type: 'data', content: 'Found main entry point' },
|
|
10
|
+
{ type: 'progress', step: 2, message: 'Analyzing dependencies...' },
|
|
11
|
+
{ type: 'data', content: 'Processing module imports' },
|
|
12
|
+
{ type: 'progress', step: 3, message: 'Building context...' },
|
|
13
|
+
{ type: 'result', summary: 'Analysis complete' },
|
|
14
|
+
{ type: 'end', status: 'success' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
async function* streamJsonEvents() {
|
|
18
|
+
for (const event of events) {
|
|
19
|
+
// Output JSON object
|
|
20
|
+
console.log(JSON.stringify(event));
|
|
21
|
+
|
|
22
|
+
// Small delay to simulate processing
|
|
23
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Main execution
|
|
28
|
+
for await (const _ of streamJsonEvents()) {
|
|
29
|
+
// Events are printed in the generator
|
|
30
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Direct execution of emulator
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Direct execution of emulator:');
|
|
8
|
+
const start = Date.now();
|
|
9
|
+
|
|
10
|
+
for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs`.stream()) {
|
|
11
|
+
if (chunk.type === 'stdout') {
|
|
12
|
+
const elapsed = Date.now() - start;
|
|
13
|
+
const lines = chunk.data
|
|
14
|
+
.toString()
|
|
15
|
+
.trim()
|
|
16
|
+
.split('\n')
|
|
17
|
+
.filter((l) => l);
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
console.log(`[${elapsed}ms] ${line}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Emulator piped through jq
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Emulator piped through jq:');
|
|
8
|
+
const start = Date.now();
|
|
9
|
+
|
|
10
|
+
for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
|
|
11
|
+
if (chunk.type === 'stdout') {
|
|
12
|
+
const elapsed = Date.now() - start;
|
|
13
|
+
const lines = chunk.data
|
|
14
|
+
.toString()
|
|
15
|
+
.trim()
|
|
16
|
+
.split('\n')
|
|
17
|
+
.filter((l) => l);
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
console.log(`[${elapsed}ms] ${line}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// Using sh -c with pipe
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Using sh -c with pipe:');
|
|
8
|
+
const start = Date.now();
|
|
9
|
+
|
|
10
|
+
const cmd = $`sh -c 'bun run js/examples/emulate-claude-stream.mjs | jq .'`;
|
|
11
|
+
for await (const chunk of cmd.stream()) {
|
|
12
|
+
if (chunk.type === 'stdout') {
|
|
13
|
+
const elapsed = Date.now() - start;
|
|
14
|
+
const lines = chunk.data
|
|
15
|
+
.toString()
|
|
16
|
+
.trim()
|
|
17
|
+
.split('\n')
|
|
18
|
+
.filter((l) => l);
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
console.log(`[${elapsed}ms] ${line}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Build process simulation with events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Build process simulation:');
|
|
8
|
+
const $buildProcess = $({ mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const buildScript = `
|
|
12
|
+
echo "Build started"
|
|
13
|
+
echo "Compiling TypeScript..." >&2
|
|
14
|
+
sleep 0.5
|
|
15
|
+
echo "✓ TypeScript compilation complete"
|
|
16
|
+
echo "Running tests..." >&2
|
|
17
|
+
sleep 0.8
|
|
18
|
+
echo "✓ All tests passed (15/15)"
|
|
19
|
+
echo "Bundling assets..." >&2
|
|
20
|
+
sleep 0.6
|
|
21
|
+
echo "✓ Assets bundled successfully"
|
|
22
|
+
echo "Optimizing..." >&2
|
|
23
|
+
sleep 0.4
|
|
24
|
+
echo "✓ Optimization complete"
|
|
25
|
+
echo "Build finished successfully"
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
const runner = $buildProcess`bash -c '${buildScript}'`;
|
|
29
|
+
|
|
30
|
+
const buildSteps = [];
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
|
|
33
|
+
runner.on('stdout', (data) => {
|
|
34
|
+
const lines = data
|
|
35
|
+
.toString()
|
|
36
|
+
.split('\n')
|
|
37
|
+
.filter((line) => line.trim());
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
40
|
+
|
|
41
|
+
if (line.startsWith('✓')) {
|
|
42
|
+
buildSteps.push(line);
|
|
43
|
+
console.log(`[${elapsed}s] ✅ ${line.substring(2)}`);
|
|
44
|
+
} else if (line.includes('Build started')) {
|
|
45
|
+
console.log(`[${elapsed}s] 🚀 ${line}`);
|
|
46
|
+
} else if (line.includes('Build finished')) {
|
|
47
|
+
console.log(`[${elapsed}s] 🎉 ${line}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
runner.on('stderr', (data) => {
|
|
53
|
+
const lines = data
|
|
54
|
+
.toString()
|
|
55
|
+
.split('\n')
|
|
56
|
+
.filter((line) => line.trim());
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
59
|
+
console.log(`[${elapsed}s] ⏳ ${line}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
runner.on('close', (code) => {
|
|
64
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
65
|
+
console.log(
|
|
66
|
+
`🏁 Build completed in ${totalTime}s with ${buildSteps.length} successful steps`
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await runner;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.log(`Error: ${error.message}`);
|
|
73
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Multiple concurrent event streams
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Multiple concurrent event streams:');
|
|
8
|
+
|
|
9
|
+
const $concurrent1 = $({ mirror: false });
|
|
10
|
+
const $concurrent2 = $({ mirror: false });
|
|
11
|
+
const $concurrent3 = $({ mirror: false });
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
console.log('Starting concurrent ping streams...');
|
|
15
|
+
|
|
16
|
+
const runners = [
|
|
17
|
+
{ runner: $concurrent1`ping -c 3 8.8.8.8`, name: 'Google DNS' },
|
|
18
|
+
{ runner: $concurrent2`ping -c 3 1.1.1.1`, name: 'Cloudflare DNS' },
|
|
19
|
+
{ runner: $concurrent3`ping -c 3 127.0.0.1`, name: 'Localhost' },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const results = {};
|
|
23
|
+
|
|
24
|
+
for (const { runner, name } of runners) {
|
|
25
|
+
results[name] = { packets: 0, completed: false };
|
|
26
|
+
|
|
27
|
+
runner.on('stdout', (data) => {
|
|
28
|
+
const output = data.toString().trim();
|
|
29
|
+
if (output.includes('bytes from')) {
|
|
30
|
+
results[name].packets++;
|
|
31
|
+
console.log(`🌐 ${name}: packet #${results[name].packets}`);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
runner.on('close', (code) => {
|
|
36
|
+
results[name].completed = true;
|
|
37
|
+
console.log(`✅ ${name}: completed (${results[name].packets} packets)`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Wait for all to complete
|
|
42
|
+
await Promise.all(runners.map(({ runner }) => runner));
|
|
43
|
+
|
|
44
|
+
console.log('\n📊 Final results:');
|
|
45
|
+
for (const [name, data] of Object.entries(results)) {
|
|
46
|
+
const status = data.completed ? '✅' : '❌';
|
|
47
|
+
console.log(`${status} ${name}: ${data.packets} packets received`);
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.log(`❌ Error: ${error.message}`);
|
|
51
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Error handling and recovery with events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Error handling and recovery:');
|
|
8
|
+
const $errorTest = $({ mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// First try a command that will fail
|
|
12
|
+
console.log('Testing error handling...');
|
|
13
|
+
const failRunner = $errorTest`ping -c 2 invalid.host.name.that.does.not.exist`;
|
|
14
|
+
|
|
15
|
+
const errorMessages = [];
|
|
16
|
+
|
|
17
|
+
failRunner.on('stdout', (data) => {
|
|
18
|
+
console.log(`📤 Stdout: ${data.toString().trim()}`);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
failRunner.on('stderr', (data) => {
|
|
22
|
+
const error = data.toString().trim();
|
|
23
|
+
errorMessages.push(error);
|
|
24
|
+
console.log(`🚨 Stderr: ${error}`);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
failRunner.on('close', (code) => {
|
|
28
|
+
console.log(`🔚 Failed command exit code: ${code}`);
|
|
29
|
+
console.log(`📝 Error messages collected: ${errorMessages.length}`);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
await failRunner;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.log(`⚠️ Caught error: ${error.message}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Then try a command that succeeds
|
|
39
|
+
console.log('\nTesting successful recovery...');
|
|
40
|
+
const successRunner = $errorTest`ping -c 2 127.0.0.1`;
|
|
41
|
+
|
|
42
|
+
let successCount = 0;
|
|
43
|
+
|
|
44
|
+
successRunner.on('stdout', (data) => {
|
|
45
|
+
const output = data.toString().trim();
|
|
46
|
+
if (output.includes('bytes from')) {
|
|
47
|
+
successCount++;
|
|
48
|
+
console.log(`✅ Success #${successCount}: Local ping OK`);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
successRunner.on('close', (code) => {
|
|
53
|
+
console.log(`🎯 Recovery successful with code: ${code}`);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await successRunner;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.log(`❌ Unexpected error: ${error.message}`);
|
|
59
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// File monitoring simulation with events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('File monitoring simulation:');
|
|
8
|
+
const $fileMonitor = $({ mirror: false, capture: true });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const monitorScript = `
|
|
12
|
+
echo "File: config.json - CREATED"
|
|
13
|
+
sleep 0.3
|
|
14
|
+
echo "File: config.json - MODIFIED"
|
|
15
|
+
sleep 0.3
|
|
16
|
+
echo "File: app.log - CREATED"
|
|
17
|
+
sleep 0.3
|
|
18
|
+
echo "File: temp.txt - CREATED"
|
|
19
|
+
sleep 0.3
|
|
20
|
+
echo "File: temp.txt - DELETED"
|
|
21
|
+
sleep 0.3
|
|
22
|
+
echo "File: config.json - MODIFIED"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
const runner = $fileMonitor`bash -c '${monitorScript}'`;
|
|
26
|
+
|
|
27
|
+
const fileEvents = new Map();
|
|
28
|
+
|
|
29
|
+
runner.on('stdout', (data) => {
|
|
30
|
+
const lines = data
|
|
31
|
+
.toString()
|
|
32
|
+
.split('\n')
|
|
33
|
+
.filter((line) => line.trim());
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
const match = line.match(/File: (.+) - (.+)/);
|
|
36
|
+
if (match) {
|
|
37
|
+
const [, filename, action] = match;
|
|
38
|
+
|
|
39
|
+
if (!fileEvents.has(filename)) {
|
|
40
|
+
fileEvents.set(filename, []);
|
|
41
|
+
}
|
|
42
|
+
fileEvents.get(filename).push(action);
|
|
43
|
+
|
|
44
|
+
const emoji =
|
|
45
|
+
{
|
|
46
|
+
CREATED: '📄',
|
|
47
|
+
MODIFIED: '✏️',
|
|
48
|
+
DELETED: '🗑️',
|
|
49
|
+
}[action] || '📋';
|
|
50
|
+
|
|
51
|
+
console.log(`${emoji} ${filename}: ${action.toLowerCase()}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
runner.on('close', (code) => {
|
|
57
|
+
console.log(`📊 File activity summary:`);
|
|
58
|
+
for (const [filename, events] of fileEvents) {
|
|
59
|
+
console.log(` ${filename}: ${events.join(' → ')}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await runner;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.log(`Error: ${error.message}`);
|
|
66
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Interactive command simulation with events
|
|
4
|
+
|
|
5
|
+
import { $ } from '../src/$.mjs';
|
|
6
|
+
|
|
7
|
+
console.log('Interactive command simulation:');
|
|
8
|
+
const $interactive = $({ stdin: 'John\n25\nDeveloper\ny\n', mirror: false });
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const interactiveScript = `
|
|
12
|
+
echo "Please enter your name:"
|
|
13
|
+
read name
|
|
14
|
+
echo "Hello $name!"
|
|
15
|
+
echo "Please enter your age:"
|
|
16
|
+
read age
|
|
17
|
+
echo "You are $age years old."
|
|
18
|
+
echo "Please enter your job:"
|
|
19
|
+
read job
|
|
20
|
+
echo "So you work as a $job."
|
|
21
|
+
echo "Is this correct? (y/n):"
|
|
22
|
+
read confirm
|
|
23
|
+
if [ "$confirm" = "y" ]; then
|
|
24
|
+
echo "Profile saved successfully!"
|
|
25
|
+
else
|
|
26
|
+
echo "Profile cancelled."
|
|
27
|
+
fi
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
const runner = $interactive`bash -c '${interactiveScript}'`;
|
|
31
|
+
|
|
32
|
+
let questionCount = 0;
|
|
33
|
+
let responseCount = 0;
|
|
34
|
+
|
|
35
|
+
runner.on('stdout', (data) => {
|
|
36
|
+
const lines = data
|
|
37
|
+
.toString()
|
|
38
|
+
.split('\n')
|
|
39
|
+
.filter((line) => line.trim());
|
|
40
|
+
for (const line of lines) {
|
|
41
|
+
if (line.includes('Please enter') || line.includes('Is this correct')) {
|
|
42
|
+
questionCount++;
|
|
43
|
+
console.log(`❓ Question #${questionCount}: ${line}`);
|
|
44
|
+
} else if (
|
|
45
|
+
line.includes('Hello') ||
|
|
46
|
+
line.includes('You are') ||
|
|
47
|
+
line.includes('So you work')
|
|
48
|
+
) {
|
|
49
|
+
responseCount++;
|
|
50
|
+
console.log(`💬 Response #${responseCount}: ${line}`);
|
|
51
|
+
} else if (
|
|
52
|
+
line.includes('Profile saved') ||
|
|
53
|
+
line.includes('Profile cancelled')
|
|
54
|
+
) {
|
|
55
|
+
console.log(`✅ Result: ${line}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
runner.on('close', (code) => {
|
|
61
|
+
console.log(
|
|
62
|
+
`📝 Interactive session completed: ${questionCount} questions, ${responseCount} responses`
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await runner;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.log(`Error: ${error.message}`);
|
|
69
|
+
}
|