├── .eslintrc ├── .gitignore ├── .labrc.js ├── .npmignore ├── .prettierrc ├── .travis.yml ├── .vscode └── settings.json ├── LICENSE.md ├── README.md ├── assets └── header.png ├── index.js ├── lib └── index.js ├── package.json ├── test ├── index.js └── user.service.js └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["prettier"], 3 | "plugins": ["prettier"], 4 | "rules": { 5 | "prettier/prettier": "error" 6 | }, 7 | "parser": "babel-eslint" 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 28 | node_modules 29 | -------------------------------------------------------------------------------- /.labrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | globals: 'bus', 3 | coverage: true 4 | } -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | * 2 | !lib/** 3 | !assets/* 4 | !.npmignore 5 | !README.md -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "es5" 4 | } 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "9" 4 | - "8" 5 | before_install: 6 | - npm install -g codecov 7 | after_success: 8 | - npm run coverage 9 | - codecov -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2, 3 | "editor.insertSpaces": true, 4 | "editor.formatOnSave": true 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2018 Felipe Campos \ 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 4 | 5 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hapi-moleculer 2 | [![npm version](https://badge.fury.io/js/hapi-moleculer.svg)](https://badge.fury.io/js/hapi-moleculer) 3 | [![Build Status](https://travis-ci.com/felipegcampos/hapi-moleculer.svg?branch=master)](https://travis-ci.com/felipegcampos/hapi-moleculer) 4 | [![codecov](https://codecov.io/gh/felipegcampos/hapi-moleculer/branch/master/graph/badge.svg)](https://codecov.io/gh/felipegcampos/hapi-moleculer) 5 | 6 | ![Hapi plugin for the Moleculer Microservices Framework](./assets/header.png) 7 | 8 | [Hapi](https://hapijs.com/) plugin for the [Moleculer Microservices Framework](http://moleculer.services/). 9 | 10 | ## Install 11 | 12 | npm i hapi-moleculer --save 13 | 14 | or 15 | 16 | yarn add hapi-moleculer 17 | 18 | ## Usage 19 | ```javascript 20 | 'use strict' 21 | 22 | const Hapi = require('hapi'); 23 | const HapiMoleculer = require('hapi-moleculer'); 24 | const { ServiceBroker } = require('moleculer'); 25 | 26 | (async function() { 27 | // Create a server 28 | const server = new Hapi.Server({ 29 | host: 'localhost', 30 | port: 3000, 31 | }); 32 | 33 | // Register the plugin 34 | await server.register({ 35 | plugin: HapiMoleculer, 36 | options: { 37 | // broker config object or ServiceBroker instance 38 | broker: { 39 | namespace: 'my-namespace', 40 | logger: true, 41 | logLevel: 'info', 42 | }, 43 | aliases: [{ 44 | method: 'REST', 45 | path: '/users', 46 | action: 'users', 47 | routeOpts: { 48 | // Add tags in all routes 49 | all: { 50 | tags: ['api', 'user'], 51 | }, 52 | // Add properties only for list endpoint ( /user/list ) 53 | list: { 54 | description: 'list all users', 55 | }, 56 | }, 57 | }, { 58 | method: 'POST', 59 | path: '/user/login', 60 | action: 'users.login', 61 | routeOpts: { 62 | description: 'user login', 63 | tags: ['api', 'user'], 64 | // Turn the authentication off for this route ( supposing you have it enabled for all routes ) 65 | auth: false, 66 | // Add custom validation 67 | validate: { 68 | payload: Joi.object({ 69 | user: Joi.object({ 70 | username: Joi.string().required(), 71 | password: Joi.string().required(), 72 | }).required(), 73 | }), 74 | }, 75 | }, 76 | }], 77 | }, 78 | }); 79 | 80 | // Starting server 81 | server.start(); 82 | }()); 83 | ``` 84 | 85 | ## API 86 | 87 | - [Options](#options) 88 | - [Decorations](#decorations) 89 | - [Context](#context) 90 | 91 | 92 | ### Options 93 | 94 | - `name` - **(optional)** Service name that will be used to create the context action names. Default to `api`. 95 | - `broker` - **(optional)** Either a ServiceBroker seeting object or a [ServiceBroker](http://moleculer.services/0.12/api/service-broker.html#ServiceBroker) instance. Default to `{}`. Eg: 96 | ```javascript 97 | // Register the plugin 98 | await server.register({ 99 | plugin: HapiMoleculer, 100 | options: { 101 | broker: { 102 | namespace: 'my-namespace', 103 | logger: true, 104 | logLevel: 'info', 105 | } 106 | } 107 | ); 108 | 109 | // or 110 | 111 | const broker = new ServiceBroker({ 112 | namespace: 'my-namespace', 113 | logger: true, 114 | logLevel: 'info', 115 | }); 116 | await server.register({ plugin, options: { broker }); 117 | ``` 118 | 119 | - `aliases` - **(optional)** Array of alias objects where: 120 | - `method` - **(optional)** Either a string / array of strings representing the method name within ( `GET`, `POST`, `UPDATE`, `DELETE`, `PATCH`, `OPTIONS` ) or a single option within ( `REST`, `*` ). Use `*` to match against any HTTP method. `REST` will create all RESTful paths ( *get*, *list*, *create*, *update* and *remove* ) for the action. Default to `*`. Eg.: 121 | ```javascript 122 | [{ method: 'REST', path: '/user', action: 'users'}] 123 | 124 | // same as 125 | 126 | [ 127 | { method: 'GET', path: '/user/{id}', action: 'users.get'}, 128 | { method: 'GET', path: '/user', action: 'users.list'}, 129 | { method: 'POST', path: '/user', action: 'users.creare'}, 130 | { method: 'PUT', path: '/user/{id}', action: 'users.update'}, 131 | { method: 'DELETE', path: '/user/{id}', action: 'users.remove'} 132 | ] 133 | ``` 134 | > To use REST shorthand alias you need to create a service which has 135 | > `list`, `get`, `create`, `update` and `remove` actions. 136 | 137 | - `path` - **(required)** the absolute path used to match incoming requests ( *must begin with '/'* ). 138 | - `action` - **(required)** Moleculer [action](http://moleculer.services/0.12/docs/service.html#Actions) name. 139 | - `blacklist` - **(optional)** A list of actions that will be cut out from the RESTful paths. Valid values: `list`, `get`, `create`, `update` and `remove`. **Only valid if `method` is `REST`**. Eg.: 140 | ```javascript 141 | [{ 142 | method: 'REST', 143 | path: '/user', 144 | action: 'users', 145 | // it will create just list, get and remove 146 | blacklist: ['create', 'update'] 147 | }] 148 | ``` 149 | - `routeOpts` - **(optional)** additional [route options](https://hapijs.com/api#route-options). When the method name is equal to `REST` the routeOpts has all 5 RESTful options plus one `all` properties: 150 | ```javascript 151 | [{ 152 | method: 'POST', 153 | path: '/users/login', 154 | action: 'users.login', 155 | routeOpts: { 156 | // route options here 157 | }, 158 | },{ 159 | method: 'REST', 160 | path: '/user', 161 | action: 'users', 162 | routeOpts: { 163 | all: { // route options here }, 164 | get: { // route options here }, 165 | list: { // route options here }, 166 | create: { // route options here }, 167 | update: { // route options here }, 168 | delete: { // route options here }, 169 | }, 170 | }] 171 | ``` 172 | > Assign values in the following order: **inner default opts**, **routeOpts.all** and **routeOpts.[actionType]** using [lodash.assign](https://lodash.com/docs/4.17.10#assign). 173 | 174 | ### Decorations 175 | 176 | **hapi-moleculer** decorates the Hapi server and request with `server.broker` and `request.broker` which is the instance of the [ServiceBroker](http://moleculer.services/0.12/api/service-broker.html#ServiceBroker) created in the register function. It can be used to call the actions in the route handler, plugins, etc. Eg.: 177 | ```javascript 178 | const route = { 179 | method: 'POST', 180 | path: '/user/logout', 181 | options: { 182 | validate: { 183 | headers: Joi.object({ 184 | authorization: Joi.string().regex(/^Token [A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_.+/=]*$/).required(), 185 | }).options({ allowUnknown: true }), 186 | } 187 | }, 188 | handler: async function logout(request) { 189 | const { token } = request.auth.credentials; 190 | return request.broker.call('users.logout', { token }); 191 | }, 192 | }; 193 | ``` 194 | 195 | ### Context 196 | 197 | **hapi-moleculer** creates a [Moleculer Context](http://moleculer.services/0.12/api/context.html) to wrap the call in every request. It uses the [Hapi request lifecyle workflow](https://hapijs.com/api#lifecycle-workflow) to first create the Context in the `onPreAuth` step and then set the params in the `onPreHandler` step. The context can be accessed with `request.ctx`. Hence, you can use it to set the `ctx.meta` in the autencation step or any other step you need. Eg.: 198 | ```javascript 199 | "use strict"; 200 | 201 | const Bcrypt = require("bcrypt"); 202 | const Hapi = require("hapi"); 203 | 204 | const users = { 205 | john: { 206 | username: "john", 207 | password: "$2a$10$iqJSHD.BGr0E2IxQwYgJmeP3NvhPrXAeLSaGCj6IR/XU5QtjVu5Tm", // 'secret' 208 | name: "John Doe", 209 | id: "2133d32a" 210 | } 211 | }; 212 | 213 | const validate = async (request, username, password) => { 214 | const user = users[username]; 215 | if (!user) { 216 | return { credentials: null, isValid: false }; 217 | } 218 | 219 | const isValid = await Bcrypt.compare(password, user.password); 220 | const credentials = { id: user.id, name: user.name }; 221 | 222 | // Set the meta if the credentials are valid. 223 | if (isValid) { 224 | request.ctx.meta.credentials = credentials; 225 | } 226 | 227 | return { isValid, credentials }; 228 | }; 229 | 230 | const start = async () => { 231 | const server = Hapi.server({ port: 4000 }); 232 | 233 | await server.register(require("hapi-auth-basic")); 234 | await server.register(require("hapi-moleculer")); 235 | 236 | server.auth.strategy("simple", "basic", { validate }); 237 | 238 | server.route({ 239 | method: "GET", 240 | path: "/", 241 | options: { 242 | auth: "simple" 243 | }, 244 | handler: function(request, h) { 245 | return "welcome"; 246 | } 247 | }); 248 | 249 | await server.start(); 250 | 251 | console.log("server running at: " + server.info.uri); 252 | }; 253 | 254 | start(); 255 | ``` 256 | 257 | ## License 258 | 259 | ISC 260 | -------------------------------------------------------------------------------- /assets/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felipegcampos/hapi-moleculer/69ff59040d83717646dc4b6ef9c81ce8a282b30b/assets/header.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib') 2 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Joi = require('joi'); 4 | const Boom = require('boom'); 5 | const _ = require('lodash'); 6 | const pkg = require('../package.json'); 7 | const { Context, ServiceBroker, Errors } = require('moleculer'); 8 | const internals = {}; 9 | 10 | const { ServiceNotFoundError } = Errors; 11 | 12 | // Plugin name 13 | internals.pluginName = 'hapi-moleculer'; 14 | 15 | // All actions the REST method can have 16 | internals.restActions = ['get', 'list', 'create', 'update', 'remove']; 17 | 18 | // Default route options schema 19 | internals.routeOptsSchema = Joi.object().default({}); 20 | 21 | // Plugin options schema 22 | internals.schema = Joi.object({ 23 | name: Joi.string() 24 | .trim() 25 | .default('api'), 26 | broker: Joi.alternatives() 27 | .try(Joi.object().type(ServiceBroker), Joi.object()) 28 | .default({}), 29 | aliases: Joi.array().items( 30 | Joi.object().keys({ 31 | method: Joi.alternatives() 32 | .try( 33 | Joi.string() 34 | .only('REST', '*') 35 | .uppercase(), 36 | Joi.array() 37 | .items( 38 | Joi.string().only( 39 | 'POST', 40 | 'GET', 41 | 'PUT', 42 | 'DELETE', 43 | 'PATCH', 44 | 'OPTIONS' 45 | ) 46 | ) 47 | .single() 48 | ) 49 | .default('*'), 50 | path: Joi.string() 51 | .regex(/^\/.*$/) 52 | .notes('must begin with /') 53 | .required(), 54 | action: Joi.string().required(), 55 | blacklist: Joi.alternatives().when('method', { 56 | is: 'REST', 57 | then: Joi.array() 58 | .items(Joi.string().allow(internals.restActions)) 59 | .unique(), 60 | otherwise: Joi.forbidden(), 61 | }), 62 | routeOpts: Joi.alternatives().when('method', { 63 | is: 'REST', 64 | then: Joi.object().keys({ 65 | all: internals.routeOptsSchema, 66 | get: internals.routeOptsSchema, 67 | list: internals.routeOptsSchema, 68 | create: internals.routeOptsSchema, 69 | update: internals.routeOptsSchema, 70 | remove: internals.routeOptsSchema, 71 | }), 72 | otherwise: internals.routeOptsSchema, 73 | }), 74 | }) 75 | ), 76 | }); 77 | 78 | /** 79 | * Create Hapi route 80 | * 81 | * @param {Object} alias Normalized alias object 82 | */ 83 | internals.createRoute = ({ method, path, action, routeOpts }) => { 84 | return { 85 | method, 86 | path, 87 | options: _.extend({}, routeOpts, { 88 | plugins: { 89 | [internals.pluginName]: { 90 | action, 91 | }, 92 | }, 93 | }), 94 | handler: async (request, h) => { 95 | const params = _.assign( 96 | {}, 97 | request.payload, 98 | request.params, 99 | request.query 100 | ); 101 | const resp = await request.ctx.call(request.$endpoint, params); 102 | // Hapi handler must return a value 103 | if (!resp) { 104 | return h.response('').code(200); 105 | } 106 | return resp; 107 | }, 108 | }; 109 | }; 110 | 111 | /** 112 | * Normalize rest model alias 113 | * 114 | * @param {String} type One of list, get, update, remove or create 115 | * @param {Object} alias Alias object from options 116 | */ 117 | internals.normalizeAlias = (type, alias) => { 118 | const defaultRouteOpts = {}; 119 | const paramValidation = { 120 | params: { 121 | id: Joi.alternatives() 122 | .try(Joi.string(), Joi.number()) 123 | .required(), 124 | }, 125 | }; 126 | 127 | let method; 128 | let { path } = alias; 129 | switch (type) { 130 | case 'list': 131 | method = 'GET'; 132 | break; 133 | case 'get': 134 | method = 'GET'; 135 | path = `${path}/{id}`; 136 | _.assign(defaultRouteOpts, { validate: paramValidation }); 137 | break; 138 | case 'update': 139 | method = 'PUT'; 140 | path = `${path}/{id}`; 141 | _.assign(defaultRouteOpts, { validate: paramValidation }); 142 | break; 143 | case 'remove': 144 | method = 'DELETE'; 145 | path = `${path}/{id}`; 146 | _.assign(defaultRouteOpts, { validate: paramValidation }); 147 | break; 148 | case 'create': 149 | method = 'POST'; 150 | break; 151 | /* $lab:coverage:off$ */ 152 | default: 153 | method = 'GET'; 154 | break; 155 | /* $lab:coverage:on$ */ 156 | } 157 | const action = `${alias.action}.${type}`; 158 | const routeOpts = _.assign( 159 | defaultRouteOpts, 160 | _.get(alias, `routeOpts.all`, {}), 161 | _.get(alias, `routeOpts.${type}`, {}) 162 | ); 163 | 164 | return { method, path, action, routeOpts }; 165 | }; 166 | 167 | /** 168 | * Create Moleculer Context 169 | * 170 | * @param {Object} request request object (https://hapijs.com/api#request) 171 | * @param {Object} h response toolkit (https://hapijs.com/api#response-toolkit) 172 | */ 173 | internals.onPreAuth = async function(request, h) { 174 | const method = request.method.toLowerCase(); 175 | const action = { 176 | name: `${this.name}.${method}`, 177 | }; 178 | 179 | request.ctx = Context.create( 180 | request.broker, 181 | action, 182 | request.broker.nodeID, 183 | request.params, 184 | {} 185 | ); 186 | 187 | return h.continue; 188 | }; 189 | 190 | /** 191 | * Update context params 192 | * 193 | * @param {Object} request request object (https://hapijs.com/api#request) 194 | * @param {Object} h response toolkit (https://hapijs.com/api#response-toolkit) 195 | */ 196 | internals.onPreHandler = async (request, h) => { 197 | // Merging params 198 | const params = _.assign({}, request.payload, request.params, request.query); 199 | request.ctx.setParams(params); 200 | 201 | // Check action visibility 202 | const action = _.get( 203 | request.route, 204 | `settings.plugins[${internals.pluginName}].action` 205 | ); 206 | if (action) { 207 | const endpoint = request.broker.findNextActionEndpoint(action); 208 | if (endpoint instanceof Error) { 209 | throw endpoint; 210 | } 211 | if ( 212 | !_.isNil(endpoint.action.visibility) && 213 | endpoint.action.visibility !== 'published' 214 | ) { 215 | // Action can't be published 216 | throw new ServiceNotFoundError({ action }); 217 | } 218 | 219 | request.$endpoint = endpoint; 220 | request.$action = endpoint.action; 221 | } 222 | 223 | return h.continue; 224 | }; 225 | 226 | /** 227 | * Handler the errors from Moleculer. 228 | * 229 | * @param {Object} request request object (https://hapijs.com/api#request) 230 | * @param {Object} h response toolkit (https://hapijs.com/api#response-toolkit) 231 | */ 232 | internals.onPreResponse = async (request, h) => { 233 | const { response } = request; 234 | if (response.isBoom) { 235 | let error = response.output.payload.message; 236 | let statusCode = response.output.payload.statusCode; 237 | let message = response.output.payload.message; 238 | 239 | if (statusCode === 500 && response.message) { 240 | error = response.message; 241 | statusCode = response.code || 400; 242 | } 243 | 244 | return new Boom(error, { 245 | statusCode, 246 | message, 247 | data: response.data, 248 | }); 249 | } 250 | return h.continue; 251 | }; 252 | 253 | /** 254 | * Plugin register function ( https://hapijs.com/api#plugins ) 255 | * 256 | * @param {*} server the server object with a plugin-specific server.realm 257 | * @param {Object} options any options passed to the plugin during registration via server.register() 258 | */ 259 | internals.register = async (server, options) => { 260 | const opts = Joi.attempt( 261 | options, 262 | internals.schema, 263 | `Invalid ${internals.pluginName} options` 264 | ); 265 | 266 | let broker; 267 | if (Object.getPrototypeOf(opts.broker).hasOwnProperty('MOLECULER_VERSION')) { 268 | broker = opts.broker; 269 | } else { 270 | broker = new ServiceBroker(opts.broker); 271 | } 272 | 273 | if (!_.isNil(opts.aliases) && !_.isEmpty(opts.aliases)) { 274 | const { createRoute, normalizeAlias } = internals; 275 | const routes = []; 276 | _.each(opts.aliases, alias => { 277 | if (alias.method === 'REST') { 278 | const blacklist = alias.blacklist || []; 279 | const actions = _.without(internals.restActions, ...blacklist); 280 | _.forEach(actions, action => { 281 | routes.push(createRoute(normalizeAlias(action, alias))); 282 | }); 283 | } else { 284 | routes.push(createRoute(alias)); 285 | } 286 | }); 287 | server.route(routes); 288 | } 289 | 290 | server.ext('onPreAuth', internals.onPreAuth, { bind: { name: opts.name } }); 291 | server.ext('onPreHandler', internals.onPreHandler); 292 | server.ext('onPreResponse', internals.onPreResponse); 293 | 294 | server.decorate('server', 'broker', broker); 295 | server.decorate('request', 'broker', broker); 296 | 297 | await broker.start(); 298 | }; 299 | 300 | module.exports = { 301 | name: internals.pluginName, 302 | register: internals.register, 303 | pkg, 304 | }; 305 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hapi-moleculer", 3 | "version": "2.2.0", 4 | "description": "Hapi.js plugin for MoleculerJS integration", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "yarn lint && lab", 8 | "lint": "eslint lib test", 9 | "coverage": "lab -r lcov -o coverage/lcov.info" 10 | }, 11 | "keywords": [ 12 | "hapi", 13 | "moleculer", 14 | "broker", 15 | "microservices" 16 | ], 17 | "engines": { 18 | "node": ">= 8.x.x" 19 | }, 20 | "author": "Felipe Campos ", 21 | "license": "ISC", 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/felipegcampos/hapi-moleculer.git" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/felipegcampos/hapi-moleculer/issues" 28 | }, 29 | "homepage": "https://github.com/felipegcampos/hapi-moleculer#readme", 30 | "devDependencies": { 31 | "amqplib": "^0.5.2", 32 | "babel-eslint": "^8.2.3", 33 | "code": "^5.2.0", 34 | "eslint": "^4.19.1", 35 | "eslint-config-prettier": "^2.9.0", 36 | "eslint-plugin-prettier": "^2.6.0", 37 | "hapi": "^17.5.0", 38 | "husky": "^1.0.0-rc.8", 39 | "lab": "^15.4.5", 40 | "moleculer": "^0.13.1", 41 | "prettier": "1.13.4", 42 | "pretty-quick": "^1.6.0" 43 | }, 44 | "dependencies": { 45 | "boom": "^7.2.0", 46 | "joi": "^13.3.0" 47 | }, 48 | "husky": { 49 | "hooks": { 50 | "pre-commit": "pretty-quick --staged" 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { expect } = require('code'); 4 | const Lab = require('lab'); 5 | const lab = (exports.lab = Lab.script()); 6 | const Hapi = require('hapi'); 7 | const Joi = require('joi'); 8 | const { ServiceBroker } = require('moleculer'); 9 | const HapiMoleculer = require('../lib'); 10 | 11 | const setup = async () => { 12 | const server = new Hapi.Server(); 13 | server.route({ 14 | method: 'GET', 15 | path: '/hapi/custom', 16 | handler: () => 'Hapi Custom', 17 | }); 18 | 19 | const broker = new ServiceBroker({ logger: false }); 20 | broker.loadService('./test/user.service'); 21 | 22 | await server.register({ 23 | plugin: HapiMoleculer, 24 | options: { 25 | broker, 26 | aliases: [ 27 | { 28 | method: 'POST', 29 | path: '/user/login', 30 | action: 'user.login', 31 | }, 32 | { 33 | method: 'POST', 34 | path: '/user/context', 35 | action: 'user.context', 36 | routeOpts: { 37 | validate: { 38 | query: { 39 | name: Joi.string().default('Felipe'), 40 | }, 41 | }, 42 | pre: [ 43 | (request, h) => { 44 | request.ctx.meta.userId = 123456; 45 | return h.continue; 46 | }, 47 | ], 48 | }, 49 | }, 50 | { 51 | method: 'GET', 52 | path: '/user/noret', 53 | action: 'user.noret', 54 | }, 55 | { 56 | method: 'REST', 57 | path: '/users', 58 | action: 'user', 59 | }, 60 | { 61 | method: 'GET', 62 | path: '/user/me', 63 | action: 'user.me', 64 | routeOpts: { 65 | validate: { 66 | query: { 67 | name: Joi.string().required(), 68 | }, 69 | }, 70 | }, 71 | }, 72 | { 73 | method: 'GET', 74 | path: '/user/confidential', 75 | action: 'user.confidential', 76 | }, 77 | { 78 | method: 'REST', 79 | path: '/rest', 80 | action: 'user', 81 | routeOpts: { 82 | all: { 83 | description: 'Rest description', 84 | }, 85 | create: { 86 | description: 'Overwritten description', 87 | }, 88 | }, 89 | }, 90 | { 91 | method: 'REST', 92 | path: '/blacklist', 93 | action: 'user', 94 | blacklist: ['create', 'update'], 95 | }, 96 | { 97 | method: 'GET', 98 | path: '/error', 99 | action: 'test', 100 | }, 101 | { 102 | method: 'GET', 103 | path: '/nostatuserror', 104 | action: 'user.nostatuserror', 105 | }, 106 | ], 107 | }, 108 | }); 109 | 110 | return server; 111 | }; 112 | 113 | lab.experiment('HapiMoleculer', () => { 114 | lab.experiment('broker options object', () => { 115 | let server = null; 116 | 117 | lab.before(async () => { 118 | server = new Hapi.Server(); 119 | await server.register({ 120 | plugin: HapiMoleculer, 121 | options: { 122 | broker: { 123 | namespace: 'testnmsp', 124 | logger: false, 125 | }, 126 | }, 127 | }); 128 | }); 129 | 130 | lab.test('should decorate server', () => { 131 | const { decorations } = server; 132 | expect(decorations.request).contains('broker'); 133 | expect(decorations.server).contains('broker'); 134 | }); 135 | 136 | lab.test('should be defined', () => { 137 | expect(server.broker).to.be.instanceof(ServiceBroker); 138 | }); 139 | }); 140 | 141 | lab.experiment('broker instance', () => { 142 | let server = null; 143 | 144 | lab.before(async () => { 145 | server = await setup(); 146 | }); 147 | 148 | lab.experiment('plugin', () => { 149 | lab.test('should decorate server', () => { 150 | const { decorations } = server; 151 | expect(decorations.request).contains('broker'); 152 | expect(decorations.server).contains('broker'); 153 | }); 154 | 155 | lab.test('should be defined', () => { 156 | expect(server.broker).to.be.instanceof(ServiceBroker); 157 | }); 158 | }); 159 | 160 | lab.experiment('single alias', () => { 161 | lab.test('should fail with wrong method', async () => { 162 | const res = await server.inject('/user/login'); 163 | 164 | expect(res.statusCode).to.equal(404); 165 | }); 166 | 167 | lab.test('should return success', async () => { 168 | const res = await server.inject({ url: '/user/login', method: 'POST' }); 169 | 170 | expect(res.statusCode).to.equal(200); 171 | expect(res.result).to.equal('User logged in'); 172 | }); 173 | 174 | lab.test('should use route options', async () => { 175 | const res = await server.inject('/user/me'); 176 | 177 | expect(res.statusCode).to.equal(400); 178 | expect(res.statusMessage).to.equal('Bad Request'); 179 | }); 180 | 181 | lab.test( 182 | 'should return success status if no return from action', 183 | async () => { 184 | const res = await server.inject('/user/noret'); 185 | 186 | expect(res.statusCode).to.equal(200); 187 | expect(res.result).to.equal(''); 188 | } 189 | ); 190 | 191 | lab.test('should fail with strict visibility', async () => { 192 | const res = await server.inject('/user/confidential'); 193 | expect(res.statusCode).to.equal(404); 194 | }); 195 | }); 196 | 197 | lab.experiment('rest alias', () => { 198 | lab.test('should execute get action', async () => { 199 | const res = await server.inject({ 200 | url: '/users/123456', 201 | method: 'GET', 202 | }); 203 | 204 | expect(res.statusCode).to.equal(200); 205 | expect(res.result).to.equal('Get user 123456'); 206 | }); 207 | 208 | lab.test('should execute list action', async () => { 209 | const res = await server.inject({ url: '/users', method: 'GET' }); 210 | 211 | expect(res.statusCode).to.equal(200); 212 | expect(res.result).to.equal('List users'); 213 | }); 214 | 215 | lab.test('should execute update action', async () => { 216 | const res = await server.inject({ 217 | url: '/users/123456', 218 | method: 'PUT', 219 | }); 220 | 221 | expect(res.statusCode).to.equal(200); 222 | expect(res.result).to.equal('Update user 123456'); 223 | }); 224 | 225 | lab.test('should execute remove action', async () => { 226 | const res = await server.inject({ 227 | url: '/users/123456', 228 | method: 'DELETE', 229 | }); 230 | 231 | expect(res.statusCode).to.equal(200); 232 | expect(res.result).to.equal('Remove user 123456'); 233 | }); 234 | 235 | lab.test('should execute create action', async () => { 236 | const res = await server.inject({ url: '/users', method: 'POST' }); 237 | 238 | expect(res.statusCode).to.equal(200); 239 | expect(res.result).to.equal('Create user'); 240 | }); 241 | 242 | lab.test("should use 'all' route options", async () => { 243 | const res = await server.inject({ url: '/rest/12345', method: 'GET' }); 244 | 245 | expect(res.request.route.settings.description).to.exists(); 246 | expect(res.request.route.settings.description).to.equal( 247 | 'Rest description' 248 | ); 249 | }); 250 | 251 | lab.test('should use specific route options', async () => { 252 | const res = await server.inject({ url: '/rest', method: 'POST' }); 253 | 254 | expect(res.request.route.settings.description).to.exists(); 255 | expect(res.request.route.settings.description).to.equal( 256 | 'Overwritten description' 257 | ); 258 | }); 259 | 260 | lab.test('should fail to access blacklisted route', async () => { 261 | const res = await server.inject({ url: '/blacklist', method: 'POST' }); 262 | 263 | expect(res.statusCode).to.equal(404); 264 | }); 265 | 266 | lab.test('should access non-blacklisted route', async () => { 267 | const res = await server.inject({ url: '/blacklist', method: 'GET' }); 268 | 269 | expect(res.statusCode).to.equal(200); 270 | expect(res.result).to.equal('List users'); 271 | }); 272 | }); 273 | 274 | lab.experiment('moleculer context', () => { 275 | lab.test('should create context', async () => { 276 | const res = await server.inject({ 277 | url: '/user/context', 278 | method: 'POST', 279 | }); 280 | 281 | expect(res.statusCode).to.equal(200); 282 | expect(res.result).to.equal('User context 123456'); 283 | }); 284 | }); 285 | 286 | lab.experiment('errors', () => { 287 | lab.test('should bomify moleculer error with status', async () => { 288 | const res = await server.inject('/error'); 289 | 290 | expect(res.statusCode).to.equal(404); 291 | expect(res.result).to.exist(); 292 | expect(res.result.statusCode).to.equal(404); 293 | expect(res.result.error).to.equal('Not Found'); 294 | expect(res.result.message).to.equal("Service 'test' is not found."); 295 | }); 296 | 297 | lab.test('should bomify moleculer error with no status', async () => { 298 | const res = await server.inject('/nostatuserror'); 299 | 300 | expect(res.statusCode).to.equal(400); 301 | expect(res.result).to.exist(); 302 | expect(res.result.statusCode).to.equal(400); 303 | expect(res.result.error).to.equal('Bad Request'); 304 | expect(res.result.message).to.equal("It's a no status error."); 305 | }); 306 | }); 307 | 308 | lab.experiment('hapi requests', () => { 309 | lab.test('should execute hapi custom request', async () => { 310 | const res = await server.inject('/hapi/custom'); 311 | 312 | expect(res.statusCode).to.equal(200); 313 | expect(res.result).to.equal('Hapi Custom'); 314 | }); 315 | }); 316 | }); 317 | }); 318 | -------------------------------------------------------------------------------- /test/user.service.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: 'user', 3 | actions: { 4 | login() { 5 | return 'User logged in'; 6 | }, 7 | me(ctx) { 8 | return `Check me ${ctx.params.name}`; 9 | }, 10 | create() { 11 | return 'Create user'; 12 | }, 13 | get(ctx) { 14 | return `Get user ${ctx.params.id}`; 15 | }, 16 | list() { 17 | return 'List users'; 18 | }, 19 | update(ctx) { 20 | return `Update user ${ctx.params.id}`; 21 | }, 22 | remove(ctx) { 23 | return `Remove user ${ctx.params.id}`; 24 | }, 25 | context(ctx) { 26 | return `User context ${ctx.meta.userId}`; 27 | }, 28 | confidential: { 29 | visibility: 'public', 30 | handler(ctx) { 31 | return 'Confidential!'; 32 | }, 33 | }, 34 | noret() { 35 | // do smth here and do not return 36 | }, 37 | nostatuserror() { 38 | throw new Error("It's a no status error."); 39 | }, 40 | }, 41 | }; 42 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.0.0-beta.44": 6 | version "7.0.0-beta.44" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" 8 | dependencies: 9 | "@babel/highlight" "7.0.0-beta.44" 10 | 11 | "@babel/generator@7.0.0-beta.44": 12 | version "7.0.0-beta.44" 13 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" 14 | dependencies: 15 | "@babel/types" "7.0.0-beta.44" 16 | jsesc "^2.5.1" 17 | lodash "^4.2.0" 18 | source-map "^0.5.0" 19 | trim-right "^1.0.1" 20 | 21 | "@babel/helper-function-name@7.0.0-beta.44": 22 | version "7.0.0-beta.44" 23 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" 24 | dependencies: 25 | "@babel/helper-get-function-arity" "7.0.0-beta.44" 26 | "@babel/template" "7.0.0-beta.44" 27 | "@babel/types" "7.0.0-beta.44" 28 | 29 | "@babel/helper-get-function-arity@7.0.0-beta.44": 30 | version "7.0.0-beta.44" 31 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" 32 | dependencies: 33 | "@babel/types" "7.0.0-beta.44" 34 | 35 | "@babel/helper-split-export-declaration@7.0.0-beta.44": 36 | version "7.0.0-beta.44" 37 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" 38 | dependencies: 39 | "@babel/types" "7.0.0-beta.44" 40 | 41 | "@babel/highlight@7.0.0-beta.44": 42 | version "7.0.0-beta.44" 43 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" 44 | dependencies: 45 | chalk "^2.0.0" 46 | esutils "^2.0.2" 47 | js-tokens "^3.0.0" 48 | 49 | "@babel/template@7.0.0-beta.44": 50 | version "7.0.0-beta.44" 51 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" 52 | dependencies: 53 | "@babel/code-frame" "7.0.0-beta.44" 54 | "@babel/types" "7.0.0-beta.44" 55 | babylon "7.0.0-beta.44" 56 | lodash "^4.2.0" 57 | 58 | "@babel/traverse@7.0.0-beta.44": 59 | version "7.0.0-beta.44" 60 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" 61 | dependencies: 62 | "@babel/code-frame" "7.0.0-beta.44" 63 | "@babel/generator" "7.0.0-beta.44" 64 | "@babel/helper-function-name" "7.0.0-beta.44" 65 | "@babel/helper-split-export-declaration" "7.0.0-beta.44" 66 | "@babel/types" "7.0.0-beta.44" 67 | babylon "7.0.0-beta.44" 68 | debug "^3.1.0" 69 | globals "^11.1.0" 70 | invariant "^2.2.0" 71 | lodash "^4.2.0" 72 | 73 | "@babel/types@7.0.0-beta.44": 74 | version "7.0.0-beta.44" 75 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" 76 | dependencies: 77 | esutils "^2.0.2" 78 | lodash "^4.2.0" 79 | to-fast-properties "^2.0.0" 80 | 81 | accept@3.x.x: 82 | version "3.0.2" 83 | resolved "https://registry.yarnpkg.com/accept/-/accept-3.0.2.tgz#83e41cec7e1149f3fd474880423873db6c6cc9ac" 84 | dependencies: 85 | boom "7.x.x" 86 | hoek "5.x.x" 87 | 88 | acorn-jsx@^3.0.0: 89 | version "3.0.1" 90 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 91 | dependencies: 92 | acorn "^3.0.4" 93 | 94 | acorn@^3.0.4: 95 | version "3.3.0" 96 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 97 | 98 | acorn@^5.5.0: 99 | version "5.5.3" 100 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" 101 | 102 | ajv-keywords@^2.1.0: 103 | version "2.1.1" 104 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 105 | 106 | ajv@^5.2.3, ajv@^5.3.0: 107 | version "5.5.2" 108 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 109 | dependencies: 110 | co "^4.6.0" 111 | fast-deep-equal "^1.0.0" 112 | fast-json-stable-stringify "^2.0.0" 113 | json-schema-traverse "^0.3.0" 114 | 115 | align-text@^0.1.1, align-text@^0.1.3: 116 | version "0.1.4" 117 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 118 | dependencies: 119 | kind-of "^3.0.2" 120 | longest "^1.0.1" 121 | repeat-string "^1.5.2" 122 | 123 | amdefine@>=0.0.4: 124 | version "1.0.1" 125 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 126 | 127 | ammo@3.x.x: 128 | version "3.0.1" 129 | resolved "https://registry.yarnpkg.com/ammo/-/ammo-3.0.1.tgz#c79ceeac36fb4e55085ea3fe0c2f42bfa5f7c914" 130 | dependencies: 131 | hoek "5.x.x" 132 | 133 | amqplib@^0.5.2: 134 | version "0.5.2" 135 | resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63" 136 | dependencies: 137 | bitsyntax "~0.0.4" 138 | bluebird "^3.4.6" 139 | buffer-more-ints "0.0.2" 140 | readable-stream "1.x >=1.1.9" 141 | safe-buffer "^5.0.1" 142 | 143 | ansi-escapes@^3.0.0: 144 | version "3.1.0" 145 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 146 | 147 | ansi-regex@^2.0.0: 148 | version "2.1.1" 149 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 150 | 151 | ansi-regex@^3.0.0: 152 | version "3.0.0" 153 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 154 | 155 | ansi-styles@^2.2.1: 156 | version "2.2.1" 157 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 158 | 159 | ansi-styles@^3.2.1: 160 | version "3.2.1" 161 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 162 | dependencies: 163 | color-convert "^1.9.0" 164 | 165 | argparse@^1.0.7: 166 | version "1.0.10" 167 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 168 | dependencies: 169 | sprintf-js "~1.0.2" 170 | 171 | args@5.0.0: 172 | version "5.0.0" 173 | resolved "https://registry.yarnpkg.com/args/-/args-5.0.0.tgz#8a3e376f28550f9fbdfefcb097179f2f75848efe" 174 | dependencies: 175 | camelcase "5.0.0" 176 | chalk "2.4.1" 177 | leven "2.1.0" 178 | mri "1.1.1" 179 | 180 | array-union@^1.0.1: 181 | version "1.0.2" 182 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 183 | dependencies: 184 | array-uniq "^1.0.1" 185 | 186 | array-uniq@^1.0.1: 187 | version "1.0.3" 188 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 189 | 190 | arrify@^1.0.0: 191 | version "1.0.1" 192 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 193 | 194 | async@^1.4.0: 195 | version "1.5.2" 196 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 197 | 198 | b64@4.x.x: 199 | version "4.0.0" 200 | resolved "https://registry.yarnpkg.com/b64/-/b64-4.0.0.tgz#c37f587f0a383c7019e821120e8c3f58f0d22772" 201 | 202 | babel-code-frame@^6.22.0: 203 | version "6.26.0" 204 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 205 | dependencies: 206 | chalk "^1.1.3" 207 | esutils "^2.0.2" 208 | js-tokens "^3.0.2" 209 | 210 | babel-eslint@^8.2.3: 211 | version "8.2.3" 212 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" 213 | dependencies: 214 | "@babel/code-frame" "7.0.0-beta.44" 215 | "@babel/traverse" "7.0.0-beta.44" 216 | "@babel/types" "7.0.0-beta.44" 217 | babylon "7.0.0-beta.44" 218 | eslint-scope "~3.7.1" 219 | eslint-visitor-keys "^1.0.0" 220 | 221 | babylon@7.0.0-beta.44: 222 | version "7.0.0-beta.44" 223 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" 224 | 225 | balanced-match@^1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 228 | 229 | big-time@2.x.x: 230 | version "2.0.1" 231 | resolved "https://registry.yarnpkg.com/big-time/-/big-time-2.0.1.tgz#68c7df8dc30f97e953f25a67a76ac9713c16c9de" 232 | 233 | bitsyntax@~0.0.4: 234 | version "0.0.4" 235 | resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" 236 | dependencies: 237 | buffer-more-ints "0.0.2" 238 | 239 | bluebird@3.5.1, bluebird@^3.4.6: 240 | version "3.5.1" 241 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 242 | 243 | boom@7.x.x, boom@^7.2.0: 244 | version "7.2.0" 245 | resolved "https://registry.yarnpkg.com/boom/-/boom-7.2.0.tgz#2bff24a55565767fde869ec808317eb10c48e966" 246 | dependencies: 247 | hoek "5.x.x" 248 | 249 | bossy@4.x.x: 250 | version "4.0.1" 251 | resolved "https://registry.yarnpkg.com/bossy/-/bossy-4.0.1.tgz#2a57c904988ca869954f2060b96fa0ecb12262ba" 252 | dependencies: 253 | boom "7.x.x" 254 | hoek "5.x.x" 255 | joi "13.x.x" 256 | 257 | bounce@1.x.x: 258 | version "1.2.0" 259 | resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.0.tgz#e3bac68c73fd256e38096551efc09f504873c8c8" 260 | dependencies: 261 | boom "7.x.x" 262 | hoek "5.x.x" 263 | 264 | brace-expansion@^1.1.7: 265 | version "1.1.11" 266 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 267 | dependencies: 268 | balanced-match "^1.0.0" 269 | concat-map "0.0.1" 270 | 271 | buffer-from@^1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" 274 | 275 | buffer-more-ints@0.0.2: 276 | version "0.0.2" 277 | resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" 278 | 279 | builtin-modules@^1.0.0: 280 | version "1.1.1" 281 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 282 | 283 | call@5.x.x: 284 | version "5.0.1" 285 | resolved "https://registry.yarnpkg.com/call/-/call-5.0.1.tgz#ac1b5c106d9edc2a17af2a4a4f74dd4f0c06e910" 286 | dependencies: 287 | boom "7.x.x" 288 | hoek "5.x.x" 289 | 290 | caller-path@^0.1.0: 291 | version "0.1.0" 292 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 293 | dependencies: 294 | callsites "^0.2.0" 295 | 296 | callsites@^0.2.0: 297 | version "0.2.0" 298 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 299 | 300 | camelcase@5.0.0: 301 | version "5.0.0" 302 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" 303 | 304 | camelcase@^1.0.2: 305 | version "1.2.1" 306 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 307 | 308 | catbox-memory@3.x.x: 309 | version "3.1.2" 310 | resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-3.1.2.tgz#4aeec1bc994419c0f7e60087f172aaedd9b4911c" 311 | dependencies: 312 | big-time "2.x.x" 313 | boom "7.x.x" 314 | hoek "5.x.x" 315 | 316 | catbox@10.x.x: 317 | version "10.0.2" 318 | resolved "https://registry.yarnpkg.com/catbox/-/catbox-10.0.2.tgz#e6ac1f35102d1a9bd07915b82e508d12b50a8bfa" 319 | dependencies: 320 | boom "7.x.x" 321 | bounce "1.x.x" 322 | hoek "5.x.x" 323 | joi "13.x.x" 324 | 325 | center-align@^0.1.1: 326 | version "0.1.3" 327 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 328 | dependencies: 329 | align-text "^0.1.3" 330 | lazy-cache "^1.0.3" 331 | 332 | chalk@2.4.1, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: 333 | version "2.4.1" 334 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 335 | dependencies: 336 | ansi-styles "^3.2.1" 337 | escape-string-regexp "^1.0.5" 338 | supports-color "^5.3.0" 339 | 340 | chalk@^1.1.3: 341 | version "1.1.3" 342 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 343 | dependencies: 344 | ansi-styles "^2.2.1" 345 | escape-string-regexp "^1.0.2" 346 | has-ansi "^2.0.0" 347 | strip-ansi "^3.0.0" 348 | supports-color "^2.0.0" 349 | 350 | chardet@^0.4.0: 351 | version "0.4.2" 352 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 353 | 354 | ci-info@^1.0.0: 355 | version "1.1.3" 356 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" 357 | 358 | circular-json@^0.3.1: 359 | version "0.3.3" 360 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 361 | 362 | cli-cursor@^2.1.0: 363 | version "2.1.0" 364 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 365 | dependencies: 366 | restore-cursor "^2.0.0" 367 | 368 | cli-width@^2.0.0: 369 | version "2.2.0" 370 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 371 | 372 | cliui@^2.1.0: 373 | version "2.1.0" 374 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 375 | dependencies: 376 | center-align "^0.1.1" 377 | right-align "^0.1.1" 378 | wordwrap "0.0.2" 379 | 380 | co@^4.6.0: 381 | version "4.6.0" 382 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 383 | 384 | code@^5.2.0: 385 | version "5.2.0" 386 | resolved "https://registry.yarnpkg.com/code/-/code-5.2.0.tgz#fb3a5e247afc17e3d65c49e7ce0f69ebe51a75b5" 387 | dependencies: 388 | hoek "5.x.x" 389 | 390 | color-convert@^1.9.0: 391 | version "1.9.2" 392 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 393 | dependencies: 394 | color-name "1.1.1" 395 | 396 | color-name@1.1.1: 397 | version "1.1.1" 398 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 399 | 400 | concat-map@0.0.1: 401 | version "0.0.1" 402 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 403 | 404 | concat-stream@^1.6.0: 405 | version "1.6.2" 406 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 407 | dependencies: 408 | buffer-from "^1.0.0" 409 | inherits "^2.0.3" 410 | readable-stream "^2.2.2" 411 | typedarray "^0.0.6" 412 | 413 | content@4.x.x: 414 | version "4.0.5" 415 | resolved "https://registry.yarnpkg.com/content/-/content-4.0.5.tgz#bc547deabc889ab69bce17faf3585c29f4c41bf2" 416 | dependencies: 417 | boom "7.x.x" 418 | 419 | core-util-is@~1.0.0: 420 | version "1.0.2" 421 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 422 | 423 | cosmiconfig@^5.0.2: 424 | version "5.0.5" 425 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0" 426 | dependencies: 427 | is-directory "^0.3.1" 428 | js-yaml "^3.9.0" 429 | parse-json "^4.0.0" 430 | 431 | cross-spawn@^5.0.1, cross-spawn@^5.1.0: 432 | version "5.1.0" 433 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 434 | dependencies: 435 | lru-cache "^4.0.1" 436 | shebang-command "^1.2.0" 437 | which "^1.2.9" 438 | 439 | cryptiles@4.x.x: 440 | version "4.1.1" 441 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-4.1.1.tgz#169256b9df9fe3c73f8085c99e30b32247d4ab46" 442 | dependencies: 443 | boom "7.x.x" 444 | 445 | debug@^3.1.0: 446 | version "3.1.0" 447 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 448 | dependencies: 449 | ms "2.0.0" 450 | 451 | decamelize@^1.0.0: 452 | version "1.2.0" 453 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 454 | 455 | deep-is@~0.1.3: 456 | version "0.1.3" 457 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 458 | 459 | del@^2.0.2: 460 | version "2.2.2" 461 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 462 | dependencies: 463 | globby "^5.0.0" 464 | is-path-cwd "^1.0.0" 465 | is-path-in-cwd "^1.0.0" 466 | object-assign "^4.0.1" 467 | pify "^2.0.0" 468 | pinkie-promise "^2.0.0" 469 | rimraf "^2.2.8" 470 | 471 | diff@3.5.x: 472 | version "3.5.0" 473 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 474 | 475 | doctrine@^2.1.0: 476 | version "2.1.0" 477 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 478 | dependencies: 479 | esutils "^2.0.2" 480 | 481 | error-ex@^1.3.1: 482 | version "1.3.1" 483 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 484 | dependencies: 485 | is-arrayish "^0.2.1" 486 | 487 | es6-error@4.1.1: 488 | version "4.1.1" 489 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 490 | 491 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 492 | version "1.0.5" 493 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 494 | 495 | eslint-config-hapi@11.x.x: 496 | version "11.1.0" 497 | resolved "https://registry.yarnpkg.com/eslint-config-hapi/-/eslint-config-hapi-11.1.0.tgz#9e22136ff678deb8121d58c31f9a083a4a4a6f12" 498 | 499 | eslint-config-prettier@^2.9.0: 500 | version "2.9.0" 501 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz#5ecd65174d486c22dff389fe036febf502d468a3" 502 | dependencies: 503 | get-stdin "^5.0.1" 504 | 505 | eslint-plugin-hapi@4.x.x: 506 | version "4.1.0" 507 | resolved "https://registry.yarnpkg.com/eslint-plugin-hapi/-/eslint-plugin-hapi-4.1.0.tgz#ca6b97b7621ae45cf70ab92f8c847a85414a56c9" 508 | dependencies: 509 | hapi-capitalize-modules "1.x.x" 510 | hapi-for-you "1.x.x" 511 | hapi-no-var "1.x.x" 512 | hapi-scope-start "2.x.x" 513 | no-arrowception "1.x.x" 514 | 515 | eslint-plugin-prettier@^2.6.0: 516 | version "2.6.0" 517 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz#33e4e228bdb06142d03c560ce04ec23f6c767dd7" 518 | dependencies: 519 | fast-diff "^1.1.1" 520 | jest-docblock "^21.0.0" 521 | 522 | eslint-scope@^3.7.1, eslint-scope@~3.7.1: 523 | version "3.7.1" 524 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 525 | dependencies: 526 | esrecurse "^4.1.0" 527 | estraverse "^4.1.1" 528 | 529 | eslint-visitor-keys@^1.0.0: 530 | version "1.0.0" 531 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 532 | 533 | eslint@4.19.x, eslint@^4.19.1: 534 | version "4.19.1" 535 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 536 | dependencies: 537 | ajv "^5.3.0" 538 | babel-code-frame "^6.22.0" 539 | chalk "^2.1.0" 540 | concat-stream "^1.6.0" 541 | cross-spawn "^5.1.0" 542 | debug "^3.1.0" 543 | doctrine "^2.1.0" 544 | eslint-scope "^3.7.1" 545 | eslint-visitor-keys "^1.0.0" 546 | espree "^3.5.4" 547 | esquery "^1.0.0" 548 | esutils "^2.0.2" 549 | file-entry-cache "^2.0.0" 550 | functional-red-black-tree "^1.0.1" 551 | glob "^7.1.2" 552 | globals "^11.0.1" 553 | ignore "^3.3.3" 554 | imurmurhash "^0.1.4" 555 | inquirer "^3.0.6" 556 | is-resolvable "^1.0.0" 557 | js-yaml "^3.9.1" 558 | json-stable-stringify-without-jsonify "^1.0.1" 559 | levn "^0.3.0" 560 | lodash "^4.17.4" 561 | minimatch "^3.0.2" 562 | mkdirp "^0.5.1" 563 | natural-compare "^1.4.0" 564 | optionator "^0.8.2" 565 | path-is-inside "^1.0.2" 566 | pluralize "^7.0.0" 567 | progress "^2.0.0" 568 | regexpp "^1.0.1" 569 | require-uncached "^1.0.3" 570 | semver "^5.3.0" 571 | strip-ansi "^4.0.0" 572 | strip-json-comments "~2.0.1" 573 | table "4.0.2" 574 | text-table "~0.2.0" 575 | 576 | espree@3.5.x, espree@^3.5.4: 577 | version "3.5.4" 578 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 579 | dependencies: 580 | acorn "^5.5.0" 581 | acorn-jsx "^3.0.0" 582 | 583 | esprima@^4.0.0: 584 | version "4.0.0" 585 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 586 | 587 | esquery@^1.0.0: 588 | version "1.0.1" 589 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 590 | dependencies: 591 | estraverse "^4.0.0" 592 | 593 | esrecurse@^4.1.0: 594 | version "4.2.1" 595 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 596 | dependencies: 597 | estraverse "^4.1.0" 598 | 599 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 600 | version "4.2.0" 601 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 602 | 603 | esutils@^2.0.2: 604 | version "2.0.2" 605 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 606 | 607 | eventemitter2@5.0.1: 608 | version "5.0.1" 609 | resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" 610 | 611 | execa@^0.8.0: 612 | version "0.8.0" 613 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" 614 | dependencies: 615 | cross-spawn "^5.0.1" 616 | get-stream "^3.0.0" 617 | is-stream "^1.1.0" 618 | npm-run-path "^2.0.0" 619 | p-finally "^1.0.0" 620 | signal-exit "^3.0.0" 621 | strip-eof "^1.0.0" 622 | 623 | execa@^0.9.0: 624 | version "0.9.0" 625 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" 626 | dependencies: 627 | cross-spawn "^5.0.1" 628 | get-stream "^3.0.0" 629 | is-stream "^1.1.0" 630 | npm-run-path "^2.0.0" 631 | p-finally "^1.0.0" 632 | signal-exit "^3.0.0" 633 | strip-eof "^1.0.0" 634 | 635 | external-editor@^2.0.4: 636 | version "2.2.0" 637 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 638 | dependencies: 639 | chardet "^0.4.0" 640 | iconv-lite "^0.4.17" 641 | tmp "^0.0.33" 642 | 643 | fast-deep-equal@^1.0.0: 644 | version "1.1.0" 645 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 646 | 647 | fast-diff@^1.1.1: 648 | version "1.1.2" 649 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" 650 | 651 | fast-json-stable-stringify@^2.0.0: 652 | version "2.0.0" 653 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 654 | 655 | fast-levenshtein@~2.0.4: 656 | version "2.0.6" 657 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 658 | 659 | fastest-validator@0.6.10: 660 | version "0.6.10" 661 | resolved "https://registry.yarnpkg.com/fastest-validator/-/fastest-validator-0.6.10.tgz#1d120c2fa9afd73612911db099ff707c028f8461" 662 | 663 | figures@^2.0.0: 664 | version "2.0.0" 665 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 666 | dependencies: 667 | escape-string-regexp "^1.0.5" 668 | 669 | file-entry-cache@^2.0.0: 670 | version "2.0.0" 671 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 672 | dependencies: 673 | flat-cache "^1.2.1" 674 | object-assign "^4.0.1" 675 | 676 | find-rc@3.0.x: 677 | version "3.0.1" 678 | resolved "https://registry.yarnpkg.com/find-rc/-/find-rc-3.0.1.tgz#54a4178370f10bc9371fa8d1b2c2809a2afa0cce" 679 | 680 | find-up@^2.1.0: 681 | version "2.1.0" 682 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 683 | dependencies: 684 | locate-path "^2.0.0" 685 | 686 | flat-cache@^1.2.1: 687 | version "1.3.0" 688 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 689 | dependencies: 690 | circular-json "^0.3.1" 691 | del "^2.0.2" 692 | graceful-fs "^4.1.2" 693 | write "^0.2.1" 694 | 695 | fs.realpath@^1.0.0: 696 | version "1.0.0" 697 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 698 | 699 | functional-red-black-tree@^1.0.1: 700 | version "1.0.1" 701 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 702 | 703 | get-stdin@^5.0.1: 704 | version "5.0.1" 705 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" 706 | 707 | get-stdin@^6.0.0: 708 | version "6.0.0" 709 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 710 | 711 | get-stream@^3.0.0: 712 | version "3.0.0" 713 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 714 | 715 | glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 716 | version "7.1.2" 717 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 718 | dependencies: 719 | fs.realpath "^1.0.0" 720 | inflight "^1.0.4" 721 | inherits "2" 722 | minimatch "^3.0.4" 723 | once "^1.3.0" 724 | path-is-absolute "^1.0.0" 725 | 726 | globals@^11.0.1, globals@^11.1.0: 727 | version "11.5.0" 728 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" 729 | 730 | globby@^5.0.0: 731 | version "5.0.0" 732 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 733 | dependencies: 734 | array-union "^1.0.1" 735 | arrify "^1.0.0" 736 | glob "^7.0.3" 737 | object-assign "^4.0.1" 738 | pify "^2.0.0" 739 | pinkie-promise "^2.0.0" 740 | 741 | graceful-fs@^4.1.2: 742 | version "4.1.11" 743 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 744 | 745 | handlebars@4.x.x: 746 | version "4.0.11" 747 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" 748 | dependencies: 749 | async "^1.4.0" 750 | optimist "^0.6.1" 751 | source-map "^0.4.4" 752 | optionalDependencies: 753 | uglify-js "^2.6" 754 | 755 | hapi-capitalize-modules@1.x.x: 756 | version "1.1.6" 757 | resolved "https://registry.yarnpkg.com/hapi-capitalize-modules/-/hapi-capitalize-modules-1.1.6.tgz#7991171415e15e6aa3231e64dda73c8146665318" 758 | 759 | hapi-for-you@1.x.x: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/hapi-for-you/-/hapi-for-you-1.0.0.tgz#d362fbee8d7bda9c2c7801e207e5a5cd1a0b6a7b" 762 | 763 | hapi-no-var@1.x.x: 764 | version "1.0.1" 765 | resolved "https://registry.yarnpkg.com/hapi-no-var/-/hapi-no-var-1.0.1.tgz#e9d87fd4de6149104a3fca797ef5c2ef5c182342" 766 | 767 | hapi-scope-start@2.x.x: 768 | version "2.1.1" 769 | resolved "https://registry.yarnpkg.com/hapi-scope-start/-/hapi-scope-start-2.1.1.tgz#7495a726fe72b7bca8de2cdcc1d87cd8ce6ab4f2" 770 | 771 | hapi@^17.5.0: 772 | version "17.5.0" 773 | resolved "https://registry.yarnpkg.com/hapi/-/hapi-17.5.0.tgz#9fc33f10d6f563d0203853937b60dd13a59b51ce" 774 | dependencies: 775 | accept "3.x.x" 776 | ammo "3.x.x" 777 | boom "7.x.x" 778 | bounce "1.x.x" 779 | call "5.x.x" 780 | catbox "10.x.x" 781 | catbox-memory "3.x.x" 782 | heavy "6.x.x" 783 | hoek "5.x.x" 784 | joi "13.x.x" 785 | mimos "4.x.x" 786 | podium "3.x.x" 787 | shot "4.x.x" 788 | statehood "6.x.x" 789 | subtext "6.x.x" 790 | teamwork "3.x.x" 791 | topo "3.x.x" 792 | 793 | has-ansi@^2.0.0: 794 | version "2.0.0" 795 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 796 | dependencies: 797 | ansi-regex "^2.0.0" 798 | 799 | has-flag@^2.0.0: 800 | version "2.0.0" 801 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 802 | 803 | has-flag@^3.0.0: 804 | version "3.0.0" 805 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 806 | 807 | heavy@6.x.x: 808 | version "6.1.0" 809 | resolved "https://registry.yarnpkg.com/heavy/-/heavy-6.1.0.tgz#1bbfa43dc61dd4b543ede3ff87db8306b7967274" 810 | dependencies: 811 | boom "7.x.x" 812 | hoek "5.x.x" 813 | joi "13.x.x" 814 | 815 | hoek@5.x.x: 816 | version "5.0.3" 817 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.3.tgz#b71d40d943d0a95da01956b547f83c4a5b4a34ac" 818 | 819 | hosted-git-info@^2.1.4: 820 | version "2.6.0" 821 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" 822 | 823 | husky@^1.0.0-rc.8: 824 | version "1.0.0-rc.8" 825 | resolved "https://registry.yarnpkg.com/husky/-/husky-1.0.0-rc.8.tgz#2fa25d0b89269f5b8bfa1ca001370fdb058e8792" 826 | dependencies: 827 | cosmiconfig "^5.0.2" 828 | execa "^0.9.0" 829 | find-up "^2.1.0" 830 | get-stdin "^6.0.0" 831 | is-ci "^1.1.0" 832 | pkg-dir "^2.0.0" 833 | pupa "^1.0.0" 834 | read-pkg "^3.0.0" 835 | run-node "^1.0.0" 836 | slash "^2.0.0" 837 | 838 | iconv-lite@^0.4.17: 839 | version "0.4.23" 840 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 841 | dependencies: 842 | safer-buffer ">= 2.1.2 < 3" 843 | 844 | ignore@^3.3.3, ignore@^3.3.7: 845 | version "3.3.8" 846 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" 847 | 848 | imurmurhash@^0.1.4: 849 | version "0.1.4" 850 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 851 | 852 | inflight@^1.0.4: 853 | version "1.0.6" 854 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 855 | dependencies: 856 | once "^1.3.0" 857 | wrappy "1" 858 | 859 | inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 860 | version "2.0.3" 861 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 862 | 863 | inquirer@^3.0.6: 864 | version "3.3.0" 865 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 866 | dependencies: 867 | ansi-escapes "^3.0.0" 868 | chalk "^2.0.0" 869 | cli-cursor "^2.1.0" 870 | cli-width "^2.0.0" 871 | external-editor "^2.0.4" 872 | figures "^2.0.0" 873 | lodash "^4.3.0" 874 | mute-stream "0.0.7" 875 | run-async "^2.2.0" 876 | rx-lite "^4.0.8" 877 | rx-lite-aggregates "^4.0.8" 878 | string-width "^2.1.0" 879 | strip-ansi "^4.0.0" 880 | through "^2.3.6" 881 | 882 | invariant@^2.2.0: 883 | version "2.2.4" 884 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 885 | dependencies: 886 | loose-envify "^1.0.0" 887 | 888 | ipaddr.js@1.8.0: 889 | version "1.8.0" 890 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 891 | 892 | iron@5.x.x: 893 | version "5.0.4" 894 | resolved "https://registry.yarnpkg.com/iron/-/iron-5.0.4.tgz#003ed822f656f07c2b62762815f5de3947326867" 895 | dependencies: 896 | boom "7.x.x" 897 | cryptiles "4.x.x" 898 | hoek "5.x.x" 899 | 900 | is-arrayish@^0.2.1: 901 | version "0.2.1" 902 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 903 | 904 | is-buffer@^1.1.5: 905 | version "1.1.6" 906 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 907 | 908 | is-builtin-module@^1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 911 | dependencies: 912 | builtin-modules "^1.0.0" 913 | 914 | is-ci@^1.1.0: 915 | version "1.1.0" 916 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" 917 | dependencies: 918 | ci-info "^1.0.0" 919 | 920 | is-directory@^0.3.1: 921 | version "0.3.1" 922 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 923 | 924 | is-fullwidth-code-point@^2.0.0: 925 | version "2.0.0" 926 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 927 | 928 | is-path-cwd@^1.0.0: 929 | version "1.0.0" 930 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 931 | 932 | is-path-in-cwd@^1.0.0: 933 | version "1.0.1" 934 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 935 | dependencies: 936 | is-path-inside "^1.0.0" 937 | 938 | is-path-inside@^1.0.0: 939 | version "1.0.1" 940 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 941 | dependencies: 942 | path-is-inside "^1.0.1" 943 | 944 | is-promise@^2.1.0: 945 | version "2.1.0" 946 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 947 | 948 | is-resolvable@^1.0.0: 949 | version "1.1.0" 950 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 951 | 952 | is-stream@^1.1.0: 953 | version "1.1.0" 954 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 955 | 956 | isarray@0.0.1: 957 | version "0.0.1" 958 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 959 | 960 | isarray@~1.0.0: 961 | version "1.0.0" 962 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 963 | 964 | isemail@3.x.x: 965 | version "3.1.2" 966 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.2.tgz#937cf919002077999a73ea8b1951d590e84e01dd" 967 | dependencies: 968 | punycode "2.x.x" 969 | 970 | isexe@^2.0.0: 971 | version "2.0.0" 972 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 973 | 974 | jest-docblock@^21.0.0: 975 | version "21.2.0" 976 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" 977 | 978 | joi@13.x.x, joi@^13.3.0: 979 | version "13.3.0" 980 | resolved "https://registry.yarnpkg.com/joi/-/joi-13.3.0.tgz#4defd4333b539c5d10e444ab44f5a5583480f17c" 981 | dependencies: 982 | hoek "5.x.x" 983 | isemail "3.x.x" 984 | topo "3.x.x" 985 | 986 | js-tokens@^3.0.0, js-tokens@^3.0.2: 987 | version "3.0.2" 988 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 989 | 990 | js-yaml@^3.9.0: 991 | version "3.12.0" 992 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 993 | dependencies: 994 | argparse "^1.0.7" 995 | esprima "^4.0.0" 996 | 997 | js-yaml@^3.9.1: 998 | version "3.11.0" 999 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" 1000 | dependencies: 1001 | argparse "^1.0.7" 1002 | esprima "^4.0.0" 1003 | 1004 | jsesc@^2.5.1: 1005 | version "2.5.1" 1006 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 1007 | 1008 | json-parse-better-errors@^1.0.1: 1009 | version "1.0.2" 1010 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1011 | 1012 | json-schema-traverse@^0.3.0: 1013 | version "0.3.1" 1014 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1015 | 1016 | json-stable-stringify-without-jsonify@^1.0.1: 1017 | version "1.0.1" 1018 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1019 | 1020 | json-stable-stringify@1.x.x: 1021 | version "1.0.1" 1022 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1023 | dependencies: 1024 | jsonify "~0.0.0" 1025 | 1026 | json-stringify-safe@5.x.x: 1027 | version "5.0.1" 1028 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1029 | 1030 | jsonify@~0.0.0: 1031 | version "0.0.0" 1032 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1033 | 1034 | kind-of@^3.0.2: 1035 | version "3.2.2" 1036 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1037 | dependencies: 1038 | is-buffer "^1.1.5" 1039 | 1040 | lab@^15.4.5: 1041 | version "15.4.5" 1042 | resolved "https://registry.yarnpkg.com/lab/-/lab-15.4.5.tgz#dab1ddcb43d9fbb9d818ecbaf5af83abfffc8059" 1043 | dependencies: 1044 | bossy "4.x.x" 1045 | diff "3.5.x" 1046 | eslint "4.19.x" 1047 | eslint-config-hapi "11.x.x" 1048 | eslint-plugin-hapi "4.x.x" 1049 | espree "3.5.x" 1050 | find-rc "3.0.x" 1051 | handlebars "4.x.x" 1052 | hoek "5.x.x" 1053 | json-stable-stringify "1.x.x" 1054 | json-stringify-safe "5.x.x" 1055 | mkdirp "0.5.x" 1056 | seedrandom "2.4.x" 1057 | source-map "0.6.x" 1058 | source-map-support "0.5.x" 1059 | supports-color "4.4.x" 1060 | will-call "1.x.x" 1061 | 1062 | lazy-cache@^1.0.3: 1063 | version "1.0.4" 1064 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1065 | 1066 | leven@2.1.0: 1067 | version "2.1.0" 1068 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 1069 | 1070 | levn@^0.3.0, levn@~0.3.0: 1071 | version "0.3.0" 1072 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1073 | dependencies: 1074 | prelude-ls "~1.1.2" 1075 | type-check "~0.3.2" 1076 | 1077 | load-json-file@^4.0.0: 1078 | version "4.0.0" 1079 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" 1080 | dependencies: 1081 | graceful-fs "^4.1.2" 1082 | parse-json "^4.0.0" 1083 | pify "^3.0.0" 1084 | strip-bom "^3.0.0" 1085 | 1086 | locate-path@^2.0.0: 1087 | version "2.0.0" 1088 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1089 | dependencies: 1090 | p-locate "^2.0.0" 1091 | path-exists "^3.0.0" 1092 | 1093 | lodash@4.17.10, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: 1094 | version "4.17.10" 1095 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 1096 | 1097 | longest@^1.0.1: 1098 | version "1.0.1" 1099 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1100 | 1101 | loose-envify@^1.0.0: 1102 | version "1.3.1" 1103 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1104 | dependencies: 1105 | js-tokens "^3.0.0" 1106 | 1107 | lru-cache@^4.0.1: 1108 | version "4.1.3" 1109 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 1110 | dependencies: 1111 | pseudomap "^1.0.2" 1112 | yallist "^2.1.2" 1113 | 1114 | mime-db@1.x.x: 1115 | version "1.33.0" 1116 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1117 | 1118 | mimic-fn@^1.0.0: 1119 | version "1.2.0" 1120 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1121 | 1122 | mimos@4.x.x: 1123 | version "4.0.0" 1124 | resolved "https://registry.yarnpkg.com/mimos/-/mimos-4.0.0.tgz#76e3d27128431cb6482fd15b20475719ad626a5a" 1125 | dependencies: 1126 | hoek "5.x.x" 1127 | mime-db "1.x.x" 1128 | 1129 | minimatch@^3.0.2, minimatch@^3.0.4: 1130 | version "3.0.4" 1131 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1132 | dependencies: 1133 | brace-expansion "^1.1.7" 1134 | 1135 | minimist@0.0.8: 1136 | version "0.0.8" 1137 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1138 | 1139 | minimist@~0.0.1: 1140 | version "0.0.10" 1141 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1142 | 1143 | mkdirp@0.5.x, mkdirp@^0.5.1: 1144 | version "0.5.1" 1145 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1146 | dependencies: 1147 | minimist "0.0.8" 1148 | 1149 | moleculer@^0.13.1: 1150 | version "0.13.1" 1151 | resolved "https://registry.yarnpkg.com/moleculer/-/moleculer-0.13.1.tgz#71451aae7e3129c212e1fc2c7121b7cc1e1a8ee5" 1152 | dependencies: 1153 | args "5.0.0" 1154 | bluebird "3.5.1" 1155 | chalk "2.4.1" 1156 | es6-error "4.1.1" 1157 | eventemitter2 "5.0.1" 1158 | fastest-validator "0.6.10" 1159 | glob "7.1.2" 1160 | ipaddr.js "1.8.0" 1161 | lodash "4.17.10" 1162 | 1163 | mri@1.1.1, mri@^1.1.0: 1164 | version "1.1.1" 1165 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.1.tgz#85aa26d3daeeeedf80dc5984af95cc5ca5cad9f1" 1166 | 1167 | ms@2.0.0: 1168 | version "2.0.0" 1169 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1170 | 1171 | mute-stream@0.0.7: 1172 | version "0.0.7" 1173 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1174 | 1175 | natural-compare@^1.4.0: 1176 | version "1.4.0" 1177 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1178 | 1179 | nigel@3.x.x: 1180 | version "3.0.1" 1181 | resolved "https://registry.yarnpkg.com/nigel/-/nigel-3.0.1.tgz#48a08859d65177312f1c25af7252c1e07bb07c2a" 1182 | dependencies: 1183 | hoek "5.x.x" 1184 | vise "3.x.x" 1185 | 1186 | no-arrowception@1.x.x: 1187 | version "1.0.0" 1188 | resolved "https://registry.yarnpkg.com/no-arrowception/-/no-arrowception-1.0.0.tgz#5bf3e95eb9c41b57384a805333daa3b734ee327a" 1189 | 1190 | normalize-package-data@^2.3.2: 1191 | version "2.4.0" 1192 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1193 | dependencies: 1194 | hosted-git-info "^2.1.4" 1195 | is-builtin-module "^1.0.0" 1196 | semver "2 || 3 || 4 || 5" 1197 | validate-npm-package-license "^3.0.1" 1198 | 1199 | npm-run-path@^2.0.0: 1200 | version "2.0.2" 1201 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1202 | dependencies: 1203 | path-key "^2.0.0" 1204 | 1205 | object-assign@^4.0.1: 1206 | version "4.1.1" 1207 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1208 | 1209 | once@^1.3.0: 1210 | version "1.4.0" 1211 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1212 | dependencies: 1213 | wrappy "1" 1214 | 1215 | onetime@^2.0.0: 1216 | version "2.0.1" 1217 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1218 | dependencies: 1219 | mimic-fn "^1.0.0" 1220 | 1221 | optimist@^0.6.1: 1222 | version "0.6.1" 1223 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1224 | dependencies: 1225 | minimist "~0.0.1" 1226 | wordwrap "~0.0.2" 1227 | 1228 | optionator@^0.8.2: 1229 | version "0.8.2" 1230 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1231 | dependencies: 1232 | deep-is "~0.1.3" 1233 | fast-levenshtein "~2.0.4" 1234 | levn "~0.3.0" 1235 | prelude-ls "~1.1.2" 1236 | type-check "~0.3.2" 1237 | wordwrap "~1.0.0" 1238 | 1239 | os-tmpdir@~1.0.2: 1240 | version "1.0.2" 1241 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1242 | 1243 | p-finally@^1.0.0: 1244 | version "1.0.0" 1245 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1246 | 1247 | p-limit@^1.1.0: 1248 | version "1.3.0" 1249 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1250 | dependencies: 1251 | p-try "^1.0.0" 1252 | 1253 | p-locate@^2.0.0: 1254 | version "2.0.0" 1255 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1256 | dependencies: 1257 | p-limit "^1.1.0" 1258 | 1259 | p-try@^1.0.0: 1260 | version "1.0.0" 1261 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1262 | 1263 | parse-json@^4.0.0: 1264 | version "4.0.0" 1265 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1266 | dependencies: 1267 | error-ex "^1.3.1" 1268 | json-parse-better-errors "^1.0.1" 1269 | 1270 | path-exists@^3.0.0: 1271 | version "3.0.0" 1272 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1273 | 1274 | path-is-absolute@^1.0.0: 1275 | version "1.0.1" 1276 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1277 | 1278 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1279 | version "1.0.2" 1280 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1281 | 1282 | path-key@^2.0.0: 1283 | version "2.0.1" 1284 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1285 | 1286 | path-type@^3.0.0: 1287 | version "3.0.0" 1288 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 1289 | dependencies: 1290 | pify "^3.0.0" 1291 | 1292 | pez@4.x.x: 1293 | version "4.0.2" 1294 | resolved "https://registry.yarnpkg.com/pez/-/pez-4.0.2.tgz#0a7c81b64968e90b0e9562b398f390939e9c4b53" 1295 | dependencies: 1296 | b64 "4.x.x" 1297 | boom "7.x.x" 1298 | content "4.x.x" 1299 | hoek "5.x.x" 1300 | nigel "3.x.x" 1301 | 1302 | pify@^2.0.0: 1303 | version "2.3.0" 1304 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1305 | 1306 | pify@^3.0.0: 1307 | version "3.0.0" 1308 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1309 | 1310 | pinkie-promise@^2.0.0: 1311 | version "2.0.1" 1312 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1313 | dependencies: 1314 | pinkie "^2.0.0" 1315 | 1316 | pinkie@^2.0.0: 1317 | version "2.0.4" 1318 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1319 | 1320 | pkg-dir@^2.0.0: 1321 | version "2.0.0" 1322 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1323 | dependencies: 1324 | find-up "^2.1.0" 1325 | 1326 | pluralize@^7.0.0: 1327 | version "7.0.0" 1328 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1329 | 1330 | podium@3.x.x: 1331 | version "3.1.2" 1332 | resolved "https://registry.yarnpkg.com/podium/-/podium-3.1.2.tgz#b701429739cf6bdde6b3015ae6b48d400817ce9e" 1333 | dependencies: 1334 | hoek "5.x.x" 1335 | joi "13.x.x" 1336 | 1337 | prelude-ls@~1.1.2: 1338 | version "1.1.2" 1339 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1340 | 1341 | prettier@1.13.4: 1342 | version "1.13.4" 1343 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.4.tgz#31bbae6990f13b1093187c731766a14036fa72e6" 1344 | 1345 | pretty-quick@^1.6.0: 1346 | version "1.6.0" 1347 | resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.6.0.tgz#afc3591eb5c4cf37614a305d489a8a40e57c9258" 1348 | dependencies: 1349 | chalk "^2.3.0" 1350 | execa "^0.8.0" 1351 | find-up "^2.1.0" 1352 | ignore "^3.3.7" 1353 | mri "^1.1.0" 1354 | 1355 | process-nextick-args@~2.0.0: 1356 | version "2.0.0" 1357 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1358 | 1359 | progress@^2.0.0: 1360 | version "2.0.0" 1361 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1362 | 1363 | pseudomap@^1.0.2: 1364 | version "1.0.2" 1365 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1366 | 1367 | punycode@2.x.x: 1368 | version "2.1.1" 1369 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1370 | 1371 | pupa@^1.0.0: 1372 | version "1.0.0" 1373 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6" 1374 | 1375 | read-pkg@^3.0.0: 1376 | version "3.0.0" 1377 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" 1378 | dependencies: 1379 | load-json-file "^4.0.0" 1380 | normalize-package-data "^2.3.2" 1381 | path-type "^3.0.0" 1382 | 1383 | "readable-stream@1.x >=1.1.9": 1384 | version "1.1.14" 1385 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1386 | dependencies: 1387 | core-util-is "~1.0.0" 1388 | inherits "~2.0.1" 1389 | isarray "0.0.1" 1390 | string_decoder "~0.10.x" 1391 | 1392 | readable-stream@^2.2.2: 1393 | version "2.3.6" 1394 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1395 | dependencies: 1396 | core-util-is "~1.0.0" 1397 | inherits "~2.0.3" 1398 | isarray "~1.0.0" 1399 | process-nextick-args "~2.0.0" 1400 | safe-buffer "~5.1.1" 1401 | string_decoder "~1.1.1" 1402 | util-deprecate "~1.0.1" 1403 | 1404 | regexpp@^1.0.1: 1405 | version "1.1.0" 1406 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 1407 | 1408 | repeat-string@^1.5.2: 1409 | version "1.6.1" 1410 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1411 | 1412 | require-uncached@^1.0.3: 1413 | version "1.0.3" 1414 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1415 | dependencies: 1416 | caller-path "^0.1.0" 1417 | resolve-from "^1.0.0" 1418 | 1419 | resolve-from@^1.0.0: 1420 | version "1.0.1" 1421 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1422 | 1423 | restore-cursor@^2.0.0: 1424 | version "2.0.0" 1425 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1426 | dependencies: 1427 | onetime "^2.0.0" 1428 | signal-exit "^3.0.2" 1429 | 1430 | right-align@^0.1.1: 1431 | version "0.1.3" 1432 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1433 | dependencies: 1434 | align-text "^0.1.1" 1435 | 1436 | rimraf@^2.2.8: 1437 | version "2.6.2" 1438 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1439 | dependencies: 1440 | glob "^7.0.5" 1441 | 1442 | run-async@^2.2.0: 1443 | version "2.3.0" 1444 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1445 | dependencies: 1446 | is-promise "^2.1.0" 1447 | 1448 | run-node@^1.0.0: 1449 | version "1.0.0" 1450 | resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" 1451 | 1452 | rx-lite-aggregates@^4.0.8: 1453 | version "4.0.8" 1454 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1455 | dependencies: 1456 | rx-lite "*" 1457 | 1458 | rx-lite@*, rx-lite@^4.0.8: 1459 | version "4.0.8" 1460 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1461 | 1462 | safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1463 | version "5.1.2" 1464 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1465 | 1466 | "safer-buffer@>= 2.1.2 < 3": 1467 | version "2.1.2" 1468 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1469 | 1470 | seedrandom@2.4.x: 1471 | version "2.4.3" 1472 | resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" 1473 | 1474 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 1475 | version "5.5.0" 1476 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1477 | 1478 | shebang-command@^1.2.0: 1479 | version "1.2.0" 1480 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1481 | dependencies: 1482 | shebang-regex "^1.0.0" 1483 | 1484 | shebang-regex@^1.0.0: 1485 | version "1.0.0" 1486 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1487 | 1488 | shot@4.x.x: 1489 | version "4.0.5" 1490 | resolved "https://registry.yarnpkg.com/shot/-/shot-4.0.5.tgz#c7e7455d11d60f6b6cd3c43e15a3b431c17e5566" 1491 | dependencies: 1492 | hoek "5.x.x" 1493 | joi "13.x.x" 1494 | 1495 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1496 | version "3.0.2" 1497 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1498 | 1499 | slash@^2.0.0: 1500 | version "2.0.0" 1501 | resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 1502 | 1503 | slice-ansi@1.0.0: 1504 | version "1.0.0" 1505 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 1506 | dependencies: 1507 | is-fullwidth-code-point "^2.0.0" 1508 | 1509 | source-map-support@0.5.x: 1510 | version "0.5.6" 1511 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" 1512 | dependencies: 1513 | buffer-from "^1.0.0" 1514 | source-map "^0.6.0" 1515 | 1516 | source-map@0.6.x, source-map@^0.6.0: 1517 | version "0.6.1" 1518 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1519 | 1520 | source-map@^0.4.4: 1521 | version "0.4.4" 1522 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1523 | dependencies: 1524 | amdefine ">=0.0.4" 1525 | 1526 | source-map@^0.5.0, source-map@~0.5.1: 1527 | version "0.5.7" 1528 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1529 | 1530 | spdx-correct@^3.0.0: 1531 | version "3.0.0" 1532 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 1533 | dependencies: 1534 | spdx-expression-parse "^3.0.0" 1535 | spdx-license-ids "^3.0.0" 1536 | 1537 | spdx-exceptions@^2.1.0: 1538 | version "2.1.0" 1539 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 1540 | 1541 | spdx-expression-parse@^3.0.0: 1542 | version "3.0.0" 1543 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1544 | dependencies: 1545 | spdx-exceptions "^2.1.0" 1546 | spdx-license-ids "^3.0.0" 1547 | 1548 | spdx-license-ids@^3.0.0: 1549 | version "3.0.0" 1550 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 1551 | 1552 | sprintf-js@~1.0.2: 1553 | version "1.0.3" 1554 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1555 | 1556 | statehood@6.x.x: 1557 | version "6.0.6" 1558 | resolved "https://registry.yarnpkg.com/statehood/-/statehood-6.0.6.tgz#0dbd7c50774d3f61a24e42b0673093bbc81fa5f0" 1559 | dependencies: 1560 | boom "7.x.x" 1561 | bounce "1.x.x" 1562 | cryptiles "4.x.x" 1563 | hoek "5.x.x" 1564 | iron "5.x.x" 1565 | joi "13.x.x" 1566 | 1567 | string-width@^2.1.0, string-width@^2.1.1: 1568 | version "2.1.1" 1569 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1570 | dependencies: 1571 | is-fullwidth-code-point "^2.0.0" 1572 | strip-ansi "^4.0.0" 1573 | 1574 | string_decoder@~0.10.x: 1575 | version "0.10.31" 1576 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1577 | 1578 | string_decoder@~1.1.1: 1579 | version "1.1.1" 1580 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1581 | dependencies: 1582 | safe-buffer "~5.1.0" 1583 | 1584 | strip-ansi@^3.0.0: 1585 | version "3.0.1" 1586 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1587 | dependencies: 1588 | ansi-regex "^2.0.0" 1589 | 1590 | strip-ansi@^4.0.0: 1591 | version "4.0.0" 1592 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1593 | dependencies: 1594 | ansi-regex "^3.0.0" 1595 | 1596 | strip-bom@^3.0.0: 1597 | version "3.0.0" 1598 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1599 | 1600 | strip-eof@^1.0.0: 1601 | version "1.0.0" 1602 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1603 | 1604 | strip-json-comments@~2.0.1: 1605 | version "2.0.1" 1606 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1607 | 1608 | subtext@6.x.x: 1609 | version "6.0.7" 1610 | resolved "https://registry.yarnpkg.com/subtext/-/subtext-6.0.7.tgz#8e40a67901a734d598142665c90e398369b885f9" 1611 | dependencies: 1612 | boom "7.x.x" 1613 | content "4.x.x" 1614 | hoek "5.x.x" 1615 | pez "4.x.x" 1616 | wreck "14.x.x" 1617 | 1618 | supports-color@4.4.x: 1619 | version "4.4.0" 1620 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 1621 | dependencies: 1622 | has-flag "^2.0.0" 1623 | 1624 | supports-color@^2.0.0: 1625 | version "2.0.0" 1626 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1627 | 1628 | supports-color@^5.3.0: 1629 | version "5.4.0" 1630 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1631 | dependencies: 1632 | has-flag "^3.0.0" 1633 | 1634 | table@4.0.2: 1635 | version "4.0.2" 1636 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 1637 | dependencies: 1638 | ajv "^5.2.3" 1639 | ajv-keywords "^2.1.0" 1640 | chalk "^2.1.0" 1641 | lodash "^4.17.4" 1642 | slice-ansi "1.0.0" 1643 | string-width "^2.1.1" 1644 | 1645 | teamwork@3.x.x: 1646 | version "3.0.1" 1647 | resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.1.tgz#ff38c7161f41f8070b7813716eb6154036ece196" 1648 | 1649 | text-table@~0.2.0: 1650 | version "0.2.0" 1651 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1652 | 1653 | through@^2.3.6: 1654 | version "2.3.8" 1655 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1656 | 1657 | tmp@^0.0.33: 1658 | version "0.0.33" 1659 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1660 | dependencies: 1661 | os-tmpdir "~1.0.2" 1662 | 1663 | to-fast-properties@^2.0.0: 1664 | version "2.0.0" 1665 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1666 | 1667 | topo@3.x.x: 1668 | version "3.0.0" 1669 | resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.0.tgz#37e48c330efeac784538e0acd3e62ca5e231fe7a" 1670 | dependencies: 1671 | hoek "5.x.x" 1672 | 1673 | trim-right@^1.0.1: 1674 | version "1.0.1" 1675 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1676 | 1677 | type-check@~0.3.2: 1678 | version "0.3.2" 1679 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1680 | dependencies: 1681 | prelude-ls "~1.1.2" 1682 | 1683 | typedarray@^0.0.6: 1684 | version "0.0.6" 1685 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1686 | 1687 | uglify-js@^2.6: 1688 | version "2.8.29" 1689 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 1690 | dependencies: 1691 | source-map "~0.5.1" 1692 | yargs "~3.10.0" 1693 | optionalDependencies: 1694 | uglify-to-browserify "~1.0.0" 1695 | 1696 | uglify-to-browserify@~1.0.0: 1697 | version "1.0.2" 1698 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1699 | 1700 | util-deprecate@~1.0.1: 1701 | version "1.0.2" 1702 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1703 | 1704 | validate-npm-package-license@^3.0.1: 1705 | version "3.0.3" 1706 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 1707 | dependencies: 1708 | spdx-correct "^3.0.0" 1709 | spdx-expression-parse "^3.0.0" 1710 | 1711 | vise@3.x.x: 1712 | version "3.0.0" 1713 | resolved "https://registry.yarnpkg.com/vise/-/vise-3.0.0.tgz#76ad14ab31669c50fbb0817bc0e72fedcbb3bf4c" 1714 | dependencies: 1715 | hoek "5.x.x" 1716 | 1717 | which@^1.2.9: 1718 | version "1.3.1" 1719 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1720 | dependencies: 1721 | isexe "^2.0.0" 1722 | 1723 | will-call@1.x.x: 1724 | version "1.0.1" 1725 | resolved "https://registry.yarnpkg.com/will-call/-/will-call-1.0.1.tgz#9b37561ea7156aaba21b28fdf635b80fe78bf166" 1726 | 1727 | window-size@0.1.0: 1728 | version "0.1.0" 1729 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1730 | 1731 | wordwrap@0.0.2: 1732 | version "0.0.2" 1733 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1734 | 1735 | wordwrap@~0.0.2: 1736 | version "0.0.3" 1737 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1738 | 1739 | wordwrap@~1.0.0: 1740 | version "1.0.0" 1741 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1742 | 1743 | wrappy@1: 1744 | version "1.0.2" 1745 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1746 | 1747 | wreck@14.x.x: 1748 | version "14.0.2" 1749 | resolved "https://registry.yarnpkg.com/wreck/-/wreck-14.0.2.tgz#89c17a9061c745ed1c3aebcb66ea181dbaab454c" 1750 | dependencies: 1751 | boom "7.x.x" 1752 | hoek "5.x.x" 1753 | 1754 | write@^0.2.1: 1755 | version "0.2.1" 1756 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1757 | dependencies: 1758 | mkdirp "^0.5.1" 1759 | 1760 | yallist@^2.1.2: 1761 | version "2.1.2" 1762 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1763 | 1764 | yargs@~3.10.0: 1765 | version "3.10.0" 1766 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1767 | dependencies: 1768 | camelcase "^1.0.2" 1769 | cliui "^2.1.0" 1770 | decamelize "^1.0.0" 1771 | window-size "0.1.0" 1772 | --------------------------------------------------------------------------------