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,162 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Final working examples of streaming interfaces for README
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { $ } from '../src/$.mjs';
|
|
8
|
+
|
|
9
|
+
console.log('š Final Working Examples - Streaming Interfaces');
|
|
10
|
+
console.log('='.repeat(55));
|
|
11
|
+
|
|
12
|
+
async function finalWorkingExamples() {
|
|
13
|
+
try {
|
|
14
|
+
console.log('\\nš EXAMPLE 1: Send data via streams.stdin');
|
|
15
|
+
console.log('ā'.repeat(30));
|
|
16
|
+
|
|
17
|
+
// Create a simple echo script that waits for input
|
|
18
|
+
const echoCmd = $`node -e "process.stdin.pipe(process.stdout)"`;
|
|
19
|
+
const stdin = await echoCmd.streams.stdin;
|
|
20
|
+
|
|
21
|
+
if (stdin) {
|
|
22
|
+
stdin.write('Hello from stdin!\\n');
|
|
23
|
+
stdin.write('Multiple lines work!\\n');
|
|
24
|
+
stdin.end();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const result = await echoCmd;
|
|
28
|
+
console.log('ā
Output:', JSON.stringify(result.stdout));
|
|
29
|
+
|
|
30
|
+
console.log('\\nš§ EXAMPLE 2: Filter data with grep');
|
|
31
|
+
console.log('ā'.repeat(30));
|
|
32
|
+
|
|
33
|
+
const grepCmd = $`grep "important"`;
|
|
34
|
+
const grepStdin = await grepCmd.streams.stdin;
|
|
35
|
+
|
|
36
|
+
if (grepStdin) {
|
|
37
|
+
grepStdin.write('ignore this line\\n');
|
|
38
|
+
grepStdin.write('important message 1\\n');
|
|
39
|
+
grepStdin.write('skip this too\\n');
|
|
40
|
+
grepStdin.write('another important note\\n');
|
|
41
|
+
grepStdin.end();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const grepResult = await grepCmd;
|
|
45
|
+
console.log('ā
Filtered output:', JSON.stringify(grepResult.stdout));
|
|
46
|
+
|
|
47
|
+
console.log('\\nš EXAMPLE 3: Sort data via stdin');
|
|
48
|
+
console.log('ā'.repeat(30));
|
|
49
|
+
|
|
50
|
+
const sortCmd = $`sort`;
|
|
51
|
+
const sortStdin = await sortCmd.streams.stdin;
|
|
52
|
+
|
|
53
|
+
if (sortStdin) {
|
|
54
|
+
sortStdin.write('zebra\\n');
|
|
55
|
+
sortStdin.write('apple\\n');
|
|
56
|
+
sortStdin.write('banana\\n');
|
|
57
|
+
sortStdin.write('cherry\\n');
|
|
58
|
+
sortStdin.end();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const sortResult = await sortCmd;
|
|
62
|
+
console.log('ā
Sorted output:', JSON.stringify(sortResult.stdout));
|
|
63
|
+
|
|
64
|
+
console.log('\\nš§® EXAMPLE 4: Calculator with bc');
|
|
65
|
+
console.log('ā'.repeat(30));
|
|
66
|
+
|
|
67
|
+
const calcCmd = $`bc -l`;
|
|
68
|
+
const calcStdin = await calcCmd.streams.stdin;
|
|
69
|
+
|
|
70
|
+
if (calcStdin) {
|
|
71
|
+
calcStdin.write('scale=2\\n'); // Set decimal precision
|
|
72
|
+
calcStdin.write('10 / 3\\n'); // Division
|
|
73
|
+
calcStdin.write('sqrt(16)\\n'); // Square root
|
|
74
|
+
calcStdin.write('quit\\n'); // Exit
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const calcResult = await calcCmd;
|
|
78
|
+
console.log(
|
|
79
|
+
'ā
Calculation results:',
|
|
80
|
+
JSON.stringify(calcResult.stdout.trim())
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
console.log('\\nš EXAMPLE 5: Text transformation with tr');
|
|
84
|
+
console.log('ā'.repeat(30));
|
|
85
|
+
|
|
86
|
+
const trCmd = $`tr 'a-z' 'A-Z'`; // Convert to uppercase
|
|
87
|
+
const trStdin = await trCmd.streams.stdin;
|
|
88
|
+
|
|
89
|
+
if (trStdin) {
|
|
90
|
+
trStdin.write('hello world\\n');
|
|
91
|
+
trStdin.write('this is lowercase text\\n');
|
|
92
|
+
trStdin.end();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const trResult = await trCmd;
|
|
96
|
+
console.log('ā
Transformed text:', JSON.stringify(trResult.stdout));
|
|
97
|
+
|
|
98
|
+
console.log(
|
|
99
|
+
'\\nā” EXAMPLE 6: Process control - kill() for commands that ignore stdin'
|
|
100
|
+
);
|
|
101
|
+
console.log('ā'.repeat(30));
|
|
102
|
+
|
|
103
|
+
const pingCmd = $`ping -c 10 8.8.8.8`; // Long ping
|
|
104
|
+
|
|
105
|
+
// Try stdin (will be ignored by ping)
|
|
106
|
+
setTimeout(async () => {
|
|
107
|
+
const pingStdin = await pingCmd.streams.stdin;
|
|
108
|
+
if (pingStdin) {
|
|
109
|
+
pingStdin.write('q\\n');
|
|
110
|
+
pingStdin.end();
|
|
111
|
+
console.log(' š Sent "q" to ping (will be ignored)');
|
|
112
|
+
}
|
|
113
|
+
}, 500);
|
|
114
|
+
|
|
115
|
+
// Use kill() since ping ignores stdin
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
console.log(' šŖ Using kill() method to stop ping...');
|
|
118
|
+
pingCmd.kill();
|
|
119
|
+
}, 1500);
|
|
120
|
+
|
|
121
|
+
const pingResult = await pingCmd;
|
|
122
|
+
console.log('ā
Ping stopped with exit code:', pingResult.code);
|
|
123
|
+
console.log(
|
|
124
|
+
'ā
Captured',
|
|
125
|
+
pingResult.stdout.length,
|
|
126
|
+
'characters of output'
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
console.log('\\nšÆ EXAMPLE 7: Mixed stdout/stderr handling');
|
|
130
|
+
console.log('ā'.repeat(30));
|
|
131
|
+
|
|
132
|
+
const mixedCmd = $`sh -c 'echo "stdout message" && echo "stderr message" >&2'`;
|
|
133
|
+
|
|
134
|
+
const [stdout, stderr] = await Promise.all([
|
|
135
|
+
mixedCmd.strings.stdout,
|
|
136
|
+
mixedCmd.strings.stderr,
|
|
137
|
+
]);
|
|
138
|
+
|
|
139
|
+
console.log('ā
Stdout:', JSON.stringify(stdout.trim()));
|
|
140
|
+
console.log('ā
Stderr:', JSON.stringify(stderr.trim()));
|
|
141
|
+
|
|
142
|
+
console.log(`\\n${'='.repeat(55)}`);
|
|
143
|
+
console.log('š ALL STREAMING EXAMPLES COMPLETED SUCCESSFULLY!');
|
|
144
|
+
console.log('\\nš Key Takeaways:');
|
|
145
|
+
console.log(
|
|
146
|
+
' ā
await cmd.streams.stdin - Send data to interactive commands'
|
|
147
|
+
);
|
|
148
|
+
console.log(' ā
await cmd.buffers.stdout - Get binary data');
|
|
149
|
+
console.log(' ā
await cmd.strings.stderr - Get text data');
|
|
150
|
+
console.log(
|
|
151
|
+
' ā
cmd.kill() - Stop processes that ignore stdin'
|
|
152
|
+
);
|
|
153
|
+
console.log(' ā
Works with: grep, sort, bc, tr, node, python, etc.');
|
|
154
|
+
console.log(' ā
Network commands (ping) need kill(), not stdin');
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.log('\\nā ERROR:', error.message);
|
|
157
|
+
console.error(error.stack);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
finalWorkingExamples();
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
|
|
5
|
+
console.log('Testing gh auth status with $.mjs\n');
|
|
6
|
+
|
|
7
|
+
// Test 1: Basic gh auth status with capture
|
|
8
|
+
console.log('Test 1: Using .run() with capture');
|
|
9
|
+
try {
|
|
10
|
+
const result = await $`gh auth status`.run({ capture: true, mirror: false });
|
|
11
|
+
console.log('Exit code:', result.code);
|
|
12
|
+
console.log('Stdout length:', result.stdout.length);
|
|
13
|
+
console.log('Stderr length:', result.stderr.length);
|
|
14
|
+
console.log('Success: gh auth check passed\n');
|
|
15
|
+
} catch (error) {
|
|
16
|
+
console.log('Error with .run():', error.message);
|
|
17
|
+
console.log('Exit code:', error.code);
|
|
18
|
+
console.log('Stdout:', error.stdout);
|
|
19
|
+
console.log('Stderr:', error.stderr);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Test 2: Using await directly
|
|
23
|
+
console.log('Test 2: Using await directly');
|
|
24
|
+
try {
|
|
25
|
+
const result = await $`gh auth status`;
|
|
26
|
+
console.log('Exit code:', result.code);
|
|
27
|
+
console.log('Success: gh auth check passed\n');
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.log('Error with await:', error.message);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Test 3: Check with 2>&1 redirection
|
|
33
|
+
console.log('Test 3: Using 2>&1 redirection');
|
|
34
|
+
try {
|
|
35
|
+
const result = await $`gh auth status 2>&1`.run({
|
|
36
|
+
capture: true,
|
|
37
|
+
mirror: false,
|
|
38
|
+
});
|
|
39
|
+
console.log('Exit code:', result.code);
|
|
40
|
+
console.log('Combined output length:', result.stdout.length);
|
|
41
|
+
console.log('Success: gh auth check passed\n');
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.log('Error with redirection:', error.message);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Test 4: Using streaming
|
|
47
|
+
console.log('Test 4: Using streaming');
|
|
48
|
+
try {
|
|
49
|
+
const cmd = $`gh auth status`;
|
|
50
|
+
let outputReceived = false;
|
|
51
|
+
|
|
52
|
+
for await (const chunk of cmd.stream()) {
|
|
53
|
+
outputReceived = true;
|
|
54
|
+
console.log(
|
|
55
|
+
`Received ${chunk.type}: ${chunk.data.toString().slice(0, 50)}...`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const result = await cmd;
|
|
60
|
+
console.log('Exit code:', result.code);
|
|
61
|
+
console.log('Stream output received:', outputReceived);
|
|
62
|
+
console.log('Success: gh auth check passed\n');
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.log('Error with streaming:', error.message);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Test 5: Check actual authentication status
|
|
68
|
+
console.log('Test 5: Parse auth status');
|
|
69
|
+
try {
|
|
70
|
+
const result = await $`gh auth status 2>&1`.run({
|
|
71
|
+
capture: true,
|
|
72
|
+
mirror: false,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Check if output contains success indicators
|
|
76
|
+
const output = result.stdout + result.stderr;
|
|
77
|
+
const isAuthenticated =
|
|
78
|
+
output.includes('Logged in to') || output.includes('ā');
|
|
79
|
+
|
|
80
|
+
console.log('Is authenticated:', isAuthenticated);
|
|
81
|
+
|
|
82
|
+
if (isAuthenticated) {
|
|
83
|
+
// Try to extract username
|
|
84
|
+
const usernameMatch = output.match(/account\s+(\S+)/);
|
|
85
|
+
if (usernameMatch) {
|
|
86
|
+
console.log('GitHub username:', usernameMatch[1]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The command might exit with 0 even when not authenticated (just showing status)
|
|
91
|
+
// or exit with 1 when not authenticated
|
|
92
|
+
console.log('Raw exit code:', result.code);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.log('Failed to check auth status:', error.message);
|
|
95
|
+
console.log('This might mean gh is not authenticated');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
console.log('\n--- Summary ---');
|
|
99
|
+
console.log('gh auth status behavior:');
|
|
100
|
+
console.log('- Exit code 0: gh CLI is installed and can show status');
|
|
101
|
+
console.log('- Exit code 1: Usually means not authenticated');
|
|
102
|
+
console.log('- Output goes to stderr by default (not stdout)');
|
|
103
|
+
console.log('- Use 2>&1 to capture the status output');
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
|
|
8
|
+
console.log('=== Testing gh gist delete hanging scenario ===\n');
|
|
9
|
+
|
|
10
|
+
// First create a gist to delete
|
|
11
|
+
const tempFile = path.join(os.tmpdir(), 'delete-hang-test.txt');
|
|
12
|
+
await fs.writeFile(tempFile, 'Test content for deletion\n');
|
|
13
|
+
|
|
14
|
+
console.log('Creating a gist to test deletion...');
|
|
15
|
+
const createResult =
|
|
16
|
+
await $`gh gist create ${tempFile} --desc "delete-test" --public=false 2>&1`.run(
|
|
17
|
+
{
|
|
18
|
+
capture: true,
|
|
19
|
+
mirror: false,
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const lines = createResult.stdout.trim().split('\n');
|
|
24
|
+
const gistUrl = lines.find((line) => line.includes('gist.github.com'));
|
|
25
|
+
if (!gistUrl) {
|
|
26
|
+
console.error('Failed to create test gist');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const gistId = gistUrl.split('/').pop();
|
|
31
|
+
console.log('Created gist:', gistId);
|
|
32
|
+
|
|
33
|
+
console.log('\nNow testing deletion that might hang...');
|
|
34
|
+
console.log('Using the pattern from the original test:\n');
|
|
35
|
+
|
|
36
|
+
// This is the pattern that was in the original test
|
|
37
|
+
async function deleteGist(gistId) {
|
|
38
|
+
console.log('šļø Deleting the test gist...');
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const deleteResult = await $`gh gist delete ${gistId} --yes`.run({
|
|
42
|
+
capture: true,
|
|
43
|
+
mirror: false,
|
|
44
|
+
});
|
|
45
|
+
console.log(' - Exit code:', deleteResult.code);
|
|
46
|
+
console.log(' - ā
Gist deleted successfully');
|
|
47
|
+
return true;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.log(' ā Failed to delete:', error.message);
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Call the delete function
|
|
55
|
+
const startTime = Date.now();
|
|
56
|
+
await deleteGist(gistId);
|
|
57
|
+
const deleteTime = Date.now() - startTime;
|
|
58
|
+
console.log(`Delete completed in ${deleteTime}ms`);
|
|
59
|
+
|
|
60
|
+
// Now try to verify it's gone (this is where it might hang)
|
|
61
|
+
console.log('\nā
Verifying deletion...');
|
|
62
|
+
const verifyStart = Date.now();
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
console.log('Running gh gist view (this might hang)...');
|
|
66
|
+
await $`gh gist view ${gistId}`.run({ capture: true, mirror: false });
|
|
67
|
+
console.log(' ā Gist still exists!');
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.log(' ā
Confirmed: gist no longer exists');
|
|
70
|
+
console.log(' Error code:', error.code);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const verifyTime = Date.now() - verifyStart;
|
|
74
|
+
console.log(`Verification completed in ${verifyTime}ms`);
|
|
75
|
+
|
|
76
|
+
// Clean up
|
|
77
|
+
await fs.unlink(tempFile).catch(() => {});
|
|
78
|
+
|
|
79
|
+
console.log('\n=== Test completed without hanging ===');
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
|
|
8
|
+
console.log('=== Testing Secret Gist Creation with $.mjs ===\n');
|
|
9
|
+
|
|
10
|
+
const TEST_GIST_DESC = 'test-gist-from-command-stream';
|
|
11
|
+
const TEST_FILE_CONTENT =
|
|
12
|
+
'# Test Gist\n\nThis is a test gist created by command-stream $.mjs library.\n';
|
|
13
|
+
|
|
14
|
+
async function cleanup() {
|
|
15
|
+
// Clean up any existing test gists
|
|
16
|
+
console.log('š§¹ Cleaning up any existing test gists...');
|
|
17
|
+
try {
|
|
18
|
+
const listResult =
|
|
19
|
+
await $`gh api /gists --jq '.[] | select(.description == "${TEST_GIST_DESC}") | .id'`.run(
|
|
20
|
+
{ capture: true, mirror: false }
|
|
21
|
+
);
|
|
22
|
+
const gistIds = listResult.stdout
|
|
23
|
+
.trim()
|
|
24
|
+
.split('\n')
|
|
25
|
+
.filter((id) => id);
|
|
26
|
+
|
|
27
|
+
for (const gistId of gistIds) {
|
|
28
|
+
if (gistId) {
|
|
29
|
+
console.log(` Deleting old test gist: ${gistId}`);
|
|
30
|
+
await $`gh gist delete ${gistId} --yes`.run({
|
|
31
|
+
capture: true,
|
|
32
|
+
mirror: false,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.log(' No existing test gists to clean up');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function createGist() {
|
|
42
|
+
console.log('\nš Creating a secret gist...');
|
|
43
|
+
|
|
44
|
+
// Create temp file
|
|
45
|
+
const tempFile = path.join(os.tmpdir(), 'test-gist-content.md');
|
|
46
|
+
await fs.writeFile(tempFile, TEST_FILE_CONTENT);
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
// Create secret gist - use 2>&1 to capture all output
|
|
50
|
+
console.log(' Running: gh gist create with file:', tempFile);
|
|
51
|
+
const createResult =
|
|
52
|
+
await $`gh gist create ${tempFile} --desc "${TEST_GIST_DESC}" --public=false 2>&1`.run(
|
|
53
|
+
{
|
|
54
|
+
capture: true,
|
|
55
|
+
mirror: false,
|
|
56
|
+
timeout: 10000, // 10 second timeout
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
console.log(' Exit code:', createResult.code);
|
|
61
|
+
console.log(' Output:', createResult.stdout.trim());
|
|
62
|
+
|
|
63
|
+
if (createResult.code !== 0) {
|
|
64
|
+
throw new Error(`Failed to create gist. Exit code: ${createResult.code}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Extract gist ID from URL (last line should be the URL)
|
|
68
|
+
const outputLines = createResult.stdout.trim().split('\n');
|
|
69
|
+
const gistUrl =
|
|
70
|
+
outputLines.find((line) => line.includes('gist.github.com')) ||
|
|
71
|
+
outputLines[outputLines.length - 1];
|
|
72
|
+
|
|
73
|
+
if (!gistUrl || !gistUrl.includes('gist.github.com')) {
|
|
74
|
+
throw new Error(`Invalid gist URL returned: ${gistUrl}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const gistId = gistUrl.split('/').pop();
|
|
78
|
+
|
|
79
|
+
console.log(' ā
Gist created with ID:', gistId);
|
|
80
|
+
|
|
81
|
+
// Clean up temp file
|
|
82
|
+
await fs.unlink(tempFile);
|
|
83
|
+
|
|
84
|
+
return gistId;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
await fs.unlink(tempFile).catch(() => {});
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function verifyGistExists(gistId) {
|
|
92
|
+
console.log('\nš Verifying gist exists...');
|
|
93
|
+
|
|
94
|
+
// Method 1: Using gh gist view
|
|
95
|
+
try {
|
|
96
|
+
const viewResult = await $`gh gist view ${gistId} --files`.run({
|
|
97
|
+
capture: true,
|
|
98
|
+
mirror: false,
|
|
99
|
+
});
|
|
100
|
+
console.log(' Method 1 (gh gist view):');
|
|
101
|
+
console.log(' - Exit code:', viewResult.code);
|
|
102
|
+
console.log(' - Files found:', viewResult.stdout.trim());
|
|
103
|
+
console.log(' - ā
Gist exists and is accessible');
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.log(' ā Method 1 failed:', error.message);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Method 2: Using gh api
|
|
109
|
+
try {
|
|
110
|
+
const apiResult = await $`gh api /gists/${gistId} --jq '.description'`.run({
|
|
111
|
+
capture: true,
|
|
112
|
+
mirror: false,
|
|
113
|
+
});
|
|
114
|
+
console.log(' Method 2 (gh api):');
|
|
115
|
+
console.log(' - Exit code:', apiResult.code);
|
|
116
|
+
console.log(' - Description:', apiResult.stdout.trim());
|
|
117
|
+
console.log(' - ā
Confirmed via API');
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.log(' ā Method 2 failed:', error.message);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Method 3: Check if it's secret
|
|
123
|
+
try {
|
|
124
|
+
const secretResult = await $`gh api /gists/${gistId} --jq '.public'`.run({
|
|
125
|
+
capture: true,
|
|
126
|
+
mirror: false,
|
|
127
|
+
});
|
|
128
|
+
const isPublic = secretResult.stdout.trim() === 'true';
|
|
129
|
+
console.log(' Method 3 (check privacy):');
|
|
130
|
+
console.log(' - Is public:', isPublic);
|
|
131
|
+
console.log(' - Is secret:', !isPublic);
|
|
132
|
+
console.log(
|
|
133
|
+
' -',
|
|
134
|
+
!isPublic ? 'ā
Confirmed as secret gist' : 'ā Not a secret gist'
|
|
135
|
+
);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.log(' ā Method 3 failed:', error.message);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function findGistByDescription() {
|
|
142
|
+
console.log('\nš Finding gist by description...');
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
// Use jq to filter gists by description
|
|
146
|
+
const findResult =
|
|
147
|
+
await $`gh api /gists --jq '.[] | select(.description == "${TEST_GIST_DESC}") | .id + " " + .description' | head -1`.run(
|
|
148
|
+
{ capture: true, mirror: false }
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
if (findResult.stdout.trim()) {
|
|
152
|
+
const [id, desc] = findResult.stdout.trim().split(' ');
|
|
153
|
+
console.log(' - Found gist ID:', id);
|
|
154
|
+
console.log(' - Description:', desc || TEST_GIST_DESC);
|
|
155
|
+
console.log(' - ā
Successfully found by description');
|
|
156
|
+
return id;
|
|
157
|
+
} else {
|
|
158
|
+
console.log(' - ā No gist found with that description');
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.log(' ā Error finding gist:', error.message);
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function addFileToGist(gistId) {
|
|
168
|
+
console.log('\nš Adding another file to the gist...');
|
|
169
|
+
|
|
170
|
+
const tempFile2 = path.join(os.tmpdir(), 'additional-file.txt');
|
|
171
|
+
await fs.writeFile(
|
|
172
|
+
tempFile2,
|
|
173
|
+
'This is an additional file added to the gist.\n'
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const editResult =
|
|
178
|
+
await $`gh gist edit ${gistId} ${tempFile2} --filename "added-file.txt"`.run(
|
|
179
|
+
{ capture: true, mirror: false }
|
|
180
|
+
);
|
|
181
|
+
console.log(' - Exit code:', editResult.code);
|
|
182
|
+
console.log(' - ā
File added successfully');
|
|
183
|
+
|
|
184
|
+
// Verify the file was added
|
|
185
|
+
const filesResult = await $`gh gist view ${gistId} --files`.run({
|
|
186
|
+
capture: true,
|
|
187
|
+
mirror: false,
|
|
188
|
+
});
|
|
189
|
+
console.log(' - Files in gist:', filesResult.stdout.trim());
|
|
190
|
+
|
|
191
|
+
await fs.unlink(tempFile2);
|
|
192
|
+
return true;
|
|
193
|
+
} catch (error) {
|
|
194
|
+
await fs.unlink(tempFile2).catch(() => {});
|
|
195
|
+
console.log(' ā Failed to add file:', error.message);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function deleteGist(gistId) {
|
|
201
|
+
console.log('\nšļø Deleting the test gist...');
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
const deleteResult = await $`gh gist delete ${gistId} --yes`.run({
|
|
205
|
+
capture: true,
|
|
206
|
+
mirror: false,
|
|
207
|
+
});
|
|
208
|
+
console.log(' - Exit code:', deleteResult.code);
|
|
209
|
+
console.log(' - ā
Gist deleted successfully');
|
|
210
|
+
return true;
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.log(' ā Failed to delete:', error.message);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Main test flow
|
|
218
|
+
async function runTests() {
|
|
219
|
+
try {
|
|
220
|
+
// Check authentication first
|
|
221
|
+
console.log('š Checking GitHub authentication...');
|
|
222
|
+
const authResult = await $`gh auth status`.run({
|
|
223
|
+
capture: true,
|
|
224
|
+
mirror: false,
|
|
225
|
+
});
|
|
226
|
+
if (authResult.code !== 0) {
|
|
227
|
+
console.error(
|
|
228
|
+
'ā Not authenticated to GitHub. Please run: gh auth login'
|
|
229
|
+
);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
console.log(' ā
Authenticated\n');
|
|
233
|
+
|
|
234
|
+
// Clean up any existing test gists
|
|
235
|
+
await cleanup();
|
|
236
|
+
|
|
237
|
+
// Create a secret gist
|
|
238
|
+
const gistId = await createGist();
|
|
239
|
+
|
|
240
|
+
// Verify it exists
|
|
241
|
+
await verifyGistExists(gistId);
|
|
242
|
+
|
|
243
|
+
// Find it by description
|
|
244
|
+
const foundId = await findGistByDescription();
|
|
245
|
+
console.log(' - IDs match:', foundId === gistId ? 'ā
Yes' : 'ā No');
|
|
246
|
+
|
|
247
|
+
// Add a file to it
|
|
248
|
+
await addFileToGist(gistId);
|
|
249
|
+
|
|
250
|
+
// Delete it
|
|
251
|
+
await deleteGist(gistId);
|
|
252
|
+
|
|
253
|
+
// Verify it's gone
|
|
254
|
+
console.log('\nā
Verifying deletion...');
|
|
255
|
+
try {
|
|
256
|
+
await $`gh gist view ${gistId}`.run({ capture: true, mirror: false });
|
|
257
|
+
console.log(' ā Gist still exists!');
|
|
258
|
+
} catch (error) {
|
|
259
|
+
console.log(' ā
Confirmed: gist no longer exists');
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
console.log('\n=== Summary ===');
|
|
263
|
+
console.log(
|
|
264
|
+
'ā
Successfully created, verified, modified, and deleted a secret gist'
|
|
265
|
+
);
|
|
266
|
+
console.log('ā
All operations work correctly with $.mjs');
|
|
267
|
+
console.log('ā
Exit codes are properly captured');
|
|
268
|
+
console.log('ā
Output is correctly captured in stdout');
|
|
269
|
+
} catch (error) {
|
|
270
|
+
console.error('\nā Test failed:', error.message);
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Run the tests
|
|
276
|
+
runTests();
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { $ } from '../src/$.mjs';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
|
|
6
|
+
console.log('=== Minimal gh gist create test ===\n');
|
|
7
|
+
|
|
8
|
+
// Create a test file
|
|
9
|
+
const testFile = '/tmp/test-minimal.txt';
|
|
10
|
+
await fs.writeFile(testFile, 'Test content from minimal test\n');
|
|
11
|
+
|
|
12
|
+
console.log('Test 1: Direct command execution');
|
|
13
|
+
try {
|
|
14
|
+
console.log('Running: gh gist create with timeout...');
|
|
15
|
+
const result =
|
|
16
|
+
await $`timeout 10 gh gist create ${testFile} --desc "minimal-test" --public=false`.run(
|
|
17
|
+
{
|
|
18
|
+
capture: true,
|
|
19
|
+
mirror: true, // Show output as it happens
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
console.log('\nResult:');
|
|
24
|
+
console.log('- Exit code:', result.code);
|
|
25
|
+
console.log('- Stdout:', result.stdout?.slice(0, 100));
|
|
26
|
+
|
|
27
|
+
// Extract gist ID and delete it
|
|
28
|
+
const gistUrl = result.stdout?.trim();
|
|
29
|
+
if (gistUrl && gistUrl.includes('gist.github.com')) {
|
|
30
|
+
const gistId = gistUrl.split('/').pop();
|
|
31
|
+
console.log('- Gist ID:', gistId);
|
|
32
|
+
|
|
33
|
+
// Clean up
|
|
34
|
+
await $`gh gist delete ${gistId} --yes`.run({
|
|
35
|
+
capture: true,
|
|
36
|
+
mirror: false,
|
|
37
|
+
});
|
|
38
|
+
console.log('- Cleaned up test gist');
|
|
39
|
+
}
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.log('Error:', error.message);
|
|
42
|
+
console.log('Exit code:', error.code);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log('\n---\n');
|
|
46
|
+
|
|
47
|
+
console.log('Test 2: Without timeout wrapper');
|
|
48
|
+
try {
|
|
49
|
+
console.log('Running: gh gist create directly...');
|
|
50
|
+
|
|
51
|
+
// Set a timeout option if available
|
|
52
|
+
const result =
|
|
53
|
+
await $`gh gist create ${testFile} --desc "minimal-test-2" --public=false`.run(
|
|
54
|
+
{
|
|
55
|
+
capture: true,
|
|
56
|
+
mirror: true,
|
|
57
|
+
timeout: 10000, // 10 second timeout
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
console.log('\nResult:');
|
|
62
|
+
console.log('- Exit code:', result.code);
|
|
63
|
+
console.log('- Stdout:', result.stdout?.slice(0, 100));
|
|
64
|
+
|
|
65
|
+
// Extract gist ID and delete it
|
|
66
|
+
const gistUrl = result.stdout?.trim();
|
|
67
|
+
if (gistUrl && gistUrl.includes('gist.github.com')) {
|
|
68
|
+
const gistId = gistUrl.split('/').pop();
|
|
69
|
+
console.log('- Gist ID:', gistId);
|
|
70
|
+
|
|
71
|
+
// Clean up
|
|
72
|
+
await $`gh gist delete ${gistId} --yes`.run({
|
|
73
|
+
capture: true,
|
|
74
|
+
mirror: false,
|
|
75
|
+
});
|
|
76
|
+
console.log('- Cleaned up test gist');
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.log('Error:', error.message);
|
|
80
|
+
console.log('Exit code:', error.code);
|
|
81
|
+
if (error.killed) {
|
|
82
|
+
console.log('Process was killed (timeout?)');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Clean up test file
|
|
87
|
+
await fs.unlink(testFile).catch(() => {});
|
|
88
|
+
|
|
89
|
+
console.log('\n=== Done ===');
|