diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5bf435a..429c19e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,21 +7,23 @@ mailing list or through issues here on GitHub. - Mailing list: - and of course, [the issues list](https://github.com/mozilla/fxa-oauth-server/issues) -## Bug Reports ## +## Bug Reports You can file issues here on GitHub. Please try to include as much information as you can and under what conditions you saw the issue. -## Sending Pull Requests ## +## Sending Pull Requests Patches should be submitted as pull requests (PR). Before submitting a PR: + - Your code must run and pass all the automated tests before you submit your PR for review. "Work in progress" pull requests are allowed to be submitted, but should be clearly labeled as such and should not be merged until all tests pass and the code has been reviewed. - Run `npm test` to make sure all tests still pass and there are no lint errors. - Your patch should include new tests that cover your changes. It is your and your reviewer's responsibility to ensure your patch includes adequate tests. When submitting a PR: + - You agree to license your code under the project's open source license ([MPL 2.0](/LICENSE)). - Base your branch off the current `master` (see below for an example workflow). - Add both your code and new tests if relevant. @@ -30,11 +32,11 @@ When submitting a PR: See the main [README.md](/README.md) for information on prerequisites, installing, running and testing. -## Code Review ## +## Code Review This project is production Mozilla code and subject to our [engineering practices and quality standards](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Committing_Rules_and_Responsibilities). Every patch must be peer reviewed. This project is part of the [Firefox Accounts module](https://wiki.mozilla.org/Modules/Other#Firefox_Accounts), and your patch must be reviewed by one of the listed module owners or peers. -## Example Workflow ## +## Example Workflow This is an example workflow to make it easier to submit Pull Requests. Imagine your username is `user1`: @@ -42,31 +44,31 @@ This is an example workflow to make it easier to submit Pull Requests. Imagine y 2. The clone the upstream (as origin) and add your own repo as a remote: - ```sh - $ git clone https://github.com/mozilla/fxa-oauth-console.git - $ cd fxa-oauth-console - $ git remote add user1 git@github.com:user1/fxa-oauth-console.git -``` + ```sh + $ git clone https://github.com/mozilla/fxa-oauth-console.git + $ cd fxa-oauth-console + $ git remote add user1 git@github.com:user1/fxa-oauth-console.git + ``` 3. Create a branch for your fix/feature and make sure it's your currently checked-out branch: - ```sh - $ git checkout -b add-new-feature -``` + ```sh + $ git checkout -b add-new-feature + ``` 4. Add/fix code, add tests then commit and push this branch to your repo: - ```sh - $ git add - $ git commit - $ git push user1 add-new-feature -``` + ```sh + $ git add + $ git commit + $ git push user1 add-new-feature + ``` 5. From the GitHub interface for your repo, click the `Review Changes and Pull Request` which appears next to your new branch. 6. Click `Send pull request`. -### Keeping up to Date ### +### Keeping up to Date The main reason for creating a new branch for each feature or fix is so that you can track master correctly. If you need to fetch the latest code for a new fix, try the following: @@ -76,4 +78,4 @@ $ git checkout master $ git pull ``` -Now you're ready to branch again for your new feature (from step 3 above). \ No newline at end of file +Now you're ready to branch again for your new feature (from step 3 above). diff --git a/Gruntfile.js b/Gruntfile.js index fa0e634..9b7e054 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,14 +3,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* global require, module */ -module.exports = function (grunt) { +module.exports = function(grunt) { require('load-grunt-tasks')(grunt); grunt.initConfig({ pkg: grunt.file.readJSON('./package.json'), - mainJsFiles: '{,lib/**/,scripts/**/,test/**/,tasks/**/,bin/**/,app/**/}*.js' + mainJsFiles: + '{,lib/**/,scripts/**/,test/**/,tasks/**/,bin/**/,app/**/}*.js', }); grunt.loadTasks('tasks'); - grunt.registerTask('lint', [ 'copyright', 'eslint' ]); + grunt.registerTask('lint', ['copyright', 'eslint']); }; diff --git a/README.md b/README.md index 8303c15..ac97166 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,44 @@ -# This repository has been migrated to https://github.com/mozilla/fxa/tree/master/packages/fxa-oauth-console +# Firefox Accounts OAuth Credential Management Dashboard -Please file issues and open pull requests against https://github.com/mozilla/fxa +[![Build Status](https://travis-ci.org/mozilla/fxa-oauth-console.svg?branch=master)](https://travis-ci.org/mozilla/fxa-oauth-console) +![](https://mdn.mozillademos.org/files/9783/dashboard-example.jpg) + +## Development + +``` +git clone https://github.com/mozilla/fxa-oauth-console +cd fxa-oauth-console +npm install +``` + +Run development server locally: + +``` +npm start +``` + +## Docker Dev + +You can run the docker container by: + +- `docker-compose build` +- `docker-compose up` + +#### Changing environment configuration. + +You can customize the servers that the app communicates with by passing them in the docker-compose file. + +```yml +environment: + PROFILE_URI: https://127.0.0.1:9010/v1 + OAUTH_INTERNAL_URI: https://127.0.0.1:9010/v1 + OAUTH_URI: https://127.0.0.1:1111/profile/v1 +``` + +**You will need a local Firefox Accounts stack to login to the console.** Use [fxa-local-dev](https://github.com/vladikoff/fxa-local-dev) to get started. + +Run tests: `npm test` + +## License + +[MPL v2.0](LICENSE) diff --git a/app/.eslintrc b/app/.eslintrc index f50913b..cf04d6c 100644 --- a/app/.eslintrc +++ b/app/.eslintrc @@ -1,10 +1,7 @@ { - "extends": "fxa/client", - "ecmaFeatures": { - "modules": true - }, - "rules": { - "semi": 0, - "strict": [2, "never"] + "extends": "prettier", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" } } \ No newline at end of file diff --git a/app/adapters/application.js b/app/adapters/application.js index 6a21152..7fb15c5 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -6,8 +6,8 @@ import Ember from 'ember'; import DS from 'ember-data'; import config from '../config/environment'; -function fixUpRedirectUri (uri) { - if (! uri) { +function fixUpRedirectUri(uri) { + if (!uri) { // add some defaults, oauth server requires these fields uri = 'http://'; } @@ -16,7 +16,7 @@ function fixUpRedirectUri (uri) { } export default DS.RESTAdapter.extend({ - _handleErrorResponse: function () { + _handleErrorResponse: function() { this.get('session').invalidate(); }, session: Ember.inject.service('session'), @@ -33,9 +33,9 @@ export default DS.RESTAdapter.extend({ * * Sets Authorization headers */ - headers: Ember.computed(function () { + headers: Ember.computed(function() { return { - 'Authorization': 'Bearer ' + this.get('session.data.authenticated.token') + Authorization: 'Bearer ' + this.get('session.data.authenticated.token'), }; }), @@ -56,9 +56,11 @@ export default DS.RESTAdapter.extend({ */ findRecord: function(store, type, id, record) { // post process the resuld of 'findRecord'. Need to add the Model type 'client' into the response - return this.ajax(this.buildURL(type.modelName, id, record), 'GET').then(function (resp) { - return { client: resp }; - }); + return this.ajax(this.buildURL(type.modelName, id, record), 'GET').then( + function(resp) { + return { client: resp }; + } + ); }, /** * Overrides default RESTAdapter 'createRecord' @@ -79,15 +81,16 @@ export default DS.RESTAdapter.extend({ data.redirect_uri = fixUpRedirectUri(data.redirect_uri); //eslint-disable-line camelcase // post process the result of 'find'. Need to add the Model type 'client' into the response - return this.ajax(this.buildURL(type.modelName, null, record), 'POST', { data: data }) - .then( - (resp) => { - return { client: resp }; - }, - () => { - this._handleErrorResponse() - } - ); + return this.ajax(this.buildURL(type.modelName, null, record), 'POST', { + data: data, + }).then( + resp => { + return { client: resp }; + }, + () => { + this._handleErrorResponse(); + } + ); }, /** * Overrides default RESTAdapter 'updateRecord' @@ -109,17 +112,18 @@ export default DS.RESTAdapter.extend({ data.redirect_uri = fixUpRedirectUri(data.redirect_uri); //eslint-disable-line camelcase // set POST instead of PUT - return this.ajax(this.buildURL(type.modelName, id, record), 'POST', { data: data }) - .then( - () => { - data.id = id; + return this.ajax(this.buildURL(type.modelName, id, record), 'POST', { + data: data, + }).then( + () => { + data.id = id; - return { client: data }; - }, - () => { - this._handleErrorResponse() - } - ); + return { client: data }; + }, + () => { + this._handleErrorResponse(); + } + ); }, /** /** @@ -155,5 +159,5 @@ export default DS.RESTAdapter.extend({ } return url; - } + }, }); diff --git a/app/app.js b/app/app.js index f7359f7..2491f6b 100644 --- a/app/app.js +++ b/app/app.js @@ -1,22 +1,22 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -import Ember from 'ember'; -import Resolver from 'ember-resolver'; -import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; - -let App; - -Ember.MODEL_FACTORY_INJECTIONS = true; - -App = Ember.Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); - -loadInitializers(App, config.modulePrefix); - -export default App; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import Ember from 'ember'; +import Resolver from 'ember-resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +let App; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver, +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js index 12cb328..f56086a 100644 --- a/app/authenticators/custom.js +++ b/app/authenticators/custom.js @@ -36,45 +36,47 @@ export default Base.extend({ * * @returns {Rx.Promise} */ - authenticate: function () { + authenticate: function() { var self = this; - return new Ember.RSVP.Promise(function (resolve, reject) { + return new Ember.RSVP.Promise(function(resolve, reject) { Ember.$.ajax({ url: self.tokenEndpoint + '/status', type: 'GET', - contentType: 'application/json' - }).then(function (response) { - try { - response = JSON.parse(response); - } catch (e) { - return reject(e); - } - - Ember.run(function () { - if (response && response.email && response.token) { - return resolve({ - email: response.email, - token: response.token - }); - } else { - - return reject('Response missing credential data.'); + contentType: 'application/json', + }).then( + function(response) { + try { + response = JSON.parse(response); + } catch (e) { + return reject(e); } - }); - }, function (xhr/*, status, error*/) { - var response = xhr.responseText; - try { - response = JSON.parse(xhr.responseText); - } catch (e) { - return reject(); + Ember.run(function() { + if (response && response.email && response.token) { + return resolve({ + email: response.email, + token: response.token, + }); + } else { + return reject('Response missing credential data.'); + } + }); + }, + function(xhr /*, status, error*/) { + var response = xhr.responseText; + + try { + response = JSON.parse(xhr.responseText); + } catch (e) { + return reject(); + } + + Ember.run(function() { + return reject(response.error); + }); } - - Ember.run(function () { - return reject(response.error); - }); - }); + ); }); }, @@ -83,17 +85,16 @@ export default Base.extend({ * * @returns {Rx.Promise} */ - invalidate: function () { + invalidate: function() { var self = this; return new Ember.RSVP.Promise(function(resolve) { Ember.$.ajax({ url: self.tokenEndpoint + '/logout', - type: 'GET' + type: 'GET', }).always(function() { return resolve(); }); }); - } + }, }); - diff --git a/app/controllers/application.js b/app/controllers/application.js index c8367be..6cb9b4c 100644 --- a/app/controllers/application.js +++ b/app/controllers/application.js @@ -9,6 +9,6 @@ export default Ember.Controller.extend({ actions: { invalidateSession() { this.get('session').invalidate(); - } - } + }, + }, }); diff --git a/app/controllers/client/register.js b/app/controllers/client/register.js index ecc39cc..c64a2cf 100644 --- a/app/controllers/client/register.js +++ b/app/controllers/client/register.js @@ -9,5 +9,5 @@ export default Ember.Controller.extend({ session: Ember.inject.service('session'), registrationSuccess: false, oauth_uri: config.servers.oauthUriParsed.href, //eslint-disable-line camelcase - profile_uri: config.servers.profileUriParsed.href //eslint-disable-line camelcase + profile_uri: config.servers.profileUriParsed.href, //eslint-disable-line camelcase }); diff --git a/app/controllers/clients.js b/app/controllers/clients.js index 93e0c31..5739bd8 100644 --- a/app/controllers/clients.js +++ b/app/controllers/clients.js @@ -7,5 +7,5 @@ import Ember from 'ember'; export default Ember.Controller.extend({ session: Ember.inject.service('session'), sortProperties: ['name'], - sortAscending: true + sortAscending: true, }); diff --git a/app/controllers/login.js b/app/controllers/login.js index 75f0294..49e26c9 100644 --- a/app/controllers/login.js +++ b/app/controllers/login.js @@ -7,5 +7,5 @@ import config from '../config/environment'; export default Ember.Controller.extend({ session: Ember.inject.service('session'), - server: config.servers.oauth.replace('https://', '').replace('http://', '') + server: config.servers.oauth.replace('https://', '').replace('http://', ''), }); diff --git a/app/index.html b/app/index.html index a95bf5f..317809d 100644 --- a/app/index.html +++ b/app/index.html @@ -1,25 +1,25 @@ - - - - - - Firefox Accounts OAuth Credential Management Dashboard - - - - {{content-for 'head'}} - - - - - {{content-for 'head-footer'}} - - - {{content-for 'body'}} - - - - - {{content-for 'body-footer'}} - - + + + + + + Firefox Accounts OAuth Credential Management Dashboard + + + + {{content-for 'head'}} + + + + + {{content-for 'head-footer'}} + + + {{content-for 'body'}} + + + + + {{content-for 'body-footer'}} + + diff --git a/app/models/client.js b/app/models/client.js index 25683e1..fd4fc8c 100644 --- a/app/models/client.js +++ b/app/models/client.js @@ -9,5 +9,5 @@ export default DS.Model.extend({ redirect_uri: DS.attr('string'), //eslint-disable-line camelcase secret: DS.attr('string'), can_grant: DS.attr('boolean'), //eslint-disable-line camelcase - trusted: DS.attr('boolean') + trusted: DS.attr('boolean'), }); diff --git a/app/router.js b/app/router.js index 350d78e..b03552d 100644 --- a/app/router.js +++ b/app/router.js @@ -6,19 +6,23 @@ import Ember from 'ember'; import config from './config/environment'; const Router = Ember.Router.extend({ - location: config.locationType + location: config.locationType, }); -Router.map(function () { +Router.map(function() { this.route('login'); - this.route('clients', {path: '/clients'}); - this.route('clients.token', {path: '/clients/token'}); - this.route('client.register', {path:'/client/register'}); - this.route('client', {path: '/client/:client_id', resetNamespace: true}, function () { - this.route('delete'); - this.route('update'); - }); + this.route('clients', { path: '/clients' }); + this.route('clients.token', { path: '/clients/token' }); + this.route('client.register', { path: '/client/register' }); + this.route( + 'client', + { path: '/client/:client_id', resetNamespace: true }, + function() { + this.route('delete'); + this.route('update'); + } + ); }); export default Router; diff --git a/app/routes/application.js b/app/routes/application.js index 558e4dc..d88f627 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -7,14 +7,14 @@ import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mi export default Ember.Route.extend(ApplicationRouteMixin, { session: Ember.inject.service('session'), - beforeModel: function () { - this.get('session').authenticate('authenticator:custom') + beforeModel: function() { + this.get('session').authenticate('authenticator:custom'); }, actions: { - authenticateSession: function () { + authenticateSession: function() { this.get('session').authenticate('authenticator:custom', {}); }, - sessionAuthenticationFailed: function (/*error*/) { + sessionAuthenticationFailed: function(/*error*/) { this.transitionTo('login'); }, sessionInvalidationSucceeded: function() { @@ -23,8 +23,8 @@ export default Ember.Route.extend(ApplicationRouteMixin, { sessionInvalidationFailed: function(/*error*/) { this.transitionTo('login'); }, - sessionAuthenticationSucceeded: function () { + sessionAuthenticationSucceeded: function() { this.transitionTo('index'); - } - } + }, + }, }); diff --git a/app/routes/client/delete.js b/app/routes/client/delete.js index 982f934..14ae3ab 100644 --- a/app/routes/client/delete.js +++ b/app/routes/client/delete.js @@ -7,14 +7,14 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { actions: { - remove: function (model) { + remove: function(model) { var self = this; - return this.store.find('client', model.id).then(function (client) { + return this.store.find('client', model.id).then(function(client) { client.destroyRecord().then(function() { self.transitionTo('clients'); }); }); - } - } + }, + }, }); diff --git a/app/routes/client/index.js b/app/routes/client/index.js index 8a9a6b2..8fd15c1 100644 --- a/app/routes/client/index.js +++ b/app/routes/client/index.js @@ -7,13 +7,13 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { actions: { - update: function (model) { + update: function(model) { this.transitionTo('client.update', model); }, - remove: function (id) { - return this.store.find('client', id).then(function (client) { + remove: function(id) { + return this.store.find('client', id).then(function(client) { client.destroyRecord(); }); - } - } + }, + }, }); diff --git a/app/routes/client/register.js b/app/routes/client/register.js index 82bb619..dc9a043 100644 --- a/app/routes/client/register.js +++ b/app/routes/client/register.js @@ -11,19 +11,20 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { create: function() { var model = this.controllerFor('client.register').get('model'); - return model.save().then( - () => + return model + .save() + .then(() => this.controllerFor('client.register').set('registrationSuccess', true) - ); + ); }, cancel: function() { this.transitionTo('clients'); return true; }, - registerDone: function () { + registerDone: function() { this.transitionTo('clients'); return true; - } + }, }, setupController: function(controller, model) { controller.set('model', model); @@ -40,5 +41,5 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { // if there is an error fetching the client list // then for now just invalidate the session this.get('session').invalidate(); - } + }, }); diff --git a/app/routes/client/update.js b/app/routes/client/update.js index af904b5..2cbb596 100644 --- a/app/routes/client/update.js +++ b/app/routes/client/update.js @@ -11,16 +11,16 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { var self = this; var model = this.controllerFor('client.update').get('model'); - return model.save().then(function () { + return model.save().then(function() { self.transitionTo('client.index', model.id); }); }, cancel: function() { return this.transitionTo('clients'); - } + }, }, deactivate: function() { var model = this.controllerFor('client.update').get('model'); model.rollbackAttributes(); - } + }, }); diff --git a/app/routes/clients.js b/app/routes/clients.js index 626fe82..bb78e38 100644 --- a/app/routes/clients.js +++ b/app/routes/clients.js @@ -9,32 +9,32 @@ import Client from '../models/client'; export default Ember.Route.extend(AuthenticatedRouteMixin, { session: Ember.inject.service('session'), actions: { - goToNewClient: function () { + goToNewClient: function() { this.transitionTo('client.register'); }, - goToClientDelete: function (model) { + goToClientDelete: function(model) { this.transitionTo('client.delete', model); }, - goToScopedToken: function () { + goToScopedToken: function() { this.transitionTo('clients.token'); }, - goToClient: function( id ) { + goToClient: function(id) { // unload all stored client data to make sure we fetch the client again in the client view this.store.unloadAll('client'); this.transitionTo('client', id); }, - update: function (model) { + update: function(model) { this.transitionTo('client.update', model); }, - create: function (model) { + create: function(model) { this.storage.create(model); this.transitionTo('clients'); }, - updated: function (model) { + updated: function(model) { this.storage.update(model); this.transitionTo('clients'); }, - cancel: function (model) { + cancel: function(model) { Ember.run(model, 'destroy'); this.storage.refresh(Client); this.transitionTo('clients'); @@ -43,10 +43,9 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { // if there is an error fetching the client list // then for now just invalidate the session this.get('session').invalidate(); - } + }, }, - model: function () { + model: function() { return this.store.findAll('client'); - } + }, }); - diff --git a/app/routes/clients/token.js b/app/routes/clients/token.js index 355cff1..591cbc1 100644 --- a/app/routes/clients/token.js +++ b/app/routes/clients/token.js @@ -8,7 +8,10 @@ import config from '../../config/environment'; export default Ember.Route.extend(AuthenticatedRouteMixin, { setupController: function(controller, model, queryParams) { - controller.set('access_token', queryParams.state.fullQueryParams.access_token); + controller.set( + 'access_token', + queryParams.state.fullQueryParams.access_token + ); controller.set('scopes', queryParams.state.fullQueryParams.scopes); }, actions: { @@ -19,10 +22,14 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { var tokenUrl = config.baseURL + 'oauth/generate-token'; var form = Ember.$('
', { action: tokenUrl, - method: 'POST' + method: 'POST', }); - form.append(''); + form.append( + '' + ); form.appendTo('body').submit(); - } - } + }, + }, }); diff --git a/app/routes/index.js b/app/routes/index.js index aec926a..7e09a6f 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -6,8 +6,8 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { - beforeModel: function () { - this.get('session').authenticate('authenticator:custom') + beforeModel: function() { + this.get('session').authenticate('authenticator:custom'); return this.transitionTo('clients'); - } + }, }); diff --git a/app/routes/login.js b/app/routes/login.js index d2300c1..f15c1d3 100644 --- a/app/routes/login.js +++ b/app/routes/login.js @@ -6,5 +6,5 @@ import Ember from 'ember'; import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; export default Ember.Route.extend(UnauthenticatedRouteMixin, { - session: Ember.inject.service('session') + session: Ember.inject.service('session'), }); diff --git a/app/serializers/application.js b/app/serializers/application.js index a23f074..048daae 100644 --- a/app/serializers/application.js +++ b/app/serializers/application.js @@ -9,5 +9,5 @@ export default DS.RESTSerializer.extend({ isNewSerializerAPI: true, serializeIntoHash: function(hash, type, record, options) { Ember.merge(hash, this.serialize(record, options)); - } + }, }); diff --git a/app/styles/_settings.scss b/app/styles/_settings.scss index cec460a..7cbf531 100644 --- a/app/styles/_settings.scss +++ b/app/styles/_settings.scss @@ -10,7 +10,7 @@ // $rem-base: 16px; // Allows the use of rem-calc() or lower-bound() in your settings -@import "bower_components/foundation/scss/foundation/functions"; +@import 'bower_components/foundation/scss/foundation/functions'; // $experimental: true; @@ -60,12 +60,12 @@ // $default-float: left; // We use these as default colors throughout -$primary-color: #0095DD; -$secondary-color: #0095DD; +$primary-color: #0095dd; +$secondary-color: #0095dd; // #8e2b28 - dark red -$alert-color: #D74345; -$success-color: #74BF43; -$warning-color: #FF9500; +$alert-color: #d74345; +$success-color: #74bf43; +$warning-color: #ff9500; // $info-color: #a0d3e8; // We use these to make sure border radius matches unless we want it different. @@ -303,7 +303,6 @@ $warning-color: #FF9500; // $block-grid-default-spacing: rem-calc(20); // $align-block-grid-to-grid: false; - // Enables media queries for block-grid classes. Set to false if writing semantic HTML. // $block-grid-media-queries: true; @@ -866,7 +865,6 @@ $warning-color: #FF9500; // $price-money-size: rem-calc(32); // $price-money-font-family: $body-font-family; - // We use these to control the description styles // $price-bg: #fff; // $price-desc-color: #777; @@ -970,8 +968,6 @@ $warning-color: #FF9500; // $side-nav-font-family: $body-font-family; // $side-nav-active-font-family: $side-nav-font-family; - - // We use these to control border styles // $side-nav-divider-size: 1px; // $side-nav-divider-style: solid; @@ -1033,7 +1029,6 @@ $side-nav-divider-color: scale-color($primary-color, $lightness: 80%); // $sub-nav-border-radius: 3px; // $sub-nav-font-color-hover: scale-color($sub-nav-font-color, $lightness: -25%); - // We use these to control the active item styles // $sub-nav-active-font-weight: $font-weight-normal; // $sub-nav-active-bg: $primary-color; @@ -1187,7 +1182,7 @@ $side-nav-divider-color: scale-color($primary-color, $lightness: 80%); // $include-html-top-bar-classes: $include-html-classes; // Background color for the top bar -$topbar-bg-color: #424F5A; +$topbar-bg-color: #424f5a; // $topbar-bg: $topbar-bg-color; // Height and margin @@ -1296,4 +1291,4 @@ $topbar-margin-bottom: 45px; // $range-slider-handle-radius: $global-radius; // $range-slider-handle-round: $global-rounded; // $range-slider-handle-bg-hover-color: scale-color($primary-color, $lightness: -12%); -// $range-slider-handle-cursor: pointer; \ No newline at end of file +// $range-slider-handle-cursor: pointer; diff --git a/app/styles/app.scss b/app/styles/app.scss index ad54a02..ba43c75 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -1,6 +1,6 @@ -@import "settings"; -@import "public/assets/fonts/fira/fira"; -@import "bower_components/foundation/scss/foundation"; +@import 'settings'; +@import 'public/assets/fonts/fira/fira'; +@import 'bower_components/foundation/scss/foundation'; // Or selectively include components // @import @@ -40,8 +40,20 @@ // "foundation/components/offcanvas", // "foundation/components/visibility"; -a, h1, h2, h3, h4, h5, h6, button, .button, th, p, legend, label { - font-family: "Fira Sans"; +a, +h1, +h2, +h3, +h4, +h5, +h6, +button, +.button, +th, +p, +legend, +label { + font-family: 'Fira Sans'; } .title-area { @@ -70,7 +82,6 @@ a, h1, h2, h3, h4, h5, h6, button, .button, th, p, legend, label { } } - .login-panel { text-align: center; img { diff --git a/bin/server.js b/bin/server.js index 487f573..4474856 100755 --- a/bin/server.js +++ b/bin/server.js @@ -11,13 +11,13 @@ const updateIndex = require('./updateIndexFromEnv'); * with config values passed in through environment variables. * This enables re-running the server with newer environment vars * without having to rebuild ember app. -*/ + */ updateIndex(config) .then(() => { const server = require('../lib/server'); const configProps = config.getProperties(); log.debug('Starting with config: %:2j', configProps); - const app = server.listen(configProps.server.port, function () { + const app = server.listen(configProps.server.port, function() { const port = app.address().port; log.info('FxA OAuth Developer Console started on port:', port); }); diff --git a/bin/updateIndexFromEnv.js b/bin/updateIndexFromEnv.js index 34fb889..a1e2ecb 100644 --- a/bin/updateIndexFromEnv.js +++ b/bin/updateIndexFromEnv.js @@ -23,7 +23,7 @@ function getConfigsFromEnv() { oauthUri: process.env.OAUTH_URI || undefined, oauthInternalUri: process.env.OAUTH_INTERNAL_URI || undefined, profileUri: process.env.PROFILE_URI || undefined, - baseURL: process.env.BASE_URL || undefined + baseURL: process.env.BASE_URL || undefined, }; } @@ -91,7 +91,7 @@ function updateIndex(serverConfig) { } const currentConfig = getConfigFromHtml(html); const envVars = getConfigsFromEnv(); - const newConfig = applyEnvVars(currentConfig, envVars, serverConfig); + const newConfig = applyEnvVars(currentConfig, envVars, serverConfig); const baseUrl = process.env.BASE_URL || null; @@ -101,7 +101,7 @@ function updateIndex(serverConfig) { }) .catch(err => { reject(err); - }) + }); }); }); } diff --git a/config/environment.js b/config/environment.js index 8c68abc..deebcb5 100644 --- a/config/environment.js +++ b/config/environment.js @@ -13,23 +13,26 @@ var url = require('url'); module.exports = function(environment) { var config = require('../lib/config'); var oauthUriParsed = url.parse(config.get('fxaOAuth').oauth_uri); - var oauthInternalUriParsed = url.parse(config.get('fxaOAuth').oauth_internal_uri); - var profileUriParsed = url.parse(config.get('fxaOAuth').profile_uri); + var oauthInternalUriParsed = url.parse( + config.get('fxaOAuth').oauth_internal_uri + ); + var profileUriParsed = url.parse(config.get('fxaOAuth').profile_uri); var baseURL = config.get('base_url'); var oauthUri = oauthUriParsed.protocol + '//' + oauthUriParsed.host; - var oauthInternalUri = oauthInternalUriParsed.protocol + '//' + oauthInternalUriParsed.host; + var oauthInternalUri = + oauthInternalUriParsed.protocol + '//' + oauthInternalUriParsed.host; var ENV = { modulePrefix: 'fxa-oauth-console', 'simple-auth': { - authorizer: 'authorizer:custom' + authorizer: 'authorizer:custom', }, servers: { oauth: oauthUri, oauthInternal: oauthInternalUri, oauthUriParsed: oauthUriParsed, oauthInternalUriParsed: oauthInternalUriParsed, - profileUriParsed: profileUriParsed + profileUriParsed: profileUriParsed, }, environment: environment, baseURL: baseURL, @@ -38,13 +41,13 @@ module.exports = function(environment) { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. 'with-controller': true - } + }, }, APP: { // Here you can pass flags/options to your application instance // when it is created - } + }, }; if (environment === 'development') { diff --git a/docker-compose.yml b/docker-compose.yml index f1a8ab6..ef73eeb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: "2.1" +version: '2.1' services: fxa-oauth-console: build: @@ -7,7 +7,7 @@ services: command: node bin/server.js image: mozilla/fxa-oauth-console ports: - - "10137:10137" + - '10137:10137' environment: PROFILE_URI: http://127.0.0.1:1111/profile/v1 OAUTH_URI: http://127.0.0.1:9010/v1 diff --git a/ember-cli-build.js b/ember-cli-build.js index 996b3a3..df23f5c 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -4,9 +4,9 @@ /* global require, module */ var EmberApp = require('ember-cli/lib/broccoli/ember-app'); -module.exports = function (defaults) { +module.exports = function(defaults) { var app = new EmberApp(defaults, { - hinting: false + hinting: false, // Add options here }); diff --git a/lib/config.js b/lib/config.js index f433840..6a4a4fc 100644 --- a/lib/config.js +++ b/lib/config.js @@ -17,15 +17,15 @@ const conf = convict({ doc: 'The current node.js environment', env: 'NODE_ENV', format: ['dev', 'test', 'staging', 'production'], - default: 'dev' + default: 'dev', }, git: { commit: { doc: 'Commit SHA when in stage/production', format: String, default: '', - env: 'GIT_COMMIT_SHA' - } + env: 'GIT_COMMIT_SHA', + }, }, /** * Server Properties @@ -33,24 +33,24 @@ const conf = convict({ server: { host: { env: 'HOST', - default: '127.0.0.1' + default: '127.0.0.1', }, port: { env: 'PORT', format: 'port', - default: 10137 + default: 10137, }, session: { env: 'COOKIE_SECRET', format: String, - default: 'cookie_secret' - } + default: 'cookie_secret', + }, }, base_url: { doc: 'Base URL of the application. Note: MUST end with a trailing slash', format: String, env: 'BASE_URL', - default: '/' + default: '/', }, /** * FxA OAuth @@ -61,57 +61,59 @@ const conf = convict({ doc: 'The FxA client_id (8 bytes key encoded as hex)', format: String, default: '', - env: 'FXA_OAUTH_CLIENT_ID' + env: 'FXA_OAUTH_CLIENT_ID', }, client_secret: { doc: 'The FxA client secret (32 bytes key encoded as hex)', format: String, default: '', - env: 'FXA_OAUTH_CLIENT_SECRET' + env: 'FXA_OAUTH_CLIENT_SECRET', }, oauth_uri: { doc: 'The location of the FxA OAuth server.', format: 'url', default: 'https://127.0.0.1:9010/v1', - env: 'OAUTH_URI' + env: 'OAUTH_URI', }, oauth_internal_uri: { doc: 'The location of the FxA OAuth internal server.', format: 'url', default: 'https://127.0.0.1:9011/v1', - env: 'OAUTH_INTERNAL_URI' + env: 'OAUTH_INTERNAL_URI', }, redirect_uri: { doc: 'The redirect_uri.', format: String, default: 'https://127.0.0.1:10137/oauth/redirect', - env: 'FXA_OAUTH_REDIRECT_URI' + env: 'FXA_OAUTH_REDIRECT_URI', }, profile_uri: { doc: 'The FxA profile uri.', format: 'url', default: 'https://127.0.0.1:1111/profile/v1', - env: 'PROFILE_URI' + env: 'PROFILE_URI', }, scopes: { doc: 'The oauth server scopes', format: String, default: 'profile oauth', - env: 'FXA_OAUTH_SCOPES' - } + env: 'FXA_OAUTH_SCOPES', + }, }, /** * Logging */ logging: { default: { - app: 'fxa-oauth-console' - } - } + app: 'fxa-oauth-console', + }, + }, }); var envConfig = path.join(__dirname, '..', 'config', conf.get('env') + '.json'); -var files = (envConfig + ',' + process.env.CONFIG_FILES).split(',').filter(fs.existsSync); +var files = (envConfig + ',' + process.env.CONFIG_FILES) + .split(',') + .filter(fs.existsSync); conf.loadFile(files); require('mozlog').config(conf.get('logging')); diff --git a/lib/routes/lib/oauth.js b/lib/routes/lib/oauth.js index 6296d57..dbe926a 100644 --- a/lib/routes/lib/oauth.js +++ b/lib/routes/lib/oauth.js @@ -14,7 +14,7 @@ var fxaOAuthConfig = config.get('fxaOAuth'); * @returns {string} */ function toQueryString(obj) { - var fields = Object.keys(obj).map(function (key) { + var fields = Object.keys(obj).map(function(key) { return key + '=' + obj[key]; }); @@ -35,10 +35,12 @@ function redirectUrl(action, nonce, scopes) { redirect_uri: fxaOAuthConfig.redirect_uri, state: nonce, scope: scopes || fxaOAuthConfig.scopes, - action: action + action: action, }; - return fxaOAuthConfig.oauth_uri + '/authorization' + toQueryString(oauthParams); + return ( + fxaOAuthConfig.oauth_uri + '/authorization' + toQueryString(oauthParams) + ); } /** @@ -47,17 +49,20 @@ function redirectUrl(action, nonce, scopes) { * @param {Function} cb */ function requestToken(code, cb) { - request.post({ - uri: fxaOAuthConfig.oauth_uri + '/token', - json: { - code: code, - client_id: fxaOAuthConfig.client_id, - client_secret: fxaOAuthConfig.client_secret - } - }, cb); + request.post( + { + uri: fxaOAuthConfig.oauth_uri + '/token', + json: { + code: code, + client_id: fxaOAuthConfig.client_id, + client_secret: fxaOAuthConfig.client_secret, + }, + }, + cb + ); } module.exports = { redirectUrl: redirectUrl, - requestToken: requestToken + requestToken: requestToken, }; diff --git a/lib/routes/oauth.js b/lib/routes/oauth.js index 1a40021..852d572 100644 --- a/lib/routes/oauth.js +++ b/lib/routes/oauth.js @@ -16,14 +16,14 @@ var baseUrl = config.get('base_url'); var fxaOAuthConfig = config.get('fxaOAuth'); var log = require('mozlog')('server.oauth'); // oauth flows are stored in memory -var oauthFlows = { }; +var oauthFlows = {}; var GENERATE_OAUTH_TOKEN_STATE = 'GENERATE_OAUTH_TOKEN'; var DIFFERENT_BROWSER_ERROR = 3005; /** * OAuth Login, redirects to FxA */ -router.get('/login', function (req, res) { +router.get('/login', function(req, res) { var nonce = crypto.randomBytes(32).toString('hex'); oauthFlows[nonce] = true; req.session.state = nonce; @@ -33,12 +33,14 @@ router.get('/login', function (req, res) { /** * Session Status */ -router.get('/status', function (req, res) { +router.get('/status', function(req, res) { if (req.session && req.session.email) { - return res.send(JSON.stringify({ - email: req.session.email, - token: req.session.token - })); + return res.send( + JSON.stringify({ + email: req.session.email, + token: req.session.token, + }) + ); } else { return res.status(401).end(); } @@ -47,7 +49,7 @@ router.get('/status', function (req, res) { /** * Clears local session */ -router.get('/logout', function (req, res) { +router.get('/logout', function(req, res) { req.session.reset(); res.redirect(baseUrl); }); @@ -55,10 +57,12 @@ router.get('/logout', function (req, res) { /** * Generates an OAuth Token based on scope */ -router.post('/generate-token', function (req, res) { +router.post('/generate-token', function(req, res) { log.verbose('/generate-token', req.body); if (req.body.scopes) { - return res.redirect(redirectUrl('signin', GENERATE_OAUTH_TOKEN_STATE, req.body.scopes)); + return res.redirect( + redirectUrl('signin', GENERATE_OAUTH_TOKEN_STATE, req.body.scopes) + ); } else { return res.redirect(baseUrl + 'clients/token'); } @@ -67,7 +71,7 @@ router.post('/generate-token', function (req, res) { /** * OAuth redirect flow, redirects from FxA */ -router.get('/redirect', function (req, res) { +router.get('/redirect', function(req, res) { var state = req.query.state; var code = req.query.code; var error = parseInt(req.query.error, 10); @@ -79,25 +83,34 @@ router.get('/redirect', function (req, res) { } if (state && state === GENERATE_OAUTH_TOKEN_STATE) { - requestToken(code, function (err, r, body) { + requestToken(code, function(err, r, body) { if (err) { return res.send(400, err); } log.verbose(GENERATE_OAUTH_TOKEN_STATE, body); - return res.redirect(baseUrl + 'clients/token?' + - 'access_token=' + body.access_token + - '&scopes=' + body.scope + return res.redirect( + baseUrl + + 'clients/token?' + + 'access_token=' + + body.access_token + + '&scopes=' + + body.scope ); }); - } else if (code && state && state in oauthFlows && state === req.session.state) { + } else if ( + code && + state && + state in oauthFlows && + state === req.session.state + ) { // state should exists in our set of active flows and the user should // have a cookie with that state delete oauthFlows[state]; delete req.session.state; - requestToken(code, function (err, r, body) { + requestToken(code, function(err, r, body) { if (err) { return res.send(r.status, err); } @@ -105,17 +118,17 @@ router.get('/redirect', function (req, res) { log.verbose(err, body); req.session.scope = body.scope; req.session.token_type = body.token_type; - var token = req.session.token = body.access_token; + var token = (req.session.token = body.access_token); var profile; requestProfile(token) - .then(function (profileData) { + .then(function(profileData) { profile = profileData; return activateDeveloper(token); }) .done( - function (developer) { + function(developer) { // only allow login if developer id is available if (developer && developer.developerId && profile.email) { req.session.email = profile.email; @@ -125,7 +138,7 @@ router.get('/redirect', function (req, res) { } return res.redirect(baseUrl); }, - function (response) { + function(response) { var msg = 'Error: Developer cannot be validated or activated'; return res.status(response.status).send(msg); } @@ -135,7 +148,6 @@ router.get('/redirect', function (req, res) { // already logged in return res.redirect(baseUrl); } else { - var msg = 'Bad request '; if (!code) { msg += ' - missing code'; @@ -146,7 +158,7 @@ router.get('/redirect', function (req, res) { } else if (!oauthFlows[state]) { msg += ' - unknown state'; } else if (state !== req.session.state) { - msg += ' - state cookie doesn\'t match'; + msg += " - state cookie doesn't match"; } log.error('msg', msg); @@ -162,26 +174,28 @@ router.get('/redirect', function (req, res) { * @returns {Promise} */ function requestProfile(token) { - return new Promise(function (resolve, reject) { - request.get({ - uri: fxaOAuthConfig.profile_uri + '/profile', - headers: { - Authorization: 'Bearer ' + token + return new Promise(function(resolve, reject) { + request.get( + { + uri: fxaOAuthConfig.profile_uri + '/profile', + headers: { + Authorization: 'Bearer ' + token, + }, + json: true, }, - json: true - }, function (err, r, body) { - log.verbose(err, body); + function(err, r, body) { + log.verbose(err, body); - if (err || r.statusCode >= 400) { - return reject({status: 400, err: err || body }); + if (err || r.statusCode >= 400) { + return reject({ status: 400, err: err || body }); + } + + return resolve({ + email: body.email, + uid: body.uid, + }); } - - return resolve({ - email: body.email, - uid: body.uid - }); - }); - + ); }); } @@ -192,25 +206,27 @@ function requestProfile(token) { * @returns {Promise} */ function activateDeveloper(token) { - return new Promise(function (resolve, reject) { - request.post({ - uri: fxaOAuthConfig.oauth_internal_uri + '/developer/activate', - headers: { - Authorization: 'Bearer ' + token + return new Promise(function(resolve, reject) { + request.post( + { + uri: fxaOAuthConfig.oauth_internal_uri + '/developer/activate', + headers: { + Authorization: 'Bearer ' + token, + }, + json: true, }, - json: true - }, function (err, r, body) { - log.verbose(err, body); + function(err, r, body) { + log.verbose(err, body); - if (err || r.statusCode >= 400) { - return reject({status: 400, err: err}); + if (err || r.statusCode >= 400) { + return reject({ status: 400, err: err }); + } + + log.verbose('developerData', body); + + return resolve(body); } - - log.verbose('developerData', body); - - return resolve(body); - }); - + ); }); } diff --git a/lib/routes/ver.js b/lib/routes/ver.js index 7a489b1..bb95f10 100644 --- a/lib/routes/ver.js +++ b/lib/routes/ver.js @@ -26,7 +26,7 @@ var logger = require('mozlog')('server.ver.json'); var version = require('../../package.json').version; function getCommitHashFromVersionJson() { - return Promise.attempt(function () { + return Promise.attempt(function() { var configFile = path.join(__dirname, '..', '..', 'config', 'version.json'); if (fs.existsSync(configFile)) { @@ -42,7 +42,7 @@ function getCommitHashFromVersionJson() { } function getGitDir() { - if (! fs.existsSync(path.join(__dirname, '..', '..', '.git'))) { + if (!fs.existsSync(path.join(__dirname, '..', '..', '.git'))) { // try at '/home/app/git' for AwsBox deploys return path.sep + path.join('home', 'app', 'git'); } @@ -52,16 +52,19 @@ function getCommitHashFromGit() { var deferred = Promise.defer(); var gitDir = getGitDir(); - var cmd = util.format('git %s rev-parse HEAD', gitDir ? '--git-dir=' + gitDir : ''); + var cmd = util.format( + 'git %s rev-parse HEAD', + gitDir ? '--git-dir=' + gitDir : '' + ); - child_process.exec(cmd, function (err, stdout) { //eslint-disable-line handle-callback-err + child_process.exec(cmd, function(err, stdout) { + //eslint-disable-line handle-callback-err deferred.resolve(stdout.replace(/\s+/, '')); }); return deferred.promise; } - var promise; function getVersionInfo() { // only resolve once, the data does not need to be re-calculated. @@ -71,7 +74,7 @@ function getVersionInfo() { // (1) read config/version.json if exists (ie. staging, production) promise = getCommitHashFromVersionJson() - .then(function (commitHash) { + .then(function(commitHash) { if (commitHash) { return commitHash; } @@ -79,12 +82,12 @@ function getVersionInfo() { // or '/home/app/git' for AwsBox) return getCommitHashFromGit(); }) - .then(function (commitHash) { + .then(function(commitHash) { logger.info('version set to: %s', version); logger.info('commit hash set to: %s', commitHash); return { version: version, - commit: commitHash + commit: commitHash, }; }); @@ -97,13 +100,12 @@ getVersionInfo(); /** * OAuth Login, redirects to FxA */ -router.get('*', function (req, res) { - getVersionInfo() - .then(function (versionInfo) { - // charset must be set on json responses. - res.charset = 'utf-8'; - res.json(versionInfo); - }); +router.get('*', function(req, res) { + getVersionInfo().then(function(versionInfo) { + // charset must be set on json responses. + res.charset = 'utf-8'; + res.json(versionInfo); + }); }); module.exports = router; diff --git a/lib/server.js b/lib/server.js index fe62a2a..6cbf9bd 100644 --- a/lib/server.js +++ b/lib/server.js @@ -21,12 +21,12 @@ app.use('/ver.json', routesVersion); app.use(express.static(path.join(__dirname, '..', 'dist'))); // TODO: there should be a better way to do send through requested routes with pushState -app.get('/*', function (req, res) { +app.get('/*', function(req, res) { res.sendFile(path.join(__dirname, '..', 'dist', 'index.html')); }); // catch 404 and forward to error handler -app.use(function (req, res, next) { +app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); @@ -37,22 +37,22 @@ app.use(function (req, res, next) { // development error handler // will print stacktrace if (app.get('env') === 'development') { - app.use(function (err, req, res) { + app.use(function(err, req, res) { res.status(err.status || 500); res.render('error', { message: err.message, - error: err + error: err, }); }); } // production error handler // no stacktraces leaked to user -app.use(function (err, req, res) { +app.use(function(err, req, res) { res.status(err.status || 500); res.render('error', { message: err.message, - error: {} + error: {}, }); }); diff --git a/lib/session.js b/lib/session.js index e311415..86e8119 100644 --- a/lib/session.js +++ b/lib/session.js @@ -9,11 +9,11 @@ var conf = require('./config'); var baseUrl = conf.get('base_url'); var sessionSecret = conf.get('server').session; -if (! sessionSecret) { +if (!sessionSecret) { throw new Error('Session secret not configured.'); } -module.exports = function (req, res, next) { +module.exports = function(req, res, next) { if (/^\/oauth/.test(req.url)) { res.setHeader('Cache-Control', 'no-cache, max-age=0'); @@ -23,8 +23,8 @@ module.exports = function (req, res, next) { requestKey: 'session', cookie: { path: baseUrl + 'oauth', - httpOnly: true - } + httpOnly: true, + }, })(req, res, next); } else { return next(); diff --git a/package-lock.json b/package-lock.json index 16c94a9..f6f6c23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,66 @@ { "name": "fxa-oauth-console", - "version": "0.5.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -24,21 +81,10 @@ "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true }, "after": { "version": "0.8.1", @@ -56,12 +102,6 @@ "json-schema-traverse": "^0.3.0" } }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -133,9 +173,9 @@ } }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -304,6 +344,12 @@ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -367,25 +413,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, "babel-core": { "version": "5.8.38", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", @@ -1829,7 +1856,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "dev": true, + "optional": true }, "builtin-modules": { "version": "1.1.1", @@ -1872,24 +1900,15 @@ } } }, - "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": { - "callsites": "^0.2.0" - } - }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -1955,6 +1974,12 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "charm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", @@ -2318,12 +2343,6 @@ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", "dev": true }, - "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 - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2415,12 +2434,12 @@ } }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-table": { @@ -2622,6 +2641,7 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, + "optional": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -3095,21 +3115,6 @@ } } }, - "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", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3170,9 +3175,9 @@ "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -3954,6 +3959,12 @@ "klassy": "^0.1.3" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4128,31 +4139,6 @@ } } }, - "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", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - }, "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", @@ -4160,30 +4146,6 @@ "dev": true, "optional": true }, - "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", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -4245,176 +4207,324 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "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.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "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", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - } - } - }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz", + "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "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.0.0", - "interpret": "^1.0.0", - "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=", + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, "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=", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "has-flag": "^3.0.0" } } } }, - "eslint-config-fxa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-fxa/-/eslint-config-fxa-3.0.0.tgz", - "integrity": "sha1-1PXpEYqj3B2t+C1HhXoh5IJROvE=", + "eslint-config-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-5.0.0.tgz", + "integrity": "sha512-c17Aqiz5e8LEqoc/QPmYnaxQFAHTx2KlCZBPxXXjEMmNchOLnV/7j0HoPZuC+rL/tDC9bazUYOKJW9bOhftI/w==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } } }, "esprima-fb": { @@ -4563,12 +4673,6 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, - "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", @@ -4682,6 +4786,37 @@ } } }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -4819,23 +4954,21 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "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=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^2.0.1" } }, "filename-regex": { @@ -4950,17 +5083,47 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "follow-redirects": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.2.tgz", @@ -5100,7 +5263,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5121,12 +5285,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5141,17 +5307,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5268,7 +5437,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5280,6 +5450,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5294,6 +5465,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5301,12 +5473,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5325,6 +5499,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5405,7 +5580,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5417,6 +5593,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5502,7 +5679,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5538,6 +5716,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5557,6 +5736,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5600,12 +5780,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5620,6 +5802,12 @@ "rimraf": "2" } }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -5758,20 +5946,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "globule": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", @@ -5977,13 +6151,44 @@ "dev": true }, "grunt-eslint": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-19.0.0.tgz", - "integrity": "sha1-u3TDeQYVmc7B9mFp3vKonYYthhs=", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-21.1.0.tgz", + "integrity": "sha512-TN1C4BV947eUB/XrROUQ/QFTufWgH6wdfaxhlfmpjE70bFTp5q+Q2LgIZ5Y//+Rn1BWrXmm44sxegijNN6WR/A==", "dev": true, "requires": { - "chalk": "^1.0.0", - "eslint": "^3.0.0" + "chalk": "^2.1.0", + "eslint": "^5.16.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "grunt-known-options": { @@ -6380,9 +6585,9 @@ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "ignore-by-default": { @@ -6391,6 +6596,16 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -6523,12 +6738,6 @@ "utcstring": "~0.1.0" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -6719,21 +6928,6 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", @@ -6770,6 +6964,12 @@ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -6781,12 +6981,6 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -6939,6 +7133,12 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -8005,6 +8205,12 @@ "mime-db": "~1.35.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -8165,9 +8371,9 @@ } }, "natives": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" }, "natural-compare": { "version": "1.4.0", @@ -8185,6 +8391,12 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -10163,10 +10375,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "optimist": { "version": "0.6.1", @@ -10272,6 +10487,15 @@ "through2": "^2.0.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -10518,12 +10742,6 @@ "resolved": "https://registry.npmjs.org/pleasant-progress/-/pleasant-progress-1.1.0.tgz", "integrity": "sha1-yZzXMKLlDP/dO63/hF/E1SguJms=" }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, "portfinder": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-0.4.0.tgz", @@ -10563,6 +10781,12 @@ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "dev": true + }, "printf": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/printf/-/printf-0.2.5.tgz", @@ -10590,7 +10814,8 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true + "dev": true, + "optional": true }, "promise-map-series": { "version": "0.2.3", @@ -10863,15 +11088,6 @@ } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -10932,6 +11148,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "regexpu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", @@ -11111,16 +11333,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -11135,9 +11347,9 @@ } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-pkg": { @@ -11164,13 +11376,13 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -11201,19 +11413,22 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } }, "safe-buffer": { "version": "5.1.2", @@ -11424,10 +11639,32 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "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 + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } }, "slide": { "version": "1.1.6", @@ -12016,33 +12253,39 @@ "integrity": "sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg==" }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz", + "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "is-fullwidth-code-point": { @@ -12051,23 +12294,36 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -12444,6 +12700,12 @@ "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=" }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -12480,7 +12742,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "dev": true, + "optional": true }, "uc.micro": { "version": "1.0.5", @@ -12775,6 +13038,23 @@ } } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -13018,9 +13298,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" diff --git a/package.json b/package.json index c96452c..2010a7c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "test": "ember test && grunt lint", "postinstall": "node_modules/.bin/bower install --config.interactive=false -s --allow-root", "outdated": "npm outdated --depth 0", - "contributors": "git shortlog -s | cut -c8- | sort -f > CONTRIBUTORS" + "contributors": "git shortlog -s | cut -c8- | sort -f > CONTRIBUTORS", + "format": "prettier '**' --write" }, "repository": { "type": "git", @@ -55,15 +56,17 @@ "ember-cli-qunit": "1.2.1", "ember-cli-release": "0.2.8", "ember-cli-uglify": "1.2.0", - "eslint-config-fxa": "3.0.0", + "eslint-config-prettier": "^5.0.0", "grunt": "^1.0.1", "grunt-cli": "^1.2.0", "grunt-concurrent": "^2.3.1", "grunt-contrib-jshint": "1.1.0", "grunt-copyright": "0.3.0", - "grunt-eslint": "19.0.0", + "grunt-eslint": "21.1.0", "load-grunt-tasks": "3.5.2", + "natives": "1.1.6", "nodemon": "^1.2.1", + "prettier": "^1.18.2", "xmlhttprequest": "git://github.com/zaach/node-XMLHttpRequest.git#onerror" }, "engines": { diff --git a/public/assets/fonts/fira/fira.scss b/public/assets/fonts/fira/fira.scss index 213601d..077e803 100644 --- a/public/assets/fonts/fira/fira.scss +++ b/public/assets/fonts/fira/fira.scss @@ -1,21 +1,21 @@ -@font-face{ - font-family: 'Fira Sans'; - src: url('fonts/fira/eot/FiraSans-Regular.eot'); - src: local('Fira Sans Regular'), - url('fonts/fira/eot/FiraSans-Regular.eot') format('embedded-opentype'), - url('fonts/fira/woff/FiraSans-Regular.woff') format('woff'), - url('fonts/fira/ttf/FiraSans-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; +@font-face { + font-family: 'Fira Sans'; + src: url('fonts/fira/eot/FiraSans-Regular.eot'); + src: local('Fira Sans Regular'), + url('fonts/fira/eot/FiraSans-Regular.eot') format('embedded-opentype'), + url('fonts/fira/woff/FiraSans-Regular.woff') format('woff'), + url('fonts/fira/ttf/FiraSans-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; } -@font-face{ - font-family: 'Fira Sans'; - src: url('fonts/fira/eot/FiraSans-Bold.eot'); - src: local('Fira Sans Bold'), - url('fonts/fira/eot/FiraSans-Bold.eot') format('embedded-opentype'), - url('fonts/fira/woff/FiraSans-Bold.woff') format('woff'), - url('fonts/fira/ttf/FiraSans-Bold.ttf') format('truetype'); - font-weight: 700; - font-style: normal; +@font-face { + font-family: 'Fira Sans'; + src: url('fonts/fira/eot/FiraSans-Bold.eot'); + src: local('Fira Sans Bold'), + url('fonts/fira/eot/FiraSans-Bold.eot') format('embedded-opentype'), + url('fonts/fira/woff/FiraSans-Bold.woff') format('woff'), + url('fonts/fira/ttf/FiraSans-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; } diff --git a/scripts/run_dev.js b/scripts/run_dev.js index 30be63d..93a4872 100755 --- a/scripts/run_dev.js +++ b/scripts/run_dev.js @@ -10,10 +10,18 @@ const path = require('path'); var config = require('../lib/config').get('server'); console.log(config); // eslint-disable-line no-console -var emberBuild = cp.spawn(path.join(__dirname, '..', 'node_modules', '.bin', 'ember'), ['build', '--watch'], { stdio: 'inherit' }); +var emberBuild = cp.spawn( + path.join(__dirname, '..', 'node_modules', '.bin', 'ember'), + ['build', '--watch'], + { stdio: 'inherit' } +); emberBuild.on('exit', process.exit); -var server = cp.spawn(path.join(__dirname, '..', 'node_modules', '.bin', 'nodemon'), ['bin/server.js', '--watch', 'lib'], { stdio: 'inherit' }); +var server = cp.spawn( + path.join(__dirname, '..', 'node_modules', '.bin', 'nodemon'), + ['bin/server.js', '--watch', 'lib'], + { stdio: 'inherit' } +); server.on('exit', process.exit); var port = config.port === '80' ? '' : ':' + config.port; diff --git a/tasks/copyright.js b/tasks/copyright.js index 9a9055d..db2a328 100644 --- a/tasks/copyright.js +++ b/tasks/copyright.js @@ -3,16 +3,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* global module */ -module.exports = function (grunt) { - +module.exports = function(grunt) { grunt.config('copyright', { app: { options: { - pattern: /This Source Code Form is subject to the terms of the Mozilla/ + pattern: /This Source Code Form is subject to the terms of the Mozilla/, }, - src: [ - '<%= mainJsFiles %>' - ] - } + src: ['<%= mainJsFiles %>'], + }, }); }; diff --git a/tasks/eslint.js b/tasks/eslint.js index f68876d..c105d7e 100644 --- a/tasks/eslint.js +++ b/tasks/eslint.js @@ -3,14 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* global module */ -module.exports = function (grunt) { - +module.exports = function(grunt) { grunt.config('eslint', { app: { options: { eslintrc: '.eslintrc' }, - src: [ - '<%= mainJsFiles %>' - ] - } + src: ['<%= mainJsFiles %>'], + }, }); }; diff --git a/testem.js b/testem.js index fe0b740..33dcf5f 100644 --- a/testem.js +++ b/testem.js @@ -3,13 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /*jshint node:true*/ module.exports = { - 'framework': 'qunit', - 'test_page': 'tests/index.html?hidepassed', - 'disable_watching': true, - 'launch_in_ci': [ - 'Firefox' - ], - 'launch_in_dev': [ - 'Firefox' - ] + framework: 'qunit', + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: ['Firefox'], + launch_in_dev: ['Firefox'], }; diff --git a/tests/blanket-options.js b/tests/blanket-options.js index 264259c..6240946 100644 --- a/tests/blanket-options.js +++ b/tests/blanket-options.js @@ -1,7 +1,7 @@ /* globals blanket */ blanket.options({ - filter: "//.*fxa-oauth-console/.*/", - antifilter: "//.*(tests|templates).*/", - loaderExclusions: ['simple-auth'] -}); \ No newline at end of file + filter: '//.*fxa-oauth-console/.*/', + antifilter: '//.*(tests|templates).*/', + loaderExclusions: ['simple-auth'], +}); diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 8c8b74e..5bd2393 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -18,6 +18,6 @@ export default function(name, options = {}) { } destroyApp(this.application); - } + }, }); } diff --git a/tests/helpers/resolver.js b/tests/helpers/resolver.js index 8df2acd..723e402 100644 --- a/tests/helpers/resolver.js +++ b/tests/helpers/resolver.js @@ -1,11 +1,11 @@ -import Resolver from 'ember/resolver'; -import config from '../../config/environment'; - -const resolver = Resolver.create(); - -resolver.namespace = { - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix -}; - -export default resolver; +import Resolver from 'ember/resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, +}; + +export default resolver; diff --git a/tests/index.html b/tests/index.html index 9348361..6c4d98c 100644 --- a/tests/index.html +++ b/tests/index.html @@ -1,34 +1,30 @@ - - - - - - FxaOauthConsole Tests - - - - {{content-for 'head'}} - {{content-for 'test-head'}} - - - - - - {{content-for 'head-footer'}} - {{content-for 'test-head-footer'}} - - - {{content-for 'body'}} - {{content-for 'test-body'}} - - - - - - - - - {{content-for 'body-footer'}} - {{content-for 'test-body-footer'}} - - + + + + + + FxaOauthConsole Tests + + + + {{content-for 'head'}} {{content-for 'test-head'}} + + + + + + {{content-for 'head-footer'}} {{content-for 'test-head-footer'}} + + + {{content-for 'body'}} {{content-for 'test-body'}} + + + + + + + + + {{content-for 'body-footer'}} {{content-for 'test-body-footer'}} + + diff --git a/tests/test-helper.js b/tests/test-helper.js index e6cfb70..6d2a75c 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -1,6 +1,4 @@ import resolver from './helpers/resolver'; -import { - setResolver -} from 'ember-qunit'; +import { setResolver } from 'ember-qunit'; setResolver(resolver); diff --git a/tests/unit/controllers/client/register-test.js b/tests/unit/controllers/client/register-test.js index 93249c9..b19adbb 100644 --- a/tests/unit/controllers/client/register-test.js +++ b/tests/unit/controllers/client/register-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('controller:client/register', 'ClientRegisterController', { // Specify the other units that are required for this test. diff --git a/tests/unit/controllers/clients-test.js b/tests/unit/controllers/clients-test.js index 4a99f60..6c06636 100644 --- a/tests/unit/controllers/clients-test.js +++ b/tests/unit/controllers/clients-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('controller:clients', 'ClientsController', { // Specify the other units that are required for this test. diff --git a/tests/unit/controllers/login-test.js b/tests/unit/controllers/login-test.js index 0e1a146..758cbd8 100644 --- a/tests/unit/controllers/login-test.js +++ b/tests/unit/controllers/login-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('controller:login', 'LoginController', { // Specify the other units that are required for this test. diff --git a/tests/unit/models/client-test.js b/tests/unit/models/client-test.js index 3ba69a8..c836a87 100644 --- a/tests/unit/models/client-test.js +++ b/tests/unit/models/client-test.js @@ -1,11 +1,8 @@ -import { - moduleForModel, - test -} from 'ember-qunit'; +import { moduleForModel, test } from 'ember-qunit'; moduleForModel('client', 'Client', { // Specify the other units that are required for this test. - needs: [] + needs: [], }); test('it exists', function(assert) { diff --git a/tests/unit/routes/client/delete-test.js b/tests/unit/routes/client/delete-test.js index eb3fc07..57fd2b3 100644 --- a/tests/unit/routes/client/delete-test.js +++ b/tests/unit/routes/client/delete-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:client/delete', 'ClientDeleteRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/client/index-test.js b/tests/unit/routes/client/index-test.js index 2e0f7af..8d77cfd 100644 --- a/tests/unit/routes/client/index-test.js +++ b/tests/unit/routes/client/index-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:client/index', 'ClientIndexRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/client/register-test.js b/tests/unit/routes/client/register-test.js index 044013c..266f710 100644 --- a/tests/unit/routes/client/register-test.js +++ b/tests/unit/routes/client/register-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:client/register', 'ClientRegisterRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/client/update-test.js b/tests/unit/routes/client/update-test.js index 6756b98..d2b0488 100644 --- a/tests/unit/routes/client/update-test.js +++ b/tests/unit/routes/client/update-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:client/update', 'ClientUpdateRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/clients-test.js b/tests/unit/routes/clients-test.js index e0720ab..2a4db88 100644 --- a/tests/unit/routes/clients-test.js +++ b/tests/unit/routes/clients-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:clients', 'ClientsRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/clients/token-test.js b/tests/unit/routes/clients/token-test.js index 2d5408c..e216055 100644 --- a/tests/unit/routes/clients/token-test.js +++ b/tests/unit/routes/clients/token-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:clients/token', 'ClientsTokenRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/index-test.js b/tests/unit/routes/index-test.js index 5dde434..f7a44a9 100644 --- a/tests/unit/routes/index-test.js +++ b/tests/unit/routes/index-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:index', 'IndexRoute', { // Specify the other units that are required for this test. diff --git a/tests/unit/routes/login-test.js b/tests/unit/routes/login-test.js index 03e6695..50347a8 100644 --- a/tests/unit/routes/login-test.js +++ b/tests/unit/routes/login-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('route:login', 'LoginRoute', { // Specify the other units that are required for this test.