tomas / tomas/needle

Tests fail b/c of missing versions for dev dependencies

Open
#253 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
JavaScript
Stars
1.6k
Forks
237
PR merge metrics
No merged PRs in 30d

Description

Versions for devDependencies are "" (empty string), which installs latest available ones. This results in npm test not running, since Sinon deprecated (and nuked) a bunch of APIs.

npm test output

> needle@2.2.1 test /Users/elmigranto/Temp/needle
> mocha test



  Basic Auth
    when neither username or password are passed
      ✓ doesnt send any Authorization headers
    when username is an empty string, and password is a valid string
      ✓ doesnt send any Authorization headers
    when username is a valid string, but no username is passed
      ✓ sends Authorization header
      ✓ Basic Auth only includes username, without colon
    when username is a valid string, and password is null
      ✓ sends Authorization header
      ✓ Basic Auth only includes both username and password
    when username is a valid string, and password is an empty string
      ✓ sends Authorization header
      ✓ Basic Auth only includes both username and password
    when username AND password are non empty strings
      ✓ sends Authorization header
      ✓ Basic Auth only includes both user and password
    URL with @ but not username/pass
      ✓ doesnt send Authorization header
      ✓ sends user:pass headers if passed via options
    when username/password are included in URL
      ✓ sends Authorization header
      ✓ Basic Auth only includes both user and password

  compression
    when server supports compression
      and client requests no compression
        ✓ should have the body decompressed
      and client requests gzip compression
        ✓ should have the body decompressed
      and client requests deflate compression
        ✓ should have the body decompressed
        ✓ should rethrow errors from decompressors

  cookies
    with default options
      ✓ no cookie header is set on request
    if response does not contain cookies
      ✓ response.cookies is undefined
    if response contains cookies
      ✓ puts them on resp.cookies
      ✓ parses them as a object
      ✓ must decode it
      when a cookie value is invalid
        ✓ doesnt blow up
      and response is a redirect
        and follow_set_cookies is false
          ✓ no cookie header set on redirection request
        and follow_set_cookies is true
          ✓ should have all the cookies
      with parse_cookies = false
        ✓ does not parse them
    if request contains cookie header
      ✓ must be a valid cookie string
      ✓ dont have to encode allowed characters
      ✓ must encode forbidden characters

  character encoding
    test A
      with decode = false
        ✓ does not decode (1168ms)
      with decode = true
        ✓ decodes (1196ms)
    test B
      ✓ encodes to UTF-8 (1038ms)

  errors
    when host does not exist
      with callback
        ✓ does not throw
        ✓ callbacks an error
        ✓ error should be ENOTFOUND
        ✓ does not callback a response
        ✓ does not emit an error event (106ms)
      without callback
        ✓ does not throw
        ✓ emits end event once, with error (201ms)
        ✓ error should be ENOTFOUND or EADDRINFO (205ms)
        ✓ does not emit a readable event (55ms)
        ✓ does not emit an error event (104ms)
    when request times out waiting for response
      with callback
        ✓ aborts the request (209ms)
        ✓ callbacks an error (209ms)
        ✓ error should be ECONNRESET (204ms)
        ✓ does not callback a response (205ms)
        ✓ does not emit an error event (356ms)
      without callback
        ✓ emits done event once, with error (251ms)
        ✓ aborts the request (206ms)
        ✓ error should be ECONNRESET (257ms)
        ✓ does not emit a readable event (256ms)
        ✓ does not emit an error event (103ms)

  request headers
    old node versions (<0.11.4) with persistent keep-alive connections
      default options
        ✓ sends a Connection: close header
        ✓ no open sockets remain after request
      passing connection: close
        ✓ sends a Connection: close header
        ✓ no open sockets remain after request
      passing connection: keep-alive
        ✓ sends a Connection: keep-alive header (using options.headers.connection)
        ✓ sends a Connection: keep-alive header (using options.connection)
        ✓ one open socket remain after request
    new node versions with smarter connection disposing
      default options
        - sets a Connection header
        - one open sockets remain after request
      passing connection: close
        ✓ sends a Connection: close header
        ✓ no open sockets remain after request
      passing connection: keep-alive
        ✓ sends a Connection: keep-alive header (using options.headers.connection)
        ✓ sends a Connection: keep-alive header (using options.connection)
        ✓ one open socket remain after request

  when posting a very long string
    ✓ shouldn't throw an EPIPE error out of nowhere (573ms)

  with output option
    and a 404 response
      ✓ doesnt attempt to write a file
      ✓ doesnt actually write a file
    and a 200 response
      for an empty response
        ✓ uses a writableStream
        ✓ writes a file
        ✓ file is zero bytes in length
        1) closes the file descriptor
      for a JSON response
        ✓ uses a writableStream
        ✓ writes a file
        ✓ file size equals response length
        ✓ response pipeline is honoured (JSON is decoded by default)
        2) closes the file descriptor
      for a binary file
        ✓ uses a writableStream
        ✓ writes a file
        ✓ file size equals response length
        ✓ file is equal to original buffer
        ✓ returns the data in resp.body too
        3) closes the file descriptor

  parsing
    when response is an JSON string
      and parse option is not passed
        with default parse_response
          ✓ should return object
        and default parse_response is set to false
          ✓ does NOT return object when disabled using .defaults
      and parse option is true
        and JSON is valid
          ✓ should return object
          ✓ should have a .parser = json property
        and response is empty
          ✓ should return an empty string
        and JSON is invalid
          ✓ does not throw
          ✓ does NOT return object
      and parse option is false
        ✓ does NOT return object
        ✓ should NOT have a .parser = json property
      and parse option is "xml"
        ✓ does NOT return object
        ✓ should NOT have a .parser = json property
    when response is JSON 'false'
      and parse option is not passed
        ✓ should return object
      and parse option is true
        and JSON is valid
          ✓ should return object
        and response is empty
          ✓ should return an empty string
        and JSON is invalid
          ✓ does not throw
          ✓ does NOT return object
      and parse option is false
        ✓ does NOT return object
      and parse option is "xml"
        ✓ does NOT return object
    when response is an invalid XML string
      and parse_response is true
        ✓ should return original string
        ✓ should not have a .parser = xml property
      and parse response is false
        ✓ should return valid object
        ✓ should not have a .parser property
    when response is a valid XML string
      and parse_response is true
        ✓ should return valid object
        ✓ should have a .parser = xml property
      and parse response is false
        ✓ should return valid object
        ✓ should not have a .parser property
    valid XML, using xml2js
      and parse_response is true
        ✓ should return valid object
        ✓ should have a .parser = xml property
      and parse response is false
        ✓ should return valid object
        ✓ should not have a .parser property

  post data (e.g. request body)
    with multipart: true
      when null
        4) sends request (non multipart)
        ✓ doesnt set Content-Type header
        ✓ doesnt change default Accept header
        5) doesnt write anything
      when string
        ✓ explodes
      when object
        get request
          6) sends request
          ✓ sets Content-Type header
          ✓ doesnt change default Accept header
          7) writes string as buffer
          8) writes japanese chars correctly as binary
        post request
          9) sends request
          10) writes string as buffer
          11) writes japanese chars correctly as binary
      when stream
        ✓ explodes
    non multipart
      when null
        get request
          12) sends request
          13) doesnt write anything
        post request
          14) sends request
          15) doesnt write anything
      when string with no equal sign
        get request
          ✓ explodes
        post request
          16) sends request
          17) writes string as buffer
      when string WITH equal sign
        get request
          with json: false (default)
            18) sends request, adding data as querystring
            ✓ doesnt set Content-Type header
            ✓ doesnt change default Accept header
            19) doesnt write anything
          with json: true
            20) sends request, without setting a querystring
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            21) writes raw string (assuming it already is JSON, so no JSON.stringify)
        post request
          with json: false (default)
            22) sends request
            ✓ sets Content-Type header to www-form-urlencoded
            ✓ doesnt change default Accept header
            23) writes as buffer
          with json: true
            24) sends request
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            25) writes raw string (assuming it already is JSON, so no JSON.stringify)
      when object
        get request
          with json: false (default)
            26) sends request, adding data as querystring
            ✓ doesnt set Content-Type header
            ✓ doesnt change default Accept header
            27) doesnt write anything
          with json: true
            28) sends request, without setting a querystring
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            29) writes JSON.stringify version of object
        post request
          with json: false (default)
            30) sends request
            ✓ sets Content-Type header to www-form-urlencoded
            ✓ doesnt change default Accept header
            31) writes as buffer
          with json: false and content_type = "application/json"
            32) sends request
            ✓ sets Content-Type header to application/json
            ✓ doesnt change default Accept header
            33) writes as buffer
          with json: undefined but content-type = application/json
            34) sends request
            ✓ doesnt change Content-Type header
            ✓ leaves default Accept header
            35) writes JSON.stringified object
          with json: true
            36) sends request
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            37) writes JSON.stringified object
          with json: true and content_type: */* (passed, not default)
            38) sends request
            ✓ sets Content-Type header to application/json
            ✓ respects Accept header set by user
            39) writes JSON.stringified object
      when buffer
        get request
          with json: false (default)
            40) sends request
            ✓ sets Content-Type header
            ✓ doesnt change default Accept header
            41) writes as buffer
          with json: true
            42) sends request, without setting a querystring
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            43) writes JSON.stringify version of object
        post request
          with json: false (default)
            44) sends request
            ✓ sets Content-Type header to www-form-urlencoded
            ✓ doesnt change default Accept header
            45) writes as buffer
          with json: true
            46) sends request
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            47) passes raw buffer (assuming its a JSON string beneath)
      when stream
        get request
          ✓ explodes
        post request
          with json: false (default)
            48) sends request
            ✓ sets Content-Type header to www-form-urlencoded
            ✓ doesnt change default Accept header
            49) writes as buffer
          with json: true
            50) sends request
            ✓ sets Content-Type header
            ✓ set Accept header to application/json
            51) writes JSON.stringified object

  proxy option
    when null proxy is passed
      ✓ does not proxy
      but defaults has been set
        ✓ tries to proxy anyway
    when weird string is passed
      ✓ tries to proxy anyway
    when valid url is passed
      ✓ proxies request
      ✓ does not set a Proxy-Authorization header
      and proxy url contains user:pass
        ✓ proxies request
        ✓ sets Proxy-Authorization header
      and a proxy_user is passed
        ✓ proxies request
        ✓ sets Proxy-Authorization header
        and url also contains user:pass
          ✓ url user:pass wins
        and options.username is also present
          ✓ a separate Authorization header is set

  stringify
    with null
      ✓ throws
    with a number
      ✓ throws
    with a string
      that is empty
        ✓ throws
      that doesnt contain an equal sign
        ✓ throws
      that contains an equal sign
        ✓ works
    with an array
      with key val objects
        ✓ works
      where all elements are strings with an equal sign
        ✓ works
      with random words
        ✓ throws
      with integers
        ✓ throws
    with an object
      ✓ works
      with object where val is an array
        ✓ works
      with object where val is an array of key val objects
        ✓ works

  redirects
    when overriding defaults
      and redirected to the same path on same host and protocol
        ✓ does not follow redirect
        52) "after each" hook for "does not follow redirect"

  follow redirects when read_timeout is set
    ✓ clear timeout before following redirect (3001ms)

  request stream length
    no stream_length set
      ✓ doesnt set Content-Length header
      ✓ doesnt work if Transfer-Encoding is set to a blank string
      ✓ works if Transfer-Encoding is not set
    stream_length set to invalid value
      ✓ sets Content-Length header to that value
      ✓ doesnt work if Transfer-Encoding is set to a blank string
      ✓ doesnt work if Transfer-Encoding is not set
    stream_length is set to valid value
      ✓ sets Content-Length header to that value
      ✓ works if Transfer-Encoding is set to a blank string
      ✓ works if Transfer-Encoding is not set
    stream_length set to 0
      stream with path
        53) "before each" hook for "sets Content-Length header to streams length"
        54) "after each" hook for "sets Content-Length header to streams length"
      stream without path
        ✓ does not set Content-Length header
        ✓ doesnt work if Transfer-Encoding is set to a blank string
        ✓ works if Transfer-Encoding is not set

  response streams
    when the server sends back json
      and the client uses streams
        ✓ should create a proper streams2 stream
        ✓ emits a single data item which is our JSON object
        ✓ emits a raw buffer if we do not want to parse JSON
    when the server sends back what was posted to it
      ✓ can PUT a stream
      ✓ can PATCH a stream

  socket reuse
    when sockets are reused
      ✓ does not duplicate listeners on .end (552ms)

  urls
    null URL
      ✓ throws
    invalid protocol
      ✓ fails
    invalid host
      ✓ fails
    valid protocol and path
      ✓ works
    no protocol but with slashes and valid path
      ✓ works
    no protocol nor slashes and valid path
      ✓ works
    double encoding
      ✓ should not occur


  202 passing (12s)
  2 pending
  54 failing

  1) with output option
       and a 200 response
         for an empty response
           closes the file descriptor:
     Error: ENOENT: no such file or directory, scandir '/proc/self/fd'
      at Object.fs.readdirSync (fs.js:904:18)
      at get_open_file_descriptors (test/output_spec.js:27:19)
      at Context.<anonymous> (test/output_spec.js:114:34)

  2) with output option
       and a 200 response
         for a JSON response
           closes the file descriptor:
     Error: ENOENT: no such file or directory, scandir '/proc/self/fd'
      at Object.fs.readdirSync (fs.js:904:18)
      at get_open_file_descriptors (test/output_spec.js:27:19)
      at Context.<anonymous> (test/output_spec.js:171:32)

  3) with output option
       and a 200 response
         for a binary file
           closes the file descriptor:
     Error: ENOENT: no such file or directory, scandir '/proc/self/fd'
      at Object.fs.readdirSync (fs.js:904:18)
      at get_open_file_descriptors (test/output_spec.js:27:19)
      at Context.<anonymous> (test/output_spec.js:241:34)

  4) post data (e.g. request body)
       with multipart: true
         when null
           sends request (non multipart):
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:61:9)

  5) post data (e.g. request body)
       with multipart: true
         when null
           doesnt write anything:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:85:9)

  6) post data (e.g. request body)
       with multipart: true
         when object
           get request
             sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:111:11)

  7) post data (e.g. request body)
       with multipart: true
         when object
           get request
             writes string as buffer:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:134:11)

  8) post data (e.g. request body)
       with multipart: true
         when object
           get request
             writes japanese chars correctly as binary:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:147:11)

  9) post data (e.g. request body)
       with multipart: true
         when object
           post request
             sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:164:11)

  10) post data (e.g. request body)
       with multipart: true
         when object
           post request
             writes string as buffer:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:173:11)

  11) post data (e.g. request body)
       with multipart: true
         when object
           post request
             writes japanese chars correctly as binary:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:185:11)

  12) post data (e.g. request body)
       non multipart
         when null
           get request
             sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:228:11)

  13) post data (e.g. request body)
       non multipart
         when null
           get request
             doesnt write anything:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:237:11)

  14) post data (e.g. request body)
       non multipart
         when null
           post request
             sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:251:11)

  15) post data (e.g. request body)
       non multipart
         when null
           post request
             doesnt write anything:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:260:11)

  16) post data (e.g. request body)
       non multipart
         when string with no equal sign
           post request
             sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:288:11)

  17) post data (e.g. request body)
       non multipart
         when string with no equal sign
           post request
             writes string as buffer:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:297:11)

  18) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           get request
             with json: false (default)
               sends request, adding data as querystring:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:319:13)

  19) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           get request
             with json: false (default)
               doesnt write anything:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:346:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  20) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           get request
             with json: true
               sends request, without setting a querystring:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:357:13)

  21) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           get request
             with json: true
               writes raw string (assuming it already is JSON, so no JSON.stringify):
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:382:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  22) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           post request
             with json: false (default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:398:13)

  23) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           post request
             with json: false (default)
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:423:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  24) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           post request
             with json: true
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:436:13)

  25) post data (e.g. request body)
       non multipart
         when string WITH equal sign
           post request
             with json: true
               writes raw string (assuming it already is JSON, so no JSON.stringify):
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:460:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  26) post data (e.g. request body)
       non multipart
         when object
           get request
             with json: false (default)
               sends request, adding data as querystring:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:481:13)

  27) post data (e.g. request body)
       non multipart
         when object
           get request
             with json: false (default)
               doesnt write anything:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:508:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  28) post data (e.g. request body)
       non multipart
         when object
           get request
             with json: true
               sends request, without setting a querystring:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:519:13)

  29) post data (e.g. request body)
       non multipart
         when object
           get request
             with json: true
               writes JSON.stringify version of object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:544:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  30) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: false (default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:561:13)

  31) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: false (default)
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:586:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  32) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: false and content_type = "application/json"
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:601:13)

  33) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: false and content_type = "application/json"
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:626:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  34) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: undefined but content-type = application/json
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:641:13)

  35) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: undefined but content-type = application/json
               writes JSON.stringified object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:665:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  36) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: true
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:677:13)

  37) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: true
               writes JSON.stringified object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:701:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  38) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: true and content_type: */* (passed, not default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:717:13)

  39) post data (e.g. request body)
       non multipart
         when object
           post request
             with json: true and content_type: */* (passed, not default)
               writes JSON.stringified object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:741:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  40) post data (e.g. request body)
       non multipart
         when buffer
           get request
             with json: false (default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:762:13)

  41) post data (e.g. request body)
       non multipart
         when buffer
           get request
             with json: false (default)
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:789:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  42) post data (e.g. request body)
       non multipart
         when buffer
           get request
             with json: true
               sends request, without setting a querystring:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:802:13)

  43) post data (e.g. request body)
       non multipart
         when buffer
           get request
             with json: true
               writes JSON.stringify version of object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:826:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  44) post data (e.g. request body)
       non multipart
         when buffer
           post request
             with json: false (default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:842:13)

  45) post data (e.g. request body)
       non multipart
         when buffer
           post request
             with json: false (default)
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:867:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  46) post data (e.g. request body)
       non multipart
         when buffer
           post request
             with json: true
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:880:13)

  47) post data (e.g. request body)
       non multipart
         when buffer
           post request
             with json: true
               passes raw buffer (assuming its a JSON string beneath):
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:904:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  48) post data (e.g. request body)
       non multipart
         when stream
           post request
             with json: false (default)
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:944:13)

  49) post data (e.g. request body)
       non multipart
         when stream
           post request
             with json: false (default)
               writes as buffer:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:969:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  50) post data (e.g. request body)
       non multipart
         when stream
           post request
             with json: true
               sends request:
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at spystub_request (test/post_data_spec.js:43:18)
      at Context.<anonymous> (test/post_data_spec.js:982:13)

  51) post data (e.g. request body)
       non multipart
         when stream
           post request
             with json: true
               writes JSON.stringified object:
     Uncaught TypeError: Cannot read property 'called' of undefined
      at /Users/elmigranto/Temp/needle/test/post_data_spec.js:1006:19
      at done (lib/needle.js:442:14)
      at PassThrough.<anonymous> (lib/needle.js:687:9)
      at endReadableNT (_stream_readable.js:1064:12)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  52) redirects
       "after each" hook for "does not follow redirect":
     TypeError: spies.http.reset is not a function
      at Context.<anonymous> (test/redirect_spec.js:118:18)

  53) request stream length
       stream_length set to 0
         stream with path
           "before each" hook for "sets Content-Length header to streams length":
     TypeError: stub(obj, 'meth', fn) has been removed, see documentation
      at stub (node_modules/sinon/lib/sinon/stub.js:25:15)
      at Sandbox.stub (node_modules/sinon/lib/sinon/sandbox.js:290:33)
      at Context.<anonymous> (test/request_stream_spec.js:140:22)

  54) request stream length
       stream_length set to 0
         stream with path
           "after each" hook for "sets Content-Length header to streams length":
     TypeError: Cannot read property 'restore' of undefined
      at Context.<anonymous> (test/request_stream_spec.js:146:14)





Seems like installing sinon@2 works (I ran npm i sinon@2 --save-dev). Here's a git diff for package.json when I managed to run tests successfully, except for failing tests that try to read /proc/self/fd (fails on macOS):

diff --git a/package.json b/package.json
index b7c3cf6..56f075e 100644
--- a/package.json
+++ b/package.json
@@ -45,13 +45,13 @@
     "sax": "^1.2.4"
   },
   "devDependencies": {
-    "mocha": "",
-    "sinon": "",
-    "should": "",
-    "xml2js": "",
     "JSONStream": "",
+    "jschardet": "",
+    "mocha": "",
     "q": "",
-    "jschardet": ""
+    "should": "",
+    "sinon": "^2.4.1",
+    "xml2js": ""
   },
   "scripts": {
     "test": "mocha test"

Though I'd suggest adding versions for everything… Alternatively, maybe adding package-lock.json would help on newer npm versions. Here's the one I got:

package-lock.json
{
  "name": "needle",
  "version": "2.2.1",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "JSONStream": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz",
      "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==",
      "requires": {
        "jsonparse": "^1.2.0",
        "through": ">=2.2.7 <3"
      }
    },
    "balanced-match": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
    },
    "brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }
    },
    "browser-stdout": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
    },
    "commander": {
      "version": "2.15.1",
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
    },
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },
    "debug": {
      "version": "2.6.9",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
      "requires": {
        "ms": "2.0.0"
      }
    },
    "diff": {
      "version": "3.5.0",
      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
    },
    "escape-string-regexp": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
    },
    "formatio": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
      "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
      "dev": true,
      "requires": {
        "samsam": "1.x"
      }
    },
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    },
    "glob": {
      "version": "7.1.2",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^3.0.4",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      }
    },
    "growl": {
      "version": "1.10.5",
      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
    },
    "has-flag": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
    },
    "he": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
    },
    "iconv-lite": {
      "version": "0.4.23",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
      "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
      "requires": {
        "safer-buffer": ">= 2.1.2 < 3"
      }
    },
    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "inherits": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
    },
    "isarray": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
      "dev": true
    },
    "jschardet": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz",
      "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ=="
    },
    "jsonparse": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
    },
    "lolex": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
      "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
      "dev": true
    },
    "minimatch": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "requires": {
        "brace-expansion": "^1.1.7"
      }
    },
    "minimist": {
      "version": "0.0.8",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
    },
    "mkdirp": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
      "requires": {
        "minimist": "0.0.8"
      }
    },
    "mocha": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
      "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
      "requires": {
        "browser-stdout": "1.3.1",
        "commander": "2.15.1",
        "debug": "3.1.0",
        "diff": "3.5.0",
        "escape-string-regexp": "1.0.5",
        "glob": "7.1.2",
        "growl": "1.10.5",
        "he": "1.1.1",
        "minimatch": "3.0.4",
        "mkdirp": "0.5.1",
        "supports-color": "5.4.0"
      },
      "dependencies": {
        "debug": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
          "requires": {
            "ms": "2.0.0"
          }
        }
      }
    },
    "ms": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
    },
    "native-promise-only": {
      "version": "0.8.1",
      "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
      "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
      "dev": true
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "requires": {
        "wrappy": "1"
      }
    },
    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
    },
    "path-to-regexp": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
      "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
      "dev": true,
      "requires": {
        "isarray": "0.0.1"
      }
    },
    "q": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
    },
    "safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
    },
    "samsam": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
      "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
      "dev": true
    },
    "sax": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
    },
    "should": {
      "version": "13.2.3",
      "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz",
      "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==",
      "requires": {
        "should-equal": "^2.0.0",
        "should-format": "^3.0.3",
        "should-type": "^1.4.0",
        "should-type-adaptors": "^1.0.1",
        "should-util": "^1.0.0"
      }
    },
    "should-equal": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz",
      "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==",
      "requires": {
        "should-type": "^1.4.0"
      }
    },
    "should-format": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz",
      "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=",
      "requires": {
        "should-type": "^1.3.0",
        "should-type-adaptors": "^1.0.1"
      }
    },
    "should-type": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz",
      "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM="
    },
    "should-type-adaptors": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz",
      "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==",
      "requires": {
        "should-type": "^1.3.0",
        "should-util": "^1.0.0"
      }
    },
    "should-util": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz",
      "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM="
    },
    "sinon": {
      "version": "2.4.1",
      "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
      "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
      "dev": true,
      "requires": {
        "diff": "^3.1.0",
        "formatio": "1.2.0",
        "lolex": "^1.6.0",
        "native-promise-only": "^0.8.1",
        "path-to-regexp": "^1.7.0",
        "samsam": "^1.1.3",
        "text-encoding": "0.6.4",
        "type-detect": "^4.0.0"
      }
    },
    "supports-color": {
      "version": "5.4.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
      "requires": {
        "has-flag": "^3.0.0"
      }
    },
    "text-encoding": {
      "version": "0.6.4",
      "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
      "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
      "dev": true
    },
    "through": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
    },
    "type-detect": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
      "dev": true
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    },
    "xml2js": {
      "version": "0.4.19",
      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
      "requires": {
        "sax": ">=0.6.0",
        "xmlbuilder": "~9.0.1"
      }
    },
    "xmlbuilder": {
      "version": "9.0.7",
      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
    }
  }
}

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by inspecting the devDependencies entries and reproducing the failure with npm test. Compare the empty versions with the dependency behavior described in the issue, then rerun npm test; done means the development dependencies are versioned and the test suite runs without the reported failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, node.js
Domain
testing-qa, tooling
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.