├── src
├── .eslintignore
├── .meteor
│ ├── .gitignore
│ ├── release
│ ├── platforms
│ ├── .id
│ ├── .finished-upgraders
│ ├── packages
│ └── versions
├── .gitignore
├── app
│ ├── features
│ │ ├── todos
│ │ │ ├── index.js
│ │ │ ├── server.js
│ │ │ ├── store
│ │ │ │ ├── index.js
│ │ │ │ └── todos.js
│ │ │ ├── pages
│ │ │ │ ├── TodosDetail.vue
│ │ │ │ └── TodosIndex.vue
│ │ │ ├── api
│ │ │ │ ├── collections.js
│ │ │ │ ├── publications.js
│ │ │ │ └── methods.js
│ │ │ ├── routes.js
│ │ │ └── components
│ │ │ │ ├── TodosList.vue
│ │ │ │ └── TodoForm.vue
│ │ ├── users
│ │ │ ├── index.js
│ │ │ ├── server.js
│ │ │ ├── routes.js
│ │ │ ├── api
│ │ │ │ ├── publications.js
│ │ │ │ └── methods.js
│ │ │ ├── pages
│ │ │ │ └── Users.vue
│ │ │ └── components
│ │ │ │ └── UserList.vue
│ │ ├── auth
│ │ │ ├── server.js
│ │ │ ├── store
│ │ │ │ ├── index.js
│ │ │ │ ├── plugin.js
│ │ │ │ └── user.js
│ │ │ ├── config.js
│ │ │ ├── pages
│ │ │ │ ├── ResetPassword.vue
│ │ │ │ ├── ForgotPassword.vue
│ │ │ │ ├── Login.vue
│ │ │ │ ├── Registration.vue
│ │ │ │ └── VerifyEmail.vue
│ │ │ ├── api
│ │ │ │ ├── hooks.js
│ │ │ │ └── config.js
│ │ │ ├── components
│ │ │ │ ├── LogoutButton.vue
│ │ │ │ ├── GatewayModal.vue
│ │ │ │ ├── ForgotPasswordForm.vue
│ │ │ │ ├── TheGateway.vue
│ │ │ │ ├── ResetPasswordForm.vue
│ │ │ │ ├── LoginForm.vue
│ │ │ │ └── RegistrationForm.vue
│ │ │ ├── routes.js
│ │ │ ├── mixins
│ │ │ │ └── auth.js
│ │ │ └── README.md
│ │ └── notifications
│ │ │ ├── store
│ │ │ ├── index.js
│ │ │ └── notifications.js
│ │ │ ├── components
│ │ │ └── NotificationsToast.vue
│ │ │ └── README.md
│ ├── pages
│ │ ├── NotFound.vue
│ │ └── Dashboard.vue
│ ├── core
│ │ ├── index.js
│ │ ├── store.js
│ │ ├── router.js
│ │ └── app.js
│ ├── filters
│ │ └── index.js
│ ├── plugins
│ │ ├── vuetify.js
│ │ └── index.js
│ ├── store
│ │ └── index.js
│ ├── index.html
│ ├── routes.js
│ ├── Root.vue
│ ├── components
│ │ ├── TheHeader.vue
│ │ └── TheNavigation.vue
│ └── layouts
│ │ ├── PublicLayout.vue
│ │ └── AdminLayout.vue
├── client.js
├── public
│ └── favicon.ico
├── settings.json
├── .eslintrc.js
├── server.js
├── package.json
└── package-lock.json
├── .gitignore
├── package.json
└── README.md
/src/.eslintignore:
--------------------------------------------------------------------------------
1 | packages
2 |
--------------------------------------------------------------------------------
/src/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | local
2 |
--------------------------------------------------------------------------------
/src/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@1.8.0.1
2 |
--------------------------------------------------------------------------------
/src/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .cache
3 |
--------------------------------------------------------------------------------
/src/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | node_modules
3 | .env
4 | bundle
5 |
--------------------------------------------------------------------------------
/src/app/features/todos/index.js:
--------------------------------------------------------------------------------
1 | import './api/methods';
2 |
--------------------------------------------------------------------------------
/src/app/features/users/index.js:
--------------------------------------------------------------------------------
1 | import './api/methods';
2 |
--------------------------------------------------------------------------------
/src/app/features/todos/server.js:
--------------------------------------------------------------------------------
1 | import './api/publications';
2 |
--------------------------------------------------------------------------------
/src/app/features/users/server.js:
--------------------------------------------------------------------------------
1 | import './api/publications';
2 |
--------------------------------------------------------------------------------
/src/app/features/todos/store/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './todos';
2 |
--------------------------------------------------------------------------------
/src/app/features/auth/server.js:
--------------------------------------------------------------------------------
1 | import './api/config';
2 | import './api/hooks';
3 |
--------------------------------------------------------------------------------
/src/app/features/notifications/store/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './notifications';
2 |
--------------------------------------------------------------------------------
/src/client.js:
--------------------------------------------------------------------------------
1 | import './app/features/users';
2 | import './app/features/todos';
3 |
4 | import './app/core';
5 |
--------------------------------------------------------------------------------
/src/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chris-visser/meteor-vue-admin/HEAD/src/public/favicon.ico
--------------------------------------------------------------------------------
/src/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "public": {
3 | "auth": {
4 | "gatewayMode": "redirect"
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/app/features/auth/store/index.js:
--------------------------------------------------------------------------------
1 | export { default as plugin } from './plugin';
2 | export { default } from './user';
3 |
--------------------------------------------------------------------------------
/src/app/features/todos/pages/TodosDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
TODO: {{$route.params.todoId}}
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: '@meteorjs/eslint-config-meteor',
3 | rules: {
4 | 'no-param-reassign': 'off',
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/src/app/pages/NotFound.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
#404
4 |
The page that you were trying to visit was not found
5 |
6 | ;
7 |
--------------------------------------------------------------------------------
/src/app/features/users/routes.js:
--------------------------------------------------------------------------------
1 | export default [
2 | {
3 | path: '/users',
4 | name: 'users',
5 | component: () => import('./pages/Users.vue'),
6 | },
7 | ];
8 |
--------------------------------------------------------------------------------
/src/app/core/index.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import CreateApp from './app';
3 |
4 | Meteor.startup(() => {
5 | CreateApp({
6 | ssr: false,
7 | });
8 | });
9 |
--------------------------------------------------------------------------------
/src/app/features/auth/config.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 |
3 | export default {
4 | ...Meteor.settings.public.auth || {
5 | gatewayMode: 'modal',
6 | },
7 | };
8 |
--------------------------------------------------------------------------------
/src/server.js:
--------------------------------------------------------------------------------
1 | import './app/features/auth/server';
2 |
3 | import './app/features/users';
4 | import './app/features/users/server';
5 |
6 | import './app/features/todos';
7 | import './app/features/todos/server';
8 |
--------------------------------------------------------------------------------
/src/app/filters/index.js:
--------------------------------------------------------------------------------
1 | import moment from 'moment';
2 | import Vue from 'vue';
3 |
4 | Vue.filter('date', value => moment(value).format('DD/MM/YYYY'));
5 | Vue.filter('boolean', value => (value ? 'Yes' : 'No'));
6 | Vue.filter('list', value => (value || []).join(', '));
7 |
--------------------------------------------------------------------------------
/src/app/features/todos/api/collections.js:
--------------------------------------------------------------------------------
1 | import { Mongo } from 'meteor/mongo';
2 |
3 | const Todos = new Mongo.Collection('todos');
4 |
5 | Todos.deny({
6 | insert: () => false,
7 | update: () => false,
8 | remove: () => false,
9 | });
10 |
11 | export default Todos;
12 |
--------------------------------------------------------------------------------
/src/app/features/todos/routes.js:
--------------------------------------------------------------------------------
1 | export default [{
2 | path: '/todos',
3 | name: 'todos-index',
4 | component: () => import('./pages/TodosIndex'),
5 | }, {
6 | path: '/todos/:todoId',
7 | name: 'todos-detail',
8 | component: () => import('./pages/TodosDetail'),
9 | }];
10 |
--------------------------------------------------------------------------------
/src/app/features/auth/pages/ResetPassword.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/src/app/features/auth/pages/ForgotPassword.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/src/app/features/auth/pages/Login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/src/app/features/auth/pages/Registration.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/src/app/plugins/vuetify.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuetify from 'vuetify';
3 |
4 | Vue.use(Vuetify, {
5 | theme: {
6 | primary: '#FAFAFA',
7 | secondary: '#414141',
8 | accent: '#212121',
9 | error: '#f44336',
10 | warning: '#ffeb3b',
11 | info: '#2196f3',
12 | success: '#4caf50',
13 | },
14 | });
15 |
--------------------------------------------------------------------------------
/src/.meteor/.id:
--------------------------------------------------------------------------------
1 | # This file contains a token that is unique to your project.
2 | # Check it into your repository along with the rest of this directory.
3 | # It can be used for purposes such as:
4 | # - ensuring you don't accidentally deploy one app on top of another
5 | # - providing package authors with aggregated statistics
6 |
7 | iyb1ymqarfks.noxgzfjtn2ba
8 |
--------------------------------------------------------------------------------
/src/app/features/users/api/publications.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Roles } from 'meteor/alanning:roles';
3 |
4 | Meteor.publish('users', function () {
5 | if (!Roles.userIsInRole(this.userId, ['owner', 'admin', 'user-manager'])) {
6 | return [];
7 | }
8 |
9 | return Meteor.users.find({}, { sort: { createdAt: 1 } });
10 | });
11 |
--------------------------------------------------------------------------------
/src/app/features/todos/api/publications.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Roles } from 'meteor/alanning:roles';
3 | import Todos from './collections';
4 |
5 | Meteor.publish('todos', function () {
6 | if (!Roles.userIsInRole(this.userId, ['owner', 'admin', 'user-manager'])) {
7 | return [];
8 | }
9 |
10 | return Todos.find({}, { sort: { createdAt: 1 } });
11 | });
12 |
--------------------------------------------------------------------------------
/src/app/core/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 | // import { injectSupply } from 'vue-supply';
4 |
5 | import storeOptions from '../store';
6 |
7 | Vue.use(Vuex);
8 |
9 | export default function createStore() {
10 | // const supplyCache = {};
11 | // const suppliedStoreOptions = injectSupply(storeOptions, supplyCache);
12 |
13 | return new Vuex.Store(storeOptions);
14 | }
15 |
--------------------------------------------------------------------------------
/src/app/store/index.js:
--------------------------------------------------------------------------------
1 | import user, { plugin as UserPlugin } from '../features/auth/store';
2 | import notifications from '../features/notifications/store';
3 | import todos from '../features/todos/store';
4 |
5 | export default {
6 | plugins: [UserPlugin], // Connects Meteor's reactive user state to the store using Tracker
7 |
8 | modules: {
9 | user,
10 | notifications,
11 | todos,
12 | },
13 | };
14 |
--------------------------------------------------------------------------------
/src/app/features/users/pages/Users.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
20 |
--------------------------------------------------------------------------------
/src/app/core/router.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Router from 'vue-router';
3 |
4 | import routes from '../routes';
5 |
6 | Vue.use(Router);
7 |
8 | /**
9 | * These routes take advantage of code splitting. Each page is loaded when the route is loaded
10 | * @returns {VueRouter}
11 | */
12 |
13 | export default function createRouter() {
14 | return new Router({
15 | mode: 'history',
16 | routes,
17 | });
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/index.html:
--------------------------------------------------------------------------------
1 |
2 | Cloudspider Admin
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/app/features/auth/api/hooks.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Accounts } from 'meteor/accounts-base';
3 |
4 | /**
5 | * Adds the admin role if its the first user
6 | */
7 | Accounts.onCreateUser(({ profile }, user) => {
8 | if (Meteor.users.findOne({})) {
9 | return {
10 | ...user,
11 | profile,
12 | };
13 | }
14 |
15 | return {
16 | ...user,
17 | profile,
18 | roles: {
19 | __global_roles__: ['owner'],
20 | },
21 | };
22 | });
23 |
--------------------------------------------------------------------------------
/src/app/routes.js:
--------------------------------------------------------------------------------
1 | import authRoutes from './features/auth/routes';
2 | import usersRoutes from './features/users/routes';
3 | import todosRoutes from './features/todos/routes';
4 |
5 | export default [
6 | {
7 | path: '/',
8 | name: 'dashboard',
9 | component: () => import('./pages/Dashboard.vue'),
10 | },
11 | ...authRoutes,
12 | ...usersRoutes,
13 | ...todosRoutes,
14 | {
15 | path: '*',
16 | name: 'not-found',
17 | component: () => import('./pages/NotFound.vue'),
18 | },
19 | ];
20 |
--------------------------------------------------------------------------------
/src/app/Root.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
23 |
--------------------------------------------------------------------------------
/src/app/features/todos/store/todos.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 |
3 | /* eslint no-console: off */
4 | export default {
5 | namespaced: true,
6 |
7 | actions: {
8 | remove(context, { _id }) {
9 | return new Promise((resolve, reject) => {
10 | Meteor.call('removeTodo', { _id }, (error, result) => {
11 | if (error) {
12 | console.log(error);
13 | reject(error.reason);
14 | } else {
15 | resolve(result);
16 | }
17 | });
18 | });
19 | },
20 | },
21 | };
22 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/LogoutButton.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 | logout
9 |
10 |
11 |
12 |
31 |
--------------------------------------------------------------------------------
/src/app/features/todos/pages/TodosIndex.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
25 |
--------------------------------------------------------------------------------
/src/app/components/TheHeader.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 | Cloudspider - Admin
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
28 |
--------------------------------------------------------------------------------
/src/app/pages/Dashboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Welcome back {{displayName}}
6 | This page uses the default layout which is a Vue component with a sidebar
7 |
8 |
9 |
10 |
11 |
12 |
25 |
--------------------------------------------------------------------------------
/src/.meteor/.finished-upgraders:
--------------------------------------------------------------------------------
1 | # This file contains information which helps Meteor properly upgrade your
2 | # app when you run 'meteor update'. You should check it into version control
3 | # with your project.
4 |
5 | notices-for-0.9.0
6 | notices-for-0.9.1
7 | 0.9.4-platform-file
8 | notices-for-facebook-graph-api-2
9 | 1.2.0-standard-minifiers-package
10 | 1.2.0-meteor-platform-split
11 | 1.2.0-cordova-changes
12 | 1.2.0-breaking-changes
13 | 1.3.0-split-minifiers-package
14 | 1.4.0-remove-old-dev-bundle-link
15 | 1.4.1-add-shell-server-package
16 | 1.4.3-split-account-service-packages
17 | 1.5-add-dynamic-import-package
18 | 1.7-split-underscore-from-meteor-base
19 |
--------------------------------------------------------------------------------
/src/app/features/users/api/methods.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Roles } from 'meteor/alanning:roles';
3 |
4 | Meteor.methods({
5 | removeUser({ _id }) {
6 | if (!Roles.userIsInRole(this.userId, ['owner', 'admin', 'user-admin'])) {
7 | throw new Meteor.Error('not-allowed', 'You are not allowed to remove users');
8 | }
9 |
10 | if (!_id) {
11 | throw new Meteor.Error('invalid-parameter', `Invalid parameter _id. Expected a string, but ${typeof _id} given`);
12 | }
13 |
14 | if (Roles.userIsInRole(this.userId, 'owner') && this.userId === _id) {
15 | throw new Meteor.Error('invalid-action', 'You cannot remove yourself while you are the owner of the system. Transfer ownership first');
16 | }
17 |
18 | Meteor.users.remove({ _id });
19 | },
20 | });
21 |
--------------------------------------------------------------------------------
/src/app/features/auth/pages/VerifyEmail.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 | {{ status.title }}
8 |
9 |
10 |
11 |
35 |
--------------------------------------------------------------------------------
/src/app/layouts/PublicLayout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
35 |
--------------------------------------------------------------------------------
/src/app/features/auth/store/plugin.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Tracker } from 'meteor/tracker';
3 |
4 | /**
5 | * This plugin tracks the user's session with Meteor Tracker and
6 | * keeps it in sync with the Vuex user store
7 | * @param store
8 | */
9 | export default (store) => {
10 | /**
11 | * Tracks changes on the user
12 | */
13 | Tracker.autorun(() => {
14 | const user = Meteor.user();
15 |
16 | if (user) {
17 | store.commit('setUser', user);
18 | }
19 | });
20 |
21 | /**
22 | * Tracks if the user is logging out
23 | */
24 | Tracker.autorun((c) => {
25 | const userId = Meteor.userId();
26 |
27 | // The Meteor.userId state is never set on the firstRun (refresh or initial load) so skip that
28 | if (c.firstRun) {
29 | return;
30 | }
31 |
32 | // Only commit 'unsetUser' when userId was changed and set to empty
33 | if (!userId) {
34 | store.commit('unsetUser');
35 | }
36 | });
37 | };
38 |
--------------------------------------------------------------------------------
/src/app/plugins/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import VueRouter from 'vue-router';
3 | import Vuex from 'vuex';
4 |
5 | // Meteor Tracker integration
6 | import VueMeteorTracker from 'vue-meteor-tracker';
7 | // import VueSupply from 'vue-supply';
8 | import VueObserveVisibility from 'vue-observe-visibility';
9 | import VeeValidate from 'vee-validate';
10 |
11 | import './vuetify.js';
12 |
13 |
14 | Vue.use(VeeValidate); // Used for form Validations
15 |
16 |
17 | Vue.use(VueRouter); // Routing
18 | Vue.use(Vuex); // State store
19 |
20 | Vue.use(VueMeteorTracker); // Connects Meteor's reactivity system to Vue
21 |
22 | // This option will apply Object.freeze on the Meteor data to prevent Vue
23 | // from setting up reactivity on it. This can improve the performance of
24 | // Vue when rendering large collection lists for example.
25 | // By default, this option is turned off.
26 | Vue.config.meteor.freeze = true;
27 |
28 |
29 | // Vue.use(VueSupply);
30 |
31 | Vue.use(VueObserveVisibility);
32 |
--------------------------------------------------------------------------------
/src/app/features/notifications/store/notifications.js:
--------------------------------------------------------------------------------
1 | import { Random } from 'meteor/random';
2 |
3 | /**
4 | * Allows for the presence of multiple notifications
5 | */
6 | export default {
7 |
8 | state: {
9 | activeMessages: [],
10 | },
11 |
12 | mutations: {
13 | addMessage(state, message) {
14 | state.activeMessages.push(message);
15 | },
16 | removeMessage(state, { id }) {
17 | const index = state.activeMessages.findIndex(message => message.id === id);
18 | state.activeMessages.splice(index, 1);
19 | },
20 | },
21 |
22 | actions: {
23 | notify({ commit }, { text, timeout = 4000, color }) {
24 | const id = Random.id();
25 |
26 | commit('addMessage', {
27 | id, text, timeout, color,
28 | });
29 |
30 | setTimeout(() => {
31 | commit('removeMessage', { id });
32 | }, timeout);
33 | return id;
34 | },
35 | removeNotification({ commit }, { id }) {
36 | commit('removeMessage', { id });
37 | },
38 | },
39 | };
40 |
--------------------------------------------------------------------------------
/src/app/features/auth/routes.js:
--------------------------------------------------------------------------------
1 | import config from './config';
2 |
3 | const redirectRoutes = [
4 | {
5 | path: '/login',
6 | name: 'login',
7 | component: () => import('./pages/Login.vue'),
8 | meta: { isPublic: true },
9 | },
10 | {
11 | path: '/registration',
12 | name: 'registration',
13 | component: () => import('./pages/Registration.vue'),
14 | meta: { isPublic: true },
15 | },
16 | {
17 | path: '/forgot-password',
18 | name: 'forgot-password',
19 | component: () => import('./pages/ForgotPassword.vue'),
20 | meta: { isPublic: true },
21 | },
22 | {
23 | path: '/reset-password',
24 | name: 'reset-password',
25 | component: () => import('./pages/ResetPassword.vue'),
26 | meta: { isPublic: true },
27 | },
28 | {
29 | path: '/verify-email',
30 | name: 'verify-email',
31 | component: () => import('./pages/VerifyEmail.vue'),
32 | meta: { isPublic: true },
33 | },
34 | ];
35 |
36 | export default config.gatewayMode === 'redirect' ? redirectRoutes : [];
37 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "meteor-vue-boilerplate",
3 | "version": "0.0.1",
4 | "description": "A boilerplate for Meteor + Vue",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "cd src && npm start",
8 | "install": "cd src && meteor npm install",
9 | "build": "cd src && meteor build --directory ../ && cd ../bundle/programs/server && npm install",
10 | "lint": "cd src && npm run lint",
11 | "pretest": "cd src && npm run pretest",
12 | "test": "echo \"Error: no test specified\" && exit 1"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/chris-visser/meteor-vue-boilerplate.git"
17 | },
18 | "keywords": [
19 | "meteor",
20 | "vue",
21 | "boilerplate"
22 | ],
23 | "author": "Chris Visser - Cloudspider",
24 | "license": "ISC",
25 | "bugs": {
26 | "url": "https://github.com/chris-visser/meteor-vue-boilerplate/issues"
27 | },
28 | "homepage": "https://github.com/chris-visser/meteor-vue-boilerplate#readme",
29 | "devDependencies": {},
30 | "dependencies": {}
31 | }
32 |
--------------------------------------------------------------------------------
/src/app/features/notifications/components/NotificationsToast.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 | {{ message.text }}
15 |
16 |
17 |
18 |
19 |
33 |
34 |
47 |
--------------------------------------------------------------------------------
/src/.meteor/packages:
--------------------------------------------------------------------------------
1 | # Meteor packages used by this project, one per line.
2 | # Check this file (and the other files in this directory) into your repository.
3 | #
4 | # 'meteor add' and 'meteor remove' will edit this file for you,
5 | # but you can also edit it by hand.
6 |
7 | meteor@1.9.2 # Shared foundation for all Meteor packages
8 | static-html # Define static page content in .html files
9 | standard-minifier-css@1.5.2 # CSS minifier run for production mode
10 | standard-minifier-js@2.4.0 # JS minifier run for production mode
11 | es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers
12 | ecmascript@0.12.3 # Enable ECMAScript2015+ syntax in app code
13 | shell-server@0.4.0 # Server-side component of the `meteor shell` command
14 | webapp@1.7.1 # Serves a Meteor app over HTTP
15 | server-render@0.3.1 # Support for server-side rendering
16 | tracker
17 | akryum:vue-stylus
18 | akryum:vue-component
19 | accounts-base
20 | accounts-password
21 | alanning:roles
22 | email
23 | mizzao:user-status
24 |
--------------------------------------------------------------------------------
/src/app/features/todos/api/methods.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Roles } from 'meteor/alanning:roles';
3 | import Todos from './collections';
4 |
5 | Meteor.methods({
6 | removeTodo({ _id }) {
7 | if (!Roles.userIsInRole(this.userId, ['owner', 'admin', 'todos-admin'])) {
8 | throw new Meteor.Error('not-allowed', 'You are not allowed to remove users');
9 | }
10 |
11 | if (!Todos.findOne(_id)) {
12 | throw new Meteor.Error('not-found', `Todo item with id ${_id} does not exist.`);
13 | }
14 |
15 | Todos.remove(_id);
16 | },
17 | addTodo({ title, description }) {
18 | if (!Roles.userIsInRole(this.userId, ['owner', 'admin', 'todos-admin'])) {
19 | throw new Meteor.Error('not-allowed', 'You are not allowed to remove users');
20 | }
21 |
22 | if (Todos.findOne({ title })) {
23 | throw new Meteor.Error('exists', `There is already a todo item with title: ${title}.`);
24 | }
25 |
26 | Todos.insert({
27 | title,
28 | description,
29 | createdAt: new Date(),
30 | isDone: false,
31 | });
32 | },
33 | });
34 |
--------------------------------------------------------------------------------
/src/app/components/TheNavigation.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
13 | {{item.icon}}
14 |
15 |
16 | {{item.title}}
17 |
18 |
19 |
20 |
21 |
22 |
23 |
47 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/GatewayModal.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
43 |
--------------------------------------------------------------------------------
/src/app/core/app.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import { sync } from 'vuex-router-sync';
3 |
4 | import '../plugins';
5 | import '../filters';
6 |
7 | import createStore from './store';
8 | import createRouter from './router';
9 |
10 | import Root from '../Root.vue';
11 |
12 | const hyphenToCamel = str => str.replace(/-([a-z])/g, chunk => chunk[1].toUpperCase());
13 |
14 | /**
15 | * This function is called on both client and server
16 | * @returns {{app, router, store}}
17 | */
18 | function createApp() {
19 | const router = createRouter();
20 | const store = createStore();
21 |
22 |
23 | router.beforeEach(({ query }, from, next) => {
24 | if (query.action) {
25 | store.dispatch(hyphenToCamel(query.action), query);
26 | router.replace({ query: {} });
27 | }
28 |
29 | next();
30 | });
31 |
32 |
33 | const app = new Vue({
34 | el: '#app', // Mount to the #app element
35 | router,
36 | store,
37 | ...Root, // Connect the Root Vue component
38 | });
39 |
40 | // sync the router with the vuex store.
41 | // this registers `store.state.route`
42 | sync(store, router);
43 |
44 | return {
45 | app,
46 | router,
47 | store,
48 | };
49 | }
50 |
51 | export default createApp;
52 |
--------------------------------------------------------------------------------
/src/app/layouts/AdminLayout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
29 |
30 |
44 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "meteor-vue-blog",
3 | "private": true,
4 | "scripts": {
5 | "start": "meteor run --settings settings.json",
6 | "lint": "eslint . --fix",
7 | "pretest": "npm run lint --silent",
8 | "test": "meteor test --once --driver-package meteortesting:mocha",
9 | "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha",
10 | "visualize": "meteor --production --extra-packages bundle-visualizer",
11 | "preinstall": "if ! type \"meteor\"; then curl https://install.meteor.com/ | sh; fi"
12 | },
13 | "dependencies": {
14 | "@babel/runtime": "^7.0.0",
15 | "bcrypt": "^3.0.3",
16 | "meteor-node-stubs": "^0.4.1",
17 | "moment": "^2.22.2",
18 | "vee-validate": "^2.1.5",
19 | "vue": "^2.5.17",
20 | "vue-meteor-tracker": "^2.0.0-beta.4",
21 | "vue-observe-visibility": "^0.4.3",
22 | "vue-router": "^3.0.1",
23 | "vue-router-sync": "^0.1.0",
24 | "vue-supply": "^0.3.0",
25 | "vuetify": "^1.4.0",
26 | "vuex": "^3.0.1",
27 | "vuex-router-sync": "^5.0.0"
28 | },
29 | "meteor": {
30 | "mainModule": {
31 | "client": "./client.js",
32 | "server": "./server.js"
33 | }
34 | },
35 | "devDependencies": {
36 | "@meteorjs/eslint-config-meteor": "^1.0.5",
37 | "babel-eslint": "^10.0.1",
38 | "eslint": "^5.11.1",
39 | "eslint-config-airbnb": "^17.1.0",
40 | "eslint-config-standard": "^12.0.0",
41 | "eslint-import-resolver-meteor": "^0.4.0",
42 | "eslint-plugin-import": "^2.14.0",
43 | "eslint-plugin-jsx-a11y": "^6.1.2",
44 | "eslint-plugin-meteor": "^5.1.0",
45 | "eslint-plugin-node": "^8.0.0",
46 | "eslint-plugin-promise": "^4.0.1",
47 | "eslint-plugin-react": "^7.12.2",
48 | "eslint-plugin-standard": "^4.0.0"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/app/features/auth/api/config.js:
--------------------------------------------------------------------------------
1 | import { Accounts } from 'meteor/accounts-base';
2 | import { Meteor } from 'meteor/meteor';
3 | /* eslint no-console: off */
4 | const authConfig = Meteor.settings.public.auth || {};
5 |
6 | /**
7 | * Generates a link based on a modal based gateway or a redirect based
8 | * @param token
9 | * @param action
10 | * @returns {string}
11 | */
12 | const generateLink = (token, action) => {
13 | if (authConfig.gatewayMode === 'redirect') {
14 | return `${Meteor.absoluteUrl()}${action}?token=${token}`;
15 | }
16 |
17 | return `${Meteor.absoluteUrl()}?modal=${action}&token=${token}`;
18 | };
19 |
20 | Accounts.config({
21 | sendVerificationEmail: true,
22 | });
23 |
24 | Accounts.emailTemplates.siteName = 'Cloudspider - Admin';
25 | Accounts.emailTemplates.from = 'Cloudspider Admin ';
26 |
27 | Accounts.emailTemplates.enrollAccount.subject = user => `Welcome to The admin area, ${user.profile.name}`;
28 |
29 | Accounts.emailTemplates.enrollAccount.text = (user, url) => `${'You have been invited to the Cloudspider admin dashboard!'
30 | + ' To activate your account, simply click the link below:\n\n'}${
31 | url}`;
32 |
33 | Accounts.emailTemplates.resetPassword.text = (user) => {
34 | const { token } = user.services.password.reset;
35 | const url = generateLink(token, 'reset-password');
36 | console.log(url);
37 | return `Hello,\n\nTo reset your password, simply click the link below.\n\n${url}\n\nGood luck!`;
38 | };
39 | Accounts.emailTemplates.verifyEmail = {
40 | subject() {
41 | return 'Activate your account now!';
42 | },
43 | text(user) {
44 | const url = `${Meteor.absoluteUrl()}?action=verify-email&token=${user.services.email.verificationTokens[0].token}`;
45 | console.log(url);
46 | return `Hey ${user.profile.displayName}! Verify your e-mail by following this link: ${url}`;
47 | },
48 | };
49 |
--------------------------------------------------------------------------------
/src/.meteor/versions:
--------------------------------------------------------------------------------
1 | accounts-base@1.4.3
2 | accounts-password@1.5.1
3 | akryum:vue-component@0.14.3
4 | akryum:vue-component-dev-client@0.4.5
5 | akryum:vue-component-dev-server@0.1.3
6 | akryum:vue-stylus@0.1.1
7 | alanning:roles@1.2.16
8 | allow-deny@1.1.0
9 | autoupdate@1.5.0
10 | babel-compiler@7.2.4
11 | babel-runtime@1.3.0
12 | base64@1.0.11
13 | binary-heap@1.0.11
14 | blaze-tools@1.0.10
15 | boilerplate-generator@1.6.0
16 | caching-compiler@1.2.1
17 | caching-html-compiler@1.1.3
18 | callback-hook@1.1.0
19 | check@1.3.1
20 | coffeescript@2.3.2_1
21 | coffeescript-compiler@2.3.2_1
22 | ddp@1.4.0
23 | ddp-client@2.3.3
24 | ddp-common@1.4.0
25 | ddp-rate-limiter@1.0.7
26 | ddp-server@2.2.0
27 | deps@1.0.12
28 | diff-sequence@1.1.1
29 | dynamic-import@0.5.1
30 | ecmascript@0.12.4
31 | ecmascript-runtime@0.7.0
32 | ecmascript-runtime-client@0.8.0
33 | ecmascript-runtime-server@0.7.1
34 | ejson@1.1.0
35 | email@1.2.3
36 | es5-shim@4.8.0
37 | fetch@0.1.0
38 | geojson-utils@1.0.10
39 | html-tools@1.0.11
40 | htmljs@1.0.11
41 | http@1.4.2
42 | id-map@1.1.0
43 | inter-process-messaging@0.1.0
44 | localstorage@1.2.0
45 | logging@1.1.20
46 | meteor@1.9.2
47 | minifier-css@1.4.1
48 | minifier-js@2.4.0
49 | minimongo@1.4.5
50 | mizzao:timesync@0.5.0
51 | mizzao:user-status@0.6.8
52 | modern-browsers@0.1.3
53 | modules@0.13.0
54 | modules-runtime@0.10.3
55 | mongo@1.6.0
56 | mongo-decimal@0.1.0
57 | mongo-dev-server@1.1.0
58 | mongo-id@1.0.7
59 | npm-bcrypt@0.9.3
60 | npm-mongo@3.1.1
61 | ordered-dict@1.1.0
62 | promise@0.11.2
63 | random@1.1.0
64 | rate-limit@1.0.9
65 | reactive-var@1.0.11
66 | reload@1.2.0
67 | retry@1.1.0
68 | routepolicy@1.1.0
69 | server-render@0.3.1
70 | service-configuration@1.0.11
71 | sha@1.0.9
72 | shell-server@0.4.0
73 | socket-stream-client@0.2.2
74 | spacebars-compiler@1.1.3
75 | srp@1.0.12
76 | standard-minifier-css@1.5.2
77 | standard-minifier-js@2.4.0
78 | static-html@1.2.2
79 | templating-tools@1.1.2
80 | tracker@1.2.0
81 | underscore@1.0.10
82 | url@1.2.0
83 | webapp@1.7.2
84 | webapp-hashing@1.0.9
85 |
--------------------------------------------------------------------------------
/src/app/features/notifications/README.md:
--------------------------------------------------------------------------------
1 | # Notifications feature
2 | This feature sends notifications to any user in the form of a [Vuetify snackbar](https://vuetifyjs.com/en/components/snackbars).
3 | It is controlled via the Vuex store and supports multiple messages at the same
4 | time. Also clicking on the snackbar will remove it instantly.
5 |
6 | ## Usage
7 |
8 | In `./src/app/store/index.js` add the following:
9 |
10 | ```javascript
11 | import notifications from '../features/notifications/store';
12 |
13 | export default {
14 | modules: {
15 | notifications,
16 | }
17 | }
18 | ```
19 |
20 | Also add the notifications component on any layout that you require it in. For example in `AdminLayout`:
21 |
22 | ```javascript
23 |
24 |
25 |
26 |
27 |
28 | ```
29 |
30 | Now you can have your components dispatch notifications like this:
31 |
32 | ```javascript
33 | export default {
34 | methods: {
35 | sendNotification() {
36 | this.$store.dispatch('notify', { text: 'Hello World' });
37 | }
38 | }
39 | }
40 | ```
41 |
42 | The notify store action also supports some additional options:
43 |
44 | | Option | Description |
45 | |---------| ------------|
46 | | text | The text of the snackbar message |
47 | | color | Sets the color of the snackbar like on the [Vuetify docs](https://vuetifyjs.com/en/components/snackbars#api) |
48 | | timeout | A custom timeout after which the snackbar should disappear |
49 |
50 | The notify action also returns the `id` of the notification. This allows you to programmatically remove
51 | the notification like this:
52 |
53 | ```javascript
54 | export default {
55 | state: {
56 | userId: null,
57 | notificationId: null,
58 | },
59 |
60 | watch: {
61 | userId() {
62 | if(!this.userId) { // User logs out
63 | this.$store.dispatch('removeNotification', { id: this.notificationId });
64 | }
65 | }
66 | },
67 |
68 | methods: {
69 | sendNotification() {
70 | this.notificationId = this.$store.dispatch('notify', { text: 'Hello World' });
71 | },
72 | }
73 | }
74 | ```
75 |
--------------------------------------------------------------------------------
/src/app/features/todos/components/TodosList.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | {{ props.item.title }}
9 | {{ props.item.description }}
10 | {{ props.item.isDone | boolean }}
11 | {{ props.item.createdAt | date }}
12 |
13 |
14 |
15 |
16 |
17 | delete
18 |
19 |
20 |
21 |
22 |
23 |
24 |
72 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/ForgotPasswordForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Recover password
7 |
8 |
9 | No worries. We got you covered. Just enter your e-mail address and we'll send you an e-mail with a link to
10 | reset your password.
11 |
12 |
13 |
14 |
15 |
16 |
20 |
30 |
31 | {{ error }}
32 |
33 |
39 | {{ status.submitTitle }}
40 |
41 |
42 |
43 |
48 | Back to login.
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
95 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/TheGateway.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 | Please verify your e-mail address. This is required before you can do stuff in this system.
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
77 |
78 |
92 |
--------------------------------------------------------------------------------
/src/app/features/auth/mixins/auth.js:
--------------------------------------------------------------------------------
1 | import config from '../config';
2 |
3 | /**
4 | * This is a function that returns a mixin to allow some additional options to be passed
5 | *
6 | * Based on the component's 'isGateway' or 'isPrivate' setting this mixin will
7 | * redirect the user from and to the login page. This is useful for pages where
8 | * authentication is required. Not setting anything will make this mixin treat
9 | * the page as 'public' and it will never do any redirects
10 | *
11 | * @param {Boolean} [isGateway=false] - Specifies that this is a gateway page.
12 | * Logged in users will be redirected to the mainPage
13 | * @param {Boolean} [isPrivate=false] - Specifies that this is a private page.
14 | * Un-authenticated users will be redirected to the loginPage
15 | * @param {String} [mainPagePath="/"] - Allows for a custom mainPage.
16 | * Logged in users will be redirected to this path
17 | * @param {String} [loginPagePath="/"] - Allows for a custom loginPage.
18 | * Un-authenticated users will be redirected to this path
19 | * @returns {{mounted: function, computed: Object, watch: Object, methods: Object}}
20 | *
21 | * @example
22 | * ```
23 | *
24 | *
25 | * // Admin layout or admin page component
26 | * export default {
27 | * // Direct non-authenticated users to the login
28 | * mixins: [UsersMixin({ isPrivate: true })],
29 | * }
30 | *
31 | * // A public layout or public component
32 | * export default {
33 | * // Direct authenticated users to private section
34 | * mixins: [UsersMixin({ isGateway: true })],
35 | * }
36 | *
37 | * ```
38 | */
39 |
40 |
41 | export default config.gatewayMode !== 'redirect' ? {} : {
42 | computed: {
43 | userDetailsLoaded() {
44 | return this.$store.state.user.userDetailsLoaded;
45 | },
46 | userId() {
47 | return this.$store.state.user.userId;
48 | },
49 | },
50 |
51 | mounted() {
52 | this.trackUser();
53 | },
54 |
55 | watch: {
56 | userDetailsLoaded() {
57 | this.trackUser();
58 | },
59 | },
60 |
61 | methods: {
62 | trackUser() {
63 | // userId is set first, because it comes from the session
64 | // userDetails come from a publication. The time between a userId and when
65 | // details are available is the loading time.
66 | const { isPublic } = this.$route.meta;
67 |
68 | const isLoading = this.userId && !this.userDetailsLoaded;
69 | const shouldRedirectToLogin = !this.userId && !isPublic;
70 | const shouldRedirectToDashboard = (this.userId && this.userDetailsLoaded) && isPublic;
71 | //
72 | if (isLoading) {
73 | // TODO show / trigger loader somehow
74 | } else if (shouldRedirectToLogin) {
75 | this.$router.replace('/login');
76 | } else if (shouldRedirectToDashboard) {
77 | this.$router.replace('/');
78 | }
79 | },
80 | },
81 | };
82 |
--------------------------------------------------------------------------------
/src/app/features/users/components/UserList.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | {{ props.item.displayName }}
9 | {{ props.item.email }}
10 | {{ props.item.online | boolean }}
11 | {{ props.item.verified | boolean }}
12 | {{ props.item.roles | list }}
13 | {{ props.item.createdAt | date }}
14 | {{ props.item.lastSeen | date }}
15 |
16 |
17 |
18 |
19 |
20 | delete
21 |
22 |
23 |
24 |
25 |
26 |
27 |
84 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/ResetPasswordForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Reset your password here
7 |
8 |
9 | Please enter your new password below and you will be good to go! If this was a mistake, simply close this
10 | page or return to the login by clicking the link below the form.
11 |
12 |
13 |
14 |
15 |
16 |
20 |
30 |
39 |
40 | {{ error }}
41 |
42 |
48 | {{ status.submitTitle }}
49 |
50 |
51 |
52 |
57 | Back to login.
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
108 |
--------------------------------------------------------------------------------
/src/app/features/todos/components/TodoForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Create new todo
7 |
8 |
9 |
10 |
11 |
12 |
17 |
27 |
37 |
38 |
39 |
45 | {{ error }}
46 |
47 |
48 |
49 |
56 | {{ status.submitTitle }}
57 |
58 |
59 |
60 |
61 |
62 |
63 |
111 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/LoginForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Cloudspider Admin
7 |
8 |
Welcome! Please login first
9 |
10 |
11 |
12 |
13 |
17 |
27 |
36 |
37 |
43 | {{ error }}
44 |
45 |
46 |
47 |
53 | {{ status.submitTitle }}
54 |
55 |
56 |
57 |
62 | Lost your password? Reset it here!
63 |
64 |
65 |
66 |
71 | Register yourself now!
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
121 |
--------------------------------------------------------------------------------
/src/app/features/auth/components/RegistrationForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 | Registration
10 |
11 |
12 | You can create your new account here.
13 |
14 |
15 |
16 |
17 |
18 |
22 |
32 |
41 |
50 |
59 |
60 |
66 | {{ error }}
67 |
68 |
69 |
70 |
76 | {{ status.submitTitle }}
77 |
78 |
79 |
80 |
85 | Back to the login!
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
140 |
--------------------------------------------------------------------------------
/src/app/features/auth/store/user.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Accounts } from 'meteor/accounts-base';
3 |
4 | /* eslint no-console: off */
5 | export default {
6 | state: {
7 | userId: Meteor.userId(), // On initial load the userId will come from Meteor
8 | email: null,
9 | isEmailVerified: null,
10 | profile: null,
11 | userDetailsLoaded: false,
12 | },
13 | mutations: {
14 | unsetUser(state) {
15 | state.userId = null;
16 | state.email = null;
17 | state.isEmailVerified = null;
18 | state.profile = null;
19 | state.userDetailsLoaded = false;
20 | },
21 | setUser(state, { _id, emails, profile }) {
22 | const { address, verified } = emails && emails[0] ? emails[0] : {};
23 | state.userId = _id;
24 | state.email = address;
25 | state.isEmailVerified = verified;
26 | state.profile = profile;
27 |
28 | // In Meteor the Meteor.userId() can be set while Meteor.user() is still empty
29 | // This is because the Meteor.userId() comes from the session cookie and Meteor.user()
30 | // gets its data from a publication. Each new login of page refresh, the client will
31 | // subscribe to the server and during that time Meteor.user() will be empty
32 | // The userDetailsLoaded will mark that Meteor.user() is filled on 'true'
33 | if (!state.userDetailsLoaded) {
34 | state.userDetailsLoaded = true;
35 | }
36 | },
37 | },
38 | actions: {
39 | register(context, { email, password, profile }) {
40 | return new Promise((resolve, reject) => {
41 | Accounts.createUser({ email, password, profile }, (error, result) => {
42 | if (error) {
43 | console.log(error);
44 | reject(error.reason);
45 | } else {
46 | resolve(result);
47 | }
48 | });
49 | });
50 | },
51 | login(context, { email, password }) {
52 | return new Promise((resolve, reject) => {
53 | Meteor.loginWithPassword(email, password, (error, result) => {
54 | if (error) {
55 | console.log(error);
56 | reject(error.reason);
57 | } else {
58 | resolve(result);
59 | }
60 | });
61 | });
62 | },
63 | logout() {
64 | return new Promise((resolve, reject) => {
65 | Meteor.logout((error, result) => {
66 | if (error) {
67 | console.log(error);
68 | reject(error.reason);
69 | } else {
70 | resolve(result);
71 | }
72 | });
73 | });
74 | },
75 | /**
76 | * Sends a recover email to the given email address
77 | * @param context
78 | * @param email
79 | * @returns {Promise}
80 | */
81 | forgotPassword(context, { email }) {
82 | return new Promise((resolve, reject) => {
83 | Accounts.forgotPassword({ email }, (error, result) => {
84 | if (error) {
85 | console.log(error);
86 | reject(error.reason);
87 | } else {
88 | resolve(result);
89 | }
90 | });
91 | });
92 | },
93 | /**
94 | * When users received a recovery email, they can click a link that contains a token,
95 | * this method will be called with the token and a new password.
96 | * @param context
97 | * @param token
98 | * @param password
99 | * @returns {Promise}
100 | */
101 | resetPassword(context, { token, password }) {
102 | return new Promise((resolve, reject) => {
103 | Accounts.resetPassword(token, password, (error, result) => {
104 | if (error) {
105 | console.log(error);
106 | reject(error.reason);
107 | } else {
108 | resolve(result);
109 | }
110 | });
111 | });
112 | },
113 |
114 | verifyEmail(context, { token }) {
115 | return new Promise((resolve, reject) => {
116 | Accounts.verifyEmail(token, (error, result) => {
117 | if (error) {
118 | reject(error.reason);
119 | } else {
120 | resolve(result);
121 | }
122 | });
123 | });
124 | },
125 | },
126 | };
127 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This is a fully functional admin system in the form of a boilerplate.
2 | It shows how Meteor, Vue and Vuetify make the ideal toolset to create dynamic, modular and
3 | scalable admin systems.
4 |
5 | The code is structured according to Vue and Meteor best practices along with the Vuetify design system (Material).
6 |
7 | - Meteor's account system: Login, Registration, Access Control, Forgot Password
8 | - Feature based structure as best practice for mid size and large apps
9 | - User Management + Roles
10 | - Ability to choose between modal based or redirect based authentication
11 | - Todo Management as CRUD Example (Create Read Update Delete)
12 | - Realtime as the default, static as the option.
13 | - A convenient Vuex controlled messaging system to notify users
14 | - Eslint configured for Meteor + Vue to guard code-style
15 |
16 | ## Getting Started
17 |
18 | Run the below command to install the dependencies.
19 |
20 | >Note that when you don't have a copy of Meteor
21 | installed on you development environment, this will install it automatically for you.
22 |
23 | ```sh
24 | npm install
25 | ```
26 |
27 | Then start the app in development mode:
28 |
29 | ```sh
30 | npm start
31 | ```
32 |
33 | Visit http://localhost:3000 and you are up and running!
34 |
35 | > Optionally you can switch to a modal based authentication flow by setting the 'gatewayMode' in your `./src/settings.json`.
36 |
37 | ### First time visit
38 | On first time visit you will ofcourse have to register a new account. The first account
39 | registered will automatically get 'owner' privileges.
40 |
41 | E-mails are not yet sent at this point. A nice Meteor feature is that when that's the case,
42 | the mail contents end up in your console. This allows you to click on the verification link
43 | from the console.
44 |
45 | To make use of the e-mail system,
46 | [set the MAIL_URL environment variable according to the Meteor docs.](https://docs.meteor.com/api/email.html)
47 |
48 | ## Documentation
49 | The documentation is a continuous work in progress.
50 | The goal is to have it fully documented and maybe have a dedicated guide.
51 |
52 | If you feel that stuff is missing from the docs or have any struggles. Please file an issue here on Github or create a topic on the
53 | [Meteor Forum](https://forums.meteor.com/)!
54 |
55 | Each feature folder has its own README.md that contains a bit more in dept information about
56 | what it does and how its implemented. Feel free to have a look:
57 |
58 | - [The Auth Readme](https://github.com/chris-visser/meteor-vue-admin/blob/master/src/app/features/auth/README.md)
59 | - [The Notifications Readme](https://github.com/chris-visser/meteor-vue-admin/blob/master/src/app/features/notifications/README.md)
60 | - The Users Readme (TODO)
61 | - The Todos Readme (TODO)
62 |
63 | ## TODOs
64 |
65 | - Introduce semver
66 | - Document features, plugins, components.. Maybe creat a guide...
67 | - Implement edit functionality
68 | - Start testing, its not a POC anymore :)
69 | - Make pluggable features via NPM packages
70 |
71 | ## App Directory Structure
72 | The structure of the app follows
73 |
74 | ### components
75 | This folder should contain all the generic Vue components. Right now it only contains
76 | some layout specific components.
77 |
78 | ### core
79 | This folder contains the initialization code that should not have to be changed unless you want to change
80 | the way the app loads its core functionality. Examples of this functionality are the router, store, app initialization and asyncData calls.
81 |
82 | ### Features
83 | Contains all of the system's features as self-contained modules. More info follows..
84 |
85 | ### filters
86 | This is where you put generic [Vue filters](https://vuejs.org/v2/guide/filters.html) that are shared across multiple components. An example would be a standardized
87 | way to format dates.
88 |
89 | ### layouts
90 | Multiple layouts are supported. This is where you add or modify them. If no layout is configured for a page,
91 | the 'admin' layout is loaded. The intention is that you use [Vue Slots](https://vuejs.org/v2/guide/components-slots.html)
92 | to determine where the page is loaded.
93 |
94 | Simply put ` ` on your layout where you want each page to be rendered.
95 |
96 | ### pages
97 | Pages are Vue components that are directly connected to routes.
98 | Only generic pages should go here. They can be added in the `routes.js`.
99 | The page is rendered on a designated spot within the configured layout.
100 |
101 | This folder should not contain the feature specific routes, because they should
102 | be added to the pages folder of the feature itself. For example, the Login page is
103 | located in `./src/app/features/auth/pages`. This one is referenced in `./src/app/features/auth/routes`.
104 |
105 | ### plugins
106 | Put all VueJS plugins here
107 |
108 | ### store
109 | This is the global Vuex store where all of the Vuex store modules are loaded.
110 | The store already adds the `user` and `notifications` feature store modules.
111 |
112 | ### routes.js
113 | Contains the global routes, but also imports feature routes, added with the spread operator.
114 | This allows features to hook into the existing routes list.
115 |
116 | ### config.js
117 | A centralized place where you can initialize global components and other things if needed.
118 | Right now it just initializes the 2 layouts `AdminLayut` and `GatewayLayout`.
119 |
120 | ### index.html
121 |
122 | This index.html allows you to add stuff to the head and body area if needed.
123 | Right now it just contains refs to the Roboto font and the Vuetify styles.
124 |
125 | ## Contribution
126 |
127 | If you found a bug or have a request for a feature, then please open an issue. If you
128 | want to contribute then feel free to fork this repo and file a merge request.
129 |
130 |
--------------------------------------------------------------------------------
/src/app/features/auth/README.md:
--------------------------------------------------------------------------------
1 | # Auth feature
2 | This feature takes care of the whole authentication and authorization part.
3 | It connects Meteor's auth system to Vue using components, mixins and the Vuex Store.
4 |
5 | The system allows 2 types of onboarding: Redirect and Modal based. Both options have
6 | pros and cons which you can read about after the usage part.
7 |
8 | ## Usage
9 |
10 | First we need to add the store module and plugin.
11 |
12 | ```javascript
13 | import user, { plugin as UserPlugin } from '../features/auth/store';
14 |
15 | export default {
16 | plugins: [UserPlugin], // Connects Meteor's reactive user state to the store using Tracker
17 |
18 | modules: {
19 | user,
20 | },
21 | };
22 | ```
23 |
24 | The second step is to include the gateway. The gateway handles which type of onboarding
25 | logic is used based on the "gatewayMode" setting. The only thing you need to do is add
26 | it to the Root.vue file like below:
27 |
28 | ```javascript
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
51 | ```
52 |
53 | The gateway component accepts 2 arguments: adminLayout and publicLayout.
54 | These should be your layout components and they will be loaded whenever they are
55 | needed and depending on the "gatewayMode" setting.
56 |
57 | When gatewayMode is set to "modal", the publicLayout property is optional.
58 |
59 |
60 | ### Redirect based auth
61 |
62 | You can enable redirect based auth via the `./src/settings.json` file like below:
63 |
64 | ```javascript
65 | {
66 | "public": {
67 | "auth": {
68 | "gatewayMode": "redirect"
69 | }
70 | }
71 | }
72 | ```
73 |
74 | This will set the auth gateway to redirect the user from and to the login page. If a page
75 | is not flagged as `isPublic: true` and the user lands un-authenticated on this page, he/she
76 | will automatically be redirected to the `/login` page. The other way round also applies:
77 | Whenever a user logs in from a public page, he/she will be redirected to the `/` (admin).
78 |
79 | Users can navigate to 4 different pages on the gateway:
80 |
81 | - `/login`: The login page
82 | - `/registration`: The registration page
83 | - `/forgot-password`: Allows users to enter a mail which sends them a reset e-mail
84 | - `/reset-password`: Shows a change password form to allow the user to reset his/her password
85 |
86 | ### Pros
87 | - The public layout allows for additional information about the system to be shown.
88 | - Gives a secure feeling, because users go 'trough a wall' to get to the private area.
89 | - Clean URL's
90 |
91 | ### Cons
92 | - No chance to show what's inside
93 | - User steps away from the initially requested page (interrupted workflow)
94 |
95 |
96 | ### Modal based auth
97 |
98 | You can enable the modal based approach in `./src/settings.json` like below:
99 |
100 | ```javascript
101 | {
102 | "public": {
103 | "auth": {
104 | "gatewayMode": "modal"
105 | }
106 | }
107 | }
108 | ```
109 |
110 | Modal based auth will show a modal / dialog with a login screen whenever an un-authenticated use lands
111 | on the system. The modal is controlled via the url. This allows users to directly
112 | navigate to the registration screen.
113 |
114 | Notice that the urls are slightly different from the redirect based approach.
115 | This is because, the user never actually navigates away from the page and therefore its a 'mode' within
116 | this page.
117 |
118 | - `?modal=login`: The login page
119 | - `?modal=registration`: The registration page
120 | - `?modal=forgot-password`: Allows users to enter a mail which sends them a reset e-mail
121 | - `?modal=reset-password`: Shows a change password form to allow the user to reset his/her password
122 |
123 | ### Pros
124 | - User stays on the page he/she initialy requested
125 | - Less layouts to worry about
126 | - Gives hints about what the system is and does, before actually being logged in
127 |
128 | ### Cons
129 | - Might give an insecure feeling to the user (since the private area is visible)
130 |
131 |
132 | ## Functionality guide
133 | A more detailed explanation of where the functionality is and what it does.
134 |
135 | ### The Auth Mixin
136 | The auth mixin will be an empty object or an actual mixin depending on the `gatewayMode` setting
137 | Only when its set to redirect, it will act as a mixin. This mixin ensures
138 | that users will be automatically redirected from and to the 'gateway' depending on there
139 | authenticated state.
140 |
141 | Whenever people log-in or when they land on the system with an active session
142 | (happens on refresh or from an external link), they will be automatically directed
143 | to the index (skipping the gateway).
144 |
145 | ### Registration hook
146 | In the `api` folder is a `hooks.js` file. This file ensures that when the first
147 | user registers, he/she becomes automatically the owner. Owners cannot be removed
148 | from the system using the UI.
149 |
150 | ### Auth related emails
151 | Some procedures require e-mail verification.
152 | An e-mail will be sent to the user with a link that allows them to confirm their action.
153 | When no e-mail configuration is set, the verification e-mail will end up on the
154 | server console allowing a convenient way for a developer to test this flow locally.
155 |
156 | The url in the reset password url in the e-mail is slightly different depending on the selected
157 | `gatewayMode`. In case of "redirect" it will be `/reset-password?token={token}`. In case of "modal"
158 | it will be `?modal=reset-password&token={token}`
159 |
160 | ### User session and the Vuex Store
161 | The user session is kept in the Vuex store which allows other components to work
162 | independently from Meteor's account system. All methods to register, login, logout,
163 | reset a password using a token or to enter a forgot password e-mail are present in
164 | the store.
165 |
166 | The store itself does not update the state. This is done by the store plugin located
167 | in `./store/plugin.js`. This plugin keeps the Meteor user state in sync with the store.
168 | This is done, because Meteor methods might be called directly without using the UI. Another
169 | example is that when an account gets removed by an admin, the account will now automatically
170 | log-out or when an admin changes user information it will automatically update on that user's
171 | screen aswell without the need of a refresh.
172 |
173 | Another feature of the store is the `userDetailsLoaded`. In Meteor, the userId might already
174 | be set, meaning the user is logged in. However, the user subscription
175 | (the one that loads the email and the profile) will at first not be finished. This flag
176 | will indicate that those details are loaded aswell. It is therefore recommended to use
177 | this flag to check if the user is logged in, before you show for example the displayName.
178 |
179 |
180 |
181 |
--------------------------------------------------------------------------------
/src/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "meteor-vue-blog",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@babel/code-frame": {
7 | "version": "7.0.0",
8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
9 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
10 | "dev": true,
11 | "requires": {
12 | "@babel/highlight": "^7.0.0"
13 | }
14 | },
15 | "@babel/generator": {
16 | "version": "7.2.2",
17 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
18 | "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
19 | "dev": true,
20 | "requires": {
21 | "@babel/types": "^7.2.2",
22 | "jsesc": "^2.5.1",
23 | "lodash": "^4.17.10",
24 | "source-map": "^0.5.0",
25 | "trim-right": "^1.0.1"
26 | }
27 | },
28 | "@babel/helper-function-name": {
29 | "version": "7.1.0",
30 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
31 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
32 | "dev": true,
33 | "requires": {
34 | "@babel/helper-get-function-arity": "^7.0.0",
35 | "@babel/template": "^7.1.0",
36 | "@babel/types": "^7.0.0"
37 | }
38 | },
39 | "@babel/helper-get-function-arity": {
40 | "version": "7.0.0",
41 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
42 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
43 | "dev": true,
44 | "requires": {
45 | "@babel/types": "^7.0.0"
46 | }
47 | },
48 | "@babel/helper-split-export-declaration": {
49 | "version": "7.0.0",
50 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
51 | "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
52 | "dev": true,
53 | "requires": {
54 | "@babel/types": "^7.0.0"
55 | }
56 | },
57 | "@babel/highlight": {
58 | "version": "7.0.0",
59 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
60 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
61 | "dev": true,
62 | "requires": {
63 | "chalk": "^2.0.0",
64 | "esutils": "^2.0.2",
65 | "js-tokens": "^4.0.0"
66 | }
67 | },
68 | "@babel/parser": {
69 | "version": "7.2.2",
70 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.2.tgz",
71 | "integrity": "sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA==",
72 | "dev": true
73 | },
74 | "@babel/runtime": {
75 | "version": "7.2.0",
76 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz",
77 | "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==",
78 | "requires": {
79 | "regenerator-runtime": "^0.12.0"
80 | }
81 | },
82 | "@babel/template": {
83 | "version": "7.2.2",
84 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
85 | "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
86 | "dev": true,
87 | "requires": {
88 | "@babel/code-frame": "^7.0.0",
89 | "@babel/parser": "^7.2.2",
90 | "@babel/types": "^7.2.2"
91 | }
92 | },
93 | "@babel/traverse": {
94 | "version": "7.2.2",
95 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.2.tgz",
96 | "integrity": "sha512-E5Bn9FSwHpSkUhthw/XEuvFZxIgrqb9M8cX8j5EUQtrUG5DQUy6bFyl7G7iQ1D1Czudor+xkmp81JbLVVM0Sjg==",
97 | "dev": true,
98 | "requires": {
99 | "@babel/code-frame": "^7.0.0",
100 | "@babel/generator": "^7.2.2",
101 | "@babel/helper-function-name": "^7.1.0",
102 | "@babel/helper-split-export-declaration": "^7.0.0",
103 | "@babel/parser": "^7.2.2",
104 | "@babel/types": "^7.2.2",
105 | "debug": "^4.1.0",
106 | "globals": "^11.1.0",
107 | "lodash": "^4.17.10"
108 | }
109 | },
110 | "@babel/types": {
111 | "version": "7.2.2",
112 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
113 | "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
114 | "dev": true,
115 | "requires": {
116 | "esutils": "^2.0.2",
117 | "lodash": "^4.17.10",
118 | "to-fast-properties": "^2.0.0"
119 | }
120 | },
121 | "@meteorjs/eslint-config-meteor": {
122 | "version": "1.0.5",
123 | "resolved": "https://registry.npmjs.org/@meteorjs/eslint-config-meteor/-/eslint-config-meteor-1.0.5.tgz",
124 | "integrity": "sha1-iMFN+7Si+iJY//SInM2N3Q7MsEs=",
125 | "dev": true
126 | },
127 | "acorn": {
128 | "version": "6.0.5",
129 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
130 | "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==",
131 | "dev": true
132 | },
133 | "acorn-jsx": {
134 | "version": "5.0.1",
135 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
136 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
137 | "dev": true
138 | },
139 | "ajv": {
140 | "version": "6.6.2",
141 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
142 | "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
143 | "dev": true,
144 | "requires": {
145 | "fast-deep-equal": "^2.0.1",
146 | "fast-json-stable-stringify": "^2.0.0",
147 | "json-schema-traverse": "^0.4.1",
148 | "uri-js": "^4.2.2"
149 | }
150 | },
151 | "ansi-escapes": {
152 | "version": "3.1.0",
153 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
154 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
155 | "dev": true
156 | },
157 | "ansi-regex": {
158 | "version": "3.0.0",
159 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
160 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
161 | "dev": true
162 | },
163 | "ansi-styles": {
164 | "version": "3.2.1",
165 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
166 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
167 | "dev": true,
168 | "requires": {
169 | "color-convert": "^1.9.0"
170 | }
171 | },
172 | "argparse": {
173 | "version": "1.0.10",
174 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
175 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
176 | "dev": true,
177 | "requires": {
178 | "sprintf-js": "~1.0.2"
179 | }
180 | },
181 | "aria-query": {
182 | "version": "3.0.0",
183 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
184 | "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
185 | "dev": true,
186 | "requires": {
187 | "ast-types-flow": "0.0.7",
188 | "commander": "^2.11.0"
189 | }
190 | },
191 | "array-includes": {
192 | "version": "3.0.3",
193 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
194 | "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
195 | "dev": true,
196 | "requires": {
197 | "define-properties": "^1.1.2",
198 | "es-abstract": "^1.7.0"
199 | }
200 | },
201 | "ast-types-flow": {
202 | "version": "0.0.7",
203 | "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
204 | "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
205 | "dev": true
206 | },
207 | "astral-regex": {
208 | "version": "1.0.0",
209 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
210 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
211 | "dev": true
212 | },
213 | "axobject-query": {
214 | "version": "2.0.2",
215 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz",
216 | "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==",
217 | "dev": true,
218 | "requires": {
219 | "ast-types-flow": "0.0.7"
220 | }
221 | },
222 | "babel-eslint": {
223 | "version": "10.0.1",
224 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz",
225 | "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==",
226 | "dev": true,
227 | "requires": {
228 | "@babel/code-frame": "^7.0.0",
229 | "@babel/parser": "^7.0.0",
230 | "@babel/traverse": "^7.0.0",
231 | "@babel/types": "^7.0.0",
232 | "eslint-scope": "3.7.1",
233 | "eslint-visitor-keys": "^1.0.0"
234 | }
235 | },
236 | "balanced-match": {
237 | "version": "1.0.0",
238 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
239 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
240 | "dev": true
241 | },
242 | "bcrypt": {
243 | "version": "3.0.3",
244 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.3.tgz",
245 | "integrity": "sha512-4EuzUo6K790QC3uq/ogzy9w2Hc7XDIBoEndU5y7l7YaEAwQF8vyFqv6tC30+gOBZvyxk3F632xzKBQoLNz2pjg==",
246 | "requires": {
247 | "nan": "2.12.1",
248 | "node-pre-gyp": "0.12.0"
249 | },
250 | "dependencies": {
251 | "abbrev": {
252 | "version": "1.1.1",
253 | "bundled": true
254 | },
255 | "ansi-regex": {
256 | "version": "2.1.1",
257 | "bundled": true
258 | },
259 | "aproba": {
260 | "version": "1.2.0",
261 | "bundled": true
262 | },
263 | "are-we-there-yet": {
264 | "version": "1.1.5",
265 | "bundled": true,
266 | "requires": {
267 | "delegates": "^1.0.0",
268 | "readable-stream": "^2.0.6"
269 | }
270 | },
271 | "balanced-match": {
272 | "version": "1.0.0",
273 | "bundled": true
274 | },
275 | "brace-expansion": {
276 | "version": "1.1.11",
277 | "bundled": true,
278 | "requires": {
279 | "balanced-match": "^1.0.0",
280 | "concat-map": "0.0.1"
281 | }
282 | },
283 | "chownr": {
284 | "version": "1.1.1",
285 | "bundled": true
286 | },
287 | "code-point-at": {
288 | "version": "1.1.0",
289 | "bundled": true
290 | },
291 | "concat-map": {
292 | "version": "0.0.1",
293 | "bundled": true
294 | },
295 | "console-control-strings": {
296 | "version": "1.1.0",
297 | "bundled": true
298 | },
299 | "core-util-is": {
300 | "version": "1.0.2",
301 | "bundled": true
302 | },
303 | "debug": {
304 | "version": "2.6.9",
305 | "bundled": true,
306 | "requires": {
307 | "ms": "2.0.0"
308 | }
309 | },
310 | "deep-extend": {
311 | "version": "0.6.0",
312 | "bundled": true
313 | },
314 | "delegates": {
315 | "version": "1.0.0",
316 | "bundled": true
317 | },
318 | "detect-libc": {
319 | "version": "1.0.3",
320 | "bundled": true
321 | },
322 | "fs-minipass": {
323 | "version": "1.2.5",
324 | "bundled": true,
325 | "requires": {
326 | "minipass": "^2.2.1"
327 | }
328 | },
329 | "fs.realpath": {
330 | "version": "1.0.0",
331 | "bundled": true
332 | },
333 | "gauge": {
334 | "version": "2.7.4",
335 | "bundled": true,
336 | "requires": {
337 | "aproba": "^1.0.3",
338 | "console-control-strings": "^1.0.0",
339 | "has-unicode": "^2.0.0",
340 | "object-assign": "^4.1.0",
341 | "signal-exit": "^3.0.0",
342 | "string-width": "^1.0.1",
343 | "strip-ansi": "^3.0.1",
344 | "wide-align": "^1.1.0"
345 | }
346 | },
347 | "glob": {
348 | "version": "7.1.2",
349 | "bundled": true,
350 | "requires": {
351 | "fs.realpath": "^1.0.0",
352 | "inflight": "^1.0.4",
353 | "inherits": "2",
354 | "minimatch": "^3.0.4",
355 | "once": "^1.3.0",
356 | "path-is-absolute": "^1.0.0"
357 | }
358 | },
359 | "has-unicode": {
360 | "version": "2.0.1",
361 | "bundled": true
362 | },
363 | "iconv-lite": {
364 | "version": "0.4.24",
365 | "bundled": true,
366 | "requires": {
367 | "safer-buffer": ">= 2.1.2 < 3"
368 | }
369 | },
370 | "ignore-walk": {
371 | "version": "3.0.1",
372 | "bundled": true,
373 | "requires": {
374 | "minimatch": "^3.0.4"
375 | }
376 | },
377 | "inflight": {
378 | "version": "1.0.6",
379 | "bundled": true,
380 | "requires": {
381 | "once": "^1.3.0",
382 | "wrappy": "1"
383 | }
384 | },
385 | "inherits": {
386 | "version": "2.0.3",
387 | "bundled": true
388 | },
389 | "ini": {
390 | "version": "1.3.5",
391 | "bundled": true
392 | },
393 | "is-fullwidth-code-point": {
394 | "version": "1.0.0",
395 | "bundled": true,
396 | "requires": {
397 | "number-is-nan": "^1.0.0"
398 | }
399 | },
400 | "isarray": {
401 | "version": "1.0.0",
402 | "bundled": true
403 | },
404 | "minimatch": {
405 | "version": "3.0.4",
406 | "bundled": true,
407 | "requires": {
408 | "brace-expansion": "^1.1.7"
409 | }
410 | },
411 | "minimist": {
412 | "version": "0.0.8",
413 | "bundled": true
414 | },
415 | "minipass": {
416 | "version": "2.3.4",
417 | "bundled": true,
418 | "requires": {
419 | "safe-buffer": "^5.1.2",
420 | "yallist": "^3.0.0"
421 | },
422 | "dependencies": {
423 | "safe-buffer": {
424 | "version": "5.1.2",
425 | "bundled": true
426 | },
427 | "yallist": {
428 | "version": "3.0.2",
429 | "bundled": true
430 | }
431 | }
432 | },
433 | "minizlib": {
434 | "version": "1.1.1",
435 | "bundled": true,
436 | "requires": {
437 | "minipass": "^2.2.1"
438 | }
439 | },
440 | "mkdirp": {
441 | "version": "0.5.1",
442 | "bundled": true,
443 | "requires": {
444 | "minimist": "0.0.8"
445 | }
446 | },
447 | "ms": {
448 | "version": "2.0.0",
449 | "bundled": true
450 | },
451 | "needle": {
452 | "version": "2.2.4",
453 | "bundled": true,
454 | "requires": {
455 | "debug": "^2.1.2",
456 | "iconv-lite": "^0.4.4",
457 | "sax": "^1.2.4"
458 | }
459 | },
460 | "node-pre-gyp": {
461 | "version": "0.12.0",
462 | "bundled": true,
463 | "requires": {
464 | "detect-libc": "^1.0.2",
465 | "mkdirp": "^0.5.1",
466 | "needle": "^2.2.1",
467 | "nopt": "^4.0.1",
468 | "npm-packlist": "^1.1.6",
469 | "npmlog": "^4.0.2",
470 | "rc": "^1.2.7",
471 | "rimraf": "^2.6.1",
472 | "semver": "^5.3.0",
473 | "tar": "^4"
474 | }
475 | },
476 | "nopt": {
477 | "version": "4.0.1",
478 | "bundled": true,
479 | "requires": {
480 | "abbrev": "1",
481 | "osenv": "^0.1.4"
482 | }
483 | },
484 | "npm-bundled": {
485 | "version": "1.0.5",
486 | "bundled": true
487 | },
488 | "npm-packlist": {
489 | "version": "1.1.12",
490 | "bundled": true,
491 | "requires": {
492 | "ignore-walk": "^3.0.1",
493 | "npm-bundled": "^1.0.1"
494 | }
495 | },
496 | "npmlog": {
497 | "version": "4.1.2",
498 | "bundled": true,
499 | "requires": {
500 | "are-we-there-yet": "~1.1.2",
501 | "console-control-strings": "~1.1.0",
502 | "gauge": "~2.7.3",
503 | "set-blocking": "~2.0.0"
504 | }
505 | },
506 | "number-is-nan": {
507 | "version": "1.0.1",
508 | "bundled": true
509 | },
510 | "object-assign": {
511 | "version": "4.1.1",
512 | "bundled": true
513 | },
514 | "once": {
515 | "version": "1.4.0",
516 | "bundled": true,
517 | "requires": {
518 | "wrappy": "1"
519 | }
520 | },
521 | "os-homedir": {
522 | "version": "1.0.2",
523 | "bundled": true
524 | },
525 | "os-tmpdir": {
526 | "version": "1.0.2",
527 | "bundled": true
528 | },
529 | "osenv": {
530 | "version": "0.1.5",
531 | "bundled": true,
532 | "requires": {
533 | "os-homedir": "^1.0.0",
534 | "os-tmpdir": "^1.0.0"
535 | }
536 | },
537 | "path-is-absolute": {
538 | "version": "1.0.1",
539 | "bundled": true
540 | },
541 | "process-nextick-args": {
542 | "version": "2.0.0",
543 | "bundled": true
544 | },
545 | "rc": {
546 | "version": "1.2.8",
547 | "bundled": true,
548 | "requires": {
549 | "deep-extend": "^0.6.0",
550 | "ini": "~1.3.0",
551 | "minimist": "^1.2.0",
552 | "strip-json-comments": "~2.0.1"
553 | },
554 | "dependencies": {
555 | "minimist": {
556 | "version": "1.2.0",
557 | "bundled": true
558 | }
559 | }
560 | },
561 | "readable-stream": {
562 | "version": "2.3.5",
563 | "bundled": true,
564 | "requires": {
565 | "core-util-is": "~1.0.0",
566 | "inherits": "~2.0.3",
567 | "isarray": "~1.0.0",
568 | "process-nextick-args": "~2.0.0",
569 | "safe-buffer": "~5.1.1",
570 | "string_decoder": "~1.0.3",
571 | "util-deprecate": "~1.0.1"
572 | }
573 | },
574 | "rimraf": {
575 | "version": "2.6.2",
576 | "bundled": true,
577 | "requires": {
578 | "glob": "^7.0.5"
579 | }
580 | },
581 | "safe-buffer": {
582 | "version": "5.1.1",
583 | "bundled": true
584 | },
585 | "safer-buffer": {
586 | "version": "2.1.2",
587 | "bundled": true
588 | },
589 | "sax": {
590 | "version": "1.2.4",
591 | "bundled": true
592 | },
593 | "semver": {
594 | "version": "5.6.0",
595 | "bundled": true
596 | },
597 | "set-blocking": {
598 | "version": "2.0.0",
599 | "bundled": true
600 | },
601 | "signal-exit": {
602 | "version": "3.0.2",
603 | "bundled": true
604 | },
605 | "string-width": {
606 | "version": "1.0.2",
607 | "bundled": true,
608 | "requires": {
609 | "code-point-at": "^1.0.0",
610 | "is-fullwidth-code-point": "^1.0.0",
611 | "strip-ansi": "^3.0.0"
612 | }
613 | },
614 | "string_decoder": {
615 | "version": "1.0.3",
616 | "bundled": true,
617 | "requires": {
618 | "safe-buffer": "~5.1.0"
619 | }
620 | },
621 | "strip-ansi": {
622 | "version": "3.0.1",
623 | "bundled": true,
624 | "requires": {
625 | "ansi-regex": "^2.0.0"
626 | }
627 | },
628 | "strip-json-comments": {
629 | "version": "2.0.1",
630 | "bundled": true
631 | },
632 | "tar": {
633 | "version": "4.4.8",
634 | "bundled": true,
635 | "requires": {
636 | "chownr": "^1.1.1",
637 | "fs-minipass": "^1.2.5",
638 | "minipass": "^2.3.4",
639 | "minizlib": "^1.1.1",
640 | "mkdirp": "^0.5.0",
641 | "safe-buffer": "^5.1.2",
642 | "yallist": "^3.0.2"
643 | },
644 | "dependencies": {
645 | "safe-buffer": {
646 | "version": "5.1.2",
647 | "bundled": true
648 | },
649 | "yallist": {
650 | "version": "3.0.2",
651 | "bundled": true
652 | }
653 | }
654 | },
655 | "util-deprecate": {
656 | "version": "1.0.2",
657 | "bundled": true
658 | },
659 | "wide-align": {
660 | "version": "1.1.3",
661 | "bundled": true,
662 | "requires": {
663 | "string-width": "^1.0.2 || 2"
664 | }
665 | },
666 | "wrappy": {
667 | "version": "1.0.2",
668 | "bundled": true
669 | }
670 | }
671 | },
672 | "brace-expansion": {
673 | "version": "1.1.11",
674 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
675 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
676 | "dev": true,
677 | "requires": {
678 | "balanced-match": "^1.0.0",
679 | "concat-map": "0.0.1"
680 | }
681 | },
682 | "builtin-modules": {
683 | "version": "1.1.1",
684 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
685 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
686 | "dev": true
687 | },
688 | "caller-path": {
689 | "version": "0.1.0",
690 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
691 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
692 | "dev": true,
693 | "requires": {
694 | "callsites": "^0.2.0"
695 | }
696 | },
697 | "callsites": {
698 | "version": "0.2.0",
699 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
700 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
701 | "dev": true
702 | },
703 | "chalk": {
704 | "version": "2.4.1",
705 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
706 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
707 | "dev": true,
708 | "requires": {
709 | "ansi-styles": "^3.2.1",
710 | "escape-string-regexp": "^1.0.5",
711 | "supports-color": "^5.3.0"
712 | }
713 | },
714 | "chardet": {
715 | "version": "0.7.0",
716 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
717 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
718 | "dev": true
719 | },
720 | "circular-json": {
721 | "version": "0.3.3",
722 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
723 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
724 | "dev": true
725 | },
726 | "cli-cursor": {
727 | "version": "2.1.0",
728 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
729 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
730 | "dev": true,
731 | "requires": {
732 | "restore-cursor": "^2.0.0"
733 | }
734 | },
735 | "cli-width": {
736 | "version": "2.2.0",
737 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
738 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
739 | "dev": true
740 | },
741 | "color-convert": {
742 | "version": "1.9.3",
743 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
744 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
745 | "dev": true,
746 | "requires": {
747 | "color-name": "1.1.3"
748 | }
749 | },
750 | "color-name": {
751 | "version": "1.1.3",
752 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
753 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
754 | "dev": true
755 | },
756 | "commander": {
757 | "version": "2.19.0",
758 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
759 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
760 | "dev": true
761 | },
762 | "concat-map": {
763 | "version": "0.0.1",
764 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
765 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
766 | "dev": true
767 | },
768 | "contains-path": {
769 | "version": "0.1.0",
770 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
771 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
772 | "dev": true
773 | },
774 | "cross-spawn": {
775 | "version": "6.0.5",
776 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
777 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
778 | "dev": true,
779 | "requires": {
780 | "nice-try": "^1.0.4",
781 | "path-key": "^2.0.1",
782 | "semver": "^5.5.0",
783 | "shebang-command": "^1.2.0",
784 | "which": "^1.2.9"
785 | }
786 | },
787 | "damerau-levenshtein": {
788 | "version": "1.0.4",
789 | "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz",
790 | "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=",
791 | "dev": true
792 | },
793 | "debug": {
794 | "version": "4.1.0",
795 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
796 | "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
797 | "dev": true,
798 | "requires": {
799 | "ms": "^2.1.1"
800 | }
801 | },
802 | "deep-is": {
803 | "version": "0.1.3",
804 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
805 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
806 | "dev": true
807 | },
808 | "define-properties": {
809 | "version": "1.1.3",
810 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
811 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
812 | "dev": true,
813 | "requires": {
814 | "object-keys": "^1.0.12"
815 | }
816 | },
817 | "doctrine": {
818 | "version": "2.1.0",
819 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
820 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
821 | "dev": true,
822 | "requires": {
823 | "esutils": "^2.0.2"
824 | }
825 | },
826 | "emoji-regex": {
827 | "version": "6.5.1",
828 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz",
829 | "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==",
830 | "dev": true
831 | },
832 | "error-ex": {
833 | "version": "1.3.2",
834 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
835 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
836 | "dev": true,
837 | "requires": {
838 | "is-arrayish": "^0.2.1"
839 | }
840 | },
841 | "es-abstract": {
842 | "version": "1.12.0",
843 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
844 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
845 | "dev": true,
846 | "requires": {
847 | "es-to-primitive": "^1.1.1",
848 | "function-bind": "^1.1.1",
849 | "has": "^1.0.1",
850 | "is-callable": "^1.1.3",
851 | "is-regex": "^1.0.4"
852 | }
853 | },
854 | "es-to-primitive": {
855 | "version": "1.2.0",
856 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
857 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
858 | "dev": true,
859 | "requires": {
860 | "is-callable": "^1.1.4",
861 | "is-date-object": "^1.0.1",
862 | "is-symbol": "^1.0.2"
863 | }
864 | },
865 | "escape-string-regexp": {
866 | "version": "1.0.5",
867 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
868 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
869 | "dev": true
870 | },
871 | "eslint": {
872 | "version": "5.11.1",
873 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz",
874 | "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==",
875 | "dev": true,
876 | "requires": {
877 | "@babel/code-frame": "^7.0.0",
878 | "ajv": "^6.5.3",
879 | "chalk": "^2.1.0",
880 | "cross-spawn": "^6.0.5",
881 | "debug": "^4.0.1",
882 | "doctrine": "^2.1.0",
883 | "eslint-scope": "^4.0.0",
884 | "eslint-utils": "^1.3.1",
885 | "eslint-visitor-keys": "^1.0.0",
886 | "espree": "^5.0.0",
887 | "esquery": "^1.0.1",
888 | "esutils": "^2.0.2",
889 | "file-entry-cache": "^2.0.0",
890 | "functional-red-black-tree": "^1.0.1",
891 | "glob": "^7.1.2",
892 | "globals": "^11.7.0",
893 | "ignore": "^4.0.6",
894 | "imurmurhash": "^0.1.4",
895 | "inquirer": "^6.1.0",
896 | "js-yaml": "^3.12.0",
897 | "json-stable-stringify-without-jsonify": "^1.0.1",
898 | "levn": "^0.3.0",
899 | "lodash": "^4.17.5",
900 | "minimatch": "^3.0.4",
901 | "mkdirp": "^0.5.1",
902 | "natural-compare": "^1.4.0",
903 | "optionator": "^0.8.2",
904 | "path-is-inside": "^1.0.2",
905 | "pluralize": "^7.0.0",
906 | "progress": "^2.0.0",
907 | "regexpp": "^2.0.1",
908 | "require-uncached": "^1.0.3",
909 | "semver": "^5.5.1",
910 | "strip-ansi": "^4.0.0",
911 | "strip-json-comments": "^2.0.1",
912 | "table": "^5.0.2",
913 | "text-table": "^0.2.0"
914 | },
915 | "dependencies": {
916 | "eslint-scope": {
917 | "version": "4.0.0",
918 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
919 | "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
920 | "dev": true,
921 | "requires": {
922 | "esrecurse": "^4.1.0",
923 | "estraverse": "^4.1.1"
924 | }
925 | }
926 | }
927 | },
928 | "eslint-config-airbnb": {
929 | "version": "17.1.0",
930 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz",
931 | "integrity": "sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw==",
932 | "dev": true,
933 | "requires": {
934 | "eslint-config-airbnb-base": "^13.1.0",
935 | "object.assign": "^4.1.0",
936 | "object.entries": "^1.0.4"
937 | }
938 | },
939 | "eslint-config-airbnb-base": {
940 | "version": "13.1.0",
941 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz",
942 | "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==",
943 | "dev": true,
944 | "requires": {
945 | "eslint-restricted-globals": "^0.1.1",
946 | "object.assign": "^4.1.0",
947 | "object.entries": "^1.0.4"
948 | }
949 | },
950 | "eslint-config-standard": {
951 | "version": "12.0.0",
952 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz",
953 | "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==",
954 | "dev": true
955 | },
956 | "eslint-import-resolver-meteor": {
957 | "version": "0.4.0",
958 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-meteor/-/eslint-import-resolver-meteor-0.4.0.tgz",
959 | "integrity": "sha1-yGhjhAghIIz4EzxczlGQnCamFWk=",
960 | "dev": true,
961 | "requires": {
962 | "object-assign": "^4.0.1",
963 | "resolve": "^1.1.6"
964 | }
965 | },
966 | "eslint-import-resolver-node": {
967 | "version": "0.3.2",
968 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
969 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
970 | "dev": true,
971 | "requires": {
972 | "debug": "^2.6.9",
973 | "resolve": "^1.5.0"
974 | },
975 | "dependencies": {
976 | "debug": {
977 | "version": "2.6.9",
978 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
979 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
980 | "dev": true,
981 | "requires": {
982 | "ms": "2.0.0"
983 | }
984 | },
985 | "ms": {
986 | "version": "2.0.0",
987 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
988 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
989 | "dev": true
990 | }
991 | }
992 | },
993 | "eslint-module-utils": {
994 | "version": "2.2.0",
995 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
996 | "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
997 | "dev": true,
998 | "requires": {
999 | "debug": "^2.6.8",
1000 | "pkg-dir": "^1.0.0"
1001 | },
1002 | "dependencies": {
1003 | "debug": {
1004 | "version": "2.6.9",
1005 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1006 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1007 | "dev": true,
1008 | "requires": {
1009 | "ms": "2.0.0"
1010 | }
1011 | },
1012 | "ms": {
1013 | "version": "2.0.0",
1014 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1015 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1016 | "dev": true
1017 | }
1018 | }
1019 | },
1020 | "eslint-plugin-es": {
1021 | "version": "1.4.0",
1022 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz",
1023 | "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==",
1024 | "dev": true,
1025 | "requires": {
1026 | "eslint-utils": "^1.3.0",
1027 | "regexpp": "^2.0.1"
1028 | }
1029 | },
1030 | "eslint-plugin-import": {
1031 | "version": "2.14.0",
1032 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz",
1033 | "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==",
1034 | "dev": true,
1035 | "requires": {
1036 | "contains-path": "^0.1.0",
1037 | "debug": "^2.6.8",
1038 | "doctrine": "1.5.0",
1039 | "eslint-import-resolver-node": "^0.3.1",
1040 | "eslint-module-utils": "^2.2.0",
1041 | "has": "^1.0.1",
1042 | "lodash": "^4.17.4",
1043 | "minimatch": "^3.0.3",
1044 | "read-pkg-up": "^2.0.0",
1045 | "resolve": "^1.6.0"
1046 | },
1047 | "dependencies": {
1048 | "debug": {
1049 | "version": "2.6.9",
1050 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1051 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1052 | "dev": true,
1053 | "requires": {
1054 | "ms": "2.0.0"
1055 | }
1056 | },
1057 | "doctrine": {
1058 | "version": "1.5.0",
1059 | "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
1060 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
1061 | "dev": true,
1062 | "requires": {
1063 | "esutils": "^2.0.2",
1064 | "isarray": "^1.0.0"
1065 | }
1066 | },
1067 | "ms": {
1068 | "version": "2.0.0",
1069 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1070 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1071 | "dev": true
1072 | }
1073 | }
1074 | },
1075 | "eslint-plugin-jsx-a11y": {
1076 | "version": "6.1.2",
1077 | "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz",
1078 | "integrity": "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==",
1079 | "dev": true,
1080 | "requires": {
1081 | "aria-query": "^3.0.0",
1082 | "array-includes": "^3.0.3",
1083 | "ast-types-flow": "^0.0.7",
1084 | "axobject-query": "^2.0.1",
1085 | "damerau-levenshtein": "^1.0.4",
1086 | "emoji-regex": "^6.5.1",
1087 | "has": "^1.0.3",
1088 | "jsx-ast-utils": "^2.0.1"
1089 | }
1090 | },
1091 | "eslint-plugin-meteor": {
1092 | "version": "5.1.0",
1093 | "resolved": "https://registry.npmjs.org/eslint-plugin-meteor/-/eslint-plugin-meteor-5.1.0.tgz",
1094 | "integrity": "sha512-0/mQ0vOhmJQSDbhU84CsLGFEq967ye6sqyJKG/H8Nwv3+Ti1ayfsKqI0iEK85NcI8v6jJ7o/0EHkHg14bcLbaw==",
1095 | "dev": true,
1096 | "requires": {
1097 | "invariant": "2.2.4"
1098 | }
1099 | },
1100 | "eslint-plugin-node": {
1101 | "version": "8.0.0",
1102 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.0.tgz",
1103 | "integrity": "sha512-Y+ln8iQ52scz9+rSPnSWRaAxeWaoJZ4wIveDR0vLHkuSZGe44Vk1J4HX7WvEP5Cm+iXPE8ixo7OM7gAO3/OKpQ==",
1104 | "dev": true,
1105 | "requires": {
1106 | "eslint-plugin-es": "^1.3.1",
1107 | "eslint-utils": "^1.3.1",
1108 | "ignore": "^5.0.2",
1109 | "minimatch": "^3.0.4",
1110 | "resolve": "^1.8.1",
1111 | "semver": "^5.5.0"
1112 | },
1113 | "dependencies": {
1114 | "ignore": {
1115 | "version": "5.0.4",
1116 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz",
1117 | "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==",
1118 | "dev": true
1119 | }
1120 | }
1121 | },
1122 | "eslint-plugin-promise": {
1123 | "version": "4.0.1",
1124 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz",
1125 | "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==",
1126 | "dev": true
1127 | },
1128 | "eslint-plugin-react": {
1129 | "version": "7.12.2",
1130 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.2.tgz",
1131 | "integrity": "sha512-6F8uOJXOsWWWD3Mg8cvz4onsqEYp2LFZCFlgjaTAzbPLwqdwRCeK78unbuEaMXYPxq8paXCzTpoaDCwXBvC/gg==",
1132 | "dev": true,
1133 | "requires": {
1134 | "array-includes": "^3.0.3",
1135 | "doctrine": "^2.1.0",
1136 | "has": "^1.0.3",
1137 | "jsx-ast-utils": "^2.0.1",
1138 | "object.fromentries": "^2.0.0",
1139 | "prop-types": "^15.6.2",
1140 | "resolve": "^1.9.0"
1141 | }
1142 | },
1143 | "eslint-plugin-standard": {
1144 | "version": "4.0.0",
1145 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz",
1146 | "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==",
1147 | "dev": true
1148 | },
1149 | "eslint-restricted-globals": {
1150 | "version": "0.1.1",
1151 | "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
1152 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=",
1153 | "dev": true
1154 | },
1155 | "eslint-scope": {
1156 | "version": "3.7.1",
1157 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
1158 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
1159 | "dev": true,
1160 | "requires": {
1161 | "esrecurse": "^4.1.0",
1162 | "estraverse": "^4.1.1"
1163 | }
1164 | },
1165 | "eslint-utils": {
1166 | "version": "1.3.1",
1167 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
1168 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
1169 | "dev": true
1170 | },
1171 | "eslint-visitor-keys": {
1172 | "version": "1.0.0",
1173 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
1174 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
1175 | "dev": true
1176 | },
1177 | "espree": {
1178 | "version": "5.0.0",
1179 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz",
1180 | "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==",
1181 | "dev": true,
1182 | "requires": {
1183 | "acorn": "^6.0.2",
1184 | "acorn-jsx": "^5.0.0",
1185 | "eslint-visitor-keys": "^1.0.0"
1186 | }
1187 | },
1188 | "esprima": {
1189 | "version": "4.0.1",
1190 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1191 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1192 | "dev": true
1193 | },
1194 | "esquery": {
1195 | "version": "1.0.1",
1196 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
1197 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
1198 | "dev": true,
1199 | "requires": {
1200 | "estraverse": "^4.0.0"
1201 | }
1202 | },
1203 | "esrecurse": {
1204 | "version": "4.2.1",
1205 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1206 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1207 | "dev": true,
1208 | "requires": {
1209 | "estraverse": "^4.1.0"
1210 | }
1211 | },
1212 | "estraverse": {
1213 | "version": "4.2.0",
1214 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1215 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1216 | "dev": true
1217 | },
1218 | "esutils": {
1219 | "version": "2.0.2",
1220 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
1221 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
1222 | "dev": true
1223 | },
1224 | "external-editor": {
1225 | "version": "3.0.3",
1226 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
1227 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
1228 | "dev": true,
1229 | "requires": {
1230 | "chardet": "^0.7.0",
1231 | "iconv-lite": "^0.4.24",
1232 | "tmp": "^0.0.33"
1233 | }
1234 | },
1235 | "fast-deep-equal": {
1236 | "version": "2.0.1",
1237 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1238 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1239 | "dev": true
1240 | },
1241 | "fast-json-stable-stringify": {
1242 | "version": "2.0.0",
1243 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1244 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1245 | "dev": true
1246 | },
1247 | "fast-levenshtein": {
1248 | "version": "2.0.6",
1249 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1250 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1251 | "dev": true
1252 | },
1253 | "figures": {
1254 | "version": "2.0.0",
1255 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
1256 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
1257 | "dev": true,
1258 | "requires": {
1259 | "escape-string-regexp": "^1.0.5"
1260 | }
1261 | },
1262 | "file-entry-cache": {
1263 | "version": "2.0.0",
1264 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
1265 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
1266 | "dev": true,
1267 | "requires": {
1268 | "flat-cache": "^1.2.1",
1269 | "object-assign": "^4.0.1"
1270 | }
1271 | },
1272 | "find-up": {
1273 | "version": "1.1.2",
1274 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
1275 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
1276 | "dev": true,
1277 | "requires": {
1278 | "path-exists": "^2.0.0",
1279 | "pinkie-promise": "^2.0.0"
1280 | }
1281 | },
1282 | "flat-cache": {
1283 | "version": "1.3.4",
1284 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
1285 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
1286 | "dev": true,
1287 | "requires": {
1288 | "circular-json": "^0.3.1",
1289 | "graceful-fs": "^4.1.2",
1290 | "rimraf": "~2.6.2",
1291 | "write": "^0.2.1"
1292 | }
1293 | },
1294 | "fs.realpath": {
1295 | "version": "1.0.0",
1296 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1297 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1298 | "dev": true
1299 | },
1300 | "function-bind": {
1301 | "version": "1.1.1",
1302 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1303 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1304 | "dev": true
1305 | },
1306 | "functional-red-black-tree": {
1307 | "version": "1.0.1",
1308 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1309 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1310 | "dev": true
1311 | },
1312 | "glob": {
1313 | "version": "7.1.3",
1314 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1315 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1316 | "dev": true,
1317 | "requires": {
1318 | "fs.realpath": "^1.0.0",
1319 | "inflight": "^1.0.4",
1320 | "inherits": "2",
1321 | "minimatch": "^3.0.4",
1322 | "once": "^1.3.0",
1323 | "path-is-absolute": "^1.0.0"
1324 | }
1325 | },
1326 | "globals": {
1327 | "version": "11.9.0",
1328 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
1329 | "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
1330 | "dev": true
1331 | },
1332 | "graceful-fs": {
1333 | "version": "4.1.15",
1334 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
1335 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
1336 | "dev": true
1337 | },
1338 | "has": {
1339 | "version": "1.0.3",
1340 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1341 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1342 | "dev": true,
1343 | "requires": {
1344 | "function-bind": "^1.1.1"
1345 | }
1346 | },
1347 | "has-flag": {
1348 | "version": "3.0.0",
1349 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1350 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1351 | "dev": true
1352 | },
1353 | "has-symbols": {
1354 | "version": "1.0.0",
1355 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
1356 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
1357 | "dev": true
1358 | },
1359 | "hosted-git-info": {
1360 | "version": "2.7.1",
1361 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
1362 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
1363 | "dev": true
1364 | },
1365 | "iconv-lite": {
1366 | "version": "0.4.24",
1367 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1368 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1369 | "dev": true,
1370 | "requires": {
1371 | "safer-buffer": ">= 2.1.2 < 3"
1372 | }
1373 | },
1374 | "ignore": {
1375 | "version": "4.0.6",
1376 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1377 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
1378 | "dev": true
1379 | },
1380 | "imurmurhash": {
1381 | "version": "0.1.4",
1382 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1383 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1384 | "dev": true
1385 | },
1386 | "inflight": {
1387 | "version": "1.0.6",
1388 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1389 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1390 | "dev": true,
1391 | "requires": {
1392 | "once": "^1.3.0",
1393 | "wrappy": "1"
1394 | }
1395 | },
1396 | "inherits": {
1397 | "version": "2.0.3",
1398 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1399 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1400 | "dev": true
1401 | },
1402 | "inquirer": {
1403 | "version": "6.2.1",
1404 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
1405 | "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
1406 | "dev": true,
1407 | "requires": {
1408 | "ansi-escapes": "^3.0.0",
1409 | "chalk": "^2.0.0",
1410 | "cli-cursor": "^2.1.0",
1411 | "cli-width": "^2.0.0",
1412 | "external-editor": "^3.0.0",
1413 | "figures": "^2.0.0",
1414 | "lodash": "^4.17.10",
1415 | "mute-stream": "0.0.7",
1416 | "run-async": "^2.2.0",
1417 | "rxjs": "^6.1.0",
1418 | "string-width": "^2.1.0",
1419 | "strip-ansi": "^5.0.0",
1420 | "through": "^2.3.6"
1421 | },
1422 | "dependencies": {
1423 | "ansi-regex": {
1424 | "version": "4.0.0",
1425 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
1426 | "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
1427 | "dev": true
1428 | },
1429 | "strip-ansi": {
1430 | "version": "5.0.0",
1431 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
1432 | "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
1433 | "dev": true,
1434 | "requires": {
1435 | "ansi-regex": "^4.0.0"
1436 | }
1437 | }
1438 | }
1439 | },
1440 | "invariant": {
1441 | "version": "2.2.4",
1442 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
1443 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
1444 | "dev": true,
1445 | "requires": {
1446 | "loose-envify": "^1.0.0"
1447 | }
1448 | },
1449 | "is-arrayish": {
1450 | "version": "0.2.1",
1451 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1452 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1453 | "dev": true
1454 | },
1455 | "is-builtin-module": {
1456 | "version": "1.0.0",
1457 | "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1458 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1459 | "dev": true,
1460 | "requires": {
1461 | "builtin-modules": "^1.0.0"
1462 | }
1463 | },
1464 | "is-callable": {
1465 | "version": "1.1.4",
1466 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
1467 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
1468 | "dev": true
1469 | },
1470 | "is-date-object": {
1471 | "version": "1.0.1",
1472 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
1473 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
1474 | "dev": true
1475 | },
1476 | "is-fullwidth-code-point": {
1477 | "version": "2.0.0",
1478 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1479 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1480 | "dev": true
1481 | },
1482 | "is-promise": {
1483 | "version": "2.1.0",
1484 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1485 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1486 | "dev": true
1487 | },
1488 | "is-regex": {
1489 | "version": "1.0.4",
1490 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
1491 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
1492 | "dev": true,
1493 | "requires": {
1494 | "has": "^1.0.1"
1495 | }
1496 | },
1497 | "is-symbol": {
1498 | "version": "1.0.2",
1499 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
1500 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
1501 | "dev": true,
1502 | "requires": {
1503 | "has-symbols": "^1.0.0"
1504 | }
1505 | },
1506 | "isarray": {
1507 | "version": "1.0.0",
1508 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1509 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1510 | "dev": true
1511 | },
1512 | "isexe": {
1513 | "version": "2.0.0",
1514 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1515 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1516 | "dev": true
1517 | },
1518 | "js-tokens": {
1519 | "version": "4.0.0",
1520 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1521 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1522 | "dev": true
1523 | },
1524 | "js-yaml": {
1525 | "version": "3.12.0",
1526 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
1527 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
1528 | "dev": true,
1529 | "requires": {
1530 | "argparse": "^1.0.7",
1531 | "esprima": "^4.0.0"
1532 | }
1533 | },
1534 | "jsesc": {
1535 | "version": "2.5.2",
1536 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1537 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
1538 | "dev": true
1539 | },
1540 | "json-schema-traverse": {
1541 | "version": "0.4.1",
1542 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1543 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1544 | "dev": true
1545 | },
1546 | "json-stable-stringify-without-jsonify": {
1547 | "version": "1.0.1",
1548 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1549 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1550 | "dev": true
1551 | },
1552 | "jsx-ast-utils": {
1553 | "version": "2.0.1",
1554 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz",
1555 | "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=",
1556 | "dev": true,
1557 | "requires": {
1558 | "array-includes": "^3.0.3"
1559 | }
1560 | },
1561 | "levn": {
1562 | "version": "0.3.0",
1563 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1564 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1565 | "dev": true,
1566 | "requires": {
1567 | "prelude-ls": "~1.1.2",
1568 | "type-check": "~0.3.2"
1569 | }
1570 | },
1571 | "load-json-file": {
1572 | "version": "2.0.0",
1573 | "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
1574 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
1575 | "dev": true,
1576 | "requires": {
1577 | "graceful-fs": "^4.1.2",
1578 | "parse-json": "^2.2.0",
1579 | "pify": "^2.0.0",
1580 | "strip-bom": "^3.0.0"
1581 | }
1582 | },
1583 | "locate-path": {
1584 | "version": "2.0.0",
1585 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
1586 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
1587 | "dev": true,
1588 | "requires": {
1589 | "p-locate": "^2.0.0",
1590 | "path-exists": "^3.0.0"
1591 | },
1592 | "dependencies": {
1593 | "path-exists": {
1594 | "version": "3.0.0",
1595 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1596 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1597 | "dev": true
1598 | }
1599 | }
1600 | },
1601 | "lodash": {
1602 | "version": "4.17.11",
1603 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
1604 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
1605 | "dev": true
1606 | },
1607 | "lodash.omit": {
1608 | "version": "4.5.0",
1609 | "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
1610 | "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA="
1611 | },
1612 | "loose-envify": {
1613 | "version": "1.4.0",
1614 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1615 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1616 | "dev": true,
1617 | "requires": {
1618 | "js-tokens": "^3.0.0 || ^4.0.0"
1619 | }
1620 | },
1621 | "meteor-node-stubs": {
1622 | "version": "0.4.1",
1623 | "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.4.1.tgz",
1624 | "integrity": "sha512-UO2OStvLOKoApmOdIP5eCqoLaa/ritMXRg4ffJVdkNLEsczzPvTjgC0Mxk4cM4R8MZkwll90FYgjDf5qUTJdMA==",
1625 | "requires": {
1626 | "assert": "^1.4.1",
1627 | "browserify-zlib": "^0.1.4",
1628 | "buffer": "^4.9.1",
1629 | "console-browserify": "^1.1.0",
1630 | "constants-browserify": "^1.0.0",
1631 | "crypto-browserify": "^3.11.0",
1632 | "domain-browser": "^1.1.7",
1633 | "events": "^1.1.1",
1634 | "https-browserify": "0.0.1",
1635 | "os-browserify": "^0.2.1",
1636 | "path-browserify": "0.0.0",
1637 | "process": "^0.11.9",
1638 | "punycode": "^1.4.1",
1639 | "querystring-es3": "^0.2.1",
1640 | "readable-stream": "^2.3.6",
1641 | "stream-browserify": "^2.0.1",
1642 | "stream-http": "^2.8.0",
1643 | "string_decoder": "^1.1.0",
1644 | "timers-browserify": "^1.4.2",
1645 | "tty-browserify": "0.0.0",
1646 | "url": "^0.11.0",
1647 | "util": "^0.10.3",
1648 | "vm-browserify": "0.0.4"
1649 | },
1650 | "dependencies": {
1651 | "asn1.js": {
1652 | "version": "4.10.1",
1653 | "bundled": true,
1654 | "requires": {
1655 | "bn.js": "^4.0.0",
1656 | "inherits": "^2.0.1",
1657 | "minimalistic-assert": "^1.0.0"
1658 | }
1659 | },
1660 | "assert": {
1661 | "version": "1.4.1",
1662 | "bundled": true,
1663 | "requires": {
1664 | "util": "0.10.3"
1665 | }
1666 | },
1667 | "base64-js": {
1668 | "version": "1.3.0",
1669 | "bundled": true
1670 | },
1671 | "bn.js": {
1672 | "version": "4.11.8",
1673 | "bundled": true
1674 | },
1675 | "brorand": {
1676 | "version": "1.1.0",
1677 | "bundled": true
1678 | },
1679 | "browserify-aes": {
1680 | "version": "1.2.0",
1681 | "bundled": true,
1682 | "requires": {
1683 | "buffer-xor": "^1.0.3",
1684 | "cipher-base": "^1.0.0",
1685 | "create-hash": "^1.1.0",
1686 | "evp_bytestokey": "^1.0.3",
1687 | "inherits": "^2.0.1",
1688 | "safe-buffer": "^5.0.1"
1689 | }
1690 | },
1691 | "browserify-cipher": {
1692 | "version": "1.0.1",
1693 | "bundled": true,
1694 | "requires": {
1695 | "browserify-aes": "^1.0.4",
1696 | "browserify-des": "^1.0.0",
1697 | "evp_bytestokey": "^1.0.0"
1698 | }
1699 | },
1700 | "browserify-des": {
1701 | "version": "1.0.1",
1702 | "bundled": true,
1703 | "requires": {
1704 | "cipher-base": "^1.0.1",
1705 | "des.js": "^1.0.0",
1706 | "inherits": "^2.0.1"
1707 | }
1708 | },
1709 | "browserify-rsa": {
1710 | "version": "4.0.1",
1711 | "bundled": true,
1712 | "requires": {
1713 | "bn.js": "^4.1.0",
1714 | "randombytes": "^2.0.1"
1715 | }
1716 | },
1717 | "browserify-sign": {
1718 | "version": "4.0.4",
1719 | "bundled": true,
1720 | "requires": {
1721 | "bn.js": "^4.1.1",
1722 | "browserify-rsa": "^4.0.0",
1723 | "create-hash": "^1.1.0",
1724 | "create-hmac": "^1.1.2",
1725 | "elliptic": "^6.0.0",
1726 | "inherits": "^2.0.1",
1727 | "parse-asn1": "^5.0.0"
1728 | }
1729 | },
1730 | "browserify-zlib": {
1731 | "version": "0.1.4",
1732 | "bundled": true,
1733 | "requires": {
1734 | "pako": "~0.2.0"
1735 | }
1736 | },
1737 | "buffer": {
1738 | "version": "4.9.1",
1739 | "bundled": true,
1740 | "requires": {
1741 | "base64-js": "^1.0.2",
1742 | "ieee754": "^1.1.4",
1743 | "isarray": "^1.0.0"
1744 | }
1745 | },
1746 | "buffer-xor": {
1747 | "version": "1.0.3",
1748 | "bundled": true
1749 | },
1750 | "builtin-status-codes": {
1751 | "version": "3.0.0",
1752 | "bundled": true
1753 | },
1754 | "cipher-base": {
1755 | "version": "1.0.4",
1756 | "bundled": true,
1757 | "requires": {
1758 | "inherits": "^2.0.1",
1759 | "safe-buffer": "^5.0.1"
1760 | }
1761 | },
1762 | "console-browserify": {
1763 | "version": "1.1.0",
1764 | "bundled": true,
1765 | "requires": {
1766 | "date-now": "^0.1.4"
1767 | }
1768 | },
1769 | "constants-browserify": {
1770 | "version": "1.0.0",
1771 | "bundled": true
1772 | },
1773 | "core-util-is": {
1774 | "version": "1.0.2",
1775 | "bundled": true
1776 | },
1777 | "create-ecdh": {
1778 | "version": "4.0.3",
1779 | "bundled": true,
1780 | "requires": {
1781 | "bn.js": "^4.1.0",
1782 | "elliptic": "^6.0.0"
1783 | }
1784 | },
1785 | "create-hash": {
1786 | "version": "1.2.0",
1787 | "bundled": true,
1788 | "requires": {
1789 | "cipher-base": "^1.0.1",
1790 | "inherits": "^2.0.1",
1791 | "md5.js": "^1.3.4",
1792 | "ripemd160": "^2.0.1",
1793 | "sha.js": "^2.4.0"
1794 | }
1795 | },
1796 | "create-hmac": {
1797 | "version": "1.1.7",
1798 | "bundled": true,
1799 | "requires": {
1800 | "cipher-base": "^1.0.3",
1801 | "create-hash": "^1.1.0",
1802 | "inherits": "^2.0.1",
1803 | "ripemd160": "^2.0.0",
1804 | "safe-buffer": "^5.0.1",
1805 | "sha.js": "^2.4.8"
1806 | }
1807 | },
1808 | "crypto-browserify": {
1809 | "version": "3.12.0",
1810 | "bundled": true,
1811 | "requires": {
1812 | "browserify-cipher": "^1.0.0",
1813 | "browserify-sign": "^4.0.0",
1814 | "create-ecdh": "^4.0.0",
1815 | "create-hash": "^1.1.0",
1816 | "create-hmac": "^1.1.0",
1817 | "diffie-hellman": "^5.0.0",
1818 | "inherits": "^2.0.1",
1819 | "pbkdf2": "^3.0.3",
1820 | "public-encrypt": "^4.0.0",
1821 | "randombytes": "^2.0.0",
1822 | "randomfill": "^1.0.3"
1823 | }
1824 | },
1825 | "date-now": {
1826 | "version": "0.1.4",
1827 | "bundled": true
1828 | },
1829 | "des.js": {
1830 | "version": "1.0.0",
1831 | "bundled": true,
1832 | "requires": {
1833 | "inherits": "^2.0.1",
1834 | "minimalistic-assert": "^1.0.0"
1835 | }
1836 | },
1837 | "diffie-hellman": {
1838 | "version": "5.0.3",
1839 | "bundled": true,
1840 | "requires": {
1841 | "bn.js": "^4.1.0",
1842 | "miller-rabin": "^4.0.0",
1843 | "randombytes": "^2.0.0"
1844 | }
1845 | },
1846 | "domain-browser": {
1847 | "version": "1.2.0",
1848 | "bundled": true
1849 | },
1850 | "elliptic": {
1851 | "version": "6.4.0",
1852 | "bundled": true,
1853 | "requires": {
1854 | "bn.js": "^4.4.0",
1855 | "brorand": "^1.0.1",
1856 | "hash.js": "^1.0.0",
1857 | "hmac-drbg": "^1.0.0",
1858 | "inherits": "^2.0.1",
1859 | "minimalistic-assert": "^1.0.0",
1860 | "minimalistic-crypto-utils": "^1.0.0"
1861 | }
1862 | },
1863 | "events": {
1864 | "version": "1.1.1",
1865 | "bundled": true
1866 | },
1867 | "evp_bytestokey": {
1868 | "version": "1.0.3",
1869 | "bundled": true,
1870 | "requires": {
1871 | "md5.js": "^1.3.4",
1872 | "safe-buffer": "^5.1.1"
1873 | }
1874 | },
1875 | "hash-base": {
1876 | "version": "3.0.4",
1877 | "bundled": true,
1878 | "requires": {
1879 | "inherits": "^2.0.1",
1880 | "safe-buffer": "^5.0.1"
1881 | }
1882 | },
1883 | "hash.js": {
1884 | "version": "1.1.3",
1885 | "bundled": true,
1886 | "requires": {
1887 | "inherits": "^2.0.3",
1888 | "minimalistic-assert": "^1.0.0"
1889 | },
1890 | "dependencies": {
1891 | "inherits": {
1892 | "version": "2.0.3",
1893 | "bundled": true
1894 | }
1895 | }
1896 | },
1897 | "hmac-drbg": {
1898 | "version": "1.0.1",
1899 | "bundled": true,
1900 | "requires": {
1901 | "hash.js": "^1.0.3",
1902 | "minimalistic-assert": "^1.0.0",
1903 | "minimalistic-crypto-utils": "^1.0.1"
1904 | }
1905 | },
1906 | "https-browserify": {
1907 | "version": "0.0.1",
1908 | "bundled": true
1909 | },
1910 | "ieee754": {
1911 | "version": "1.1.11",
1912 | "bundled": true
1913 | },
1914 | "indexof": {
1915 | "version": "0.0.1",
1916 | "bundled": true
1917 | },
1918 | "inherits": {
1919 | "version": "2.0.1",
1920 | "bundled": true
1921 | },
1922 | "isarray": {
1923 | "version": "1.0.0",
1924 | "bundled": true
1925 | },
1926 | "md5.js": {
1927 | "version": "1.3.4",
1928 | "bundled": true,
1929 | "requires": {
1930 | "hash-base": "^3.0.0",
1931 | "inherits": "^2.0.1"
1932 | }
1933 | },
1934 | "miller-rabin": {
1935 | "version": "4.0.1",
1936 | "bundled": true,
1937 | "requires": {
1938 | "bn.js": "^4.0.0",
1939 | "brorand": "^1.0.1"
1940 | }
1941 | },
1942 | "minimalistic-assert": {
1943 | "version": "1.0.1",
1944 | "bundled": true
1945 | },
1946 | "minimalistic-crypto-utils": {
1947 | "version": "1.0.1",
1948 | "bundled": true
1949 | },
1950 | "os-browserify": {
1951 | "version": "0.2.1",
1952 | "bundled": true
1953 | },
1954 | "pako": {
1955 | "version": "0.2.9",
1956 | "bundled": true
1957 | },
1958 | "parse-asn1": {
1959 | "version": "5.1.1",
1960 | "bundled": true,
1961 | "requires": {
1962 | "asn1.js": "^4.0.0",
1963 | "browserify-aes": "^1.0.0",
1964 | "create-hash": "^1.1.0",
1965 | "evp_bytestokey": "^1.0.0",
1966 | "pbkdf2": "^3.0.3"
1967 | }
1968 | },
1969 | "path-browserify": {
1970 | "version": "0.0.0",
1971 | "bundled": true
1972 | },
1973 | "pbkdf2": {
1974 | "version": "3.0.16",
1975 | "bundled": true,
1976 | "requires": {
1977 | "create-hash": "^1.1.2",
1978 | "create-hmac": "^1.1.4",
1979 | "ripemd160": "^2.0.1",
1980 | "safe-buffer": "^5.0.1",
1981 | "sha.js": "^2.4.8"
1982 | }
1983 | },
1984 | "process": {
1985 | "version": "0.11.10",
1986 | "bundled": true
1987 | },
1988 | "process-nextick-args": {
1989 | "version": "2.0.0",
1990 | "bundled": true
1991 | },
1992 | "public-encrypt": {
1993 | "version": "4.0.2",
1994 | "bundled": true,
1995 | "requires": {
1996 | "bn.js": "^4.1.0",
1997 | "browserify-rsa": "^4.0.0",
1998 | "create-hash": "^1.1.0",
1999 | "parse-asn1": "^5.0.0",
2000 | "randombytes": "^2.0.1"
2001 | }
2002 | },
2003 | "punycode": {
2004 | "version": "1.4.1",
2005 | "bundled": true
2006 | },
2007 | "querystring": {
2008 | "version": "0.2.0",
2009 | "bundled": true
2010 | },
2011 | "querystring-es3": {
2012 | "version": "0.2.1",
2013 | "bundled": true
2014 | },
2015 | "randombytes": {
2016 | "version": "2.0.6",
2017 | "bundled": true,
2018 | "requires": {
2019 | "safe-buffer": "^5.1.0"
2020 | }
2021 | },
2022 | "randomfill": {
2023 | "version": "1.0.4",
2024 | "bundled": true,
2025 | "requires": {
2026 | "randombytes": "^2.0.5",
2027 | "safe-buffer": "^5.1.0"
2028 | }
2029 | },
2030 | "readable-stream": {
2031 | "version": "2.3.6",
2032 | "bundled": true,
2033 | "requires": {
2034 | "core-util-is": "~1.0.0",
2035 | "inherits": "~2.0.3",
2036 | "isarray": "~1.0.0",
2037 | "process-nextick-args": "~2.0.0",
2038 | "safe-buffer": "~5.1.1",
2039 | "string_decoder": "~1.1.1",
2040 | "util-deprecate": "~1.0.1"
2041 | },
2042 | "dependencies": {
2043 | "inherits": {
2044 | "version": "2.0.3",
2045 | "bundled": true
2046 | }
2047 | }
2048 | },
2049 | "ripemd160": {
2050 | "version": "2.0.2",
2051 | "bundled": true,
2052 | "requires": {
2053 | "hash-base": "^3.0.0",
2054 | "inherits": "^2.0.1"
2055 | }
2056 | },
2057 | "safe-buffer": {
2058 | "version": "5.1.2",
2059 | "bundled": true
2060 | },
2061 | "sha.js": {
2062 | "version": "2.4.11",
2063 | "bundled": true,
2064 | "requires": {
2065 | "inherits": "^2.0.1",
2066 | "safe-buffer": "^5.0.1"
2067 | }
2068 | },
2069 | "stream-browserify": {
2070 | "version": "2.0.1",
2071 | "bundled": true,
2072 | "requires": {
2073 | "inherits": "~2.0.1",
2074 | "readable-stream": "^2.0.2"
2075 | }
2076 | },
2077 | "stream-http": {
2078 | "version": "2.8.1",
2079 | "bundled": true,
2080 | "requires": {
2081 | "builtin-status-codes": "^3.0.0",
2082 | "inherits": "^2.0.1",
2083 | "readable-stream": "^2.3.3",
2084 | "to-arraybuffer": "^1.0.0",
2085 | "xtend": "^4.0.0"
2086 | }
2087 | },
2088 | "string_decoder": {
2089 | "version": "1.1.1",
2090 | "bundled": true,
2091 | "requires": {
2092 | "safe-buffer": "~5.1.0"
2093 | }
2094 | },
2095 | "timers-browserify": {
2096 | "version": "1.4.2",
2097 | "bundled": true,
2098 | "requires": {
2099 | "process": "~0.11.0"
2100 | }
2101 | },
2102 | "to-arraybuffer": {
2103 | "version": "1.0.1",
2104 | "bundled": true
2105 | },
2106 | "tty-browserify": {
2107 | "version": "0.0.0",
2108 | "bundled": true
2109 | },
2110 | "url": {
2111 | "version": "0.11.0",
2112 | "bundled": true,
2113 | "requires": {
2114 | "punycode": "1.3.2",
2115 | "querystring": "0.2.0"
2116 | },
2117 | "dependencies": {
2118 | "punycode": {
2119 | "version": "1.3.2",
2120 | "bundled": true
2121 | }
2122 | }
2123 | },
2124 | "util": {
2125 | "version": "0.10.3",
2126 | "bundled": true,
2127 | "requires": {
2128 | "inherits": "2.0.1"
2129 | }
2130 | },
2131 | "util-deprecate": {
2132 | "version": "1.0.2",
2133 | "bundled": true
2134 | },
2135 | "vm-browserify": {
2136 | "version": "0.0.4",
2137 | "bundled": true,
2138 | "requires": {
2139 | "indexof": "0.0.1"
2140 | }
2141 | },
2142 | "xtend": {
2143 | "version": "4.0.1",
2144 | "bundled": true
2145 | }
2146 | }
2147 | },
2148 | "mimic-fn": {
2149 | "version": "1.2.0",
2150 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2151 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2152 | "dev": true
2153 | },
2154 | "minimatch": {
2155 | "version": "3.0.4",
2156 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2157 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2158 | "dev": true,
2159 | "requires": {
2160 | "brace-expansion": "^1.1.7"
2161 | }
2162 | },
2163 | "minimist": {
2164 | "version": "0.0.8",
2165 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2166 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2167 | "dev": true
2168 | },
2169 | "mkdirp": {
2170 | "version": "0.5.1",
2171 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2172 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2173 | "dev": true,
2174 | "requires": {
2175 | "minimist": "0.0.8"
2176 | }
2177 | },
2178 | "moment": {
2179 | "version": "2.23.0",
2180 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz",
2181 | "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA=="
2182 | },
2183 | "ms": {
2184 | "version": "2.1.1",
2185 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
2186 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
2187 | "dev": true
2188 | },
2189 | "mute-stream": {
2190 | "version": "0.0.7",
2191 | "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
2192 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
2193 | "dev": true
2194 | },
2195 | "nan": {
2196 | "version": "2.12.1",
2197 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
2198 | "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw=="
2199 | },
2200 | "natural-compare": {
2201 | "version": "1.4.0",
2202 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2203 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2204 | "dev": true
2205 | },
2206 | "nice-try": {
2207 | "version": "1.0.5",
2208 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
2209 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
2210 | "dev": true
2211 | },
2212 | "normalize-package-data": {
2213 | "version": "2.4.0",
2214 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2215 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2216 | "dev": true,
2217 | "requires": {
2218 | "hosted-git-info": "^2.1.4",
2219 | "is-builtin-module": "^1.0.0",
2220 | "semver": "2 || 3 || 4 || 5",
2221 | "validate-npm-package-license": "^3.0.1"
2222 | }
2223 | },
2224 | "object-assign": {
2225 | "version": "4.1.1",
2226 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2227 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2228 | "dev": true
2229 | },
2230 | "object-keys": {
2231 | "version": "1.0.12",
2232 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
2233 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
2234 | "dev": true
2235 | },
2236 | "object.assign": {
2237 | "version": "4.1.0",
2238 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
2239 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
2240 | "dev": true,
2241 | "requires": {
2242 | "define-properties": "^1.1.2",
2243 | "function-bind": "^1.1.1",
2244 | "has-symbols": "^1.0.0",
2245 | "object-keys": "^1.0.11"
2246 | }
2247 | },
2248 | "object.entries": {
2249 | "version": "1.0.4",
2250 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz",
2251 | "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=",
2252 | "dev": true,
2253 | "requires": {
2254 | "define-properties": "^1.1.2",
2255 | "es-abstract": "^1.6.1",
2256 | "function-bind": "^1.1.0",
2257 | "has": "^1.0.1"
2258 | }
2259 | },
2260 | "object.fromentries": {
2261 | "version": "2.0.0",
2262 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz",
2263 | "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==",
2264 | "dev": true,
2265 | "requires": {
2266 | "define-properties": "^1.1.2",
2267 | "es-abstract": "^1.11.0",
2268 | "function-bind": "^1.1.1",
2269 | "has": "^1.0.1"
2270 | }
2271 | },
2272 | "once": {
2273 | "version": "1.4.0",
2274 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2275 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2276 | "dev": true,
2277 | "requires": {
2278 | "wrappy": "1"
2279 | }
2280 | },
2281 | "onetime": {
2282 | "version": "2.0.1",
2283 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2284 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2285 | "dev": true,
2286 | "requires": {
2287 | "mimic-fn": "^1.0.0"
2288 | }
2289 | },
2290 | "optionator": {
2291 | "version": "0.8.2",
2292 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
2293 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
2294 | "dev": true,
2295 | "requires": {
2296 | "deep-is": "~0.1.3",
2297 | "fast-levenshtein": "~2.0.4",
2298 | "levn": "~0.3.0",
2299 | "prelude-ls": "~1.1.2",
2300 | "type-check": "~0.3.2",
2301 | "wordwrap": "~1.0.0"
2302 | }
2303 | },
2304 | "os-tmpdir": {
2305 | "version": "1.0.2",
2306 | "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2307 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
2308 | "dev": true
2309 | },
2310 | "p-limit": {
2311 | "version": "1.3.0",
2312 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
2313 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
2314 | "dev": true,
2315 | "requires": {
2316 | "p-try": "^1.0.0"
2317 | }
2318 | },
2319 | "p-locate": {
2320 | "version": "2.0.0",
2321 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
2322 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
2323 | "dev": true,
2324 | "requires": {
2325 | "p-limit": "^1.1.0"
2326 | }
2327 | },
2328 | "p-try": {
2329 | "version": "1.0.0",
2330 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
2331 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
2332 | "dev": true
2333 | },
2334 | "parse-json": {
2335 | "version": "2.2.0",
2336 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2337 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2338 | "dev": true,
2339 | "requires": {
2340 | "error-ex": "^1.2.0"
2341 | }
2342 | },
2343 | "path-exists": {
2344 | "version": "2.1.0",
2345 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2346 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2347 | "dev": true,
2348 | "requires": {
2349 | "pinkie-promise": "^2.0.0"
2350 | }
2351 | },
2352 | "path-is-absolute": {
2353 | "version": "1.0.1",
2354 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2355 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2356 | "dev": true
2357 | },
2358 | "path-is-inside": {
2359 | "version": "1.0.2",
2360 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
2361 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
2362 | "dev": true
2363 | },
2364 | "path-key": {
2365 | "version": "2.0.1",
2366 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
2367 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
2368 | "dev": true
2369 | },
2370 | "path-parse": {
2371 | "version": "1.0.6",
2372 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
2373 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
2374 | "dev": true
2375 | },
2376 | "path-type": {
2377 | "version": "2.0.0",
2378 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
2379 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
2380 | "dev": true,
2381 | "requires": {
2382 | "pify": "^2.0.0"
2383 | }
2384 | },
2385 | "pify": {
2386 | "version": "2.3.0",
2387 | "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2388 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2389 | "dev": true
2390 | },
2391 | "pinkie": {
2392 | "version": "2.0.4",
2393 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2394 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
2395 | "dev": true
2396 | },
2397 | "pinkie-promise": {
2398 | "version": "2.0.1",
2399 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2400 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2401 | "dev": true,
2402 | "requires": {
2403 | "pinkie": "^2.0.0"
2404 | }
2405 | },
2406 | "pkg-dir": {
2407 | "version": "1.0.0",
2408 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
2409 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
2410 | "dev": true,
2411 | "requires": {
2412 | "find-up": "^1.0.0"
2413 | }
2414 | },
2415 | "pluralize": {
2416 | "version": "7.0.0",
2417 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
2418 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
2419 | "dev": true
2420 | },
2421 | "prelude-ls": {
2422 | "version": "1.1.2",
2423 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2424 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
2425 | "dev": true
2426 | },
2427 | "progress": {
2428 | "version": "2.0.3",
2429 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2430 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
2431 | "dev": true
2432 | },
2433 | "prop-types": {
2434 | "version": "15.6.2",
2435 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
2436 | "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
2437 | "dev": true,
2438 | "requires": {
2439 | "loose-envify": "^1.3.1",
2440 | "object-assign": "^4.1.1"
2441 | }
2442 | },
2443 | "punycode": {
2444 | "version": "2.1.1",
2445 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2446 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2447 | "dev": true
2448 | },
2449 | "read-pkg": {
2450 | "version": "2.0.0",
2451 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
2452 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
2453 | "dev": true,
2454 | "requires": {
2455 | "load-json-file": "^2.0.0",
2456 | "normalize-package-data": "^2.3.2",
2457 | "path-type": "^2.0.0"
2458 | }
2459 | },
2460 | "read-pkg-up": {
2461 | "version": "2.0.0",
2462 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
2463 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
2464 | "dev": true,
2465 | "requires": {
2466 | "find-up": "^2.0.0",
2467 | "read-pkg": "^2.0.0"
2468 | },
2469 | "dependencies": {
2470 | "find-up": {
2471 | "version": "2.1.0",
2472 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
2473 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
2474 | "dev": true,
2475 | "requires": {
2476 | "locate-path": "^2.0.0"
2477 | }
2478 | }
2479 | }
2480 | },
2481 | "regenerator-runtime": {
2482 | "version": "0.12.1",
2483 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
2484 | "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
2485 | },
2486 | "regexpp": {
2487 | "version": "2.0.1",
2488 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
2489 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
2490 | "dev": true
2491 | },
2492 | "require-uncached": {
2493 | "version": "1.0.3",
2494 | "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
2495 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
2496 | "dev": true,
2497 | "requires": {
2498 | "caller-path": "^0.1.0",
2499 | "resolve-from": "^1.0.0"
2500 | }
2501 | },
2502 | "resolve": {
2503 | "version": "1.9.0",
2504 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
2505 | "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
2506 | "dev": true,
2507 | "requires": {
2508 | "path-parse": "^1.0.6"
2509 | }
2510 | },
2511 | "resolve-from": {
2512 | "version": "1.0.1",
2513 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
2514 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
2515 | "dev": true
2516 | },
2517 | "restore-cursor": {
2518 | "version": "2.0.0",
2519 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
2520 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
2521 | "dev": true,
2522 | "requires": {
2523 | "onetime": "^2.0.0",
2524 | "signal-exit": "^3.0.2"
2525 | }
2526 | },
2527 | "rimraf": {
2528 | "version": "2.6.3",
2529 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
2530 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
2531 | "dev": true,
2532 | "requires": {
2533 | "glob": "^7.1.3"
2534 | }
2535 | },
2536 | "run-async": {
2537 | "version": "2.3.0",
2538 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
2539 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
2540 | "dev": true,
2541 | "requires": {
2542 | "is-promise": "^2.1.0"
2543 | }
2544 | },
2545 | "rxjs": {
2546 | "version": "6.3.3",
2547 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
2548 | "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
2549 | "dev": true,
2550 | "requires": {
2551 | "tslib": "^1.9.0"
2552 | }
2553 | },
2554 | "safer-buffer": {
2555 | "version": "2.1.2",
2556 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2557 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2558 | "dev": true
2559 | },
2560 | "semver": {
2561 | "version": "5.6.0",
2562 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
2563 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
2564 | "dev": true
2565 | },
2566 | "shebang-command": {
2567 | "version": "1.2.0",
2568 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
2569 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
2570 | "dev": true,
2571 | "requires": {
2572 | "shebang-regex": "^1.0.0"
2573 | }
2574 | },
2575 | "shebang-regex": {
2576 | "version": "1.0.0",
2577 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
2578 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
2579 | "dev": true
2580 | },
2581 | "signal-exit": {
2582 | "version": "3.0.2",
2583 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2584 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2585 | "dev": true
2586 | },
2587 | "slice-ansi": {
2588 | "version": "2.0.0",
2589 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
2590 | "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
2591 | "dev": true,
2592 | "requires": {
2593 | "ansi-styles": "^3.2.0",
2594 | "astral-regex": "^1.0.0",
2595 | "is-fullwidth-code-point": "^2.0.0"
2596 | }
2597 | },
2598 | "source-map": {
2599 | "version": "0.5.7",
2600 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2601 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2602 | "dev": true
2603 | },
2604 | "spdx-correct": {
2605 | "version": "3.1.0",
2606 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
2607 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
2608 | "dev": true,
2609 | "requires": {
2610 | "spdx-expression-parse": "^3.0.0",
2611 | "spdx-license-ids": "^3.0.0"
2612 | }
2613 | },
2614 | "spdx-exceptions": {
2615 | "version": "2.2.0",
2616 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
2617 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
2618 | "dev": true
2619 | },
2620 | "spdx-expression-parse": {
2621 | "version": "3.0.0",
2622 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
2623 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
2624 | "dev": true,
2625 | "requires": {
2626 | "spdx-exceptions": "^2.1.0",
2627 | "spdx-license-ids": "^3.0.0"
2628 | }
2629 | },
2630 | "spdx-license-ids": {
2631 | "version": "3.0.2",
2632 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
2633 | "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
2634 | "dev": true
2635 | },
2636 | "sprintf-js": {
2637 | "version": "1.0.3",
2638 | "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2639 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2640 | "dev": true
2641 | },
2642 | "string-width": {
2643 | "version": "2.1.1",
2644 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2645 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2646 | "dev": true,
2647 | "requires": {
2648 | "is-fullwidth-code-point": "^2.0.0",
2649 | "strip-ansi": "^4.0.0"
2650 | }
2651 | },
2652 | "strip-ansi": {
2653 | "version": "4.0.0",
2654 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2655 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2656 | "dev": true,
2657 | "requires": {
2658 | "ansi-regex": "^3.0.0"
2659 | }
2660 | },
2661 | "strip-bom": {
2662 | "version": "3.0.0",
2663 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
2664 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
2665 | "dev": true
2666 | },
2667 | "strip-json-comments": {
2668 | "version": "2.0.1",
2669 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2670 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
2671 | "dev": true
2672 | },
2673 | "supports-color": {
2674 | "version": "5.5.0",
2675 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2676 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2677 | "dev": true,
2678 | "requires": {
2679 | "has-flag": "^3.0.0"
2680 | }
2681 | },
2682 | "table": {
2683 | "version": "5.1.1",
2684 | "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
2685 | "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
2686 | "dev": true,
2687 | "requires": {
2688 | "ajv": "^6.6.1",
2689 | "lodash": "^4.17.11",
2690 | "slice-ansi": "2.0.0",
2691 | "string-width": "^2.1.1"
2692 | }
2693 | },
2694 | "text-table": {
2695 | "version": "0.2.0",
2696 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2697 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2698 | "dev": true
2699 | },
2700 | "through": {
2701 | "version": "2.3.8",
2702 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
2703 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2704 | "dev": true
2705 | },
2706 | "tmp": {
2707 | "version": "0.0.33",
2708 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
2709 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
2710 | "dev": true,
2711 | "requires": {
2712 | "os-tmpdir": "~1.0.2"
2713 | }
2714 | },
2715 | "to-fast-properties": {
2716 | "version": "2.0.0",
2717 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
2718 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
2719 | "dev": true
2720 | },
2721 | "trim-right": {
2722 | "version": "1.0.1",
2723 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2724 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
2725 | "dev": true
2726 | },
2727 | "tslib": {
2728 | "version": "1.9.3",
2729 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
2730 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
2731 | "dev": true
2732 | },
2733 | "type-check": {
2734 | "version": "0.3.2",
2735 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2736 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
2737 | "dev": true,
2738 | "requires": {
2739 | "prelude-ls": "~1.1.2"
2740 | }
2741 | },
2742 | "uri-js": {
2743 | "version": "4.2.2",
2744 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2745 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2746 | "dev": true,
2747 | "requires": {
2748 | "punycode": "^2.1.0"
2749 | }
2750 | },
2751 | "validate-npm-package-license": {
2752 | "version": "3.0.4",
2753 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
2754 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
2755 | "dev": true,
2756 | "requires": {
2757 | "spdx-correct": "^3.0.0",
2758 | "spdx-expression-parse": "^3.0.0"
2759 | }
2760 | },
2761 | "vee-validate": {
2762 | "version": "2.1.5",
2763 | "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-2.1.5.tgz",
2764 | "integrity": "sha512-ygo3uQZrCZjFQcZ/AcFI5UZ3ouaNxtsrs+3o/u4yd3TeZveMwYBI3v6+uKbk2aHmNV6jXLl/aj5BTZTYaf73Lw=="
2765 | },
2766 | "vue": {
2767 | "version": "2.5.21",
2768 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.21.tgz",
2769 | "integrity": "sha512-Aejvyyfhn0zjVeLvXd70h4hrE4zZDx1wfZqia6ekkobLmUZ+vNFQer53B4fu0EjWBSiqApxPejzkO1Znt3joxQ=="
2770 | },
2771 | "vue-meteor-tracker": {
2772 | "version": "2.0.0-beta.5",
2773 | "resolved": "https://registry.npmjs.org/vue-meteor-tracker/-/vue-meteor-tracker-2.0.0-beta.5.tgz",
2774 | "integrity": "sha512-egEEqAeKoy7moc4mdb/yM4+UDxk7yOAiIAW8gFz8umtAEYr7Ll8B1wLC0gtoY4IDUU8bCo0UzQjWvfXDMfl7YA==",
2775 | "requires": {
2776 | "lodash.omit": "^4.5.0"
2777 | }
2778 | },
2779 | "vue-observe-visibility": {
2780 | "version": "0.4.3",
2781 | "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.3.tgz",
2782 | "integrity": "sha512-YyyO3a5OUkgpmC0NEf+xWJR0jVdFWzVbKRDzUumOVMhfr3+jxXEycYNHCM3rEO5lcj3ZNJpDomZEYEx0Wqqh9A=="
2783 | },
2784 | "vue-router": {
2785 | "version": "3.0.2",
2786 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz",
2787 | "integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg=="
2788 | },
2789 | "vue-router-sync": {
2790 | "version": "0.1.0",
2791 | "resolved": "https://registry.npmjs.org/vue-router-sync/-/vue-router-sync-0.1.0.tgz",
2792 | "integrity": "sha512-qTX8TzD/TplKCBwoRTH9u5Z7L3gONbwHOr5sFI1qnkX5jIpXI8rjVqYhLhc9k2P1JUiX1UXG6j4l0P+3XfWudw=="
2793 | },
2794 | "vue-supply": {
2795 | "version": "0.3.0",
2796 | "resolved": "https://registry.npmjs.org/vue-supply/-/vue-supply-0.3.0.tgz",
2797 | "integrity": "sha1-c6u/UTZ+1DGlvOeSx6L44wpU2Zk="
2798 | },
2799 | "vuetify": {
2800 | "version": "1.4.0",
2801 | "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.4.0.tgz",
2802 | "integrity": "sha512-Q6b5VrkGIhPTN+r/uw6P5UTYVQy0h3d4vRW5363qHTgzQfyYQk8BDlJNCTJj0Zu/z3aBq79zbyF88jbLlV9vxQ=="
2803 | },
2804 | "vuex": {
2805 | "version": "3.0.1",
2806 | "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.0.1.tgz",
2807 | "integrity": "sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w=="
2808 | },
2809 | "vuex-router-sync": {
2810 | "version": "5.0.0",
2811 | "resolved": "https://registry.npmjs.org/vuex-router-sync/-/vuex-router-sync-5.0.0.tgz",
2812 | "integrity": "sha512-Mry2sO4kiAG64714X1CFpTA/shUH1DmkZ26DFDtwoM/yyx6OtMrc+MxrU+7vvbNLO9LSpgwkiJ8W+rlmRtsM+w=="
2813 | },
2814 | "which": {
2815 | "version": "1.3.1",
2816 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2817 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2818 | "dev": true,
2819 | "requires": {
2820 | "isexe": "^2.0.0"
2821 | }
2822 | },
2823 | "wordwrap": {
2824 | "version": "1.0.0",
2825 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
2826 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
2827 | "dev": true
2828 | },
2829 | "wrappy": {
2830 | "version": "1.0.2",
2831 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2832 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2833 | "dev": true
2834 | },
2835 | "write": {
2836 | "version": "0.2.1",
2837 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
2838 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
2839 | "dev": true,
2840 | "requires": {
2841 | "mkdirp": "^0.5.1"
2842 | }
2843 | }
2844 | }
2845 | }
2846 |
--------------------------------------------------------------------------------