Comparing version 0.0.0 to 1.0.0
{ | ||
"name": "smoke", | ||
"description": "JS Build Tool", | ||
"author": "Damon Oehlman <damon.oehlman@sidelab.com>", | ||
"tags": [ | ||
"build" | ||
"version": "1.0.0", | ||
"description": "Simple yet powerful file-based mock server", | ||
"main": "smoke.js", | ||
"bin": { | ||
"smoke": "./bin/smoke" | ||
}, | ||
"scripts": { | ||
"lint": "xo", | ||
"lint:fix": "xo --fix", | ||
"start": "smoke test/mocks", | ||
"test": "xo && jest", | ||
"postpublish": "git tag -a $npm_package_version -m \"$npm_package_version\" && git push --tags" | ||
}, | ||
"keywords": [ | ||
"mock", | ||
"server", | ||
"api", | ||
"file", | ||
"file-based", | ||
"json", | ||
"rest", | ||
"template" | ||
], | ||
"version": "0.0.0", | ||
"engines": { | ||
"node": ">= 0.4.x < 0.7.0" | ||
}, | ||
"main": "./lib/smoke.js", | ||
"author": "Yohan Lasorsa", | ||
"license": "MIT", | ||
"dependencies": { | ||
"async": "0.1.x", | ||
"debug": "*", | ||
"findit": "0.1.x", | ||
"minimatch": "0.2.x", | ||
"mkdirp": "0.3.x", | ||
"nopt": "1.x.x", | ||
"pipeline": "git://github.com/DamonOehlman/pipeline.git", | ||
"out": "*", | ||
"sniff": "0.1.x" | ||
"body-parser": "^1.18.3", | ||
"express": "^4.16.4", | ||
"fs-extra": "^7.0.1", | ||
"globby": "^8.0.1", | ||
"import-fresh": "^2.0.0", | ||
"lodash.template": "^4.4.0", | ||
"minimist": "^1.2.0", | ||
"morgan": "^1.9.1", | ||
"multer": "^1.4.1", | ||
"path-to-regexp": "^2.4.0" | ||
}, | ||
"devDependencies": { | ||
"expect.js": "0.1.x", | ||
"mocha": "1.x.x", | ||
"rigger": "0.2.x" | ||
"jest": "^23.6.0", | ||
"supertest": "^3.3.0", | ||
"xo": "^0.23.0" | ||
}, | ||
"optionalDepencies": { | ||
"xo": { | ||
"space": true, | ||
"prettier": true, | ||
"envs": [ | ||
"node", | ||
"jest" | ||
], | ||
"ignores": [ | ||
"test/mocks/**/*" | ||
] | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/DamonOehlman/smoke.git" | ||
}, | ||
"bugs": { | ||
"url": "http://github.com/DamonOehlman/smoke/issues" | ||
}, | ||
"scripts": { | ||
"test": "mocha --reporter spec -t 10000" | ||
}, | ||
"contributors": [], | ||
"optionalDependencies": {} | ||
"engines": { | ||
"node": ">=8.0.0" | ||
} | ||
} |
229
README.md
@@ -1,27 +0,222 @@ | ||
# Smoke | ||
# :dash: smoke | ||
Smoke will be a JS build tool that will replace [Interleave](https://github.com/DamonOehlman/interleave). A lot has been learned over the last six months and it's time to start with a clean slate and create a tool that make it a breeze to build re-usable, tested JS for as many environments as possible. | ||
[![NPM version](https://img.shields.io/npm/v/smoke.svg)](https://www.npmjs.com/package/smoke) | ||
[![Build status](https://img.shields.io/travis/sinedied/smoke/master.svg)](https://travis-ci.org/sinedied/smoke) | ||
![Node version](https://img.shields.io/node/v/smoke.svg) | ||
[![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo) | ||
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) | ||
__CURRENT STATUS:__ [Call for Issues](https://github.com/DamonOehlman/smoke/issues) | ||
> Simple yet powerful file-based mock server | ||
You know best what you need in a build tool. I only know what I need. To make sure what is developed meets the broadest possible requirements please [log issues](https://github.com/DamonOehlman/smoke/issues/new) and engage in discussion. | ||
![demo](https://user-images.githubusercontent.com/593151/49312821-9f2cc680-f4e5-11e8-900a-117120c38422.gif) | ||
## Use Grunt | ||
Just drop a bunch of (JSON) files in a folder and you're ready to go! | ||
After working with the [Grunt API](https://github.com/cowboy/grunt/blob/master/docs/api.md) and successfully integrating Rigger with grunt (via the [grunt-rigger plugin](https://github.com/DamonOehlman/grunt-rigger)) it's highly unlikely that I'm going to put any effort into building __yet another build tool__. Grunt will likely to exactly what you need, and it's got some great features already baked in that make it a whole pile of JS build yumminess. You should definitely try it out! | ||
#### Basic mock example: | ||
1. Start the server: `smoke` | ||
2. Create a file named `get_api#hello.json`: | ||
```json | ||
{ | ||
"message": "hello world!" | ||
} | ||
``` | ||
3. Test the mock: `curl http://localhost:3000/api/hello` | ||
## General Design Goals | ||
#### Features | ||
1. Very [Stream](http://nodejs.org/docs/latest/api/stream.html) centric. | ||
2. Pluggable API | ||
3. Do as little as possible in the core, with composition through streams (1) and an API (2) this should be absolutely fine. | ||
**Smoke** is a file-based, convention over configuration mock server that can fill your API mocking needs without any | ||
complex setup. Yet, it supports many advanced features and dynamic mocks for almost any situation: | ||
## Component Pieces | ||
- Use folders and file names to describe API routes and REST methods | ||
- Use templates to generate responses based on input queries and route parameters | ||
- Add / edit / remove mocks without restarting the server | ||
- Generate mocks with JavaScript for more complex responses | ||
- Define different mock sets to simulate various scenarii (errors...), with fallback | ||
- Customize headers and status code if needed, automatically detect content-type if not specified | ||
Some of the component pieces required to build smoke have already been built: | ||
## Installation | ||
1. [Rigger](/DamonOehlman/rigger) - Include files in other files | ||
2. [StreamClean](/DamonOehlman/streamclean) - Remove or change lines in a stream | ||
3. [Pipeline](/pgte/pipeline) or [event-stream](/dominictarr/event-stream) - useful helpers for combining streams, and in event event-stream's case nice helpers for making an async function slot into a piped stream simply. | ||
4. [jshint](https://github.com/jshint/node-jshint) | ||
5. [UglifyJS](https://github.com/mishoo/UglifyJS) | ||
```bash | ||
npm install -g smoke | ||
``` | ||
## Usage | ||
See [some example mocks](test/mocks) to quickly get a grasp of the syntax and possibilities. | ||
CLI usage is quite straightforward: | ||
``` | ||
Usage: smoke [<mocks_folder>] [options] | ||
Options: | ||
-p, --port <num> Server port [default: 3000] | ||
-h, --host <host> Server host [default: "localhost"] | ||
-s, --set <name> Mocks set to use [default: none] | ||
-n, --not-found <glob> Mocks for 404 errors [default: "404.*"] | ||
-l, --logs Enable server logs | ||
-v, --version Show version | ||
--help Show help | ||
``` | ||
### File naming | ||
**General format:** `methods_api#route#:param.set.extension` | ||
The path and file name of the mock is used to determinate: | ||
#### Supported HTTP methods | ||
Optionally prefix your file by the HTTP method supported followed by an underscore (for example `get_`). | ||
You can specify multiple methods at once using a `+` to separate them (for example `post+put_`); | ||
If no method is specified, the mock will be used for any HTTP method. | ||
#### Server route and named route parameters | ||
Use any combination of folders or hash-separated components to specify the server route. | ||
For example `api/example/get_hello.json` is equivalent to `get_api#example#hello.json` and will repond to | ||
`GET api/example/hello` requests. | ||
Additionaly, any route component can be defined as a route parameter by prefixing the name with `:`, for example | ||
`api#resource#:id.json` will match `GET api/resource/1` and expose `1` as the value for the `id` parameter that can be | ||
used in dynamic mocks (templates or JavaScript). | ||
#### Content type | ||
The file extension will determine the content type of the response if it's not already specified in a | ||
[custom header](#custom-status-and-headers). | ||
Files with no extension will use the default MIME type `application/octet-stream`. | ||
You can have multiple mocks with the same API route and different file extensions, the server will then use the best | ||
mock depending of the [`Accept` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept) of the | ||
request. | ||
#### Mock set | ||
You can optionally specify a mock set before the file extension by using a `.set-name` suffix after the file name. | ||
For example `get_api#hello.error.json` will only be used if you start the server with the `error` set enabled: | ||
`smoke --set error`. | ||
If you do not specify a mock set on your file name, it will be considered as the default mock for the specified route | ||
and will be used as a fallback if no mock with this set matched. | ||
#### Templates | ||
If you add an underscore `_` after the file extension, the mock will be processed as a template before being sent to | ||
the client. Templates works only on text-based formats. | ||
For example `get_hello.html_` or `get_hello.json_` will be treated as templates. | ||
Every template can use an implicit context object that have these properties defined: | ||
- `method`: the HTTP method of the request (ex: `'GET'`, `'POST'`) | ||
- `query`: map with query parameters that were part of the request URL. For example, matched URL | ||
`http://server/hello?who=world` will result in the query value: `{ who: 'world' }`. | ||
- `params`: map containing matched route parameters. For example the mock `resource#:id.json` with the matched URL | ||
`http://server/resource/123` will result in the params value: `{ id: '123' }`. | ||
- `headers`: map containing request headers | ||
- `body`: the request body. JSON bodies are automatically parsed. | ||
- `files`: if the request includes `multipart/form-data`, this will be the array of uploaded files (see | ||
[multer documentation](https://github.com/expressjs/multer) for more details) | ||
##### Template syntax | ||
- `{{ }}` interpolates data in place | ||
For example, create **get_hello.txt_** with this: | ||
``` | ||
Hello {{query.name}}! | ||
``` | ||
Then `curl "http://localhost:3000/hello?name=John"` returns `Hello John!` | ||
- `{{{ }}}` escapes HTML special chars from interpolated string | ||
For example, create **get_hello.html_** with this: | ||
```html | ||
<h1>Hello {{{query.name}}}!</h1> | ||
``` | ||
Then `curl "http://localhost:3000/hello?name=%3CJack%26Jones%3E"` returns: | ||
```html | ||
<h1>Hello <Jack&Jones>!</h1> | ||
``` | ||
- `<{ }>` evaluates JavaScript to generate data | ||
For example, create **get_hello.html_** with this: | ||
```html | ||
Hello to: | ||
<ul> | ||
<{ query.name.forEach(name => { }><li>{{name}}</li><{ }); }> | ||
</ul> | ||
``` | ||
Then `curl "http://localhost:3000/hello?name=Jack&name=Jones"` returns: | ||
```html | ||
Hello to: | ||
<ul> | ||
<li>Jack</li><li>Jones</li> | ||
</ul> | ||
``` | ||
### Custom status and headers | ||
By default all mocks responses are sent with a status code `200` (OK), or `204` (No content) if a mock file is empty. | ||
You can customize the response status and (optionally) headers with JSON and [JavaScript](#javascript-mocks) files, | ||
using this syntax: | ||
```js | ||
{ | ||
"statusCode": 400, | ||
"body": { | ||
"error": "Bad request" | ||
}, | ||
// headers can be omitted, only use if you want to customize them | ||
"headers": { | ||
"Content-Type": "text/plain" | ||
} | ||
} | ||
``` | ||
### Mock formats | ||
Any file format is supported for mocks, and the file extension will be used to determine the response content type. | ||
Files with no extension will use the default MIME type `application/octet-stream`. | ||
Text formats (for example `.json`, `.html`, `.txt`...) can be processed as [templates](#templates) by adding an | ||
underscore to the file extension. | ||
Note that JSON files and templates must use `UTF-8` encoding. | ||
#### JavaScript mocks | ||
In addition, you can define dynamic mocks using JavaScript by using the `.js` extension, that will be loaded as a regular | ||
NodeJS module. | ||
In that case, your JS module is expected to export a function that take an input data object with the | ||
[same properties](#templates) as for templates and must returns the response body or an | ||
[object](#custom-status-and-headers) containing the status code, headers and body. | ||
Example: | ||
```js | ||
module.exports = (data) => `Your user agent is: ${data.headers['user-agent']}`; | ||
``` | ||
Note that by default, JS mocks use `application/json` for the response content type. If you want to use another type, | ||
you must set the `Content-Type` header yourself, for example: | ||
```js | ||
module.exports = data => ({ | ||
statusCode: 200, | ||
headers: { | ||
'Content-Type': 'text/plain' | ||
}, | ||
body: `Your user agent is: ${data.headers['user-agent']}` | ||
}); | ||
``` | ||
## Other mock servers | ||
If you cannot find what you need here, you might want to check out one of these other mock servers: | ||
- [JSON Server](https://github.com/typicode/json-server) | ||
- [mockserver](https://github.com/namshi/mockserver) | ||
- [node-mock-server](https://github.com/smollweide/node-mock-server) | ||
- [node-easymock](https://github.com/CyberAgent/node-easymock) | ||
- [mockserver-node](https://github.com/jamesdbloom/mockserver-node) |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Git dependency
Supply chain riskContains a dependency which resolves to a remote git URL. Dependencies fetched from git URLs are not immutable can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 1 instance in 1 package
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 2 instances in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
No License Found
License(Experimental) License information could not be found.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
19603
0
275
1
1
223
0
2
10
1
2
+ Addedbody-parser@^1.18.3
+ Addedexpress@^4.16.4
+ Addedfs-extra@^7.0.1
+ Addedglobby@^8.0.1
+ Addedimport-fresh@^2.0.0
+ Addedlodash.template@^4.4.0
+ Addedminimist@^1.2.0
+ Addedmorgan@^1.9.1
+ Addedmulter@^1.4.1
+ Addedpath-to-regexp@^2.4.0
+ Added@mrmlnc/readdir-enhanced@2.2.1(transitive)
+ Added@nodelib/fs.stat@1.1.3(transitive)
+ Addedaccepts@1.3.8(transitive)
+ Addedappend-field@1.0.0(transitive)
+ Addedarr-diff@4.0.0(transitive)
+ Addedarr-flatten@1.1.0(transitive)
+ Addedarr-union@3.1.0(transitive)
+ Addedarray-flatten@1.1.1(transitive)
+ Addedarray-union@1.0.2(transitive)
+ Addedarray-uniq@1.0.3(transitive)
+ Addedarray-unique@0.3.2(transitive)
+ Addedarrify@1.0.1(transitive)
+ Addedassign-symbols@1.0.0(transitive)
+ Addedatob@2.1.2(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbase@0.11.2(transitive)
+ Addedbasic-auth@2.0.1(transitive)
+ Addedbody-parser@1.20.3(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@2.3.2(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedbusboy@0.2.14(transitive)
+ Addedbytes@3.1.2(transitive)
+ Addedcache-base@1.0.1(transitive)
+ Addedcall-bind@1.0.7(transitive)
+ Addedcall-me-maybe@1.0.2(transitive)
+ Addedcaller-callsite@2.0.0(transitive)
+ Addedcaller-path@2.0.0(transitive)
+ Addedcallsites@2.0.0(transitive)
+ Addedclass-utils@0.3.6(transitive)
+ Addedcollection-visit@1.0.0(transitive)
+ Addedcomponent-emitter@1.3.1(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconcat-stream@1.6.2(transitive)
+ Addedcontent-disposition@0.5.4(transitive)
+ Addedcontent-type@1.0.5(transitive)
+ Addedcookie@0.7.1(transitive)
+ Addedcookie-signature@1.0.6(transitive)
+ Addedcopy-descriptor@0.1.1(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addeddebug@2.6.9(transitive)
+ Addeddecode-uri-component@0.2.2(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddefine-property@0.2.51.0.02.0.2(transitive)
+ Addeddepd@2.0.0(transitive)
+ Addeddestroy@1.2.0(transitive)
+ Addeddicer@0.2.5(transitive)
+ Addeddir-glob@2.0.0(transitive)
+ Addedee-first@1.1.1(transitive)
+ Addedencodeurl@1.0.22.0.0(transitive)
+ Addedes-define-property@1.0.0(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedescape-html@1.0.3(transitive)
+ Addedetag@1.8.1(transitive)
+ Addedexpand-brackets@2.1.4(transitive)
+ Addedexpress@4.21.1(transitive)
+ Addedextend-shallow@2.0.13.0.2(transitive)
+ Addedextglob@2.0.4(transitive)
+ Addedfast-glob@2.2.7(transitive)
+ Addedfill-range@4.0.0(transitive)
+ Addedfinalhandler@1.3.1(transitive)
+ Addedfor-in@1.0.2(transitive)
+ Addedforwarded@0.2.0(transitive)
+ Addedfragment-cache@0.2.1(transitive)
+ Addedfresh@0.5.2(transitive)
+ Addedfs-extra@7.0.1(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-intrinsic@1.2.4(transitive)
+ Addedget-value@2.0.6(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglob-parent@3.1.0(transitive)
+ Addedglob-to-regexp@0.3.0(transitive)
+ Addedglobby@8.0.2(transitive)
+ Addedgopd@1.0.1(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-proto@1.0.3(transitive)
+ Addedhas-symbols@1.0.3(transitive)
+ Addedhas-value@0.3.11.0.0(transitive)
+ Addedhas-values@0.1.41.0.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhttp-errors@2.0.0(transitive)
+ Addediconv-lite@0.4.24(transitive)
+ Addedignore@3.3.10(transitive)
+ Addedimport-fresh@2.0.0(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedipaddr.js@1.9.1(transitive)
+ Addedis-accessor-descriptor@1.0.1(transitive)
+ Addedis-buffer@1.1.6(transitive)
+ Addedis-data-descriptor@1.0.1(transitive)
+ Addedis-descriptor@0.1.71.0.3(transitive)
+ Addedis-extendable@0.1.11.0.1(transitive)
+ Addedis-extglob@2.1.1(transitive)
+ Addedis-glob@3.1.04.0.3(transitive)
+ Addedis-number@3.0.0(transitive)
+ Addedis-plain-object@2.0.4(transitive)
+ Addedis-windows@1.0.2(transitive)
+ Addedisarray@0.0.11.0.0(transitive)
+ Addedisobject@2.1.03.0.1(transitive)
+ Addedjsonfile@4.0.0(transitive)
+ Addedkind-of@3.2.24.0.06.0.3(transitive)
+ Addedlodash._reinterpolate@3.0.0(transitive)
+ Addedlodash.template@4.5.0(transitive)
+ Addedlodash.templatesettings@4.2.0(transitive)
+ Addedmap-cache@0.2.2(transitive)
+ Addedmap-visit@1.0.0(transitive)
+ Addedmedia-typer@0.3.0(transitive)
+ Addedmerge-descriptors@1.0.3(transitive)
+ Addedmerge2@1.4.1(transitive)
+ Addedmethods@1.1.2(transitive)
+ Addedmicromatch@3.1.10(transitive)
+ Addedmime@1.6.0(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmixin-deep@1.3.2(transitive)
+ Addedmkdirp@0.5.6(transitive)
+ Addedmorgan@1.10.0(transitive)
+ Addedms@2.0.0(transitive)
+ Addedmulter@1.4.4(transitive)
+ Addednanomatch@1.2.13(transitive)
+ Addednegotiator@0.6.3(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedobject-copy@0.1.0(transitive)
+ Addedobject-inspect@1.13.3(transitive)
+ Addedobject-visit@1.0.1(transitive)
+ Addedobject.pick@1.3.0(transitive)
+ Addedon-finished@2.3.02.4.1(transitive)
+ Addedon-headers@1.0.2(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedparseurl@1.3.3(transitive)
+ Addedpascalcase@0.1.1(transitive)
+ Addedpath-dirname@1.0.2(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-to-regexp@0.1.102.4.0(transitive)
+ Addedpath-type@3.0.0(transitive)
+ Addedpify@3.0.0(transitive)
+ Addedposix-character-classes@0.1.1(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedproxy-addr@2.0.7(transitive)
+ Addedqs@6.13.0(transitive)
+ Addedrange-parser@1.2.1(transitive)
+ Addedraw-body@2.5.2(transitive)
+ Addedreadable-stream@1.1.142.3.8(transitive)
+ Addedregex-not@1.0.2(transitive)
+ Addedrepeat-element@1.1.4(transitive)
+ Addedrepeat-string@1.6.1(transitive)
+ Addedresolve-from@3.0.0(transitive)
+ Addedresolve-url@0.2.1(transitive)
+ Addedret@0.1.15(transitive)
+ Addedsafe-buffer@5.1.25.2.1(transitive)
+ Addedsafe-regex@1.1.0(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsend@0.19.0(transitive)
+ Addedserve-static@1.16.2(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedset-value@2.0.1(transitive)
+ Addedsetprototypeof@1.2.0(transitive)
+ Addedside-channel@1.0.6(transitive)
+ Addedslash@1.0.0(transitive)
+ Addedsnapdragon@0.8.2(transitive)
+ Addedsnapdragon-node@2.1.1(transitive)
+ Addedsnapdragon-util@3.0.1(transitive)
+ Addedsource-map@0.5.7(transitive)
+ Addedsource-map-resolve@0.5.3(transitive)
+ Addedsource-map-url@0.4.1(transitive)
+ Addedsplit-string@3.1.0(transitive)
+ Addedstatic-extend@0.1.2(transitive)
+ Addedstatuses@2.0.1(transitive)
+ Addedstreamsearch@0.1.2(transitive)
+ Addedstring_decoder@0.10.311.1.1(transitive)
+ Addedto-object-path@0.3.0(transitive)
+ Addedto-regex@3.0.2(transitive)
+ Addedto-regex-range@2.1.1(transitive)
+ Addedtoidentifier@1.0.1(transitive)
+ Addedtype-is@1.6.18(transitive)
+ Addedtypedarray@0.0.6(transitive)
+ Addedunion-value@1.0.1(transitive)
+ Addeduniversalify@0.1.2(transitive)
+ Addedunpipe@1.0.0(transitive)
+ Addedunset-value@1.0.0(transitive)
+ Addedurix@0.1.0(transitive)
+ Addeduse@3.1.1(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedutils-merge@1.0.1(transitive)
+ Addedvary@1.1.2(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedxtend@4.0.2(transitive)
- Removedasync@0.1.x
- Removeddebug@*
- Removedfindit@0.1.x
- Removedminimatch@0.2.x
- Removedmkdirp@0.3.x
- Removednopt@1.x.x
- Removedout@*
- Removedpipeline@git://github.com/DamonOehlman/pipeline.git
- Removedsniff@0.1.x
- Removedabbrev@1.1.1(transitive)
- Removedasync@0.1.22(transitive)
- Removedchainsaw@0.0.9(transitive)
- Removeddebug@4.3.7(transitive)
- Removedfindit@0.1.2(transitive)
- Removedhashish@0.0.4(transitive)
- Removedlru-cache@2.7.3(transitive)
- Removedminimatch@0.2.14(transitive)
- Removedmkdirp@0.3.5(transitive)
- Removednopt@1.0.10(transitive)
- Removedout@1.1.0(transitive)
- Removedseq@0.3.5(transitive)
- Removedsigmund@1.0.1(transitive)
- Removedsniff@0.1.3(transitive)
- Removedtraverse@0.3.9(transitive)