diff --git a/.babelrc b/.babelrc deleted file mode 100644 index a0259e4ad3..0000000000 --- a/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "plugins": [ "transform-runtime", "add-module-exports" ], - "presets": [ "es2015" ] -} diff --git a/.codeclimate.yml b/.codeclimate.yml index 8967f61865..1d4e44927e 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,12 +1,13 @@ engines: - duplication: - enabled: true - config: - languages: - - javascript - eslint: - enabled: true + duplication: + enabled: true + config: + languages: + - javascript + exclude_paths: + - test/ + eslint: + enabled: true ratings: - paths: - - "**.js" -#exclude_paths: + paths: + - "**.js" diff --git a/.github/contributing.md b/.github/contributing.md index b73ab027a6..9d666524b6 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -2,7 +2,7 @@ Thank you for contributing to Feathers! :heart: :tada: -This repo is the main core and where most issues are reported. Feathers embraces modularity and is broken up across many repos. To make this easier to manage we currently use [Zenhub](https://www.zenhub.com/) for issue triage and visibility. They have a free browser plugin you can install so that you can see what is in flight at any time, but of course you also always see current issues in Github. +Feathers embraces modularity and is broken up across many repos. To make this easier to manage we currently use Github projects for issue triage and visibility. To get a high level view of the core releases you can go to https://github.com/feathersjs/feathers/projects. ## Report a bug @@ -16,7 +16,7 @@ Issues can be reported in the [issue tracker](https://github.com/feathersjs/feat We take security very seriously at Feathers. We welcome any peer review of our 100% open source code to ensure nobody's Feathers app is ever compromised or hacked. As a web application developer you are responsible for any security breaches. We do our very best to make sure Feathers is as secure as possible by default. -In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Slack](http://slack.feathersjs.com) or email us at hello@feathersjs.com with details and we will respond ASAP. +In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Slack](http://slack.feathersjs.com) or email us at hello@feathersjs.com with details and we will respond ASAP. For full details refer to our [Security docs](https://docs.feathersjs.com/SECURITY.html). @@ -24,11 +24,9 @@ For full details refer to our [Security docs](https://docs.feathersjs.com/SECURI We :heart: pull requests and we're continually working to make it as easy as possible for people to contribute, including a [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) and a [common test suite](https://github.com/feathersjs/feathers-service-tests) for database adapters. -All repos follow proper semantic verisioning and if the `master` branch is not the current release it is considered unstable. We tag all releases so you can always see which version of the code and documentation you are using. +We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A FeathersJS maintainer will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. -Pull requests should be to the `master` branch unless another branch is specifically requested by a core team member. We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. - -Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: +Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context, historical knowledge or information regarding the roadmap that the maintainers have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: **All PRs (except documentation) should be accompanied with tests and pass the linting rules.** @@ -36,27 +34,21 @@ Although we generally accept many PRs they can be rejected for many reasons. We Before running the tests from the `test/` folder `npm test` will run ESlint. You can check your code changes individually by running `npm run lint`. -### ES6 compilation - -Feathers uses [Babel](https://babeljs.io/) to leverage the latest developments of the JavaScript language. All code and samples are currently written in ES2015. To transpile the code in this repository run - -> npm run compile - -__Note:__ `npm test` will run the compilation automatically before the tests. - ### Tests [Mocha](http://mochajs.org/) tests are located in the `test/` folder and can be run using the `npm run mocha` or `npm test` (with ESLint and code coverage) command. ### Documentation -Feathers documentation is contained in Markdown files in the [feathers-docs](https://github.com/feathersjs/feathers-docs) repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated with the next release. +Feathers documentation is contained in Markdown files in the [docs](https://github.com/feathersjs/docs) repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated with the next release. + +## Community Contributions -## External Modules +If you've written something awesome about Feathers, for the Feathers ecosystem, or created an app using Feathers please add it to the [awesome-feathersjs](https://github.com/feathersjs-ecosystem/awesome-feathersjs). -If you've written something awesome for Feathers, the Feathers ecosystem, or using Feathers please add it to the [showcase](https://docs.feathersjs.com/why/showcase.html). You also might want to check out the [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) that can be used to scaffold plugins to be Feathers compliant from the start. +If you are looking to create a new plugin you also might want to check out the [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) that can be used to scaffold plugins to be Feathers compliant from the start. -If you think it would be a good core module then please contact one of the Feathers core team members in [Slack](http://slack.feathersjs.com) and we can discuss whether it belongs in core and how to get it there. :beers: +If you think your module would be a good core `feathersjs` module or `featherjs-ecosystem` module then please contact one of the Feathers maintainers in [Slack](http://slack.feathersjs.com) and we can discuss whether it belongs and how to get it there. :beers: ## Contributor Code of Conduct diff --git a/.github/issue_template.md b/.github/issue_template.md index cd2d0f5d96..57a8f3e0f1 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -4,7 +4,7 @@ here](https://github.com/feathersjs/feathers/blob/master/.github/contributing.md#report-a-bug)) - [ ] Tell us what broke. The more detailed the better. -- [ ] If you can, please create a simple example that reproduces the issue and link to a gist, jsbin, repo, etc. +- [ ] If you can, please create a simple example that reproduces the issue and link to a gist, jsbin, repo, etc. This makes it much easier for us to debug and issues that have a reproducable example will get higher priority. ### Expected behavior Tell us what should happen diff --git a/.gitignore b/.gitignore index 551cbb3fae..d552964c75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ +.DS_Store + # Logs logs *.log -npm-debug.log* # Runtime data pids @@ -17,19 +18,13 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt -# node-waf configuration -.lock-wscript - # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- node_modules -tmp* -.idea/ - - -# The compiled/babelified modules -lib/ +# Users Environment Variables +.lock-wscript diff --git a/.istanbul.yml b/.istanbul.yml index caa27a61b1..35fe8108b7 100644 --- a/.istanbul.yml +++ b/.istanbul.yml @@ -1,8 +1,6 @@ verbose: false instrumentation: - root: ./src/ - excludes: - - lib/ + root: ./lib/ include-all-sources: true reporting: print: summary @@ -11,7 +9,7 @@ reporting: - text - lcov watermarks: - statements: [50, 80] - lines: [50, 80] - functions: [50, 80] - branches: [50, 80] \ No newline at end of file + statements: [70, 90] + lines: [70, 90] + functions: [70, 90] + branches: [70, 90] diff --git a/.npmignore b/.npmignore index f9268a79ef..29c5506231 100644 --- a/.npmignore +++ b/.npmignore @@ -1,11 +1,10 @@ -.github .editorconfig +.jshintrc .travis.yml .istanbul.yml .babelrc .idea/ -src/ +.vscode/ test/ -!lib/ -coverage -.github/ \ No newline at end of file +coverage/ +.github/ diff --git a/.travis.yml b/.travis.yml index bd7c6b241d..6951df50ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,9 @@ language: node_js node_js: - node - '6' - - '4' addons: code_climate: - repo_token: 498707228e4260677935eadfa95a35c24a9c2e9877bf05200d9c3aafb520abf6 + repo_token: c2aa7db42f71ed803abb928688f20dfe3d2d397fe9b5d6392cf65aacbc6382ed before_script: - 'npm install -g codeclimate-test-reporter' after_script: diff --git a/LICENSE b/LICENSE index ed4e3bcba2..b983646a29 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ ## MIT License -Copyright (C) 2015 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (C) 2017 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/changelog.md b/changelog.md index 000376400c..6f78879bac 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,22 @@ # Change Log +## [v3.0.0-pre.3](https://github.com/feathersjs/feathers/tree/v3.0.0-pre.3) (2017-10-25) +[Full Changelog](https://github.com/feathersjs/feathers/compare/v3.0.0-pre.2...v3.0.0-pre.3) + +**Merged pull requests:** + +- Better logic for returning the hook object from method call [\#706](https://github.com/feathersjs/feathers/pull/706) ([daffl](https://github.com/daffl)) +- Codeclimate Updates [\#704](https://github.com/feathersjs/feathers/pull/704) ([ekryski](https://github.com/ekryski)) +- Add more inline documentation [\#703](https://github.com/feathersjs/feathers/pull/703) ([daffl](https://github.com/daffl)) + +## [v3.0.0-pre.2](https://github.com/feathersjs/feathers/tree/v3.0.0-pre.2) (2017-10-20) +[Full Changelog](https://github.com/feathersjs/feathers/compare/v2.2.3...v3.0.0-pre.2) + +**Merged pull requests:** + +- Move to @feathersjs npm scope [\#699](https://github.com/feathersjs/feathers/pull/699) ([daffl](https://github.com/daffl)) +- Also pass app object as parameter to configure callbacks [\#698](https://github.com/feathersjs/feathers/pull/698) ([daffl](https://github.com/daffl)) + ## [v2.2.3](https://github.com/feathersjs/feathers/tree/v2.2.3) (2017-10-20) [Full Changelog](https://github.com/feathersjs/feathers/compare/v2.2.2...v2.2.3) diff --git a/client.d.ts b/client.d.ts deleted file mode 100644 index 937231e954..0000000000 --- a/client.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import * as feathers from './'; -export = feathers; \ No newline at end of file diff --git a/client.js b/client.js deleted file mode 100644 index 926b93d70b..0000000000 --- a/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/client/index'); diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 89ca88af21..0000000000 --- a/index.d.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as express from 'express'; -import * as expressCore from "express-serve-static-core"; -import * as events from 'events'; - -declare function feathers(): feathers.Application; - -declare namespace feathers { - export var static: typeof express.static; - - type NullableId = number | string | null; - - interface Params { - query?: any; - paginate?: false | object; - } - - interface Pagination { - total: Number, - limit: Number, - skip: Number, - data: T[] - } - - interface Service extends events.EventEmitter { - - /** - * Retrieves a list of all resources from the service. - * Provider parameters will be passed as params.query - */ - find?(params?: Params, callback?: any): Promise>; - - /** - * Retrieves a single resource with the given id from the service. - */ - get?(id: number | string, params?: Params, callback?: any): Promise; - - /** - * Creates a new resource with data. - */ - create?(data: T[], params?: Params, callback?: any): Promise; - create?(data: T , params?: Params, callback?: any): Promise; - - /** - * Replaces the resource identified by id with data. - * Update multiples resources with id equal `null` - */ - update?(id: NullableId, data: T, params?: Params, callback?: any): Promise; - - /** - * Merges the existing data of the resource identified by id with the new data. - * Implement patch additionally to update if you want to separate between partial and full updates and support the PATCH HTTP method. - * Patch multiples resources with id equal `null` - */ - patch?(id: NullableId, data: any, params?: Params, callback?: any): Promise; - - /** - * Removes the resource with id. - * Delete multiple resources with id equal `null` - */ - remove?(id: NullableId, params?: Params, callback?: any): Promise; - - /** - * Initialize your service with any special configuration or if connecting services that are very tightly coupled - */ - setup?(app?: Application, path?: string): void; - } - - interface ServiceHandler { - - /** - * Retrieves a list of all resources from the service. - * Provider parameters will be passed as params.query - */ - find?(params?: Params, callback?: any): Promise>; - - /** - * Retrieves a single resource with the given id from the service. - */ - get?(id: number | string, params?: Params, callback?: any): Promise; - - /** - * Creates a new resource with data. - */ - create?(data: T[], params?: Params, callback?: any): Promise; - create?(data: T , params?: Params, callback?: any): Promise; - - /** - * Replaces the resource identified by id with data. - * Update multiples resources with id equal `null` - */ - update?(id: NullableId, data: T, params?: Params, callback?: any): Promise; - - /** - * Merges the existing data of the resource identified by id with the new data. - * Implement patch additionally to update if you want to separate between partial and full updates and support the PATCH HTTP method. - * Patch multiples resources with id equal `null` - */ - patch?(id: NullableId, data: any, params?: Params, callback?: any): Promise; - - /** - * Removes the resource with id. - * Delete multiple resources with id equal `null` - */ - remove?(id: NullableId, params?: Params, callback?: any): Promise; - - /** - * Initialize your service with any special configuration or if connecting services that are very tightly coupled - */ - setup?(app?: Application, path?: string): void; - } - - interface FeathersUseHandler extends expressCore.IRouterHandler, express.IRouterMatcher { - (location: string, service: ServiceHandler): T - } - - interface Application extends express.Application { - /** - * It either returns the Feathers wrapped service object for the given path - */ - service(location: string): Service; - - /** - * Registers a new service for that path and returns the wrapped service object - */ - service(location: string, service: Service, options?: any): Service; - - /** - * Initialize all services by calling each services .setup(app, path) method (if available) - */ - setup(): this; - - /** - * Register a service object - */ - use: FeathersUseHandler; - - /** - * Runs a callback function with the application as the context (this). It can be used to initialize plugins or services. - */ - configure(callback: any): this; - } -} - -export = feathers; diff --git a/lib/application.js b/lib/application.js new file mode 100644 index 0000000000..e9053c376c --- /dev/null +++ b/lib/application.js @@ -0,0 +1,147 @@ +const debug = require('debug')('feathers:application'); +const { stripSlashes } = require('@feathersjs/commons'); + +const Uberproto = require('uberproto'); +const events = require('./events'); +const hooks = require('./hooks'); +const version = require('./version'); + +const Proto = Uberproto.extend({ + create: null +}); + +const application = { + init () { + Object.assign(this, { + version, + methods: [ + 'find', 'get', 'create', 'update', 'patch', 'remove' + ], + mixins: [], + services: {}, + providers: [], + _setup: false, + settings: {} + }); + + this.configure(hooks()); + this.configure(events()); + }, + + get (name) { + return this.settings[name]; + }, + + set (name, value) { + this.settings[name] = value; + return this; + }, + + disable (name) { + this.settings[name] = false; + return this; + }, + + disabled (name) { + return !this.settings[name]; + }, + + enable (name) { + this.settings[name] = true; + return this; + }, + + enabled (name) { + return !!this.settings[name]; + }, + + configure (fn) { + fn.call(this, this); + + return this; + }, + + service (path, service) { + if (typeof service !== 'undefined') { + throw new Error('Registering a new service with `app.service(path, service)` is no longer supported. Use `app.use(path, service)` instead.'); + } + + const location = stripSlashes(path); + const current = this.services[location]; + + if (typeof current === 'undefined' && typeof this.defaultService === 'function') { + return this.use(`/${location}`, this.defaultService(location)) + .service(location); + } + + return current; + }, + + use (path, service, options = {}) { + const location = stripSlashes(path); + const isSubApp = typeof service.service === 'function' && service.services; + const isService = this.methods.concat('setup').some(name => + (service && typeof service[name] === 'function') + ); + + if (isSubApp) { + const subApp = service; + + Object.keys(subApp.services).forEach(subPath => + this.use(`${location}/${subPath}`, subApp.service(subPath)) + ); + + return this; + } + + if (!isService) { + throw new Error(`Invalid service object passed for path \`${location}\``); + } + + // If the service is already Uberproto'd use it directly + const protoService = Proto.isPrototypeOf(service) ? service : Proto.extend(service); + + debug(`Registering new service at \`${location}\``); + + // Add all the mixins + this.mixins.forEach(fn => fn.call(this, protoService, location, options)); + + if (typeof protoService._setup === 'function') { + protoService._setup(this, location); + } + + // Run the provider functions to register the service + this.providers.forEach(provider => + provider.call(this, protoService, location, options) + ); + + // If we ran setup already, set this service up explicitly + if (this._isSetup && typeof protoService.setup === 'function') { + debug(`Setting up service for \`${location}\``); + protoService.setup(this, location); + } + + this.services[location] = protoService; + + return this; + }, + + setup () { + // Setup each service (pass the app so that they can look up other services etc.) + Object.keys(this.services).forEach(path => { + const service = this.services[path]; + + debug(`Setting up service for \`${path}\``); + + if (typeof service.setup === 'function') { + service.setup(this, path); + } + }); + + this._isSetup = true; + + return this; + } +}; + +module.exports = application; diff --git a/lib/events.js b/lib/events.js new file mode 100644 index 0000000000..81ce014eb2 --- /dev/null +++ b/lib/events.js @@ -0,0 +1,83 @@ +const { EventEmitter } = require('events'); +const Proto = require('uberproto'); + +// Returns a hook that emits service events. Should always be +// used as the very last hook in the chain +const eventHook = exports.eventHook = function eventHook () { + return function (hook) { + const { app, service } = hook; + const eventName = app.eventMappings[hook.method]; + const isHookEvent = service._hookEvents && service._hookEvents.indexOf(eventName) !== -1; + + // If this event is not being sent yet and we are not in an error hook + if (eventName && isHookEvent && hook.type !== 'error') { + service.emit(eventName, hook.result, hook); + } + }; +}; + +// Mixin that turns a service into a Node event emitter +const eventMixin = exports.eventMixin = function eventMixin (service) { + if (service._serviceEvents) { + return; + } + + const app = this; + // Indicates if the service is already an event emitter + const isEmitter = typeof service.on === 'function' && + typeof service.emit === 'function'; + + // If not, mix it in (the service is always an Uberproto object that has a .mixin) + if (typeof service.mixin === 'function' && !isEmitter) { + service.mixin(EventEmitter.prototype); + } + + // Define non-enumerable properties of + Object.defineProperties(service, { + // A list of all events that this service sends + _serviceEvents: { + value: Array.isArray(service.events) ? service.events.slice() : [] + }, + + // A list of events that should be handled through the event hooks + _hookEvents: { + value: [] + } + }); + + // `app.eventMappings` has the mapping from method name to event name + Object.keys(app.eventMappings).forEach(method => { + const event = app.eventMappings[method]; + const alreadyEmits = service._serviceEvents.indexOf(event) !== -1; + + // Add events for known methods to _serviceEvents and _hookEvents + // if the service indicated it does not send it itself yet + if (typeof service[method] === 'function' && !alreadyEmits) { + service._serviceEvents.push(event); + service._hookEvents.push(event); + } + }); +}; + +module.exports = function () { + return function (app) { + // Mappings from service method to event name + Object.assign(app, { + eventMappings: { + create: 'created', + update: 'updated', + remove: 'removed', + patch: 'patched' + } + }); + + // Register the event hook + // `finally` hooks always run last after `error` and `after` hooks + app.hooks({ finally: eventHook() }); + + // Make the app an event emitter + Proto.mixin(EventEmitter.prototype, app); + + app.mixins.push(eventMixin); + }; +}; diff --git a/lib/hooks.js b/lib/hooks.js new file mode 100644 index 0000000000..039c8475ae --- /dev/null +++ b/lib/hooks.js @@ -0,0 +1,144 @@ +const { + hooks, + validateArguments, + isPromise +} = require('@feathersjs/commons'); + +const { + createHookObject, getHooks, processHooks, enableHooks, makeArguments +} = hooks; + +// A service mixin that adds `service.hooks()` method and functionality +const hookMixin = exports.hookMixin = function hookMixin (service) { + if (typeof service.hooks === 'function') { + return; + } + + const app = this; + const methods = app.methods; + const mixin = {}; + + // Add .hooks method and properties to the service + enableHooks(service, methods, app.hookTypes); + + // Assemble the mixin object that contains all "hooked" service methods + methods.forEach(method => { + if (typeof service[method] !== 'function') { + return; + } + + mixin[method] = function () { + const service = this; + const args = Array.from(arguments); + // If the last argument is `true` we want to return + // the actual hook object instead of the result + const returnHook = args[args.length - 1] === true + ? args.pop() : false; + + // We have to try/catch this so that argument validation + // returns a rejected promise + try { + validateArguments(method, args); + } catch (e) { + return Promise.reject(e); + } + + // A reference to the original method + const _super = service._super.bind(service); + // Create the hook object that gets passed through + const hookObject = createHookObject(method, args, { + type: 'before', // initial hook object type + returnHook, + service, + app + }); + const beforeHooks = getHooks(app, service, 'before', method); + + // Process all before hooks + return processHooks.call(service, beforeHooks, hookObject) + // Use the hook object to call the original method + .then(hookObject => { + // If `hookObject.result` is set, skip the original method + if (typeof hookObject.result !== 'undefined') { + return hookObject; + } + + // Otherwise, call it with arguments created from the hook object + const promise = _super(...makeArguments(hookObject)); + + if (!isPromise(promise)) { + throw new Error(`Service method '${hookObject.method}' for '${hookObject.path}' service must return a promise`); + } + + return promise.then(result => { + hookObject.result = result; + + return hookObject; + }); + }) + // Make a (shallow) copy of hookObject from `before` hooks and update type + .then(hookObject => Object.assign({}, hookObject, { type: 'after' })) + // Run through all `after` hooks + .then(hookObject => { + // Combine all app and service `after` and `finally` hooks and process + const afterHooks = getHooks(app, service, 'after', method, true); + const finallyHooks = getHooks(app, service, 'finally', method, true); + const hookChain = afterHooks.concat(finallyHooks); + + return processHooks.call(service, hookChain, hookObject); + }) + .then(hookObject => + // Finally, return the result + // Or the hook object if the `__returnHook` flag is set + hookObject.returnHook ? hookObject : hookObject.result + ) + // Handle errors + .catch(error => { + // Combine all app and service `error` and `finally` hooks and process + const errorHooks = getHooks(app, service, 'error', method, true); + const finallyHooks = getHooks(app, service, 'finally', method, true); + const hookChain = errorHooks.concat(finallyHooks); + + // A shallow copy of the hook object + const errorHookObject = Object.assign({}, error.hook || hookObject, { + type: 'error', + result: null, + original: error.hook, + error + }); + + return processHooks + .call(service, hookChain, errorHookObject) + .then(hook => { + if (errorHookObject.returnHook) { + // Return either the complete hook if the `__returnHook` flag is set + return Promise.reject(hook); + } else if (hook.result) { + // Return the result if it is set so you can swallow errors + return Promise.resolve(hook.result); + } + + // If none of the above, return the error + return Promise.reject(hook.error); + }); + }); + }; + }); + + service.mixin(mixin); +}; + +module.exports = function () { + return function (app) { + // We store a reference of all supported hook types on the app + // in case someone needs it + Object.assign(app, { + hookTypes: [ 'before', 'after', 'error', 'finally' ] + }); + + // Add functionality for hooks to be registered as app.hooks + enableHooks(app, app.methods, app.hookTypes); + + app.mixins.push(hookMixin); + }; +}; diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000000..4b4719a16f --- /dev/null +++ b/lib/index.js @@ -0,0 +1,18 @@ +const Proto = require('uberproto'); +const Application = require('./application'); +const version = require('./version'); + +function createApplication () { + const app = {}; + + // Mix in the base application + Proto.mixin(Application, app); + + app.init(); + + return app; +} + +createApplication.version = version; + +module.exports = createApplication; diff --git a/lib/version.js b/lib/version.js new file mode 100644 index 0000000000..07b0385836 --- /dev/null +++ b/lib/version.js @@ -0,0 +1 @@ +module.exports = '3.0.0'; diff --git a/mocha.opts b/mocha.opts index 855dfc4c63..03b44ba182 100644 --- a/mocha.opts +++ b/mocha.opts @@ -1,3 +1,2 @@ --recursive test/ ---compilers js:babel-core/register --exit diff --git a/package-lock.json b/package-lock.json index 8da383ac58..257269dbaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,53 +1,13 @@ { - "name": "feathers", - "version": "2.2.3", + "name": "@feathersjs/feathers", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/express": { - "version": "4.0.37", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.37.tgz", - "integrity": "sha512-tIULTLzQpFFs5/PKnFIAFOsXQxss76glppbVKR3/jddPK26SBsD5HF5grn5G2jOGtpRWSBvYmDYoduVv+3wOXg==", - "requires": { - "@types/express-serve-static-core": "4.0.53", - "@types/serve-static": "1.7.32" - } - }, - "@types/express-serve-static-core": { - "version": "4.0.53", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.53.tgz", - "integrity": "sha512-zaGeOpEYp5G2EhjaUFdVwysDrfEYc6Q6iPhd3Kl4ip30x0tvVv7SuJvY3yzCUSuFlzAG8N5KsyY6BJg93/cn+Q==", - "requires": { - "@types/node": "8.0.31" - } - }, - "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" - }, - "@types/node": { - "version": "8.0.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.31.tgz", - "integrity": "sha512-R+LdMJHJQwRd/Ca0Nr5KnwbSWHxTD3DWz4ivqoPeNH+YPcuirMWK+Ti9Mx32jOecmPhHOCd+6CefU5e1eVq2Ew==" - }, - "@types/serve-static": { - "version": "1.7.32", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.32.tgz", - "integrity": "sha512-WpI0g7M1FiOmJ/a97Qrjafq2I938tjAZ3hZr9O7sXyA6oUhH3bqUNZIt7r1KZg8TQAKxcvxt6JjQ5XuLfIBFvg==", - "requires": { - "@types/express-serve-static-core": "4.0.53", - "@types/mime": "2.0.0" - } - }, - "@types/socket.io": { - "version": "1.4.30", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-1.4.30.tgz", - "integrity": "sha512-YkaCkyqbbxNa1Hpix1YAVhPG9X/PDat75l96Hbrf3uDoQ9u/9aDjgG2N+KqW8DpV8U70VmVEyA2/ilbTA/np6w==", - "dev": true, - "requires": { - "@types/node": "8.0.31" - } + "@feathersjs/commons": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.2.0.tgz", + "integrity": "sha512-YLXNmRVz04qKPCJhbpEHG8kXyeulg42aCJz9CFSbSoM6Vyn50UIt+iQe7lXXa8AjYgNXobSbnfPBaZj//M5dgQ==" }, "abbrev": { "version": "1.0.9", @@ -55,19 +15,10 @@ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "dev": true }, "acorn-jsx": { @@ -87,21 +38,13 @@ } } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", "json-stable-stringify": "1.0.1" } }, @@ -146,17 +89,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, "append-transform": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", @@ -175,28 +107,6 @@ "sprintf-js": "1.0.3" } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -212,13 +122,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, "array.prototype.find": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", @@ -226,87 +129,21 @@ "dev": true, "requires": { "define-properties": "1.1.2", - "es-abstract": "1.8.2" + "es-abstract": "1.9.0" } }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" - } - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -318,44 +155,6 @@ "js-tokens": "3.0.2" } }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "babel-generator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", @@ -372,2772 +171,1000 @@ "trim-right": "1.0.1" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "6.26.0" } }, - "babel-helper-define-map": { + "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" } }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", "babel-runtime": "6.26.0", - "babel-template": "6.26.0", "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" } }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "callsites": "0.2.0" } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "optional": true }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, + "optional": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, - "babel-plugin-add-module-exports": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", - "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "exit": "0.1.2", + "glob": "7.1.2" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "restore-cursor": "1.0.1" } }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "optional": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } } }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } } }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "date-now": "0.1.4" } }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "es5-ext": "0.10.35" } }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "ms": "2.0.0" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "optional": true }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "strip-bom": "2.0.0" } }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "deglob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", + "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "find-root": "1.1.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pkg-config": "1.1.1", + "run-parallel": "1.1.6", + "uniq": "1.0.1" } }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" } }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "repeating": "2.0.1" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" + "esutils": "2.0.2", + "isarray": "1.0.0" }, "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true } } }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "domelementtype": "1.1.3", + "entities": "1.1.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true } } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, - "optional": true, "requires": { - "tweetnacl": "0.14.5" + "domelementtype": "1.3.0" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "callsite": "1.0.0" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" } }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true, - "optional": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } + "is-arrayish": "0.2.1" } }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { - "hoek": "4.2.0" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" } }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, - "optional": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "callsites": "0.2.0" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, - "optional": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, - "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "d": "1.0.0", + "es5-ext": "0.10.35" } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, - "optional": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "exit": "0.1.2", - "glob": "7.1.2" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" } }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, - "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true + "requires": { + "ms": "2.0.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true } } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "eslint-config-semistandard": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-11.0.0.tgz", + "integrity": "sha1-RO73z9/Uchnjp7gbkbVA6IC7JhU=", "dev": true }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", "dev": true }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "eslint-config-standard-jsx": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.1.tgz", + "integrity": "sha1-zU5GPQJo4tnnB/YfQvc/WzMzxkI=", "dev": true }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "dev": true, "requires": { - "boom": "5.2.0" + "debug": "2.6.9", + "object-assign": "4.1.1", + "resolve": "1.5.0" }, "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "hoek": "4.2.0" + "ms": "2.0.0" } } } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", "dev": true, "requires": { - "es5-ext": "0.10.30" + "debug": "2.6.9", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", "dev": true, "requires": { - "assert-plus": "1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.2.3", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "pkg-up": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "eslint-plugin-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz", + "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", "dev": true, "requires": { - "strip-bom": "2.0.0" - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "deglob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", - "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", - "dev": true, - "requires": { - "find-root": "1.1.0", - "glob": "7.1.2", - "ignore": "3.3.5", - "pkg-config": "1.1.1", - "run-parallel": "1.1.6", - "uniq": "1.0.1" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", + "ignore": "3.3.7", + "minimatch": "3.0.4", "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" - }, - "engine.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.2.tgz", - "integrity": "sha1-AKP2pAVLsaB5WAdLEFh2Te7bfYo=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.6.9", - "engine.io-parser": "2.1.1", - "uws": "0.14.5", - "ws": "2.3.1" - }, - "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.2.tgz", - "integrity": "sha1-YqDvCOyD0WoGZozMOk83kWdoprk=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.6.9", - "engine.io-parser": "2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "2.3.1", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" + "resolve": "1.5.0", + "semver": "5.3.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "1.0.2" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.2.tgz", - "integrity": "sha512-dvhwFL3yjQxNNsOWx6exMlaDrRHCRGMQlnx5lsXDCZ/J7G/frgIIl94zhZSp/galVAYp7VzPi1OrAHta89/yGQ==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.30", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.15.0.tgz", - "integrity": "sha1-vcxqbF/+CBYOe5PAZmlTYqkeMPI=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "escope": "3.6.0", - "espree": "3.5.1", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.5", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - } - } - }, - "eslint-config-semistandard": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-8.0.0.tgz", - "integrity": "sha1-+4I5N5odzBFM3np9y7yAvuozNLA=", - "dev": true - }, - "eslint-config-standard": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-7.0.0.tgz", - "integrity": "sha1-TxYbxlaV5LxhMxxVue6spFjNmcY=", - "dev": true - }, - "eslint-config-standard-jsx": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz", - "integrity": "sha1-yrCAGhWjYL9j+suXqyL73YjYpeA=", - "dev": true - }, - "eslint-if-supported": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-if-supported/-/eslint-if-supported-1.0.1.tgz", - "integrity": "sha1-wqZYOxNKLU2Djq417kuLyNN+hW4=", - "dev": true - }, - "eslint-plugin-promise": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz", - "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=", - "dev": true - }, - "eslint-plugin-react": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz", - "integrity": "sha1-VMLpkGt2+dEBQgML3DTp1oQKC7I=", - "dev": true, - "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", - "jsx-ast-utils": "1.4.1" - } - }, - "eslint-plugin-standard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", - "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", - "dev": true - }, - "espree": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", - "dev": true, - "requires": { - "acorn": "5.1.2", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "express": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.1.tgz", - "integrity": "sha512-STB7LZ4N0L+81FJHGla2oboUHTk4PaN1RsOkoRh9OSeEKylvF5hwKYVX1xCLFaCT7MD0BNG/gX2WFMLqY6EMBw==", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "feathers-commons": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/feathers-commons/-/feathers-commons-0.8.7.tgz", - "integrity": "sha1-EcbyW1N3RamD6NYVUtfbiTLVN4I=" - }, - "feathers-errors": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/feathers-errors/-/feathers-errors-2.9.2.tgz", - "integrity": "sha512-qwIX97bNW7+1tWVG073+omUA0rCYKJtTtwuzTrrvfrtdr8J8Dk1Fy4iaV9Fa6/YBD5AZu0lsplPE0iu4u/d4GQ==", - "dev": true, - "requires": { - "debug": "3.1.0" - } - }, - "feathers-rest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/feathers-rest/-/feathers-rest-1.8.0.tgz", - "integrity": "sha512-HLkmwJO4YqEpp7LRE7PbDjVmB03CS8KXqGslxsiQgyQ+bD3g2tGIhc0O9r2yQt4HD/QFNpi9jtWe05dS1PnAVA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "feathers-commons": "0.8.7", - "feathers-errors": "2.9.2", - "qs": "6.5.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "feathers-socket-commons": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/feathers-socket-commons/-/feathers-socket-commons-2.4.0.tgz", - "integrity": "sha1-Bi79V/mocWZEFFuZOl9ycJlp8eE=", - "dev": true, - "requires": { - "debug": "2.6.9", - "feathers-commons": "0.8.7", - "feathers-errors": "2.9.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "feathers-socketio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/feathers-socketio/-/feathers-socketio-2.0.0.tgz", - "integrity": "sha1-zmLjNifeqtUyeeT5tnzawPLPSd4=", - "dev": true, - "requires": { - "@types/socket.io": "1.4.30", - "debug": "2.6.9", - "feathers-socket-commons": "2.4.0", - "socket.io": "2.0.3", - "uberproto": "1.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "optional": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + } + } + }, + "eslint-plugin-promise": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", + "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "dev": true + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "2.0.4", + "doctrine": "1.5.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, - "optional": true, "requires": { - "string-width": "1.0.2" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true } } }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3165,15 +1192,6 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -3188,26 +1206,6 @@ "path-is-absolute": "1.0.1" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -3234,10 +1232,16 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { "async": "1.5.2", @@ -3257,22 +1261,6 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - } - }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3291,69 +1279,18 @@ "ansi-regex": "2.1.1" } }, - "has-binary2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -3365,84 +1302,18 @@ "domutils": "1.5.1", "entities": "1.0.0", "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, "ignore": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { @@ -3458,7 +1329,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "inquirer": { "version": "0.12.0", @@ -3496,31 +1368,16 @@ "loose-envify": "1.3.1" } }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "1.10.0" - } - }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-callable": { @@ -3535,36 +1392,6 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -3583,15 +1410,6 @@ "number-is-nan": "1.0.1" } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, "is-my-json-valid": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", @@ -3604,16 +1422,6 @@ "xtend": "4.0.1" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -3638,20 +1446,6 @@ "path-is-inside": "1.0.2" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -3682,12 +1476,6 @@ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3695,9 +1483,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isexe": { @@ -3706,22 +1494,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul": { "version": "1.1.0-alpha.1", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-1.1.0-alpha.1.tgz", @@ -3730,7 +1502,7 @@ "requires": { "abbrev": "1.0.9", "async": "1.5.2", - "istanbul-api": "1.1.14", + "istanbul-api": "1.2.1", "js-yaml": "3.10.0", "mkdirp": "0.5.1", "nopt": "3.0.6", @@ -3739,19 +1511,19 @@ } }, "istanbul-api": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.14.tgz", - "integrity": "sha1-JbxXAffGgMD//5E95G42GaOm5oA=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", "dev": true, "requires": { "async": "2.5.0", "fileset": "2.0.3", "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.8.0", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.2", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", "js-yaml": "3.10.0", "mkdirp": "0.5.1", "once": "1.4.0" @@ -3775,18 +1547,18 @@ "dev": true }, "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { "babel-generator": "6.26.0", @@ -3799,9 +1571,9 @@ } }, "istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", "dev": true, "requires": { "istanbul-lib-coverage": "1.1.1", @@ -3822,36 +1594,25 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "3.1.0", "istanbul-lib-coverage": "1.1.1", "mkdirp": "0.5.1", "rimraf": "2.6.2", "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", "dev": true, "requires": { - "handlebars": "4.0.10" + "handlebars": "4.0.11" } }, "js-tokens": { @@ -3870,13 +1631,6 @@ "esprima": "4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -3907,18 +1661,6 @@ } } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -3928,18 +1670,6 @@ "jsonify": "0.0.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -3952,18 +1682,6 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "jsx-ast-utils": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", @@ -3976,7 +1694,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -4024,6 +1742,14 @@ "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, "lodash": { @@ -4032,6 +1758,12 @@ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -4047,61 +1779,6 @@ "js-tokens": "3.0.2" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4144,18 +1821,6 @@ "supports-color": "4.4.0" }, "dependencies": { - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -4184,24 +1849,12 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "dev": true, - "optional": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -4211,15 +1864,6 @@ "abbrev": "1.0.9" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, "nsp": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz", @@ -4509,47 +2153,27 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, - "optional": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { - "ee-first": "1.1.1" + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "object-keys": "1.0.11" } }, "once": { @@ -4605,23 +2229,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, "p-limit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", @@ -4637,19 +2244,6 @@ "p-limit": "1.1.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4659,35 +2253,15 @@ "error-ex": "1.3.1" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "better-assert": "1.0.2" + "pinkie-promise": "2.0.1" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4706,17 +2280,6 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4746,6 +2309,17 @@ "requires": { "find-up": "2.1.0", "load-json-file": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } } }, "pkg-config": { @@ -4759,156 +2333,58 @@ "xtend": "4.0.1" } }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "optional": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "find-up": "1.1.2" } }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "find-up": "1.1.2" } }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, - "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" } }, "readline2": { @@ -4928,85 +2404,13 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "1.5.0" } }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.7" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", "dev": true }, "repeat-string": { @@ -5024,36 +2428,6 @@ "is-finite": "1.0.2" } }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -5065,9 +2439,9 @@ } }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -5108,11 +2482,6 @@ "glob": "7.1.2" } }, - "rubberduck": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rubberduck/-/rubberduck-1.1.1.tgz", - "integrity": "sha1-zSzaS4ZxeBNer8mVpxOE9fdD2wI=" - }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", @@ -5137,22 +2506,25 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "semistandard": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-10.0.0.tgz", - "integrity": "sha1-1olPdnO5tzfCYtypTK3zXoOS3ek=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-11.0.0.tgz", + "integrity": "sha1-0tn8isOT3iExIZXgBuUMiGE5HEc=", "dev": true, "requires": { - "eslint": "3.15.0", - "eslint-config-semistandard": "8.0.0", - "eslint-config-standard": "7.0.0", - "eslint-config-standard-jsx": "3.3.0", - "eslint-plugin-promise": "3.4.2", - "eslint-plugin-react": "6.9.0", - "eslint-plugin-standard": "2.0.1", - "standard-engine": "5.4.0" + "eslint": "3.19.0", + "eslint-config-semistandard": "11.0.0", + "eslint-config-standard": "10.2.1", + "eslint-config-standard-jsx": "4.0.1", + "eslint-plugin-import": "2.2.0", + "eslint-plugin-node": "4.2.3", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-react": "6.10.3", + "eslint-plugin-standard": "3.0.1", + "standard-engine": "7.0.0" } }, "semver": { @@ -5161,224 +2533,38 @@ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, "shelljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - }, - "socket.io": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz", - "integrity": "sha1-Q1nwaiSTOua9CHeYr3jGgOrjReM=", - "dev": true, - "requires": { - "debug": "2.6.9", - "engine.io": "3.1.2", - "object-assign": "4.1.1", - "socket.io-adapter": "1.1.1", - "socket.io-client": "2.0.3", - "socket.io-parser": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz", - "integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.6.9", - "engine.io-client": "3.1.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "3.1.2", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "2.6.9", - "has-binary2": "1.0.2", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, "standard-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.4.0.tgz", - "integrity": "sha1-4OhpWeoHhkJdM4PkDBv3DS+YVXk=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", + "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", "dev": true, "requires": { "deglob": "2.1.0", "get-stdin": "5.0.1", - "home-or-tmp": "2.0.0", "minimist": "1.2.0", "pkg-conf": "2.0.0" }, @@ -5391,11 +2577,6 @@ } } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -5408,18 +2589,9 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "strip-ansi": { @@ -5466,16 +2638,6 @@ "string-width": "2.1.1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -5521,27 +2683,12 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -5554,22 +2701,6 @@ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -5579,15 +2710,6 @@ "prelude-ls": "1.1.2" } }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" - } - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -5618,28 +2740,20 @@ "dev": true, "optional": true }, - "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=", - "dev": true - }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } }, "util-deprecate": { "version": "1.0.2", @@ -5647,49 +2761,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - }, - "uws": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", - "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", - "dev": true, - "optional": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -5727,30 +2798,6 @@ "mkdirp": "0.5.1" } }, - "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", - "dev": true, - "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - } - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -5769,12 +2816,6 @@ "decamelize": "1.2.0", "window-size": "0.1.0" } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true } } } diff --git a/package.json b/package.json index c73247d2c2..bf253943cf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "feathers", - "description": "Build Better APIs, Faster than Ever.", - "version": "2.2.3", + "name": "@feathersjs/feathers", + "description": "A REST and realtime API layer for modern applications.", + "version": "3.0.0", "homepage": "http://feathersjs.com", "repository": { "type": "git", @@ -14,15 +14,11 @@ "realtime" ], "main": "lib/index", - "types": [ - "./index.d.ts", - "./client.d.ts" - ], - "author": "Feathers (http://feathersjs.com)", - "contributors": [ - "Eric Kryski (http://erickryski.com)", - "David Luecke (http://neyeon.com)" - ], + "author": { + "name": "Feathers contributor", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, "license": "MIT", "bugs": { "url": "https://github.com/feathersjs/feathers/issues" @@ -31,19 +27,19 @@ "lib": "lib" }, "scripts": { - "prepublish": "npm run compile", + "update-version": "node -e \"console.log('module.exports = \\'' + require('./package.json').version + '\\';')\" > lib/version.js", + "version": "npm run update-version && git add lib/version.js && git commit -am \"Updating version\"", "publish": "git push origin --tags && npm run changelog && git push origin", "changelog": "github_changelog_generator --no-issues && git add CHANGELOG.md && git commit -am \"Updating changelog\"", - "release:patch": "npm version patch && npm publish", - "release:minor": "npm version minor && npm publish", - "release:major": "npm version major && npm publish", - "release:prerelease": "npm version prerelease && npm publish --tag pegasus", - "compile": "rimraf lib/ && babel -d lib/ src/", - "watch": "babel --watch -d lib/ src/", - "lint": "eslint-if-supported semistandard --fix", + "release:pre": "npm version prerelease && npm publish --tag pre --access public", + "release:patch": "npm version patch && npm publish --access public", + "release:minor": "npm version minor && npm publish --access public", + "release:major": "npm version major && npm publish --access public", + "lint": "semistandard --fix", "mocha": "mocha --opts mocha.opts", + "mocha:watch": "mocha --opts mocha.opts --watch", "coverage": "istanbul cover node_modules/mocha/bin/_mocha -- --opts mocha.opts", - "test": "npm run compile && npm run lint && npm run coverage && nsp check" + "test": "npm run lint && npm run coverage" }, "semistandard": { "env": [ @@ -51,39 +47,19 @@ ] }, "engines": { - "node": ">= 4" + "node": ">= 6" }, "dependencies": { - "babel-runtime": "^6.26.0", + "@feathersjs/commons": "^1.2.0", "debug": "^3.1.0", "events": "^1.1.1", - "express": "^4.16.1", - "feathers-commons": "^0.8.7", - "rubberduck": "^1.1.1", "uberproto": "^1.2.0" }, "devDependencies": { - "@types/express": "~4.0.35", - "babel-cli": "^6.18.0", - "babel-core": "^6.21.0", - "babel-plugin-add-module-exports": "^0.2.1", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-es2015": "^6.18.0", - "body-parser": "^1.15.2", - "eslint-if-supported": "^1.0.1", - "feathers-rest": "^1.5.3", - "feathers-socketio": "^2.0.0", "istanbul": "^1.1.0-alpha.1", "jshint": "^2.9.4", "mocha": "^4.0.0", "nsp": "^2.6.2", - "q": "^1.4.1", - "request": "^2.x", - "rimraf": "^2.5.4", - "semistandard": "^10.0.0", - "socket.io-client": "^2.0.0" - }, - "browser": { - "./lib/index": "./lib/client/index" + "semistandard": "^11.0.0" } } diff --git a/readme.md b/readme.md index 6e4b425002..c4a6785ff1 100644 --- a/readme.md +++ b/readme.md @@ -1,13 +1,13 @@ Feathers logo -## An open source REST and realtime API layer for modern applications. - -[![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/feathers.svg)](https://greenkeeper.io/) +## A REST and realtime API layer for modern applications. [![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) -[![Code Climate](https://codeclimate.com/github/feathersjs/feathers.png)](https://codeclimate.com/github/feathersjs/feathers) -[![Test Coverage](https://codeclimate.com/github/feathersjs/feathers/badges/coverage.svg)](https://codeclimate.com/github/feathersjs/feathers/coverage) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square)](https://david-dm.org/feathersjs/feathers) + +[![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/feathers.svg)](https://greenkeeper.io/) +[![Maintainability](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/maintainability)](https://codeclimate.com/github/feathersjs/feathers/maintainability) +[![Test Coverage](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/test_coverage)](https://codeclimate.com/github/feathersjs/feathers/test_coverage) [![Download Status](https://img.shields.io/npm/dm/feathers.svg?style=flat-square)](https://www.npmjs.com/package/feathers) [![Slack Status](http://slack.feathersjs.com/badge.svg)](http://slack.feathersjs.com) @@ -18,7 +18,7 @@ Feathers is a real-time, micro-service web framework for NodeJS that gives you c You can build your first real-time and REST API in just 4 commands: ```bash -$ npm install -g feathers-cli +$ npm install -g @feathersjs/cli $ mkdir my-new-app $ cd my-new-app/ $ feathers generate app @@ -33,36 +33,42 @@ Here is all the code you need to create a RESTful, real-time message API that us ```js // app.js -const feathers = require('feathers'); -const rest = require('feathers-rest'); -const socketio = require('feathers-socketio'); +const feathers = require('@feathersjs/feathers'); +const expressify = require('@feathersjs/express') +const socketio = require('@feathersjs/socketio'); +const handler = require('@feathersjs/errors/handler'); + const memory = require('feathers-memory'); -const bodyParser = require('body-parser'); -const handler = require('feathers-errors/handler'); -// A Feathers app is the same as an Express app -const app = feathers(); +// Create a Feathers application that is also fully compatible +// with an Express app +const app = expressify(feathers()); +// Parse HTTP JSON bodies +app.use(expressify.json()); +// Parse URL-encoded params +app.use(expressify.urlencoded({ extended: true })); // Add REST API support -app.configure(rest()); +app.configure(expressify.rest()); // Configure Socket.io real-time APIs app.configure(socketio()); -// Parse HTTP JSON bodies -app.use(bodyParser.json()); -// Parse URL-encoded params -app.use(bodyParser.urlencoded({ extended: true })); // Register our memory "messages" service app.use('/messages', memory()); // Register a nicer error handler than the default Express one app.use(handler()); // Start the server -app.listen(3000); +app.listen(3030); + +// Create a new message on the server +app.service('messages').create({ + text: 'This is a test message' +}); ``` Then run ``` -npm install feathers feathers-rest feathers-socketio feathers-errors feathers-memory body-parser +npm install @feathersjs/feathers @feathersjs/express @feathersjs/socketio @feathersjs/errors feathers-memory node app ``` diff --git a/src/application.js b/src/application.js deleted file mode 100644 index 8192845eb1..0000000000 --- a/src/application.js +++ /dev/null @@ -1,128 +0,0 @@ -import makeDebug from 'debug'; -import { stripSlashes } from 'feathers-commons'; -import Uberproto from 'uberproto'; -import mixins from './mixins/index'; - -const debug = makeDebug('feathers:application'); -const methods = ['find', 'get', 'create', 'update', 'patch', 'remove']; -const Proto = Uberproto.extend({ - create: null -}); - -export default { - init () { - Object.assign(this, { - methods, - mixins: mixins(), - services: {}, - providers: [], - _setup: false - }); - }, - - service (location, service, options = {}) { - location = stripSlashes(location); - - if (!service) { - const current = this.services[location]; - - if (typeof current === 'undefined' && typeof this.defaultService === 'function') { - return this.service(location, this.defaultService(location), options); - } - - return current; - } - - let protoService = Proto.extend(service); - - debug(`Registering new service at \`${location}\``); - - // Add all the mixins - this.mixins.forEach(fn => fn.call(this, protoService)); - - if (typeof protoService._setup === 'function') { - protoService._setup(this, location); - } - - // Run the provider functions to register the service - this.providers.forEach(provider => - provider.call(this, location, protoService, options) - ); - - // If we ran setup already, set this service up explicitly - if (this._isSetup && typeof protoService.setup === 'function') { - debug(`Setting up service for \`${location}\``); - protoService.setup(this, location); - } - - return (this.services[location] = protoService); - }, - - use (location) { - let service; - let middleware = Array.from(arguments) - .slice(1) - .reduce(function (middleware, arg) { - if (typeof arg === 'function') { - middleware[service ? 'after' : 'before'].push(arg); - } else if (!service) { - service = arg; - } else { - throw new Error('invalid arg passed to app.use'); - } - return middleware; - }, { - before: [], - after: [] - }); - - const hasMethod = methods => methods.some(name => - (service && typeof service[name] === 'function') - ); - - // Check for service (any object with at least one service method) - if (hasMethod(['handle', 'set']) || !hasMethod(this.methods.concat('setup'))) { - return this._super.apply(this, arguments); - } - - // Any arguments left over are other middleware that we want to pass to the providers - this.service(location, service, { middleware }); - - return this; - }, - - setup () { - // Setup each service (pass the app so that they can look up other services etc.) - Object.keys(this.services).forEach(path => { - const service = this.services[path]; - - debug(`Setting up service for \`${path}\``); - if (typeof service.setup === 'function') { - service.setup(this, path); - } - }); - - this._isSetup = true; - - return this; - }, - - // Express 3.x configure is gone in 4.x but we'll keep a more basic version - // That just takes a function in order to keep Feathers plugin configuration easier. - // Environment specific configurations should be done as suggested in the 4.x migration guide: - // https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x - configure (fn) { - fn.call(this); - - return this; - }, - - listen () { - const server = this._super.apply(this, arguments); - - this.setup(server); - debug('Feathers application listening'); - - return server; - } -}; diff --git a/src/client/express.js b/src/client/express.js deleted file mode 100644 index 6fb9c4701f..0000000000 --- a/src/client/express.js +++ /dev/null @@ -1,47 +0,0 @@ -import { EventEmitter } from 'events'; -import Proto from 'uberproto'; - -export default function () { - const app = { - settings: {}, - - get (name) { - return this.settings[name]; - }, - - set (name, value) { - this.settings[name] = value; - return this; - }, - - disable (name) { - this.settings[name] = false; - return this; - }, - - disabled (name) { - return !this.settings[name]; - }, - - enable (name) { - this.settings[name] = true; - return this; - }, - - enabled (name) { - return !!this.settings[name]; - }, - - use () { - throw new Error('Middleware functions can not be used in the Feathers client'); - }, - - listen () { - return {}; - } - }; - - Proto.mixin(EventEmitter.prototype, app); - - return app; -} diff --git a/src/client/index.js b/src/client/index.js deleted file mode 100644 index e2f7778d88..0000000000 --- a/src/client/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import feathers from '../feathers'; -import express from './express'; - -export default function createApplication (...args) { - return feathers(express(...args)); -} - -createApplication.version = '2.0.1'; diff --git a/src/feathers.js b/src/feathers.js deleted file mode 100644 index 82ca9b196d..0000000000 --- a/src/feathers.js +++ /dev/null @@ -1,14 +0,0 @@ -import Proto from 'uberproto'; -import Application from './application'; - -/** - * Create a Feathers application that extends Express. - * - * @return {Function} - * @api public - */ -export default function createApplication (app) { - Proto.mixin(Application, app); - app.init(); - return app; -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index d02de0baab..0000000000 --- a/src/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import feathers from './feathers'; - -export default function createApplication (...args) { - return feathers(express(...args)); -} - -// Expose all express methods (like express.engine()) -Object.assign(createApplication, express, { - version: require('../package.json').version -}); diff --git a/src/mixins/event.js b/src/mixins/event.js deleted file mode 100644 index 43431ec654..0000000000 --- a/src/mixins/event.js +++ /dev/null @@ -1,59 +0,0 @@ -import rubberduck from 'rubberduck'; -import { EventEmitter } from 'events'; -import { hooks } from 'feathers-commons'; - -const hookObject = hooks.hookObject; -const eventMappings = { - create: 'created', - update: 'updated', - remove: 'removed', - patch: 'patched' -}; - -function upperCase (name) { - return name.charAt(0).toUpperCase() + name.substring(1); -} - -export default function (service) { - const app = this; - const isEmitter = typeof service.on === 'function' && - typeof service.emit === 'function'; - const emitter = service._rubberDuck = rubberduck.emitter(service); - - if (typeof service.mixin === 'function' && !isEmitter) { - service.mixin(EventEmitter.prototype); - } - - service._serviceEvents = Array.isArray(service.events) ? service.events.slice() : []; - - // Pass the Rubberduck error event through - // TODO deal with error events properly - emitter.on('error', function (errors) { - service.emit('serviceError', errors[0]); - }); - - Object.keys(eventMappings).forEach(method => { - const event = eventMappings[method]; - const alreadyEmits = service._serviceEvents.indexOf(event) !== -1; - - if (typeof service[method] === 'function' && !alreadyEmits) { - // The Rubberduck event name (e.g. afterCreate, afterUpdate or afterDestroy) - var eventName = `after${upperCase(method)}`; - service._serviceEvents.push(event); - // Punch the given method - emitter.punch(method, -1); - // Pass the event and error event through - emitter.on(eventName, function (results, args) { - if (!results[0]) { // callback without error - const hook = hookObject(method, 'after', args); - const data = Array.isArray(results[1]) ? results[1] : [ results[1] ]; - - hook.app = app; - data.forEach(current => service.emit(event, current, hook)); - } else { - service.emit('serviceError', results[0]); - } - }); - } - }); -} diff --git a/src/mixins/index.js b/src/mixins/index.js deleted file mode 100644 index 3be3c95d72..0000000000 --- a/src/mixins/index.js +++ /dev/null @@ -1,16 +0,0 @@ -export default function () { - const mixins = [ - require('./promise'), - require('./event'), - require('./normalizer') - ]; - - // Override push to make sure that normalize is always the last - mixins.push = function () { - const args = [this.length - 1, 0].concat(Array.from(arguments)); - this.splice.apply(this, args); - return this.length; - }; - - return mixins; -} diff --git a/src/mixins/normalizer.js b/src/mixins/normalizer.js deleted file mode 100644 index 45cef9767c..0000000000 --- a/src/mixins/normalizer.js +++ /dev/null @@ -1,17 +0,0 @@ -import { getArguments } from 'feathers-commons'; - -export default function (service) { - if (typeof service.mixin === 'function') { - const mixin = {}; - - this.methods.forEach(method => { - if (typeof service[method] === 'function') { - mixin[method] = function () { - return this._super.apply(this, getArguments(method, arguments)); - }; - } - }); - - service.mixin(mixin); - } -} diff --git a/src/mixins/promise.js b/src/mixins/promise.js deleted file mode 100644 index 6ccb65b079..0000000000 --- a/src/mixins/promise.js +++ /dev/null @@ -1,28 +0,0 @@ -function isPromise (result) { - return typeof result !== 'undefined' && - typeof result.then === 'function'; -} - -function wrapper () { - const result = this._super.apply(this, arguments); - const callback = arguments[arguments.length - 1]; - - if (typeof callback === 'function' && isPromise(result)) { - result.then(data => callback(null, data), error => callback(error)); - } - return result; -} - -export default function (service) { - if (typeof service.mixin === 'function') { - const mixin = {}; - - this.methods.forEach(method => { - if (typeof service[method] === 'function') { - mixin[method] = wrapper; - } - }); - - service.mixin(mixin); - } -} diff --git a/test/application.test.js b/test/application.test.js index ecc98c47cf..15c8c8891e 100644 --- a/test/application.test.js +++ b/test/application.test.js @@ -1,61 +1,47 @@ -import assert from 'assert'; -import path from 'path'; -import fs from 'fs'; -import Proto from 'uberproto'; -import io from 'socket.io-client'; -import request from 'request'; -import https from 'https'; -import rest from 'feathers-rest'; -import socketio from 'feathers-socketio'; -import feathers from '../src/'; +const assert = require('assert'); +const Proto = require('uberproto'); +const feathers = require('../lib'); describe('Feathers application', () => { - it('is CommonJS compatible', () => { - assert.equal(typeof require('../lib/feathers'), 'function'); - }); - - it('Express application should use express apps.', () => { + it('initializes', () => { const app = feathers(); - const child = feathers(); - app.use('/path', child); - assert.equal(child.parent, app); + assert.equal(typeof app.use, 'function'); + assert.equal(typeof app.service, 'function'); + assert.equal(typeof app.services, 'object'); }); - it('.use with invalid parameters', () => { + it('sets the version on main and app instance', () => { + const pkg = require('../package.json'); const app = feathers(); - try { - app.use('/dummy', {}, {}); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.equal(e.message, 'invalid arg passed to app.use'); - } + assert.equal(feathers.version, pkg.version); + assert.equal(app.version, pkg.version); }); - it('Register services and look them up with and without leading and trailing slashes.', () => { - const dummyService = { - find () { - // No need to implement this - } - }; + it('is an event emitter', done => { + const app = feathers(); + const original = { hello: 'world' }; - const app = feathers().use('/dummy/service/', dummyService); + app.on('test', data => { + assert.deepEqual(original, data); + done(); + }); - app.listen(8012, () => app.use('/another/dummy/service/', dummyService)); + app.emit('test', original); + }); - assert.ok(typeof app.service('dummy/service').find === 'function', 'Could look up without slashes'); - assert.ok(typeof app.service('/dummy/service').find === 'function', 'Could look up with leading slash'); - assert.ok(typeof app.service('dummy/service/').find === 'function', 'Could look up with trailing slash'); + it('throws an error for old app.service(path, service)', () => { + const app = feathers(); - app.on('listening', function () { - assert.ok(typeof app.service('another/dummy/service').find === 'function', 'Could look up without slashes'); - assert.ok(typeof app.service('/another/dummy/service').find === 'function', 'Could look up with leading slash'); - assert.ok(typeof app.service('another/dummy/service/').find === 'function', 'Could look up with trailing slash'); - }); + try { + app.service('/test', {}); + } catch (e) { + assert.equal(e.message, 'Registering a new service with `app.service(path, service)` is no longer supported. Use `app.use(path, service)` instead.'); + } }); - it('uses .defaultService if available', done => { + it('uses .defaultService if available', () => { const app = feathers(); assert.ok(!app.service('/todos/')); @@ -71,306 +57,328 @@ describe('Feathers application', () => { }; }; - app.service('/todos/').get('dishes').then(data => { + return app.service('/todos/').get('dishes').then(data => { assert.deepEqual(data, { id: 'dishes', description: 'You have to do dishes!' }); + }); + }); + + it('additionally passes `app` as .configure parameter (#558)', done => { + feathers().configure(function (app) { + assert.equal(this, app); done(); }); }); - it('Registers a service, wraps it, runs service.setup(), and adds the event and Promise mixin', done => { - const dummyService = { - setup (app, path) { - this.path = path; - }, + describe('Services', () => { + it('calling .use with a non service object throws', () => { + const app = feathers(); - create (data) { - return Promise.resolve(data); + try { + app.use('/bla', function () {}); + assert.ok(false, 'Should never get here'); + } catch (e) { + assert.equal(e.message, 'Invalid service object passed for path `bla`'); } - }; - - const app = feathers().use('/dummy', dummyService); - const wrappedService = app.service('dummy'); - const server = app.listen(7887, function () { - app.use('/dumdum', dummyService); - const dynamicService = app.service('dumdum'); - - assert.ok(wrappedService.path === 'dummy', 'Wrapped service setup method ran.'); - assert.ok(dynamicService.path === 'dumdum', 'Dynamic service setup method ran.'); }); - assert.ok(Proto.isPrototypeOf(wrappedService), 'Service got wrapped as Uberproto object'); - assert.ok(typeof wrappedService.on === 'function', 'Wrapped service is an event emitter'); + it('registers and wraps a new service', () => { + const dummyService = { + setup (app, path) { + this.path = path; + }, - wrappedService.on('created', function (data) { - assert.equal(data.message, 'Test message', 'Got created event with test message'); - server.close(done); - }); + create (data) { + return Promise.resolve(data); + } + }; - wrappedService.create({ - message: 'Test message' - }).then(data => - assert.equal(data.message, 'Test message', 'Got created event with test message')); - }); + const app = feathers().use('/dummy', dummyService); + const wrappedService = app.service('dummy'); - it('Initializes REST and SocketIO providers.', function (done) { - const todoService = { - get (name, params, callback) { - callback(null, { - id: name, - description: `You have to do ${name}!` - }); - } - }; + assert.ok(Proto.isPrototypeOf(wrappedService), 'Service got wrapped as Uberproto object'); - const app = feathers() - .configure(rest()) - .configure(socketio()) - .use('/todo', todoService); - const server = app.listen(6999).on('listening', () => { - const socket = io.connect('http://localhost:6999'); + return wrappedService.create({ + message: 'Test message' + }).then(data => assert.equal(data.message, 'Test message')); + }); + + it('services can be re-used (#566)', done => { + const app1 = feathers(); + const app2 = feathers(); - request('http://localhost:6999/todo/dishes', (error, response, body) => { - if (error) { - done(error); + app2.use('/dummy', { + create (data) { + return Promise.resolve(data); } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.equal(data.description, 'You have to do dishes!'); + }); + + const dummy = app2.service('dummy'); - socket.emit('todo::get', 'laundry', {}, function (error, data) { - if (error) { - done(error); + dummy.hooks({ + before: { + create (hook) { + hook.data.fromHook = true; } - assert.equal(data.description, 'You have to do laundry!'); + } + }); - socket.disconnect(); - server.close(done); + dummy.on('created', data => { + assert.deepEqual(data, { + message: 'Hi', + fromHook: true }); + done(); }); + + app1.use('/testing', app2.service('dummy')); + + app1.service('testing').create({ message: 'Hi' }); }); }); - it('Uses custom middleware. (#21)', done => { - const todoService = { - get (name, params) { - return Promise.resolve({ - id: name, - description: `You have to do ${name}!`, - preService: params.preService - }); - } - }; + // Copied from the Express tests (without special cases) + describe('Express app options compatibility', function () { + describe('.set()', () => { + it('should set a value', () => { + var app = feathers(); + app.set('foo', 'bar'); + assert.equal(app.get('foo'), 'bar'); + }); - const app = feathers() - .configure(rest()) - .use('/todo', function (req, res, next) { - req.feathers.preService = 'pre-service middleware'; - next(); - }, todoService, function (req, res, next) { - res.set('post-service', res.data.id); - next(); - }) - .use('/otherTodo', todoService); - - const server = app.listen(6995).on('listening', () => { - request('http://localhost:6995/todo/dishes', (error, response, body) => { - if (error) { - done(error); - } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.equal(data.preService, 'pre-service middleware', 'Pre-service middleware updated response'); - assert.equal(response.headers['post-service'], 'dishes', 'Post-service middleware updated response'); - - request('http://localhost:6995/otherTodo/dishes', (error, response, body) => { - if (error) { - done(error); - } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.ok(!data.preService && !response.headers['post-service'], 'Custom middleware not run for different service.'); - server.close(done); - }); + it('should return the app', () => { + var app = feathers(); + assert.equal(app.set('foo', 'bar'), app); }); - }); - }); - it('REST and SocketIO with SSL server (#25)', done => { - // For more info on Request HTTPS settings see https://github.com/mikeal/request/issues/418 - // This needs to be set so that the SocektIO client can connect - process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + it('should return the app when undefined', () => { + var app = feathers(); + assert.equal(app.set('foo', undefined), app); + }); + }); - const todoService = { - get (name, params, callback) { - callback(null, { - id: name, - description: `You have to do ${name}!` - }); - } - }; + describe('.get()', () => { + it('should return undefined when unset', () => { + var app = feathers(); + assert.strictEqual(app.get('foo'), undefined); + }); - const app = feathers() - .configure(rest()) - .configure(socketio()).use('/secureTodos', todoService); + it('should otherwise return the value', () => { + var app = feathers(); + app.set('foo', 'bar'); + assert.equal(app.get('foo'), 'bar'); + }); + }); - const httpsServer = https.createServer({ - key: fs.readFileSync(path.join(__dirname, 'resources', 'privatekey.pem')), - cert: fs.readFileSync(path.join(__dirname, 'resources', 'certificate.pem')), - rejectUnauthorized: false, - requestCert: false - }, app).listen(7889); + describe('.enable()', () => { + it('should set the value to true', () => { + var app = feathers(); + assert.equal(app.enable('tobi'), app); + assert.strictEqual(app.get('tobi'), true); + }); + }); - app.setup(httpsServer); + describe('.disable()', () => { + it('should set the value to false', () => { + var app = feathers(); + assert.equal(app.disable('tobi'), app); + assert.strictEqual(app.get('tobi'), false); + }); + }); - httpsServer.on('listening', function () { - const socket = io('https://localhost:7889', { - secure: true, - port: 7889, - rejectUnauthorized: false + describe('.enabled()', () => { + it('should default to false', () => { + var app = feathers(); + assert.strictEqual(app.enabled('foo'), false); }); - request({ - url: 'https://localhost:7889/secureTodos/dishes', - strictSSL: false, - rejectUnhauthorized: false - }, function (error, response, body) { - if (error) { - done(error); - } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.equal(data.description, 'You have to do dishes!'); + it('should return true when set', () => { + var app = feathers(); + app.set('foo', 'bar'); + assert.strictEqual(app.enabled('foo'), true); + }); + }); - socket.emit('secureTodos::get', 'laundry', {}, function (error, data) { - if (error) { - done(error); - } - assert.equal(data.description, 'You have to do laundry!'); + describe('.disabled()', () => { + it('should default to true', () => { + var app = feathers(); + assert.strictEqual(app.disabled('foo'), true); + }); - socket.disconnect(); - httpsServer.close(); - done(); - }); + it('should return false when set', () => { + var app = feathers(); + app.set('foo', 'bar'); + assert.strictEqual(app.disabled('foo'), false); }); }); }); - it('Returns the value of a promise. (#41)', function (done) { - let original = {}; - const todoService = { - get (name) { - original = { - id: name, - q: true, - description: `You have to do ${name}!` - }; - return Promise.resolve(original); - } - }; + describe('.setup', () => { + it('app.setup calls .setup on all services', () => { + const app = feathers(); + let setupCount = 0; - const app = feathers() - .configure(rest()) - .use('/todo', todoService); + app.use('/dummy', { + setup (appRef, path) { + setupCount++; + assert.equal(appRef, app); + assert.equal(path, 'dummy'); + } + }); - const server = app.listen(6880).on('listening', function () { - request('http://localhost:6880/todo/dishes', (error, response, body) => { - if (error) { - done(error); + app.use('/simple', { + get (id) { + return Promise.resolve({ id }); } - assert.ok(response.statusCode === 200, 'Got OK status code'); - assert.deepEqual(original, JSON.parse(body)); - server.close(done); }); - }); - }); - it('Calls _setup in order to set up custom routes with higher priority. (#86)', done => { - const todoService = { - get (name) { - return Promise.resolve({ - id: name, - q: true, - description: `You have to do ${name}!` - }); - }, + app.use('/dummy2', { + setup (appRef, path) { + setupCount++; + assert.equal(appRef, app); + assert.equal(path, 'dummy2'); + } + }); - _setup (app, path) { - app.get(`/${path}/count`, function (req, res) { - res.json({ counter: 10 }); - }); - } - }; + app.setup(); + + assert.ok(app._isSetup); + assert.equal(setupCount, 2); + }); - const app = feathers() - .configure(rest()) - .use('/todo', todoService); + it('registering a service after app.setup will be set up', () => { + const app = feathers(); - const server = app.listen(8999).on('listening', function () { - request('http://localhost:8999/todo/dishes', (error, response, body) => { - if (error) { - done(error); + app.setup(); + + app.use('/dummy', { + setup (appRef, path) { + assert.ok(app._isSetup); + assert.equal(appRef, app); + assert.equal(path, 'dummy'); } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.equal(data.description, 'You have to do dishes!'); + }); + }); - request('http://localhost:8999/todo/count', (error, response, body) => { - if (error) { - done(error); - } - assert.ok(response.statusCode === 200, 'Got OK status code'); - const data = JSON.parse(body); - assert.equal(data.counter, 10); - server.close(done); - }); + it('calls _setup on a service right away', () => { + const app = feathers(); + let _setup = false; + + app.use('/dummy', { + get () {}, + _setup (appRef, path) { + _setup = true; + assert.equal(appRef, app); + assert.equal(path, 'dummy'); + } }); + + assert.ok(_setup); }); }); - it('mixins are unique to one application', function () { - const app = feathers(); - app.mixins.push(function () {}); - assert.equal(app.mixins.length, 4); + describe('providers', () => { + it('are getting called with a service', () => { + const app = feathers(); + let providerRan = false; - const otherApp = feathers(); - otherApp.mixins.push(function () {}); - assert.equal(otherApp.mixins.length, 4); - }); + app.providers.push(function (service, location, options) { + assert.ok(service.dummy); + assert.equal(location, 'dummy'); + assert.deepEqual(options, {}); + providerRan = true; + }); - it('initializes a service with only a setup method (#285)', done => { - const app = feathers(); + app.use('/dummy', { + dummy: true, + get () {} + }); - app.use('/setup-only', { - setup (_app, path) { - assert.equal(_app, app); - assert.equal(path, 'setup-only'); - done(); - } + assert.ok(providerRan); + + app.setup(); }); - app.setup(); + it('are getting called with a service and options', () => { + const app = feathers(); + const opts = { test: true }; + + let providerRan = false; + + app.providers.push(function (service, location, options) { + assert.ok(service.dummy); + assert.equal(location, 'dummy'); + assert.deepEqual(options, opts); + providerRan = true; + }); + + app.use('/dummy', { + dummy: true, + get () {} + }, opts); + + assert.ok(providerRan); + + app.setup(); + }); }); - it('Event punching happens after normalization (#150)', done => { - const todoService = { - create (data) { - return Promise.resolve(data); - } - }; + describe('sub apps', () => { + it('re-registers sub-app services with prefix', done => { + const app = feathers(); + const subApp = feathers(); + + subApp.use('/service1', { + get (id) { + return Promise.resolve({ + id, name: 'service1' + }); + } + }).use('/service2', { + get (id) { + return Promise.resolve({ + id, name: 'service2' + }); + }, + + create (data) { + return Promise.resolve(data); + } + }); + + app.use('/api/', subApp); + + app.service('/api/service2').once('created', data => { + assert.deepEqual(data, { + message: 'This is a test' + }); + + subApp.service('service2').once('created', data => { + assert.deepEqual(data, { + message: 'This is another test' + }); - const app = feathers() - .configure(rest()) - .use('/todo', todoService); + done(); + }); - const server = app.listen(7001).on('listening', function () { - app.service('todo').create({ - test: 'item' + app.service('api/service2').create({ + message: 'This is another test' + }); }); - server.close(done); + app.service('/api/service1').get(10).then(data => { + assert.equal(data.name, 'service1'); + + return app.service('/api/service2').get(1); + }).then(data => { + assert.equal(data.name, 'service2'); + + return subApp.service('service2').create({ + message: 'This is a test' + }); + }); }); }); }); diff --git a/test/client.test.js b/test/client.test.js deleted file mode 100644 index 9ec3eff84e..0000000000 --- a/test/client.test.js +++ /dev/null @@ -1,141 +0,0 @@ -import assert from 'assert'; -import Proto from 'uberproto'; -import feathers from '../src/client'; - -describe('Feathers universal client', () => { - it('is not an Express application', () => { - const app = feathers(); - // There may be some other better ways to verify this but it works for now - assert.ok(typeof app.render !== 'function'); - }); - - it('calling .use with a function throws', () => { - const app = feathers(); - - try { - app.use(function () {}); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.equal(e.message, 'Middleware functions can not be used in the Feathers client'); - } - }); - - it('.listen does nothing', () => { - assert.deepEqual(feathers().listen(), {}); - }); - - it('is an event emitter', done => { - const app = feathers(); - const original = { hello: 'world' }; - app.on('test', data => { - assert.deepEqual(original, data); - done(); - }); - - app.emit('test', original); - }); - - it('Registers a service, wraps it, runs service.setup(), and adds the event and Promise mixin', done => { - const dummyService = { - setup (app, path) { - this.path = path; - }, - - create (data) { - return Promise.resolve(data); - } - }; - - const app = feathers().use('/dummy', dummyService); - const wrappedService = app.service('dummy'); - - assert.ok(Proto.isPrototypeOf(wrappedService), 'Service got wrapped as Uberproto object'); - assert.ok(typeof wrappedService.on === 'function', 'Wrapped service is an event emitter'); - - wrappedService.on('created', function (data) { - assert.equal(data.message, 'Test message', 'Got created event with test message'); - done(); - }); - - wrappedService.create({ - message: 'Test message' - }).then(data => - assert.equal(data.message, 'Test message', 'Got created event with test message')); - }); - - // Copied from the Express tests (without special cases) - describe('Express app options compatibility', function () { - describe('.set()', () => { - it('should set a value', () => { - var app = feathers(); - app.set('foo', 'bar'); - assert.equal(app.get('foo'), 'bar'); - }); - - it('should return the app', () => { - var app = feathers(); - assert.equal(app.set('foo', 'bar'), app); - }); - - it('should return the app when undefined', () => { - var app = feathers(); - assert.equal(app.set('foo', undefined), app); - }); - }); - - describe('.get()', () => { - it('should return undefined when unset', () => { - var app = feathers(); - assert.strictEqual(app.get('foo'), undefined); - }); - - it('should otherwise return the value', () => { - var app = feathers(); - app.set('foo', 'bar'); - assert.equal(app.get('foo'), 'bar'); - }); - }); - - describe('.enable()', () => { - it('should set the value to true', () => { - var app = feathers(); - assert.equal(app.enable('tobi'), app); - assert.strictEqual(app.get('tobi'), true); - }); - }); - - describe('.disable()', () => { - it('should set the value to false', () => { - var app = feathers(); - assert.equal(app.disable('tobi'), app); - assert.strictEqual(app.get('tobi'), false); - }); - }); - - describe('.enabled()', () => { - it('should default to false', () => { - var app = feathers(); - assert.strictEqual(app.enabled('foo'), false); - }); - - it('should return true when set', () => { - var app = feathers(); - app.set('foo', 'bar'); - assert.strictEqual(app.enabled('foo'), true); - }); - }); - - describe('.disabled()', () => { - it('should default to true', () => { - var app = feathers(); - assert.strictEqual(app.disabled('foo'), true); - }); - - it('should return false when set', () => { - var app = feathers(); - app.set('foo', 'bar'); - assert.strictEqual(app.disabled('foo'), false); - }); - }); - }); -}); diff --git a/test/distributed.test.js b/test/distributed.test.js deleted file mode 100644 index bfbf6b5363..0000000000 --- a/test/distributed.test.js +++ /dev/null @@ -1,44 +0,0 @@ -import assert from 'assert'; -import io from 'socket.io-client'; -import socketio from 'feathers-socketio'; -import socketioClient from 'feathers-socketio/client'; -import rest from 'feathers-rest'; -import feathers from '../src/'; -import client from '../src/client'; - -describe('Distributed Feathers applications test', () => { - before(done => { - const app = feathers() - .configure(socketio()) - .use('todos', { - create (data) { - data.id = 42; - return Promise.resolve(data); - } - }); - - app.listen(8888, done); - }); - - it('passes created event between servers', done => { - const socket = io('http://localhost:8888'); - const remoteApp = client().configure(socketioClient(socket)); - const todo = { text: 'Created on alpha server', complete: false }; - const beta = feathers() - .configure(rest()) - .use('todos', remoteApp.service('todos')); - - beta.listen(9999, function () { - beta.service('todos').on('created', function (newTodo) { - assert.deepEqual(newTodo, { - id: 42, - text: 'Created on alpha server', - complete: false - }); - done(); - }); - - socket.emit('todos::create', todo); - }); - }); -}); diff --git a/test/events.test.js b/test/events.test.js new file mode 100644 index 0000000000..66c7fd9a3b --- /dev/null +++ b/test/events.test.js @@ -0,0 +1,158 @@ +const assert = require('assert'); +const { EventEmitter } = require('events'); + +const feathers = require('../lib'); + +describe('Service events', () => { + it('app is an event emitter', done => { + const app = feathers(); + + assert.equal(typeof app.on, 'function'); + + app.on('test', data => { + assert.deepEqual(data, { message: 'app' }); + done(); + }); + app.emit('test', { message: 'app' }); + }); + + it('works with service that is already an EventEmitter', done => { + const app = feathers(); + const service = new EventEmitter(); + + service.create = function (data) { + return Promise.resolve(data); + }; + + service.on('created', data => { + assert.deepEqual(data, { + message: 'testing' + }); + done(); + }); + + app.use('/emitter', service); + + app.service('emitter').create({ + message: 'testing' + }); + }); + + describe('emits event data on a service', () => { + it('.create and created', done => { + const app = feathers().use('/creator', { + create (data) { + return Promise.resolve(data); + } + }); + + const service = app.service('creator'); + + service.on('created', data => { + assert.deepEqual(data, { message: 'Hello' }); + done(); + }); + + service.create({ message: 'Hello' }); + }); + + it('.update and updated', done => { + const app = feathers().use('/creator', { + update (id, data) { + return Promise.resolve(Object.assign({ id }, data)); + } + }); + + const service = app.service('creator'); + + service.on('updated', data => { + assert.deepEqual(data, { id: 10, message: 'Hello' }); + done(); + }); + + service.update(10, { message: 'Hello' }); + }); + + it('.patch and patched', done => { + const app = feathers().use('/creator', { + patch (id, data) { + return Promise.resolve(Object.assign({ id }, data)); + } + }); + + const service = app.service('creator'); + + service.on('patched', data => { + assert.deepEqual(data, { id: 12, message: 'Hello' }); + done(); + }); + + service.patch(12, { message: 'Hello' }); + }); + + it('.remove and removed', done => { + const app = feathers().use('/creator', { + remove (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('creator'); + + service.on('removed', data => { + assert.deepEqual(data, { id: 22 }); + done(); + }); + + service.remove(22); + }); + }); + + describe('event format', () => { + it('also emits the actual hook object', done => { + const app = feathers().use('/creator', { + create (data) { + return Promise.resolve(data); + } + }); + + const service = app.service('creator'); + + service.hooks({ + after (hook) { + hook.changed = true; + } + }); + + service.on('created', (data, hook) => { + assert.deepEqual(data, { message: 'Hi' }); + assert.ok(hook.changed); + assert.equal(hook.service, service); + assert.equal(hook.method, 'create'); + assert.equal(hook.type, 'after'); + done(); + }); + + service.create({ message: 'Hi' }); + }); + + it('events indicated by the service are not sent automatically', done => { + const app = feathers().use('/creator', { + events: [ 'created' ], + create (data) { + return Promise.resolve(data); + } + }); + + const service = app.service('creator'); + + service.on('created', data => { + assert.deepEqual(data, { message: 'custom event' }); + done(); + }); + + service.create({ message: 'hello' }) + .then(() => service.emit('created', { message: 'custom event' })); + }); + }); +}); diff --git a/test/hooks/after.test.js b/test/hooks/after.test.js new file mode 100644 index 0000000000..5c68af8271 --- /dev/null +++ b/test/hooks/after.test.js @@ -0,0 +1,426 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('`after` hooks', () => { + describe('function(hook)', () => { + it('returning a non-hook object throws error', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + const service = app.service('dummy'); + + service.hooks({ + after: { + get () { + return {}; + } + } + }); + + return service.get(10).catch(e => { + assert.equal(e.message, 'after hook for \'get\' method returned invalid hook object'); + }); + }); + + it('.after hooks can return a promise', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ + id: id, + description: `You have to do ${id}` + }); + }, + + find () { + return Promise.resolve([]); + } + }); + const service = app.service('dummy'); + + service.hooks({ + after: { + get (hook) { + hook.result.ran = true; + return Promise.resolve(hook); + }, + + find () { + return Promise.reject(new Error('You can not see this')); + } + } + }); + + return service.get('laundry', {}).then(data => { + assert.deepEqual(data, { + id: 'laundry', + description: 'You have to do laundry', + ran: true + }); + + return service.find({}).then(() => { + throw new Error('Should never get here'); + }).catch(error => { + assert.equal(error.message, 'You can not see this'); + }); + }); + }); + + it('.after hooks do not need to return anything', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ + id, description: `You have to do ${id}` + }); + }, + + find () { + return Promise.resolve([]); + } + }); + const service = app.service('dummy'); + + service.hooks({ + after: { + get (hook) { + hook.result.ran = true; + }, + + find () { + throw new Error('You can not see this'); + } + } + }); + + return service.get('laundry').then(data => { + assert.deepEqual(data, { + id: 'laundry', + description: 'You have to do laundry', + ran: true + }); + + return service.find().catch(error => { + assert.equal(error.message, 'You can not see this'); + }); + }); + }); + }); + + describe('function(hook, next)', () => { + it('gets mixed into a service and modifies data', () => { + const dummyService = { + create (data, params) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + create (hook, next) { + assert.equal(hook.type, 'after'); + + hook.result.some = 'thing'; + + next(null, hook); + } + } + }); + + return service.create({ my: 'data' }).then(data => { + assert.deepEqual({ my: 'data', some: 'thing' }, data, 'Got modified data'); + }); + }); + + it('also makes the app available at hook.app', () => { + const dummyService = { + create (data) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + create (hook, next) { + hook.result.appPresent = typeof hook.app !== 'undefined'; + assert.equal(hook.result.appPresent, true); + + next(null, hook); + } + } + }); + + return service.create({ my: 'data' }).then(data => { + assert.deepEqual({ my: 'data', appPresent: true }, data, 'The app was present in the hook.'); + }); + }); + + it('returns errors', () => { + const dummyService = { + update (id, data) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + update (hook, next) { + next(new Error('This did not work')); + } + } + }); + + return service.update(1, { my: 'data' }).catch(error => { + assert.ok(error, 'Got an error'); + assert.equal(error.message, 'This did not work', 'Got expected error message from hook'); + }); + }); + + it('does not run after hook when there is an error', () => { + const dummyService = { + remove () { + return Promise.reject(new Error('Error removing item')); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + remove () { + assert.ok(false, 'This should never get called'); + } + } + }); + + return service.remove(1, {}).catch(error => { + assert.ok(error, 'Got error'); + assert.equal(error.message, 'Error removing item', 'Got error message from service'); + }); + }); + + it('adds .after() and chains multiple hooks for the same method', () => { + const dummyService = { + create (data) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + create (hook, next) { + hook.result.some = 'thing'; + next(); + } + } + }); + + service.hooks({ + after: { + create (hook, next) { + hook.result.other = 'stuff'; + + next(); + } + } + }); + + service.create({ my: 'data' }).then(data => { + assert.deepEqual({ + my: 'data', + some: 'thing', + other: 'stuff' + }, data, 'Got modified data'); + }); + }); + + it('chains multiple after hooks using array syntax', () => { + const dummyService = { + create (data) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + create: [ + function (hook, next) { + hook.result.some = 'thing'; + next(); + }, + function (hook, next) { + hook.result.other = 'stuff'; + + next(); + } + ] + } + }); + + return service.create({ my: 'data' }).then(data => { + assert.deepEqual({ + my: 'data', + some: 'thing', + other: 'stuff' + }, data, 'Got modified data'); + }); + }); + + it('.after hooks run in the correct order (#13)', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + after: { + get (hook, next) { + hook.result.items = ['first']; + next(); + } + } + }); + + service.hooks({ + after: { + get: [ + function (hook, next) { + hook.result.items.push('second'); + next(); + }, + function (hook, next) { + hook.result.items.push('third'); + next(); + } + ] + } + }); + + service.get(10).then(data => { + assert.deepEqual(data.items, ['first', 'second', 'third']); + }); + }); + + it('after all hooks (#11)', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ + id: id, + items: [] + }); + }, + + find () { + return Promise.resolve([]); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + after: { + all (hook, next) { + hook.result.afterAllObject = true; + next(); + } + } + }); + + service.hooks({ + after: [ + function (hook, next) { + hook.result.afterAllMethodArray = true; + next(); + } + ] + }); + + return service.find({}).then(data => { + assert.ok(data.afterAllObject); + assert.ok(data.afterAllMethodArray); + + return service.get(1, {}).then(data => { + assert.ok(data.afterAllObject); + assert.ok(data.afterAllMethodArray); + }); + }); + }); + + it('after hooks have service as context and keep it in service method (#17)', () => { + const app = feathers().use('/dummy', { + number: 42, + get (id) { + return Promise.resolve({ + id: id, + number: this.number + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + after: { + get (hook, next) { + hook.result.test = this.number + 1; + next(); + } + } + }); + + service.get(10).then(data => { + assert.deepEqual(data, { + id: 10, + number: 42, + test: 43 + }); + }); + }); + + it('can not call next() multiple times', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + after: { + get: [ + function (hook, next) { + next(); + }, + + function (hook, next) { + next(); + next(); + } + ] + } + }); + + return service.get(10); + }); + }); +}); diff --git a/test/hooks/app.test.js b/test/hooks/app.test.js new file mode 100644 index 0000000000..404e8e24ee --- /dev/null +++ b/test/hooks/app.test.js @@ -0,0 +1,181 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('app.hooks', () => { + let app; + + beforeEach(() => { + app = feathers() + .use('/todos', { + get (id, params) { + if (id === 'error') { + return Promise.reject(new Error('Something went wrong')); + } + + return Promise.resolve({ id, params }); + }, + + create (data, params) { + return Promise.resolve({ data, params }); + } + }); + }); + + it('app has the .hooks method', () => { + assert.equal(typeof app.hooks, 'function'); + }); + + describe('app.hooks({ before })', () => { + it('basic app before hook', () => { + const service = app.service('todos'); + + app.hooks({ + before (hook) { + assert.equal(hook.app, app); + hook.params.ran = true; + } + }); + + return service.get('test').then(result => { + assert.deepEqual(result, { + id: 'test', + params: { ran: true } + }); + + const data = { test: 'hi' }; + + return service.create(data).then(result => { + assert.deepEqual(result, { + data, params: { ran: true } + }); + }); + }); + }); + + it('app before hooks always run first', () => { + app.service('todos').hooks({ + before (hook) { + assert.equal(hook.app, app); + hook.params.order.push('service.before'); + } + }); + + app.service('todos').hooks({ + before (hook) { + assert.equal(hook.app, app); + hook.params.order.push('service.before 1'); + } + }); + + app.hooks({ + before (hook) { + assert.equal(hook.app, app); + hook.params.order = []; + hook.params.order.push('app.before'); + } + }); + + return app.service('todos').get('test').then(result => { + assert.deepEqual(result, { + id: 'test', + params: { + order: [ 'app.before', 'service.before', 'service.before 1' ] + } + }); + }); + }); + }); + + describe('app.hooks({ after })', () => { + it('basic app after hook', () => { + app.hooks({ + after (hook) { + assert.equal(hook.app, app); + hook.result.ran = true; + } + }); + + return app.service('todos').get('test').then(result => { + assert.deepEqual(result, { + id: 'test', + params: {}, + ran: true + }); + }); + }); + + it('app after hooks always run last', () => { + app.hooks({ + after (hook) { + assert.equal(hook.app, app); + hook.result.order.push('app.after'); + } + }); + + app.service('todos').hooks({ + after (hook) { + assert.equal(hook.app, app); + hook.result.order = []; + hook.result.order.push('service.after'); + } + }); + + app.service('todos').hooks({ + after (hook) { + assert.equal(hook.app, app); + hook.result.order.push('service.after 1'); + } + }); + + return app.service('todos').get('test').then(result => { + assert.deepEqual(result, { + id: 'test', + params: {}, + order: [ 'service.after', 'service.after 1', 'app.after' ] + }); + }); + }); + }); + + describe('app.hooks({ error })', () => { + it('basic app error hook', () => { + app.hooks({ + error (hook) { + assert.equal(hook.app, app); + hook.error = new Error('App hook ran'); + } + }); + + return app.service('todos').get('error').catch(error => { + assert.equal(error.message, 'App hook ran'); + }); + }); + + it('app error hooks always run last', () => { + app.hooks({ + error (hook) { + assert.equal(hook.app, app); + hook.error = new Error(`${hook.error.message} app.after`); + } + }); + + app.service('todos').hooks({ + error (hook) { + assert.equal(hook.app, app); + hook.error = new Error(`${hook.error.message} service.after`); + } + }); + + app.service('todos').hooks({ + error (hook) { + assert.equal(hook.app, app); + hook.error = new Error(`${hook.error.message} service.after 1`); + } + }); + + return app.service('todos').get('error').catch(error => { + assert.equal(error.message, 'Something went wrong service.after service.after 1 app.after'); + }); + }); + }); +}); diff --git a/test/hooks/before.test.js b/test/hooks/before.test.js new file mode 100644 index 0000000000..a90597855b --- /dev/null +++ b/test/hooks/before.test.js @@ -0,0 +1,509 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('`before` hooks', () => { + describe('function([hook])', () => { + it('returning a non-hook object throws error', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + const service = app.service('dummy'); + + service.hooks({ + before: { + get () { + return {}; + } + } + }); + + return service.get(10).catch(e => { + assert.equal(e.message, 'before hook for \'get\' method returned invalid hook object'); + }); + }); + + it('hooks in chain can be replaced', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ + id, description: `You have to do ${id}` + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get: [ + function (hook) { + return Object.assign({}, hook, { + modified: true + }); + }, + function (hook) { + assert.ok(hook.modified); + } + ] + } + }); + + return service.get('laundry'); + }); + + it('.before hooks can return a promise', () => { + const app = feathers().use('/dummy', { + get (id, params) { + assert.ok(params.ran, 'Ran through promise hook'); + + return Promise.resolve({ + id: id, + description: `You have to do ${id}` + }); + }, + + remove () { + assert.ok(false, 'Should never get here'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook) { + return new Promise(resolve => { + hook.params.ran = true; + resolve(); + }); + }, + + remove () { + return new Promise((resolve, reject) => { + reject(new Error('This did not work')); + }); + } + } + }); + + return service.get('dishes').then(() => service.remove(10)) + .catch(error => { + assert.equal(error.message, 'This did not work'); + }); + }); + + it('.before hooks do not need to return anything', () => { + const app = feathers().use('/dummy', { + get (id, params) { + assert.ok(params.ran, 'Ran through promise hook'); + + return Promise.resolve({ + id: id, + description: `You have to do ${id}` + }); + }, + + remove () { + assert.ok(false, 'Should never get here'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook) { + hook.params.ran = true; + }, + + remove () { + throw new Error('This did not work'); + } + } + }); + + return service.get('dishes').then(() => service.remove(10)) + .catch(error => { + assert.equal(error.message, 'This did not work'); + }); + }); + + it('.before hooks can set hook.result which will skip service method', () => { + const app = feathers().use('/dummy', { + get (id) { + assert.ok(false, 'This should never run'); + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook) { + hook.result = { + id: hook.id, + message: 'Set from hook' + }; + } + } + }); + + return service.get(10, {}).then(data => { + assert.deepEqual(data, { + id: 10, + message: 'Set from hook' + }); + }); + }); + }); + + describe('function(hook, next)', () => { + it('gets mixed into a service and modifies data', () => { + const dummyService = { + create (data, params) { + assert.deepEqual(data, { + some: 'thing', + modified: 'data' + }, 'Data modified'); + + assert.deepEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + before: { + create (hook, next) { + assert.equal(hook.type, 'before'); + + hook.data.modified = 'data'; + + Object.assign(hook.params, { + modified: 'params' + }); + + next(null, hook); + } + } + }); + + return service.create({ some: 'thing' }).then(data => { + assert.deepEqual(data, { + some: 'thing', + modified: 'data' + }, 'Data got modified'); + }); + }); + + it('contains the app object at hook.app', () => { + const someServiceConfig = { + create (data, params, callback) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/some-service', someServiceConfig); + const someService = app.service('some-service'); + + someService.hooks({ + before: { + create (hook, next) { + hook.data.appPresent = typeof hook.app !== 'undefined'; + assert.equal(hook.data.appPresent, true); + next(null, hook); + } + } + }); + + return someService.create({ some: 'thing' }).then(data => { + assert.deepEqual(data, { + some: 'thing', + appPresent: true + }, 'App object was present'); + }); + }); + + it('passes errors', () => { + const dummyService = { + update () { + assert.ok(false, 'Never should be called'); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + before: { + update (hook, next) { + next(new Error('You are not allowed to update')); + } + } + }); + + return service.update(1, {}).catch(error => { + assert.ok(error, 'Got an error'); + assert.equal(error.message, 'You are not allowed to update', 'Got error message'); + }); + }); + + it('calling back with no arguments uses the old ones', () => { + const dummyService = { + remove (id, params) { + assert.equal(id, 1, 'Got id'); + assert.deepEqual(params, { my: 'param' }); + + return Promise.resolve({ id }); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + before: { + remove (hook, next) { + next(); + } + } + }); + + return service.remove(1, { my: 'param' }); + }); + + it('adds .hooks() and chains multiple hooks for the same method', () => { + const dummyService = { + create (data, params) { + assert.deepEqual(data, { + some: 'thing', + modified: 'second data' + }, 'Data modified'); + + assert.deepEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + before: { + create (hook, next) { + hook.params.modified = 'params'; + + next(); + } + } + }); + + service.hooks({ + before: { + create (hook, next) { + hook.data.modified = 'second data'; + + next(); + } + } + }); + + return service.create({ some: 'thing' }); + }); + + it('chains multiple before hooks using array syntax', () => { + const dummyService = { + create (data, params) { + assert.deepEqual(data, { + some: 'thing', + modified: 'second data' + }, 'Data modified'); + + assert.deepEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + before: { + create: [ + function (hook, next) { + hook.params.modified = 'params'; + + next(); + }, + function (hook, next) { + hook.data.modified = 'second data'; + + next(); + } + ] + } + }); + + return service.create({ some: 'thing' }); + }); + + it('.before hooks run in the correct order (#13)', () => { + const app = feathers().use('/dummy', { + get (id, params, callback) { + assert.deepEqual(params.items, ['first', 'second', 'third']); + + return Promise.resolve({ + id: id, + items: [] + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook, next) { + hook.params.items = ['first']; + next(); + } + } + }); + + service.hooks({ + before: { + get: [ + function (hook, next) { + hook.params.items.push('second'); + next(); + }, + function (hook, next) { + hook.params.items.push('third'); + next(); + } + ] + } + }); + + return service.get(10); + }); + + it('before all hooks (#11)', () => { + const app = feathers().use('/dummy', { + get (id, params) { + assert.ok(params.beforeAllObject); + assert.ok(params.beforeAllMethodArray); + + return Promise.resolve({ + id: id, + items: [] + }); + }, + + find (params) { + assert.ok(params.beforeAllObject); + assert.ok(params.beforeAllMethodArray); + + return Promise.resolve([]); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + all (hook, next) { + hook.params.beforeAllObject = true; + next(); + } + } + }); + + service.hooks({ + before: [ + function (hook, next) { + hook.params.beforeAllMethodArray = true; + next(); + } + ] + }); + + return service.find(); + }); + + it('before hooks have service as context and keep it in service method (#17)', () => { + const app = feathers().use('/dummy', { + number: 42, + get (id, params) { + return Promise.resolve({ + id: id, + number: this.number, + test: params.test + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook, next) { + hook.params.test = this.number + 2; + next(); + } + } + }); + + return service.get(10).then(data => { + assert.deepEqual(data, { + id: 10, + number: 42, + test: 44 + }); + }); + }); + + it('calling next() multiple times does not do anything', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get: [ + function (hook, next) { + next(); + }, + + function (hook, next) { + next(); + next(); + } + ] + } + }); + + return service.get(10).then(data => { + assert.deepEqual(data, { id: 10 }); + }); + }); + }); +}); diff --git a/test/hooks/error.test.js b/test/hooks/error.test.js new file mode 100644 index 0000000000..3b2535503a --- /dev/null +++ b/test/hooks/error.test.js @@ -0,0 +1,226 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('`error` hooks', () => { + describe('on direct service method errors', () => { + const errorMessage = 'Something else went wrong'; + const app = feathers().use('/dummy', { + get () { + return Promise.reject(new Error('Something went wrong')); + } + }); + const service = app.service('dummy'); + + afterEach(() => service.__hooks.error.get.pop()); + + it('basic error hook', () => { + service.hooks({ + error: { + get (hook) { + assert.equal(hook.type, 'error'); + assert.equal(hook.id, 'test'); + assert.equal(hook.method, 'get'); + assert.equal(hook.app, app); + assert.equal(hook.error.message, 'Something went wrong'); + } + } + }); + + return service.get('test').then(() => { + throw new Error('Should never get here'); + }).catch(() => true); + }); + + it('can change the error', () => { + service.hooks({ + error: { + get (hook) { + hook.error = new Error(errorMessage); + } + } + }); + + return service.get('test').catch(error => { + assert.equal(error.message, errorMessage); + }); + }); + + it('throwing an error', () => { + service.hooks({ + error: { + get () { + throw new Error(errorMessage); + } + } + }); + + return service.get('test').catch(error => { + assert.equal(error.message, errorMessage); + }); + }); + + it('rejecting a promise', () => { + service.hooks({ + error: { + get () { + return Promise.reject(new Error(errorMessage)); + } + } + }); + + return service.get('test').catch(error => { + assert.equal(error.message, errorMessage); + }); + }); + + it('calling `next` with error', () => { + service.hooks({ + error: { + get (hook, next) { + next(new Error(errorMessage)); + } + } + }); + + return service.get('test').catch(error => { + assert.equal(error.message, errorMessage); + }); + }); + + it('can chain multiple hooks', () => { + service.hooks({ + error: { + get: [ + function (hook) { + hook.error = new Error(errorMessage); + hook.error.first = true; + }, + + function (hook) { + hook.error.second = true; + + return Promise.resolve(hook); + }, + + function (hook, next) { + hook.error.third = true; + + next(); + } + ] + } + }); + + return service.get('test').catch(error => { + assert.equal(error.message, errorMessage); + assert.ok(error.first); + assert.ok(error.second); + assert.ok(error.third); + }); + }); + + it('setting `hook.result` will return result', () => { + const data = { + message: 'It worked' + }; + + service.hooks({ + error: { + get (hook) { + hook.result = data; + } + } + }); + + return service.get(10) + .then(result => assert.deepEqual(result, data)); + }); + }); + + describe('error in hooks', () => { + const errorMessage = 'before hook broke'; + + let app, service; + + beforeEach(() => { + app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ + id, text: `You have to do ${id}` + }); + } + }); + + service = app.service('dummy'); + }); + + it('in before hook', () => { + service.hooks({ + before () { + throw new Error(errorMessage); + } + }).hooks({ + error (hook) { + assert.equal(hook.error.hook.type, 'before', + 'Original hook still set' + ); + assert.equal(hook.id, 'dishes'); + assert.equal(hook.error.message, errorMessage); + } + }); + + return service.get('dishes') + .then(() => { + throw new Error('Should never get here'); + }) + .catch(error => assert.equal(error.message, errorMessage)); + }); + + it('in after hook', () => { + service.hooks({ + after () { + throw new Error(errorMessage); + }, + + error (hook) { + assert.equal(hook.error.hook.type, 'after', + 'Original hook still set' + ); + assert.equal(hook.id, 'dishes'); + assert.deepEqual(hook.original.result, { + id: 'dishes', + text: 'You have to do dishes' + }); + assert.equal(hook.error.message, errorMessage); + } + }); + + return service.get('dishes') + .then(() => { + throw new Error('Should never get here'); + }) + .catch(error => assert.equal(error.message, errorMessage)); + }); + + it('uses the current hook object if thrown in a hook and sets hook.original', () => { + service.hooks({ + after (hook) { + hook.modified = true; + + throw new Error(errorMessage); + }, + + error (hook) { + assert.ok(hook.modified); + assert.equal(hook.original.type, 'after'); + } + }); + + return service.get('laundry') + .then(() => { + throw new Error('Should never get here'); + }) + .catch(error => assert.equal(error.message, errorMessage)); + }); + }); +}); diff --git a/test/hooks/finally.test.js b/test/hooks/finally.test.js new file mode 100644 index 0000000000..e18caac1f1 --- /dev/null +++ b/test/hooks/finally.test.js @@ -0,0 +1,76 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('`finally` hooks', () => { + it('runs after `after` hooks, app level last', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + app.hooks({ + finally (hook) { + hook.result.chain.push('app finally'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + finally (hook) { + hook.result.chain.push('service finally'); + }, + after (hook) { + hook.result.chain = [ 'service after' ]; + } + }); + + return service.get(42).then(data => { + assert.deepEqual(data, { + id: 42, + chain: [ 'service after', 'service finally', 'app finally' ] + }); + }); + }); + + it('runs after `error` hooks, app level last', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.reject(new Error(`${id} is not the answer`)); + } + }); + + app.hooks({ + finally (hook) { + hook.error.chain.push('app finally'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + finally (hook) { + hook.error.chain.push('service finally'); + } + }); + + service.hooks({ + error (hook) { + hook.error.chain = [ 'service error' ]; + } + }); + + return service.get(42).then( + () => assert(false, 'Should never get here'), + error => { + assert.deepEqual(error.chain, [ + 'service error', + 'service finally', + 'app finally' + ]); + assert.deepEqual(error.message, '42 is not the answer'); + } + ); + }); +}); diff --git a/test/hooks/hooks.test.js b/test/hooks/hooks.test.js new file mode 100644 index 0000000000..c1bfbfbbd3 --- /dev/null +++ b/test/hooks/hooks.test.js @@ -0,0 +1,185 @@ +const assert = require('assert'); +const feathers = require('../../lib'); + +describe('hooks basics', () => { + it('validates arguments', () => { + const app = feathers().use('/dummy', { + get (id, params) { + return Promise.resolve({ id, user: params.user }); + } + }); + + return app.service('dummy').get(1, {}, function () {}).catch(e => { + assert.equal(e.message, 'Callbacks are no longer supported. Use Promises or async/await instead.'); + + return app.service('dummy').get(); + }).catch(e => { + assert.equal(e.message, `An id must be provided to the 'get' method`); + }); + }); + + it('works with services that return a promise (feathers-hooks#28)', () => { + const app = feathers().use('/dummy', { + get (id, params) { + return Promise.resolve({ id, user: params.user }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before: { + get (hook) { + hook.params.user = 'David'; + } + }, + after: { + get (hook) { + hook.result.after = true; + } + } + }); + + return service.get(10).then(data => { + assert.deepEqual(data, { id: 10, user: 'David', after: true }); + }); + }); + + it('has hook.app, hook.service and hook.path', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before (hook) { + assert.equal(this, service); + assert.equal(hook.service, service); + assert.equal(hook.app, app); + assert.equal(hook.path, 'dummy'); + } + }); + + return service.get('test'); + }); + + it('does not error when result is null', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + after: { + get: [ + function (hook) { + hook.result = null; + return hook; + } + ] + } + }); + + return service.get(1) + .then(result => assert.equal(result, null)); + }); + + it('invalid type in .hooks throws error', () => { + const app = feathers().use('/dummy', { + get (id, params, callback) { + callback(null, { id, params }); + } + }); + + try { + app.service('dummy').hooks({ + invalid: {} + }); + assert.ok(false); + } catch (e) { + assert.equal(e.message, `'invalid' is not a valid hook type`); + } + }); + + it('invalid hook method throws error', () => { + const app = feathers().use('/dummy', { + get (id, params, callback) { + callback(null, { id, params }); + } + }); + + try { + app.service('dummy').hooks({ + before: { + invalid () {} + } + }); + assert.ok(false); + } catch (e) { + assert.equal(e.message, `'invalid' is not a valid hook method`); + } + }); + + it('registering an already hooked service works (#154)', () => { + const app = feathers().use('/dummy', { + get (id, params) { + return Promise.resolve({ id, params }); + } + }); + + app.use('/dummy2', app.service('dummy')); + }); + + it('not returning a promise errors', () => { + const app = feathers().use('/dummy', { + get () { + return {}; + } + }); + + return app.service('dummy').get(1).catch(e => { + assert.equal(e.message, `Service method 'get' for 'dummy' service must return a promise`); + }); + }); + + describe('returns the hook object when passing true as last parameter', () => { + it('on normal method call', () => { + const app = feathers().use('/dummy', { + get (id, params) { + return Promise.resolve({ id, params }); + } + }); + + return app.service('dummy').get(10, {}, true).then(context => { + assert.equal(context.service, app.service('dummy')); + assert.equal(context.type, 'after'); + assert.equal(context.path, 'dummy'); + assert.deepEqual(context.result, { + id: 10, + params: {} + }); + }); + }); + + it('on error', () => { + const app = feathers().use('/dummy', { + get () { + return Promise.reject(new Error('Something went wrong')); + } + }); + + return app.service('dummy').get(10, {}, true).catch(context => { + assert.equal(context.service, app.service('dummy')); + assert.equal(context.type, 'error'); + assert.equal(context.path, 'dummy'); + assert.equal(context.error.message, 'Something went wrong'); + }); + }); + }); +}); diff --git a/test/mixins/event.test.js b/test/mixins/event.test.js deleted file mode 100644 index e89130ea4a..0000000000 --- a/test/mixins/event.test.js +++ /dev/null @@ -1,251 +0,0 @@ -import assert from 'assert'; -import Proto from 'uberproto'; -import { EventEmitter } from 'events'; -import mixinEvent from '../../src/mixins/event'; - -const create = Proto.create; - -describe('Event mixin', () => { - it('initializes', () => { - const FixtureService = Proto.extend({ - setup (arg) { - return `Original setup: ${arg}`; - } - }); - - mixinEvent(FixtureService); - - assert.equal(typeof FixtureService.setup, 'function'); - assert.equal(typeof FixtureService.on, 'function'); - assert.equal(typeof FixtureService.emit, 'function'); - - const instance = create.call(FixtureService); - assert.equal('Original setup: Test', instance.setup('Test')); - assert.ok(instance._rubberDuck instanceof EventEmitter); - - const existingMethodsService = { - setup (arg) { - return `Original setup from object: ${arg}`; - } - }; - - Proto.mixin(EventEmitter.prototype, existingMethodsService); - - assert.equal('Original setup from object: Test', existingMethodsService.setup('Test')); - assert.equal(typeof existingMethodsService.on, 'function'); - }); - - it('serviceError', function (done) { - var FixtureService = Proto.extend({ - create (data, params, cb) { - cb(new Error('Something went wrong')); - } - }); - - const instance = create.call(FixtureService); - - mixinEvent(instance); - - instance.on('serviceError', function (error) { - assert.ok(error instanceof Error); - assert.equal(error.message, 'Something went wrong'); - done(); - }); - - instance.create({ name: 'Tester' }, {}, - error => assert.ok(error instanceof Error)); - }); - - it('created', done => { - const FixtureService = Proto.extend({ - create: function (data, params, callback) { - callback(null, { - id: 10, - name: data.name - }); - } - }); - - const instance = create.call(FixtureService); - - mixinEvent(instance); - - instance.on('created', function (data, args) { - assert.equal(data.id, 10); - assert.equal(data.name, 'Tester'); - assert.equal(args.data.name, 'Tester'); - assert.equal(args.params.custom, 'value'); - done(); - }); - - instance.create({ - name: 'Tester' - }, { - custom: 'value' - }, (error, data) => { - if (error) { - done(error); - } - assert.equal(data.id, 10); - }); - }); - - it('updated', done => { - const FixtureService = Proto.extend({ - update (id, data, params, cb) { - setTimeout(function () { - cb(null, { - id: id, - name: data.name - }); - }, 20); - } - }); - - const instance = create.call(FixtureService); - - mixinEvent(instance); - - instance.on('updated', function (data, args) { - assert.equal(data.id, 12); - assert.equal(data.name, 'Updated tester'); - assert.equal(args.id, 12); - assert.equal(args.data.name, 'Updated tester'); - assert.equal(args.params.custom, 'value'); - done(); - }); - - instance.update(12, { - name: 'Updated tester' - }, { - custom: 'value' - }, function (error, data) { - if (error) { - done(error); - } - assert.equal(data.id, 12); - }); - }); - - it('removed', done => { - const FixtureService = Proto.extend({ - remove (id, params, cb) { - setTimeout(function () { - cb(null, { - id: id - }); - }, 20); - } - }); - - const instance = create.call(FixtureService); - - mixinEvent(instance); - - instance.on('removed', function (data, args) { - assert.equal(data.id, 27); - assert.equal(args.id, 27); - assert.equal(args.params.custom, 'value'); - done(); - }); - - instance.remove(27, { - custom: 'value' - }, function (error, data) { - if (error) { - done(error); - } - assert.equal(data.id, 27); - }); - }); - - it('array event data emits multiple event', done => { - const fixture = [ - { id: 0 }, - { id: 1 }, - { id: 2 } - ]; - const FixtureService = Proto.extend({ - create (data, params, cb) { - setTimeout(function () { - cb(null, fixture); - }, 20); - } - }); - - const instance = create.call(FixtureService); - let counter = 0; - - mixinEvent(instance); - - instance.on('created', function (data) { - assert.equal(data.id, counter); - counter++; - if (counter === fixture.length) { - done(); - } - }); - - instance.create({}, {}, function () {}); - }); - - it('does not punch when service has an events list (#118)', done => { - const FixtureService = Proto.extend({ - events: [ 'created' ], - create (data, params, cb) { - setTimeout(function () { - cb(null, { - id: 10, - name: data.name - }); - }, 20); - } - }); - - FixtureService.mixin(EventEmitter.prototype); - - const instance = create.call(FixtureService); - - mixinEvent(instance); - - instance.on('created', function (data) { - assert.deepEqual(data, { custom: 'event' }); - done(); - }); - - instance.create({ - name: 'Tester' - }, {}, function (error, data) { - if (error) { - done(error); - } - assert.equal(data.id, 10); - instance.emit('created', { custom: 'event' }); - }); - }); - - it('sets hook.app', done => { - const FixtureService = Proto.extend({ - update (id, data, params, cb) { - setTimeout(function () { - cb(null, { - id: id, - name: data.name - }); - }, 20); - } - }); - - const instance = create.call(FixtureService); - const dummyApp = { isApp: true }; - - mixinEvent.call(dummyApp, instance); - - instance.on('updated', function (data, hook) { - assert.deepEqual(hook.app, dummyApp); - done(); - }); - - instance.update(12, { name: 'Updated tester' }, {}, function () {}); - }); -}); diff --git a/test/mixins/normalizer.test.js b/test/mixins/normalizer.test.js deleted file mode 100644 index 8b6e1a69cf..0000000000 --- a/test/mixins/normalizer.test.js +++ /dev/null @@ -1,57 +0,0 @@ -import assert from 'assert'; -import Proto from 'uberproto'; -import normalizer from '../../src/mixins/normalizer'; -import mixins from '../../src/mixins'; - -describe('Argument normalizer mixin', () => { - it('normalizer mixin is always the last to run', () => { - const arr = mixins(); - const dummy = function () { }; - - assert.equal(arr.length, 3); - - arr.push(dummy); - - assert.equal(arr[arr.length - 1], normalizer, 'Last mixin is still the normalizer'); - assert.equal(arr[arr.length - 2], dummy, 'Dummy got added before last'); - }); - - // The normalization is already tests in all variations in `getArguments` - // so we just so we only test two random samples - - it('normalizes .find without a callback', done => { - const context = { methods: ['find'] }; - const FixtureService = Proto.extend({ - find (params, callback) { - assert.ok(typeof callback === 'function'); - assert.equal(params.test, 'Here'); - done(); - } - }); - - normalizer.call(context, FixtureService); - - const instance = Proto.create.call(FixtureService); - - instance.find({ test: 'Here' }); - }); - - it('normalizes .update without params and callback', done => { - const context = { methods: ['update'] }; - const FixtureService = Proto.extend({ - update (id, data, params, callback) { - assert.equal(id, 1); - assert.ok(typeof callback === 'function'); - assert.deepEqual(data, { test: 'Here' }); - assert.deepEqual(params, {}); - done(); - } - }); - - normalizer.call(context, FixtureService); - - const instance = Proto.create.call(FixtureService); - - instance.update(1, { test: 'Here' }); - }); -}); diff --git a/test/mixins/promise.test.js b/test/mixins/promise.test.js deleted file mode 100644 index 2456092261..0000000000 --- a/test/mixins/promise.test.js +++ /dev/null @@ -1,77 +0,0 @@ -import assert from 'assert'; -import Proto from 'uberproto'; -import mixin from '../../src/mixins/promise'; - -const create = Proto.create; - -describe('Promises/A+ mixin', () => { - it('Calls a callback when a promise is returned from the original service', done => { - // A dummy context (this will normally be the application) - const context = { methods: ['get'] }; - const FixtureService = Proto.extend({ - get: function (id) { - return Promise.resolve({ - id: id, - description: `You have to do ${id}` - }); - } - }); - - mixin.call(context, FixtureService); - - const instance = create.call(FixtureService); - instance.get('dishes', {}, function (error, data) { - if (error) { - done(error); - } - assert.deepEqual(data, { - id: 'dishes', - description: 'You have to do dishes' - }); - done(); - }); - }); - - it('calls back with an error for a failing deferred', done => { - // A dummy context (this will normally be the application) - var context = { - methods: ['get'] - }; - var FixtureService = Proto.extend({ - get: function () { - return Promise.reject(new Error('Something went wrong')); - } - }); - - mixin.call(context, FixtureService); - - var instance = create.call(FixtureService); - instance.get('dishes', {}, function (error) { - assert.ok(error); - assert.equal(error.message, 'Something went wrong'); - done(); - }); - }); - - it('does not try to call the callback if it does not exist', function (done) { - // A dummy context (this will normally be the application) - const context = { methods: ['create'] }; - const FixtureService = Proto.extend({ - create (data) { - return Promise.resolve(data); - } - }); - const original = { - id: 'laundry', - description: 'You have to do laundry' - }; - - mixin.call(context, FixtureService); - - const instance = create.call(FixtureService); - instance.create(original, {}).then(data => { - assert.deepEqual(data, original); - done(); - }); - }); -}); diff --git a/test/resources/certificate.pem b/test/resources/certificate.pem deleted file mode 100644 index 6735645071..0000000000 --- a/test/resources/certificate.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICmzCCAgQCCQDugFqITnU/sDANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC -Q0ExEDAOBgNVBAgTB0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoT -CEZlYXRoZXJzMREwDwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNK -UzEjMCEGCSqGSIb3DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wHhcNMTQwMTA0 -MDIwNTUyWhcNMTQwMjAzMDIwNTUyWjCBkTELMAkGA1UEBhMCQ0ExEDAOBgNVBAgT -B0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoTCEZlYXRoZXJzMREw -DwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNKUzEjMCEGCSqGSIb3 -DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A -MIGJAoGBALixfLwrvDDYAaaU62oycz8zwUpxCguyyXyhVDN/KMmP/I+HfkbcIrqj -tW0jbpRWiLhn5cw4K/cUTkfMj4AwaN5t2zq0FVFJdIddLxzuamyJLJFZfs5sPYWt -X6morPcu9RM7jwb3R1V852XjVWUj8neUAu7eUzKoSQ575kHsnKrdAgMBAAEwDQYJ -KoZIhvcNAQEFBQADgYEATVlxNPkSgkqBF4foUYNGnkvaiwhd88Mh/Ya3T3EnknF9 -Gz6KrlwWDDI8MkPmqabT2Ijg3LSec7WV+C8SETVFbWLOGV6N1ZVfodFzJ7EKMz5e -VvEIKnHfHpYOEa21E5u02+OfKahtW37eTEVmvcV67vYmW4HNa5QSZ5qfrrqcUhc= ------END CERTIFICATE----- diff --git a/test/resources/certrequest.csr b/test/resources/certrequest.csr deleted file mode 100644 index 41f83b2757..0000000000 --- a/test/resources/certrequest.csr +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIB0jCCATsCAQAwgZExCzAJBgNVBAYTAkNBMRAwDgYDVQQIEwdBbGJlcnRhMRAw -DgYDVQQHEwdDYWxnYXJ5MREwDwYDVQQKEwhGZWF0aGVyczERMA8GA1UECxMIRmVh -dGhlcnMxEzARBgNVBAMTCkZlYXRoZXJzSlMxIzAhBgkqhkiG9w0BCQEWFGhlbGxv -QGZlYXRoZXJzanMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4sXy8 -K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G3CK6o7VtI26UVoi4Z+XM -OCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7ObD2FrV+pqKz3LvUTO48G -90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQABoAAwDQYJKoZIhvcNAQEF -BQADgYEAFN1xm2Jc5EwDsiJwjUQkVCYLfAPz8FxLx8XCY7JugPCZWxeJ3w9C3Ymz -hET//7uxNg6q7EO9CI33vP5eOdI8oC8XQffh4GzCoSrmGrKpHSqVh3zN/rCoB4BY -f4nJofTka5iENjMdA0R8//Wp7F1u7xhriuxaRiZoFEPaCIsrvK4= ------END CERTIFICATE REQUEST----- diff --git a/test/resources/privatekey.pem b/test/resources/privatekey.pem deleted file mode 100644 index 3a39a23926..0000000000 --- a/test/resources/privatekey.pem +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQC4sXy8K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G -3CK6o7VtI26UVoi4Z+XMOCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7O -bD2FrV+pqKz3LvUTO48G90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQAB -AoGAYCTkzf/mY3bOxSzYr9u7ardCc8IMfLKBeMNy1avoS6UM0Jqz/acy3P3DwCCl -u8qgOX68fWbwXBrR9UZjnVOWAvAgACS9bSTR4UxXuHve9YHf1s1Idm1Ck8CopiuY -0PTiuF7OJp6U7fc1RjO5F5tvSMuYbh+68Vpx9SQRfDHYqnECQQD1KnhSRDjLCfoB -lLfTew99W51OTx2NPRKRXwZH/YwlgRl/cAgJhdemah/AAavB6BUdqEXdiIviEHuT -UsfAXhf7AkEAwNrmEI3B4gtMRKJAsyWAKGFxDHuC9wGkhSxCVihQuxXtqEMX7Qnx -ucU9bRRtUgVPcOmFEtpPsI4e0wkTMg+ZBwJAPL+ERuYuqGjVcPTXw+g3Q1mjFddW -vDuI0UqZdNcnlddyaPhqlWl7sPmU2m/PjmGicdHTVfxSpPZumGenpUvrZwJAdodS -9QObEOmus1Qhfbljne3dhDV5FYTd77d3Aer/Syy8BzlNQDNnbKysBxmR4uI+o//x -+NdSOQnwKfYe5RqvCwJBAMfq911uzlD8Kd9s0n+MJe8b5/duYOtgPZvaIFWOWyNm -0aJE/VovVhk2JGvIU9kxdgt9O4N0x2XukS2hq7I1Xts= ------END RSA PRIVATE KEY-----