spawn-rx 2.0.8 → 2.0.12
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/.npmignore +1 -0
- package/.travis.yml +17 -3
- package/appveyor.yml +5 -3
- package/lib/index.js +1 -1
- package/lib/src/index.d.ts +88 -0
- package/lib/src/index.js +317 -0
- package/lib/src/index.js.map +1 -0
- package/package.json +25 -16
- package/src/ambient.d.ts +1 -0
- package/src/{index.js → index.ts} +80 -54
- package/test/asserttest.ts +15 -0
- package/test/{spawn.js → spawn.ts} +21 -13
- package/test/{support.js → support.ts} +5 -3
- package/tsconfig.json +29 -0
- package/tslint.json +38 -0
- package/.babelrc +0 -4
- package/.eslintrc +0 -20
- package/lib/babel-maybefill.js +0 -5
- package/test/.eslintrc +0 -26
- package/test/asserttest.js +0 -14
    
        package/.npmignore
    CHANGED
    
    
    
        package/.travis.yml
    CHANGED
    
    | @@ -3,8 +3,22 @@ dist: trusty | |
| 3 3 | 
             
            os:
         | 
| 4 4 | 
             
              - linux
         | 
| 5 5 | 
             
              - osx
         | 
| 6 | 
            +
            cache:
         | 
| 7 | 
            +
              directories:
         | 
| 8 | 
            +
                - node_modules
         | 
| 9 | 
            +
            notifications:
         | 
| 10 | 
            +
              email: false
         | 
| 6 11 | 
             
            language: node_js
         | 
| 7 12 | 
             
            node_js:
         | 
| 8 | 
            -
              -  | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              -  | 
| 13 | 
            +
              - 7
         | 
| 14 | 
            +
              - 6
         | 
| 15 | 
            +
              - 4
         | 
| 16 | 
            +
            install:
         | 
| 17 | 
            +
              - npm install
         | 
| 18 | 
            +
            branches:
         | 
| 19 | 
            +
              only:
         | 
| 20 | 
            +
                - master
         | 
| 21 | 
            +
            before_script:
         | 
| 22 | 
            +
              - npm prune
         | 
| 23 | 
            +
            script:
         | 
| 24 | 
            +
              - npm run build
         | 
    
        package/appveyor.yml
    CHANGED
    
    | @@ -2,10 +2,13 @@ | |
| 2 2 | 
             
            platform:
         | 
| 3 3 | 
             
              - x64
         | 
| 4 4 |  | 
| 5 | 
            +
            cache:
         | 
| 6 | 
            +
              - node_modules
         | 
| 7 | 
            +
             | 
| 5 8 | 
             
            environment:
         | 
| 6 9 | 
             
              matrix:
         | 
| 10 | 
            +
                - nodejs_version: "7"
         | 
| 7 11 | 
             
                - nodejs_version: "6"
         | 
| 8 | 
            -
                - nodejs_version: "5"
         | 
| 9 12 | 
             
                - nodejs_version: "4"
         | 
| 10 13 |  | 
| 11 14 | 
             
            install:
         | 
| @@ -13,7 +16,6 @@ install: | |
| 13 16 | 
             
              - npm install
         | 
| 14 17 |  | 
| 15 18 | 
             
            test_script:
         | 
| 16 | 
            -
               | 
| 17 | 
            -
              - npm test
         | 
| 19 | 
            +
              - npm run build
         | 
