├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── README.md ├── circle.yml ├── hermes.jpg ├── index.js ├── lib └── hermes.js ├── package-lock.json └── package.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 2 | 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | insert_final_newline = true 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | indent_style = space 11 | indent_size = 2 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hitchhq/hermes/8d501ca256a6c6ce3e0b53cdfd696dc63b1312c2/.eslintignore -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | env: 2 | node: true 3 | es6: true 4 | 5 | ecmaFeatures: 6 | forOf: true 7 | 8 | rules: 9 | # Ignore Rules 10 | strict: 0 11 | no-underscore-dangle: 0 12 | no-mixed-requires: 0 13 | no-process-exit: 0 14 | no-warning-comments: 0 15 | curly: 0 16 | no-multi-spaces: 0 17 | no-alert: 0 18 | consistent-return: 0 19 | consistent-this: [0, self] 20 | func-style: 0 21 | max-nested-callbacks: 0 22 | 23 | # Warnings 24 | no-debugger: 1 25 | no-empty: 1 26 | no-invalid-regexp: 1 27 | no-unused-expressions: 1 28 | no-native-reassign: 1 29 | no-fallthrough: 1 30 | camelcase: 0 31 | 32 | # Errors 33 | eqeqeq: 2 34 | no-undef: 2 35 | no-dupe-keys: 2 36 | no-empty-character-class: 2 37 | no-self-compare: 2 38 | valid-typeof: 2 39 | no-unused-vars: 2 40 | handle-callback-err: 2 41 | no-shadow-restricted-names: 2 42 | no-new-require: 2 43 | no-mixed-spaces-and-tabs: 2 44 | block-scoped-var: 2 45 | no-else-return: 2 46 | no-throw-literal: 2 47 | no-void: 2 48 | radix: 2 49 | wrap-iife: [2, outside] 50 | no-shadow: 0 51 | no-use-before-define: [2, nofunc] 52 | no-path-concat: 2 53 | valid-jsdoc: [0, {requireReturn: false, requireParamDescription: false, requireReturnDescription: false}] 54 | 55 | # stylistic errors 56 | no-spaced-func: 2 57 | semi-spacing: 2 58 | quotes: [2, 'single'] 59 | key-spacing: [2, { beforeColon: false, afterColon: true }] 60 | indent: [2, 2] 61 | no-lonely-if: 2 62 | no-floating-decimal: 2 63 | brace-style: [2, 1tbs, { allowSingleLine: true }] 64 | comma-style: [2, last] 65 | new-cap: [2, {capIsNewExceptions: [JID]}] 66 | no-inline-comments: 2 67 | no-multiple-empty-lines: [2, {max: 1}] 68 | no-nested-ternary: 2 69 | operator-assignment: [2, always] 70 | padded-blocks: [2, never] 71 | quote-props: [2, as-needed] 72 | space-before-function-paren: [2, always] 73 | keyword-spacing: ['error', {'before': true, 'after': true, 'overrides': {}}] 74 | space-before-blocks: [2, always] 75 | array-bracket-spacing: [2, never] 76 | computed-property-spacing: [2, never] 77 | space-in-parens: [2, never] 78 | space-unary-ops: [2, {words: true, nonwords: false}] 79 | wrap-regex: 2 80 | linebreak-style: [2, unix] 81 | semi: [2, always] 82 | arrow-spacing: [2, {before: true, after: true}] 83 | no-class-assign: 2 84 | no-const-assign: 2 85 | no-dupe-class-members: 2 86 | no-this-before-super: 2 87 | no-var: 2 88 | object-shorthand: [2, always] 89 | prefer-arrow-callback: 2 90 | prefer-const: 2 91 | prefer-template: 2 92 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | npm-debug.log 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | hermes.jpg 2 | .editorconfig 3 | .eslintignore 4 | .eslintrc 5 | .gitignore 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://raw.githubusercontent.com/hitchhq/hermes/master/hermes.jpg) 2 | 3 | **Hermes is a real-time messaging framework**. It lets you connect a client with a 4 | broker and manage all the communication in between. 5 | 6 | ## Installation 7 | 8 | ``` 9 | npm install --save hermesjs 10 | ``` 11 | 12 | ## Features 13 | 14 | * Express-like Routing and middlewares. 15 | * Forwarding messages from **Client** to **Broker** and viceversa. 16 | * Cancel the delivery (message will continue passing through middlewares, if any). 17 | * Stop the message (message will not continue passing through middlewares). 18 | * Answer back to client or broker, using same or different topic and payload. 19 | 20 | ## Getting Started 21 | 22 | Check [examples repo](https://github.com/hitchhq/hermes-examples). 23 | 24 | ## API 25 | 26 | ### App 27 | 28 | #### Constructor 29 | 30 | Initializing a Hermes app is actually really easy: 31 | 32 | ```js 33 | const hermes = require('hermesjs'); 34 | const app = hermes(); 35 | ``` 36 | 37 | #### app.add(key, value) 38 | 39 | This method is used to add configuration parameters to your Hermes app. Special 40 | keys are `client` and `broker`. 41 | 42 | For instance, you can specify your Socket.IO client adapter: 43 | 44 | ```js 45 | const socketio_adapter = require('hermesjs-socketio'); 46 | const socketio = socketio_adapter(); 47 | 48 | app.add('client', socketio); 49 | ``` 50 | 51 | or you can specify your MQTT broker adapter: 52 | 53 | ```js 54 | const mqtt_broker = require('hermesjs-mqtt'); 55 | 56 | const mqtt = mqtt_broker({ 57 | host_url: 'mqtt://test.mosquitto.org', 58 | topics: 'hello/#' 59 | }); 60 | 61 | app.add('broker', mqtt); 62 | ``` 63 | 64 | #### app.use(...fn) 65 | #### app.use(route, ...fn) 66 | #### app.use(route, HermesRouter) 67 | 68 | Use middlewares and routes. If you know how Connect/Express works, it's exactly the same: 69 | 70 | **Middlewares:** 71 | 72 | ```js 73 | app.use((message, next) => { 74 | if (message.payload === 'Hello!') { 75 | console.log('-.- Hi!'); 76 | } 77 | next(); 78 | }); 79 | ``` 80 | 81 | **Routes:** 82 | 83 | ```js 84 | app.use('hello/:name', (message, next) => { 85 | console.log(`Hello ${message.route.params.name}!`); 86 | next(); 87 | }); 88 | ``` 89 | 90 | **HermesRouter** 91 | 92 | `index.js` 93 | ```js 94 | const hello = require('./routes/hello'); 95 | 96 | app.use('hello', hello); 97 | ``` 98 | 99 | `routes/hello.js` 100 | ```js 101 | const router = require('hermes').router(); 102 | 103 | router.use(':name', (message, next) => { 104 | console.log(`Hello ${message.route.params.name}!`); 105 | next(); 106 | }); 107 | 108 | router.use('world', (message, next) => { 109 | console.log(`Hello world!`); 110 | next(); 111 | }); 112 | 113 | router.in.client.use(':name', (message, next) => { 114 | message.reply('hello/response', { msg: `Hello ${message.route.params.name} from Hermes!` }); 115 | }); 116 | 117 | module.exports = router; 118 | ``` 119 | 120 | **Catch Errors** 121 | 122 | ```js 123 | app.use((err, message, next) => { 124 | console.log('Handle error here...'); 125 | next(err); // Optionally forward error to next middleware 126 | }); 127 | ``` 128 | 129 | #### app.in.client.use(...fn) 130 | #### app.in.client.use(route, ...fn) 131 | #### app.in.client.use(route, HermesRouter) 132 | 133 | It's for the same purpose as `app.use` but this route/middleware will be only 134 | executed if the message comes from the client. 135 | 136 | ```js 137 | app.in.client.use('hello/:name', (message, next) => { 138 | console.log(`Hello from client, ${message.route.params.name}!`); 139 | next(); 140 | }); 141 | ``` 142 | 143 | #### app.in.broker.use(...fn) 144 | #### app.in.broker.use(route, ...fn) 145 | #### app.in.broker.use(route, HermesRouter) 146 | 147 | It's for the same purpose as `app.use` but this route/middleware will be only 148 | executed if the message comes from the broker. 149 | 150 | ```js 151 | app.in.broker.use('hello/:name', (message, next) => { 152 | console.log(`Hello from broker, ${message.route.params.name}!`); 153 | next(); 154 | }); 155 | ``` 156 | 157 | #### app.from.broker.send(message) 158 | 159 | It will inject a message into the middleware pipeline as if it were coming from the broker. `message` 160 | can be either an object containing `topic` and `payload` or a HermesMessage instance. 161 | 162 | ```js 163 | app.from.broker.send({ 164 | topic: 'hello/fran', 165 | payload: { 166 | greetings: 'Greetings from the broker' 167 | } 168 | }); 169 | ``` 170 | 171 | #### app.from.client.send(message) 172 | 173 | It will inject a message into the middleware pipeline as if it were coming from the client. `message` 174 | can be either an object containing `topic` and `payload` or a HermesMessage instance. 175 | 176 | ```js 177 | app.from.client.send({ 178 | topic: 'hello/fran', 179 | payload: { 180 | greetings: 'Greetings from the client' 181 | } 182 | }); 183 | ``` 184 | 185 | #### app.listen() 186 | 187 | Actually starts the application and listens for messages: 188 | 189 | ```js 190 | app.listen(); 191 | ``` 192 | 193 | ### Message 194 | 195 | #### message.stop() 196 | 197 | It stops the message from being delivered and processed by another middleware. It other words, 198 | this is a **full stop**. Message piping ends here. 199 | 200 | ```js 201 | app.use('hello/:name', (message, next) => { 202 | // This will stop the hello/world message. Even if we call 203 | // next, further middlewares will not be called. 204 | if (message.route.params.name === 'world') message.stop(); 205 | next(); 206 | }); 207 | ``` 208 | 209 | #### message.cancelDelivery() 210 | 211 | It cancels the delivery of the message but, unlike `message.stop()` the message will continue 212 | passing through the next middlewares. 213 | 214 | ```js 215 | function checkIsHelloWorld (message, next) { 216 | // Message will not reach the other side if its topic is hello/world. 217 | // If the message comes from the client it will never reach the broker and viceversa. 218 | // However the message will still be routed onto next middlewares, if any. 219 | if (message.route.params.name === 'world') return message.cancelDelivery(); 220 | } 221 | 222 | app.use('hello/:name', checkIsHelloWorld, (message, next) => { 223 | console.log('You will see this even if it is hello/world. Read comments above.'); 224 | next(); 225 | }); 226 | ``` 227 | 228 | #### message.reply([[topic,] payload]) 229 | 230 | Replies back to the message sender. If the message was sent by client, it will reply to 231 | client. If message was sent by broker, it will reply to broker. It's easy, huh? 232 | 233 | ```js 234 | app.in.client.use('hello/:name', (message, next) => { 235 | if (message.route.params.name === 'world') { 236 | return message.reply('hello/world/response', 'Stop using hello world, please.'); 237 | } 238 | 239 | next(); 240 | }); 241 | ``` 242 | 243 | `topic` and `payload` arguments are both optional. Here you have a short explanation of every combination: 244 | 245 | * `message.reply()`: It replies back to the same topic using same payload (echo). 246 | * `message.reply(payload)`: It replies back to the same topic using the given payload. 247 | * `message.reply(topic)`: It replies back to the the given topic using the same payload. 248 | * `message.reply(topic, payload)`: It replies back to the the given topic using the given payload. 249 | 250 | #### message.route.params 251 | 252 | Object containing all the params in the message topic, i.e.: 253 | 254 | ```js 255 | app.in.broker.use('hello/:name/:surname', (message, next) => { 256 | // Given the `hello/tim/burton` topic, the params will look like: 257 | // message.route.params = { 258 | // name: 'tim', 259 | // surname: 'burton' 260 | // } 261 | } 262 | }); 263 | ``` 264 | 265 | ## Adapters 266 | 267 | * MQTT adapter: https://github.com/hitchhq/hermes-mqtt 268 | * Socket.IO adapter: https://github.com/hitchhq/hermes-socketio 269 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | deployment: 2 | npm: 3 | branch: master 4 | commands: 5 | # login using environment variables 6 | - echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login 7 | - npm run 2npm 8 | 9 | test: 10 | override: 11 | - echo "OK" 12 | 13 | general: 14 | branches: 15 | only: 16 | - master 17 | - develop 18 | -------------------------------------------------------------------------------- /hermes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hitchhq/hermes/8d501ca256a6c6ce3e0b53cdfd696dc63b1312c2/hermes.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/hermes'); 2 | -------------------------------------------------------------------------------- /lib/hermes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const EventEmitter = require('events').EventEmitter; 4 | const debug = require('debug')('hermes'); 5 | const merge = require('utils-merge'); 6 | const pathToRegexp = require('path-to-regexp'); 7 | const flatten = require('array-flatten'); 8 | const router = require('hermesjs-router'); 9 | const HermesMessage = require('hermesjs-message'); 10 | 11 | module.exports = Hermes; 12 | 13 | const proto = { 14 | in: { client: {}, broker: {} }, 15 | from: { client: {}, broker: {} } 16 | }; 17 | 18 | function Hermes () { 19 | function app (message, next) { app.handle(message, next); } 20 | merge(app, proto); 21 | merge(app, EventEmitter.prototype); 22 | app.in.broker.use = proto.in.broker.use.bind(app); 23 | app.in.client.use = proto.in.client.use.bind(app); 24 | app.from.broker.use = proto.in.broker.use.bind(app); 25 | app.from.client.use = proto.in.client.use.bind(app); 26 | sendMessage = sendMessage.bind(app); 27 | app.route = '*'; 28 | app.stack = []; 29 | app.props = { 30 | brokers: [], 31 | clients: [] 32 | }; 33 | 34 | app.on('broker:message', (message) => { 35 | message.from = { client: false, broker: true }; 36 | app.handle(message); 37 | }); 38 | 39 | app.on('broker:ready', (adapter_info) => { 40 | debug(`${adapter_info.name} is ready`); 41 | }); 42 | 43 | app.on('client:ready', (adapter_info) => { 44 | debug(`${adapter_info.name} is ready`); 45 | }); 46 | 47 | app.on('client:message', (message) => { 48 | message.from = { client: true, broker: false }; 49 | app.handle(message); 50 | }); 51 | 52 | return app; 53 | } 54 | 55 | Hermes.router = router; 56 | 57 | function _parseUseArgs (route) { 58 | let path = route; 59 | let callbacks; 60 | 61 | if (_isRouter(path)) { 62 | path = null; 63 | callbacks = flatten([].slice.call(arguments, 0)); 64 | } else if (typeof path !== 'string') { 65 | path = '*'; 66 | callbacks = flatten([].slice.call(arguments, 0)); 67 | } else { 68 | callbacks = flatten([].slice.call(arguments, 1)); 69 | } 70 | 71 | // strip trailing slash 72 | if (path && path[path.length - 1] === '/') { 73 | path = path.slice(0, -1); 74 | } 75 | 76 | if (callbacks.length === 0) { 77 | throw new TypeError('Hermes.use() requires middleware functions'); 78 | } 79 | 80 | return { path, callbacks }; 81 | } 82 | 83 | /** 84 | * Utilize the given middleware `handle` to the given `route`, 85 | * defaulting to _*_. This "route" is the mount-point for the 86 | * middleware, when given a value other than _*_ the middleware 87 | * is only effective when that segment is present in the message's 88 | * topic. 89 | * 90 | * @param {String|Function|HermesRouter} route, callback or router 91 | * @param {Function|HermesRouter} callback or router 92 | * @return {Hermes} for chaining 93 | * @public 94 | */ 95 | proto.use = function use () { 96 | const parsed_args = _parseUseArgs.apply(this, arguments); 97 | const path = parsed_args.path; 98 | const callbacks = parsed_args.callbacks; 99 | const is_router = callbacks.length === 1 && _isRouter(callbacks[0]); 100 | 101 | if (path && is_router) { 102 | _useRouter.call(this, path, callbacks[0], 'all'); 103 | } else if (path && callbacks.length) { 104 | _use.call(this, path, callbacks); 105 | } else if (!path && is_router) { 106 | _useRouter.call(this, '', callbacks[0], 'all'); 107 | } else if (!path && callbacks) { 108 | _use.call(this, '*', callbacks); 109 | } 110 | 111 | return this; 112 | }; 113 | 114 | function _use (path, callbacks) { 115 | for (let i = 0; i < callbacks.length; i++) { 116 | const fn = callbacks[i]; 117 | 118 | if (typeof fn !== 'function') { 119 | throw new TypeError(`Hermes.use() requires middleware function but got a ${gettype(fn)}.`); 120 | } 121 | 122 | debug('use %s %s', path, fn.name || ''); 123 | 124 | // add the middleware 125 | this.stack.push({ route: path, handle: fn }); 126 | } 127 | } 128 | 129 | function _isRouter (fn) { 130 | return fn && fn.constructor && fn.constructor.name === 'HermesRouter'; 131 | } 132 | 133 | function _useRouter (path, router, target) { 134 | const middlewares = router.getMiddlewares(); 135 | const default_target = 'all'; 136 | target = target || default_target; 137 | 138 | for (const m of middlewares) { 139 | if (target === 'all' && m.target === 'all') this.use.apply(this, _useNamespacePath(m.arguments, path)); 140 | if (target === 'all' && m.target === 'client') this.in.client.use.apply(this, _useNamespacePath(m.arguments, path)); 141 | if (target === 'all' && m.target === 'broker') this.in.broker.use.apply(this, _useNamespacePath(m.arguments, path)); 142 | if (target === 'client' && m.target === 'client') this.in.client.use.apply(this, _useNamespacePath(m.arguments, path)); 143 | if (target === 'broker' && m.target === 'broker') this.in.broker.use.apply(this, _useNamespacePath(m.arguments, path)); 144 | } 145 | } 146 | 147 | function _useNamespacePath (args, path) { 148 | if (args && typeof args[0] === 'string') { 149 | args[0] = sanitizeRoute(`${path}/${args[0]}`); 150 | } 151 | 152 | return args; 153 | } 154 | 155 | proto.in.client.use = function inClientUse () { 156 | const parsed_args = _parseUseArgs.apply(this, arguments); 157 | const path = parsed_args.path; 158 | const callbacks = parsed_args.callbacks; 159 | 160 | if (_isRouter(path, callbacks)) { 161 | _useRouter.call(this, path, callbacks[0], 'client'); 162 | } else { 163 | _inClientUse.call(this, path, callbacks); 164 | } 165 | 166 | return this; 167 | }; 168 | 169 | function _inClientUse (path, callbacks) { 170 | for (let i = 0; i < callbacks.length; i++) { 171 | const fn = callbacks[i]; 172 | 173 | if (typeof fn !== 'function') { 174 | throw new TypeError(`Hermes.in.client.use() requires middleware function but got a ${gettype(fn)}.`); 175 | } 176 | 177 | debug('use %s %s', path, fn.name || ''); 178 | 179 | const wrapped_fn = function (message, next) { 180 | if (message.from.broker) return next(); 181 | fn.call(this, message, next); 182 | }; 183 | 184 | // add the middleware 185 | this.stack.push({ route: path, handle: wrapped_fn }); 186 | } 187 | } 188 | 189 | proto.in.broker.use = function inBrokerUse () { 190 | const parsed_args = _parseUseArgs.apply(this, arguments); 191 | const path = parsed_args.path; 192 | const callbacks = parsed_args.callbacks; 193 | 194 | if (_isRouter(path, callbacks)) { 195 | _useRouter.call(this, path, callbacks[0], 'broker'); 196 | } else { 197 | _inBrokerUse.call(this, path, callbacks); 198 | } 199 | 200 | return this; 201 | }; 202 | 203 | function _inBrokerUse (path, callbacks) { 204 | for (let i = 0; i < callbacks.length; i++) { 205 | const fn = callbacks[i]; 206 | 207 | if (typeof fn !== 'function') { 208 | throw new TypeError(`Hermes.in.broker.use() requires middleware function but got a ${gettype(fn)}.`); 209 | } 210 | 211 | debug('use %s %s', path, fn.name || ''); 212 | 213 | const wrapped_fn = function (message, next) { 214 | if (message.from.client) return next(); 215 | fn.call(this, message, next); 216 | }; 217 | 218 | // add the middleware 219 | this.stack.push({ route: path, handle: wrapped_fn }); 220 | } 221 | } 222 | 223 | /** 224 | * Handle messages, punting them down 225 | * the middleware stack. 226 | * 227 | * @private 228 | */ 229 | proto.handle = function handle (message, out) { 230 | let index = 0; 231 | const stack = this.stack; 232 | 233 | // final function handler 234 | const done = out || finalhandler.call(this, message); 235 | 236 | // store the original URL 237 | message.original_topic = message.original_topic || message.topic; 238 | 239 | function next (err) { 240 | // next callback 241 | const layer = stack[index++]; 242 | 243 | // all done 244 | if (!layer) { 245 | setImmediate(done, err); 246 | return; 247 | } 248 | 249 | if (err) { 250 | call(layer.handle, null, err, null, next); 251 | return; 252 | } 253 | 254 | message.topic = sanitizeRoute(message.topic); 255 | 256 | if (message.stopped) { 257 | done.stopped = true; 258 | setImmediate(done, err); 259 | return; 260 | } 261 | if (message.cancel_delivery) done.cancel_delivery = true; 262 | 263 | const path = sanitizeRoute(message.topic || '*'); 264 | const route = sanitizeRoute(layer.route); 265 | const match_result = matchRoute(path, route); 266 | const match = match_result.matches; 267 | 268 | debug('Trying match %s on route %s', path, route); 269 | 270 | // skip this layer if the route doesn't match 271 | if (!match) return next(err); 272 | 273 | debug('%s matches %s route', path, route); 274 | 275 | if (match_result.params) { 276 | message.route = message.route || { path }; 277 | message.route.params = match_result.params; 278 | } 279 | 280 | // call the layer handle 281 | call(layer.handle, route, err, message, next); 282 | } 283 | 284 | next(message instanceof Error ? message : undefined); 285 | }; 286 | 287 | proto.listen = function listen () { 288 | for (const adapter of this.get('brokers')) { 289 | adapter.listen.apply(adapter, arguments); 290 | } 291 | for (const adapter of this.get('clients')) { 292 | adapter.listen.apply(adapter, arguments); 293 | } 294 | 295 | return this; 296 | }; 297 | 298 | /** 299 | * Invoke a route handle. 300 | * @private 301 | */ 302 | function call (handle, route, err, message, next) { 303 | const arity = handle.length; 304 | let error = err; 305 | const hasError = Boolean(err); 306 | 307 | try { 308 | if (hasError && arity === 3) { 309 | // error-handling middleware 310 | handle(err, message, next); 311 | return; 312 | } else if (!hasError && arity < 3) { 313 | // message-handling middleware 314 | handle(message, next); 315 | return; 316 | } 317 | } catch (e) { 318 | // replace the error 319 | error = e; 320 | } 321 | 322 | // continue 323 | next(error); 324 | } 325 | 326 | function finalhandler (message) { 327 | const hermes = this; 328 | 329 | function handler (err) { 330 | if (err) return; 331 | 332 | if (message.stopped) { 333 | debug('Final handler (message stopped)'); 334 | return; 335 | } 336 | 337 | if (handler.cancel_delivery) { 338 | debug('Final handler (cancelled delivery)'); 339 | return; 340 | } 341 | 342 | if (message.from.broker) { 343 | for (const adapter of hermes.get('clients')) { 344 | adapter.send(message); 345 | } 346 | } 347 | 348 | if (message.from.client) { 349 | for (const adapter of hermes.get('brokers')) { 350 | adapter.send(message); 351 | } 352 | } 353 | } 354 | return handler; 355 | } 356 | 357 | /** 358 | * Get type for error message. 359 | */ 360 | function gettype (obj) { 361 | const type = typeof obj; 362 | 363 | if (type !== 'object') { 364 | return type; 365 | } 366 | 367 | // inspect [[Class]] for objects 368 | return toString.call(obj) 369 | .replace(/^\[object (\S+)\]$/, '$1'); 370 | } 371 | 372 | /** 373 | * Adds configuration. 374 | * 375 | * @param {String} property 376 | * @param {Any} value 377 | */ 378 | proto.add = function (property, value) { 379 | switch (property) { 380 | case 'broker': 381 | _addBroker.call(this, value); 382 | break; 383 | case 'client': 384 | _addClient.call(this, value); 385 | break; 386 | default: 387 | this.props[property] = this.props[property] || []; 388 | this.props[property].push(value); 389 | } 390 | }; 391 | 392 | /** 393 | * Adds a connection to a Broker. 394 | * 395 | * @param {Function} broker adapter 396 | */ 397 | function _addBroker (adapter) { 398 | if (typeof adapter !== 'function') throw new Error('Invalid broker adapter. Adapters must be functions.'); 399 | this.props['brokers'].push(adapter(this)); 400 | debug('Using broker'); 401 | }; 402 | 403 | /** 404 | * Adds a connection to a Client. 405 | * 406 | * @param {Function} client adapter 407 | */ 408 | function _addClient (adapter) { 409 | if (typeof adapter !== 'function') throw new Error('Invalid client adapter. Adapters must be functions.'); 410 | this.props['clients'].push(adapter(this)); 411 | debug('Using client'); 412 | }; 413 | 414 | /** 415 | * Gets a configuration property. 416 | * 417 | * @param {String} property 418 | * @returns {Any} 419 | */ 420 | proto.get = function (property) { 421 | return this.props[property]; 422 | }; 423 | 424 | function sanitizeRoute (route) { 425 | route = route.replace(/[\/]{2,}/g, '/'); 426 | if (route[0] === '/') route = route.substr(1); 427 | if (route[route.length-1] === '/') route = route.slice(0, -1); 428 | return route; 429 | } 430 | 431 | function matchRoute (path, route) { 432 | const keys = []; 433 | const re = pathToRegexp(route, keys); 434 | const result = re.exec(path); 435 | 436 | if (result === null) return { matches: false }; 437 | 438 | const params = {}; 439 | keys.map((key, i) => params[key.name] = result[i+1]); 440 | 441 | return { matches: true, params, part: result[0] }; 442 | } 443 | 444 | /** 445 | * Introduces a message into the pipeline as if coming from a client adapter. 446 | * 447 | * @param {HermesMessage|Object} message 448 | * @param {String} message.topic Message topic 449 | * @param {Any} message.payload Message payload 450 | */ 451 | proto.from.client.send = function (message) { 452 | sendMessage('client', message); 453 | }; 454 | 455 | /** 456 | * Introduces a message into the pipeline as if coming from a broker adapter. 457 | * 458 | * @param {HermesMessage|Object} message 459 | * @param {String} message.topic Message topic 460 | * @param {Any} message.payload Message payload 461 | */ 462 | proto.from.broker.send = function (message) { 463 | sendMessage('broker', message); 464 | }; 465 | 466 | function sendMessage (from, message) { 467 | if (typeof message !== 'object') throw new Error(`hermes#from.${from}.send: message must be either an object or a HermesMessage.`); 468 | if (typeof message.topic !== 'string') throw new Error(`hermes#from.${from}.send: message.topic must be a string.`); 469 | if (message.payload === undefined || message.payload === null) throw new Error(`hermes#from.${from}.send: message.payload is required can not be null.`); 470 | 471 | this.emit(`${from}:message`, message instanceof HermesMessage ? message : new HermesMessage(message)); 472 | } 473 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hermesjs", 3 | "version": "1.3.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "file:file:.packages/abbrev-1.0.9.tgz", 9 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 10 | "dev": true 11 | }, 12 | "ansi": { 13 | "version": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", 14 | "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", 15 | "dev": true 16 | }, 17 | "ansicolors": { 18 | "version": "0.3.2", 19 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", 20 | "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", 21 | "dev": true 22 | }, 23 | "ansistyles": { 24 | "version": "0.1.3", 25 | "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", 26 | "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=", 27 | "dev": true 28 | }, 29 | "are-we-there-yet": { 30 | "version": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", 31 | "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", 32 | "dev": true, 33 | "requires": { 34 | "delegates": "file:file:.packages/delegates-1.0.0.tgz", 35 | "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" 36 | } 37 | }, 38 | "array-flatten": { 39 | "version": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.0.tgz", 40 | "integrity": "sha1-JqaSyDiB/Gjaw+xdHwwbSb8jBNk=" 41 | }, 42 | "asap": { 43 | "version": "2.0.6", 44 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 45 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 46 | "dev": true 47 | }, 48 | "async-some": { 49 | "version": "1.0.2", 50 | "resolved": "https://registry.npmjs.org/async-some/-/async-some-1.0.2.tgz", 51 | "integrity": "sha1-TYqBYg1ZWHkbW5j4AtMgd3bpVQk=", 52 | "dev": true, 53 | "requires": { 54 | "dezalgo": "1.0.3" 55 | } 56 | }, 57 | "balanced-match": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 60 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 61 | "dev": true 62 | }, 63 | "block-stream": { 64 | "version": "0.0.9", 65 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 66 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 67 | "dev": true, 68 | "requires": { 69 | "inherits": "file:file:.packages/inherits-2.0.1.tgz" 70 | } 71 | }, 72 | "brace-expansion": { 73 | "version": "1.1.8", 74 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 75 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 76 | "dev": true, 77 | "requires": { 78 | "balanced-match": "1.0.0", 79 | "concat-map": "0.0.1" 80 | } 81 | }, 82 | "buffer-shims": { 83 | "version": "file:file:.packages/buffer-shims-1.0.0.tgz", 84 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", 85 | "dev": true 86 | }, 87 | "builtin-modules": { 88 | "version": "1.1.1", 89 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 90 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 91 | "dev": true 92 | }, 93 | "builtins": { 94 | "version": "0.0.7", 95 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", 96 | "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", 97 | "dev": true 98 | }, 99 | "concat-map": { 100 | "version": "0.0.1", 101 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 102 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 103 | "dev": true 104 | }, 105 | "core-util-is": { 106 | "version": "file:file:.packages/core-util-is-1.0.2.tgz", 107 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 108 | "dev": true 109 | }, 110 | "debug": { 111 | "version": "2.2.0", 112 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 113 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 114 | "requires": { 115 | "ms": "0.7.1" 116 | }, 117 | "dependencies": { 118 | "ms": { 119 | "version": "0.7.1", 120 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 121 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 122 | } 123 | } 124 | }, 125 | "debuglog": { 126 | "version": "1.0.1", 127 | "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", 128 | "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", 129 | "dev": true 130 | }, 131 | "delegates": { 132 | "version": "file:file:.packages/delegates-1.0.0.tgz", 133 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 134 | "dev": true 135 | }, 136 | "dezalgo": { 137 | "version": "1.0.3", 138 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", 139 | "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", 140 | "dev": true, 141 | "requires": { 142 | "asap": "2.0.6", 143 | "wrappy": "1.0.2" 144 | } 145 | }, 146 | "fs.realpath": { 147 | "version": "1.0.0", 148 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 149 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 150 | "dev": true 151 | }, 152 | "fstream": { 153 | "version": "1.0.11", 154 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 155 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 156 | "dev": true, 157 | "requires": { 158 | "graceful-fs": "4.1.11", 159 | "inherits": "file:file:.packages/inherits-2.0.1.tgz", 160 | "mkdirp": "0.5.1", 161 | "rimraf": "2.6.2" 162 | } 163 | }, 164 | "gauge": { 165 | "version": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", 166 | "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", 167 | "dev": true, 168 | "requires": { 169 | "ansi": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", 170 | "has-unicode": "file:file:.packages/has-unicode-2.0.1.tgz", 171 | "lodash.pad": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", 172 | "lodash.padend": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", 173 | "lodash.padstart": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz" 174 | } 175 | }, 176 | "github-url-from-username-repo": { 177 | "version": "1.0.2", 178 | "resolved": "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz", 179 | "integrity": "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=", 180 | "dev": true 181 | }, 182 | "glob": { 183 | "version": "7.1.2", 184 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 185 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 186 | "dev": true, 187 | "requires": { 188 | "fs.realpath": "1.0.0", 189 | "inflight": "1.0.6", 190 | "inherits": "file:file:.packages/inherits-2.0.1.tgz", 191 | "minimatch": "3.0.4", 192 | "once": "1.4.0", 193 | "path-is-absolute": "1.0.1" 194 | } 195 | }, 196 | "graceful-fs": { 197 | "version": "4.1.11", 198 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 199 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 200 | "dev": true 201 | }, 202 | "has-unicode": { 203 | "version": "file:file:.packages/has-unicode-2.0.1.tgz", 204 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 205 | "dev": true 206 | }, 207 | "hermesjs-message": { 208 | "version": "2.0.0", 209 | "resolved": "https://registry.npmjs.org/hermesjs-message/-/hermesjs-message-2.0.0.tgz", 210 | "integrity": "sha1-Q3NBzo0I2mY1YOXiMFgZBVkQmp4=" 211 | }, 212 | "hermesjs-router": { 213 | "version": "1.1.1", 214 | "resolved": "https://registry.npmjs.org/hermesjs-router/-/hermesjs-router-1.1.1.tgz", 215 | "integrity": "sha1-wigBjuU1C5NijXdci5T6Skixk3o=" 216 | }, 217 | "hosted-git-info": { 218 | "version": "2.5.0", 219 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 220 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 221 | "dev": true 222 | }, 223 | "imurmurhash": { 224 | "version": "0.1.4", 225 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 226 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 227 | "dev": true 228 | }, 229 | "inflight": { 230 | "version": "1.0.6", 231 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 232 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 233 | "dev": true, 234 | "requires": { 235 | "once": "1.4.0", 236 | "wrappy": "1.0.2" 237 | } 238 | }, 239 | "inherits": { 240 | "version": "file:file:.packages/inherits-2.0.1.tgz", 241 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 242 | "dev": true 243 | }, 244 | "is-builtin-module": { 245 | "version": "1.0.0", 246 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 247 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 248 | "dev": true, 249 | "requires": { 250 | "builtin-modules": "1.1.1" 251 | } 252 | }, 253 | "json-parse-better-errors": { 254 | "version": "1.0.1", 255 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", 256 | "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", 257 | "dev": true 258 | }, 259 | "lodash.pad": { 260 | "version": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", 261 | "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", 262 | "dev": true 263 | }, 264 | "lodash.padend": { 265 | "version": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", 266 | "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", 267 | "dev": true 268 | }, 269 | "lodash.padstart": { 270 | "version": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", 271 | "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", 272 | "dev": true 273 | }, 274 | "minimatch": { 275 | "version": "3.0.4", 276 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 277 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 278 | "dev": true, 279 | "requires": { 280 | "brace-expansion": "1.1.8" 281 | } 282 | }, 283 | "minimist": { 284 | "version": "0.0.8", 285 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 286 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 287 | "dev": true 288 | }, 289 | "mkdirp": { 290 | "version": "0.5.1", 291 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 292 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 293 | "dev": true, 294 | "requires": { 295 | "minimist": "0.0.8" 296 | } 297 | }, 298 | "nopt": { 299 | "version": "file:file:.packages/nopt-3.0.6.tgz", 300 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 301 | "dev": true, 302 | "requires": { 303 | "abbrev": "file:file:.packages/abbrev-1.0.9.tgz" 304 | } 305 | }, 306 | "normalize-package-data": { 307 | "version": "2.4.0", 308 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 309 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 310 | "dev": true, 311 | "requires": { 312 | "hosted-git-info": "2.5.0", 313 | "is-builtin-module": "1.0.0", 314 | "semver": "file:file:.packages/semver-4.3.6.tgz", 315 | "validate-npm-package-license": "3.0.1" 316 | } 317 | }, 318 | "npm": { 319 | "version": "https://registry.npmjs.org/npm/-/npm-2.15.10.tgz", 320 | "integrity": "sha1-3lo9q23MBJR4TIuON79S7oUfhCw=", 321 | "dev": true, 322 | "requires": { 323 | "abbrev": "1.0.9", 324 | "ansi": "0.3.1", 325 | "ansi-regex": "2.0.0", 326 | "ansicolors": "0.3.2", 327 | "ansistyles": "0.1.3", 328 | "archy": "1.0.0", 329 | "async-some": "1.0.2", 330 | "block-stream": "0.0.9", 331 | "char-spinner": "1.0.1", 332 | "chmodr": "1.0.2", 333 | "chownr": "1.0.1", 334 | "cmd-shim": "2.0.2", 335 | "columnify": "1.5.4", 336 | "config-chain": "1.1.10", 337 | "dezalgo": "1.0.3", 338 | "editor": "1.0.0", 339 | "fs-vacuum": "1.2.9", 340 | "fs-write-stream-atomic": "1.0.8", 341 | "fstream": "1.0.11", 342 | "fstream-npm": "1.1.1", 343 | "github-url-from-git": "1.4.0", 344 | "github-url-from-username-repo": "1.0.2", 345 | "glob": "7.0.5", 346 | "graceful-fs": "4.1.5", 347 | "hosted-git-info": "2.1.5", 348 | "imurmurhash": "0.1.4", 349 | "inflight": "1.0.5", 350 | "inherits": "2.0.1", 351 | "ini": "1.3.4", 352 | "init-package-json": "1.9.4", 353 | "lockfile": "1.0.1", 354 | "lru-cache": "4.0.1", 355 | "minimatch": "3.0.3", 356 | "mkdirp": "0.5.1", 357 | "node-gyp": "3.4.0", 358 | "nopt": "file:file:.packages/nopt-3.0.6.tgz", 359 | "normalize-git-url": "3.0.2", 360 | "normalize-package-data": "2.3.5", 361 | "npm-cache-filename": "1.0.2", 362 | "npm-install-checks": "1.0.7", 363 | "npm-package-arg": "4.1.0", 364 | "npm-registry-client": "7.1.2", 365 | "npm-user-validate": "0.1.5", 366 | "npmlog": "2.0.4", 367 | "once": "1.3.3", 368 | "opener": "1.4.1", 369 | "osenv": "0.1.3", 370 | "path-is-inside": "1.0.2", 371 | "read": "1.0.7", 372 | "read-installed": "4.0.3", 373 | "read-package-json": "2.0.4", 374 | "readable-stream": "2.1.4", 375 | "realize-package-specifier": "3.0.1", 376 | "request": "2.74.0", 377 | "retry": "0.9.0", 378 | "rimraf": "2.5.4", 379 | "semver": "5.1.0", 380 | "sha": "2.0.1", 381 | "slide": "1.1.6", 382 | "sorted-object": "2.0.0", 383 | "spdx-license-ids": "1.2.2", 384 | "strip-ansi": "3.0.1", 385 | "tar": "2.2.1", 386 | "text-table": "0.2.0", 387 | "uid-number": "0.0.6", 388 | "umask": "1.1.0", 389 | "validate-npm-package-license": "3.0.1", 390 | "validate-npm-package-name": "2.2.2", 391 | "which": "1.2.10", 392 | "wrappy": "1.0.2", 393 | "write-file-atomic": "1.1.4" 394 | }, 395 | "dependencies": { 396 | "abbrev": { 397 | "version": "1.0.9", 398 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 399 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 400 | "dev": true 401 | }, 402 | "ansi": { 403 | "version": "0.3.1", 404 | "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", 405 | "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", 406 | "dev": true 407 | }, 408 | "ansi-regex": { 409 | "version": "2.0.0", 410 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", 411 | "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", 412 | "dev": true 413 | }, 414 | "archy": { 415 | "version": "1.0.0", 416 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 417 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", 418 | "dev": true 419 | }, 420 | "block-stream": { 421 | "version": "0.0.9", 422 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 423 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 424 | "dev": true, 425 | "requires": { 426 | "inherits": "2.0.1" 427 | } 428 | }, 429 | "char-spinner": { 430 | "version": "1.0.1", 431 | "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", 432 | "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=", 433 | "dev": true 434 | }, 435 | "chmodr": { 436 | "version": "1.0.2", 437 | "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.0.2.tgz", 438 | "integrity": "sha1-BGYrky0PAuxm3qorDqQoEZaOPrk=", 439 | "dev": true 440 | }, 441 | "chownr": { 442 | "version": "1.0.1", 443 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", 444 | "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", 445 | "dev": true 446 | }, 447 | "cmd-shim": { 448 | "version": "2.0.2", 449 | "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", 450 | "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", 451 | "dev": true, 452 | "requires": { 453 | "graceful-fs": "4.1.5", 454 | "mkdirp": "0.5.1" 455 | } 456 | }, 457 | "columnify": { 458 | "version": "1.5.4", 459 | "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", 460 | "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", 461 | "dev": true, 462 | "requires": { 463 | "strip-ansi": "3.0.1", 464 | "wcwidth": "1.0.0" 465 | }, 466 | "dependencies": { 467 | "wcwidth": { 468 | "version": "1.0.0", 469 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz", 470 | "integrity": "sha1-AtBZ/3qPx0Hg9rXaHmmytA2uym8=", 471 | "dev": true, 472 | "requires": { 473 | "defaults": "1.0.3" 474 | }, 475 | "dependencies": { 476 | "defaults": { 477 | "version": "1.0.3", 478 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 479 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 480 | "dev": true, 481 | "requires": { 482 | "clone": "1.0.2" 483 | }, 484 | "dependencies": { 485 | "clone": { 486 | "version": "1.0.2", 487 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", 488 | "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", 489 | "dev": true 490 | } 491 | } 492 | } 493 | } 494 | } 495 | } 496 | }, 497 | "config-chain": { 498 | "version": "1.1.10", 499 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.10.tgz", 500 | "integrity": "sha1-f8OD3g/MhNcRy0Zb0XZXnK1hI0Y=", 501 | "dev": true, 502 | "requires": { 503 | "ini": "1.3.4", 504 | "proto-list": "1.2.4" 505 | }, 506 | "dependencies": { 507 | "proto-list": { 508 | "version": "1.2.4", 509 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 510 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", 511 | "dev": true 512 | } 513 | } 514 | }, 515 | "editor": { 516 | "version": "1.0.0", 517 | "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", 518 | "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", 519 | "dev": true 520 | }, 521 | "fs-vacuum": { 522 | "version": "1.2.9", 523 | "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.9.tgz", 524 | "integrity": "sha1-T5AZOrjqAokJlbzU6ARlml02ay0=", 525 | "dev": true, 526 | "requires": { 527 | "graceful-fs": "4.1.5", 528 | "path-is-inside": "1.0.2", 529 | "rimraf": "2.5.4" 530 | } 531 | }, 532 | "fs-write-stream-atomic": { 533 | "version": "1.0.8", 534 | "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.8.tgz", 535 | "integrity": "sha1-5Jqt3yiPh9Rv+eiC8hahOrxAd4s=", 536 | "dev": true, 537 | "requires": { 538 | "graceful-fs": "4.1.5", 539 | "iferr": "0.1.5", 540 | "imurmurhash": "0.1.4", 541 | "readable-stream": "2.1.4" 542 | }, 543 | "dependencies": { 544 | "iferr": { 545 | "version": "0.1.5", 546 | "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", 547 | "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", 548 | "dev": true 549 | } 550 | } 551 | }, 552 | "fstream-npm": { 553 | "version": "1.1.1", 554 | "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.1.1.tgz", 555 | "integrity": "sha1-a5F122I5qD2CCeIyQmxJTbspaQw=", 556 | "dev": true, 557 | "requires": { 558 | "fstream-ignore": "1.0.5", 559 | "inherits": "2.0.1" 560 | }, 561 | "dependencies": { 562 | "fstream-ignore": { 563 | "version": "1.0.5", 564 | "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", 565 | "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", 566 | "dev": true, 567 | "requires": { 568 | "fstream": "1.0.11", 569 | "inherits": "2.0.1", 570 | "minimatch": "3.0.3" 571 | } 572 | } 573 | } 574 | }, 575 | "github-url-from-git": { 576 | "version": "1.4.0", 577 | "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz", 578 | "integrity": "sha1-KF5rUggZABveEoZ0cEN55P8D4N4=", 579 | "dev": true 580 | }, 581 | "glob": { 582 | "version": "7.0.5", 583 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", 584 | "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", 585 | "dev": true, 586 | "requires": { 587 | "fs.realpath": "1.0.0", 588 | "inflight": "1.0.5", 589 | "inherits": "2.0.1", 590 | "minimatch": "3.0.3", 591 | "once": "1.3.3", 592 | "path-is-absolute": "1.0.0" 593 | }, 594 | "dependencies": { 595 | "fs.realpath": { 596 | "version": "1.0.0", 597 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 598 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 599 | "dev": true 600 | }, 601 | "path-is-absolute": { 602 | "version": "1.0.0", 603 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 604 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 605 | "dev": true 606 | } 607 | } 608 | }, 609 | "graceful-fs": { 610 | "version": "4.1.5", 611 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.5.tgz", 612 | "integrity": "sha1-9HRejK7V4N0u8hu14tIpoy6Ak8A=", 613 | "dev": true 614 | }, 615 | "hosted-git-info": { 616 | "version": "2.1.5", 617 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", 618 | "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", 619 | "dev": true 620 | }, 621 | "imurmurhash": { 622 | "version": "0.1.4", 623 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 624 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 625 | "dev": true 626 | }, 627 | "inflight": { 628 | "version": "1.0.5", 629 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", 630 | "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", 631 | "dev": true, 632 | "requires": { 633 | "once": "1.3.3", 634 | "wrappy": "1.0.2" 635 | } 636 | }, 637 | "inherits": { 638 | "version": "2.0.1", 639 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 640 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 641 | "dev": true 642 | }, 643 | "ini": { 644 | "version": "1.3.4", 645 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", 646 | "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", 647 | "dev": true 648 | }, 649 | "init-package-json": { 650 | "version": "1.9.4", 651 | "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.9.4.tgz", 652 | "integrity": "sha1-tAU9C0Dwz4QqQZZpN8s9wPU06FY=", 653 | "dev": true, 654 | "requires": { 655 | "glob": "6.0.4", 656 | "npm-package-arg": "4.1.0", 657 | "promzard": "0.3.0", 658 | "read": "1.0.7", 659 | "read-package-json": "2.0.4", 660 | "semver": "5.1.0", 661 | "validate-npm-package-license": "3.0.1", 662 | "validate-npm-package-name": "2.2.2" 663 | }, 664 | "dependencies": { 665 | "glob": { 666 | "version": "6.0.4", 667 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", 668 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", 669 | "dev": true, 670 | "requires": { 671 | "inflight": "1.0.5", 672 | "inherits": "2.0.1", 673 | "minimatch": "3.0.3", 674 | "once": "1.3.3", 675 | "path-is-absolute": "1.0.0" 676 | }, 677 | "dependencies": { 678 | "path-is-absolute": { 679 | "version": "1.0.0", 680 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 681 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 682 | "dev": true 683 | } 684 | } 685 | }, 686 | "promzard": { 687 | "version": "0.3.0", 688 | "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", 689 | "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", 690 | "dev": true, 691 | "requires": { 692 | "read": "1.0.7" 693 | } 694 | } 695 | } 696 | }, 697 | "lockfile": { 698 | "version": "1.0.1", 699 | "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.1.tgz", 700 | "integrity": "sha1-nTU+z+P1TRULtX+J1RdGk1o5xPU=", 701 | "dev": true 702 | }, 703 | "lru-cache": { 704 | "version": "4.0.1", 705 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", 706 | "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", 707 | "dev": true, 708 | "requires": { 709 | "pseudomap": "1.0.2", 710 | "yallist": "2.0.0" 711 | }, 712 | "dependencies": { 713 | "pseudomap": { 714 | "version": "1.0.2", 715 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 716 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 717 | "dev": true 718 | }, 719 | "yallist": { 720 | "version": "2.0.0", 721 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", 722 | "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", 723 | "dev": true 724 | } 725 | } 726 | }, 727 | "minimatch": { 728 | "version": "3.0.3", 729 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", 730 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", 731 | "dev": true, 732 | "requires": { 733 | "brace-expansion": "1.1.6" 734 | }, 735 | "dependencies": { 736 | "brace-expansion": { 737 | "version": "1.1.6", 738 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", 739 | "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", 740 | "dev": true, 741 | "requires": { 742 | "balanced-match": "0.4.2", 743 | "concat-map": "0.0.1" 744 | }, 745 | "dependencies": { 746 | "balanced-match": { 747 | "version": "0.4.2", 748 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 749 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", 750 | "dev": true 751 | }, 752 | "concat-map": { 753 | "version": "0.0.1", 754 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 755 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 756 | "dev": true 757 | } 758 | } 759 | } 760 | } 761 | }, 762 | "mkdirp": { 763 | "version": "0.5.1", 764 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 765 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 766 | "dev": true, 767 | "requires": { 768 | "minimist": "0.0.8" 769 | }, 770 | "dependencies": { 771 | "minimist": { 772 | "version": "0.0.8", 773 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 774 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 775 | "dev": true 776 | } 777 | } 778 | }, 779 | "node-gyp": { 780 | "version": "3.4.0", 781 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.4.0.tgz", 782 | "integrity": "sha1-3aVYOTs+y74kyea4cDxxGUxj+jY=", 783 | "dev": true, 784 | "requires": { 785 | "fstream": "1.0.11", 786 | "glob": "7.0.5", 787 | "graceful-fs": "4.1.5", 788 | "minimatch": "3.0.3", 789 | "mkdirp": "0.5.1", 790 | "nopt": "file:file:.packages/nopt-3.0.6.tgz", 791 | "npmlog": "2.0.4", 792 | "osenv": "0.1.3", 793 | "path-array": "1.0.1", 794 | "request": "2.74.0", 795 | "rimraf": "2.5.4", 796 | "semver": "5.1.0", 797 | "tar": "2.2.1", 798 | "which": "1.2.10" 799 | }, 800 | "dependencies": { 801 | "path-array": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", 804 | "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", 805 | "dev": true, 806 | "requires": { 807 | "array-index": "1.0.0" 808 | }, 809 | "dependencies": { 810 | "array-index": { 811 | "version": "1.0.0", 812 | "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", 813 | "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", 814 | "dev": true, 815 | "requires": { 816 | "debug": "2.2.0", 817 | "es6-symbol": "3.1.0" 818 | }, 819 | "dependencies": { 820 | "debug": { 821 | "version": "2.2.0", 822 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 823 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 824 | "dev": true, 825 | "requires": { 826 | "ms": "0.7.1" 827 | }, 828 | "dependencies": { 829 | "ms": { 830 | "version": "0.7.1", 831 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 832 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 833 | "dev": true 834 | } 835 | } 836 | }, 837 | "es6-symbol": { 838 | "version": "3.1.0", 839 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz", 840 | "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", 841 | "dev": true, 842 | "requires": { 843 | "d": "0.1.1", 844 | "es5-ext": "0.10.12" 845 | }, 846 | "dependencies": { 847 | "d": { 848 | "version": "0.1.1", 849 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", 850 | "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", 851 | "dev": true, 852 | "requires": { 853 | "es5-ext": "0.10.12" 854 | } 855 | }, 856 | "es5-ext": { 857 | "version": "0.10.12", 858 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz", 859 | "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", 860 | "dev": true, 861 | "requires": { 862 | "es6-iterator": "2.0.0", 863 | "es6-symbol": "3.1.0" 864 | }, 865 | "dependencies": { 866 | "es6-iterator": { 867 | "version": "2.0.0", 868 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", 869 | "integrity": "sha1-vZaFZ9YWNeM8C4BydhPJy0sJa6w=", 870 | "dev": true, 871 | "requires": { 872 | "d": "0.1.1", 873 | "es5-ext": "0.10.12", 874 | "es6-symbol": "3.1.0" 875 | } 876 | } 877 | } 878 | } 879 | } 880 | } 881 | } 882 | } 883 | } 884 | } 885 | } 886 | }, 887 | "normalize-git-url": { 888 | "version": "3.0.2", 889 | "resolved": "https://registry.npmjs.org/normalize-git-url/-/normalize-git-url-3.0.2.tgz", 890 | "integrity": "sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q=", 891 | "dev": true 892 | }, 893 | "normalize-package-data": { 894 | "version": "2.3.5", 895 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", 896 | "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", 897 | "dev": true, 898 | "requires": { 899 | "hosted-git-info": "2.1.5", 900 | "is-builtin-module": "1.0.0", 901 | "semver": "5.1.0", 902 | "validate-npm-package-license": "3.0.1" 903 | }, 904 | "dependencies": { 905 | "is-builtin-module": { 906 | "version": "1.0.0", 907 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 908 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 909 | "dev": true, 910 | "requires": { 911 | "builtin-modules": "1.1.0" 912 | }, 913 | "dependencies": { 914 | "builtin-modules": { 915 | "version": "1.1.0", 916 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.0.tgz", 917 | "integrity": "sha1-EFOVX9mUpXRuUl5Kxxe4HK8HSRw=", 918 | "dev": true 919 | } 920 | } 921 | } 922 | } 923 | }, 924 | "npm-cache-filename": { 925 | "version": "1.0.2", 926 | "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", 927 | "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", 928 | "dev": true 929 | }, 930 | "npm-install-checks": { 931 | "version": "1.0.7", 932 | "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.7.tgz", 933 | "integrity": "sha1-bZGu2grJaAHx7Xqt7hFqbAoIalc=", 934 | "dev": true, 935 | "requires": { 936 | "npmlog": "2.0.4", 937 | "semver": "5.1.0" 938 | } 939 | }, 940 | "npm-package-arg": { 941 | "version": "4.1.0", 942 | "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.1.0.tgz", 943 | "integrity": "sha1-LgFfisAHN8uX+ZfJy/BZ9Cp0Un0=", 944 | "dev": true, 945 | "requires": { 946 | "hosted-git-info": "2.1.5", 947 | "semver": "5.1.0" 948 | } 949 | }, 950 | "npm-registry-client": { 951 | "version": "7.1.2", 952 | "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.1.2.tgz", 953 | "integrity": "sha1-3fJDor0UnTUXL+aAr/QN+iAFS8M=", 954 | "dev": true, 955 | "requires": { 956 | "chownr": "1.0.1", 957 | "concat-stream": "1.5.1", 958 | "graceful-fs": "4.1.5", 959 | "mkdirp": "0.5.1", 960 | "normalize-package-data": "2.3.5", 961 | "npm-package-arg": "4.1.0", 962 | "npmlog": "2.0.4", 963 | "once": "1.3.3", 964 | "request": "2.74.0", 965 | "retry": "0.8.0", 966 | "rimraf": "2.5.4", 967 | "semver": "5.1.0", 968 | "slide": "1.1.6" 969 | }, 970 | "dependencies": { 971 | "concat-stream": { 972 | "version": "1.5.1", 973 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", 974 | "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", 975 | "dev": true, 976 | "requires": { 977 | "inherits": "2.0.1", 978 | "readable-stream": "2.0.6", 979 | "typedarray": "0.0.6" 980 | }, 981 | "dependencies": { 982 | "readable-stream": { 983 | "version": "2.0.6", 984 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 985 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 986 | "dev": true, 987 | "requires": { 988 | "core-util-is": "1.0.2", 989 | "inherits": "2.0.1", 990 | "isarray": "1.0.0", 991 | "process-nextick-args": "1.0.7", 992 | "string_decoder": "0.10.31", 993 | "util-deprecate": "1.0.2" 994 | }, 995 | "dependencies": { 996 | "core-util-is": { 997 | "version": "1.0.2", 998 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 999 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 1000 | "dev": true 1001 | }, 1002 | "isarray": { 1003 | "version": "1.0.0", 1004 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1005 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1006 | "dev": true 1007 | }, 1008 | "process-nextick-args": { 1009 | "version": "1.0.7", 1010 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1011 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1012 | "dev": true 1013 | }, 1014 | "string_decoder": { 1015 | "version": "0.10.31", 1016 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1017 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1018 | "dev": true 1019 | }, 1020 | "util-deprecate": { 1021 | "version": "1.0.2", 1022 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1023 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1024 | "dev": true 1025 | } 1026 | } 1027 | }, 1028 | "typedarray": { 1029 | "version": "0.0.6", 1030 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1031 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1032 | "dev": true 1033 | } 1034 | } 1035 | }, 1036 | "retry": { 1037 | "version": "0.8.0", 1038 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.8.0.tgz", 1039 | "integrity": "sha1-I2dijcDtskex6rZJ3FOshiisLV8=", 1040 | "dev": true 1041 | } 1042 | } 1043 | }, 1044 | "npm-user-validate": { 1045 | "version": "0.1.5", 1046 | "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-0.1.5.tgz", 1047 | "integrity": "sha1-UkZdUMLSApSlcSW5lrrtv1bFAEs=", 1048 | "dev": true 1049 | }, 1050 | "npmlog": { 1051 | "version": "2.0.4", 1052 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", 1053 | "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", 1054 | "dev": true, 1055 | "requires": { 1056 | "ansi": "0.3.1", 1057 | "are-we-there-yet": "1.1.2", 1058 | "gauge": "1.2.7" 1059 | }, 1060 | "dependencies": { 1061 | "are-we-there-yet": { 1062 | "version": "1.1.2", 1063 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", 1064 | "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", 1065 | "dev": true, 1066 | "requires": { 1067 | "delegates": "1.0.0", 1068 | "readable-stream": "2.1.4" 1069 | }, 1070 | "dependencies": { 1071 | "delegates": { 1072 | "version": "1.0.0", 1073 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1074 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 1075 | "dev": true 1076 | } 1077 | } 1078 | }, 1079 | "gauge": { 1080 | "version": "1.2.7", 1081 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", 1082 | "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", 1083 | "dev": true, 1084 | "requires": { 1085 | "ansi": "0.3.1", 1086 | "has-unicode": "2.0.0", 1087 | "lodash.pad": "4.4.0", 1088 | "lodash.padend": "4.5.0", 1089 | "lodash.padstart": "4.5.0" 1090 | }, 1091 | "dependencies": { 1092 | "has-unicode": { 1093 | "version": "2.0.0", 1094 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz", 1095 | "integrity": "sha1-o82Wwwe6QdVZxaLuQIwSoRxMLsM=", 1096 | "dev": true 1097 | }, 1098 | "lodash._baseslice": { 1099 | "version": "4.0.0", 1100 | "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz", 1101 | "integrity": "sha1-9c4d+YKUjsr/Y/IjhTQVt7l2NwQ=", 1102 | "dev": true 1103 | }, 1104 | "lodash._basetostring": { 1105 | "version": "4.12.0", 1106 | "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", 1107 | "integrity": "sha1-kyfJ3FFYhmt/pLnUL0Y45XZt2d8=", 1108 | "dev": true 1109 | }, 1110 | "lodash.pad": { 1111 | "version": "4.4.0", 1112 | "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.4.0.tgz", 1113 | "integrity": "sha1-+qON8mwKaexQhqgiRslY4VDcsas=", 1114 | "dev": true, 1115 | "requires": { 1116 | "lodash._baseslice": "4.0.0", 1117 | "lodash._basetostring": "4.12.0", 1118 | "lodash.tostring": "4.1.4" 1119 | } 1120 | }, 1121 | "lodash.padend": { 1122 | "version": "4.5.0", 1123 | "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.5.0.tgz", 1124 | "integrity": "sha1-oonpN37i5t6Lp/EfOo6zJgcLdhk=", 1125 | "dev": true, 1126 | "requires": { 1127 | "lodash._baseslice": "4.0.0", 1128 | "lodash._basetostring": "4.12.0", 1129 | "lodash.tostring": "4.1.4" 1130 | } 1131 | }, 1132 | "lodash.padstart": { 1133 | "version": "4.5.0", 1134 | "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.5.0.tgz", 1135 | "integrity": "sha1-PqGQ9nNIQcM2TSedEeBWcmtgp5o=", 1136 | "dev": true, 1137 | "requires": { 1138 | "lodash._baseslice": "4.0.0", 1139 | "lodash._basetostring": "4.12.0", 1140 | "lodash.tostring": "4.1.4" 1141 | } 1142 | }, 1143 | "lodash.tostring": { 1144 | "version": "4.1.4", 1145 | "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.4.tgz", 1146 | "integrity": "sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs=", 1147 | "dev": true 1148 | } 1149 | } 1150 | } 1151 | } 1152 | }, 1153 | "once": { 1154 | "version": "1.3.3", 1155 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", 1156 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", 1157 | "dev": true, 1158 | "requires": { 1159 | "wrappy": "1.0.2" 1160 | } 1161 | }, 1162 | "opener": { 1163 | "version": "1.4.1", 1164 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.1.tgz", 1165 | "integrity": "sha1-iXWQrNGu0zEbcDtYvMtNQ/VvKJU=", 1166 | "dev": true 1167 | }, 1168 | "osenv": { 1169 | "version": "0.1.3", 1170 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", 1171 | "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", 1172 | "dev": true, 1173 | "requires": { 1174 | "os-homedir": "1.0.0", 1175 | "os-tmpdir": "1.0.1" 1176 | }, 1177 | "dependencies": { 1178 | "os-homedir": { 1179 | "version": "1.0.0", 1180 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.0.tgz", 1181 | "integrity": "sha1-43B4vGG1hpBjBTiXJX457BJhtwI=", 1182 | "dev": true 1183 | }, 1184 | "os-tmpdir": { 1185 | "version": "1.0.1", 1186 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", 1187 | "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", 1188 | "dev": true 1189 | } 1190 | } 1191 | }, 1192 | "read": { 1193 | "version": "1.0.7", 1194 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1195 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 1196 | "dev": true, 1197 | "requires": { 1198 | "mute-stream": "0.0.5" 1199 | }, 1200 | "dependencies": { 1201 | "mute-stream": { 1202 | "version": "0.0.5", 1203 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1204 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1205 | "dev": true 1206 | } 1207 | } 1208 | }, 1209 | "read-package-json": { 1210 | "version": "2.0.4", 1211 | "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.4.tgz", 1212 | "integrity": "sha1-Ye0bIlbqQ42ACIlQkL6EuOeZyFM=", 1213 | "dev": true, 1214 | "requires": { 1215 | "glob": "6.0.4", 1216 | "graceful-fs": "4.1.5", 1217 | "json-parse-helpfulerror": "1.0.3", 1218 | "normalize-package-data": "2.3.5" 1219 | }, 1220 | "dependencies": { 1221 | "glob": { 1222 | "version": "6.0.4", 1223 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", 1224 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", 1225 | "dev": true, 1226 | "requires": { 1227 | "inflight": "1.0.5", 1228 | "inherits": "2.0.1", 1229 | "minimatch": "3.0.3", 1230 | "once": "1.3.3", 1231 | "path-is-absolute": "1.0.0" 1232 | }, 1233 | "dependencies": { 1234 | "path-is-absolute": { 1235 | "version": "1.0.0", 1236 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 1237 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 1238 | "dev": true 1239 | } 1240 | } 1241 | }, 1242 | "json-parse-helpfulerror": { 1243 | "version": "1.0.3", 1244 | "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", 1245 | "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", 1246 | "dev": true, 1247 | "requires": { 1248 | "jju": "1.3.0" 1249 | }, 1250 | "dependencies": { 1251 | "jju": { 1252 | "version": "1.3.0", 1253 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", 1254 | "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", 1255 | "dev": true 1256 | } 1257 | } 1258 | } 1259 | } 1260 | }, 1261 | "readable-stream": { 1262 | "version": "2.1.4", 1263 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", 1264 | "integrity": "sha1-cLl5HG/LhIDbRL0VWg9rtY8XJGg=", 1265 | "dev": true, 1266 | "requires": { 1267 | "buffer-shims": "1.0.0", 1268 | "core-util-is": "1.0.2", 1269 | "inherits": "2.0.1", 1270 | "isarray": "1.0.0", 1271 | "process-nextick-args": "1.0.7", 1272 | "string_decoder": "0.10.31", 1273 | "util-deprecate": "1.0.2" 1274 | }, 1275 | "dependencies": { 1276 | "buffer-shims": { 1277 | "version": "1.0.0", 1278 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 1279 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", 1280 | "dev": true 1281 | }, 1282 | "core-util-is": { 1283 | "version": "1.0.2", 1284 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1285 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 1286 | "dev": true 1287 | }, 1288 | "isarray": { 1289 | "version": "1.0.0", 1290 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1291 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1292 | "dev": true 1293 | }, 1294 | "process-nextick-args": { 1295 | "version": "1.0.7", 1296 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1297 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1298 | "dev": true 1299 | }, 1300 | "string_decoder": { 1301 | "version": "0.10.31", 1302 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1303 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1304 | "dev": true 1305 | }, 1306 | "util-deprecate": { 1307 | "version": "1.0.2", 1308 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1309 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1310 | "dev": true 1311 | } 1312 | } 1313 | }, 1314 | "realize-package-specifier": { 1315 | "version": "3.0.1", 1316 | "resolved": "https://registry.npmjs.org/realize-package-specifier/-/realize-package-specifier-3.0.1.tgz", 1317 | "integrity": "sha1-/eMukmRI44+ZM02Vt7CNUeOpjZ8=", 1318 | "dev": true, 1319 | "requires": { 1320 | "dezalgo": "1.0.3", 1321 | "npm-package-arg": "4.1.0" 1322 | } 1323 | }, 1324 | "request": { 1325 | "version": "2.74.0", 1326 | "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", 1327 | "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", 1328 | "dev": true, 1329 | "requires": { 1330 | "aws-sign2": "0.6.0", 1331 | "aws4": "1.4.1", 1332 | "bl": "1.1.2", 1333 | "caseless": "0.11.0", 1334 | "combined-stream": "1.0.5", 1335 | "extend": "3.0.0", 1336 | "forever-agent": "0.6.1", 1337 | "form-data": "1.0.0-rc4", 1338 | "har-validator": "2.0.6", 1339 | "hawk": "3.1.3", 1340 | "http-signature": "1.1.1", 1341 | "is-typedarray": "1.0.0", 1342 | "isstream": "0.1.2", 1343 | "json-stringify-safe": "5.0.1", 1344 | "mime-types": "2.1.11", 1345 | "node-uuid": "1.4.7", 1346 | "oauth-sign": "0.8.2", 1347 | "qs": "6.2.1", 1348 | "stringstream": "0.0.5", 1349 | "tough-cookie": "2.3.1", 1350 | "tunnel-agent": "0.4.3" 1351 | }, 1352 | "dependencies": { 1353 | "aws-sign2": { 1354 | "version": "0.6.0", 1355 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 1356 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", 1357 | "dev": true 1358 | }, 1359 | "aws4": { 1360 | "version": "1.4.1", 1361 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", 1362 | "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", 1363 | "dev": true 1364 | }, 1365 | "bl": { 1366 | "version": "1.1.2", 1367 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", 1368 | "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", 1369 | "dev": true, 1370 | "requires": { 1371 | "readable-stream": "2.0.6" 1372 | }, 1373 | "dependencies": { 1374 | "readable-stream": { 1375 | "version": "2.0.6", 1376 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 1377 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 1378 | "dev": true, 1379 | "requires": { 1380 | "core-util-is": "1.0.2", 1381 | "inherits": "2.0.1", 1382 | "isarray": "1.0.0", 1383 | "process-nextick-args": "1.0.7", 1384 | "string_decoder": "0.10.31", 1385 | "util-deprecate": "1.0.2" 1386 | }, 1387 | "dependencies": { 1388 | "core-util-is": { 1389 | "version": "1.0.2", 1390 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1391 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 1392 | "dev": true 1393 | }, 1394 | "isarray": { 1395 | "version": "1.0.0", 1396 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1397 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1398 | "dev": true 1399 | }, 1400 | "process-nextick-args": { 1401 | "version": "1.0.7", 1402 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1403 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1404 | "dev": true 1405 | }, 1406 | "string_decoder": { 1407 | "version": "0.10.31", 1408 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1409 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1410 | "dev": true 1411 | }, 1412 | "util-deprecate": { 1413 | "version": "1.0.2", 1414 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1415 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1416 | "dev": true 1417 | } 1418 | } 1419 | } 1420 | } 1421 | }, 1422 | "caseless": { 1423 | "version": "0.11.0", 1424 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", 1425 | "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", 1426 | "dev": true 1427 | }, 1428 | "combined-stream": { 1429 | "version": "1.0.5", 1430 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 1431 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 1432 | "dev": true, 1433 | "requires": { 1434 | "delayed-stream": "1.0.0" 1435 | }, 1436 | "dependencies": { 1437 | "delayed-stream": { 1438 | "version": "1.0.0", 1439 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1440 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 1441 | "dev": true 1442 | } 1443 | } 1444 | }, 1445 | "extend": { 1446 | "version": "3.0.0", 1447 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", 1448 | "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", 1449 | "dev": true 1450 | }, 1451 | "forever-agent": { 1452 | "version": "0.6.1", 1453 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1454 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 1455 | "dev": true 1456 | }, 1457 | "form-data": { 1458 | "version": "1.0.0-rc4", 1459 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", 1460 | "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", 1461 | "dev": true, 1462 | "requires": { 1463 | "async": "1.5.2", 1464 | "combined-stream": "1.0.5", 1465 | "mime-types": "2.1.11" 1466 | }, 1467 | "dependencies": { 1468 | "async": { 1469 | "version": "1.5.2", 1470 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 1471 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 1472 | "dev": true 1473 | } 1474 | } 1475 | }, 1476 | "har-validator": { 1477 | "version": "2.0.6", 1478 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", 1479 | "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", 1480 | "dev": true, 1481 | "requires": { 1482 | "chalk": "1.1.3", 1483 | "commander": "2.9.0", 1484 | "is-my-json-valid": "2.13.1", 1485 | "pinkie-promise": "2.0.1" 1486 | }, 1487 | "dependencies": { 1488 | "chalk": { 1489 | "version": "1.1.3", 1490 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1491 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1492 | "dev": true, 1493 | "requires": { 1494 | "ansi-styles": "2.2.1", 1495 | "escape-string-regexp": "1.0.5", 1496 | "has-ansi": "2.0.0", 1497 | "strip-ansi": "3.0.1", 1498 | "supports-color": "2.0.0" 1499 | }, 1500 | "dependencies": { 1501 | "ansi-styles": { 1502 | "version": "2.2.1", 1503 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1504 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 1505 | "dev": true 1506 | }, 1507 | "escape-string-regexp": { 1508 | "version": "1.0.5", 1509 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1510 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1511 | "dev": true 1512 | }, 1513 | "has-ansi": { 1514 | "version": "2.0.0", 1515 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1516 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1517 | "dev": true, 1518 | "requires": { 1519 | "ansi-regex": "2.0.0" 1520 | } 1521 | }, 1522 | "supports-color": { 1523 | "version": "2.0.0", 1524 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1525 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1526 | "dev": true 1527 | } 1528 | } 1529 | }, 1530 | "commander": { 1531 | "version": "2.9.0", 1532 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 1533 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 1534 | "dev": true, 1535 | "requires": { 1536 | "graceful-readlink": "1.0.1" 1537 | }, 1538 | "dependencies": { 1539 | "graceful-readlink": { 1540 | "version": "1.0.1", 1541 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 1542 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 1543 | "dev": true 1544 | } 1545 | } 1546 | }, 1547 | "is-my-json-valid": { 1548 | "version": "2.13.1", 1549 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", 1550 | "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", 1551 | "dev": true, 1552 | "requires": { 1553 | "generate-function": "2.0.0", 1554 | "generate-object-property": "1.2.0", 1555 | "jsonpointer": "2.0.0", 1556 | "xtend": "4.0.1" 1557 | }, 1558 | "dependencies": { 1559 | "generate-function": { 1560 | "version": "2.0.0", 1561 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 1562 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 1563 | "dev": true 1564 | }, 1565 | "generate-object-property": { 1566 | "version": "1.2.0", 1567 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 1568 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 1569 | "dev": true, 1570 | "requires": { 1571 | "is-property": "1.0.2" 1572 | }, 1573 | "dependencies": { 1574 | "is-property": { 1575 | "version": "1.0.2", 1576 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1577 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1578 | "dev": true 1579 | } 1580 | } 1581 | }, 1582 | "jsonpointer": { 1583 | "version": "2.0.0", 1584 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", 1585 | "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", 1586 | "dev": true 1587 | }, 1588 | "xtend": { 1589 | "version": "4.0.1", 1590 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1591 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1592 | "dev": true 1593 | } 1594 | } 1595 | }, 1596 | "pinkie-promise": { 1597 | "version": "2.0.1", 1598 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1599 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1600 | "dev": true, 1601 | "requires": { 1602 | "pinkie": "2.0.4" 1603 | }, 1604 | "dependencies": { 1605 | "pinkie": { 1606 | "version": "2.0.4", 1607 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1608 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1609 | "dev": true 1610 | } 1611 | } 1612 | } 1613 | } 1614 | }, 1615 | "hawk": { 1616 | "version": "3.1.3", 1617 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 1618 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 1619 | "dev": true, 1620 | "requires": { 1621 | "boom": "2.10.1", 1622 | "cryptiles": "2.0.5", 1623 | "hoek": "2.16.3", 1624 | "sntp": "1.0.9" 1625 | }, 1626 | "dependencies": { 1627 | "boom": { 1628 | "version": "2.10.1", 1629 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 1630 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 1631 | "dev": true, 1632 | "requires": { 1633 | "hoek": "2.16.3" 1634 | } 1635 | }, 1636 | "cryptiles": { 1637 | "version": "2.0.5", 1638 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 1639 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 1640 | "dev": true, 1641 | "requires": { 1642 | "boom": "2.10.1" 1643 | } 1644 | }, 1645 | "hoek": { 1646 | "version": "2.16.3", 1647 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1648 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", 1649 | "dev": true 1650 | }, 1651 | "sntp": { 1652 | "version": "1.0.9", 1653 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 1654 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 1655 | "dev": true, 1656 | "requires": { 1657 | "hoek": "2.16.3" 1658 | } 1659 | } 1660 | } 1661 | }, 1662 | "http-signature": { 1663 | "version": "1.1.1", 1664 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 1665 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 1666 | "dev": true, 1667 | "requires": { 1668 | "assert-plus": "0.2.0", 1669 | "jsprim": "1.3.0", 1670 | "sshpk": "1.9.2" 1671 | }, 1672 | "dependencies": { 1673 | "assert-plus": { 1674 | "version": "0.2.0", 1675 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 1676 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", 1677 | "dev": true 1678 | }, 1679 | "jsprim": { 1680 | "version": "1.3.0", 1681 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", 1682 | "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", 1683 | "dev": true, 1684 | "requires": { 1685 | "extsprintf": "1.0.2", 1686 | "json-schema": "0.2.2", 1687 | "verror": "1.3.6" 1688 | }, 1689 | "dependencies": { 1690 | "extsprintf": { 1691 | "version": "1.0.2", 1692 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", 1693 | "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", 1694 | "dev": true 1695 | }, 1696 | "json-schema": { 1697 | "version": "0.2.2", 1698 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", 1699 | "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", 1700 | "dev": true 1701 | }, 1702 | "verror": { 1703 | "version": "1.3.6", 1704 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", 1705 | "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", 1706 | "dev": true, 1707 | "requires": { 1708 | "extsprintf": "1.0.2" 1709 | } 1710 | } 1711 | } 1712 | }, 1713 | "sshpk": { 1714 | "version": "1.9.2", 1715 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.9.2.tgz", 1716 | "integrity": "sha1-O0E1G7rVw03fS9gRmTfv7jGkZ2U=", 1717 | "dev": true, 1718 | "requires": { 1719 | "asn1": "0.2.3", 1720 | "assert-plus": "1.0.0", 1721 | "dashdash": "1.14.0", 1722 | "ecc-jsbn": "0.1.1", 1723 | "getpass": "0.1.6", 1724 | "jodid25519": "1.0.2", 1725 | "jsbn": "0.1.0", 1726 | "tweetnacl": "0.13.3" 1727 | }, 1728 | "dependencies": { 1729 | "asn1": { 1730 | "version": "0.2.3", 1731 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 1732 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 1733 | "dev": true 1734 | }, 1735 | "assert-plus": { 1736 | "version": "1.0.0", 1737 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1738 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 1739 | "dev": true 1740 | }, 1741 | "dashdash": { 1742 | "version": "1.14.0", 1743 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", 1744 | "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", 1745 | "dev": true, 1746 | "requires": { 1747 | "assert-plus": "1.0.0" 1748 | } 1749 | }, 1750 | "ecc-jsbn": { 1751 | "version": "0.1.1", 1752 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 1753 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 1754 | "dev": true, 1755 | "optional": true, 1756 | "requires": { 1757 | "jsbn": "0.1.0" 1758 | } 1759 | }, 1760 | "getpass": { 1761 | "version": "0.1.6", 1762 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", 1763 | "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", 1764 | "dev": true, 1765 | "requires": { 1766 | "assert-plus": "1.0.0" 1767 | } 1768 | }, 1769 | "jodid25519": { 1770 | "version": "1.0.2", 1771 | "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", 1772 | "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", 1773 | "dev": true, 1774 | "optional": true, 1775 | "requires": { 1776 | "jsbn": "0.1.0" 1777 | } 1778 | }, 1779 | "jsbn": { 1780 | "version": "0.1.0", 1781 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", 1782 | "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", 1783 | "dev": true, 1784 | "optional": true 1785 | }, 1786 | "tweetnacl": { 1787 | "version": "0.13.3", 1788 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", 1789 | "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", 1790 | "dev": true, 1791 | "optional": true 1792 | } 1793 | } 1794 | } 1795 | } 1796 | }, 1797 | "is-typedarray": { 1798 | "version": "1.0.0", 1799 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1800 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1801 | "dev": true 1802 | }, 1803 | "isstream": { 1804 | "version": "0.1.2", 1805 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1806 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1807 | "dev": true 1808 | }, 1809 | "json-stringify-safe": { 1810 | "version": "5.0.1", 1811 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1812 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1813 | "dev": true 1814 | }, 1815 | "mime-types": { 1816 | "version": "2.1.11", 1817 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", 1818 | "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", 1819 | "dev": true, 1820 | "requires": { 1821 | "mime-db": "1.23.0" 1822 | }, 1823 | "dependencies": { 1824 | "mime-db": { 1825 | "version": "1.23.0", 1826 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", 1827 | "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", 1828 | "dev": true 1829 | } 1830 | } 1831 | }, 1832 | "node-uuid": { 1833 | "version": "1.4.7", 1834 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", 1835 | "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", 1836 | "dev": true 1837 | }, 1838 | "oauth-sign": { 1839 | "version": "0.8.2", 1840 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1841 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 1842 | "dev": true 1843 | }, 1844 | "qs": { 1845 | "version": "6.2.1", 1846 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", 1847 | "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", 1848 | "dev": true 1849 | }, 1850 | "stringstream": { 1851 | "version": "0.0.5", 1852 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 1853 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", 1854 | "dev": true 1855 | }, 1856 | "tough-cookie": { 1857 | "version": "2.3.1", 1858 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", 1859 | "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", 1860 | "dev": true 1861 | }, 1862 | "tunnel-agent": { 1863 | "version": "0.4.3", 1864 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 1865 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", 1866 | "dev": true 1867 | } 1868 | } 1869 | }, 1870 | "retry": { 1871 | "version": "0.9.0", 1872 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.9.0.tgz", 1873 | "integrity": "sha1-b2l+UKDk3cjI9/tUeptg3q1DZ40=", 1874 | "dev": true 1875 | }, 1876 | "rimraf": { 1877 | "version": "2.5.4", 1878 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", 1879 | "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", 1880 | "dev": true, 1881 | "requires": { 1882 | "glob": "7.0.5" 1883 | } 1884 | }, 1885 | "semver": { 1886 | "version": "5.1.0", 1887 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", 1888 | "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", 1889 | "dev": true 1890 | }, 1891 | "sha": { 1892 | "version": "2.0.1", 1893 | "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", 1894 | "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", 1895 | "dev": true, 1896 | "requires": { 1897 | "graceful-fs": "4.1.5", 1898 | "readable-stream": "2.0.2" 1899 | }, 1900 | "dependencies": { 1901 | "readable-stream": { 1902 | "version": "2.0.2", 1903 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", 1904 | "integrity": "sha1-vsgb6ujPRVFovC5bKzH1vPrtmxs=", 1905 | "dev": true, 1906 | "requires": { 1907 | "core-util-is": "1.0.1", 1908 | "inherits": "2.0.1", 1909 | "isarray": "0.0.1", 1910 | "process-nextick-args": "1.0.3", 1911 | "string_decoder": "0.10.31", 1912 | "util-deprecate": "1.0.1" 1913 | }, 1914 | "dependencies": { 1915 | "core-util-is": { 1916 | "version": "1.0.1", 1917 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", 1918 | "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", 1919 | "dev": true 1920 | }, 1921 | "isarray": { 1922 | "version": "0.0.1", 1923 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1924 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1925 | "dev": true 1926 | }, 1927 | "process-nextick-args": { 1928 | "version": "1.0.3", 1929 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz", 1930 | "integrity": "sha1-4nLu2CXV6fTqdNjXOx/jEcO+tjA=", 1931 | "dev": true 1932 | }, 1933 | "string_decoder": { 1934 | "version": "0.10.31", 1935 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1936 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1937 | "dev": true 1938 | }, 1939 | "util-deprecate": { 1940 | "version": "1.0.1", 1941 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz", 1942 | "integrity": "sha1-NVaj0TxMaqeYPX4kJUeBlxmbeIE=", 1943 | "dev": true 1944 | } 1945 | } 1946 | } 1947 | } 1948 | }, 1949 | "slide": { 1950 | "version": "1.1.6", 1951 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1952 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", 1953 | "dev": true 1954 | }, 1955 | "sorted-object": { 1956 | "version": "2.0.0", 1957 | "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.0.tgz", 1958 | "integrity": "sha1-HP6pgWCQR9gEOAekkKnZmzF/r38=", 1959 | "dev": true 1960 | }, 1961 | "spdx-license-ids": { 1962 | "version": "1.2.2", 1963 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1964 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1965 | "dev": true 1966 | }, 1967 | "strip-ansi": { 1968 | "version": "3.0.1", 1969 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1970 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1971 | "dev": true, 1972 | "requires": { 1973 | "ansi-regex": "2.0.0" 1974 | } 1975 | }, 1976 | "uid-number": { 1977 | "version": "0.0.6", 1978 | "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", 1979 | "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", 1980 | "dev": true 1981 | }, 1982 | "umask": { 1983 | "version": "1.1.0", 1984 | "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", 1985 | "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", 1986 | "dev": true 1987 | }, 1988 | "validate-npm-package-license": { 1989 | "version": "3.0.1", 1990 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 1991 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 1992 | "dev": true, 1993 | "requires": { 1994 | "spdx-correct": "1.0.2", 1995 | "spdx-expression-parse": "1.0.2" 1996 | }, 1997 | "dependencies": { 1998 | "spdx-correct": { 1999 | "version": "1.0.2", 2000 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 2001 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 2002 | "dev": true, 2003 | "requires": { 2004 | "spdx-license-ids": "1.2.2" 2005 | } 2006 | }, 2007 | "spdx-expression-parse": { 2008 | "version": "1.0.2", 2009 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", 2010 | "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", 2011 | "dev": true, 2012 | "requires": { 2013 | "spdx-exceptions": "1.0.4", 2014 | "spdx-license-ids": "1.2.2" 2015 | }, 2016 | "dependencies": { 2017 | "spdx-exceptions": { 2018 | "version": "1.0.4", 2019 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", 2020 | "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=", 2021 | "dev": true 2022 | } 2023 | } 2024 | } 2025 | } 2026 | }, 2027 | "which": { 2028 | "version": "1.2.10", 2029 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", 2030 | "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", 2031 | "dev": true, 2032 | "requires": { 2033 | "isexe": "1.1.2" 2034 | }, 2035 | "dependencies": { 2036 | "isexe": { 2037 | "version": "1.1.2", 2038 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", 2039 | "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", 2040 | "dev": true 2041 | } 2042 | } 2043 | }, 2044 | "wrappy": { 2045 | "version": "1.0.2", 2046 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2047 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2048 | "dev": true 2049 | } 2050 | } 2051 | }, 2052 | "npmlog": { 2053 | "version": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", 2054 | "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", 2055 | "dev": true, 2056 | "requires": { 2057 | "ansi": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", 2058 | "are-we-there-yet": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", 2059 | "gauge": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" 2060 | } 2061 | }, 2062 | "once": { 2063 | "version": "1.4.0", 2064 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2065 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2066 | "dev": true, 2067 | "requires": { 2068 | "wrappy": "1.0.2" 2069 | } 2070 | }, 2071 | "path-is-absolute": { 2072 | "version": "1.0.1", 2073 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2074 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2075 | "dev": true 2076 | }, 2077 | "path-is-inside": { 2078 | "version": "1.0.2", 2079 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2080 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2081 | "dev": true 2082 | }, 2083 | "path-to-regexp": { 2084 | "version": "1.7.0", 2085 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 2086 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 2087 | "requires": { 2088 | "isarray": "0.0.1" 2089 | }, 2090 | "dependencies": { 2091 | "isarray": { 2092 | "version": "0.0.1", 2093 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2094 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 2095 | } 2096 | } 2097 | }, 2098 | "process-nextick-args": { 2099 | "version": "file:file:.packages/process-nextick-args-1.0.7.tgz", 2100 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 2101 | "dev": true 2102 | }, 2103 | "publish": { 2104 | "version": "https://registry.npmjs.org/publish/-/publish-0.6.0.tgz", 2105 | "integrity": "sha1-yhJMi5YD7hx/c581wS/O+8N3b2g=", 2106 | "dev": true, 2107 | "requires": { 2108 | "nopt": "file:file:.packages/nopt-3.0.6.tgz", 2109 | "npm": "https://registry.npmjs.org/npm/-/npm-2.15.10.tgz", 2110 | "npmlog": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", 2111 | "semver": "file:file:.packages/semver-4.3.6.tgz" 2112 | } 2113 | }, 2114 | "read-installed": { 2115 | "version": "4.0.3", 2116 | "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", 2117 | "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", 2118 | "dev": true, 2119 | "requires": { 2120 | "debuglog": "1.0.1", 2121 | "graceful-fs": "4.1.11", 2122 | "read-package-json": "2.0.12", 2123 | "readdir-scoped-modules": "1.0.2", 2124 | "semver": "file:file:.packages/semver-4.3.6.tgz", 2125 | "slide": "1.1.6", 2126 | "util-extend": "1.0.3" 2127 | } 2128 | }, 2129 | "read-package-json": { 2130 | "version": "2.0.12", 2131 | "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.12.tgz", 2132 | "integrity": "sha512-m7/I0+tP6D34EVvSlzCtuVA4D/dHL6OpLcn2e4XVP5X57pCKGUy1JjRSBVKHWpB+vUU91sL85h84qX0MdXzBSw==", 2133 | "dev": true, 2134 | "requires": { 2135 | "glob": "7.1.2", 2136 | "graceful-fs": "4.1.11", 2137 | "json-parse-better-errors": "1.0.1", 2138 | "normalize-package-data": "2.4.0", 2139 | "slash": "1.0.0" 2140 | } 2141 | }, 2142 | "readable-stream": { 2143 | "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", 2144 | "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", 2145 | "dev": true, 2146 | "requires": { 2147 | "buffer-shims": "file:file:.packages/buffer-shims-1.0.0.tgz", 2148 | "core-util-is": "file:file:.packages/core-util-is-1.0.2.tgz", 2149 | "inherits": "file:file:.packages/inherits-2.0.1.tgz", 2150 | "isarray": "file:file:.packages/isarray-1.0.0.tgz", 2151 | "process-nextick-args": "file:file:.packages/process-nextick-args-1.0.7.tgz", 2152 | "string_decoder": "file:file:.packages/string_decoder-0.10.31.tgz", 2153 | "util-deprecate": "file:file:.packages/util-deprecate-1.0.2.tgz" 2154 | }, 2155 | "dependencies": { 2156 | "isarray": { 2157 | "version": "file:file:.packages/isarray-1.0.0.tgz", 2158 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2159 | "dev": true 2160 | } 2161 | } 2162 | }, 2163 | "readdir-scoped-modules": { 2164 | "version": "1.0.2", 2165 | "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", 2166 | "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", 2167 | "dev": true, 2168 | "requires": { 2169 | "debuglog": "1.0.1", 2170 | "dezalgo": "1.0.3", 2171 | "graceful-fs": "4.1.11", 2172 | "once": "1.4.0" 2173 | } 2174 | }, 2175 | "rimraf": { 2176 | "version": "2.6.2", 2177 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 2178 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 2179 | "dev": true, 2180 | "requires": { 2181 | "glob": "7.1.2" 2182 | } 2183 | }, 2184 | "semver": { 2185 | "version": "file:file:.packages/semver-4.3.6.tgz", 2186 | "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", 2187 | "dev": true 2188 | }, 2189 | "slash": { 2190 | "version": "1.0.0", 2191 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 2192 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", 2193 | "dev": true 2194 | }, 2195 | "slide": { 2196 | "version": "1.1.6", 2197 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 2198 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", 2199 | "dev": true 2200 | }, 2201 | "spdx-correct": { 2202 | "version": "1.0.2", 2203 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 2204 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 2205 | "dev": true, 2206 | "requires": { 2207 | "spdx-license-ids": "1.2.2" 2208 | } 2209 | }, 2210 | "spdx-expression-parse": { 2211 | "version": "1.0.4", 2212 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 2213 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 2214 | "dev": true 2215 | }, 2216 | "spdx-license-ids": { 2217 | "version": "1.2.2", 2218 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 2219 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 2220 | "dev": true 2221 | }, 2222 | "string_decoder": { 2223 | "version": "file:file:.packages/string_decoder-0.10.31.tgz", 2224 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2225 | "dev": true 2226 | }, 2227 | "tar": { 2228 | "version": "2.2.1", 2229 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2230 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2231 | "dev": true, 2232 | "requires": { 2233 | "block-stream": "0.0.9", 2234 | "fstream": "1.0.11", 2235 | "inherits": "file:file:.packages/inherits-2.0.1.tgz" 2236 | } 2237 | }, 2238 | "text-table": { 2239 | "version": "0.2.0", 2240 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2241 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2242 | "dev": true 2243 | }, 2244 | "util-deprecate": { 2245 | "version": "file:file:.packages/util-deprecate-1.0.2.tgz", 2246 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2247 | "dev": true 2248 | }, 2249 | "util-extend": { 2250 | "version": "1.0.3", 2251 | "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", 2252 | "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", 2253 | "dev": true 2254 | }, 2255 | "utils-merge": { 2256 | "version": "1.0.1", 2257 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2258 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2259 | }, 2260 | "validate-npm-package-license": { 2261 | "version": "3.0.1", 2262 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 2263 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 2264 | "dev": true, 2265 | "requires": { 2266 | "spdx-correct": "1.0.2", 2267 | "spdx-expression-parse": "1.0.4" 2268 | } 2269 | }, 2270 | "validate-npm-package-name": { 2271 | "version": "2.2.2", 2272 | "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz", 2273 | "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", 2274 | "dev": true, 2275 | "requires": { 2276 | "builtins": "0.0.7" 2277 | } 2278 | }, 2279 | "wrappy": { 2280 | "version": "1.0.2", 2281 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2282 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2283 | "dev": true 2284 | }, 2285 | "write-file-atomic": { 2286 | "version": "1.1.4", 2287 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz", 2288 | "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", 2289 | "dev": true, 2290 | "requires": { 2291 | "graceful-fs": "4.1.11", 2292 | "imurmurhash": "0.1.4", 2293 | "slide": "1.1.6" 2294 | } 2295 | } 2296 | } 2297 | } 2298 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hermesjs", 3 | "version": "1.4.1", 4 | "description": "Real-time messaging framework", 5 | "main": "index.js", 6 | "author": "Francisco Méndez Vilas (fmvilas@gmail.com)", 7 | "license": "MIT", 8 | "scripts": { 9 | "2npm": "publish" 10 | }, 11 | "keywords": [ 12 | "real-time", 13 | "real", 14 | "time", 15 | "messaging", 16 | "mqtt", 17 | "socketio", 18 | "websockets", 19 | "amqp", 20 | "microservices", 21 | "iot" 22 | ], 23 | "repository": "https://github.com/hitchhq/hermes.git", 24 | "bugs": "https://github.com/hitchhq/hermes/issues", 25 | "dependencies": { 26 | "array-flatten": "^2.1.0", 27 | "debug": "~2.2.0", 28 | "hermesjs-message": "^2.0.0", 29 | "hermesjs-router": "~1.1.0", 30 | "path-to-regexp": "^1.5.3", 31 | "utils-merge": "^1.0.0" 32 | }, 33 | "devDependencies": { 34 | "publish": "^0.6.0" 35 | } 36 | } 37 | --------------------------------------------------------------------------------