| 18 20 |  | 
| 19 21 | 
             
            build: off
         | 
    
        package/lib/index.js
    CHANGED
    
    | @@ -136,7 +136,7 @@ function findActualExecutable(exe, args) { | |
| 136 136 |  | 
| 137 137 | 
             
              if (exe.match(/\.(bat|cmd)$/i)) {
         | 
| 138 138 | 
             
                let cmd = _path2.default.join(process.env.SYSTEMROOT, 'System32', 'cmd.exe');
         | 
| 139 | 
            -
                let cmdArgs = ['/C', exe | 
| 139 | 
            +
                let cmdArgs = ['/C', `${ exe } ${ args.join(' ') }`];
         | 
| 140 140 |  | 
| 141 141 | 
             
                return { cmd: cmd, args: cmdArgs };
         | 
| 142 142 | 
             
              }
         | 
| @@ -0,0 +1,88 @@ | |
| 1 | 
            +
            import 'rxjs/add/observable/of';
         | 
| 2 | 
            +
            import 'rxjs/add/observable/merge';
         | 
| 3 | 
            +
            import 'rxjs/add/operator/pluck';
         | 
| 4 | 
            +
            import 'rxjs/add/operator/reduce';
         | 
| 5 | 
            +
            import { Observable } from 'rxjs/Observable';
         | 
| 6 | 
            +
            /**
         | 
| 7 | 
            +
             * Finds the actual executable and parameters to run on Windows. This method
         | 
| 8 | 
            +
             * mimics the POSIX behavior of being able to run scripts as executables by
         | 
| 9 | 
            +
             * replacing the passed-in executable with the script runner, for PowerShell,
         | 
| 10 | 
            +
             * CMD, and node scripts.
         | 
| 11 | 
            +
             *
         | 
| 12 | 
            +
             * This method also does the work of running down PATH, which spawn on Windows
         | 
| 13 | 
            +
             * also doesn't do, unlike on POSIX.
         | 
| 14 | 
            +
             *
         | 
| 15 | 
            +
             * @param  {string} exe           The executable to run
         | 
| 16 | 
            +
             * @param  {Array<string>} args   The arguments to run
         | 
| 17 | 
            +
             *
         | 
| 18 | 
            +
             * @return {Object}               The cmd and args to run
         | 
| 19 | 
            +
             * @property {string} cmd         The command to pass to spawn
         | 
| 20 | 
            +
             * @property {Array<string>} args The arguments to pass to spawn
         | 
| 21 | 
            +
             */
         | 
| 22 | 
            +
            export declare function findActualExecutable(exe: string, args: Array<string>): {
         | 
| 23 | 
            +
                cmd: string;
         | 
| 24 | 
            +
                args: Array<string>;
         | 
| 25 | 
            +
            };
         | 
| 26 | 
            +
            /**
         | 
| 27 | 
            +
             * Spawns a process but detached from the current process. The process is put
         | 
| 28 | 
            +
             * into its own Process Group that can be killed by unsubscribing from the
         | 
| 29 | 
            +
             * return Observable.
         | 
| 30 | 
            +
             *
         | 
| 31 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 32 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 33 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 34 | 
            +
             *
         | 
| 35 | 
            +
             * @return {Observable<string>}       Returns an Observable that when subscribed
         | 
| 36 | 
            +
             *                                    to, will create a detached process. The
         | 
| 37 | 
            +
             *                                    process output will be streamed to this
         | 
| 38 | 
            +
             *                                    Observable, and if unsubscribed from, the
         | 
| 39 | 
            +
             *                                    process will be terminated early. If the
         | 
| 40 | 
            +
             *                                    process terminates with a non-zero value,
         | 
| 41 | 
            +
             *                                    the Observable will terminate with onError.
         | 
| 42 | 
            +
             */
         | 
| 43 | 
            +
            export declare function spawnDetached(exe: string, params: Array<string>, opts?: any): Observable<string>;
         | 
| 44 | 
            +
            /**
         | 
| 45 | 
            +
             * Spawns a process attached as a child of the current process.
         | 
| 46 | 
            +
             *
         | 
| 47 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 48 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 49 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 50 | 
            +
             *
         | 
| 51 | 
            +
             * @return {Observable<string>}       Returns an Observable that when subscribed
         | 
| 52 | 
            +
             *                                    to, will create a child process. The
         | 
| 53 | 
            +
             *                                    process output will be streamed to this
         | 
| 54 | 
            +
             *                                    Observable, and if unsubscribed from, the
         | 
| 55 | 
            +
             *                                    process will be terminated early. If the
         | 
| 56 | 
            +
             *                                    process terminates with a non-zero value,
         | 
| 57 | 
            +
             *                                    the Observable will terminate with onError.
         | 
| 58 | 
            +
             */
         | 
| 59 | 
            +
            export declare function spawn<T = string>(exe: string, params?: Array<string>, opts?: any): Observable<T>;
         | 
| 60 | 
            +
            /**
         | 
| 61 | 
            +
             * Spawns a process but detached from the current process. The process is put
         | 
| 62 | 
            +
             * into its own Process Group.
         | 
| 63 | 
            +
             *
         | 
| 64 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 65 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 66 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 67 | 
            +
             *
         | 
| 68 | 
            +
             * @return {Promise<string>}       Returns an Promise that represents a detached
         | 
| 69 | 
            +
             *                                 process. The value returned is the process
         | 
| 70 | 
            +
             *                                 output. If the process terminates with a
         | 
| 71 | 
            +
             *                                 non-zero value, the Promise will resolve with
         | 
| 72 | 
            +
             *                                 an Error.
         | 
| 73 | 
            +
             */
         | 
| 74 | 
            +
            export declare function spawnDetachedPromise(exe: string, params: Array<string>, opts?: any): Promise<string>;
         | 
| 75 | 
            +
            /**
         | 
| 76 | 
            +
             * Spawns a process as a child process.
         | 
| 77 | 
            +
             *
         | 
| 78 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 79 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 80 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 81 | 
            +
             *
         | 
| 82 | 
            +
             * @return {Promise<string>}       Returns an Promise that represents a child
         | 
| 83 | 
            +
             *                                 process. The value returned is the process
         | 
| 84 | 
            +
             *                                 output. If the process terminates with a
         | 
| 85 | 
            +
             *                                 non-zero value, the Promise will resolve with
         | 
| 86 | 
            +
             *                                 an Error.
         | 
| 87 | 
            +
             */
         | 
| 88 | 
            +
            export declare function spawnPromise(exe: string, params: Array<string>, opts?: any): Promise<string>;
         | 
    
        package/lib/src/index.js
    ADDED
    
    | @@ -0,0 +1,317 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
            var __rest = (this && this.__rest) || function (s, e) {
         | 
| 3 | 
            +
                var t = {};
         | 
| 4 | 
            +
                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
         | 
| 5 | 
            +
                    t[p] = s[p];
         | 
| 6 | 
            +
                if (s != null && typeof Object.getOwnPropertySymbols === "function")
         | 
| 7 | 
            +
                    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
         | 
| 8 | 
            +
                        t[p[i]] = s[p[i]];
         | 
| 9 | 
            +
                return t;
         | 
| 10 | 
            +
            };
         | 
| 11 | 
            +
            Object.defineProperty(exports, "__esModule", { value: true });
         | 
| 12 | 
            +
            var path = require("path");
         | 
| 13 | 
            +
            var net = require("net");
         | 
| 14 | 
            +
            var sfs = require("fs");
         | 
| 15 | 
            +
            var assign = require("lodash.assign");
         | 
| 16 | 
            +
            require("rxjs/add/observable/of");
         | 
| 17 | 
            +
            require("rxjs/add/observable/merge");
         | 
| 18 | 
            +
            require("rxjs/add/operator/pluck");
         | 
| 19 | 
            +
            require("rxjs/add/operator/reduce");
         | 
| 20 | 
            +
            var Observable_1 = require("rxjs/Observable");
         | 
| 21 | 
            +
            var Subscription_1 = require("rxjs/Subscription");
         | 
| 22 | 
            +
            var AsyncSubject_1 = require("rxjs/AsyncSubject");
         | 
| 23 | 
            +
            var spawnOg = require('child_process').spawn; //tslint:disable-line:no-var-requires
         | 
| 24 | 
            +
            var isWindows = process.platform === 'win32';
         | 
| 25 | 
            +
            var d = require('debug')('spawn-rx'); //tslint:disable-line:no-var-requires
         | 
| 26 | 
            +
            /**
         | 
| 27 | 
            +
             * stat a file but don't throw if it doesn't exist
         | 
| 28 | 
            +
             *
         | 
| 29 | 
            +
             * @param  {string} file The path to a file
         | 
| 30 | 
            +
             * @return {Stats}       The stats structure
         | 
| 31 | 
            +
             *
         | 
| 32 | 
            +
             * @private
         | 
| 33 | 
            +
             */
         | 
| 34 | 
            +
            function statSyncNoException(file) {
         | 
| 35 | 
            +
                try {
         | 
| 36 | 
            +
                    return sfs.statSync(file);
         | 
| 37 | 
            +
                }
         | 
| 38 | 
            +
                catch (e) {
         | 
| 39 | 
            +
                    return null;
         | 
| 40 | 
            +
                }
         | 
| 41 | 
            +
            }
         | 
| 42 | 
            +
            /**
         | 
| 43 | 
            +
             * Search PATH to see if a file exists in any of the path folders.
         | 
| 44 | 
            +
             *
         | 
| 45 | 
            +
             * @param  {string} exe The file to search for
         | 
| 46 | 
            +
             * @return {string}     A fully qualified path, or the original path if nothing
         | 
| 47 | 
            +
             *                      is found
         | 
| 48 | 
            +
             *
         | 
| 49 | 
            +
             * @private
         | 
| 50 | 
            +
             */
         | 
| 51 | 
            +
            function runDownPath(exe) {
         | 
| 52 | 
            +
                // NB: Windows won't search PATH looking for executables in spawn like
         | 
| 53 | 
            +
                // Posix does
         | 
| 54 | 
            +
                // Files with any directory path don't get this applied
         | 
| 55 | 
            +
                if (exe.match(/[\\\/]/)) {
         | 
| 56 | 
            +
                    d('Path has slash in directory, bailing');
         | 
| 57 | 
            +
                    return exe;
         | 
| 58 | 
            +
                }
         | 
| 59 | 
            +
                var target = path.join('.', exe);
         | 
| 60 | 
            +
                if (statSyncNoException(target)) {
         | 
| 61 | 
            +
                    d("Found executable in currect directory: " + target);
         | 
| 62 | 
            +
                    return target;
         | 
| 63 | 
            +
                }
         | 
| 64 | 
            +
                var haystack = process.env.PATH.split(isWindows ? ';' : ':');
         | 
| 65 | 
            +
                for (var _i = 0, haystack_1 = haystack; _i < haystack_1.length; _i++) {
         | 
| 66 | 
            +
                    var p = haystack_1[_i];
         | 
| 67 | 
            +
                    var needle = path.join(p, exe);
         | 
| 68 | 
            +
                    if (statSyncNoException(needle)) {
         | 
| 69 | 
            +
                        return needle;
         | 
| 70 | 
            +
                    }
         | 
| 71 | 
            +
                    ;
         | 
| 72 | 
            +
                }
         | 
| 73 | 
            +
                d('Failed to find executable anywhere in path');
         | 
| 74 | 
            +
                return exe;
         | 
| 75 | 
            +
            }
         | 
| 76 | 
            +
            /**
         | 
| 77 | 
            +
             * Finds the actual executable and parameters to run on Windows. This method
         | 
| 78 | 
            +
             * mimics the POSIX behavior of being able to run scripts as executables by
         | 
| 79 | 
            +
             * replacing the passed-in executable with the script runner, for PowerShell,
         | 
| 80 | 
            +
             * CMD, and node scripts.
         | 
| 81 | 
            +
             *
         | 
| 82 | 
            +
             * This method also does the work of running down PATH, which spawn on Windows
         | 
| 83 | 
            +
             * also doesn't do, unlike on POSIX.
         | 
| 84 | 
            +
             *
         | 
| 85 | 
            +
             * @param  {string} exe           The executable to run
         | 
| 86 | 
            +
             * @param  {Array<string>} args   The arguments to run
         | 
| 87 | 
            +
             *
         | 
| 88 | 
            +
             * @return {Object}               The cmd and args to run
         | 
| 89 | 
            +
             * @property {string} cmd         The command to pass to spawn
         | 
| 90 | 
            +
             * @property {Array<string>} args The arguments to pass to spawn
         | 
| 91 | 
            +
             */
         | 
| 92 | 
            +
            function findActualExecutable(exe, args) {
         | 
| 93 | 
            +
                // POSIX can just execute scripts directly, no need for silly goosery
         | 
| 94 | 
            +
                if (process.platform !== 'win32') {
         | 
| 95 | 
            +
                    return { cmd: runDownPath(exe), args: args };
         | 
| 96 | 
            +
                }
         | 
| 97 | 
            +
                if (!sfs.existsSync(exe)) {
         | 
| 98 | 
            +
                    // NB: When you write something like `surf-client ... -- surf-build` on Windows,
         | 
| 99 | 
            +
                    // a shell would normally convert that to surf-build.cmd, but since it's passed
         | 
| 100 | 
            +
                    // in as an argument, it doesn't happen
         | 
| 101 | 
            +
                    var possibleExts = ['.exe', '.bat', '.cmd', '.ps1'];
         | 
| 102 | 
            +
                    for (var _i = 0, possibleExts_1 = possibleExts; _i < possibleExts_1.length; _i++) {
         | 
| 103 | 
            +
                        var ext = possibleExts_1[_i];
         | 
| 104 | 
            +
                        var possibleFullPath = runDownPath("" + exe + ext);
         | 
| 105 | 
            +
                        if (sfs.existsSync(possibleFullPath)) {
         | 
| 106 | 
            +
                            return findActualExecutable(possibleFullPath, args);
         | 
| 107 | 
            +
                        }
         | 
| 108 | 
            +
                    }
         | 
| 109 | 
            +
                }
         | 
| 110 | 
            +
                if (exe.match(/\.ps1$/i)) {
         | 
| 111 | 
            +
                    var cmd = path.join(process.env.SYSTEMROOT, 'System32', 'WindowsPowerShell', 'v1.0', 'PowerShell.exe');
         | 
| 112 | 
            +
                    var psargs = ['-ExecutionPolicy', 'Unrestricted', '-NoLogo', '-NonInteractive', '-File', exe];
         | 
| 113 | 
            +
                    return { cmd: cmd, args: psargs.concat(args) };
         | 
| 114 | 
            +
                }
         | 
| 115 | 
            +
                if (exe.match(/\.(bat|cmd)$/i)) {
         | 
| 116 | 
            +
                    var cmd = path.join(process.env.SYSTEMROOT, 'System32', 'cmd.exe');
         | 
| 117 | 
            +
                    var cmdArgs = ['/C', exe].concat(args);
         | 
| 118 | 
            +
                    return { cmd: cmd, args: cmdArgs };
         | 
| 119 | 
            +
                }
         | 
| 120 | 
            +
                if (exe.match(/\.(js)$/i)) {
         | 
| 121 | 
            +
                    var cmd = process.execPath;
         | 
| 122 | 
            +
                    var nodeArgs = [exe];
         | 
| 123 | 
            +
                    return { cmd: cmd, args: nodeArgs.concat(args) };
         | 
| 124 | 
            +
                }
         | 
| 125 | 
            +
                // Dunno lol
         | 
| 126 | 
            +
                return { cmd: exe, args: args };
         | 
| 127 | 
            +
            }
         | 
| 128 | 
            +
            exports.findActualExecutable = findActualExecutable;
         | 
| 129 | 
            +
            /**
         | 
| 130 | 
            +
             * Spawns a process but detached from the current process. The process is put
         | 
| 131 | 
            +
             * into its own Process Group that can be killed by unsubscribing from the
         | 
| 132 | 
            +
             * return Observable.
         | 
| 133 | 
            +
             *
         | 
| 134 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 135 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 136 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 137 | 
            +
             *
         | 
| 138 | 
            +
             * @return {Observable<string>}       Returns an Observable that when subscribed
         | 
| 139 | 
            +
             *                                    to, will create a detached process. The
         | 
| 140 | 
            +
             *                                    process output will be streamed to this
         | 
| 141 | 
            +
             *                                    Observable, and if unsubscribed from, the
         | 
| 142 | 
            +
             *                                    process will be terminated early. If the
         | 
| 143 | 
            +
             *                                    process terminates with a non-zero value,
         | 
| 144 | 
            +
             *                                    the Observable will terminate with onError.
         | 
| 145 | 
            +
             */
         | 
| 146 | 
            +
            function spawnDetached(exe, params, opts) {
         | 
| 147 | 
            +
                if (opts === void 0) { opts = null; }
         | 
| 148 | 
            +
                var _a = findActualExecutable(exe, params), cmd = _a.cmd, args = _a.args;
         | 
| 149 | 
            +
                if (!isWindows) {
         | 
| 150 | 
            +
                    return spawn(cmd, args, assign({}, opts || {}, { detached: true }));
         | 
| 151 | 
            +
                }
         | 
| 152 | 
            +
                ;
         | 
| 153 | 
            +
                var newParams = [cmd].concat(args);
         | 
| 154 | 
            +
                var target = path.join(__dirname, '..', '..', 'vendor', 'jobber', 'Jobber.exe');
         | 
| 155 | 
            +
                var options = assign({}, opts || {}, { detached: true, jobber: true });
         | 
| 156 | 
            +
                d("spawnDetached: " + target + ", " + newParams);
         | 
| 157 | 
            +
                return spawn(target, newParams, options);
         | 
| 158 | 
            +
            }
         | 
| 159 | 
            +
            exports.spawnDetached = spawnDetached;
         | 
| 160 | 
            +
            /**
         | 
| 161 | 
            +
             * Spawns a process attached as a child of the current process.
         | 
| 162 | 
            +
             *
         | 
| 163 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 164 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 165 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 166 | 
            +
             *
         | 
| 167 | 
            +
             * @return {Observable<string>}       Returns an Observable that when subscribed
         | 
| 168 | 
            +
             *                                    to, will create a child process. The
         | 
| 169 | 
            +
             *                                    process output will be streamed to this
         | 
| 170 | 
            +
             *                                    Observable, and if unsubscribed from, the
         | 
| 171 | 
            +
             *                                    process will be terminated early. If the
         | 
| 172 | 
            +
             *                                    process terminates with a non-zero value,
         | 
| 173 | 
            +
             *                                    the Observable will terminate with onError.
         | 
| 174 | 
            +
             */
         | 
| 175 | 
            +
            function spawn(exe, params, opts) {
         | 
| 176 | 
            +
                if (params === void 0) { params = []; }
         | 
| 177 | 
            +
                if (opts === void 0) { opts = null; }
         | 
| 178 | 
            +
                opts = opts || {};
         | 
| 179 | 
            +
                var spawnObs = Observable_1.Observable.create(function (subj) {
         | 
| 180 | 
            +
                    var stdin = opts.stdin, optsWithoutStdIn = __rest(opts, ["stdin"]);
         | 
| 181 | 
            +
                    var _a = findActualExecutable(exe, params), cmd = _a.cmd, args = _a.args;
         | 
| 182 | 
            +
                    d("spawning process: " + cmd + " " + args.join() + ", " + JSON.stringify(optsWithoutStdIn));
         | 
| 183 | 
            +
                    var origOpts = assign({}, optsWithoutStdIn);
         | 
| 184 | 
            +
                    if ('jobber' in origOpts) {
         | 
| 185 | 
            +
                        delete origOpts.jobber;
         | 
| 186 | 
            +
                    }
         | 
| 187 | 
            +
                    if ('split' in origOpts) {
         | 
| 188 | 
            +
                        delete origOpts.split;
         | 
| 189 | 
            +
                    }
         | 
| 190 | 
            +
                    ;
         | 
| 191 | 
            +
                    var proc = spawnOg(cmd, args, origOpts);
         | 
| 192 | 
            +
                    var bufHandler = function (source) { return function (b) {
         | 
| 193 | 
            +
                        if (b.length < 1) {
         | 
| 194 | 
            +
                            return;
         | 
| 195 | 
            +
                        }
         | 
| 196 | 
            +
                        ;
         | 
| 197 | 
            +
                        var chunk = '<< String sent back was too long >>';
         | 
| 198 | 
            +
                        try {
         | 
| 199 | 
            +
                            if (typeof b === 'string') {
         | 
| 200 | 
            +
                                chunk = b.toString();
         | 
| 201 | 
            +
                            }
         | 
| 202 | 
            +
                            else {
         | 
| 203 | 
            +
                                chunk = b.toString(origOpts.encoding || 'utf8');
         | 
| 204 | 
            +
                            }
         | 
| 205 | 
            +
                        }
         | 
| 206 | 
            +
                        catch (e) {
         | 
| 207 | 
            +
                            chunk = "<< Lost chunk of process output for " + exe + " - length was " + b.length + ">>";
         | 
| 208 | 
            +
                        }
         | 
| 209 | 
            +
                        subj.next({ source: source, text: chunk });
         | 
| 210 | 
            +
                    }; };
         | 
| 211 | 
            +
                    var ret = new Subscription_1.Subscription();
         | 
| 212 | 
            +
                    if (opts.stdin) {
         | 
| 213 | 
            +
                        if (proc.stdin) {
         | 
| 214 | 
            +
                            ret.add(opts.stdin.subscribe(function (x) { return proc.stdin.write(x); }, subj.error.bind(subj), function () { return proc.stdin.end(); }));
         | 
| 215 | 
            +
                        }
         | 
| 216 | 
            +
                        else {
         | 
| 217 | 
            +
                            subj.error(new Error("opts.stdio conflicts with provided spawn opts.stdin observable, 'pipe' is required"));
         | 
| 218 | 
            +
                        }
         | 
| 219 | 
            +
                    }
         | 
| 220 | 
            +
                    var stderrCompleted = null;
         | 
| 221 | 
            +
                    var stdoutCompleted = null;
         | 
| 222 | 
            +
                    var noClose = false;
         | 
| 223 | 
            +
                    if (proc.stdout) {
         | 
| 224 | 
            +
                        stdoutCompleted = new AsyncSubject_1.AsyncSubject();
         | 
| 225 | 
            +
                        proc.stdout.on('data', bufHandler('stdout'));
         | 
| 226 | 
            +
                        proc.stdout.on('close', function () { stdoutCompleted.next(true); stdoutCompleted.complete(); });
         | 
| 227 | 
            +
                    }
         | 
| 228 | 
            +
                    else {
         | 
| 229 | 
            +
                        stdoutCompleted = Observable_1.Observable.of(true);
         | 
| 230 | 
            +
                    }
         | 
| 231 | 
            +
                    if (proc.stderr) {
         | 
| 232 | 
            +
                        stderrCompleted = new AsyncSubject_1.AsyncSubject();
         | 
| 233 | 
            +
                        proc.stderr.on('data', bufHandler('stderr'));
         | 
| 234 | 
            +
                        proc.stderr.on('close', function () { stderrCompleted.next(true); stderrCompleted.complete(); });
         | 
| 235 | 
            +
                    }
         | 
| 236 | 
            +
                    else {
         | 
| 237 | 
            +
                        stderrCompleted = Observable_1.Observable.of(true);
         | 
| 238 | 
            +
                    }
         | 
| 239 | 
            +
                    proc.on('error', function (e) {
         | 
| 240 | 
            +
                        noClose = true;
         | 
| 241 | 
            +
                        subj.error(e);
         | 
| 242 | 
            +
                    });
         | 
| 243 | 
            +
                    proc.on('close', function (code) {
         | 
| 244 | 
            +
                        noClose = true;
         | 
| 245 | 
            +
                        var pipesClosed = Observable_1.Observable.merge(stdoutCompleted, stderrCompleted)
         | 
| 246 | 
            +
                            .reduce(function (acc) { return acc; }, true);
         | 
| 247 | 
            +
                        if (code === 0) {
         | 
| 248 | 
            +
                            pipesClosed.subscribe(function () { return subj.complete(); });
         | 
| 249 | 
            +
                        }
         | 
| 250 | 
            +
                        else {
         | 
| 251 | 
            +
                            pipesClosed.subscribe(function () { return subj.error(new Error("Failed with exit code: " + code)); });
         | 
| 252 | 
            +
                        }
         | 
| 253 | 
            +
                    });
         | 
| 254 | 
            +
                    ret.add(new Subscription_1.Subscription(function () {
         | 
| 255 | 
            +
                        if (noClose) {
         | 
| 256 | 
            +
                            return;
         | 
| 257 | 
            +
                        }
         | 
| 258 | 
            +
                        ;
         | 
| 259 | 
            +
                        d("Killing process: " + cmd + " " + args.join());
         | 
| 260 | 
            +
                        if (opts.jobber) {
         | 
| 261 | 
            +
                            // NB: Connecting to Jobber's named pipe will kill it
         | 
| 262 | 
            +
                            net.connect("\\\\.\\pipe\\jobber-" + proc.pid);
         | 
| 263 | 
            +
                            setTimeout(function () { return proc.kill(); }, 5 * 1000);
         | 
| 264 | 
            +
                        }
         | 
| 265 | 
            +
                        else {
         | 
| 266 | 
            +
                            proc.kill();
         | 
| 267 | 
            +
                        }
         | 
| 268 | 
            +
                    }));
         | 
| 269 | 
            +
                    return ret;
         | 
| 270 | 
            +
                });
         | 
| 271 | 
            +
                return opts.split ? spawnObs : spawnObs.pluck('text');
         | 
| 272 | 
            +
            }
         | 
| 273 | 
            +
            exports.spawn = spawn;
         | 
| 274 | 
            +
            function wrapObservableInPromise(obs) {
         | 
| 275 | 
            +
                return new Promise(function (res, rej) {
         | 
| 276 | 
            +
                    var out = '';
         | 
| 277 | 
            +
                    obs.subscribe(function (x) { return out += x; }, function (e) { return rej(new Error(out + "\n" + e.message)); }, function () { return res(out); });
         | 
| 278 | 
            +
                });
         | 
| 279 | 
            +
            }
         | 
| 280 | 
            +
            /**
         | 
| 281 | 
            +
             * Spawns a process but detached from the current process. The process is put
         | 
| 282 | 
            +
             * into its own Process Group.
         | 
| 283 | 
            +
             *
         | 
| 284 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 285 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 286 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 287 | 
            +
             *
         | 
| 288 | 
            +
             * @return {Promise<string>}       Returns an Promise that represents a detached
         | 
| 289 | 
            +
             *                                 process. The value returned is the process
         | 
| 290 | 
            +
             *                                 output. If the process terminates with a
         | 
| 291 | 
            +
             *                                 non-zero value, the Promise will resolve with
         | 
| 292 | 
            +
             *                                 an Error.
         | 
| 293 | 
            +
             */
         | 
| 294 | 
            +
            function spawnDetachedPromise(exe, params, opts) {
         | 
| 295 | 
            +
                if (opts === void 0) { opts = null; }
         | 
| 296 | 
            +
                return wrapObservableInPromise(spawnDetached(exe, params, opts));
         | 
| 297 | 
            +
            }
         | 
| 298 | 
            +
            exports.spawnDetachedPromise = spawnDetachedPromise;
         | 
| 299 | 
            +
            /**
         | 
| 300 | 
            +
             * Spawns a process as a child process.
         | 
| 301 | 
            +
             *
         | 
| 302 | 
            +
             * @param  {string} exe               The executable to run
         | 
| 303 | 
            +
             * @param  {Array<string>} params     The parameters to pass to the child
         | 
| 304 | 
            +
             * @param  {Object} opts              Options to pass to spawn.
         | 
| 305 | 
            +
             *
         | 
| 306 | 
            +
             * @return {Promise<string>}       Returns an Promise that represents a child
         | 
| 307 | 
            +
             *                                 process. The value returned is the process
         | 
| 308 | 
            +
             *                                 output. If the process terminates with a
         | 
| 309 | 
            +
             *                                 non-zero value, the Promise will resolve with
         | 
| 310 | 
            +
             *                                 an Error.
         | 
| 311 | 
            +
             */
         | 
| 312 | 
            +
            function spawnPromise(exe, params, opts) {
         | 
| 313 | 
            +
                if (opts === void 0) { opts = null; }
         | 
| 314 | 
            +
                return wrapObservableInPromise(spawn(exe, params, opts));
         | 
| 315 | 
            +
            }
         | 
| 316 | 
            +
            exports.spawnPromise = spawnPromise;
         | 
| 317 | 
            +
            //# sourceMappingURL=index.js.map
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,2BAA6B;AAC7B,yBAA2B;AAC3B,wBAA0B;AAC1B,sCAAwC;AAExC,kCAAgC;AAChC,qCAAmC;AACnC,mCAAiC;AACjC,oCAAkC;AAClC,8CAA6C;AAE7C,kDAAiD;AACjD,kDAAiD;AAIjD,IAAM,OAAO,GAA8B,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,qCAAqC;AAChH,IAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C,IAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qCAAqC;AAE7E;;;;;;;GAOG;AACH,6BAA6B,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACX,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,qBAAqB,GAAW;IAC9B,sEAAsE;IACtE,aAAa;IAEb,uDAAuD;IACvD,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,sCAAsC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC;IACb,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,EAAE,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,4CAA0C,MAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9D,GAAG,CAAC,CAAU,UAAQ,EAAR,qBAAQ,EAAR,sBAAQ,EAAR,IAAQ;QAAjB,IAAI,CAAC,iBAAA;QACR,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/B,EAAE,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC;QAChB,CAAC;QAAA,CAAC;KACH;IAED,CAAC,CAAC,4CAA4C,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAqC,GAAW,EAAE,IAAmB;IAInE,qEAAqE;IACrE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,gFAAgF;QAChF,+EAA+E;QAC/E,uCAAuC;QACvC,IAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,CAAY,UAAY,EAAZ,6BAAY,EAAZ,0BAAY,EAAZ,IAAY;YAAvB,IAAI,GAAG,qBAAA;YACV,IAAI,gBAAgB,GAAG,WAAW,CAAC,KAAG,GAAG,GAAG,GAAK,CAAC,CAAC;YAEnD,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACtD,CAAC;SACF;IACH,CAAC;IAED,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACxG,IAAI,MAAM,GAAG,CAAC,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAE9F,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACpE,IAAI,OAAO,IAAI,IAAI,EAAE,GAAG,SAAK,IAAI,CAAC,CAAC;QAEnC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QAErB,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,YAAY;IACZ,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AA9CD,oDA8CC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,uBAA8B,GAAW,EAAE,MAAqB,EAAE,IAAgB;IAAhB,qBAAA,EAAA,WAAgB;IAC1E,IAAA,sCAAiD,EAA/C,YAAG,EAAE,cAAI,CAAuC;IAExD,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAAA,CAAC;IAEF,IAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAChF,IAAI,OAAO,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvE,CAAC,CAAC,oBAAkB,MAAM,UAAK,SAAW,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAdD,sCAcC;AAED;;;;;;;;;;;;;;GAcG;AAEH,eAAkC,GAAW,EAAE,MAA0B,EAAE,IAAgB;IAA5C,uBAAA,EAAA,WAA0B;IAAE,qBAAA,EAAA,WAAgB;IACzF,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAClB,IAAI,QAAQ,GAAG,uBAAU,CAAC,MAAM,CAAC,UAAC,IAG9B;QACI,IAAA,kBAAK,EAAE,0CAAmB,CAAU;QACtC,IAAA,sCAAiD,EAA/C,YAAG,EAAE,cAAI,CAAuC;QACtD,CAAC,CAAC,uBAAqB,GAAG,SAAI,IAAI,CAAC,IAAI,EAAE,UAAK,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAG,CAAC,CAAC;QAClF,IAAI,QAAQ,GAAG,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC5C,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC;YACzB,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,EAAE,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QAAA,CAAC;QAEF,IAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE1C,IAAI,UAAU,GAAG,UAAC,MAAc,IAAK,OAAA,UAAC,CAAkB;YACtD,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC;YACT,CAAC;YAAA,CAAC;YACF,IAAI,KAAK,GAAG,qCAAqC,CAAC;YAClD,IAAI,CAAC;gBACH,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;oBAC1B,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACvB,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACN,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACX,KAAK,GAAG,yCAAuC,GAAG,sBAAiB,CAAC,CAAC,MAAM,OAAI,CAAC;YAClF,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC,EAhBoC,CAgBpC,CAAC;QAEF,IAAI,GAAG,GAAG,IAAI,2BAAY,EAAE,CAAC;QAE7B,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACf,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACf,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAC1B,UAAC,CAAM,IAAK,OAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAnB,CAAmB,EAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EACrB,cAAM,OAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAhB,CAAgB,CACvB,CAAC,CAAC;YACL,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;QAED,IAAI,eAAe,GAAkD,IAAI,CAAC;QAC1E,IAAI,eAAe,GAAkD,IAAI,CAAC;QAC1E,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAChB,eAAe,GAAG,IAAI,2BAAY,EAAW,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAS,eAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,eAAqC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3I,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,eAAe,GAAG,uBAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAChB,eAAe,GAAG,IAAI,2BAAY,EAAW,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAS,eAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,eAAqC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3I,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,eAAe,GAAG,uBAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,CAAQ;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,IAAY;YAC5B,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,WAAW,GAAG,uBAAU,CAAC,KAAK,CAAC,eAAgB,EAAE,eAAgB,CAAC;iBACnE,MAAM,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,EAAH,CAAG,EAAE,IAAI,CAAC,CAAC;YAE9B,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;gBACf,WAAW,CAAC,SAAS,CAAC,cAAM,OAAA,IAAI,CAAC,QAAQ,EAAE,EAAf,CAAe,CAAC,CAAC;YAC/C,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,WAAW,CAAC,SAAS,CAAC,cAAM,OAAA,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,4BAA0B,IAAM,CAAC,CAAC,EAAvD,CAAuD,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,IAAI,2BAAY,CAAC;YACvB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACZ,MAAM,CAAC;YACT,CAAC;YAAA,CAAC;YAEF,CAAC,CAAC,sBAAoB,GAAG,SAAI,IAAI,CAAC,IAAI,EAAI,CAAC,CAAC;YAC5C,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChB,qDAAqD;gBACrD,GAAG,CAAC,OAAO,CAAC,yBAAuB,IAAI,CAAC,GAAK,CAAC,CAAC;gBAC/C,UAAU,CAAC,cAAM,OAAA,IAAI,CAAC,IAAI,EAAE,EAAX,CAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1C,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AA3GD,sBA2GC;AAED,iCAAoC,GAAkB;IACpD,MAAM,CAAC,IAAI,OAAO,CAAS,UAAC,GAAG,EAAE,GAAG;QAClC,IAAI,GAAG,GAAG,EAAE,CAAC;QAEb,GAAG,CAAC,SAAS,CACX,UAAC,CAAC,IAAK,OAAA,GAAG,IAAI,CAAC,EAAR,CAAQ,EACf,UAAC,CAAC,IAAK,OAAA,GAAG,CAAC,IAAI,KAAK,CAAI,GAAG,UAAK,CAAC,CAAC,OAAS,CAAC,CAAC,EAAtC,CAAsC,EAC7C,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,EAAR,CAAQ,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,8BAAqC,GAAW,EAAE,MAAqB,EAAE,IAAgB;IAAhB,qBAAA,EAAA,WAAgB;IACvF,MAAM,CAAC,uBAAuB,CAAS,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3E,CAAC;AAFD,oDAEC;AAED;;;;;;;;;;;;GAYG;AACH,sBAA6B,GAAW,EAAE,MAAqB,EAAE,IAAgB;IAAhB,qBAAA,EAAA,WAAgB;IAC/E,MAAM,CAAC,uBAAuB,CAAS,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC;AAFD,oCAEC"}
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,12 +1,14 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "spawn-rx",
         | 
| 3 | 
            -
              "version": "2.0. | 
| 3 | 
            +
              "version": "2.0.12",
         | 
| 4 4 | 
             
              "description": "An Rx-version of child_process.spawn",
         | 
| 5 5 | 
             
              "scripts": {
         | 
| 6 | 
            -
                "doc": "esdoc -c ./esdoc.json",
         | 
| 7 | 
            -
                "compile": " | 
| 6 | 
            +
                "doc": "echo \"esdoc may not work correctly\" && esdoc -c ./esdoc.json",
         | 
| 7 | 
            +
                "compile": "tsc",
         | 
| 8 8 | 
             
                "prepublish": "npm run compile",
         | 
| 9 | 
            -
                " | 
| 9 | 
            +
                "lint": "tslint \"src/**/*.ts\" \"test/**/*.ts\"",
         | 
| 10 | 
            +
                "test": "mocha --compilers ts:ts-node/register ./test/*",
         | 
| 11 | 
            +
                "build": "npm-run-all compile lint test"
         | 
| 10 12 | 
             
              },
         | 
| 11 13 | 
             
              "repository": {
         | 
| 12 14 | 
             
                "type": "git",
         | 
| @@ -21,24 +23,31 @@ | |
| 21 23 | 
             
              "bugs": {
         | 
| 22 24 | 
             
                "url": "https://github.com/paulcbetts/spawn-rx/issues"
         | 
| 23 25 | 
             
              },
         | 
| 24 | 
            -
              "main": "lib/index.js",
         | 
| 26 | 
            +
              "main": "lib/src/index.js",
         | 
| 27 | 
            +
              "typings": "lib/src/index.d.ts",
         | 
| 25 28 | 
             
              "homepage": "https://github.com/paulcbetts/spawn-rx",
         | 
| 26 29 | 
             
              "dependencies": {
         | 
| 27 30 | 
             
                "debug": "^2.5.1",
         | 
| 28 | 
            -
                " | 
| 31 | 
            +
                "lodash.assign": "^4.2.0",
         | 
| 32 | 
            +
                "rxjs": "^5.1.1"
         | 
| 29 33 | 
             
              },
         | 
| 30 34 | 
             
              "devDependencies": {
         | 
| 31 | 
            -
                " | 
| 32 | 
            -
                " | 
| 33 | 
            -
                " | 
| 34 | 
            -
                " | 
| 35 | 
            -
                "babel-register": "^6. | 
| 36 | 
            -
                "chai": "^ | 
| 37 | 
            -
                "chai-as-promised": "^ | 
| 38 | 
            -
                "esdoc": "^0. | 
| 35 | 
            +
                "@types/chai": "^4.0.4",
         | 
| 36 | 
            +
                "@types/chai-as-promised": "^7.1.0",
         | 
| 37 | 
            +
                "@types/mocha": "^2.2.39",
         | 
| 38 | 
            +
                "@types/node": "^8.0.32",
         | 
| 39 | 
            +
                "babel-register": "^6.23.0",
         | 
| 40 | 
            +
                "chai": "^4.1.2",
         | 
| 41 | 
            +
                "chai-as-promised": "^7.1.1",
         | 
| 42 | 
            +
                "esdoc": "^0.5.2",
         | 
| 39 43 | 
             
                "esdoc-es7-plugin": "0.0.3",
         | 
| 40 44 | 
             
                "esdoc-plugin-async-to-sync": "^0.5.0",
         | 
| 41 | 
            -
                " | 
| 42 | 
            -
                "mocha": "^ | 
| 45 | 
            +
                "marked": "^0.3.6",
         | 
| 46 | 
            +
                "mocha": "^4.0.0",
         | 
| 47 | 
            +
                "npm-run-all": "^4.0.2",
         | 
| 48 | 
            +
                "ts-node": "^3.3.0",
         | 
| 49 | 
            +
                "tslint": "^5.7.0",
         | 
| 50 | 
            +
                "typescript": "^2.5.3",
         | 
| 51 | 
            +
                "uuid": "3.0.1"
         | 
| 43 52 | 
             
              }
         | 
| 44 53 | 
             
            }
         | 
    
        package/src/ambient.d.ts
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            declare module 'lodash.assign';
         | 
| @@ -1,19 +1,23 @@ | |
| 1 | 
            -
            import path from 'path';
         | 
| 2 | 
            -
            import net from 'net';
         | 
| 3 | 
            -
            import sfs from 'fs';
         | 
| 1 | 
            +
            import * as path from 'path';
         | 
| 2 | 
            +
            import * as net from 'net';
         | 
| 3 | 
            +
            import * as sfs from 'fs';
         | 
| 4 | 
            +
            import * as assign from 'lodash.assign';
         | 
| 4 5 |  | 
| 5 6 | 
             
            import 'rxjs/add/observable/of';
         | 
| 6 7 | 
             
            import 'rxjs/add/observable/merge';
         | 
| 7 8 | 
             
            import 'rxjs/add/operator/pluck';
         | 
| 8 9 | 
             
            import 'rxjs/add/operator/reduce';
         | 
| 9 10 | 
             
            import { Observable } from 'rxjs/Observable';
         | 
| 11 | 
            +
            import { Observer } from 'rxjs/Observer';
         | 
| 10 12 | 
             
            import { Subscription } from 'rxjs/Subscription';
         | 
| 11 13 | 
             
            import { AsyncSubject } from 'rxjs/AsyncSubject';
         | 
| 14 | 
            +
            import { Subject } from 'rxjs/Subject';
         | 
| 15 | 
            +
            import * as childProcess from 'child_process';
         | 
| 12 16 |  | 
| 13 | 
            -
            const spawnOg = require('child_process').spawn;
         | 
| 17 | 
            +
            const spawnOg: typeof childProcess.spawn = require('child_process').spawn; //tslint:disable-line:no-var-requires
         | 
| 14 18 | 
             
            const isWindows = process.platform === 'win32';
         | 
| 15 19 |  | 
| 16 | 
            -
            const d = require('debug')('spawn-rx');
         | 
| 20 | 
            +
            const d = require('debug')('spawn-rx'); //tslint:disable-line:no-var-requires
         | 
| 17 21 |  | 
| 18 22 | 
             
            /**
         | 
| 19 23 | 
             
             * stat a file but don't throw if it doesn't exist
         | 
| @@ -23,7 +27,7 @@ const d = require('debug')('spawn-rx'); | |
| 23 27 | 
             
             *
         | 
| 24 28 | 
             
             * @private
         | 
| 25 29 | 
             
             */
         | 
| 26 | 
            -
            function statSyncNoException(file) {
         | 
| 30 | 
            +
            function statSyncNoException(file: string): sfs.Stats | null {
         | 
| 27 31 | 
             
              try {
         | 
| 28 32 | 
             
                return sfs.statSync(file);
         | 
| 29 33 | 
             
              } catch (e) {
         | 
| @@ -40,7 +44,7 @@ function statSyncNoException(file) { | |
| 40 44 | 
             
             *
         | 
| 41 45 | 
             
             * @private
         | 
| 42 46 | 
             
             */
         | 
| 43 | 
            -
            function runDownPath(exe) {
         | 
| 47 | 
            +
            function runDownPath(exe: string): string {
         | 
| 44 48 | 
             
              // NB: Windows won't search PATH looking for executables in spawn like
         | 
| 45 49 | 
             
              // Posix does
         | 
| 46 50 |  | 
| @@ -56,10 +60,12 @@ function runDownPath(exe) { | |
| 56 60 | 
             
                return target;
         | 
| 57 61 | 
             
              }
         | 
| 58 62 |  | 
| 59 | 
            -
              let haystack = process.env.PATH | 
| 63 | 
            +
              let haystack = process.env.PATH!.split(isWindows ? ';' : ':');
         | 
| 60 64 | 
             
              for (let p of haystack) {
         | 
| 61 65 | 
             
                let needle = path.join(p, exe);
         | 
| 62 | 
            -
                if (statSyncNoException(needle))  | 
| 66 | 
            +
                if (statSyncNoException(needle)) {
         | 
| 67 | 
            +
                  return needle;
         | 
| 68 | 
            +
                };
         | 
| 63 69 | 
             
              }
         | 
| 64 70 |  | 
| 65 71 | 
             
              d('Failed to find executable anywhere in path');
         | 
| @@ -82,9 +88,14 @@ function runDownPath(exe) { | |
| 82 88 | 
             
             * @property {string} cmd         The command to pass to spawn
         | 
| 83 89 | 
             
             * @property {Array<string>} args The arguments to pass to spawn
         | 
| 84 90 | 
             
             */
         | 
| 85 | 
            -
            export function findActualExecutable(exe, args) {
         | 
| 91 | 
            +
            export function findActualExecutable(exe: string, args: Array<string>): {
         | 
| 92 | 
            +
              cmd: string;
         | 
| 93 | 
            +
              args: Array<string>
         | 
| 94 | 
            +
            } {
         | 
| 86 95 | 
             
              // POSIX can just execute scripts directly, no need for silly goosery
         | 
| 87 | 
            -
              if (process.platform !== 'win32')  | 
| 96 | 
            +
              if (process.platform !== 'win32') {
         | 
| 97 | 
            +
                return { cmd: runDownPath(exe), args: args };
         | 
| 98 | 
            +
              }
         | 
| 88 99 |  | 
| 89 100 | 
             
              if (!sfs.existsSync(exe)) {
         | 
| 90 101 | 
             
                // NB: When you write something like `surf-client ... -- surf-build` on Windows,
         | 
| @@ -101,14 +112,14 @@ export function findActualExecutable(exe, args) { | |
| 101 112 | 
             
              }
         | 
| 102 113 |  | 
| 103 114 | 
             
              if (exe.match(/\.ps1$/i)) {
         | 
| 104 | 
            -
                let cmd = path.join(process.env.SYSTEMROOT | 
| 115 | 
            +
                let cmd = path.join(process.env.SYSTEMROOT!, 'System32', 'WindowsPowerShell', 'v1.0', 'PowerShell.exe');
         | 
| 105 116 | 
             
                let psargs = ['-ExecutionPolicy', 'Unrestricted', '-NoLogo', '-NonInteractive', '-File', exe];
         | 
| 106 117 |  | 
| 107 118 | 
             
                return { cmd: cmd, args: psargs.concat(args) };
         | 
| 108 119 | 
             
              }
         | 
| 109 120 |  | 
| 110 121 | 
             
              if (exe.match(/\.(bat|cmd)$/i)) {
         | 
| 111 | 
            -
                let cmd = path.join(process.env.SYSTEMROOT | 
| 122 | 
            +
                let cmd = path.join(process.env.SYSTEMROOT!, 'System32', 'cmd.exe');
         | 
| 112 123 | 
             
                let cmdArgs = ['/C', exe, ...args];
         | 
| 113 124 |  | 
| 114 125 | 
             
                return { cmd: cmd, args: cmdArgs };
         | 
| @@ -142,20 +153,22 @@ export function findActualExecutable(exe, args) { | |
| 142 153 | 
             
             *                                    process terminates with a non-zero value,
         | 
| 143 154 | 
             
             *                                    the Observable will terminate with onError.
         | 
| 144 155 | 
             
             */
         | 
| 145 | 
            -
            export function spawnDetached(exe, params | 
| 146 | 
            -
               | 
| 156 | 
            +
            export function spawnDetached(exe: string, params: Array<string>, opts: any = null): Observable<string> {
         | 
| 157 | 
            +
              const { cmd, args } = findActualExecutable(exe, params);
         | 
| 158 | 
            +
             | 
| 159 | 
            +
              if (!isWindows) {
         | 
| 160 | 
            +
                return spawn(cmd, args, assign({}, opts || {}, { detached: true }));
         | 
| 161 | 
            +
              };
         | 
| 147 162 |  | 
| 148 | 
            -
              if (!isWindows) return spawn(cmd, args, Object.assign({}, opts || {}, {detached: true }));
         | 
| 149 163 | 
             
              const newParams = [cmd].concat(args);
         | 
| 150 164 |  | 
| 151 | 
            -
              let target = path.join(__dirname, '..', 'vendor', 'jobber', ' | 
| 152 | 
            -
              let options =  | 
| 165 | 
            +
              let target = path.join(__dirname, '..', '..', 'vendor', 'jobber', 'Jobber.exe');
         | 
| 166 | 
            +
              let options = assign({}, opts || {}, { detached: true, jobber: true });
         | 
| 153 167 |  | 
| 154 168 | 
             
              d(`spawnDetached: ${target}, ${newParams}`);
         | 
| 155 169 | 
             
              return spawn(target, newParams, options);
         | 
| 156 170 | 
             
            }
         | 
| 157 171 |  | 
| 158 | 
            -
             | 
| 159 172 | 
             
            /**
         | 
| 160 173 | 
             
             * Spawns a process attached as a child of the current process.
         | 
| 161 174 | 
             
             *
         | 
| @@ -171,30 +184,42 @@ export function spawnDetached(exe, params, opts=null) { | |
| 171 184 | 
             
             *                                    process terminates with a non-zero value,
         | 
| 172 185 | 
             
             *                                    the Observable will terminate with onError.
         | 
| 173 186 | 
             
             */
         | 
| 174 | 
            -
            export function spawn(exe, params=[], opts=null) {
         | 
| 175 | 
            -
              opts = opts || {};
         | 
| 176 | 
            -
              let spawnObs = Observable.create((subj) => {
         | 
| 177 | 
            -
                let proc = null;
         | 
| 178 187 |  | 
| 188 | 
            +
            export function spawn<T = string>(exe: string, params: Array<string> = [], opts: any = null): Observable<T> {
         | 
| 189 | 
            +
              opts = opts || {};
         | 
| 190 | 
            +
              let spawnObs = Observable.create((subj: Observer<{
         | 
| 191 | 
            +
                source: any,
         | 
| 192 | 
            +
                text: any
         | 
| 193 | 
            +
                }>) => {
         | 
| 194 | 
            +
                let { stdin, ...optsWithoutStdIn } = opts;
         | 
| 179 195 | 
             
                let { cmd, args } = findActualExecutable(exe, params);
         | 
| 180 | 
            -
                d(`spawning process: ${cmd} ${args.join()}, ${JSON.stringify( | 
| 181 | 
            -
                let origOpts =  | 
| 182 | 
            -
                if ('jobber' in origOpts)  | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 196 | 
            +
                d(`spawning process: ${cmd} ${args.join()}, ${JSON.stringify(optsWithoutStdIn)}`);
         | 
| 197 | 
            +
                let origOpts = assign({}, optsWithoutStdIn);
         | 
| 198 | 
            +
                if ('jobber' in origOpts) {
         | 
| 199 | 
            +
                  delete origOpts.jobber;
         | 
| 200 | 
            +
                }
         | 
| 201 | 
            +
                if ('split' in origOpts) {
         | 
| 202 | 
            +
                  delete origOpts.split;
         | 
| 203 | 
            +
                };
         | 
| 185 204 |  | 
| 186 | 
            -
                proc = spawnOg(cmd, args, origOpts);
         | 
| 205 | 
            +
                const proc = spawnOg(cmd, args, origOpts);
         | 
| 187 206 |  | 
| 188 | 
            -
                let bufHandler = (source) => (b) => {
         | 
| 189 | 
            -
                  if (b.length < 1)  | 
| 190 | 
            -
             | 
| 207 | 
            +
                let bufHandler = (source: string) => (b: string | Buffer) => {
         | 
| 208 | 
            +
                  if (b.length < 1) {
         | 
| 209 | 
            +
                    return;
         | 
| 210 | 
            +
                  };
         | 
| 211 | 
            +
                  let chunk = '<< String sent back was too long >>';
         | 
| 191 212 | 
             
                  try {
         | 
| 192 | 
            -
                     | 
| 213 | 
            +
                    if (typeof b === 'string') {
         | 
| 214 | 
            +
                      chunk = b.toString();
         | 
| 215 | 
            +
                    } else {
         | 
| 216 | 
            +
                      chunk = b.toString(origOpts.encoding || 'utf8');
         | 
| 217 | 
            +
                    }
         | 
| 193 218 | 
             
                  } catch (e) {
         | 
| 194 219 | 
             
                    chunk = `<< Lost chunk of process output for ${exe} - length was ${b.length}>>`;
         | 
| 195 220 | 
             
                  }
         | 
| 196 221 |  | 
| 197 | 
            -
                  subj.next({source: source, text: chunk});
         | 
| 222 | 
            +
                  subj.next({ source: source, text: chunk });
         | 
| 198 223 | 
             
                };
         | 
| 199 224 |  | 
| 200 225 | 
             
                let ret = new Subscription();
         | 
| @@ -202,8 +227,8 @@ export function spawn(exe, params=[], opts=null) { | |
| 202 227 | 
             
                if (opts.stdin) {
         | 
| 203 228 | 
             
                  if (proc.stdin) {
         | 
| 204 229 | 
             
                    ret.add(opts.stdin.subscribe(
         | 
| 205 | 
            -
                      (x) => proc.stdin.write(x),
         | 
| 206 | 
            -
                      subj.error,
         | 
| 230 | 
            +
                      (x: any) => proc.stdin.write(x),
         | 
| 231 | 
            +
                      subj.error.bind(subj),
         | 
| 207 232 | 
             
                      () => proc.stdin.end()
         | 
| 208 233 | 
             
                    ));
         | 
| 209 234 | 
             
                  } else {
         | 
| @@ -211,34 +236,34 @@ export function spawn(exe, params=[], opts=null) { | |
| 211 236 | 
             
                  }
         | 
| 212 237 | 
             
                }
         | 
| 213 238 |  | 
| 214 | 
            -
                let stderrCompleted = null;
         | 
| 215 | 
            -
                let stdoutCompleted = null;
         | 
| 239 | 
            +
                let stderrCompleted: Subject<boolean> | Observable<boolean> | null = null;
         | 
| 240 | 
            +
                let stdoutCompleted: Subject<boolean> | Observable<boolean> | null = null;
         | 
| 216 241 | 
             
                let noClose = false;
         | 
| 217 242 |  | 
| 218 243 | 
             
                if (proc.stdout) {
         | 
| 219 | 
            -
                  stdoutCompleted = new AsyncSubject();
         | 
| 244 | 
            +
                  stdoutCompleted = new AsyncSubject<boolean>();
         | 
| 220 245 | 
             
                  proc.stdout.on('data', bufHandler('stdout'));
         | 
| 221 | 
            -
                  proc.stdout.on('close', () => { stdoutCompleted.next(true); stdoutCompleted.complete(); });
         | 
| 246 | 
            +
                  proc.stdout.on('close', () => { (stdoutCompleted! as Subject<boolean>).next(true); (stdoutCompleted! as Subject<boolean>).complete(); });
         | 
| 222 247 | 
             
                } else {
         | 
| 223 248 | 
             
                  stdoutCompleted = Observable.of(true);
         | 
| 224 249 | 
             
                }
         | 
| 225 250 |  | 
| 226 251 | 
             
                if (proc.stderr) {
         | 
| 227 | 
            -
                  stderrCompleted = new AsyncSubject();
         | 
| 252 | 
            +
                  stderrCompleted = new AsyncSubject<boolean>();
         | 
| 228 253 | 
             
                  proc.stderr.on('data', bufHandler('stderr'));
         | 
| 229 | 
            -
                  proc.stderr.on('close', () => { stderrCompleted.next(true); stderrCompleted.complete(); });
         | 
| 254 | 
            +
                  proc.stderr.on('close', () => { (stderrCompleted! as Subject<boolean>).next(true); (stderrCompleted! as Subject<boolean>).complete(); });
         | 
| 230 255 | 
             
                } else {
         | 
| 231 256 | 
             
                  stderrCompleted = Observable.of(true);
         | 
| 232 257 | 
             
                }
         | 
| 233 258 |  | 
| 234 | 
            -
                proc.on('error', (e) => {
         | 
| 259 | 
            +
                proc.on('error', (e: Error) => {
         | 
| 235 260 | 
             
                  noClose = true;
         | 
| 236 261 | 
             
                  subj.error(e);
         | 
| 237 262 | 
             
                });
         | 
| 238 263 |  | 
| 239 | 
            -
                proc.on('close', (code) => {
         | 
| 264 | 
            +
                proc.on('close', (code: number) => {
         | 
| 240 265 | 
             
                  noClose = true;
         | 
| 241 | 
            -
                  let pipesClosed = Observable.merge(stdoutCompleted | 
| 266 | 
            +
                  let pipesClosed = Observable.merge(stdoutCompleted!, stderrCompleted!)
         | 
| 242 267 | 
             
                    .reduce((acc) => acc, true);
         | 
| 243 268 |  | 
| 244 269 | 
             
                  if (code === 0) {
         | 
| @@ -249,13 +274,15 @@ export function spawn(exe, params=[], opts=null) { | |
| 249 274 | 
             
                });
         | 
| 250 275 |  | 
| 251 276 | 
             
                ret.add(new Subscription(() => {
         | 
| 252 | 
            -
                  if (noClose)  | 
| 277 | 
            +
                  if (noClose) {
         | 
| 278 | 
            +
                    return;
         | 
| 279 | 
            +
                  };
         | 
| 253 280 |  | 
| 254 281 | 
             
                  d(`Killing process: ${cmd} ${args.join()}`);
         | 
| 255 282 | 
             
                  if (opts.jobber) {
         | 
| 256 283 | 
             
                    // NB: Connecting to Jobber's named pipe will kill it
         | 
| 257 284 | 
             
                    net.connect(`\\\\.\\pipe\\jobber-${proc.pid}`);
         | 
| 258 | 
            -
                    setTimeout(() => proc.kill(), 5*1000);
         | 
| 285 | 
            +
                    setTimeout(() => proc.kill(), 5 * 1000);
         | 
| 259 286 | 
             
                  } else {
         | 
| 260 287 | 
             
                    proc.kill();
         | 
| 261 288 | 
             
                  }
         | 
| @@ -267,8 +294,8 @@ export function spawn(exe, params=[], opts=null) { | |
| 267 294 | 
             
              return opts.split ? spawnObs : spawnObs.pluck('text');
         | 
| 268 295 | 
             
            }
         | 
| 269 296 |  | 
| 270 | 
            -
            function wrapObservableInPromise(obs) {
         | 
| 271 | 
            -
              return new Promise((res, rej) => {
         | 
| 297 | 
            +
            function wrapObservableInPromise<T>(obs: Observable<T>) {
         | 
| 298 | 
            +
              return new Promise<string>((res, rej) => {
         | 
| 272 299 | 
             
                let out = '';
         | 
| 273 300 |  | 
| 274 301 | 
             
                obs.subscribe(
         | 
| @@ -292,11 +319,10 @@ function wrapObservableInPromise(obs) { | |
| 292 319 | 
             
             *                                 non-zero value, the Promise will resolve with
         | 
| 293 320 | 
             
             *                                 an Error.
         | 
| 294 321 | 
             
             */
         | 
| 295 | 
            -
            export function spawnDetachedPromise(exe, params | 
| 296 | 
            -
              return wrapObservableInPromise(spawnDetached(exe, params, opts));
         | 
| 322 | 
            +
            export function spawnDetachedPromise(exe: string, params: Array<string>, opts: any = null): Promise<string> {
         | 
| 323 | 
            +
              return wrapObservableInPromise<string>(spawnDetached(exe, params, opts));
         | 
| 297 324 | 
             
            }
         | 
| 298 325 |  | 
| 299 | 
            -
             | 
| 300 326 | 
             
            /**
         | 
| 301 327 | 
             
             * Spawns a process as a child process.
         | 
| 302 328 | 
             
             *
         | 
| @@ -310,6 +336,6 @@ export function spawnDetachedPromise(exe, params, opts=null) { | |
| 310 336 | 
             
             *                                 non-zero value, the Promise will resolve with
         | 
| 311 337 | 
             
             *                                 an Error.
         | 
| 312 338 | 
             
             */
         | 
| 313 | 
            -
            export function spawnPromise(exe, params | 
| 314 | 
            -
              return wrapObservableInPromise(spawn(exe, params, opts));
         | 
| 339 | 
            +
            export function spawnPromise(exe: string, params: Array<string>, opts: any = null): Promise<string> {
         | 
| 340 | 
            +
              return wrapObservableInPromise<string>(spawn(exe, params, opts));
         | 
| 315 341 | 
             
            }
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            import { expect } from 'chai';
         | 
| 2 | 
            +
            import './support';
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            function delay(ms: number) {
         | 
| 5 | 
            +
              return new Promise((resolve) => {
         | 
| 6 | 
            +
                setTimeout(resolve, ms);
         | 
| 7 | 
            +
              });
         | 
| 8 | 
            +
            }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            describe('The test runner', function () {
         | 
| 11 | 
            +
              it('should pass this test', async function () {
         | 
| 12 | 
            +
                await delay(1000);
         | 
| 13 | 
            +
                expect(true).to.be.ok;
         | 
| 14 | 
            +
              });
         | 
| 15 | 
            +
            });
         | 
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            import { expect } from 'chai';
         | 
| 1 2 | 
             
            import './support';
         | 
| 2 3 |  | 
| 3 4 | 
             
            import { spawn, spawnPromise, spawnDetachedPromise } from '../src/index';
         | 
| @@ -24,17 +25,24 @@ describe('The spawnDetachedPromise method', function() { | |
| 24 25 | 
             
              });
         | 
| 25 26 | 
             
            });
         | 
| 26 27 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 28 | 
            +
            function wrapSplitObservableInPromise(obs: Observable<{
         | 
| 29 | 
            +
              source: any,
         | 
| 30 | 
            +
              text: any
         | 
| 31 | 
            +
            }>): Promise<{
         | 
| 32 | 
            +
              stderr: string,
         | 
| 33 | 
            +
              stdout: string,
         | 
| 34 | 
            +
              error: Error | undefined
         | 
| 35 | 
            +
            }> {
         | 
| 29 36 | 
             
              return new Promise((res) => {
         | 
| 30 | 
            -
                let out = {stderr: '', stdout: ''};
         | 
| 37 | 
            +
                let out = {stderr: '', stdout: '', error: undefined };
         | 
| 31 38 |  | 
| 32 39 | 
             
                obs.subscribe(
         | 
| 33 40 | 
             
                  (x) => {
         | 
| 34 | 
            -
                    if (x.source === 'stdout')
         | 
| 41 | 
            +
                    if (x.source === 'stdout') {
         | 
| 35 42 | 
             
                      out.stdout += x.text;
         | 
| 36 | 
            -
                    else
         | 
| 43 | 
            +
                    } else {
         | 
| 37 44 | 
             
                      out.stderr += x.text;
         | 
| 45 | 
            +
                    }
         | 
| 38 46 | 
             
                  },
         | 
| 39 47 | 
             
                  (e) => { out.error = e; res(out); },
         | 
| 40 48 | 
             
                  () => res(out));
         | 
| @@ -50,7 +58,7 @@ describe('The spawn method', function() { | |
| 50 58 |  | 
| 51 59 | 
             
              it('should return split stderr in a inner tag when called with split', async function() {
         | 
| 52 60 | 
             
                // provide an invalid param to uuid so it complains on stderr
         | 
| 53 | 
            -
                let rxSpawn = spawn('uuid', ['foo'], {split: true});
         | 
| 61 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', ['foo'], {split: true}) as any;
         | 
| 54 62 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 55 63 | 
             
                expect(result.stderr.length > 10).to.be.ok;
         | 
| 56 64 | 
             
                expect(result.stdout).to.be.empty;
         | 
| @@ -58,7 +66,7 @@ describe('The spawn method', function() { | |
| 58 66 | 
             
              });
         | 
| 59 67 |  | 
| 60 68 | 
             
              it('should return split stdout in a inner tag when called with split', async function() {
         | 
| 61 | 
            -
                let rxSpawn = spawn('uuid', [], {split: true});
         | 
| 69 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', [], {split: true});
         | 
| 62 70 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 63 71 | 
             
                expect(result.stdout.match(uuidRegex)).to.be.ok;
         | 
| 64 72 | 
             
                expect(result.stderr).to.be.empty;
         | 
| @@ -66,27 +74,27 @@ describe('The spawn method', function() { | |
| 66 74 | 
             
              });
         | 
| 67 75 |  | 
| 68 76 | 
             
              it('should ignore stderr if options.stdio = ignore', async function() {
         | 
| 69 | 
            -
                let rxSpawn = spawn('uuid', ['foo'], {split: true, stdio: [null, null, 'ignore']});
         | 
| 77 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', ['foo'], {split: true, stdio: [null, null, 'ignore']});
         | 
| 70 78 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 71 79 | 
             
                expect(result.stderr).to.be.empty;
         | 
| 72 80 | 
             
              });
         | 
| 73 81 |  | 
| 74 82 | 
             
              it('should ignore stdout if options.stdio = inherit', async function() {
         | 
| 75 | 
            -
                let rxSpawn = spawn('uuid', [], {split: true, stdio: [null, 'inherit', null]});
         | 
| 83 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', [], {split: true, stdio: [null, 'inherit', null]});
         | 
| 76 84 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 77 85 | 
             
                expect(result.stdout).to.be.empty;
         | 
| 78 86 | 
             
              });
         | 
| 79 | 
            -
             | 
| 87 | 
            +
             | 
| 80 88 | 
             
              it('should croak if stdin is provided but stdio.stdin is disabled', async function() {
         | 
| 81 89 | 
             
                let stdin = Observable.of('a');
         | 
| 82 | 
            -
                let rxSpawn = spawn('marked', [], {split: true, stdin: stdin, stdio: ['ignore', null, null]});
         | 
| 90 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }>  = spawn('marked', [], {split: true, stdin: stdin, stdio: ['ignore', null, null]});
         | 
| 83 91 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 84 92 | 
             
                expect(result.error).to.be.an('error');
         | 
| 85 93 | 
             
              });
         | 
| 86 | 
            -
             | 
| 94 | 
            +
             | 
| 87 95 | 
             
              it('should subscribe to provided stdin', async function() {
         | 
| 88 96 | 
             
                let stdin = Observable.of('a');
         | 
| 89 | 
            -
                let rxSpawn = spawn('marked', [], {split: true, stdin: stdin});
         | 
| 97 | 
            +
                let rxSpawn: Observable<{ source: any, text: any }> = spawn('marked', [], {split: true, stdin: stdin});
         | 
| 90 98 | 
             
                let result = await wrapSplitObservableInPromise(rxSpawn);
         | 
| 91 99 | 
             
                expect(result.stdout.trim()).to.be.equal('<p>a</p>');
         | 
| 92 100 | 
             
              });
         | 
| @@ -1,5 +1,7 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 1 | 
            +
            import * as chai from 'chai';
         | 
| 2 | 
            +
            import * as chaiAsPromised from 'chai-as-promised';
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            declare const global: any;
         | 
| 3 5 |  | 
| 4 6 | 
             
            chai.should();
         | 
| 5 7 | 
             
            chai.use(chaiAsPromised);
         | 
| @@ -8,5 +10,5 @@ global.chai = chai; | |
| 8 10 | 
             
            global.chaiAsPromised = chaiAsPromised;
         | 
| 9 11 | 
             
            global.expect = chai.expect;
         | 
| 10 12 | 
             
            global.AssertionError = chai.AssertionError;
         | 
| 11 | 
            -
            global.Assertion = chai.Assertion;
         | 
| 12 13 | 
             
            global.assert = chai.assert;
         | 
| 14 | 
            +
            global.Assertion = (chai as any).Assertion; //'Assertion' is not existing?
         | 
    
        package/tsconfig.json
    ADDED
    
    | @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "compilerOptions": {
         | 
| 3 | 
            +
                "removeComments": false,
         | 
| 4 | 
            +
                "preserveConstEnums": true,
         | 
| 5 | 
            +
                "sourceMap": true,
         | 
| 6 | 
            +
                "declaration": true,
         | 
| 7 | 
            +
                "noImplicitAny": true,
         | 
| 8 | 
            +
                "noImplicitReturns": true,
         | 
| 9 | 
            +
                "suppressImplicitAnyIndexErrors": true,
         | 
| 10 | 
            +
                "strictNullChecks": true,
         | 
| 11 | 
            +
                "noUnusedLocals": true,
         | 
| 12 | 
            +
                "noImplicitThis": true,
         | 
| 13 | 
            +
                "noUnusedParameters": true,
         | 
| 14 | 
            +
                "module": "commonjs",
         | 
| 15 | 
            +
                "moduleResolution": "node",
         | 
| 16 | 
            +
                "pretty": true,
         | 
| 17 | 
            +
                "target": "es5",
         | 
| 18 | 
            +
                "outDir": "lib",
         | 
| 19 | 
            +
                "lib": ["dom", "es2015"]
         | 
| 20 | 
            +
              },
         | 
| 21 | 
            +
              "formatCodeOptions": {
         | 
| 22 | 
            +
                "indentSize": 2,
         | 
| 23 | 
            +
                "tabSize": 2
         | 
| 24 | 
            +
              },
         | 
| 25 | 
            +
              "exclude": [
         | 
| 26 | 
            +
                "node_modules",
         | 
| 27 | 
            +
                "lib"
         | 
| 28 | 
            +
              ]
         | 
| 29 | 
            +
            }
         | 
    
        package/tslint.json
    ADDED
    
    | @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "rules": {
         | 
| 3 | 
            +
                "curly": true,
         | 
| 4 | 
            +
                "eofline": false,
         | 
| 5 | 
            +
                "align": [true, "parameters"],
         | 
| 6 | 
            +
                "class-name": true,
         | 
| 7 | 
            +
                "indent": [true, "spaces"],
         | 
| 8 | 
            +
                "max-line-length": [true, 150],
         | 
| 9 | 
            +
                "no-consecutive-blank-lines": [true],
         | 
| 10 | 
            +
                "no-trailing-whitespace": true,
         | 
| 11 | 
            +
                "no-duplicate-variable": true,
         | 
| 12 | 
            +
                "no-var-keyword": true,
         | 
| 13 | 
            +
                "no-empty": true,
         | 
| 14 | 
            +
                "no-unused-expression": true,
         | 
| 15 | 
            +
                "no-use-before-declare": true,
         | 
| 16 | 
            +
                "no-var-requires": true,
         | 
| 17 | 
            +
                "one-line": [true,
         | 
| 18 | 
            +
                  "check-else",
         | 
| 19 | 
            +
                  "check-whitespace",
         | 
| 20 | 
            +
                  "check-open-brace"],
         | 
| 21 | 
            +
                "quotemark": [true,
         | 
| 22 | 
            +
                  "single",
         | 
| 23 | 
            +
                  "avoid-escape"],
         | 
| 24 | 
            +
                "semicolon": [true, "always"],
         | 
| 25 | 
            +
                "typedef-whitespace": [true, {
         | 
| 26 | 
            +
                  "call-signature": "nospace",
         | 
| 27 | 
            +
                  "index-signature": "nospace",
         | 
| 28 | 
            +
                  "parameter": "nospace",
         | 
| 29 | 
            +
                  "property-declaration": "nospace",
         | 
| 30 | 
            +
                  "variable-declaration": "nospace"
         | 
| 31 | 
            +
                }],
         | 
| 32 | 
            +
                "whitespace": [true,
         | 
| 33 | 
            +
                  "check-branch",
         | 
| 34 | 
            +
                  "check-decl",
         | 
| 35 | 
            +
                  "check-operator",
         | 
| 36 | 
            +
                  "check-type"]
         | 
| 37 | 
            +
              }
         | 
| 38 | 
            +
            }
         | 
    
        package/.babelrc
    DELETED
    
    
    
        package/.eslintrc
    DELETED
    
    
    
        package/lib/babel-maybefill.js
    DELETED
    
    
    
        package/test/.eslintrc
    DELETED
    
    | @@ -1,26 +0,0 @@ | |
| 1 | 
            -
            {
         | 
| 2 | 
            -
                "parser": "babel-eslint",
         | 
| 3 | 
            -
                "rules": {
         | 
| 4 | 
            -
                    "strict": 0,
         | 
| 5 | 
            -
                    "indent": [
         | 
| 6 | 
            -
                        2,
         | 
| 7 | 
            -
                        2
         | 
| 8 | 
            -
                    ],
         | 
| 9 | 
            -
                    "semi": [
         | 
| 10 | 
            -
                        2,
         | 
| 11 | 
            -
                        "always"
         | 
| 12 | 
            -
                    ],
         | 
| 13 | 
            -
                    "no-console": 0
         | 
| 14 | 
            -
                },
         | 
| 15 | 
            -
                "env": {
         | 
| 16 | 
            -
                    "es6": true,
         | 
| 17 | 
            -
                    "node": true,
         | 
| 18 | 
            -
                    "browser": true,
         | 
| 19 | 
            -
                    "mocha": true
         | 
| 20 | 
            -
                },
         | 
| 21 | 
            -
                "globals": {
         | 
| 22 | 
            -
                  "expect": true,
         | 
| 23 | 
            -
                  "chai": true,
         | 
| 24 | 
            -
                },
         | 
| 25 | 
            -
                "extends": "eslint:recommended"
         | 
| 26 | 
            -
            }
         | 
    
        package/test/asserttest.js
    DELETED
    
    | @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            import './support';
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            function delay(ms) {
         | 
| 4 | 
            -
              return new Promise((resolve) => {
         | 
| 5 | 
            -
                setTimeout(resolve, ms);
         | 
| 6 | 
            -
              });
         | 
| 7 | 
            -
            }
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            describe('The test runner', function() {
         | 
| 10 | 
            -
              it('should pass this test', async function() {
         | 
| 11 | 
            -
                await delay(1000);
         | 
| 12 | 
            -
                expect(true).to.be.ok;
         | 
| 13 | 
            -
              });
         | 
| 14 | 
            -
            });
         |